您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a link to the youtube mix playlist for the current video after the video title
当前为
// ==UserScript== // @name Generate Youtube Mix Link // @namespace https://gf.qytechs.cn/en/users/1473478 // @version 0.1 // @description Adds a link to the youtube mix playlist for the current video after the video title // @author exrook // @match https://www.youtube.com/watch* // @grant none // @license GPL3 // ==/UserScript== (function () { 'use strict'; function getVideoId() { const urlParams = new URLSearchParams(window.location.search); return urlParams.get('v'); } function createMixLink(videoId) { const mixLink = document.createElement('a'); mixLink.href = `https://www.youtube.com/watch?v=${videoId}&list=RD${videoId}&start_radio=1`; mixLink.textContent = 'YT Mix'; mixLink.style.padding = '0px 12px'; mixLink.style.borderRadius = '18px'; mixLink.style.background = 'rgb(39, 39, 39)'; mixLink.style.color = '#fff'; mixLink.style.textDecoration = 'none'; mixLink.style.fontWeight = '500'; mixLink.style.fontSize = '14px'; mixLink.style.fontFamily = 'Roboto, Arial, sans-serif'; mixLink.style.cursor = 'pointer'; mixLink.style.marginLeft = '10px'; mixLink.style.display = 'inline-flex'; mixLink.style.alignItems = 'center'; mixLink.style.justifyContent = 'center'; mixLink.id = 'yt-mix-link'; // Unique ID for updating link return mixLink; } function addLink() { const videoId = getVideoId(); if (videoId) { const mixLink = createMixLink(videoId); const titleElement = document.querySelector('#title h1') || document.querySelector('h1.title'); if (titleElement) { const existingLink = titleElement.querySelector('#yt-mix-link'); if (existingLink) { existingLink.replaceWith(mixLink); } else { titleElement.appendChild(mixLink); } } } } // Use MutationObserver to add the link after title element is created function registerTitleObserver() { const observer = new MutationObserver((mutations) => { const titleElement = document.querySelector('#title h1'); console.log("Hello"); if (titleElement) { observer.disconnect(); addLink(); } }); observer.observe(document.body, { subtree: true, childList: true }); } let lastUrl = location.href; // Trigger addLink function on url changes function updateUrl() { const currentUrl = location.href; if (currentUrl !== lastUrl) { lastUrl = currentUrl; addLink(); } } function registerNavigationObserver() { updateUrl(); // Don't miss changes while we were disconnected const observer = new MutationObserver(() => { updateUrl(); // completely unnecessary optimization, sleep 2 seconds after each trigger // because it bothers me that this gets called multiple times for second observer.disconnect(); setTimeout(registerNavigationObserver, 2000); }); observer.observe(document.body, { childList: true, subtree: true }); } registerTitleObserver() registerNavigationObserver(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址