// ==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);
})();