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
}