// ==UserScript== // @name 网页视频控制4.0 // @namespace https://bbs.tampermonkey.net.cn/ // @version 0.4.0 // @description 通过键盘快捷键控制网页视频播放:空格键播放/暂停,左右方向键快退/快进,上下方向键调节音量 // @author Trae // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // 获取页面中的视频元素 function getVideoElement() { return document.querySelector('video'); } // 获取下一集视频的链接 function getNextVideoLink() { // 尝试查找常见的视频列表元素 const videoLinks = Array.from(document.querySelectorAll('a')).filter(link => { const href = link.href.toLowerCase(); return href.includes('video') || href.includes('play') || href.includes('episode') || href.includes('集') || href.includes('期'); }); if (videoLinks.length === 0) return null; // 查找当前URL在列表中的位置 const currentIndex = videoLinks.findIndex(link => link.href === window.location.href); if (currentIndex === -1 || currentIndex === videoLinks.length - 1) return null; return videoLinks[currentIndex + 1].href; } // 跳转到下一集 function playNextVideo() { const nextLink = getNextVideoLink(); if (nextLink) { window.location.href = nextLink; } } // 获取视频的唯一标识 function getVideoId(video) { // 使用视频源和页面URL作为唯一标识 return `${window.location.href}-${video.currentSrc}`; } // 保存播放进度 function savePlaybackProgress(video) { const videoId = getVideoId(video); localStorage.setItem(videoId, video.currentTime.toString()); } // 恢复播放进度 function restorePlaybackProgress(video) { const videoId = getVideoId(video); const savedTime = localStorage.getItem(videoId); if (savedTime !== null) { video.currentTime = parseFloat(savedTime); } } // 键盘事件处理函数 function handleKeyPress(event) { const video = getVideoElement(); if (!video) return; // 防止按键事件影响页面其他功能 if (['Space', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'KeyF'].includes(event.code)) { event.preventDefault(); event.stopPropagation(); } switch(event.code) { case 'Space': // 空格键:播放/暂停 if (video.paused) { video.play().catch(error => console.log('播放失败:', error)); } else { video.pause(); } break; case 'ArrowLeft': // 左方向键:后退5秒 video.currentTime = Math.max(0, video.currentTime - 5); break; case 'ArrowRight': // 右方向键:前进5秒 video.currentTime = Math.min(video.duration, video.currentTime + 5); break; case 'ArrowUp': // 上方向键:音量增加10% video.volume = Math.min(1, video.volume + 0.1); break; case 'ArrowDown': // 下方向键:音量降低10% video.volume = Math.max(0, video.volume - 0.1); break; case 'KeyN': // N键:跳转下一集 playNextVideo(); break; case 'KeyF': // F键:全屏 if (video.requestFullscreen) { video.requestFullscreen().catch(error => console.log('全屏失败:', error)); } else if (video.webkitRequestFullscreen) { // Safari video.webkitRequestFullscreen(); } else if (video.msRequestFullscreen) { // IE11 video.msRequestFullscreen(); } break; } } // 添加键盘事件监听 document.addEventListener('keydown', handleKeyPress); // 监听全屏状态变化 document.addEventListener('fullscreenchange', () => { if (document.fullscreenElement) { // 在全屏元素上添加键盘事件监听 document.fullscreenElement.addEventListener('keydown', handleKeyPress); } }); // 兼容不同浏览器的全屏事件 document.addEventListener('webkitfullscreenchange', () => { if (document.webkitFullscreenElement) { document.webkitFullscreenElement.addEventListener('keydown', handleKeyPress); } }); document.addEventListener('mozfullscreenchange', () => { if (document.mozFullScreenElement) { document.mozFullScreenElement.addEventListener('keydown', handleKeyPress); } }); document.addEventListener('MSFullscreenChange', () => { if (document.msFullscreenElement) { document.msFullscreenElement.addEventListener('keydown', handleKeyPress); } }); // 添加提示信息 const style = document.createElement('style'); style.textContent = ` .video-control-tips { position: fixed; bottom: 20px; right: 20px; background: rgba(0, 0, 0, 0.7); color: white; padding: 10px; border-radius: 5px; font-size: 14px; z-index: 9999; display: none; } `; document.head.appendChild(style); const tips = document.createElement('div'); tips.className = 'video-control-tips'; tips.innerHTML = ` 视频控制快捷键:
空格键 - 播放/暂停
← → - 快退/快进5秒
↑ ↓ - 音量增加/减少
N - 跳转下一集
F - 全屏 `; document.body.appendChild(tips); // 当视频存在时显示提示并设置相关功能 const observer = new MutationObserver(() => { const video = getVideoElement(); if (video) { // 显示提示 tips.style.display = 'block'; setTimeout(() => { tips.style.display = 'none'; }, 5000); // 视频加载完成后恢复播放进度 video.addEventListener('loadedmetadata', () => { restorePlaybackProgress(video); }); // 视频播放结束时自动跳转到下一集 video.addEventListener('ended', () => { playNextVideo(); }); // 定期保存播放进度(每5秒) setInterval(() => { if (!video.paused) { savePlaybackProgress(video); } }, 5000); // 页面关闭或切换前保存进度 window.addEventListener('beforeunload', () => { savePlaybackProgress(video); }); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true }); })();