youtube播放视频倍速自定义,可记忆

youtube播放视频倍速自定义,刷新浏览器也不会丢失之前设置的速度

  1. // ==UserScript==
  2. // @name youtube播放视频倍速自定义,可记忆
  3. // @namespace EsfB3XVPmbThEv39bdxQR2hzid30iMF9
  4. // @version 1.6
  5. // @description youtube播放视频倍速自定义,刷新浏览器也不会丢失之前设置的速度
  6. // @author 朋也
  7. // @include http*://*youtube.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function () {
  12.  
  13. if (window.trustedTypes && window.trustedTypes.createPolicy) {
  14. window.trustedTypes.createPolicy('default', {
  15. createHTML: (string, sink) => string
  16. });
  17. }
  18. // --------------------------------------------------------------
  19.  
  20. let videoSpeedElement, videoDom;
  21.  
  22. setInterval(function () {
  23. if (location.href.indexOf("short") > -1 || location.href.indexOf("channel") > -1) return;
  24. if (document.querySelector("#above-the-fold") && document.getElementById("video_speed_div") === null) {
  25. addSpeedBtn();
  26. initSpeed();
  27. }
  28. if (!videoDom) {
  29. videoDom = document.querySelector(".html5-main-video");
  30. if (videoDom && !videoDom.onloadstart) {
  31. setPlaybackRate();
  32. videoDom.onloadstart = function (event) {
  33. setPlaybackRate();
  34. }
  35. }
  36. }
  37.  
  38. let skip_ad_btn = document.querySelector(".ytp-skip-ad-button");
  39. if (skip_ad_btn) {
  40. skip_ad_btn.click();
  41. }
  42. }, 1000);
  43.  
  44. function addSpeedBtn() {
  45. let style = document.createElement('style');
  46. style.type = 'text/css';
  47. style.innerHTML = "#video_speed_div button { outline: 0; padding: 5px 7px; margin-left: 10px; background-color: #ede9e9; border: 0; border-radius: 12px; color: #222; cursor: pointer;} #video_speed_div button:first-child{margin-left:0;} #video_speed_div button:hover{background-color: #e2e0e0;} .video_speed_div-button-active { border: 0!important; background-color: #ff0000!important; color: #fff!important; }";
  48. document.getElementsByTagName('head').item(0).appendChild(style);
  49.  
  50. videoSpeedElement = document.createElement("div");
  51. videoSpeedElement.setAttribute("id", "video_speed_div");
  52.  
  53. let speedArr = [0.5, 1, 1.5, 1.75, 2, 2.5, 3];
  54.  
  55. for (let i = 0; i < speedArr.length; i++) {
  56. let speed = speedArr[i];
  57. let btn = document.createElement("button");
  58. btn.innerHTML = "x" + speed;
  59. btn.style.width = "45px";
  60. btn.setAttribute("id", "third_video_plugin_btn_" + speed);
  61. btn.addEventListener("click", btnClicked);
  62. videoSpeedElement.appendChild(btn);
  63. }
  64.  
  65. videoSpeedElement.style.width = "100%";
  66. videoSpeedElement.style.height = "30px";
  67.  
  68. // let targetElement = document.querySelectorAll("[id='count']");
  69. // for (var i = 0; i < targetElement.length; i++) {
  70. // if (targetElement[i].className.indexOf("ytd-video-primary-info-renderer") > -1) {
  71. // targetElement[i].appendChild(videoSpeedElement);
  72. // }
  73. // }
  74.  
  75. let targetElement = document.querySelector("#above-the-fold");
  76. targetElement.insertBefore(videoSpeedElement, targetElement.firstChild);
  77. }
  78.  
  79. // 加载之前已经设置的速度
  80. function initSpeed() {
  81. if (!videoSpeedElement) return;
  82. let third_video_plugin_speed = localStorage.getItem("third_video_plugin_speed");
  83. if (!third_video_plugin_speed) third_video_plugin_speed = '1';
  84.  
  85. for (let i = 0; i < videoSpeedElement.childNodes.length; i++) {
  86. let btn = videoSpeedElement.childNodes[i];
  87. if (btn.getAttribute("id") === "third_video_plugin_btn_" + third_video_plugin_speed && btn.className.indexOf("video_speed_div-button-active") === -1) {
  88. btn.click();
  89. }
  90. }
  91. document.getElementById("third_video_plugin_btn_" + third_video_plugin_speed).click();
  92. }
  93.  
  94. function setPlaybackRate(speed) {
  95. if (!videoSpeedElement) return;
  96. let third_video_plugin_speed = speed || localStorage.getItem("third_video_plugin_speed");
  97. if (!third_video_plugin_speed) return;
  98.  
  99. // let videoDom = document.querySelector(".html5-main-video");
  100. if (!videoDom) return;
  101. videoDom.playbackRate = third_video_plugin_speed;
  102. }
  103.  
  104. function btnClicked(e) {
  105. let speed = parseFloat(e.target.innerHTML.replace("x", ""));
  106. localStorage.setItem("third_video_plugin_speed", speed);
  107. // let videoDom = document.querySelector(".html5-main-video");
  108. // if (!videoDom) return;
  109. // videoDom.playbackRate = speed;
  110.  
  111. setPlaybackRate(speed);
  112.  
  113. for (let i = 0; i < videoSpeedElement.childNodes.length; i++) {
  114. let btn = videoSpeedElement.childNodes[i];
  115. btn.setAttribute("class", "");
  116. }
  117. e.target.setAttribute("class", "video_speed_div-button-active");
  118. }
  119.  
  120. })();

QingJ © 2025

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