加了视频倍速播放的控制,便于复习,可连续倍速播放、画中画播放
// ==UserScript== // @name ##大学mooc_倍速播放_跳过片头_画中画播放 // @namespace http://tampermonkey.net/ // @version 1.43 // @description 加了视频倍速播放的控制,便于复习,可连续倍速播放、画中画播放 // @author kakasearch // @match http*://www.icourse163.org/learn/* // @match http*://www.icourse163.org/spoc/* // @run-at document-end // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (function() { 'use strict'; let mode = '刷课'//'review' let speed = 2 //播放倍率 let start_time = 0 function auto_jump(){ let video = document.getElementsByTagName('video')[0] video.onpause= function(){ let jump = setInterval(function(){ let con = document.querySelector(".u-btn.u-btn-default.cont.j-continue") if(con){con.click();clearInterval(jump)} },100) } } function FullScreen() { //全屏播放 var ele = document.getElementsByTagName('video')[0] if (ele.requestFullscreen) { ele.requestFullscreen(); } else if (ele.mozRequestFullScreen) { ele.mozRequestFullScreen(); } else if (ele.webkitRequestFullScreen) { ele.webkitRequestFullScreen(); } } function show(i){ document.querySelector("#speedText").value = '' document.querySelector("#speedText").placeholder= String(i.toFixed(1)) GM_setValue('speed',i) } let main = ()=>{ console.log('runmian') if (/content/.test(window.location.href)) { console.log('kaka_mooc_loaded'); document.body.onkeydown = function(event) {//恢复按键屏蔽 if (window.event) { return event; } } //取消自动播放 if(mode=='review'){ let check = setInterval(function() { let checkbox = document.querySelector("#courseLearn-inner-box > div > div > div.j-lscontent.lscontent > div.j-unitct.unitct > div.m-learnunitUI.f-pr.learn-plan-container > div.j-unitctBar.unitctBar.f-cb > div.f-fl > input") if (checkbox) { clearInterval(check) checkbox.checked = false } }, 100) } let pass = setInterval(function() { let video = document.getElementsByTagName('video') if (video.length > 0) { clearInterval(pass) auto_jump() let has_value = GM_getValue('speed') if(has_value && has_value !="undefined"){ speed = has_value } //if(GM_getValue('fullscreen')){//无效!!!!!!!!!!!!!!!! //FullScreen() // } video[0].playbackRate = speed video[0].currentTime = Number(GM_getValue('start_time')) ||0 video[0].play() let start_time = GM_getValue('start_time') ||0 if(! document.querySelector("#startTime")){ let otest = document.querySelector("div.j-unitctBar.unitctBar.f-cb") let nodestr = '</br><div><div><a id="PinP" class = "u-btn u-btn-default" align="left"><b>画中画播放</b></a></div>'+'<div><b>播放速度:</b><input type="text" id="speedText" style="border:black;outline: auto;padding-left: 3px;"></div><div> <b>起始秒数:</b> <input type="text" id="startTime" placeholder="'+start_time+'" style="border:black;outline: auto;padding-left: 3px;"></div>' let newnode=document.createRange().createContextualFragment(nodestr); otest.insertBefore(newnode,document.querySelector(".j-report-bug")) document.querySelector("#PinP").onclick= function(){ // video[0].requestPictureInPicture() if (!document.pictureInPictureElement) { video[0].requestPictureInPicture() this.innerText = "恢复" } else { document.exitPictureInPicture() this.innerText = "画中画播放" } } document.querySelector("#speedText").onblur= function(){ video = document.getElementsByTagName('video') video[0].playbackRate = parseFloat(document.querySelector("#speedText").value) GM_setValue('speed',video[0].playbackRate) GM_setValue('is_focus',0) show(video[0].playbackRate) } document.querySelector("#speedText").onfocus= function(){ GM_setValue('is_focus',1) } document.querySelector("#startTime").onblur= function(){ GM_setValue('start_time',Number(document.querySelector("#startTime").value)) GM_setValue('is_focus',0) } document.querySelector("#startTime").onfocus= function(){ GM_setValue('is_focus',1) } } show(document.getElementsByTagName('video')[0].playbackRate) if(mode=='review'){ video[0].onended = function() { //自动播放下一p if (document.querySelector(".f-fl.current").nextElementSibling == null) { // 没了 let yid = /&id=(\d+)/.exec(window.location.href)[1] let nid = parseInt(yid) + 1 window.location.href = window.location.href.replace(yid, String(nid)) } else { //下1p let ycid = /cid=(\d+)/.exec(window.location.href)[1] let ncid = parseInt(ycid) + 1 window.location.href = window.location.href.replace(ycid, String(ncid)) } } } document.body.onkeydown = function(ev) { if( GM_getValue('is_focus')){ return ev }else{ var e = ev || event; let video = document.getElementsByTagName('video')[0] switch(e.keyCode){ case 67: video.playbackRate += 0.1 break case 88: video.playbackRate -= 0.1 break case 13: FullScreen() GM_setValue('fullscreen',1) //全屏状态下的连续播放 if(mode=='review'){ document.querySelector("#courseLearn-inner-box > div > div > div.j-lscontent.lscontent > div.j-unitct.unitct > div.m-learnunitUI.f-pr.learn-plan-container > div.j-unitctBar.unitctBar.f-cb > div.f-fl > input").checked = false if (document.getElementsByTagName('video')[0].ended) { let ycid = /cid=(\d+)/.exec(window.location.href)[1] let ncid = parseInt(ycid) + 1 window.location.href = window.location.href.replace(ycid, String(ncid)) }} break case 39: video.currentTime += 5 break case 37: video.currentTime -= 5 break case 49: video.playbackRate = 1 break case 90: video.playbackRate = 1 break case 50: video.playbackRate = 2 break case 51: video.playbackRate = 3 break case 52: video.playbackRate = 4 break case 27: GM_setValue('fullscreen',0) break default: return e } GM_setValue('speed',video.playbackRate) show(video.playbackRate) } } } }, 100) } // Your code here... }//main let obser = setInterval( function(){ let video= document.querySelector(".j-unitct.unitct") if(video){ clearInterval(obser) main() let observer = new MutationObserver(main) observer.observe(video, { attributes: true,childList: true });//检测video变化,防止中途切p失效 } },200 ) } )();