Bilibili 自动切P

为什么要单独写个脚本呢?因为自动连播就是个傻逼……

ติดตั้งสคริปต์นี้?
สคริปต์ที่แนะนำของผู้เขียน

คุณอาจชื่นชอบ Bilibili 哔哩哔哩视频点踩

ติดตั้งสคริปต์นี้
// ==UserScript==
// @name         Bilibili 自动切P
// @namespace    https://github.com/Tsuk1ko
// @version      1.0.6
// @description  为什么要单独写个脚本呢?因为自动连播就是个傻逼……
// @author       神代綺凛
// @license      GPL-3.0
// @match        https://www.bilibili.com/video/*
// @icon         https://www.bilibili.com/favicon.ico
// @grant        unsafeWindow
// @run-at       document-start
// ==/UserScript==

(() => {
    'use strict';

    const log = (...args) => console.log('[BilibiliAutoNext]', ...args);

    const playerVideoEndedEvents = ['video_media_ended', 'MEDIA_ENDED'];
    const playerDestroyEvents = ['video_destroy'];

    const win = typeof unsafeWindow === 'undefined' ? window : unsafeWindow;

    const get = (obj, paths) => paths.reduce((prev, path) => (typeof prev === 'undefined' ? undefined : prev[path]), obj);

    const initPlayer = () => {
        const { player } = win;
        if (!player) return;
        playerVideoEndedEvents.forEach(event => {
            player.on(event, onVideoEnded);
        });
        playerDestroyEvents.forEach(event => {
            player.on(event, () => setTimeout(initPlayer));
        });
        log('initialized successfully');
    };

    const onVideoEnded = () => {
        const curP = get(win, ['__INITIAL_STATE__', 'p']);
        const totalP = get(win, ['__INITIAL_STATE__', 'videoData', 'videos']);
        log(`video ended ${curP}/${totalP}`);
        if (curP < totalP) {
            log('goto next video');
            setTimeout(() => player.next(), 100);
        }
    };

    Object.defineProperty(win, 'player', {
        configurable: true,
        set: player => {
            delete win.player;
            win.player = player;
            initPlayer();
        },
    });
})();