// ==UserScript== // @name 视频倍速播放(追剧学习神器) // @namespace http://tampermonkey.net/ // @icon https://img-blog.csdnimg.cn/20181221195058594.gif // @version 1.2.7 // @description 全网视频倍速播放,看视频播太慢,这能忍?直接倍速播放,最高速度20倍【食用方法】①调节右上角加速框右侧上下按钮即可调节倍率 ②在右上角的加速框内输入加速倍率,如2、4、8、16等。【快捷键】:①单手快捷键:“x”,“c” 恢复正常播放:“t”或“z” ②双手快捷键:ctrl + 左右箭头 // @author wll // @require https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js // @require https://greasyfork.org/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 授权联系: leiwang2010@163.com // @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 *://*/* // @note 版本更新 23-06-08 1.2.6 增加触屏支持 // @note 版本更新 23-06-08 1.2.7 增加快速还原1.0 // @downloadURL none // ==/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": case "z": speedFun("1"); break; } }); var lastY = 0; $(document).on('touchstart', function(e) { lastY = e.originalEvent.touches[0].clientY; }); $(document).on('touchmove', function(e) { var currentY = e.originalEvent.touches[0].clientY; var deltaY = currentY - lastY; var times = Math.abs(deltaY) / 100; for (var i = 0; i < times; i++) { if (deltaY > 0) { speedFun("-"); } else { speedFun("+"); } } lastY = currentY; }); 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(''); }, 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); })();