B站视频时长计算器

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

目前為 2025-01-25 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         B站视频时长计算器
// @namespace    http://tampermonkey.net/
// @version      0.2
// @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 = `
            display: inline-block;
            margin-left: 10px;
            padding: 5px 10px;
            background: rgba(0, 0, 0, 0.7);
            color: white;
            border-radius: 3px;
            font-size: 14px;
            display: none;
        `;
        
        // 找到标题元素并在其后插入结果框
        const titleContainer = document.querySelector('.video-info-title-inner');
        if (titleContainer) {
            titleContainer.appendChild(box);
        } else {
            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 = `
            display: inline-flex;
            gap: 10px;
            align-items: center;
            margin-left: 20px;
            vertical-align: middle;
        `;

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

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

        container.appendChild(input);
        container.appendChild(button);

        // 找到标题元素并在其后插入控件
        const titleContainer = document.querySelector('.video-info-title-inner');
        if (titleContainer) {
            titleContainer.appendChild(container);
        } else {
            document.body.appendChild(container); // 如果找不到标题元素,则添加到body
        }

        return { button, input };
    }

    // 主要计算逻辑
    function calculateTotalDuration(startPage) {
        // 更新选择器以匹配B站视频列表结构
        const videoItems = document.querySelectorAll('.duration');
        let totalSeconds = 0;

        videoItems.forEach((item, index) => {
            // B站视频时长直接显示在元素中
            const duration = item.textContent.trim();
            
            // 页码就是当前索引+1
            const pageNum = index + 1;
            
            // 只计算指定页码之后的时长
            if (pageNum > startPage) {
                totalSeconds += parseDuration(duration);
            }
        });

        return formatDuration(totalSeconds);
    }

    // 初始化插件
    function init() {
        // 等待页面加载完成
        setTimeout(() => {
            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';

                setTimeout(() => {
                    resultBox.style.display = 'none';
                }, 5000);
            });

            button.addEventListener('mouseover', () => {
                if (resultBox.textContent) {
                    resultBox.style.display = 'block';
                }
            });

            button.addEventListener('mouseout', () => {
                resultBox.style.display = 'none';
            });
        }, 2000); // 等待2秒确保页面加载完成
    }

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

    // 测试代码
    function testDurationCalculator() {
        // 等待视频列表加载完成
        setTimeout(() => {
            // 更新选择器以匹配B站实际DOM结构
            const videoItems = document.querySelectorAll('.duration');
            console.log('找到的视频元素数量:', videoItems.length);
            
            if (videoItems.length === 0) {
                console.log('DOM结构:', document.querySelector('.list-box'));
                return;
            }
            
            // 显示所有找到的时长
            videoItems.forEach((item, index) => {
                console.log(`第${index + 1}集时长:`, item.textContent.trim());
            });
            
            // 计算总时长
            function parseDuration(duration) {
                const [minutes, seconds] = duration.split(':').map(Number);
                return minutes * 60 + seconds;
            }
            
            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')}`;
            }
            
            let totalSeconds = 0;
            const startPage = 53; // 测试用的起始页码
            
            videoItems.forEach((item, index) => {
                const duration = item.textContent.trim();
                const pageNum = index + 1;
                
                if (pageNum > startPage) {
                    totalSeconds += parseDuration(duration);
                    console.log(`计入第${pageNum}集, 时长:${duration}`);
                }
            });
            
            console.log('总时长:', formatDuration(totalSeconds));
        }, 2000); // 等待2秒确保页面加载完成
    }

    // 执行测试
    testDurationCalculator();
})();