commit
1991d2075a
1 changed files with 135 additions and 0 deletions
@ -0,0 +1,135 @@ |
|||||||
|
// ==UserScript==
|
||||||
|
// @name YouTube Playback speed adjust
|
||||||
|
// @version 0.9
|
||||||
|
// @namespace userjs.osm
|
||||||
|
// @match *://www.youtube.com/*
|
||||||
|
// @grant none
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
"use strict"; |
||||||
|
|
||||||
|
|
||||||
|
class PlaySpeed { |
||||||
|
// Dom accessors
|
||||||
|
get dom_video() { |
||||||
|
return document.querySelector("video"); |
||||||
|
}; |
||||||
|
|
||||||
|
get dom_container() { |
||||||
|
return document.getElementById("movie_player"); |
||||||
|
}; |
||||||
|
|
||||||
|
// Constructor
|
||||||
|
constructor() { |
||||||
|
let self = this; |
||||||
|
|
||||||
|
this.overlay = null; |
||||||
|
this.rate = this.saved_rate; |
||||||
|
|
||||||
|
this.domevent = window.addEventListener("DOMContentLoaded", () => { |
||||||
|
let videos = document.getElementsByTagName("video"); |
||||||
|
|
||||||
|
if (videos[0]) |
||||||
|
videos[0].addEventListener("playing", () => { |
||||||
|
// Refresh
|
||||||
|
self.set_rate(self.rate); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
// Handle keypresses
|
||||||
|
this.keyevent = window.addEventListener("keydown", e => { |
||||||
|
// [ :: Decrease speed
|
||||||
|
// ] :: Increase speed
|
||||||
|
// Shift- :: Smaller steps
|
||||||
|
// Alt- :: Coarser steps
|
||||||
|
if (e.keyCode === 219) // [
|
||||||
|
self.set_rate(self.rate - self.modifier_step(e)); |
||||||
|
else if (e.keyCode === 221) // ]
|
||||||
|
self.set_rate(self.rate + self.modifier_step(e)); |
||||||
|
// \ :: Restore speed
|
||||||
|
// Shift-\ :: Save speed
|
||||||
|
// Alt-\ :: Set speed to 1
|
||||||
|
else if (e.keyCode === 220) { // \
|
||||||
|
if (e.altKey) |
||||||
|
self.set_rate(1); |
||||||
|
else if (e.shiftKey) |
||||||
|
self.save(); |
||||||
|
else |
||||||
|
self.restore(); |
||||||
|
} |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
// Get step size from modifier keys
|
||||||
|
modifier_step(e) { |
||||||
|
if (e.shiftKey == e.altKey) |
||||||
|
return 0.1; |
||||||
|
if (e.shiftKey) |
||||||
|
return 0.01; |
||||||
|
else if (e.altKey) |
||||||
|
return 1; |
||||||
|
}; |
||||||
|
|
||||||
|
// Speed overlay
|
||||||
|
do_overlay(rate) { |
||||||
|
let div = this.dom_container; |
||||||
|
let ol = this.overlay; |
||||||
|
|
||||||
|
if (div) { |
||||||
|
let need_overlay = Math.abs(rate - 1) > 0.001; |
||||||
|
|
||||||
|
if (!need_overlay) { |
||||||
|
if (ol) { |
||||||
|
div.removeChild(ol); |
||||||
|
ol = this.overlay = null; |
||||||
|
} |
||||||
|
|
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (!ol) { |
||||||
|
ol = this.overlay = document.createElement("div"); |
||||||
|
ol.style.position = "absolute"; |
||||||
|
ol.style.top = 0; |
||||||
|
ol.style.left = 0; |
||||||
|
ol.style.zIndex = 10; |
||||||
|
div.appendChild(ol); |
||||||
|
} |
||||||
|
|
||||||
|
ol.textContent = rate.toPrecision(3); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// set rates
|
||||||
|
set_rate(rate) { |
||||||
|
this.dom_video.playbackRate = rate; |
||||||
|
this.do_overlay(rate); |
||||||
|
this.rate = rate; |
||||||
|
}; |
||||||
|
|
||||||
|
// Restore from localstorage
|
||||||
|
get lst_key() { |
||||||
|
return "yt_playspeed_adjust"; |
||||||
|
}; |
||||||
|
|
||||||
|
get saved_rate() { |
||||||
|
let saved = window.localStorage.getItem(this.lst_key); |
||||||
|
|
||||||
|
if (saved) |
||||||
|
return parseFloat(saved); |
||||||
|
else |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
restore() { |
||||||
|
this.set_rate(this.saved_rate); |
||||||
|
} |
||||||
|
|
||||||
|
save() { |
||||||
|
window.localStorage.setItem(this.lst_key, this.rate.toPrecision(5)); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
const yt_playspeed = new PlaySpeed(); |
||||||
|
|
Loading…
Reference in new issue