Greasy Fork

Greasy Fork is available in English.

查看b站合集已观看时长

查看b站合集已观看时长,单击便会更新

当前为 2025-06-21 提交的版本,查看 最新版本

// ==UserScript==
// @name         查看b站合集已观看时长
// @version      1.0
// @license      MIT
// @description  查看b站合集已观看时长,单击便会更新
// @author       白夜
// @match        *://*.bilibili.com/*
// @icon         https://www.bilibili.com/favicon.ico
// @namespace http://greasyfork.icu/users/1486583
// ==/UserScript==
(function() {
    'use strict';
    function parseTime(text) {
        // 解析时间格式为 "mm:ss" 的字符串为总秒数
        const [min, sec] = text.split(':').map(Number);
        return min * 60 + (sec || 0);
    }
    const titleEl = document.querySelector('.video-info-title-inner h1');
    const titleElinner = document.querySelector('.video-info-title-inner h1').innerText;
    window.addEventListener("click", function () {
        console.log("获取时长中...")
        const list = document.querySelector('.video-pod__list');
        if (!list) return console.warn('未找到 .video-pod__list');

        const active = list.querySelector('.active');
        if (!active) return console.warn('未找到 .active');

        const classMenu = active.parentNode;
        if (!classMenu) return console.warn('未找到父级 div');

        const statItems = classMenu.querySelectorAll('.stats .stat-item');

        let totalSeconds = 0;
        let toActiveSeconds = 0;
        let reachedActive = false;

        for (const stat of statItems) {
            const timeText = stat.textContent.trim();
            const seconds = parseTime(timeText);
            totalSeconds += seconds;

            const parent = stat.parentNode?.parentNode;
            const isHaveActive = parent?.classList.contains('active');
            const isVideoAvtive_OneCollection = parent?.classList.contains('sub');
            const isVideoAvtive_MoreCollection = parent?.classList.contains('video-pod__item');

            if (isHaveActive && isVideoAvtive_OneCollection) {
                reachedActive = true;
            }else if(isHaveActive && isVideoAvtive_MoreCollection){
                reachedActive = true;
            }

            if (!reachedActive) {
                toActiveSeconds += seconds;
            }
        }

        const format = sec => {
            const h = Math.floor(sec / 3600);
            const m = Math.floor((sec % 3600) / 60);
            const s = sec % 60;
            return [h, m, s].map(unit => String(unit).padStart(2, '0')).join(':');
        };

        const timerShow = `${format(toActiveSeconds)} / ${format(totalSeconds)}`;
        const titleEl = document.querySelector('.video-info-title-inner h1');
        if (titleEl) {
            titleEl.innerText =titleElinner+ timerShow;
        } else {
            console.warn('未找到 h1 标签');
        }
        console.log("获取时长完毕.")

    });
})();