Youtube: Remove Overlays

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

目前为 2021-10-31 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Youtube: Remove Overlays
  3. // @namespace https://greasyfork.org/en/users/221281-klaufir
  4. // @match https://www.youtube.com/embed/*
  5. // @match https://www.youtube.com/*
  6. // @grant none
  7. // @version 1.10
  8. // @author -
  9. // @description 10/30/2021, 12:35:27 AM
  10. // ==/UserScript==
  11.  
  12. function idle_waiter(wait_for_idle_ms, on_idle_callback) {
  13. // source: https://stackoverflow.com/a/47406751
  14. var action = function(o) {
  15. o.disconnect();
  16. on_idle_callback();
  17. }
  18. var resetTimer = function(changes, observer) {
  19. clearTimeout(timer);
  20. timer = setTimeout(action, wait_for_idle_ms, observer);
  21. }
  22. var observer = new MutationObserver(resetTimer);
  23. var timer = setTimeout(action, wait_for_idle_ms, observer); // wait for the page to stay still for 3 seconds
  24. observer.observe(document, {childList: true, subtree: true});
  25. }
  26.  
  27. function removeAllByClass(classes) {
  28. classes.forEach(cls => {
  29. Array.from(document.getElementsByClassName(cls)).map(e => e.remove());
  30. });
  31. }
  32.  
  33.  
  34. function cleanupOverlays() {
  35. // console.log('----- cleanupOverlays ------ ')
  36. const classes = [
  37. 'ytp-paid-content-overlay', // paid promotion notification overlay in the bottom left corner
  38. 'ytp-pause-overlay', // "More Videos" overlay on paused embeds
  39. 'ytp-ce-element', // covering overlays at the end of the video
  40. 'iv-branding', // branding overlay in the bottom right corner
  41. 'ytp-cards-teaser', // info cards in the top right corner
  42. 'ytp-cards-button-icon', // info cards in the top right corner
  43. 'ytp-cards-button-title', // info cards in the top right corner
  44. 'ytp-endscreen-content', // endscreen recommended videos
  45. 'ytp-spinner' // remove spinner stuck on screen
  46. ];
  47. removeAllByClass(classes);
  48. }
  49.  
  50. function moviePlayerWatcher() {
  51. // run cleanup overlays after the movie player element has not been
  52. // modified for at least 5 seconds
  53. let moviePlayerChangeTimeout = 5000;
  54. var movie_player = document.getElementById('movie_player');
  55. console.log('movie_player: ', movie_player);
  56. if (movie_player === null) {
  57. setTimeout(moviePlayerWatcher, 1000);
  58. return;
  59. }
  60. var timer = null;
  61. var moviePlayerMutationEvent = function(changes, observer) {
  62. console.log('moviePlayerMutationEvent:', changes);
  63. clearTimeout(timer);
  64. timer = setTimeout(cleanupOverlays, moviePlayerChangeTimeout);
  65. }
  66. var observer = new MutationObserver(moviePlayerMutationEvent);
  67. observer.observe(movie_player, {attributes: false, childList: true, subtree: false});
  68. }
  69.  
  70. // overkill but works
  71. idle_waiter(100, cleanupOverlays);
  72. idle_waiter(500, cleanupOverlays);
  73. idle_waiter(1000, cleanupOverlays);
  74. idle_waiter(2000, cleanupOverlays);
  75. setTimeout(cleanupOverlays, 2000);
  76. setTimeout(cleanupOverlays, 5000);
  77.  
  78. moviePlayerWatcher();
  79.