Greasy Fork is available in English.
自定义页面所有视频播放速度,默认1.5倍
当前为
// ==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 http://greasyfork.icu/users/1171320
// @license MIT
// ==/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