Greasy Fork

Greasy Fork is available in English.

视频倍速快捷键

speed up/down video

目前为 2021-09-14 提交的版本。查看 最新版本

// ==UserScript==
// @name         视频倍速快捷键
// @version      0.7
// @description  speed up/down video
// @author       BlueSky
// @match        *://*.bilibili.com/*
// @match        *://*.netflix.com/*
// @match        *://*.youtube.com/*
// @grant        none
// @namespace http://greasyfork.icu/users/447360
// ==/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}`
      }
    }
  }
})();