Instagram - Default Video Volume

Forces Instagram videos to play at a set volume by default

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Instagram - Default Video Volume
// @description  Forces Instagram videos to play at a set volume by default
// @namespace    http://tampermonkey.net/
// @icon         https://cdn-icons-png.flaticon.com/128/15713/15713420.png
// @version      0.0.3
// @author       rxm
// @match        https://www.instagram.com/*
// @license      MIT
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const TARGET_VOLUME = 0.05;
    const processed = new WeakSet();

    function forceVolume(video) {
        if (!video) return;

        try {
            // Respect mute state
            if (!video.muted) {
                video.volume = TARGET_VOLUME;
            }
        } catch (e) {}
    }

    function hook(video) {
        if (processed.has(video)) return;
        processed.add(video);

        // Initial apply
        forceVolume(video);

        // When playback starts (including loops)
        video.addEventListener('play', () => {
            forceVolume(video);
        }, true);

        // When metadata reloads (recycled reels)
        video.addEventListener('loadedmetadata', () => {
            forceVolume(video);
        }, true);

        // When Instagram changes volume or mute internally
        video.addEventListener('volumechange', () => {
            // If UI says muted, enforce silence
            if (video.muted) {
                video.volume = 0;
            } else {
                video.volume = TARGET_VOLUME;
            }
        }, true);
    }

    function scan() {
        document.querySelectorAll('video').forEach(hook);
    }

    // Observe infinite scrolling / recycling
    const observer = new MutationObserver(scan);
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    // Safety net for internal resets
    setInterval(scan, 500);

    // Initial run
    scan();

})();