您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
B站视频集合剩余观看时间显示.
// ==UserScript== // @name B站视频集合剩余观看时间显示 // @description B站视频集合剩余观看时间显示. // @include https://www.bilibili.com/video/* // @version 0.0.3 // @author zszdmzmm // @namespace https://greasyfork.org/users/1147321 // ==/UserScript== const pageType1 = ["div.video-section-list", "div.video-episode-card__info-duration", ".play-num"]; const pageType2 = ["ul.list-box", "ul.list-box div.duration", "div.head-left"]; let pageType = [pageType1, pageType2]; let selectorStringSet; let isVideoListPage = false; let isFlag = true; for (let i = 0; i < pageType.length; i++) { if (document.querySelector(pageType[i][0])) { selectorStringSet = pageType[i]; isVideoListPage = true; } } window.addEventListener("load", function (e) { run(); }) window.addEventListener("keyup", function (e) { if (e.key === "Control") { isFlag = !isFlag; if (document.querySelector("div.remainTime")) { document.querySelector("div.remainTime").remove(); }if(isFlag){ run(); } } }) function run(){ if (isVideoListPage) { //每秒执行一次 let id = setInterval(function () { if (isFlag) { let timeElement = document.querySelectorAll(selectorStringSet[1]); //let timeElement = pageElementsAdapter("div.video-episode-card__info-duration", "ul.list-box div.duration"); //集合视频总时长 let videoTimeSum = 0; //开始计算剩余时间标志 let isStart = false; //循环每一个时间元素 timeElement.forEach(function (element) { let imgStyle = element.parentElement.querySelector("img"); //判断正在播放的视频,改变开始计算的标志的状态 if (!(imgStyle.hasAttribute("style")) || imgStyle.getAttribute("style") === "") { isStart = true; } //计算每个视频的时长,相加 if (isStart) { let singleTime = getSeconds(element.innerText); videoTimeSum += singleTime; } }) //装目前视频所在时间位置 let currentVideoSeconds = 0; //获取相关元素并从总时长中减去已观看时间 let currentVideoSecondsElement = document.querySelector("span.bpx-player-ctrl-time-current"); if (currentVideoSecondsElement) { currentVideoSeconds = getSeconds(currentVideoSecondsElement.innerText); videoTimeSum -= currentVideoSeconds; } //对总时长的表现格式进行处理 let hour, minute, second; hour = Math.floor(videoTimeSum / 3600); minute = Math.floor(videoTimeSum / 60) % 60; second = videoTimeSum % 60; minute = timePattenParse(minute); second = timePattenParse(second); let finalTimeString = hour + ":" + minute + ":" + second; //在网页中显示剩余时长 let element = document.createElement("div"); element.innerText = "剩余时长:" + finalTimeString; element.className = "remainTime"; element.style = "margin-right: 8px"; if (!document.querySelector("div.remainTime")) { document.querySelector(selectorStringSet[2]).after(element); } else { document.querySelector("div.remainTime").innerText = element.innerText; } }else{ clearInterval(id); } //爬取集合中包含视频时间的元素 }, 1000); } } //将时间正常表达形式转化为秒数并返回 function getSeconds(timeString) { let timeArr = timeString.split(":"); let timeSecond = 0; for (let i = 0; i < timeArr.length; i++) { timeSecond = timeSecond * 60 + parseInt(timeArr[i]); } return timeSecond; } //将不规范的秒,分钟表达式整理规范 function timePattenParse(timeNum) { if (timeNum < 10) { return "0" + timeNum; } return timeNum; }