bilibili字幕自动打开

自动打开哔哩哔哩字幕,只在有播放列表时开启,方便看课程,不需要每次都点击字幕

// ==UserScript==
// @name         bilibili字幕自动打开
// @namespace    http://tampermonkey.net/
// @version      1.13
// @description  自动打开哔哩哔哩字幕,只在有播放列表时开启,方便看课程,不需要每次都点击字幕
// @author       lisisuidegithub
// @match        https://www.bilibili.com/video/*
// @icon         https://i0.hdslb.com/bfs/static/jinkela/long/images/favicon.ico
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    let interval; // 声明轮询变量

    // 等待页面完全加载完毕后执行脚本
    window.onload = function() {
        let lastUrl = window.location.href; // 存储上一个 URL

        // 初始检测播放列表和字幕
        checkAndOpenSubtitle();

        // 监听 DOM 变化
        const observer = new MutationObserver(() => {
            let currentUrl = window.location.href;


            // 检查 URL 是否发生变化
            if (currentUrl !== lastUrl) {
                console.log('URL发生变化');
                console.log('currentUrl:'+currentUrl)
                console.log('lastUrl:'+lastUrl)
                lastUrl = currentUrl; // 更新上一个 URL

                clearInterval(interval); // 停止当前轮询
                checkAndOpenSubtitle(); // 重新检测播放列表和字幕
            }
        });

        // 开始观察 DOM 变化,监听整个页面的变化
        observer.observe(document.body, { childList: true, subtree: true });

        function checkAndOpenSubtitle() {

            let boxList = document.querySelector("#mirror-vdcon > div.right-container > div > div.rcmd-tab > div.video-pod.video-pod > div.video-pod__body > div.video-pod__list.multip.list")
            // console.log(boxList)

            if (!boxList && !lastUrl.includes('p=')) {
                console.log('不存在列表!')
                return
            }

            // if (!lastUrl.includes('p=')) {
            //     console.log('不存在列表!')
            //     return
            // }

            //// 检测是否存在播放列表
            //const listBox = document.querySelector('div.video-pod.video-pod');
            //if (!listBox) {
            //    console.log('不存在播放列表');
            //    return
            //}

            console.log('发现播放列表!');
            clearInterval(interval); // 确保清除旧的轮询
            waitForSubtitleButton();

        }

        // 轮询检测列表和字幕
        function waitForSubtitleButton() {

            // 检测字幕是否已开启
            let subtitlePanel = document.querySelector('.bili-subtitle-x-subtitle-panel .bili-subtitle-x-subtitle-panel-text.bili-subtitle-x-subtitle-panel-text-mouse-move-cursor')
            if (subtitlePanel) {
                console.log('字幕已开启!!!')
                // clearInterval(interval)
                return
            }


            const maxAttempts = 10; // 设置最大尝试次数
            let attempts = 0;

            console.log('尝试开启字幕......')

            interval = setInterval(() => {
                // 检测字幕是否已开启
                subtitlePanel = document.querySelector('.bili-subtitle-x-subtitle-panel .bili-subtitle-x-subtitle-panel-text.bili-subtitle-x-subtitle-panel-text-mouse-move-cursor')
                if (subtitlePanel) {
                    console.log('字幕已开启!!!')
                    clearInterval(interval)
                    return
                }

                attempts++;
                if (attempts > maxAttempts) {
                    console.log('尝试次数过多,停止轮询!');
                    console.log('不存在字幕!');
                    clearInterval(interval);
                    return
                }
                console.log(`第${attempts}次尝试......`)
                let subtitleButton = document.querySelector('.bpx-player-ctrl-btn.bpx-player-ctrl-subtitle[aria-label="字幕"] .bpx-player-ctrl-btn-icon .bpx-common-svg-icon');

                if (subtitleButton) {
                    subtitleButton.click(); // 点击字幕按钮
                    console.log('字幕开启成功!');
                    clearInterval(interval);
                    return
                }

            }, 1000); // 每秒检测一次字幕按钮
        }
    };
})();