// ==UserScript== // @name YouTube /embed/ forwarder // @description Forwards YouTube links to the youtube.com/embed/* page, so there's just the video in your window and nothing else. // @namespace https://greasyfork.org/en/users/1148791-vuccala // @author Vuccala // @icon https://archive.org/download/yt_icon/yt.png // @match *://*.youtube.com/* // @match *://*.youtu.be/* // @run-at document-start // @version 0.4 // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/473082/YouTube%20embed%20forwarder.user.js // @updateURL https://update.greasyfork.icu/scripts/473082/YouTube%20embed%20forwarder.meta.js // ==/UserScript== (function() { var embedBaseUrl = 'https://youtube.com/embed/'; function getId(u) { var idMatch = /(?:[?&]v=|\/(?:embed\/|v\/|shorts\/))([^&?/]+)/.exec(u); return idMatch ? idMatch[1] : ''; } function updateLinks(links) { links.forEach(function(link) { var linkHref = link.getAttribute('href'); var videoIdMatch = /(?:[?&]v=|\/(?:embed\/|v\/|shorts\/))([^&?/]+)/.exec(linkHref); if (videoIdMatch) { var videoId = videoIdMatch[1]; var embedUrl = embedBaseUrl + videoId; link.href = embedUrl; } }); } function observeDOM() { var targetNode = document.body; var observer = new MutationObserver(function(mutationsList) { for (var mutation of mutationsList) { if (mutation.type === 'childList') { var newLinks = mutation.addedNodes[0].querySelectorAll('a[href*="/watch?v="], a[href*="/shorts/"], a[href*="/watch?app=desktop&v="]'); updateLinks(newLinks); } } }); var observerConfig = { childList: true, subtree: true }; observer.observe(targetNode, observerConfig); } var url = window.location.href; if (url.includes('/watch?v=') || url.includes('/shorts/') || url.includes('/watch?app=desktop&v=')) { var videoId = getId(url); var newURL = embedBaseUrl + videoId; // Change the location to the new URL if (newURL !== url) { window.location.href = newURL; } } else { observeDOM(); } })();