-
Notifications
You must be signed in to change notification settings - Fork 4
/
script.user.js
81 lines (65 loc) · 2.78 KB
/
script.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// ==UserScript==
// @name Video Speed Control with Keyboard
// @description Controls any HTML5 video playback speed by pressing shortcut keys. See source code comment for the shortcut keymap.
// @version 3.1
// @namespace io.github.ni554n
// @include *
// @supportURL https://github.com/ni554n/userscripts/issues
// @license MIT
// @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;
// Stores currently selected speed. Also acts as default / initial playback speed for all 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;
speed = video.playbackRate;
}
function handlePressedKey(event) {
// If the pressed key is coming from any input field, do nothing.
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;
}