网页视频控制4.0
// ==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 = `
视频控制快捷键:<br>
空格键 - 播放/暂停<br>
← → - 快退/快进5秒<br>
↑ ↓ - 音量增加/减少<br>
N - 跳转下一集<br>
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
});
})();