// ==UserScript== // @name 枣庄专业技术人员公需课、专业课视频倍速播放 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 为枣庄专业技术人员公需课、专业课添加倍速播放功能 // @author KVic // @match *://*.zyk.yxlearning.com/learning/* // @grant none // @run-at document-idle // ==/UserScript== (function() { 'use strict'; // 存储当前设置的倍速 let currentSpeed = 1.5; // 等待播放器加载 function waitForPlayer(callback, maxWait = 10000) { const startTime = Date.now(); function check() { if (window.baiJiaYunPlayer && window.baiJiaYunPlayer.video) { callback(window.baiJiaYunPlayer); return true; } if (Date.now() - startTime > maxWait) { console.error('❌ 超时:未找到百家云播放器'); return false; } setTimeout(check, 100); } check(); } // 设置倍速的函数 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 倍速!`); } else { console.log('❌ 倍速可能未生效,可能需要刷新页面或重新加载视频才能生效'); } }, 5000); return true; } // 应用保存的倍速 function applySavedSpeed() { if (currentSpeed && currentSpeed !== 1.0) { console.log(`🔄 自动应用倍速: ${currentSpeed}x`); setTimeout(() => { setPlaybackSpeed(currentSpeed); }, 500); } } // 监听视频切换事件 function setupVideoChangeListener() { // 监听 URL 变化 let lastUrl = location.href; new MutationObserver(() => { const url = location.href; if (url !== lastUrl) { lastUrl = url; console.log('📍 检测到页面变化,等待新视频加载...'); // 等待新播放器加载后应用倍速 setTimeout(() => { waitForPlayer((player) => { console.log('✅ 新视频播放器已加载'); applySavedSpeed(); }, 5000); }, 1000); } }).observe(document, { subtree: true, childList: true }); // 监听播放器重置事件 if (window.baiJiaYunPlayer) { const originalPlay = window.baiJiaYunPlayer.play; if (originalPlay) { window.baiJiaYunPlayer.play = function(...args) { const result = originalPlay.apply(this, args); applySavedSpeed(); return result; }; } } } // 创建UI界面 function createSpeedControlUI() { const container = document.createElement('div'); container.id = 'speed-control-container'; container.style.cssText = ` position: fixed; top: 20px; right: 20px; z-index: 999999; background: rgba(0, 0, 0, 0.8); padding: 15px; border-radius: 10px; color: white; font-family: Arial, sans-serif; min-width: 200px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); `; const title = document.createElement('h3'); title.textContent = '🎬 倍速控制'; title.style.margin = '0 0 10px 0'; title.style.fontSize = '16px'; title.style.textAlign = 'center'; const statusDiv = document.createElement('div'); statusDiv.id = 'speed-status'; statusDiv.style.cssText = ` text-align: center; margin-bottom: 10px; font-size: 12px; color: #FFD700; `; statusDiv.textContent = `当前倍速: ${currentSpeed}x`; const buttonContainer = document.createElement('div'); buttonContainer.style.display = 'flex'; buttonContainer.style.flexWrap = 'wrap'; buttonContainer.style.gap = '5px'; buttonContainer.style.justifyContent = 'center'; const speeds = [1.5, 2.0, 2.5, 3.0, 6.0, 8.0]; speeds.forEach(speed => { const btn = document.createElement('button'); btn.textContent = `${speed}x`; btn.style.cssText = ` padding: 8px 12px; border: none; border-radius: 5px; background: ${speed === currentSpeed ? '#FF9800' : '#4CAF50'}; color: white; cursor: pointer; font-size: 14px; transition: all 0.3s; `; btn.onmouseover = () => btn.style.background = '#45a049'; btn.onmouseout = () => { btn.style.background = speed === currentSpeed ? '#FF9800' : '#4CAF50'; }; btn.onclick = () => { setPlaybackSpeed(speed); updateStatus(speed); // 更新按钮样式 const allBtns = buttonContainer.querySelectorAll('button'); allBtns.forEach(b => b.style.background = '#4CAF50'); btn.style.background = '#FF9800'; }; buttonContainer.appendChild(btn); }); const closeBtn = document.createElement('button'); closeBtn.textContent = '✕'; closeBtn.style.cssText = ` position: absolute; top: 5px; right: 10px; background: none; border: none; color: white; font-size: 18px; cursor: pointer; padding: 0; width: 25px; height: 25px; `; closeBtn.onclick = () => container.remove(); container.appendChild(closeBtn); container.appendChild(title); container.appendChild(statusDiv); container.appendChild(buttonContainer); document.body.appendChild(container); console.log('✅ 倍速控制面板已创建'); } // 更新状态显示 function updateStatus(speed) { const statusDiv = document.getElementById('speed-status'); if (statusDiv) { statusDiv.textContent = `当前倍速: ${speed}x`; } } // 初始化 waitForPlayer((player) => { console.log('✅ 百家云播放器已检测到'); // 导出函数到全局 window.setPlaybackSpeed = setPlaybackSpeed; // 创建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('💡 提示:切换视频时会自动应用上次设置的倍速'); }); })();