Skip to content

Instantly share code, notes, and snippets.

@Antoine-dh
Last active November 27, 2021 13:55
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Antoine-dh/ca211b44781ce6111badab041d6b5baa to your computer and use it in GitHub Desktop.
Save Antoine-dh/ca211b44781ce6111badab041d6b5baa to your computer and use it in GitHub Desktop.
Greasemonkey script to remove Youtube recommandations in the sidebar and video player (2018)
// ==UserScript==
// @name Youtube remove recommendations
// @description removes youtube recommendations in sidebar and end of video
// @author antoine-dh
// @include *.youtube.com/watch*
// @include *.youtube.*/watch*
// @version 1.1
// ==/UserScript==
// TODO: add more locales
const searchStrings = [
'Recommandée pour vous', // fr-FR
'Recommandé pour vous', // fr-CA
'Recommended for you', // en-US/UK
'Empfohlenes Video', // de-DE
'Recomendado para ti', // es-ES/US
'Recomendado para si', // pt-PT
'Recomendado', // pt-BR
'Consigliato per te', // it-IT
];
function removeSideElement(element) {
if (element.getElementsByClassName('style-scope ytd-badge-supported-renderer').length !== 0) { // if it as the "New" badge
element.remove();
return;
}
for (let i of element.getElementsByClassName('style-scope ytd-video-meta-block')) {
for (let str of searchStrings) {
if (i.textContent.includes(str)) {
element.remove();
return;
}
}
}
}
function removeShit() {
for (let i of document.getElementsByClassName('ytp-endscreen-content')) { // removes all suggestions at the video end
i.remove();
}
for (let i of document.getElementsByClassName('ytp-upnext ytp-suggestion-set')) { // removes next autoplay video
i.remove();
}
for (let i of document.getElementsByTagName('ytd-compact-video-renderer')) { // removes sidebar recommendations
removeSideElement(i);
}
}
// from https://stackoverflow.com/a/14570614
const observeDOM = (function () {
const MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
return function (obj, callback) {
if (!obj || !obj.nodeType === true) {
return;
}
if (MutationObserver) {
const obs = new MutationObserver(function (mutations) {
if (mutations[0].addedNodes.length)
callback(mutations[0]);
});
obs.observe(obj, {childList: true, subtree: true});
} else if (window.addEventListener) {
obj.addEventListener('DOMNodeInserted', callback, false);
}
}
})();
observeDOM(document, () => {
removeShit();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment