// ==UserScript== // @name 自定义视频播放速度 // @version 1.0 // @description 自定义页面所有视频播放速度,默认1.5倍 // @author Lama AI 辅助 // @match http://*/* // @match https://*/* // @grant GM_setValue // @grant GM_getValue // @run-at document-end // @namespace https://greasyfork.org/users/1171320 // @license MIT // @downloadURL none // ==/UserScript== function setVideoSpeed() { 'use strict'; let defaultSpeed = 1.5; let currentSpeed = defaultSpeed; let savedSpeed = GM_getValue('videoSpeed'); if (savedSpeed) { defaultSpeed = parseFloat(savedSpeed); currentSpeed = defaultSpeed; } function updateSpeed(newSpeed) { let videos = document.querySelectorAll('video, [class*="player"] video'); //More robust selector videos.forEach(video => { try { video.playbackRate = parseFloat(newSpeed); } catch (error) { console.error("Error setting playbackRate:", error); } }); currentSpeed = newSpeed; } function saveSpeed(newSpeed) { GM_setValue('videoSpeed', newSpeed); } //Handle iframes recursively function applySpeedToIframe(iframe) { try { const iframeDoc = iframe.contentDocument || iframe.contentWindow.document; const iframeVideos = iframeDoc.querySelectorAll('video, [class*="player"] video'); iframeVideos.forEach(video => { try { video.playbackRate = currentSpeed; } catch (error) { console.error("Error setting playbackRate in iframe:", error); } }); const iframeIfames = iframeDoc.querySelectorAll('iframe'); iframeIfames.forEach(applySpeedToIframe); } catch (error) { console.error("Error accessing iframe content:", error); } } updateSpeed(currentSpeed); //Set initial speed let iframes = document.querySelectorAll('iframe'); iframes.forEach(applySpeedToIframe); 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); } }); } let throttleTimer; const throttle = () => { if (throttleTimer) return; throttleTimer = setTimeout(() => { setVideoSpeed(); throttleTimer = null; }, 800); }; //Call setVideoSpeed directly instead of relying on scroll event alone. setVideoSpeed(); //window.addEventListener('scroll', throttle); //Keep this if you want to trigger on scroll as well