b站分P视频剩余时间计算器

解决了自动连播没有自动计算的问题

目前為 2024-08-21 提交的版本,檢視 最新版本

// ==UserScript==
// @name         b站分P视频剩余时间计算器
// @namespace    http://tampermonkey.net/
// @version      2023-8-22
// @author       You
// @description  解决了自动连播没有自动计算的问题
// @match        https://www.bilibili.com/video/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';
    // Your code here...
    window.addEventListener("load", () => {
        const btn = document.createElement('button');
        btn.innerText = '计算时间';
        btn.style.cssText = 'position: fixed; right: 10px; top: 300px; width: 70px; padding: 5px;';
        btn.onclick = calculateTime;
        document.body.appendChild(btn);

        try {
            if (getP() == null) {
                btn.innerText = "不是分P";
                setTimeout(() => btn.remove(), 1500);
            } else {
                // 要监听的目标节点
                const targetNode = document.querySelector("#mirror-vdcon > div.right-container.is-in-large-ab");

                // 观察选项
                const myConfig = {
                    childList: true,        // 监听子节点变化
                    characterData: true,    // 监听节点内容的变化
                    subtree: true           // 观察目标节点以及其后代节点(即使当前没有子节点)
                };

                // 回调函数,当检测到变化时调用
                const callback = (mutationsList, observer) => calculateTime();

                // 创建一个观察者实例并传入回调函数
                const observer = new MutationObserver(callback);

                // 开始观察目标节点
                observer.observe(targetNode, myConfig);
            }

        } catch (err) {
            btn.innerText = err.message;
        }

        let preDate = 0;

        function calculateTime() {
            let newDate = new Date();
            if (newDate - preDate < 500) {
                console.log('拦截短时间内重复计算')
                return;
            }
            console.log('计算中')
            preDate = newDate;
            let p = getP();
            if (!p) {
                btn.innerText = '不是分P'
                console.log('不是分P');
                setTimeout(() => btn.hidden=true, 1500);
                return;
            }else{
                btn.hidden=false;
            }
            let elements = document.querySelectorAll("#multi_page > div.cur-list > ul > li > a > div > div.duration");
            let totalSeconds = 0;
            console.log("p为" + p + "总集数为" + elements.length);
            for (let i = p - 1; i < elements.length; i++) {
                let time = elements[i].textContent.trim().split(':').reverse();
                let seconds = time.reduce((prev, curr, idx) => {
                    return prev + Number(curr) * Math.pow(60, idx);
                }, 0);
                totalSeconds += seconds;
            }
            let hours = Math.floor(totalSeconds / 3600);
            let minutes = Math.floor((totalSeconds % 3600) / 60);
            let seconds = totalSeconds % 60;
            let formattedTime = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
            if (hours < 2 && totalSeconds !== 0) {
                btn.innerText = formattedTime + "\n还有不到2小时,稳啦";
            } else {
                btn.innerText = formattedTime;
            }
        }

        function getP() {
            // 刚点开分P视频播放第一集时,地址栏是没有p参数的,所以用以下方法
            if (document.getElementsByClassName("cur-page") != null && document.querySelector("#multi_page > div.head-con > div.head-left > h3") != null) {
                let str = document.getElementsByClassName("cur-page")[0].innerText;
                let match = str.match(/\((\d+)\/\d+\)/); // 使用正则表达式匹配分子
                if (match) {
                    return parseInt(match[1]); // 返回匹配到的分子
                }
            }
            return null;
        }
    });
}());

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址