10/30/2021, 12:35:27 AM
目前為
// ==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();