// ==UserScript== // @name YouTube Focus Mode // @namespace http://tampermonkey.net/ // @version 1.0.3 // @description Put YouTube in focus mode! Hides all unasked for content (recommendations, subscriptions, related, etc.) on the home and watch pages. // @author EmeraldSlash // @match *://*.youtube.com/* // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; // css selectors and enable states for various features of this script // delete home page feed const HOME_PAGE_FEED = ["[page-subtype='home']", true]; // auto focus search bar when home page feed deleted const HOME_PAGE_SEARCH_BAR = ["input#search", true]; // delete related feed on watch page const WATCH_PAGE_RELATED = ["ytd-compact-video-renderer.ytd-watch-next-secondary-results-renderer:not([expansion='collapsed']).ytd-watch-next-secondary-results-renderer", true]; // delete the related feed's continuations element which is what handles infinite scroll const WATCH_PAGE_CONTINUATION = ["#continuations.style-scope.ytd-watch-next-secondary-results-renderer", true]; // delete the video wall that shows within the player when a video finishes const WATCH_PAGE_VIDEOWALL = [".ytp-endscreen-content", true]; // import library for detecting added elements // insertion-query v1.0.3 (2016-01-20) // license:MIT // Zbyszek Tenerowicz (http://naugtur.pl/) var insertionQ=function(){"use strict";function a(a,b){var d,e="insQ_"+g++,f=function(a){(a.animationName===e||a[i]===e)&&(c(a.target)||b(a.target))};d=document.createElement("style"),d.innerHTML="@"+j+"keyframes "+e+" { from { outline: 1px solid transparent } to { outline: 0px solid transparent } }\n"+a+" { animation-duration: 0.001s; animation-name: "+e+"; "+j+"animation-duration: 0.001s; "+j+"animation-name: "+e+"; } ",document.head.appendChild(d);var h=setTimeout(function(){document.addEventListener("animationstart",f,!1),document.addEventListener("MSAnimationStart",f,!1),document.addEventListener("webkitAnimationStart",f,!1)},n.timeout);return{destroy:function(){clearTimeout(h),d&&(document.head.removeChild(d),d=null),document.removeEventListener("animationstart",f),document.removeEventListener("MSAnimationStart",f),document.removeEventListener("webkitAnimationStart",f)}}}function b(a){a.QinsQ=!0}function c(a){return n.strictlyNew&&a.QinsQ===!0}function d(a){return c(a.parentNode)?a:d(a.parentNode)}function e(a){for(b(a),a=a.firstChild;a;a=a.nextSibling)void 0!==a&&1===a.nodeType&&e(a)}function f(f,g){var h=[],i=function(){var a;return function(){clearTimeout(a),a=setTimeout(function(){h.forEach(e),g(h),h=[]},10)}}();return a(f,function(a){if(!c(a)){b(a);var e=d(a);h.indexOf(e)<0&&h.push(e),i()}})}var g=100,h=!1,i="animationName",j="",k="Webkit Moz O ms Khtml".split(" "),l="",m=document.createElement("div"),n={strictlyNew:!0,timeout:20};if(m.style.animationName&&(h=!0),h===!1)for(var o=0;o 0) { result[0].remove(); // focus search bar if homepage feed was removed if (HOME_PAGE_SEARCH_BAR[1]) { let search = document.querySelector(HOME_PAGE_SEARCH_BAR[0]); if (search) { search.focus(); } } } } // remove related section on watch page if (WATCH_PAGE_RELATED[1]) { let result = document.querySelectorAll(WATCH_PAGE_RELATED[1]); if (WATCH_PAGE_CONTINUATION[1]) { result = [...result, ...document.querySelectorAll(WATCH_PAGE_CONTINUATION[0])]; } if (WATCH_PAGE_VIDEOWALL[1]) { result = [...result, ...document.querySelectorAll(WATCH_PAGE_VIDEOWALL[0])]; } if (result.length > 0) { for (let i = 0; i < result.length; i++) { result[i].remove() } } } } // page change and element added listeners document.addEventListener('yt-navigate-finish', update); // remove related section on watch page and infinite scroll element if (WATCH_PAGE_RELATED[1]) { insertionQ(WATCH_PAGE_RELATED[0]).every(function(element) { element.remove() }) if (WATCH_PAGE_CONTINUATION[1]) { insertionQ(WATCH_PAGE_CONTINUATION[0]).every(function(element) { element.remove() }) } if (WATCH_PAGE_VIDEOWALL[1]) { insertionQ(WATCH_PAGE_VIDEOWALL[0]).every(function(element) { element.remove() }) } } // call initial update update() })();