Greasy Fork is available in English.

自定义视频播放速度

允许自定义视频播放速度

// ==UserScript==
// @name         自定义视频播放速度
// @version      2.2
// @description  允许自定义视频播放速度
// @author       ChatGPT
// @match        http://*/*
// @match        https://*/*
// @grant        GM_setValue
// @grant        GM_getValue
// @run-at       document-end
// @namespace    https://greasyfork.org/users/452911
// ==/UserScript==

function setVideoSpeed() {
  'use strict';

  let videos = document.querySelectorAll('video,[class*="player"] *');
  if (videos.length > 0 && !document.fullscreenElement) {
    (function() {
      'use strict';

      let defaultSpeed = 1;
      let currentSpeed = defaultSpeed;

      let savedSpeed = GM_getValue('videoSpeed');
      if (savedSpeed) {
        defaultSpeed = parseFloat(savedSpeed);
        currentSpeed = defaultSpeed; 
      }

      let videos = document.querySelectorAll('video,[class*="player"] *');
      for (let i = 0; i < videos.length; i++) {
        videos[i].playbackRate = currentSpeed;
      }

      let control = document.createElement('div');
      control.textContent = '倍速控制';
      control.style.cssText = `
        position: fixed;
        right: 5px;
        top: 30px;
        padding: 2px; 
        background: #ddd;
        border: 1px solid #999;
        cursor: pointer;
        z-index: 9999;
      `;

      document.body.appendChild(control);

      control.addEventListener('click', () => {
        let newSpeed = prompt('请输入新的播放倍速:', currentSpeed);
        if (newSpeed) {
          saveSpeed(newSpeed);
          updateSpeed(newSpeed);
        }
      });

      function updateSpeed(newSpeed) {
        for (let i = 0; i < videos.length; i++) {
          videos[i].playbackRate = newSpeed;
        }
        currentSpeed = newSpeed;
      }

      function saveSpeed(newSpeed) {
        GM_setValue('videoSpeed', newSpeed);
      }

      window.addEventListener('speedChanged', (e) => {
        let newSpeed = e.data;
        updateSpeed(newSpeed);
      });

      let iframes = document.querySelectorAll('iframe');
      iframes.forEach(applySpeed);

      function applySpeed(iframe) {
        let doc = iframe.contentDocument;
        let videos = doc.querySelectorAll('video,[class*="player"] *');
        videos.forEach(v => v.playbackRate = currentSpeed);
        let iframes = doc.querySelectorAll('iframe');
        iframes.forEach(applySpeed);
      }
    })();
  } 
}

let throttleTimer; 

const throttle = () => {
  if(throttleTimer) return;
  
  throttleTimer = setTimeout(() => {
    setVideoSpeed();
    throttleTimer = null;  
  }, 800);
}

window.addEventListener('scroll', throttle);

setVideoSpeed();