bilibili 视频播放优化

先安装篡改猴EdgeChrome及其他,再添加下面内容为用户脚本,保存就可以了。

// ==UserScript==
// @name         B站专属-记忆倍速+自动网页全屏
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  修复Shadow DOM穿透,适配新版B站播放器
// @match        https://www.bilibili.com/video/*
// @match        https://www.bilibili.com/bangumi/play/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==
(function () {
    'use strict';
    const STORAGE_KEY = 'bili_custom_last_speed';
    let lastSpeed = parseFloat(localStorage.getItem(STORAGE_KEY)) || 1;
    let appliedSpeed = false;
    let appliedFullscreen = false;

    // 递归穿透 Shadow DOM 查找元素
    function querySelectorDeep(root, selector) {
        if (!root) return null;
        const el = root.querySelector(selector);
        if (el) return el;
        const shadowHosts = root.querySelectorAll('*');
        for (const host of shadowHosts) {
            if (host.shadowRoot) {
                const found = querySelectorDeep(host.shadowRoot, selector);
                if (found) return found;
            }
        }
        return null;
    }

    // 获取video元素
    function getVideo() {
        return document.querySelector('video') || querySelectorDeep(document, 'video');
    }

    // 获取网页全屏按钮(B站W键对应的按钮)
    function getWebFullBtn() {
        // 尝试多种选择器适配不同版本
        const selectors = [
            '.bpx-player-ctrl-web-fullscreen',
            '.bpx-player-ctrl-full-web',
            '.squirtle-video-webfullscreen',
            '[aria-label="网页全屏"]',
            '.bpx-player-ctrl-btn[title="网页全屏"]'
        ];
        for (const sel of selectors) {
            const btn = querySelectorDeep(document, sel);
            if (btn) return btn;
        }
        return null;
    }

    // 获取自动连播开关
    function getAutoPlaySwitch() {
        const selectors = [
            '.bpx-player-ctrl-next-autoplay',
            '.bpx-player-autoplay-switch',
            '.squirtle-autoplay-switch',
            '[aria-label="自动连播"]'
        ];
        for (const sel of selectors) {
            const el = querySelectorDeep(document, sel);
            if (el) return el;
        }
        return null;
    }

    // 应用倍速
    function applySpeed(video) {
        if (appliedSpeed || !video) return;
        video.playbackRate = lastSpeed;
        appliedSpeed = true;
        console.log('[B站增强脚本] 已应用倍速:', lastSpeed);

        // 监听倍速变化,保存到本地
        video.addEventListener('ratechange', () => {
            if (video.playbackRate && video.playbackRate !== lastSpeed) {
                lastSpeed = video.playbackRate;
                localStorage.setItem(STORAGE_KEY, lastSpeed);
                console.log('[B站增强脚本] 记忆新倍速:', lastSpeed);
            }
        });
    }

    // 触发网页全屏
    function applyWebFullscreen() {
        if (appliedFullscreen) return;
        const btn = getWebFullBtn();
        if (btn) {
            // 检查是否已经是网页全屏状态
            if (!document.querySelector('.bpx-state-web-fullscreen') &&
                !btn.classList.contains('bpx-state-active')) {
                btn.click();
                console.log('[B站增强脚本] 已触发网页全屏');
            }
            appliedFullscreen = true;
        }
    }

    // 禁止播放结束后自动连播
    function disableAutoNext(video) {
        if (!video) return;
        video.addEventListener('ended', () => {
            console.log('[B站增强脚本] 播放结束,阻止自动连播');
            // 方式1:直接暂停
            video.pause();
            // 方式2:尝试点击关闭自动连播开关
            const sw = getAutoPlaySwitch();
            if (sw) {
                // 如果开关是开启状态就点一下关掉
                if (sw.classList.contains('bpx-state-active') ||
                    sw.getAttribute('aria-checked') === 'true' ||
                    sw.querySelector('input')?.checked) {
                    sw.click();
                }
            }
        });
    }

    // 主循环:等待播放器加载
    let retryCount = 0;
    const maxRetry = 30; // 最多等30秒

    function init() {
        const video = getVideo();
        if (!video) {
            if (retryCount++ < maxRetry) {
                setTimeout(init, 1000);
            }
            return;
        }

        applySpeed(video);
        disableAutoNext(video);

        // 网页全屏按钮可能比video出现得晚一点,单独等
        function waitFullBtn() {
            const btn = getWebFullBtn();
            if (btn) {
                // 等视频能播放了再触发全屏
                if (video.readyState >= 1) {
                    applyWebFullscreen();
                } else {
                    video.addEventListener('loadedmetadata', applyWebFullscreen, { once: true });
                }
            } else if (retryCount++ < maxRetry) {
                setTimeout(waitFullBtn, 1000);
            }
        }
        waitFullBtn();
    }

    // 延迟启动,等页面初步渲染
    setTimeout(init, 1500);

    // 调试:打开控制台看有没有这行输出,确认脚本在运行
    console.log('[B站增强脚本] 脚本已加载,等待播放器...');
})();

更新记录

v2.0 2026/7/22

  • 功能实现:记忆倍速+自动网页全屏