计算B站视频列表中特定页码后的总时长
目前為
// ==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();
})();