Auto Skip ADs, Summary & More | Amazon Video

Automatically skips ads, recaps, previews and more when watching videos on Amazon Prime.

// ==UserScript==
// @name         	Auto Skip ADs, Summary & More | Amazon Video
// @name:de         Automatisches Überspringen von Werbung, Zusammenfassung & mehr | Amazon Video
// @namespace   	https://greasyfork.org/users/928242
// @version     	0.9
// @description  	Automatically skips ads, recaps, previews and more when watching videos on Amazon Prime.
// @description:de  Überspringt automatisch Werbung, Zusammenfassungen, Vorschauen und mehr, wenn du Videos auf Amazon Prime ansiehst.
// @author       	Kamikaze (https://github.com/Kamiikaze)
// @supportURL      https://github.com/Kamiikaze/Tampermonkey/issues
// @match        	https://www.amazon.de/gp/video/detail/*
// @match        	https://www.amazon.*/*/dp/*/ref=sr_*
// @icon         	https://www.google.com/s2/favicons?sz=64&domain=amazon.de
// @grant        	none
// @license      	MIT
// ==/UserScript==


// Change to the text matching your language for the skip button
const skipAdButtonText = 'Überspringen'

// How often in X seconds to scan for ADs
const scanInterval = 3



/* ! ! ! ! ! ! ! !

Dont change below!

! ! ! ! ! ! ! ! */


let checkForAds = ''
let isAutoplay = true
let doOnce = true
let skipAdContainer = ''
let skipAdEl = ''
let skipButtonEl = ''
const clp = '[Amazon AutoSkip Script] '

startAdScan()

// Main Function Scanning for ADs
async function scanForADs() {

	if (!isVideoPlaying()) return;

    	await checkForAutoplay()
	
    	if (isAutoplay) return

	console.log(clp + "Scanning for running AD..")

	skipAdEl = await getSkipAdElement()

	skipCredits()

	if (!skipAdEl) return

	console.log(clp + "skipButtonEl:", skipAdEl)

	console.log(clp + "Detected playing AD. Trying to skip..")

	skipAd()
}

// Starting Video on a given time, when it has a time-param
async function checkForAutoplay() {
    if (!doOnce) return

    const url = document.querySelector('.fbl-play-btn').href
    const urlParams = await new URLSearchParams(url);
    const paramT = await urlParams.get('t');
    console.log("paramT", paramT)

    if (paramT > 0) {
        console.log(clp + "Autoplay detected. Delaying scan.")
        setTimeout(() => (isAutoplay = false), 5000)
    } else {
        isAutoplay = false
    }
    doOnce = false
    return
}

// Skipping the AD and restart delayed Scanning
function skipAd() {
	setTimeout( () => {
		try {
			skipAdEl.click()
			console.log(clp + "Skipped AD")
		} catch(err) {
			console.error(clp + "Coudn't Skip Ad or Click Element")
		}
		restartAdScan()
	}, 1000 )
}

function skipCredits() {
	const buttonEl = document.querySelector("button.atvwebplayersdk-skipelement-button")

	if (!buttonEl) return;

	console.log(clp + "Skipped Credits")
	buttonEl.click()
}

// Checks if Video is played
function isVideoPlaying() {
	const videoContainer = document.querySelector("#dv-web-player")

	if (!videoContainer) return

	return videoContainer.classList.contains("dv-player-fullscreen")
}

// Finding SkipElement and returning it
async function getSkipAdElement() {
	skipAdContainer = document.querySelector("div.atvwebplayersdk-infobar-container > div > div:last-child")

	if (!skipAdContainer) return

	return await [...skipAdContainer.childNodes].find( (el) => {

		if (el.innerText === skipAdButtonText) {
			console.log(clp + "Found Skip-Button Element", el)
			console.log(clp + "Skip-Button Text:", el.innerText)

			return el
		}
	});
}

// Starting AdScan Interval
function startAdScan() {
	checkForAds = setInterval( () => { scanForADs() }, scanInterval * 1000 )
}

// Clearing Interval, Vars and delaying restart of scan
function restartAdScan() {
	clearInterval(checkForAds)

	checkForAds = ''
	skipAdContainer = ''
	skipAdEl = ''
	skipButtonEl = ''

	setTimeout( () => { startAdScan() }, 1000 )
}