// ==UserScript== // @name FuckAds - A Youtube pub skipper // @namespace http://tampermonkey.net/ // @version 4.7.1 // @description Automatically skips YouTube ads and mutes/unmutes video for Firefox (quickly tested) and Opera (extensively tested). // @author John Doe // @match *://www.youtube.com/* // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function () { const player = document.getElementById('movie_player') const messageDiv = document.createElement('div') document.body.appendChild(messageDiv) messageDiv.style.cssText = 'position: fixed; top: 50%; left: 0; background: red; color: white; padding: 10px; z-index: 999;' let adSkipped = false function skipAd () { const skipButton = document.querySelector('.ytp-ad-skip-button-text') if (player && skipButton && !adSkipped) { skipButton.click() adSkipped = true player.unMute() player.style.zIndex = '999' player.seekTo(0) player.playVideo() } } function startObserving () { if (!player) { messageDiv.innerText = 'Player not detected' return } if (player.classList.contains('ad-showing')) { const skipButton = document.querySelector('.ytp-ad-skip-button-text') if (!skipButton) { messageDiv.innerText = 'Player and ad detected, no skip button available so you need to wait' player.mute() player.style.zIndex = '-999' } else { messageDiv.innerText = 'Player and ad detected' skipAd() } } else { messageDiv.innerText = 'No ad detected' player.unMute() player.style.zIndex = '999' if (player.getPlayerState() !== 1 && location.href.includes('/watch')) { player.seekTo(0) player.playVideo() } } } function checkUrlChange () { if (location.href.includes('/watch') && !adSkipped) { adSkipped = false startObserving() } } setInterval(checkUrlChange, 1000) // Continuously check for URL change setInterval(startObserving, 1000) // Continuously check for ad })()