Greasy Fork is available in English.

百度网盘自定义倍速播放

第一次写的脚本,主要是考研看视频舒服一点,设置了一个可以自定义倍速的脚本,后面会逐渐完善和增加功能,欢迎反馈

// ==UserScript==
// @name         百度网盘自定义倍速播放
// @namespace    http://tampermonkey.net/
// @version      4.1
// @description  第一次写的脚本,主要是考研看视频舒服一点,设置了一个可以自定义倍速的脚本,后面会逐渐完善和增加功能,欢迎反馈
// @author       枫影
// @match        *://pan.baidu.com/play/video
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    //生成倍速下拉菜单
    function createSelect(id){
    	var s=document.createElement("SELECT");
    	s.setAttribute("id",id);
		s.setAttribute("lay-verify","required");
    	var p0=document.createElement("OPTION");
    	var p1=document.createElement("OPTION");
    	var p2=document.createElement("OPTION");
    	var p3=document.createElement("OPTION");
    	var p4=document.createElement("OPTION");
    	var p5=document.createElement("OPTION");

		p0.setAttribute("id","p0");
		p1.setAttribute("id","p1");
		p2.setAttribute("id","p2");
		p3.setAttribute("id","p3");
		p4.setAttribute("id","p4");
		p5.setAttribute("id","p5");

		p0.setAttribute("value","1");
		p1.setAttribute("value","0.5");
		p2.setAttribute("value","1.0");
		p3.setAttribute("value","1.5");
		p4.setAttribute("value","2");
		p5.setAttribute("value","5");

    	p0.innerHTML="快捷倍速";
    	p1.innerHTML="0.5";
    	p2.innerHTML="1.0";
    	p3.innerHTML="1.5";
    	p4.innerHTML="2";
    	p5.innerHTML="5";

    	s.add(p0);
    	s.add(p1);
		s.add(p2);
		s.add(p3);
		s.add(p4);
		s.add(p5);
		return s;
    }

    function createInput(inid,onid,selectid){
		window.onload=function(){


			let fast=readCookie("fast");
			if(fast==null||fast==""||fast==NaN){
				fast=1.00;
				writeCookie("fast",fast,30);
			}
			else{
				fast=parseFloat(fast).toFixed(2);
			}

			layui.use('layer', function(){
			  var layer = layui.layer;
			  layer.msg('倍速脚本加载完成!欢迎使用,历史倍速:'+fast);
			});
		 }
		//生成元素
		let cr=document.createElement("BUTTON");
		cr.setAttribute("class","layui-btn layui-btn-normal layui-btn-lg");
		cr.setAttribute("id","create");

		let sm=document.createElement("i");
		sm.setAttribute("class","layui-icon layui-icon-face-smile-b");
		sm.setAttribute("style","font-size: 30px; color: #ffffff;");
		cr.setAttribute("title","隐藏倍速工具箱");
		cr.appendChild(sm);

		let f=document.createElement("fieldset");
		f.setAttribute("class","layui-elem-field");
		f.setAttribute("id","box");
		let le=document.createElement("legend");
		le.innerHTML="视频倍速工具箱";
		f.appendChild(le);

    	var d=document.createElement("FORM");
    	d.style.width="420px";
    	d.style.height="65px";
		d.setAttribute("id","inform");
		d.setAttribute("class","layui-form");

    	var init=document.createElement("INPUT");
    	init.setAttribute("type","text");
    	init.setAttribute("placeholder","请输入你想倍速的倍数");
    	init.setAttribute("id",inid);
		init.setAttribute("class","layui-input");

    	var on=document.createElement("BUTTON");
    	var res=document.createElement("BUTTON");
    	on.innerHTML="确认";
		on.setAttribute("id",onid);
		on.setAttribute("class","layui-btn layui-btn-sm");
    	res.setAttribute("type","reset");
		res.innerHTML="清空";
		res.setAttribute("class","layui-btn layui-btn-normal layui-btn-sm");
		var se=createSelect(selectid);

		var pa=document.createElement("button");
		let fast=readCookie("fast");
		if(fast!=null&&fast!=""&&fast!=NaN){
			fast=parseFloat(fast).toFixed(2);
		}
		else{
			fast=1.0;
		}
		if(readCookie("past")){
			delCookie("past");
		}
		writeCookie("past",fast,30);
		pa.innerHTML="恢复记忆"+fast;
		pa.setAttribute("id","past");
		pa.setAttribute("class","layui-btn layui-btn-normal");

		//引入layui框架
		let js=document.createElement("script");
		js.setAttribute("type","text/javascript");
		js.setAttribute("src","https://www.layuicdn.com/layui-v2.5.6/layui.js");
		let css=document.createElement("link");
		css.setAttribute("type","text/css");
		css.setAttribute("href","https://www.layuicdn.com/layui-v2.5.6/css/layui.css");
		css.setAttribute("rel","stylesheet");
		let head=document.getElementsByTagName("head")[0];
		head.appendChild(js);
		head.appendChild(css);


		//设置位置
		f.style.position="absolute";
		f.style.left="10%";
		f.style.top="-8px";
		f.style.zIndex='999';
    	init.style.position="absolute";
		init.style.width="160px";
    	on.style.position="absolute";
    	res.style.position="absolute";
    	init.style.zIndex='999';
    	on.style.zIndex='999';
    	res.style.zIndex='999';
		init.style.top="30%";
		init.style.left="0px";
    	on.style.left="25%";
        on.style.top="34%";
    	res.style.left="33%";
        res.style.top="34%";
		se.style.position="absolute";
		se.style.top="40%";
		se.style.left="45%";
		se.style.zIndex='999';
		cr.style.position="absolute";
		cr.style.left="0px";
		cr.style.top="20%";
		cr.style.zIndex='999';
		pa.style.position="absolute";
		pa.style.left="62%";
		pa.style.top="30%";

		//设置样式
		f.style.width="700px";
		f.style.height="90px";
		//document.getElementById("video-toolbar").style.width="";
		document.getElementById("video-toolbar").style.height="100px";
		//document.getElementById("video-toolbar").style.zIndex="-999";


		//生成到界面上

		//document.body.appendChild(cr);
		addChild("video-toolbar",true,cr);
		d.appendChild(init);
		d.appendChild(on);
		d.appendChild(res);
		f.appendChild(d);
		f.appendChild(se);
		f.appendChild(pa);
		controlBox(f,false);
		addChild("video-toolbar",true,f);
    	//document.body.appendChild(f);
    }

	//恢复记忆倍速
	function Past(){
		document.getElementById("past").onclick=function(){
			animations("past",3);
			let past=readCookie("past");
			if(past!=null&&past!=""&&past!=NaN){
				past=parseFloat(past).toFixed(2);
			}
			else{
				past=1.0;
			}
			setFast(null,past);
		}
	}

	//删除指定id或者class的节点,true为id,false位class
	function delNode(id,flag){
		if(flag==true){
			let node=document.getElementById(id);
			node.remove();
		}
		else if(flag==false){
			let nodes=document.getElementsByClassName(id);
			let len=nodes.length;
			for(let i=0;i<len;i++){
				nodes[i].remove();
			}
		}
	}

	//给指定id的元素赋予点击动画
	function animations(id,flag){
			let node=document.getElementById(id);
			if(node!=null){
				let cla=node.getAttribute("class");
					//为1执行上滑动画
					if(flag==1){
						node.setAttribute("class",cla+" layui-anim layui-anim-up");
					}
					//为2微上滑
					else if(flag==2){
						node.setAttribute("class",cla+" layui-anim layui-anim-upbit");
					}
					//为3平滑放大
					else if(flag==3){
						node.setAttribute("class",cla+" layui-anim layui-anim-scale");
					}
					//其他弹簧式放大
					else{
						node.setAttribute("class",cla+" layui-anim layui-anim-scaleSpring");
					}
					setTimeout(function(){node.className=cla;},300);
			}
			else{
				console.log("没有指定id="+id+"的节点");
			}
	}

	//显示当前倍速
	function outNow(fast){
		layui.use('layer', function(){
		  var layer = layui.layer;
		  layer.msg("当前倍速:"+fast);
		});
	}

	//控制工具箱的显示
	var flag=0;
	function createBox(){
		let on=document.getElementById("create");
		let f=document.getElementById("box");
		on.onclick=function(){
			//添加动画
			animations("create",3);
			//0表示此时是隐藏状态
			if(flag==0){
				layui.use('layer', function(){
				  var layer = layui.layer;
				  layer.msg("显示倍速工具箱");
				});

				let sm1=document.createElement("i");
				sm1.setAttribute("class","layui-icon layui-icon-face-cry");
				sm1.setAttribute("style","font-size: 30px; color: #ffffff;");
				on.setAttribute("title","隐藏倍速工具箱");
				on.removeChild(on.firstChild);
				on.appendChild(sm1);
				controlBox(f,true);
				flag=1;
			}
			else{
				layui.use('layer', function(){
				  var layer = layui.layer;
				  layer.msg("隐藏倍速工具箱");
				});

				let sm2=document.createElement("i");
				sm2.setAttribute("class","layui-icon layui-icon-face-smile-b");
				sm2.setAttribute("style","font-size: 30px; color: #ffffff;");
				on.setAttribute("title","显示倍速工具箱");
				on.removeChild(on.firstChild);
				on.appendChild(sm2);
				controlBox(f,false);
				flag=0;
			}
		}
	}

	//动画显示隐藏指定id的fileld
	function controlBox(fieldset,flag){
		//true为渐显
		if(flag==true){
			fieldset.setAttribute("class","layui-elem-field layui-anim layui-anim-fadein");
		}
		//false为渐隐
		else{
			fieldset.setAttribute("class","layui-elem-field layui-anim layui-anim-fadeout");
		}
	}

	//视频工具箱操作实现
	function control(selectid){
		let select=document.getElementById(selectid);
		select.onchange=function(){
			setFast(selectid,0.0);
		}
	}

	//设置倍速
    function setFast(id,num){
    	var fast;
		if(num==0.0&&id!=null){
			fast=document.getElementById(id).value;
		}
		else{
			fast=num;
		}
		if(fast==0){
			fast=1;
			alert('你输入的倍数非法,已为你自动调整到原倍速!');
		}
		console.log("执行倍速:"+fast);
		//将当前倍速写进cookie并且三十天不过期
		if(readCookie("fast")){
			delCookie("fast");
		}
		fast=parseFloat(fast);
		fast=fast.toFixed(2);
		writeCookie("fast",fast,30);
		console.log("read cookie="+readCookie("fast"));
    	videojs.getPlayers("video-player").html5player.tech_.setPlaybackRate(fast);
		outNow(fast);
    }

    function getInputFastAndSet(inid,btnid){
    	var on=document.getElementById(btnid);
		document.getElementById(inid).onfocus=function(){
			animations(inid,2);
		}
    	on.onclick=function(){
			animations(btnid,3)
    		setFast(inid,0.0);
    	}
    }

	//将倍速写进cookie
	function writeCookie(c_name, value, expiredays){
		var exdate = new Date();
		    exdate.setDate(exdate.getDate() + expiredays);
		    document.cookie = c_name + "=" + escape(value) + " ;expires=" + exdate.toGMTString() + "; path=/";
	}

	//将倍速从cookies里读出
	function readCookie(cookie_name){
		 var allcookies = document.cookie;
			//索引长度,开始索引的位置
		    var cookie_pos = allcookies.indexOf(cookie_name);

		    // 如果找到了索引,就代表cookie存在,否则不存在
		    if (cookie_pos != -1) {
		        // 把cookie_pos放在值的开始,只要给值加1即可
		        //计算取cookie值得开始索引,加的1为“=”
		        cookie_pos = cookie_pos + cookie_name.length + 1;
		         //计算取cookie值得结束索引
		        var cookie_end = allcookies.indexOf(";", cookie_pos);

		        if (cookie_end == -1) {
		            cookie_end = allcookies.length;

		        }
		        //得到想要的cookie的值
		        var value = unescape(allcookies.substring(cookie_pos, cookie_end));
		    }
		return value;
	}

	//清除指定cookie
	function delCookie(name) {
		writeCookie(name, "", -1);
	}

	//监听键盘事件并更改倍速
	function keyControl(){
		document.onkeydown=function(event){
			//如果同时按下alt+反向上倍速则加0.1
			if(event.keyCode==87){
				let fast=readCookie("fast");
				console.log("倍速+");
				if(fast){
					console.log(fast);
					fast=parseFloat(fast);
					fast=fast+0.1;
					setFast(null,fast);
				}
			}
			else if(event.keyCode==83){
				console.log("倍速-");
				let fast=readCookie("fast");
				if(fast){
					console.log(fast);
					fast=parseFloat(fast);
					fast-=0.1;
					setFast(null,fast);
				}
			}
		}
	}

	//向指定id的节点增加子节点
	function addChild(id,flag,node){
		if(flag==true){
			let n=document.getElementById(id);
			n.appendChild(node);
		}
		else{
			let n=document.getElementsByClassName(id);
			if(n.length>0){
				n[0].appendChild(node);
			}
			else{
				console.log("增加节点失败,无class="+id+"的节点");
			}
		}
	}

	//清除元素
	//delNode("video-toolbar",true);
	delNode("video-toolbar-buttonbox",false);
	delNode("privilege-box",false);
    createInput("in","btn","select");

    getInputFastAndSet("in","btn");
	control("select");
	createBox();
	Past();
	keyControl();

})();