B站自动播放视频

打开网页时自动开始播放B站视频。

// ==UserScript==
// @name         B站自动播放视频
// @description  打开网页时自动开始播放B站视频。
// @version      1.01
// @author       yzcjd
// @author2       ChatGPT4辅助
// @namespace    https://greasyfork.org/users/1171320
// @match        https://www.bilibili.com/*
// @match        https://m.bilibili.com/*
// @grant        none
// @run-at       document-start
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    let hasAutoPlayed = false; // 标记是否已自动播放
    let userPaused = false;    // 标记用户是否手动暂停

    const tryPlayVideo = (video) => {
        if (!video) return;

        // 如果用户已手动暂停,就不再干预
        if (userPaused) return;

        const playAttempt = () => {
            if (userPaused || hasAutoPlayed) return;

            video.play().then(() => {
                console.log('[B站自动播放] 播放成功');
                hasAutoPlayed = true;
            }).catch((err) => {
                console.warn('[B站自动播放] 播放失败:', err);
            });
        };

        // 如果 metadata 已加载,立即播放;否则监听 loadedmetadata
        if (video.readyState >= 1) {
            playAttempt();
        } else {
            video.addEventListener('loadedmetadata', playAttempt, { once: true });
        }

        // 监听用户是否点击暂停(一次性绑定)
        video.addEventListener('pause', () => {
            if (!video.ended) { // 排除视频播放完毕的暂停
                userPaused = true;
                console.log('[B站自动播放] 用户手动暂停,停止自动干预');
            }
        }, { once: true });
    };

    const observer = new MutationObserver(() => {
        const video = document.querySelector('video[src^="blob:"]');
        if (video && !hasAutoPlayed) {
            tryPlayVideo(video);
        }
    });

    observer.observe(document.documentElement, {
        childList: true,
        subtree: true
    });

    // 页面已加载,直接检查 video
    window.addEventListener('load', () => {
        const video = document.querySelector('video[src^="blob:"]');
        if (video && !hasAutoPlayed) {
            tryPlayVideo(video);
        }
    });
})();