// ==UserScript== // @name 移动云视频倍速|可视化面板(修复版) // @namespace http://tampermonkey.net/ // @version 3.0 // @description 139云视频 默认1.5倍速 滑块调节 精美面板 防报错 防重置 // @author 豆包 // @match *://yun.139.com/* // @grant none // ==/UserScript== (function() { 'use strict'; // ========== 配置 ========== let DEFAULT_SPEED = 1.5; let currentSpeed = DEFAULT_SPEED; let video = null; let panelCreated = false; // 获取视频元素 function getVideo() { return document.getElementById('videoJS_1_html5_api'); } // 设置倍速 function setPlaybackRate(speed) { video = getVideo(); if (!video) return; currentSpeed = speed; video.playbackRate = speed; // 更新面板显示(安全判断) const textEl = document.getElementById('sp-text'); if (textEl) { textEl.innerText = speed.toFixed(2) + 'x'; } const sliderEl = document.getElementById('sp-slider'); if (sliderEl) { sliderEl.value = speed; } } // 强制锁定倍速 function lockSpeed() { setPlaybackRate(currentSpeed); } // 创建可视化面板(完全安全版) function createPanel() { if (panelCreated) return; panelCreated = true; const panel = document.createElement('div'); panel.id = 'speed-panel'; panel.style.cssText = ` position: fixed; top: 70px; right: 20px; z-index: 999999; background: #18181b; color: #fff; width: 230px; padding: 14px 16px; border-radius: 14px; box-shadow: 0 8px 25px rgba(0,0,0,0.3); font-family: "Microsoft YaHei", sans-serif; user-select: none; `; // 标题行 const head = document.createElement('div'); head.style.cssText = 'display:flex; justify-content:space-between; align-items:center; margin-bottom:10px;'; head.innerHTML = `⚙️ 倍速控制器 ${currentSpeed.toFixed(2)}x`; // 滑块 const slider = document.createElement('input'); slider.id = 'sp-slider'; slider.type = 'range'; slider.min = 0.5; slider.max = 4; slider.step = 0.05; slider.value = currentSpeed; slider.style.cssText = 'width:100%; height:8px; margin:8px 0; accent-color:#22c55e; cursor:pointer;'; slider.oninput = () => { setPlaybackRate(parseFloat(slider.value)); }; // 快捷按钮组 const btnGroup = document.createElement('div'); btnGroup.style.cssText = 'display:grid; grid-template-columns:repeat(4,1fr); gap:6px; margin-top:10px;'; const speeds = [1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4]; speeds.forEach(s => { const btn = document.createElement('button'); btn.innerText = s + 'x'; btn.style.cssText = ` padding: 6px 0; border: none; border-radius: 6px; background: #27272a; color: #fff; font-size: 12px; cursor: pointer; `; btn.onmouseover = () => btn.style.background = '#3f3f46'; btn.onmouseout = () => btn.style.background = '#27272a'; btn.onclick = () => setPlaybackRate(s); btnGroup.appendChild(btn); }); panel.appendChild(head); panel.appendChild(slider); panel.appendChild(btnGroup); document.body.appendChild(panel); } // 等待视频加载 + 初始化 const initTimer = setInterval(() => { const v = getVideo(); if (v) { clearInterval(initTimer); createPanel(); setPlaybackRate(currentSpeed); setInterval(lockSpeed, 500); } }, 500); })();