B站_播放器自动化

播放时自动点击网页全屏、播放完成后自动退出全屏。

// ==UserScript==
// @name               B站_播放器自动化
// @name:zh-CN         B站_播放器自动化
// @name:en-US         BILI_Player Automation
// @description        播放时自动点击网页全屏、播放完成后自动退出全屏。
// @version            1.0.8
// @author             LiuliPack
// @license            WTFPL
// @namespace          https://gitlab.com/LiuliPack/UserScript
// @include            /www\.bilibili\.com\/(video|bangumi/play|festival)\/*/
// @run-at             document-end
// ==/UserScript==

'use strict';

// 定义元素快捷选择器($(元素定位符))、元素存在检测($$(元素定位符))和切换网页全屏(ToggleFull())函数
let $ = ele => document.querySelector(ele);
function $$(ele) {
    return new Promise(resolve => {
        if ($(ele)) {
            return resolve($(ele));
        }
        const observer = new MutationObserver(mutations => {
            if ($(ele)) {
                resolve($(ele));
                observer.disconnect();
            }
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    });
}
function ToggleFull() {
    // 遍历数组、如果页面路径匹配,就点击对应元素;一起看页面无法获取播放器状态
    [
        ["^/video/(av\d+|BV1*)$", ".bpx-player-ctrl-web"],
        ["^/bangumi/play/*$", ".squirtle-video-pagefullscreen"],
        ["^/festival/*$", ".bpx-player-ctrl-web"],
    ].forEach(data => { (RegExp(data[0].regexp).test(location.pathname)) ? $$(data[1]).then(ele => { ele.click() }) : '' ; })
}

// 等待元素存在,防止出版音像节目页面运行错误
$$('video').then(() => {
    // 监听视频播放
    $('video').addEventListener("play", () => {
        // 如果非全屏
        if(!/web|full/.test($('.bpx-player-container').getAttribute('data-screen'))) {
            // 点击网页全屏按钮
            ToggleFull();
        }
    });
    // 监听视频暂停
    $('video').addEventListener("pause", vid => {
        // 防止进度获取异常,再次定义视频参数
        vid = $('video');
        // 如果全屏状态且播放完成
        if(/web|full/.test($('.bpx-player-container').getAttribute('data-screen')) && parseInt(vid.currentTime) === parseInt(vid.duration)) {
            // 点击网页全屏按钮
            ToggleFull();
        }
    });
});