Video Speed Control with Keyboard

Control any HTML5 video playback speed by pressing shortcut keys. See source code comment for the shortcut keymap.

2020-03-24 기준 버전입니다. 최신 버전을 확인하세요.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==

// @name                Video Speed Control with Keyboard
// @description         Control any HTML5 video playback speed by pressing shortcut keys. See source code comment for the shortcut keymap.
// @version             3.0

// @supportURL          https://github.com/ni554n/userscripts/issues
// @include             *

// @namespace           io.github.ni554n

// @author              Nissan Ahmed
// @homepageURL         https://ni554n.github.io
// @contributionURL     https://paypal.me/ni554n

// ==/UserScript==

/* Keymap:
 * ┌─────┬───────┐
 * │ Key │ Speed │
 * ├─────┼───────┤
 * │  ,  │ -0.5x │
 * ├─────┼───────┤
 * │  .  │ +0.5x │
 * ├─────┼───────┤
 * │  ;  │   1x  │
 * ├─────┼───────┤
 * │  '  │  2.5x │
 * ├─────┼───────┤
 * │  [  │   2x  │
 * ├─────┼───────┤
 * │  ]  │ 1.75x │
 * └─────┴───────┘
 */

// Stores currently playing video element reference for changing the speed later.
let video;
let speed = 1;

/* The "playing" event always fires automatically at the start of a video but "play" event is not.
 * After using the event for the initial key registration, "play" event is used for capturing the active video reference.
 */
document.addEventListener("playing", registerShortcutKeys, { capture: true, once: true });
document.addEventListener("playing", restoreSpeed, { capture: true });
document.addEventListener("play", captureActiveVideoElement, true);

function registerShortcutKeys(event) {
    captureActiveVideoElement(event);

    document.addEventListener("keydown", handlePressedKey);
}

function restoreSpeed(event) {
    if (event.target.playbackRate !== speed) event.target.playbackRate = speed;
}

function captureActiveVideoElement(event) {
    video = event.target;
}

function handlePressedKey(event) {
    // Skip if the pressed key is from any input field.
    const target = event.target;
    if (target.localName === "input" || target.localName === "textarea" || target.isContentEditable) return;

    // Mapping keys with actions.
    const key = event.key;
    if (key === ",") video.playbackRate -= 0.5;
    else if (key === ".") video.playbackRate += 0.5;
    else if (key === ";") video.playbackRate = 1;
    else if (key === "\'") video.playbackRate = 2.5;
    else if (key === "[") video.playbackRate = 2;
    else if (key === "]") video.playbackRate = 1.75;

    // Saving the speed for next resume or video playback.
    speed = video.playbackRate;
}