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

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

目前為 2023-08-07 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         视频倍速播放(追剧学习神器)
// @namespace    http://tampermonkey.net/
// @icon         https://img-blog.csdnimg.cn/20181221195058594.gif
// @version      1.3.0
// @description  全网视频倍速播放,看视频播太慢,这能忍?直接倍速播放,最高速度20倍【食用方法】①调节右上角加速框右侧上下按钮即可调节倍率 ②在右上角的加速框内输入加速倍率,如2、4、8、16等。【快捷键】:①单手快捷键:“x”,“c” 恢复正常播放:“t”或“z”  ②双手快捷键:ctrl + 左右箭头
// @author       wll
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require      https://greasyfork.org/scripts/471299-toastify-js/code/toastifyjs.js?version=1222923
// @resource     css https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.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 *://*/*
// @note         版本更新	23-06-08 1.2.6  增加触屏支持
// @note         版本更新	23-06-08 1.2.7  增加快速还原1.0
// @note         版本更新	23-07-21 1.2.8  替换提示,去除双手快捷键
// @note         版本更新	23-08-04 1.2.9  增加滑动支持

// ==/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.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 isMouseDown = false;
    var startX, startY;

    $(document).on('mousedown', function(event) {
      isMouseDown = true;
      startX = event.pageX;
      startY = event.pageY;
    });

    $(document).on('mousemove', function(event) {
      if (isMouseDown) {
        var currentX = event.pageX;
        var currentY = event.pageY;

        var distanceX = currentX - startX;
        var distanceY = currentY - startY;

        var times = Math.abs(distanceY) / 600;
        for (var i = 0; i < times; i++) {
            if (distanceY > 0) {
                // speedFun("-");
            } else {
                // speedFun("+");
            }
        }
      }
    });

    $(document).on('mouseup', function(event) {
      isMouseDown = false;
    });

    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"));
        Toastify({
            text: "当前倍速:" + msgText,
            duration: 1500,
            newWindow: false,
            gravity: "bottom", // `top` or `bottom`
            position: "right", // `left`, `center` or `right`
            style: {
                background: "linear-gradient(to right, #00b09b, #96c93d)",
            }
        }).showToast();
    }

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