Greasy Fork

来自缓存

Greasy Fork is available in English.

视频音量默认50%

自动将所有视频音量设置为50%,不影响用户调节,每次打开视频都重置为50%

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         视频音量默认50%
// @name:zh-CN   视频音量默认50%
// @name:en      Video Volume Default 50%
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  自动将所有视频音量设置为50%,不影响用户调节,每次打开视频都重置为50%
// @description:zh-CN 自动将所有视频音量设置为50%,不影响用户调节,每次打开视频都重置为50%
// @description:en Automatically set all video volume to 50%, doesn't affect user adjustments, resets to 50% on each video open
// @match        *://www.youtube.com/*
// @match        *://www.bilibili.com/*
// @match        *://live.bilibili.com/*
// @match        *://www.twitch.tv/*
// @match        *://store.steampowered.com/*
// @match        *://vimeo.com/*
// @match        *://www.dailymotion.com/*
// @match        *://player.vimeo.com/*
// @match        *://www.netflix.com/*
// @match        *://www.hulu.com/*
// @match        *://www.amazon.com/*
// @match        *://www.hbo.com/*
// @match        *://www.disney.com/*
// @match        *://www.crunchyroll.com/*
// @match        *://www.funimation.com/*
// @match        *://www.anime-planet.com/*
// @match        *://www.animefreak.tv/*
// @match        *://www.animeultima.tv/*
// @match        *://www.animekisa.tv/*
// @match        *://www.animeflix.io/*
// @match        *://www.animepahe.com/*
// @match        *://www.animeheaven.ru/*
// @match        *://www.animeout.xyz/*
// @match        *://www.animekisa.tv/*
// @match        *://www.animeultima.tv/*
// @match        *://www.animefreak.tv/*
// @match        *://www.anime-planet.com/*
// @match        *://www.crunchyroll.com/*
// @match        *://www.funimation.com/*
// @match        *://www.disney.com/*
// @match        *://www.hbo.com/*
// @match        *://www.amazon.com/*
// @match        *://www.hulu.com/*
// @match        *://www.netflix.com/*
// @match        *://player.vimeo.com/*
// @match        *://www.dailymotion.com/*
// @match        *://vimeo.com/*
// @match        *://store.steampowered.com/*
// @match        *://www.twitch.tv/*
// @match        *://live.bilibili.com/*
// @match        *://www.bilibili.com/*
// @match        *://www.youtube.com/*
// @match        *://*/*
// @grant        none
// @license      MIT
// @noframes
// ==/UserScript==

(function() {
    'use strict';
    
    // 防止重复初始化
    if (window.__VIDEO_VOLUME_DEFAULT_INITIALIZED__) return;
    window.__VIDEO_VOLUME_DEFAULT_INITIALIZED__ = true;
    
    const TARGET_VOLUME = 0.5; // 50% 音量
    const processedVideos = new WeakSet(); // 记录已处理的视频
    
    // 设置视频音量的函数
    function setVideoVolume(video) {
        if (!video || processedVideos.has(video)) return;
        
        try {
            // 设置音量为50%
            video.volume = TARGET_VOLUME;
            
            // 标记为已处理
            processedVideos.add(video);
            
            console.log('视频音量已设置为50%');
        } catch (error) {
            console.warn('设置视频音量失败:', error);
        }
    }
    
    // 监听视频元素变化
    function observeVideoChanges() {
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                mutation.addedNodes.forEach((node) => {
                    if (node.nodeType === Node.ELEMENT_NODE) {
                        // 检查新添加的节点
                        if (node.tagName === 'VIDEO') {
                            setVideoVolume(node);
                        }
                        
                        // 检查新添加节点内的视频元素
                        const videos = node.querySelectorAll ? node.querySelectorAll('video') : [];
                        videos.forEach(video => setVideoVolume(video));
                    }
                });
            });
        });
        
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    }
    
    // 处理现有视频
    function processExistingVideos() {
        const videos = document.querySelectorAll('video');
        videos.forEach(video => setVideoVolume(video));
    }
    
    // 监听视频加载事件
    function addVideoEventListeners() {
        document.addEventListener('load', (e) => {
            if (e.target.tagName === 'VIDEO') {
                setVideoVolume(e.target);
            }
        }, true);
        
        document.addEventListener('canplay', (e) => {
            if (e.target.tagName === 'VIDEO') {
                setVideoVolume(e.target);
            }
        }, true);
    }
    
    // 初始化
    function init() {
        // 处理现有视频
        processExistingVideos();
        
        // 监听视频变化
        observeVideoChanges();
        
        // 添加事件监听器
        addVideoEventListeners();
        
        // 定期检查新视频(备用方案)
        setInterval(() => {
            const videos = document.querySelectorAll('video');
            videos.forEach(video => {
                if (!processedVideos.has(video)) {
                    setVideoVolume(video);
                }
            });
        }, 1000);
    }
    
    // 页面加载完成后初始化
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
    
})();