B站视频时长计算器

计算B站视频列表中特定页码后的总时长

目前为 2025-01-25 提交的版本。查看 最新版本

// ==UserScript==
// @name         B站视频时长计算器
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  计算B站视频列表中特定页码后的总时长
// @author       Your name
// @match        https://www.bilibili.com/video/*
// @license      MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 创建一个浮动的结果显示框
    function createResultBox() {
        const box = document.createElement('div');
        box.style.cssText = `
            position: fixed;
            top: 20px;
            right: 20px;
            padding: 10px;
            background: rgba(0, 0, 0, 0.8);
            color: white;
            border-radius: 5px;
            z-index: 9999;
            font-size: 14px;
            display: none;
        `;
        document.body.appendChild(box);
        return box;
    }

    // 将时长从MM:SS转换为秒
    function parseDuration(duration) {
        const [minutes, seconds] = duration.split(':').map(Number);
        return minutes * 60 + seconds;
    }

    // 将总秒数转换为HH:MM:SS格式
    function formatDuration(totalSeconds) {
        const hours = Math.floor(totalSeconds / 3600);
        const minutes = Math.floor((totalSeconds % 3600) / 60);
        const seconds = totalSeconds % 60;
        return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
    }

    // 创建计算按钮和输入框
    function createControls() {
        const container = document.createElement('div');
        container.style.cssText = `
            position: fixed;
            top: 10px;
            right: 10px;
            display: flex;
            gap: 10px;
            align-items: center;
            z-index: 9999;
        `;

        // 创建页码输入框
        const input = document.createElement('input');
        input.type = 'number';
        input.placeholder = '起始页码';
        input.style.cssText = `
            width: 80px;
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 3px;
        `;

        // 创建计算按钮
        const button = document.createElement('button');
        button.textContent = '计算时长';
        button.style.cssText = `
            padding: 5px 10px;
            background: #00A1D6;
            color: white;
            border: none;
            border-radius: 3px;
            cursor: pointer;
        `;

        container.appendChild(input);
        container.appendChild(button);
        document.body.appendChild(container);
        return { button, input };
    }

    // 主要计算逻辑
    function calculateTotalDuration(startPage) {
        // 针对B站视频列表的选择器
        const videoItems = document.querySelectorAll('.list-box li');
        let totalSeconds = 0;

        videoItems.forEach(item => {
            // 获取页码(根据实际DOM结构调整选择器)
            const pageNumElement = item.querySelector('.page-num');
            // 获取时长(根据实际DOM结构调整选择器)
            const durationElement = item.querySelector('.duration');

            if (pageNumElement && durationElement) {
                const pageNum = parseInt(pageNumElement.textContent.replace(/[^0-9]/g, ''));
                
                // 只计算指定页码之后的时长
                if (pageNum > startPage) {
                    totalSeconds += parseDuration(durationElement.textContent.trim());
                }
            }
        });

        return formatDuration(totalSeconds);
    }

    // 初始化插件
    function init() {
        const resultBox = createResultBox();
        const { button, input } = createControls();

        button.addEventListener('click', () => {
            const startPage = parseInt(input.value) || 0;
            const totalDuration = calculateTotalDuration(startPage);
            resultBox.textContent = `${startPage}集之后的总时长: ${totalDuration}`;
            resultBox.style.display = 'block';

            // 5秒后自动隐藏结果
            setTimeout(() => {
                resultBox.style.display = 'none';
            }, 5000);
        });

        // 鼠标悬停时显示结果
        button.addEventListener('mouseover', () => {
            if (resultBox.textContent) {
                resultBox.style.display = 'block';
            }
        });

        // 鼠标离开时隐藏结果
        button.addEventListener('mouseout', () => {
            resultBox.style.display = 'none';
        });
    }

    // 等待页面加载完成后初始化
    window.addEventListener('load', init);
})(); 

QingJ © 2025

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