// ==UserScript== // @license MIT // @name 视频播放控制器 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 为页面视频添加快进、快退、暂停控制按钮 // @author You // @match *://*/* // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; // 配置项 let skipSeconds = 10; // 默认快进/快退秒数 // 样式 const styles = ` #video-controller { position: fixed; bottom: 20px; left: 20px; background: rgba(0, 0, 0, 0.8); padding: 8px 12px; border-radius: 10px; z-index: 999999; display: flex; gap: 8px; align-items: center; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); } #video-controller button { background: #4CAF50; color: white; border: none; padding: 5px; border-radius: 5px; cursor: pointer; font-size: 20px; transition: all 0.3s; line-height: 1; min-width: auto; } #video-controller button:hover { background: #45a049; transform: scale(1.05); } #video-controller button.pause { background: #f44336; } #video-controller button.pause:hover { background: #da190b; } #video-controller button.fullscreen { background: #2196F3; } #video-controller button.fullscreen:hover { background: #0b7dda; } #video-controller input { width: 40px; padding: 5px; border: none; border-radius: 5px; text-align: center; font-size: 14px; } #video-controller label { color: white; font-size: 14px; margin-left: 5px; } #video-controller .video-info { color: white; font-size: 12px; margin-left: 5px; } `; // 添加样式到页面 const styleSheet = document.createElement('style'); styleSheet.textContent = styles; document.head.appendChild(styleSheet); // 查找视频元素 function findVideos() { return document.querySelectorAll('video'); } // 创建控制面板 function createController(video) { // 检查是否已存在控制器 if (document.getElementById('video-controller')) { return; } const controller = document.createElement('div'); controller.id = 'video-controller'; controller.innerHTML = ` 00:00 `; document.body.appendChild(controller); // 绑定事件 const rewindBtn = document.getElementById('rewind-btn'); const playPauseBtn = document.getElementById('play-pause-btn'); const forwardBtn = document.getElementById('forward-btn'); const fullscreenBtn = document.getElementById('fullscreen-btn'); const skipInput = document.getElementById('skip-input'); // 快退 rewindBtn.addEventListener('click', () => { video.currentTime = Math.max(0, video.currentTime - skipSeconds); }); // 播放/暂停 playPauseBtn.addEventListener('click', () => { if (video.paused) { video.play(); playPauseBtn.textContent = '⏸️'; playPauseBtn.title = '暂停'; playPauseBtn.classList.add('pause'); } else { video.pause(); playPauseBtn.textContent = '▶️'; playPauseBtn.title = '播放'; playPauseBtn.classList.remove('pause'); } }); // 快进 forwardBtn.addEventListener('click', () => { video.currentTime = Math.min(video.duration, video.currentTime + skipSeconds); }); // 横屏全屏 fullscreenBtn.addEventListener('click', async () => { try { // 尝试进入全屏 if (video.requestFullscreen) { await video.requestFullscreen(); } else if (video.webkitRequestFullscreen) { await video.webkitRequestFullscreen(); } else if (video.mozRequestFullScreen) { await video.mozRequestFullScreen(); } else if (video.msRequestFullscreen) { await video.msRequestFullscreen(); } // 尝试锁定屏幕方向为横屏 if (screen.orientation && screen.orientation.lock) { try { await screen.orientation.lock('landscape'); } catch (err) { console.log('无法锁定屏幕方向:', err); } } } catch (err) { console.error('全屏失败:', err); alert('全屏失败,请手动旋转屏幕'); } }); // 修改秒数 skipInput.addEventListener('change', (e) => { const value = parseInt(e.target.value); if (value > 0 && value <= 60) { skipSeconds = value; rewindBtn.title = `快退 ${skipSeconds}秒`; forwardBtn.title = `快进 ${skipSeconds}秒`; } }); // 更新时间显示 function formatTime(seconds) { const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; } video.addEventListener('timeupdate', () => { document.getElementById('current-time').textContent = formatTime(video.currentTime); }); // 监听视频播放状态变化 video.addEventListener('play', () => { playPauseBtn.textContent = '⏸️'; playPauseBtn.title = '暂停'; playPauseBtn.classList.add('pause'); }); video.addEventListener('pause', () => { playPauseBtn.textContent = '▶️'; playPauseBtn.title = '播放'; playPauseBtn.classList.remove('pause'); }); // 键盘快捷键 document.addEventListener('keydown', (e) => { // 避免在输入框中触发 if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') { return; } switch (e.key) { case 'ArrowLeft': e.preventDefault(); video.currentTime = Math.max(0, video.currentTime - skipSeconds); break; case 'ArrowRight': e.preventDefault(); video.currentTime = Math.min(video.duration, video.currentTime + skipSeconds); break; case ' ': e.preventDefault(); if (video.paused) { video.play(); } else { video.pause(); } break; } }); } // 初始化 function init() { const videos = findVideos(); if (videos.length > 0) { // 默认控制第一个视频 createController(videos[0]); console.log(`找到 ${videos.length} 个视频元素,已创建控制器`); } } // 页面加载完成后执行 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } // 监听动态加载的视频 const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { if (mutation.addedNodes.length) { const videos = findVideos(); if (videos.length > 0 && !document.getElementById('video-controller')) { createController(videos[0]); } } } }); observer.observe(document.body, { childList: true, subtree: true }); })();