芒果TV网页版自动关闭弹幕

自动关闭芒果TV视频弹幕,支持切换集数后自动关闭弹幕,用户可选择启用或禁用功能

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         芒果TV网页版自动关闭弹幕
// @namespace    http://tampermonkey.net/
// @version      1.15.2
// @description  自动关闭芒果TV视频弹幕,支持切换集数后自动关闭弹幕,用户可选择启用或禁用功能
// @author       mankaki
// @match        *://www.mgtv.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=mgtv.com
// @grant        none
// @license      GPL-3.0
// ==/UserScript==

(function() {
    'use strict';

    let autoCloseDanmu = JSON.parse(localStorage.getItem('autoCloseDanmu')) ?? true;
    let networkErrorFlag = false;

    // 创建开关按钮
    function createToggleButton() {
        const button = document.createElement('div');
        button.style.position = 'fixed';
        button.style.bottom = '10px';
        button.style.right = '10px';
        button.style.zIndex = '9999';
        button.style.display = 'flex';
        button.style.alignItems = 'center';
        button.style.justifyContent = 'center';
        button.style.width = 'auto';
        button.style.height = '40px';
        button.style.borderRadius = '40px 0 0 40px';
        button.style.backgroundColor = '#fff';
        button.style.boxShadow = '-1px 4px 8px rgba(0, 0, 0, .06)';
        button.style.color = 'rgb(51, 51, 51)';
        button.style.cursor = 'pointer';
        button.style.right = '-6px';
        button.style.whiteSpace = 'nowrap';
        button.style.padding = '0 10px';
        button.style.transition = 'background-color 0.3s, color 0.3s';

        button.innerText = `自动关闭弹幕: ${autoCloseDanmu ? '是' : '否'}`;

        button.addEventListener('click', () => {
            autoCloseDanmu = !autoCloseDanmu;
            localStorage.setItem('autoCloseDanmu', JSON.stringify(autoCloseDanmu));
            button.innerText = `自动关闭弹幕: ${autoCloseDanmu ? '是' : '否'}`;
        });

        button.addEventListener('mouseover', () => {
            button.style.backgroundColor = '#ff5f00';
            button.style.color = '#fff';
        });

        button.addEventListener('mouseout', () => {
            button.style.backgroundColor = '#fff';
            button.style.color = 'rgb(51, 51, 51)';
        });

        document.body.appendChild(button);
    }

    createToggleButton();

    // 关闭弹幕的函数
    function closeDanmu() {
        if (!autoCloseDanmu) return; // 检查是否开启自动关闭弹幕

        const danmuButtonOn = document.querySelector("._danmuSwitcher_1qow5_208._on_1qow5_238");
        const danmuButtonOff = document.querySelector("._danmuSwitcher_1qow5_208");

        if (danmuButtonOn) {
            danmuButtonOn.click();
            console.log("弹幕已关闭");
        } else if (danmuButtonOff) {
            console.log("弹幕已关闭,无需操作");
        } else {
            console.log("未找到弹幕开关按钮");
        }
    }

    // 页面加载后自动尝试关闭弹幕
    window.addEventListener('load', closeDanmu);

    // 拦截 console.error 以监测网络错误
    const originalConsoleError = console.error;
    console.error = function(...args) {
        originalConsoleError.apply(console, args);
        if (args.some(arg => typeof arg === 'string' && /^Ne/.test(arg))) {  // 检测以 "Ne" 开头的消息
            networkErrorFlag = true;
            console.log("检测到网络错误,将在视频点击时自动关闭弹幕");
            closeDanmu();  // 自动关闭弹幕
        }
    };

    // 监听视频播放器的点击事件
    const playerElement = document.querySelector(".mango-player.p-MacIntel.player-s");
    if (playerElement) {
        playerElement.addEventListener('click', () => {
            if (autoCloseDanmu && networkErrorFlag) {
                console.log("检测到视频点击事件和网络错误,3秒后自动关闭弹幕");
                setTimeout(() => {
                    closeDanmu();
                    networkErrorFlag = false; // 重置网络错误标志
                }, 3000); // 延时3秒执行关闭弹幕
            }
        });
    }

    // 检测URL变化以自动关闭弹幕
    let lastUrl = window.location.href;
    document.addEventListener('click', () => {
        setTimeout(() => {
            const currentUrl = window.location.href;
            if (currentUrl !== lastUrl) {
                lastUrl = currentUrl;
                closeDanmu();
            }
        }, 2000);
    });
})();