// ==UserScript== // @name 百家云视频倍速播放 // @namespace http://tampermonkey.net/ // @version 2.0 // @description 为百家云播放器添加倍速播放功能,支持自定义倍速,并确保学习进度正常记录 // @author KVic // @match *://*.zyk.yxlearning.com/learning/* // @grant none // @run-at document-idle // ==/UserScript== (function() { 'use strict'; // 存储当前设置的倍速 let currentSpeed = 1.5; // ... existing code ... // 拦截并修改百家云的进度上报请求 function interceptProgressReport() { console.log('🔧 开始拦截进度上报请求...'); const originalImageSrc = Object.getOwnPropertyDescriptor(Image.prototype, 'src'); Object.defineProperty(Image.prototype, 'src', { get: function() { return originalImageSrc.get.call(this); }, set: function(value) { // 检查是否是百家云的进度上报请求 if (value && value.includes('click.baijiayun.com/video/info')) { console.log('[拦截到进度上报]', value); // 解析 URL 参数 try { const url = new URL(value.startsWith('//') ? 'http:' + value : value); const params = url.searchParams; // 获取当前的 speedup 值 const oldSpeedup = params.get('speedup'); console.log(`原始 speedup: ${oldSpeedup}`); // 修改 speedup 参数为实际倍速 params.set('speedup', currentSpeed.toString()); // 重新构建 URL const newUrl = url.toString(); console.log(`修改后 speedup: ${currentSpeed}`); console.log('新 URL:', newUrl); // 使用修改后的 URL return originalImageSrc.set.call(this, newUrl); } catch(e) { console.error('修改上报 URL 失败:', e); } } // 非进度上报请求,正常设置 return originalImageSrc.set.call(this, value); }, configurable: true, enumerable: true }); console.log('✅ 进度上报拦截器已安装'); } // 设置倍速的函数 function setPlaybackSpeed(speed) { const player = window.baiJiaYunPlayer; if (!player || !player.video) { console.error('❌ 播放器未加载,请刷新页面后重试'); return false; } const ffplayer = player.video; // 验证输入 if (typeof speed !== 'number' || speed <= 0) { console.error('❌ 请输入有效的倍速值(大于0的数字)'); return false; } // 保存当前倍速 currentSpeed = speed; console.log(`=== 尝试设置为 ${speed}x 倍速 ===`); // 1. 检查当前状态 console.log('ffplayer.playRate:', ffplayer.playRate); console.log('ffplayer.speed:', ffplayer.speed); console.log('player.speed:', player.speed); // 2. 调用底层方法 try { console.log(`调用 ffplayer.setPlaybackRate(${speed})...`); if (typeof ffplayer.setPlaybackRate === 'function') { ffplayer.setPlaybackRate(speed); } else { console.warn('⚠️ setPlaybackRate 方法不存在,尝试直接设置属性'); } console.log('调用后 ffplayer.playRate:', ffplayer.playRate); console.log('调用后 ffplayer.speed:', ffplayer.speed); } catch(e) { console.log('❌ 调用失败:', e); return false; } // 3. 同时设置所有相关属性(以防万一) ffplayer.playRate = speed; ffplayer.speed = speed; player.speed = speed; console.log(`\n=== 全部设置为 ${speed}x ===`); console.log('ffplayer.playRate:', ffplayer.playRate); console.log('player.speed:', player.speed); // 4. 等待 5 秒观察实际效果 console.log('\n等待 5 秒观察视频是否加速...'); const startTime = player.currentTime; const startTimestamp = Date.now(); setTimeout(() => { const endTime = player.currentTime; const elapsed = (Date.now() - startTimestamp) / 1000; const progress = endTime - startTime; const actualSpeed = progress / elapsed; console.log('\n=== 最终测速结果 ==='); console.log('时间增量:', progress.toFixed(1) + '秒'); console.log('实际经过:', elapsed.toFixed(1) + '秒'); console.log(`🎯 实际倍速: ${actualSpeed.toFixed(2)}x`); if (Math.abs(actualSpeed - speed) < 0.3) { console.log(`✅ 成功!视频已设置为 ${speed}x 倍速!`); console.log(`✅ 进度上报中的 speedup 参数已同步为 ${speed}`); } else { console.log('❌ 倍速可能未生效,可能需要刷新页面或重新加载视频才能生效'); } }, 5000); return true; } // ... existing code ... // 初始化 waitForPlayer((player) => { console.log('✅ 百家云播放器已检测到'); // 导出函数到全局 window.setPlaybackSpeed = setPlaybackSpeed; // 安装进度上报拦截器 interceptProgressReport(); // 创建UI控制面板 createSpeedControlUI(); // 设置视频切换监听 setupVideoChangeListener(); // 首次加载时应用默认倍速 setTimeout(() => { setPlaybackSpeed(currentSpeed); }, 500); console.log('✅ 倍速播放功能已加载!'); console.log('使用方法:'); console.log('1. 使用页面上的控制面板'); console.log('2. 或在控制台输入 setPlaybackSpeed(倍数)'); console.log(' 例如:setPlaybackSpeed(1.5) 设置为1.5倍速'); console.log('💡 提示:切换视频时会自动应用上次设置的倍速'); console.log('💡 提示:进度上报中的 speedup 参数已自动同步'); }); })();