YouTube Playback Speed Up

Speeding up shit talking without leaving out any information

As of 2023-12-01. See the latest version.

// ==UserScript==
// @name              YouTube Playback Speed Up
// @name:zh-TW        YouTube 播放加速
// @name:zh-HK        YouTube 播放加速
// @name:zh-CN        YouTube 播放加速
// @namespace         https://github.com/NightFeather0615
// @version           1.0
// @description       Speeding up shit talking without leaving out any information
// @description:zh-TW 不錯過資訊的同時跳過廢話
// @description:zh-HK 不錯過資訊的同時跳過廢話
// @description:zh-CN 不错过资讯的同时跳过废话
// @author            NightFeather
// @match             http*://www.youtube.com/watch*
// @icon              https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant             none
// @license           MPL-2.0
// ==/UserScript==

/* jshint esversion: 8 */
/* jshint -W083 */

const waitElement = async (selector) => {
    'use strict';

    while (document.querySelector(selector) === null) {
        await new Promise(resolve => requestAnimationFrame(resolve));
    }

    return document.querySelector(selector);
};

const asyncSleep = async (ms) => {
    'use strict';

    return new Promise(resolve => setTimeout(resolve, ms));
};

(async function() {
    'use strict';

    const speedUpKey = 18;
    const increaseRateKey = 33;
    const decreaseRateKey = 34;
    const resetRateKey = 46;

    let videoPlayer = await waitElement("video");
    console.log(`[YT Playback Speed Up] Video player initialized`);

    let speedBeforeModify = videoPlayer.playbackRate;
    console.log(`[YT Playback Speed Up] Default playback rate is ${speedBeforeModify}`);

    let isSpeedUp = false;
    let speedUpRate = 3;

    document.addEventListener("keydown", async (event) => {
        event.preventDefault();

        switch(event.keyCode) {
            case speedUpKey: {
                if (event.repeat) return;
                isSpeedUp = true;
                await asyncSleep(1000);

                if (isSpeedUp) {
                    speedBeforeModify = videoPlayer.playbackRate;
                    videoPlayer.playbackRate = speedUpRate;
                    console.log(`[YT Playback Speed Up] Speeding up playback`);
                }

                break;
            }
            case increaseRateKey: {
                speedUpRate += 0.5;
                console.log(`[YT Playback Speed Up] Set speed up rate to ${speedUpRate}`);

                if (isSpeedUp) {
                    videoPlayer.playbackRate = speedUpRate;
                }

                break;
            }
            case decreaseRateKey: {
                speedUpRate -= 0.5;
                console.log(`[YT Playback Speed Up] Set speed up rate to ${speedUpRate}`);

                if (isSpeedUp) {
                    videoPlayer.playbackRate = speedUpRate;
                }

                break;
            }
            case resetRateKey: {
                speedUpRate = 3;
                console.log(`[YT Playback Speed Up] Set speed up rate to ${speedUpRate}`);

                if (isSpeedUp) {
                    videoPlayer.playbackRate = speedUpRate;
                }

                break;
            }
            default: return;
        }
    });

    document.addEventListener("keyup", (event) => {
        event.preventDefault();

        if (event.keyCode === speedUpKey) {
            isSpeedUp = false;
            videoPlayer.playbackRate = speedBeforeModify;
            console.log(`[YT Playback Speed Up] Set playback rate to ${speedBeforeModify}`);
        }
    });
})();