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