From c1b3f399f3084ad7f038c3de8b7cacb58c3ccffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?0=25=20=5B=E2=96=88=20=E2=96=88=20=E2=96=88=20=E2=96=88=20?= =?UTF-8?q?=E2=96=88=20=E2=96=88=20=E2=96=88=20=E2=96=88=20=E2=96=88=20?= =?UTF-8?q?=E2=96=88=5D=20100=25?= Date: Thu, 9 Jul 2026 15:31:19 -0500 Subject: [PATCH] Create YouTube_Music_Auto_Confirm_-Are_You_Still_There-_&_Discretion_Warning-1.9.user.js --- ...ll_There-_&_Discretion_Warning-1.9.user.js | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 YouTube_Music_Auto_Confirm_-Are_You_Still_There-_&_Discretion_Warning-1.9.user.js diff --git a/YouTube_Music_Auto_Confirm_-Are_You_Still_There-_&_Discretion_Warning-1.9.user.js b/YouTube_Music_Auto_Confirm_-Are_You_Still_There-_&_Discretion_Warning-1.9.user.js new file mode 100644 index 0000000..14d6709 --- /dev/null +++ b/YouTube_Music_Auto_Confirm_-Are_You_Still_There-_&_Discretion_Warning-1.9.user.js @@ -0,0 +1,222 @@ +// ==UserScript== +// @name YouTube Music Auto Confirm "Are You Still There" & Discretion Warning +// @namespace http://tampermonkey.net/ +// @version 1.9 +// @description Prevents the "Video paused. Continue watching?" dialog from appearing, auto-clicks "Yes", and auto-accepts viewer discretion warnings. +// @author You +// @match https://music.youtube.com/* +// @grant none +// ==/UserScript== + +(function() { + 'use strict'; + + // Configuration + const CHECK_INTERVAL = 2000; // Fallback popup check interval + const ACTIVITY_SPOOF_INTERVAL = 60000; // 1 minute (Spoofs activity to prevent popup) + + let spoofCount = 0; + let badgeElement = null; + let lastActionTime = 0; // Prevents rapid looping + + // --- NEW: Native UI Integration & CSS Animations --- + + function injectStyles() { + if (document.getElementById('ytm-anti-pause-styles')) return; + + const style = document.createElement('style'); + style.id = 'ytm-anti-pause-styles'; + style.textContent = ` + @keyframes ytm-anti-pause-pulse-dot { + 0% { background-color: rgba(255, 255, 255, 0.5); box-shadow: 0 0 0px transparent; } + 50% { background-color: #2ba640; box-shadow: 0 0 10px #2ba640; } + 100% { background-color: rgba(255, 255, 255, 0.5); box-shadow: 0 0 0px transparent; } + } + @keyframes ytm-anti-pause-pulse-text { + 0% { color: rgba(255, 255, 255, 0.5); } + 50% { color: rgba(255, 255, 255, 0.9); } + 100% { color: rgba(255, 255, 255, 0.5); } + } + .ytm-pulse-dot { + animation: ytm-anti-pause-pulse-dot 2s ease-in-out !important; + } + .ytm-pulse-text { + animation: ytm-anti-pause-pulse-text 2s ease-in-out !important; + } + `; + document.head.appendChild(style); + } + + function createVerificationBadge() { + if (badgeElement) return; + + // Find the right side of the top navigation bar + const rightContent = document.querySelector('ytmusic-nav-bar #right-content'); + + if (!rightContent) { + // The page is still loading the nav bar, try again in 1 second + setTimeout(createVerificationBadge, 1000); + return; + } + + injectStyles(); + + // Create the main container + badgeElement = document.createElement('div'); + badgeElement.id = 'ytm-anti-pause-badge'; + badgeElement.style.display = 'flex'; + badgeElement.style.alignItems = 'center'; + badgeElement.style.marginRight = '24px'; + badgeElement.style.fontFamily = 'Roboto, Noto Naskh Arabic UI, Arial, sans-serif'; + badgeElement.style.fontSize = '14px'; + badgeElement.style.fontWeight = '500'; + badgeElement.style.color = 'rgba(255, 255, 255, 0.5)'; + badgeElement.style.cursor = 'default'; + badgeElement.title = 'YouTube Music Anti-Pause is active'; + + // Create the pulsing status dot + const dot = document.createElement('div'); + dot.id = 'ytm-anti-pause-dot'; + dot.style.width = '6px'; + dot.style.height = '6px'; + dot.style.borderRadius = '50%'; + dot.style.backgroundColor = 'rgba(255, 255, 255, 0.5)'; + dot.style.marginRight = '8px'; + + // Create the text label + const text = document.createElement('span'); + text.id = 'ytm-anti-pause-text'; + text.innerText = `Anti-Pause: ${spoofCount}`; + + badgeElement.appendChild(dot); + badgeElement.appendChild(text); + + // Insert it at the beginning of the right-side icons + rightContent.insertBefore(badgeElement, rightContent.firstChild); + } + + function updateBadgeDisplay() { + if (!badgeElement) return; + + const text = badgeElement.querySelector('#ytm-anti-pause-text'); + const dot = badgeElement.querySelector('#ytm-anti-pause-dot'); + + if (text) text.innerText = `Anti-Pause: ${spoofCount}`; + + // Force a browser reflow to restart the CSS animation reliably + if (dot) { + dot.classList.remove('ytm-pulse-dot'); + void dot.offsetWidth; + dot.classList.add('ytm-pulse-dot'); + } + if (badgeElement) { + badgeElement.classList.remove('ytm-pulse-text'); + void badgeElement.offsetWidth; + badgeElement.classList.add('ytm-pulse-text'); + } + } + + function spoofActivity(isInitial = false) { + // 1. Update YouTube's internal last activity tracker + window._lact = Date.now(); + + // 2. Dispatch a harmless background event to trigger any other listeners + document.dispatchEvent(new KeyboardEvent('keyup', { key: 'Shift', bubbles: true, cancelable: true })); + + // 3. Update the verification badge (skip on initial load) + if (!isInitial) { + spoofCount++; + updateBadgeDisplay(); + console.log(`[Auto-Confirm] Activity spoofed to prevent pause. (Count: ${spoofCount})`); + } else { + console.log(`[Auto-Confirm] Initial activity spoofed on load.`); + } + } + + // --- EXISTING: Fallback Auto-Clicker --- + + function dismissPopups() { + // Prevent spamming clicks and getting stuck in a play/pause loop + if (Date.now() - lastActionTime < 3000) return; + + let actionTaken = false; + + // 1. Check for "Are you still there?" dialog + const pausePopup = document.querySelector('ytmusic-you-there-renderer'); + if (pausePopup && pausePopup.offsetParent !== null) { + const yesButton = pausePopup.querySelector('button[aria-label="Yes"]') || + pausePopup.querySelector('button.yt-spec-button-shape-next'); + + if (yesButton && yesButton.offsetParent !== null) { + console.log('[Auto-Confirm] "Are you still there?" dialog detected. Clicking Yes.'); + yesButton.click(); + actionTaken = true; + + setTimeout(() => { + const video = document.querySelector('video'); + if (video && video.paused) { + console.log('[Auto-Confirm] Resuming video playback.'); + const playPromise = video.play(); + if (playPromise !== undefined) { + playPromise.catch(error => { + console.log('[Auto-Confirm] Autoplay prevented by browser:', error); + }); + } + } + }, 500); + } + } + + // 2. Check for "Viewer discretion is advised" warning + const errorContainer = document.querySelector('#player-error-message-container'); + if (errorContainer && errorContainer.offsetParent !== null) { + const proceedButton = errorContainer.querySelector('button[aria-label="I understand and wish to proceed"]'); + + if (proceedButton && proceedButton.offsetParent !== null) { + console.log('[Auto-Confirm] "Viewer discretion is advised" warning detected. Clicking Proceed.'); + proceedButton.click(); + actionTaken = true; + + setTimeout(() => { + const video = document.querySelector('video'); + if (video && video.paused) { + console.log('[Auto-Confirm] Resuming video playback after warning.'); + const playPromise = video.play(); + if (playPromise !== undefined) { + playPromise.catch(error => { + console.log('[Auto-Confirm] Autoplay prevented by browser:', error); + }); + } + } + }, 1000); // Give YT slightly more time to load the stream after clicking proceed + } + } + + if (actionTaken) { + lastActionTime = Date.now(); + } + } + + // --- INITIALIZATION --- + + // Attempt to create the badge immediately (will retry if DOM isn't ready) + createVerificationBadge(); + + // Start the prevention loop + setInterval(() => spoofActivity(false), ACTIVITY_SPOOF_INTERVAL); + + // Run it once immediately on load to set initial state (without incrementing counter) + spoofActivity(true); + + // Start the fallback checking loop + setInterval(dismissPopups, CHECK_INTERVAL); + + // Fallback: Listen for video pause events + document.addEventListener('pause', (event) => { + if (event.target && event.target.tagName === 'VIDEO') { + setTimeout(dismissPopups, 500); + } + }, true); + + console.log('[Auto-Confirm] Script loaded. Prevention and monitoring active.'); +})(); \ No newline at end of file