// ==UserScript==
// @name 视频倍速播放(追剧学习神器)
// @namespace http://tampermonkey.net/
// @icon https://img-blog.csdnimg.cn/20181221195058594.gif
// @version 1.2.5
// @description 全网视频倍速播放,看视频播太慢,这能忍?直接倍速播放,最高速度20倍【食用方法】①调节右上角加速框右侧上下按钮即可调节倍率 ②在右上角的加速框内输入加速倍率,如2、4、8、16等。【快捷键】:①单手快捷键:“x”,“c” 恢复正常播放:“t” ②双手快捷键:ctrl + 左右箭头
// @author wll
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require https://gf.qytechs.cn/scripts/447214-toast-script/code/toastscript.js?version=1065649
// @resource css https://cdn.jsdelivr.net/gh/sanzhixiaoxia/statics@main/toast.style.css
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant GM_registerMenuCommand
// @match *://*/*
// @note 增加支持网站: 依照规则增加@match所在标签即可
// @note 郑重声明: 本脚本只做学习交流使用,未经作者允许,禁止转载,不得使用与非法用途,一经发现,追责到底
// @note 授权联系: [email protected]
// @note 版本更新 20-12-26 1.0.0 初版发布视频倍速播放
// @note 版本更新 21-02-04 1.0.1 优化用户体验
// @note 版本更新 21-02-04 1.0.2 优化标题,优化简介
// @note 版本更新 21-06-18 1.0.3 增加新的倍速网址,ehuixue.cn/index/study,ehuixue.cn/index/study,chaoxing.com
// @note 版本更新 21-06-25 1.0.4 增加新的倍速网址,douyin.com
// @note 版本更新 21-06-26 1.0.5 增加新的倍速网址,pan.baidu.com,youku.com
// @note 版本更新 21-07-09 1.0.6 修正哔哩哔哩网站无法暂停问题
// @note 版本更新 21-10-11 1.0.7 由于百度云视频倍速播放收费,一时无法解决,暂时停用百度相关加速*://*.pan.baidu.com/*
// @note 版本更新 21-12-11 1.0.8 感谢用户“何佳林”,提供建议,增加快捷键控制倍速 ctrl + -> ctrl + <-
// @note 版本更新 21-12-13 1.0.9 增加cctv支持,增加倍速控件悬浮不跟随滑动
// @note 版本更新 21-12-14 1.1.0 增加倍率记忆功能,防止页面刷新倍率重新计算
// @note 版本更新 21-12-19 1.1.1 1、增加单手快捷键: “x” 、“c”, 2、增加寄存器倍率存储,浏览器全局使用 3、增加倍速框自动聚焦
// @note 版本更新 21-12-20 1.1.2 代码脚本优化
// @note 版本更新 21-12-20 1.1.3 增加全网倍速支持,让倍速不再有障碍
// @note 版本更新 21-12-21 1.1.4 增加快捷键d,用于恢复正常播放速度
// @note 版本更新 21-12-22 1.1.5 更改快捷键t,用于恢复正常播放速度
// @note 版本更新 21-12-23 1.1.6 修正倍速无法回到正常播放问题,感谢大佬“我不想上班”提供技术支持
// @note 版本更新 21-12-24 1.1.7 修正插件自带寄存器存储赋值失效问题
// @note 版本更新 21-12-24 1.1.8 修正bilibili自动下一集倍速失效问题
// @note 版本更新 21-12-28 1.1.9 增加大写快捷键支持
// @note 版本更新 22-01-06 1.2.0 增加倍率改变提示
// @note 版本更新 22-11-30 1.2.1 增加自动播放支持,增加代码优化
// @note 版本更新 22-12-03 1.2.2 增加浏览器菜单-可以:开启/关闭“倍速框”
// @note 版本更新 22-12-03 1.2.3 优化页面倍速框,倍速药丸不能停 O(∩_∩)O哈哈~
// @note 版本更新 22-12-05 1.2.4 优化倍速框样式
// @note 版本更新 23-01-18 1.2.5 @include *:* @match *://*/*
// ==/UserScript==
(function() {
'use strict';
function addStyle() {
let css=`
#rangeId{
z-index:99999999;
position:fixed;
top:100px;
right:100px;
width: 40px;
background-color:#E3EDCD;
display:inline-block;
text-align:center;
padding:0 6px 0 7px;
height:16px;
line-height:16px;
border-radius:9px;
border:1px solid var(--brand_pink);
outline: none;
color:var(--brand_pink);
font-size:12px;
margin-right:4px;
transition:background 0.3s,color 0.3s;
flex-shrink:0;
filter: opacity(1);
}
#rangeId:hover{
filter: opacity(1);
}
`;
GM_addStyle(css);
}
document.onkeydown = function() {
if (window.event.ctrlKey && (window.event.keyCode == 37)) {
speedFun("-");
}
if (window.event.ctrlKey && (window.event.keyCode == 39)) {
speedFun("+");
}
}
document.addEventListener("keypress", function(e) {
console.log("--->e.key:"+e.key);
switch (e.key.toLowerCase()) {
case "x":
speedFun("-");
break;
case "c":
speedFun("+");
break;
case "t":
speedFun("1");
break;
}
});
function speedFun(spee){
console.log("this speedFun is spee:" + spee);
if("+"==spee){
$("#rangeId").val(parseFloat(parseFloat($("#rangeId").val()) + 0.1 > 20 ? 20 : parseFloat($("#rangeId").val()) + 0.1).toFixed(1)).trigger("change");
return;
}
if("-"==spee){
$("#rangeId").val(parseFloat(parseFloat($("#rangeId").val()) - 0.1 < 0.1 ? 0.1 : parseFloat($("#rangeId").val()) - 0.1).toFixed(1)).trigger("change");
return;
}
if("1"==spee){
$("#rangeId").val(1.0);
localUtil.setSValue("speedStepKey", null);
return;
}
}
function addToast(msgText) {
GM_addStyle(GM_getResourceText("css"));
$.Toast("当前倍速:", msgText, "success", {
//stack: true,
has_icon: true,
has_close_btn: true,
fullscreen: false,
timeout: 600,
sticky: false,
has_progress: true,
rtl: false,
});
}
var localUtil = {
getSValue(name) {
return window.localStorage.getItem(name);
},
setSValue(name, value) {
window.localStorage.setItem(name, value);
},
getGValue(name) {
return window.GM_getValue(name);
},
setGValue(name, value) {
window.GM_setValue(name, value);
}
}
var main = {
init() {
addStyle();
$("body").prepend('<input id="rangeId" type="number" step="0.1" min="0.1" max="20" autofocus="autofocus" value="" />');
},
run() {
var step = document.getElementById("rangeId").value;
var htmlVideo = $("video").length;
if (htmlVideo > 0) {
//console.log("倍速播放方法启动,当前倍率为....." + step);
if (location.href.indexOf('bilibili.com/video/') > 0) {
if (stopFlag) {
document.querySelector('video').play();
stopFlag = false;
}
}
if (location.href.indexOf('learnin.com.cn') > 0) {
if (stopFlag) {
document.querySelector('video').play();
stopFlag = false;
}
}
var speedStepKey = localUtil.getSValue("speedStepKey");
if((step == null || step == '') && speedStepKey == null){
$("#rangeId").val(1);
document.querySelector('video').playbackRate = 1;
return;
}
if((step == null || step == '') && speedStepKey != null){
localUtil.setSValue("speedStepKey", speedStepKey);
$("#rangeId").val(speedStepKey);
document.querySelector('video').playbackRate = speedStepKey;
return;
}
if(step != null && step != ''&& step != speedStepKey){
localUtil.setSValue("speedStepKey", step);
$("#rangeId").val(step);
document.querySelector('video').playbackRate = step;
return;
}
if(step == speedStepKey){
localUtil.setSValue("speedStepKey", step);
$("#rangeId").val(step);
document.querySelector('video').playbackRate = step;
return;
}
} else {
console.log("当前视频不支持倍速播放..... o(╥﹏╥)o");
}
},
changes(){
$("#rangeId").change(function(e) {
addToast($("#rangeId").val());
})
},
initMenu(){
var speedStepKeyInput = localUtil.getSValue("speedStepKeyInput");
console.log('speedStepKeyInput waiting...'+speedStepKeyInput);
if(speedStepKeyInput == "true"){
$('#rangeId').css("opacity", "0");
localUtil.setSValue("speedStepKeyInput", true);
}
if(speedStepKeyInput == "false"){
$('#rangeId').css("opacity", "1");
localUtil.setSValue("speedStepKeyInput", false);
}
GM_registerMenuCommand('倍速框-开启', () => {
$('#rangeId').css("opacity", "1");
localUtil.setSValue("speedStepKeyInput", false);
});
GM_registerMenuCommand('倍速框-关闭', () => {
$('#rangeId').css("opacity", "0");
localUtil.setSValue("speedStepKeyInput", true);
});
}
}
var stopFlag = true;
var startStamp = new Date().getTime();
window.initTimer = setInterval(() => {
var videos = document.querySelectorAll("video").length;
var nowStamp = new Date().getTime();
if (videos > 0) {
clearInterval(initTimer);
main.init();
main.changes();
main.initMenu();
window.setInterval(function() {main.run();}, 1000);
} else if ((nowStamp - startStamp) > 15 * 1000) {
clearInterval(initTimer);
}
//else {
// console.log('search video waiting...');
//}
}, 1000);
//window.setInterval(function() {addToast("提示:成功"+new Date());}, 1*1000);
})();