// ==UserScript== // @name One Click Copy on YouTube // @version 1.0 // @description Replaces the YouTube share button with a copy button that copies the shortlinks using a single click // @author SinTan // @license GPL-3.0-only // @namespace YouTube // @icon https://upload.wikimedia.org/wikipedia/commons/f/fd/YouTube_full-color_icon_%282024%29.svg // @match *://*.youtube.com/* // @grant GM.setClipboard // @downloadURL none // ==/UserScript== onUrlChange(); // Run the code on each navigation event if (self.navigation) { navigation.addEventListener('navigatesuccess', onUrlChange); } else { let u = location.href; new MutationObserver(() => u !== (u = location.href) && onUrlChange()) .observe(document, {subtree: true, childList: true}); } function onUrlChange() { if (!location.pathname.startsWith('/watch')) { // deactivate(); return; } console.log('processing', location.href); // activate(); var intv = setInterval(function() { // Wait for the svg element to appear const svgs = document.querySelectorAll('#actions button-view-model button[title="Share"] svg'); if (svgs.length < 1) { return false; } // This is important during navigation, makes sure we wait for the new content const btn = document.querySelector('#actions button-view-model button[title="Share"]'); if (btn.getElementsByClassName("yt-spec-button-shape-next__button-text-content")[0].innerHTML === 'Copy URL') { return false; } // Change the text clearInterval(intv); console.log('Replacing the share button with a copy button.'); btn.getElementsByClassName("yt-spec-button-shape-next__button-text-content")[0].innerHTML = 'Copy URL'; // Change the icon const svg = svgs[0]; svg.innerHTML = ''; svg.innerHTML += ''; // Change the click function const urlParams = new URLSearchParams(window.location.search); const videoID = urlParams.get('v'); const url = 'https://youtu.be/' + videoID; btn.onclick = function() { GM.setClipboard(url, 'text/plain'); console.log('Copied video url to clipboard!'); }; }, 100); }