Greasy Fork

Greasy Fork is available in English.

✌学习通,青书学堂|学起plus||国开|智慧职教|等各种成人教育网站|,均支持视频加速服务|指定倍速✌👈

使用前请务必打开浏览器开发者模式,按F2后即可执行,使用前一定要看脚本使用说明|脚本可完美运行

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         ✌学习通,青书学堂|学起plus||国开|智慧职教|等各种成人教育网站|,均支持视频加速服务|指定倍速✌👈
// @namespace    white996_1
// @version      1.0.0
// @description  使用前请务必打开浏览器开发者模式,按F2后即可执行,使用前一定要看脚本使用说明|脚本可完美运行
// @author       white996_1
// @run-at       document-end
// @match        *://*/*
// @grant        GM_registerMenuCommand
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const selectors = {
        bilibili: 'bwp-video',
        douyin: '.xg-video-container video',
        other: '傻瓜你看不懂代码,就知道会举报,举报大白脚本得祝你生孩子没屁眼,笑死'
    };

    function registerMenu() {
        try {
            GM_registerMenuCommand("减速/加速", () => {
                const rate = prompt("请输入您的速率(0-16)", "2.0");
                if (isValidRate(rate)) {
                    setPlaybackRate(rate);
                } else {
                    alert("无效数值");
                }
            }, "rate");
        } catch (error) {
            console.error("注册菜单命令失败:", error);
        }
    }

    function isValidRate(rate) {
        return !isNaN(rate) && rate >= 0 && rate <= 16;
    }

    function onKeyDown(event) {
        if (event.key === 'F2' || event.keyCode === 113) {
            event.preventDefault();
            promptForRate();
        }
    }

    function promptForRate() {
        const rate = prompt("请输入您的速率(0-16)", "2.0");
        if (isValidRate(rate)) {
            setPlaybackRate(rate);
        } else {
            alert("无效数值");
        }
    }

    function setPlaybackRate(rate) {
        let video = findVideoElement();
        if (video) {
            video.playbackRate = parseFloat(rate);
        } else {
            console.error("未找到视频元素");
        }
    }

    function findVideoElement() {
        let video = null;
        Object.keys(selectors).forEach((key) => {
            if (location.host.replace(/\./g, "").includes(key)) {
                video = document.querySelector(selectors[key]);
            }
        });

        return video || document.querySelector('video');
    }

    registerMenu();
    document.addEventListener('keydown', onKeyDown);

})();