|
// ==UserScript== // @name YouTube Auto Skip & Volume Lower (Overlay Check) // @namespace http://tampermonkey.net/ // @version 2.1 // @description ytp-ad-player-overlay-layoutを検知して確実に広告中を判定し、音量調整とスキップを行います // @author You // @match https://www.youtube.com/* // @grant none // @run-at document-end // ==/UserScript==
(function() { 'use strict';
let originalVolume = null; let isMutedBefore = false; let isSkipping = false;
// 現在の時刻を「[HH:MM:SS]」の形式で取得する関数 function getTimestamp() { const now = new Date(); const hrs = String(now.getHours()).padStart(2, '0'); const min = String(now.getMinutes()).padStart(2, '0'); const sec = String(now.getSeconds()).padStart(2, '0'); return `[${hrs}:${min}:${sec}]`; }
// 広告判定(音量を下げるための判定) function isAdPlaying() { // 【提案を採用】広告専用のオーバーレイレイアウトが存在するかチェック if (document.querySelector('.ytp-ad-player-overlay-layout')) return true;
// 補助1: スキップボタンが存在すれば確実に広告 if (document.querySelector('.ytp-skip-ad-button')) return true;
// 補助2: プレイヤーオブジェクトの内部データチェック const player = document.getElementById('movie_player') || document.querySelector('.html5-video-player'); if (player && typeof player.getVideoData === 'function') { const data = player.getVideoData(); if (data && (data.isAd === 1 || data.isAd === true || data.ad_id)) return true; }
return false; }
function checkAndHandleAd() { const video = document.querySelector('video'); if (!video) return;
const isAd = isAdPlaying();
if (isAd) { // --- 音量調整 --- if (originalVolume === null) { originalVolume = video.volume; isMutedBefore = video.muted; video.volume = 0.1; console.log(`${getTimestamp()} [AutoSkip] 広告レイアウト検出:音量を下げました。`); }
// --- スキップ処理 --- const skipButton = document.querySelector('.ytp-skip-ad-button'); const isButtonActive = skipButton && window.getComputedStyle(skipButton).opacity === '1' && skipButton.innerText.includes('スキップ');
if (isButtonActive && !isSkipping) { // 通常動画の誤スキップを防ぐため、ここでもオーバーレイの存在をダメ押しで確認 if (!document.querySelector('.ytp-ad-player-overlay-layout')) { return; }
isSkipping = true; const randomDelay = Math.floor(Math.random() * (500 - 100 + 1)) + 100; console.log(`${getTimestamp()} [AutoSkip] スキップボタン有効。 ${randomDelay}ms 後に強制スキップします。`);
setTimeout*1 { video.currentTime = video.duration; console.log(`${getTimestamp()} [AutoSkip] 確証が得られたためスキップを実行しました。`); } isSkipping = false; }, randomDelay); }
} else { // --- 通常動画への復帰 --- if (originalVolume !== null) { setTimeout*2 { video.volume = originalVolume; video.muted = isMutedBefore; console.log(`${getTimestamp()} [AutoSkip] 通常動画に戻りました。音量を復元しました。`); originalVolume = null; isMutedBefore = false; } }, 200); } } }
setInterval(checkAndHandleAd, 300); })();
|