// ==UserScript== // @name 视频倍速快捷键 // @version 0.7 // @description speed up/down video // @author BlueSky // @match *://*.bilibili.com/* // @match *://*.netflix.com/* // @match *://*.youtube.com/* // @grant none // @namespace https://greasyfork.org/users/447360 // @downloadURL none // ==/UserScript== (function () { 'use strict'; const configMap = { bilibili: { titleSelectors: [ 'div.bilibili-player-video-top-title', 'span.tit', ], videoSelector: 'bwp-video', }, netflix: { titleSelectors: [ '.ellipsize-text h4', ], videoSelector: 'video', }, youtube: { titleSelectors: [ '.ytp-title-link.yt-uix-sessionlink.ytp-title-fullerscreen-link', 'h1 > yt-formatted-string.style-scope.ytd-video-primary-info-renderer' ], videoSelector: 'video', }, } let rate = 1 let titleSelectors = [] let videoSelector = 'video' const siteName = location.hostname.split('.')[1] const config = configMap[siteName] if (config) { console.debug(`found config for ${siteName}:`, config) titleSelectors = config.titleSelectors videoSelector = config.videoSelector } window.addEventListener('keydown', (e) => { if (e.key === '`') { rate = 0.5 } else { if ((/youtube/.test(location.hostname))) { if (e.key === ']' && rate < 16) { rate += 0.5 } else if (e.key === '[' && rate > 0.25) { rate -= 0.5 } else { return } } else { if (e.key === ']' && rate < 16) { rate += 0.25 } else if (e.key === '[' && rate > 0.25) { rate -= 0.25 } else if (e.key === '=' && rate < 16) { rate += 0.5 } else if (e.key === '-' && rate > 0.5) { rate -= 0.5 } else if (e.key === '1') { rate = 1 } else if (e.key === '2') { rate = 2 } else if (e.key === '3') { rate = 3 } else if (e.key === '4') { rate = 4 } else { return } } } setVideoRate() setVideoTitle() }) function getTitle() { return titleSelectors .map(selector => document.querySelector(selector)) .filter(el => el && el.innerText) .map(el => el.innerText)[0] } function setVideoRate() { console.debug(`rate: ${rate}x`) const el = document.querySelector(videoSelector) if (el) { el.playbackRate = rate } } function setVideoTitle() { const title = (getTitle() || '').replace(/^\[.*\] /, '') for (const selector of titleSelectors) { const el = document.querySelector(selector) if (el) { el.innerHTML = `[${rate}x] ${title}` } } } })();