Last active
September 17, 2024 08:24
-
-
Save 4v3ngR/cf0141421570388f2814076443c1c385 to your computer and use it in GitHub Desktop.
Block youtube ads in Safari with userscripts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Youtube adblock | |
// @namespace http://tampermonkey.net/ | |
// @version 0.2 | |
// @description enough with the ads! | |
// @author 4v3ngR | |
// @match https://*.youtube.com/* | |
// @icon https://www.google.com/s2/favicons?sz=64&domain=youtube.com | |
// @grant none | |
// @run-at document-start | |
// ==/UserScript== | |
// Patches the ads for cold loading | |
(function() { | |
var ytInitialPlayerResponse = null; | |
function getter() { | |
return ytInitialPlayerResponse; | |
} | |
function setter(data) { | |
ytInitialPlayerResponse = { ...data, adPlacements: [] }; | |
} | |
if (window.ytInitialPlayerResponse) { | |
Object.defineProperty(window.ytInitialPlayerResponse, 'adPlacements', { | |
get: () => [], | |
set: (a) => undefined, | |
configurable: true | |
}); | |
} else { | |
Object.defineProperty(window, 'ytInitialPlayerResponse', { | |
get: getter, | |
set: setter, | |
configurable: true | |
}); | |
} | |
})(); | |
// FETCH POLYFILL | |
(function() { | |
const {fetch: origFetch} = window; | |
window.fetch = async (...args) => { | |
const response = await origFetch(...args); | |
if (response.url.includes('/youtubei/v1/player')) { | |
const text = () => | |
response | |
.clone() | |
.text() | |
.then((data) => data.replace(/adPlacements/, 'odPlacement')); | |
response.text = text; | |
return response; | |
} | |
return response; | |
}; | |
})(); | |
// OTHER STUFF - just in case an ad gets through | |
(function() { | |
window.autoClick = setInterval(function() { | |
try { | |
const btn = document.querySelector('.videoAdUiSkipButton,.ytp-ad-skip-button') | |
if (btn) { | |
btn.click() | |
} | |
const ad = document.querySelector('.ad-showing'); | |
if (ad) { | |
document.querySelector('video').playbackRate = 10; | |
} | |
} catch (ex) {} | |
}, 100); | |
window.inlineAdsInterval = setInterval(function() { | |
try { | |
const div = document.querySelector('#player-ads'); | |
if (div) { | |
div.parentNode.removeChild(div); | |
} | |
} catch (ex) {} | |
}, 500); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello, the skip button doesn't trigger automatically. When an add is shown, I have to skip it manually. Otherwise, it works well, thanks.