YouTube speed rememberer

Remembers playback speed.

  1. // ==UserScript==
  2. // @name YouTube speed rememberer
  3. // @version 0.3.4
  4. // @description Remembers playback speed.
  5. // @description:ru Запоминает скорость воспроизведения.
  6. // @author gvvad
  7. // @match *.youtube.com/*
  8. // @run-at document-body
  9. // @license GPL-3.0+; http://www.gnu.org/licenses/gpl-3.0.txt
  10. // @namespace https://gf.qytechs.cn/users/100160
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15. const PLAYER_SELECTOR = "#movie_player";
  16. let store = {
  17. get rate() {
  18. return parseFloat(localStorage.getItem("pl-rate")) || 1.0;
  19. },
  20. set rate(v) {
  21. localStorage.setItem("pl-rate", v);
  22. }
  23. }
  24.  
  25. // set button on video player
  26. // _msg - lable string
  27. let setLabel = function(_msg, _mp) {
  28. let label = document.querySelector("#_ytp-label");
  29. if (_msg === undefined) {
  30. if (label) label.parentElement.removeChild(label);
  31. return;
  32. }
  33. if (label) {
  34. label.innerText = _msg;
  35. return;
  36. }
  37.  
  38. let cls = document.querySelector(PLAYER_SELECTOR).querySelector("#movie_player .ytp-right-controls");
  39.  
  40. let span = document.createElement('span');
  41. span.setAttribute('id','_ytp-label');
  42. span.setAttribute('class','ytp-button');
  43. span.onclick = function() {
  44. _mp.setPlaybackRate(1);
  45. };
  46. span.innerText = _msg;
  47.  
  48. cls.insertBefore(span, cls.firstChild);
  49. };
  50.  
  51. // set or remove button
  52. let setSpeedLabel = function(rate, mp) {
  53. setLabel((rate==1)? undefined : 'x'+rate, mp);
  54. };
  55.  
  56. // modificate player object and store play rate
  57. // mp - movieplayer object
  58. let worker = function(mp) {
  59. let state = mp.getProgressState();
  60.  
  61. if (store.rate != 1.0 && !state.isAtLiveHead) {
  62. mp.setPlaybackRate(store.rate);
  63. setSpeedLabel(mp.getPlaybackRate(), mp);
  64. }
  65.  
  66. mp.addEventListener("onPlaybackRateChange", function(){
  67. store.rate = mp.getPlaybackRate();
  68. setSpeedLabel(mp.getPlaybackRate(), mp);
  69. });
  70. };
  71.  
  72. let observer = new MutationObserver(function(mRecord){
  73. let pl = document.querySelector(PLAYER_SELECTOR);
  74. if (pl) {
  75. worker(pl);
  76. this.disconnect();
  77. }
  78. });
  79. observer.observe(document.body, {attributes: false, childList: true, characterData: false});
  80. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址