视频倍速播放(追剧学习神器)

全网视频倍速播放,看视频播太慢,这能忍?直接倍速播放,最高速度20倍【食用方法】①调节右上角加速框右侧上下按钮即可调节倍率 ②在右上角的加速框内输入加速倍率,如2、4、8、16等。【快捷键】:①单手快捷键:“x”,“c” 恢复正常播放:“t” ②双手快捷键:ctrl + 左右箭头

// ==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/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 *://*/*


// ==/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);
})();