YouTube Video Speed & Seek Mouse Control

Dynamically adjust video playback speed & seeking instantly with your mousewheel, no more need to go through player menus every time.

  1. // ==UserScript==
  2. // @name YouTube Video Speed & Seek Mouse Control
  3. // @namespace YPSSMC
  4. // @version 4.0
  5. // @description Dynamically adjust video playback speed & seeking instantly with your mousewheel, no more need to go through player menus every time.
  6. // @run-at document-ready
  7. // @include http://www.youtube.com/*
  8. // @include https://www.youtube.com/*
  9. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
  10. // @require https://greasyfork.org/scripts/12284-jquery-mousewheel-3-1-13/code/jQuery%20Mousewheel%203113.js
  11. // @require https://greasyfork.org/scripts/14098-bililiterange-js/code/bililiteRangejs.js?version=88786
  12. // @require https://greasyfork.org/scripts/14097-jquery-simulate/code/jQuery%20Simulate.js?version=88785
  13. // @require https://greasyfork.org/scripts/14096-jquery-simulate-extended-plugin-1-3-0/code/jQuery%20Simulate%20Extended%20Plugin%20130.js?version=88784
  14. // @require https://greasyfork.org/scripts/14095-jquery-simulate-key-sequence-plugin-1-3-0/code/jQuery%20Simulate%20Key-Sequence%20Plugin%20130.js?version=88783
  15. // @author drhouse
  16. // @icon https://s.ytimg.com/yts/img/favicon-vfldLzJxy.ico
  17. // ==/UserScript==
  18.  
  19. $(document).ready(function () {
  20. function getPlaybackRate() {
  21. var v = $('.video-stream')[0];
  22. return v.playbackRate;
  23. }
  24.  
  25. var speed = getPlaybackRate().toFixed(2);
  26. var isShift = false;
  27. var isAlt = false;
  28. var ytplayer = document.getElementById("movie_player");
  29.  
  30. $(ytplayer).prepend('<div id="rate">' + speed + ' </div>');
  31. $("#rate").css("z-index","999");
  32. $("#rate").css('position', 'absolute');
  33. $("#rate").css('top', '0');
  34. $("#rate").css('right', '0');
  35.  
  36. function setPlaybackRate(r) {
  37. var v = $('.video-stream')[0];
  38. if (v === undefined || v.playbackRate === undefined) {
  39. setTimeout(function(){setPlaybackRate(r);}, 1000);
  40. return;
  41. }
  42. v.playbackRate = r;
  43. }
  44.  
  45. $(window.document).mousewheel(function(e, deltaX) {
  46. //Seek | Shift+WheelUp/Down
  47. if (e.shiftKey) {
  48. if (deltaX>0) {
  49. if (location.href.toString().indexOf("embed") == -1) { //youtube.com
  50. var ytplayer = document.getElementById("movie_player");
  51. var time = ytplayer.getCurrentTime();
  52. ytplayer.seekTo(time+5, true);
  53. }
  54. else{$('.video-stream').simulate("key-sequence", { sequence: "l" });} //embed
  55. } else {
  56. if (location.href.toString().indexOf("embed") == -1) { //youtube.com
  57. var ytplayer = document.getElementById("movie_player");
  58. var time = ytplayer.getCurrentTime();
  59. ytplayer.seekTo(time-5, true);
  60. }
  61. else{$('.video-stream').simulate("key-sequence", { sequence: "j" });} //embed
  62. }
  63. e.preventDefault();
  64. }
  65.  
  66. //Speed | Alt+WheelUp/Down
  67. if (e.altKey) {
  68. var step = 0.25;
  69. if (e.deltaY<0) {
  70. var speed = Math.max(0.0,(getPlaybackRate()-step).toFixed(2));
  71. setPlaybackRate(speed);
  72. } else {
  73. var speed = Math.min(8,(getPlaybackRate()+step).toFixed(2));
  74. setPlaybackRate(speed);
  75. }
  76. e.preventDefault();
  77. $("#rate").remove();
  78. var speed = speed.toFixed(2);
  79. var ytplayer = document.getElementById("movie_player");
  80. $(ytplayer).prepend('<div id="rate">' + speed + ' </div>');
  81. $("#rate").css("z-index","999");
  82. $("#rate").css('position', 'absolute');
  83. $("#rate").css('top', '0');
  84. $("#rate").css('right', '0');
  85.  
  86. }
  87. });
  88. })