Youtube: Remove Overlays

10/30/2021, 12:35:27 AM

31.10.2021 itibariyledir. En son verisyonu görün.

// ==UserScript==
// @name        Youtube: Remove Overlays
// @namespace   https://greasyfork.org/en/users/221281-klaufir
// @match       https://www.youtube.com/embed/*
// @match       https://www.youtube.com/*
// @grant       none
// @version     1.10
// @author      -
// @description 10/30/2021, 12:35:27 AM
// ==/UserScript==

function idle_waiter(wait_for_idle_ms, on_idle_callback) {
  // source: https://stackoverflow.com/a/47406751
  var action = function(o) {
      o.disconnect();
      on_idle_callback();
  }
    
  var resetTimer = function(changes, observer) {
      clearTimeout(timer);
      timer = setTimeout(action, wait_for_idle_ms, observer);
  }
  
  var observer = new MutationObserver(resetTimer);
  var timer = setTimeout(action, wait_for_idle_ms, observer); // wait for the page to stay still for 3 seconds
  observer.observe(document, {childList: true, subtree: true});
}

function removeAllByClass(classes) {
  classes.forEach(cls => {
    Array.from(document.getElementsByClassName(cls)).map(e => e.remove());
  });
}


function cleanupOverlays() {
  // console.log('----- cleanupOverlays ------ ')
  const classes = [
        'ytp-paid-content-overlay',  // paid promotion notification overlay in the bottom left corner
        'ytp-pause-overlay',         // "More Videos" overlay on paused embeds
        'ytp-ce-element',            // covering overlays at the end of the video
        'iv-branding',               // branding overlay in the bottom right corner
        'ytp-cards-teaser',          // info cards in the top right corner
        'ytp-cards-button-icon',     // info cards in the top right corner
        'ytp-cards-button-title',    // info cards in the top right corner
        'ytp-endscreen-content',     // endscreen recommended videos
        'ytp-spinner'                // remove spinner stuck on screen
      ];
  removeAllByClass(classes);
}

function moviePlayerWatcher() {
  // run cleanup overlays after the movie player element has not been
  // modified for at least 5 seconds
  let moviePlayerChangeTimeout = 5000;
  
  var movie_player = document.getElementById('movie_player');
  console.log('movie_player: ', movie_player);
  if (movie_player === null) {
    setTimeout(moviePlayerWatcher, 1000);
    return;
  }
  
  var timer = null;
  
  var moviePlayerMutationEvent = function(changes, observer) {
      console.log('moviePlayerMutationEvent:', changes);
      clearTimeout(timer);
      timer = setTimeout(cleanupOverlays, moviePlayerChangeTimeout);
  }
  
  var observer = new MutationObserver(moviePlayerMutationEvent);
  observer.observe(movie_player, {attributes: false, childList: true, subtree: false});
}

// overkill but works
idle_waiter(100, cleanupOverlays);
idle_waiter(500, cleanupOverlays);
idle_waiter(1000, cleanupOverlays);
idle_waiter(2000, cleanupOverlays);
setTimeout(cleanupOverlays, 2000);
setTimeout(cleanupOverlays, 5000);

moviePlayerWatcher();