Greasy Fork

Greasy Fork is available in English.

视频音量默认50%

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

当前为 2025-10-13 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 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();
    }
    
})();