Greasy Fork

Greasy Fork is available in English.

自定义哔哩哔哩视频播放速度

可以使用按键 z(恢复1倍速)、x(减0.1)、c(加0.1)调整倍速,支持0.1-5倍速,支持记住播放速度

当前为 2021-05-06 提交的版本,查看 最新版本

// ==UserScript==
// @name         自定义哔哩哔哩视频播放速度
// @namespace    http://tampermonkey.net/
// @version      0.1.2
// @description  可以使用按键 z(恢复1倍速)、x(减0.1)、c(加0.1)调整倍速,支持0.1-5倍速,支持记住播放速度
// @author       felix
// @match        https://www.bilibili.com/video/*
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// ==/UserScript==
(function () {
    'use strict';

    var STORAGE_KEY = {
        BILIBILI_VIDEO_SPEED: "bilibili_video_speed"
    }

    var SETTING = {
        STEP_SIZE: 0.1,
        MAX_SPEED: 5,
        MIN_SPEED: 0.1,
        REMEMBER_SPEED_MENU_ID: null
    };

    var autoAddInterval = setInterval(addButton, 5000);

    function addButton() {
        clearInterval(autoAddInterval);
        var viewboxReport = document.getElementById("arc_toolbar_report");
        var div = document.createElement("div");
        div.innerHTML = '<button id="reduce" style="width:15px;margin:0 3px">-</button><button style="width:30px"><sapn id="speed">1<span/></button><button id="add" style="width:15px;margin:0 3px">+</button>';
        viewboxReport.appendChild(div);
        document.getElementById("reduce").onclick = function () { reduceSpeed(); };
        document.getElementById("add").onclick = function () { addSpeed(); };
        loadSpeed();
    }

    function loadSpeed() {
        var speed = localStorage.getItem(STORAGE_KEY.BILIBILI_VIDEO_SPEED);
        if (speed) {
            changeSpeed(speed)
            loadRemoveSpeedMenu();
        } else {
            changeSpeed(1)
            loadSaveSpeedMenu();
        }
    }

    function reduceSpeed(STEP_SIZE) {
        if (!STEP_SIZE) STEP_SIZE = SETTING.STEP_SIZE;
        var speedSpan = document.getElementById("speed");
        var playSpeed = Number((Number(speedSpan.innerText) * 10 - STEP_SIZE * 10) / 10).toFixed(1);
        changeSpeed(playSpeed);
    }

    function addSpeed(STEP_SIZE) {
        if (!STEP_SIZE) STEP_SIZE = SETTING.STEP_SIZE;
        var speedSpan = document.getElementById("speed");
        var playSpeed = Number((Number(speedSpan.innerText) * 10 + STEP_SIZE * 10) / 10).toFixed(1);
        changeSpeed(playSpeed);
    }

    function changeSpeed(playSpeed) {
        if (playSpeed && playSpeed >= SETTING.MIN_SPEED && playSpeed <= SETTING.MAX_SPEED) {
            document.querySelector('video').PLAYBACKRATE = playSpeed;
            var speedSpan = document.getElementById("speed");
            speedSpan.innerText = playSpeed;
        }
    }

    function setSpeedToStorage() {
        localStorage.setItem(STORAGE_KEY.BILIBILI_VIDEO_SPEED, document.querySelector('video').playbackRate);
        GM_unregisterMenuCommand(SETTING.remember_speed_menu_id);
        loadRemoveSpeedMenu();
    }

    function removeSpeedFromStorage() {
        localStorage.removeItem(STORAGE_KEY.BILIBILI_VIDEO_SPEED);
        GM_unregisterMenuCommand(SETTING.remember_speed_menu_id);
        loadSaveSpeedMenu();
    }

    function loadSaveSpeedMenu() {
        var remember_speed_menu_id = GM_registerMenuCommand("记住播放速度", setSpeedToStorage);
        SETTING.remember_speed_menu_id = remember_speed_menu_id;
    }

    function loadRemoveSpeedMenu() {
        var remember_speed_menu_id = GM_registerMenuCommand("忘记播放速度", removeSpeedFromStorage);
        SETTING.remember_speed_menu_id = remember_speed_menu_id;
    }

    // 键盘快捷键
    document.onkeydown = function (e) {
        if (e.target.nodeName !== 'BODY') return;
        if (/^[zxcZXC]$/.test(e.key)) {
            if (e.key === 'z' || e.key === 'Z') {
                changeSpeed(1);
            }
            if (e.key === 'x' || e.key === 'X') {
                reduceSpeed();
            }
            if (e.key === 'c' || e.key === 'C') {
                addSpeed();
            }
        }
    };
})();