Greasy Fork

Greasy Fork is available in English.

仰晨-B站功能优化

1、《不用长按就可以3倍速啦 支持 2.5 3 3.5 4 倍速(2022.11.15》 2、《给出每集剩下的时间-----《只有教程集合才有效》 鬼畜集合的标签是不同的所以无效的,有时候集合也会加载太快导致失败,第二次有了缓存基本就行了,暂时就不改了,我要学习java 55555 js我就是个小白,算是想要优化一下看教程 又觉得自己应该可以 就百度 来完成了(2023.1.18》3、《添加按钮控制《看进度》是否打开2023.1.20》4、《增加显示总时长2023.1.20 02:15》5、《改变总时长位置,增加按钮滚到当前视频集到屏幕 样式分离开来 2023.1.25》

目前为 2023-01-25 提交的版本。查看 最新版本

// ==UserScript==
// @name         仰晨-B站功能优化
// @description  1、《不用长按就可以3倍速啦   支持 2.5    3   3.5    4 倍速(2022.11.15》    2、《给出每集剩下的时间-----《只有教程集合才有效》 鬼畜集合的标签是不同的所以无效的,有时候集合也会加载太快导致失败,第二次有了缓存基本就行了,暂时就不改了,我要学习java 55555 js我就是个小白,算是想要优化一下看教程  又觉得自己应该可以 就百度 来完成了(2023.1.18》3、《添加按钮控制《看进度》是否打开2023.1.20》4、《增加显示总时长2023.1.20 02:15》5、《改变总时长位置,增加按钮滚到当前视频集到屏幕 样式分离开来 2023.1.25》
// @license      AGPL License
// @namespace    https://mp.weixin.qq.com/s/zsVmSmd63OIxuoDbKGA-xg
// @version      2023.1.25
// @author       仰晨
// @match        *://www.bilibili.com/video/*
// @icon         https://bilibili.com/favicon.ico
// @grant        none
// ==/UserScript==


//看进度
    //------------给出每集剩下的时间-----《只有教程集合才有效》 鬼畜集合的标签是不同的所以无效的-------------------------=======================================================
    function lookJinDu(){var element=document.getElementById("multi_page").getElementsByClassName("duration");	//每一集是时间标签

						 var allElement = document.getElementsByClassName("list-box")[0].children;		//视频集合下的全部标签

						 console.log("视频列表共有"+element.length);
								if(element.length==allElement.length){				//如果还没有进度就加进度
									//定义一个数组放每个视频的秒数
									var arr = [];
									var s_all = 0;
									//收集总时长-----//单纯是秒更好处理---------------------------------
									for(let i=0;i<element.length;i++){
										let timeStr = element[i].innerHTML;
										let s =0;//记录本次秒
										//console.log(timeStr);
										let times=timeStr.split(":");
										//console.log(times);
										if(times.length==2){
											s=parseInt(times[0]*60);
											s+=parseInt(times[1]);
										}else if(times.length==3){
											s=parseInt(times[0]*60*60);
											s+=parseInt(times[1]*60);
											s+=parseInt(times[2]);
										}else{
											s=parseInt(times[0]);
										}
										s_all+=s;
										arr.push(s);
									}
									console.log("全部变成秒为"+s_all);


                                    //显示总时长在最前面2023.1.20  02:04 begin
                                    while (true){//放在循环里面防止变量冲突
                                        let para = document.createElement("div");//创建一个li标签
                                        para.innerText="总时长:"+parseInt(s_all/60/60)+"小时"+parseInt((s_all/60)%60)+"分"+parseInt(s_all%60)+"秒  加油ヾ(◍°∇°◍)ノ゙";
                                        para.style = "position: absolute;top: -1px;left: 22%;" ;//设置标签颜色和位置
                                        para.setAttribute('class','jindu'); //设置标签属性

                                        let list=document.getElementsByClassName("list-box")[0];//获取父标签---列表
                                        let listIndex=list.getElementsByTagName("li")[0];// 获取父标签的第1个子元素
                                        list.insertBefore(para,listIndex); // 在父标签的第一个子元素,前插入div标签
                                        break;//结束循环
                                    }


									var s_front=0;		//遍历到的时间总和
									//对每个 进行处理------------------------------------------------------------------------------------
									for(let i=0;i<arr.length;i++){
										s_front+=arr[i];
										//console.log("进度:"+(s_front/s_all*100).toFixed(2)+"%")

										//转换为时分秒---------输出才用  内部用秒就好
										let H=0;
										let m=0;
										let s=0;

										//剩下时间
										s=s_all-s_front;

										m=parseInt(s/60);
										s=s%60;

										H=parseInt(m/60);
										m=m%60;
										//console.log("剩下时间:"+H+"小时"+m+"分"+s+"秒")

										//展示阶段-------------------------------------------------------------------
										//创建一个li标签
										let para = document.createElement("div");
										//设置标签内容
										para.innerText="看完"+(i+1)+"集后  剩下时间:"+H+"小时"+m+"分"+s+"秒  进度:"+(s_front/s_all*100).toFixed(2)+"%";
										//设置字体颜色
										//para.style.color = '#d3d3d3';
										para.setAttribute('class','jindu'); //设置标签属性

										//获取父标签---列表
										let list=document.getElementsByClassName("list-box")[0];
										//添加标签
										let listIndex=list.getElementsByTagName("li")[i+1];// 获取父标签的第x个子元素
										list.insertBefore(para,listIndex); // 在父标签的第一个子元素,前插入div标签
									}
                                    document.getElementById("setText").innerText="已打开已看进度";
								}else{//删除存在的进度标签
									var jindu = document.getElementsByClassName("jindu");
									for (let i = jindu.length-1; i>=0;i--){
										jindu[i].remove();
									}
									document.getElementById("setText").innerText="已关闭已看进度";
								}
	}//看进度方法结束------------------------------------------------------------------------------------------------





window.onload=function() {


    function 插入倍速 (速度){
        //创建一个p元素
        var para = document.createElement("li");
        para.setAttribute('class','bpx-player-ctrl-playbackrate-menu-item bpx-state-active'); //设置标签属性
        para.setAttribute('data-value',速度); //设置标签属性
        para.innerText=速度+"x";
        //获取父标签
        var div=document.getElementsByClassName("bpx-player-ctrl-playbackrate-menu")[0];
        //添加标签
       var one=div.firstChild;// 获取父标签的第一个子元素
        div.insertBefore(para,one); // 在父标签的第一个子元素,前插入div标签
         }


    



    插入倍速(2.5);
    插入倍速(3);
    插入倍速(3.5);
    插入倍速(4);


//————————————————看进度按钮开关——————————————————————————————
    //创建一个按钮
    let bt = document.createElement("button");
    //设置id 方便改内容
    bt.setAttribute('id','setText'); //设置标签属性
    //设置标签内容
    bt.innerText="已打开已看进度";
    //设置样式和位置放下面了2023.1.25
    //bt.style = "position: fixed; right: 0px;bottom: 20px;color:red;";
    //插入父标签下
    document.getElementById("app").appendChild(bt);

    bt.onclick= function(){lookJinDu();};//开关按钮

    lookJinDu();//默认打开
//——————————————————————————————————————————————————————
//——————————————集合中《当前在看的》 滚到屏幕可见位置——————————————————————
do{
    //创建一个按钮
    let see = document.createElement("div");
    //设置id 方便改内容
    see.setAttribute('id','see'); //设置标签属性
    //设置标签内容
    see.innerText="当前播放集";
    //设置样式(分离了)

    //插入父标签下
    document.getElementsByClassName("list-box")[0].appendChild(see);

    see.onclick= function(){document.getElementsByClassName("on")[3].scrollIntoView({ block: "nearest",behavior: "smooth" });};//平滑滚到到屏幕可见

}while(false);
}//加载完成执行收括号
//——————————————添加样式(分离操作)——————————————————————————————2023.1.25 begin
do{
    var style=".jindu{color:#d3d3d3;}\
    #setText{position: fixed; right: 0px;bottom: 20px;color:red;}\
    #see{position: absolute;\
        top: 250px;\
        left: 100%;\
        background-color: #a3def461;\
        color: #f47676;\
        font-weight: 555;\
        border-radius: 5px;\
        width: 20px;\
        text-align: center;\
        cursor: pointer;\
        border: 1px #fdbaba solid;}\
    #see:hover{background-color: #0000008a;color: #ffffff;}\
    ";

//cursor:pointer;变小手   :hover碰到触发


    var ele=document.createElement("style");
    ele.innerHTML=style;
    document.getElementsByTagName('head')[0].appendChild(ele)
}while(false);
//——————————————————————————————————————————————————————————