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