Kamikaze / Auto Skip ADs, Summary & More | Amazon Video

// ==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.1
// @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)
}