您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
prevent mix/radio playlists in videos on youtube
// ==UserScript== // @name Youtube - Prevent mix/radio playlist in videos // @namespace https://greasyfork.org/users/821661 // @version 1.5.3 // @description prevent mix/radio playlists in videos on youtube // @author hdyzen // @run-at document-body // @match https://*.youtube.com/* // @grant none // @license GPL-3.0-only // ==/UserScript== const endpointMap = { // Home page "ytd-rich-item-renderer"(item) { const endpoint = item?.data?.content?.lockupViewModel?.rendererContext?.commandContext?.onTap?.innertubeCommand; cleanEndpoint(endpoint); }, // Home/Watch/Search page "yt-lockup-view-model"(item) { const endpointSelect = item?.componentProps?.data()?.itemPlayback?.inlinePlayerData?.onSelect?.innertubeCommand; const endpointVisible = item?.componentProps?.data()?.itemPlayback?.inlinePlayerData?.onVisible?.innertubeCommand; const endpoint = item?.componentProps?.data()?.rendererContext?.commandContext?.onTap?.innertubeCommand; cleanEndpoint(endpointSelect); cleanEndpoint(endpointVisible); cleanEndpoint(endpoint); }, // Watch/Search page "ytd-video-renderer"(item) { const endpointInline = item?.data?.inlinePlaybackEndpoint; const endpoint = item?.data?.navigationEndpoint; cleanEndpoint(endpointInline); cleanEndpoint(endpoint); }, // Compability "ytd-compact-video-renderer"(thumb) { return thumb?.data?.navigationEndpoint; }, }; const itemsSelector = Object.keys(endpointMap).join(","); const observer = new MutationObserver(() => { const nodes = document.querySelectorAll(itemsSelector); for (const node of nodes) { const contentType = node?.data?.contentType || node?.componentProps?.data()?.contentType; if (contentType === "LOCKUP_CONTENT_TYPE_PLAYLIST") { continue; } const prune = endpointMap[node.tagName.toLowerCase()]; if (!prune) { continue; } prune(node); const links = node.querySelectorAll("a[href*='v='][href*='pp=']"); if (!links.length) { continue; } cleanLinks(links); } }); observer.observe(document.body, { childList: true, subtree: true }); function cleanLinks(links) { for (const link of links) { link.search = link.search.split("&")[0]; } } function cleanEndpoint(endpoint) { if (!endpoint) { return; } endpoint.clickTrackingParams = ""; const metadata = endpoint.commandMetadata?.webCommandMetadata; if (metadata) { metadata.url = metadata.url.split("&")[0]; } const watch = endpoint.watchEndpoint; if (watch) { watch.params = ""; watch.playerParams = ""; watch.playlistId = ""; } }