// ==UserScript== // @name B站视频观看总进度 // @namespace http://tampermonkey.net/ // @version 0.2 // @description 给B站多P视频下方添加一个总进度 // @author 汐涌及岸 // @match https://www.bilibili.com/video/* // @icon https://www.bilibili.com/favicon.ico // @grant none // @downloadURL none // ==/UserScript== //等待播放器加载完成 let waitPlayerLoad = setInterval(() => { if(!window.player) return; initTotalProgress(); clearInterval(waitPlayerLoad)}, 1000); //格式化 const HHmmss = second => [Math.floor(second/3600),Math.floor(second/60)%60,second%60].map(n=>n.toString().padStart(2,0)).join(':') //初始化 async function initTotalProgress() { let data = await fetch('https://api.bilibili.com/x/web-interface/view?bvid='+bvid).then(resp=>resp.json()).then(json=>json.data) if (data.pages.length<=1) return let total_duration = data.duration let multi_duration = data.pages.map(p=>p.duration) let p = parseInt(new URLSearchParams(location.search).get('p'))||1 let before_duration = p>1?multi_duration.slice(0,p-1).reduce((t,d)=>t+d):0 //嵌入元素 if(!window.video_watch_progress){ document.querySelector('.bilibili-player-video-time').insertAdjacentHTML('beforeBegin', ``); } //进度条刷新 player.addEventListener(bPlayer.events.progressUpdate,()=>{ let now_duration = parseInt(player.getCurrentTime()) + before_duration document.querySelector('#video_watch_progress').innerHTML = '总进度 ' + HHmmss(now_duration) + ' / ' + HHmmss(total_duration) + ' 百分比 ' + (now_duration / total_duration * 100).toFixed(2) + '%' }) //切换分P时重新初始化 new MutationObserver(initTotalProgress).observe(document.querySelector(".bilibili-player-video"), { attributes: true, childList: true, subtree: true }); }