// ==UserScript== // @name b站辅助(时长/集数/倍速/单集循环) // @namespace http://tampermonkey.net/ // @version 1.0.0 // @description 辅助使用bilibili(时长/集数/倍速/单集循环) // @author eleky // @match https://www.bilibili.com/* // @require https://cdn.bootcss.com/jquery/3.5.0/jquery.min.js // @icon https://www.bilibili.com/favicon.ico // @grant none // @license MIT // @downloadURL none // ==/UserScript== /* ### 功能 1. 统计视频已看时长、正在观看的这一集的时长、未看时长、总时长,显示到右侧。按“J”键。 2. 统计视频已看集数、正在看的集数、未看集数、总集数,显示到右侧。按“J”键。 3. 视频倍速播放及快捷键,按“,”或“<”速度减0.25,按“。”或“<”速度加0.25。b站自带的倍速调整会失效。 4. 打开视频后默认单集循环。按“J”键。 */ /* var jq = document.createElement('script'); jq.src = "https://cdn.bootcss.com/jquery/3.5.0/jquery.min.js"; document.getElementsByTagName('head')[0].appendChild(jq); */ let stop; let speed = 1; //let speed = 1; //注册按钮监听, window.onkeydown = function(ev){ document.getElementsByTagName("video")[0].playbackRate = speed;//倍速关键代码,初始化倍速 //ev表示onkeydown事件对象,逗号/小于号是188,句号/大于号是190,回车是13,J是74 if(ev.keyCode===190){ speed += 0.25; //console.log("speed:" + speed); show_speed(speed); document.getElementsByTagName("video")[0].playbackRate = speed;//倍速关键代码 }else if(ev.keyCode===188){ speed -= 0.25; //console.log("speed:" + speed); show_speed(speed); document.getElementsByTagName("video")[0].playbackRate = speed;//倍速关键代码 }else if(ev.keyCode===74){ //主函数,统计集数和时长 main(); //选中洗脑循环 select_repeat(); } } function select_repeat() { //$(".bilibili-player-iconfont .bilibili-player-iconfont-setting").trigger('mouseover'); $(".bilibili-player-video-btn-setting").trigger('mouseover');//使循环播放按钮出现 $(".bilibili-player-video-btn-setting").trigger('mouseout');//使循环播放按钮消失 //let setting = document.querySelector(".bilibili-player-iconfont .bilibili-player-iconfont-setting"); //setting.click(); $(".bilibili-player-video-btn-setting-left-repeat .bui-switch-input").trigger('click');//真实选中洗脑循环 $(".bilibili-player-video-btn-setting-left-repeat .bui-switch-input").attr('checked',true);//只是看起来选中了 } /* window.onkeydown = function(ev){ console.log(ev.keyCode); } */ //显示倍速 function show_speed(speed) { //找到显示位置 let position = document.getElementsByClassName("bilibili-player-video-top")[0]; //获取标签 let tag = document.getElementById("mytag"); let isNull = tag===null; //没有创建过这个标签就创建 if (isNull){ //创建显示标签 tag = document.createElement("div"); tag.setAttribute("id", "mytag"); tag.style = '\n' + ' width: 50px;\n' + ' height: 28px;\n' + ' background-color: #666666;\n' + ' position: absolute;\n' + ' top: 50%;\n' + ' left: 50%;\n' + ' transform: translate(-50%, -50%);\n' + ' border-radius: 2px;\n' + ' z-index: 99999999;\n' + ' text-align: center;\n' + ' line-height: 28px;\n' + ' font-size: 14px;\n' + ' color: #fff;\n' + ' '; } $("#mytag").css("display", "block"); //写入html tag.innerHTML = "X " + speed ; //数据添加到面板 if (isNull){ position.after(tag); } //定时消失 sleep(1000).then(() => { $("#mytag").css("display", "none"); }) } function main() { let nodeList; try{ //获取视频列表节点 nodeList = getVideoList(); //console.log("已获取视频列表节点"); }catch (e){ //console.log("没有视频列表,不是视频选集"); show2();//单集视频显示时长 clearInterval(stop); return; } //sleep(10000).then(() => { //获取当前观看索引 let index = getCurrentLookVideoIndex(nodeList); //console.log("当前观看索引:"+index); //全部视频个数 let all_num = nodeList.length; //console.log("全部视频个数:"+all_num); //已看视频个数 let looked = index; //console.log("已看视频个数:"+looked); //未看视频个数 let number = all_num-index-1; //console.log("未看视频个数:"+number); //获取视频全部时间的数组 let allTime = getTimeArray(nodeList,0,nodeList.length); //console.log("视频全部时间的数组:"+allTime); //所有时间数组,格式 [h,m] let all_time_arr = format(allTime); //console.log("所有时间数组,格式 [h,m,s]:"+all_time_arr); //获取已观看的视频时间数组 let looked_time = getTimeArray(nodeList,0,index); //console.log("已观看的视频时间数组:"+ looked_time); //已看时间数组,格式 [h,m] let looked_time_arr = format(looked_time); //console.log("已看时间数组,格式 [h,m,s]:"+ looked_time_arr); //获取正在观看的视频时间数组 let looking_time = getTimeArray(nodeList,index,index+1); //console.log("正在观看的视频时间数组:"+ looking_time); //正在观看时间数组,格式 [h,m] let looking_time_arr = format(looking_time); //console.log("正在观看时间数组,格式 [h,m,s]:"+ looking_time_arr); //获取未观看的视频时间数组 let timeArray = getTimeArray(nodeList,index+1,nodeList.length); //console.log("未观看的视频时间数组:"+timeArray); //未看时间数组,格式 [h,m] let undone_time_arr = format(timeArray); //console.log("未看时间数组,格式 [h,m,s]:"+undone_time_arr); //显示到网页 show(looked_time_arr, looking_time_arr, undone_time_arr, all_time_arr, looked, number, all_num); //console.log("显示到网页:"); //}) } //单集视频显示时长 function show2() { //获取总时长 let time_box = document.getElementsByClassName('bilibili-player-video-time-total')[0]; let time_num = time_box.innerHTML; //console.log("显示到网页:" + time_num); //找到显示位置 let plain = document.getElementById("danmukuBox"); let data_tag = document.getElementById("data_tag"); let isNull = data_tag===null; //没有创建过这个标签就创建 if (isNull){ //创建 data_tag = document.createElement("div"); //console.log(data_tag) //id赋值,用于下次更新查找 data_tag.setAttribute("id", "data_tag"); data_tag.setAttribute("width", "100%"); } //写入html data_tag.innerHTML = "