YouTube TV Volume Rememberer

Remembers and controls volume levels on YouTube TV with keyboard shortcuts

当前为 2024-10-26 提交的版本,查看 最新版本

// ==UserScript==
// @name         YouTube TV Volume Rememberer
// @namespace    http://tampermonkey.net/
// @version      1.13
// @description  Remembers and controls volume levels on YouTube TV with keyboard shortcuts
// @author       Nick2bad4u
// @match        *://tv.youtube.com/*
// @grant        none
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tv.youtube.com
// @license      UnLicense
// ==/UserScript==

(() => {
    'use strict';

    const VOLUME_KEY = 'youtubeTVVolume';
    const DEFAULT_VOLUME = 100;

    const setVolume = (value) => {
        const slider = document.querySelector('tp-yt-paper-slider[role="slider"].ytu-volume-slider');
        if (slider) {
            console.log(`Setting volume to: ${value}`);
            slider.value = value;
            slider.setAttribute('value', value);
            slider.dispatchEvent(new Event('input', { bubbles: true }));
            slider.dispatchEvent(new Event('change', { bubbles: true }));
        } else {
            console.error('Volume slider not found');
        }
    };

    const loadSavedVolume = () => {
        const savedVolume = localStorage.getItem(VOLUME_KEY);
        console.log(`Saved volume found: ${savedVolume}`);
        if (savedVolume) {
            setVolume(parseFloat(savedVolume));
        } else {
            console.log('No saved volume found, defaulting to 100');
            setVolume(DEFAULT_VOLUME);
        }
    };

    const tryLoadVolume = () => {
        const slider = document.querySelector('tp-yt-paper-slider[role="slider"].ytu-volume-slider');
        if (slider) {
            loadSavedVolume();
        } else {
            console.error('Volume slider not found, retrying in 3 seconds');
            setTimeout(tryLoadVolume, 3000);
        }
    };

    const observeSliderChanges = () => {
        const slider = document.querySelector('tp-yt-paper-slider[role="slider"].ytu-volume-slider');
        if (slider) {
            console.log('Observing the volume slider for changes');
            const observer = new MutationObserver(() => {
                const currentValue = slider.value;
                console.log(`Current volume changed to: ${currentValue}`);
                localStorage.setItem(VOLUME_KEY, currentValue);
                if (currentValue === "100") {
                    const savedVolume = localStorage.getItem(VOLUME_KEY);
                    if (savedVolume) {
                        console.log(`Resetting volume to saved value: ${savedVolume}`);
                        setVolume(parseFloat(savedVolume));
                    }
                }
            });
            observer.observe(slider, { attributes: true });
        } else {
            console.error('Volume slider not found during initialization');
            setTimeout(observeSliderChanges, 1000);
        }
    };

    const monitorVolume = () => {
        const slider = document.querySelector('tp-yt-paper-slider[role="slider"].ytu-volume-slider');
        if (slider) {
            const currentValue = slider.value;
            const savedVolume = localStorage.getItem(VOLUME_KEY);
            if (currentValue === "100" && savedVolume) {
                console.log(`Monitoring: Resetting volume to saved value: ${savedVolume}`);
                setVolume(parseFloat(savedVolume));
            }
        }
    };

    window.addEventListener('load', () => {
        console.log('YouTube TV Volume Rememberer script loaded');
        setTimeout(() => {
            tryLoadVolume();
            observeSliderChanges();
            setInterval(monitorVolume, 1000);
        }, 1000);
    });

    window.addEventListener('keydown', (event) => {
        const slider = document.querySelector('tp-yt-paper-slider[role="slider"].ytu-volume-slider');
        if (!slider) return;

        // Check if either Shift key is pressed
        const isShiftPressed = event.shiftKey;

        if (isShiftPressed && event.key === 'ArrowUp') {
            const newValue = Math.min(parseFloat(slider.value) + 5, 100);
            setVolume(newValue);
        } else if (isShiftPressed && event.key === 'ArrowDown') {
            const newValue = Math.max(parseFloat(slider.value) - 5, 0);
            setVolume(newValue);
        }
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址