🏠 Home 

Netflix长按倍速脚本

Netflix长按右箭头倍速播放

// ==UserScript==
// @license     AGPL License
// @name        Netflix长按倍速脚本
// @name:en     Netflix long press to speed up
// @namespace   Violentmonkey Scripts
// @match       https://www.netflix.com/*
// @run-at      document-start
// @grant       none
// @version     1.0
// @author      n1nja88888
// @description Netflix长按右箭头倍速播放
// @description:en Netflix long press Arrow Right to speed up
// ==/UserScript==
'use strict'
const speed = 2
const forward = 5
console.log('n1nja88888 creates this world!')
!function () {
//改变keydown事件监听器函数 忽略指定key
function keydownOmit(listener, omits) {
return (...args) => {
if (!omits.has(args[0].key))
listener(...args)
}
}
// netflix 是keydown下的div#appaMountpoint控制
Element.prototype._addEventListener = Element.prototype.addEventListener
Element.prototype.addEventListener = function (type, listener, useCapture = false) {
if (type === 'keydown')
listener = keydownOmit(listener, new Set(['ArrowLeft', 'ArrowRight']))
this._addEventListener(type, listener, useCapture)
}
}()
main()
function main() {
// 倍速定时器
let timer = null
//初始速度,松开按键后是恢复到初始速度
let initSpeed = -1
// 获取nefliex内嵌的player
let videoPlayer = null
let player = null
// 判断是否加速
let isSpeeding = false
// 复写keydown的事件监听器
document.addEventListener('keydown', (e) => {
if (isCombKey(e) || isActive('input', 'textarea') || !netflix)
return
videoPlayer = netflix.appContext.state.playerApp.getAPI().videoPlayer
const sessions = videoPlayer.getAllPlayerSessionIds()
player = videoPlayer.getVideoPlayerBySessionId(sessions[sessions.length - 1])
if (!player)
return
switch (e.key) {
case 'ArrowLeft':
player.seek(player.getCurrentTime() - forward * 1e3)
break
case 'ArrowRight':
if (!timer) {
timer = setTimeout(() => {
isSpeeding = true
player.play()
initSpeed = player.getPlaybackRate()
player.setPlaybackRate(speed)
}, 0.15e3)
}
break
}
})
document.addEventListener('keyup', (e) => {
if (e.key === 'ArrowRight') {
clearTimeout(timer)
timer = null
if (isSpeeding) {
isSpeeding = false
player.setPlaybackRate(initSpeed)
}
else
player.seek(player.getCurrentTime() + forward * 1e3)
}
})
}
// 判断是否是组合键
function isCombKey(e) {
return e.ctrlKey || e.shiftkey || e.altKey || e.metaKey
}
// 判断当前页面活动元素
function isActive(...eleSet) {
for (const ele of eleSet) {
if (ele instanceof HTMLElement) {
if (document.activeElement === ele)
return true
}
else {
switch (ele.charAt(0)) {
case '.':
if (document.activeElement.classList.contains(ele.substring(1)))
return true
break
case '#':
if (document.activeElement.id.toLowerCase() === ele.substring(1).toLowerCase())
return true
break
default:
if (document.activeElement.tagName.toLowerCase() === ele.toLowerCase())
return true
}
}
}
return false
}