From 4f1e01dde077be2f3a2b0ca417d3c92256c435a4 Mon Sep 17 00:00:00 2001 From: Gabe Date: Wed, 15 Oct 2025 23:58:57 +0800 Subject: [PATCH] feat: youtube ad skip --- src/subtitle/YouTubeCaptionProvider.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/subtitle/YouTubeCaptionProvider.js b/src/subtitle/YouTubeCaptionProvider.js index 2ce7b71..52f8ca8 100644 --- a/src/subtitle/YouTubeCaptionProvider.js +++ b/src/subtitle/YouTubeCaptionProvider.js @@ -70,8 +70,8 @@ class YouTubeCaptionProvider { } #moAds(adContainer) { - const adLayout = ".ytp-ad-player-overlay-layout"; - const skipBtn = + const adLayoutSelector = ".ytp-ad-player-overlay-layout"; + const skipBtnSelector = ".ytp-skip-ad-button, .ytp-ad-skip-button, .ytp-ad-skip-button-modern"; const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { @@ -80,7 +80,7 @@ class YouTubeCaptionProvider { mutation.addedNodes.forEach((node) => { if (node.nodeType !== Node.ELEMENT_NODE) return; - if (node.matches(adLayout)) { + if (node.matches(adLayoutSelector)) { logger.debug("Youtube Provider: AD start playing!", node); // todo: 顺带把广告快速跳过 if (videoEl) { @@ -90,15 +90,21 @@ class YouTubeCaptionProvider { if (this.#managerInstance) { this.#managerInstance.setIsAdPlaying(true); } - } else if (node.matches(skipBtn)) { + } else if (node.matches(skipBtnSelector)) { logger.debug("Youtube Provider: AD skip button!", node); node.click(); } + + const skipBtn = node?.querySelector(skipBtnSelector); + if (skipBtn) { + logger.debug("Youtube Provider: AD skip button!!", skipBtn); + skipBtn.click(); + } }); mutation.removedNodes.forEach((node) => { if (node.nodeType !== Node.ELEMENT_NODE) return; - if (node.matches(adLayout)) { + if (node.matches(adLayoutSelector)) { logger.debug("Youtube Provider: Ad ends!"); if (videoEl) { videoEl.playbackRate = 1;