youku快捷操作

滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节、←→快进快退改成5s、Ctrl+←→快进快退30s

目前為 2022-12-25 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         youku快捷操作
// @namespace    hhh2000
// @version      0.1
// @description  滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节、←→快进快退改成5s、Ctrl+←→快进快退30s
// @author       hhh2000
// @match        http*://v.youku.com/v_show/*
// @require      https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
// @run-at       document-end
// @grant        none
// @compatible   chrome
/* globals jQuery, $, waitForkeyElements */
/* eslint-disable no-multi-spaces, dot-notation */
/* eslint no-eval:0 */
// ==/UserScript==

'use strict';
(function() {
    function getkeyCode(k) {
        var keyCodes = {
            300: '滚↑轮',
            301: '滚↓轮',
            302: '鼠标左键',
            303: '鼠标右键',
            304: '鼠标中键',
            305: '鼠标左前侧键',
            306: '鼠标左后侧键',
            307: '鼠标右前侧键',
            308: '鼠标右后侧键',
            309: '鼠标中前侧键',
            310: '鼠标中后侧键',

            0: "",
            3: "break",
            8: "Backspace",
            9: "Tab",
            12: "Clear",
            13: "Enter",
            16: "Shift",
            17: "Ctrl",
            18: "Alt",
            19: "PauseBreak",
            20: "CapsLock",
            27: "Escape",
            32: "Space",
            33: "PageUp",
            34: "PageDown",
            35: "End",
            36: "Home",
            37: "←",   //LeftArrow ↑ ↓ ← →
            38: "↑",   //UpArrow
            39: "→",   //RightArrow
            40: "↓",   //DownArrow
            45: "Insert",
            46: "Delete",
            48: "0",
            49: "1",
            50: "2",
            51: "3",
            52: "4",
            53: "5",
            54: "6",
            55: "7",
            56: "8",
            57: "9",
            65: "A",
            66: "B",
            67: "C",
            68: "D",
            69: "E",
            70: "F",
            71: "G",
            72: "H",
            73: "I",
            74: "J",
            75: "K",
            76: "L",
            77: "M",
            78: "N",
            79: "O",
            80: "P",
            81: "Q",
            82: "R",
            83: "S",
            84: "T",
            85: "U",
            86: "V",
            87: "W",
            88: "X",
            89: "Y",
            90: "Z",
            93: "ContextMenu",
            96: "NumPad0",
            97: "NumPad1",
            98: "NumPad2",
            99: "NumPad3",
            100: "NumPad4",
            101: "NumPad5",
            102: "NumPad6",
            103: "NumPad7",
            104: "NumPad8",
            105: "NumPad9",
            106: "NumPad_Multiply",
            107: "NumPad_Add",
            108: "NumPad_Separator",
            109: "NumPad_Subtract",
            110: "NumPad_Decimal",
            111: "NumPad_Divide",
            112: "F1",
            113: "F2",
            114: "F3",
            115: "F4",
            116: "F5",
            117: "F6",
            118: "F7",
            119: "F8",
            120: "F9",
            121: "F10",
            122: "F11",
            123: "F12",
            124: "F13",
            125: "F14",
            126: "F15",
            127: "F16",
            128: "F17",
            129: "F18",
            130: "F19",
            144: "NumLock",
            145: "ScrollLock",
            166: "BrowserBack",
            167: "BrowserForward",
            170: "BrowserSearch",
            172: "BrowserHome",
            173: "AudioVolumeMute",
            174: "AudioVolumeDown",
            175: "AudioVolumeUp",
            176: "MediaTrackNext",
            177: "MediaTrackPrevious",
            178: "MediaStop",
            179: "MediaPlayPause",
            180: "LaunchMail",
            181: "LaunchMediaPlayer",
            183: "LaunchApp2",
            186: ";",
            187: "=",
            188: ",",
            189: "-",
            190: ".",
            191: "/",
            192: "`",
            193: "ABNT_C1",
            194: "ABNT_C2",
            219: "[",
            220: "\\",
            221: "]",
            222: "'",
            223: "OEM_8",
            226: "OEM_102",
            229: "KeyInComposition",
        };
        return keyCodes[k];
    }
    let keycode = {
        'Enter': 13,
        'Ctrl': 17,
        'Esc': 27,
        'left': 37,
        'right': 39,
        'up': 38,
        'down': 40,
        'space': 32,
        'NumPad0': 96,
        'NumPad_Decimal': 110,
    }
    let h5Player

    let log = console.log
    let dir = console.dir
    let err = console.error
    function waitForTrue(ifTrue, callback, time=100) {
        if(--time < 0) {err('waitForTrue 超时 '+ifTrue); return false;}
        const fn = waitForTrue;
        //let fn = arguments.callee;
        if (ifTrue()) {
            callback(); return true;
        } else {
            setTimeout(function() { fn(ifTrue, callback, time); }, 50);
        }
    }
    function geth5Player(){ return $('video')[0] }

    function set_progress(selector, percent, limit_begin, limit_end){

        function calc_bar_offset(percent, bar_length, limit_begin, limit_end){
            let p = Math.max(Math.min(+percent, limit_end), limit_begin);
            let limit = limit_end - limit_begin;
            let bar_offset = (p-limit_begin) * bar_length / limit;
            //console.log(p, limit, bar_offset)
            //return Math.round(bar_offset);  //百分比对应进度条位置
            return bar_offset;  //百分比对应进度条位置
        }

        $('.kui-dashboard-dashboard-panel').css('display','flex')
        $('.kui-volumecontrol-').addClass('kui-s-hover')

        let e = new MouseEvent('click')

        let rect = selector.getBoundingClientRect()
        //console.log(rect)
        //console.log(percent, rect.bottom-rect.top, limit_begin, limit_end)
        let bar_offset = calc_bar_offset(percent, rect.bottom-rect.top, limit_begin, limit_end)
        let clientY = rect.bottom - bar_offset
        //console.log(bar_offset+' - '+clientY)
        e.initMouseEvent('click',1,1,window,1,0,0,0,clientY+0.5,0,0,0,0,0,null)
        selector.dispatchEvent(e)

        $('.kui-volumecontrol-').removeClass('kui-s-hover')
        $('.kui-dashboard-dashboard-panel').css('display','')
    }

    function adjust_progress(selector, inc_percent, range_bengin, range_end){
        const curr_percent = parseInt($('#volume-tip').text())
        //console.log(curr_percent,inc_percent,(curr_percent+parseInt(inc_percent)))
        set_progress(selector, curr_percent+parseInt(inc_percent), 0, 100)
    }

    //显示hint
    function cut_InfoDisappear(){
        if($('.kui-message-information-item').css('animation-name') === 'InfoDisappear'){
            $('.kui-message-information-item').css('animation-name', 'InfoDisappear1')
        }else{
            $('.kui-message-information-item').css('animation-name', 'InfoDisappear')
        }
    }

    function select_rate(diff){
        let rate_text = ['0.5X','1.0X','1.25X','1.5X','2.0X']
        let curr_rate_text = $('.kui-playrate-rate-item[style*=color]').text()
        //console.log(curr_rate_text)
        let rate_index = rate_text.indexOf(curr_rate_text) + diff
        rate_index = Math.min(Math.max(rate_index, 0), rate_text.length-1)
        //console.log(rate_index)
        $(`.kui-playrate-rate-item:contains(${rate_text[rate_index]})`).click()
        $('.kui-message-information-item .kui-message-information-text').text(`${rate_text[rate_index]}`)
        //curr_rate_text = $('.kui-playrate-rate-item[style*=color]').text()
        //console.log(curr_rate_text)
    }

    function setCurrentTime(second){
        h5Player = geth5Player()
        h5Player.currentTime = h5Player.currentTime + second;
    }

    //滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节、←→快进快退改成5s、Ctrl+←→快进快退30s
    function run(){
        log('youku快捷操作加载完毕')
        h5Player = geth5Player()
        let keystrokes = 0

        //非全屏滚轮音量调节
        $('#player').off('mousewheel.hhh_youku').on('mousewheel.hhh_youku',function(e){
            let delta = e.originalEvent.wheelDelta
            if(delta >= 120){  //up
                adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], 1, 0, 100)
            }else{
                adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], -1, 0, 100)
            }
            return false
        })

        //功能键全屏
        $('#player').off('mousedown.hhh_youku').on('mousedown.hhh_youku',function(e){
            if(e.buttons > 2){
                $('.kui-webfullscreen-icon-0').click()
                return false
            }
        })

        //======快捷键======
        $('body').off('keyup.hhh_youku').on('keyup.hhh_youku',function(e){
            if(e.ctrlKey && (e.keyCode === keycode['left'] || e.keyCode === keycode['right'])){  //←→ +/-30s
                return false
            }

            if(e.keyCode === keycode['left'] || e.keyCode === keycode['right']){  //←→ +/-5s
                //log('keystrokes: ',keystrokes)
                if(e.keyCode === keycode['right'] && keystrokes > 1){
                    keystrokes = 0
                    return
                }
                keystrokes = 0
                let secode = e.keyCode === keycode['left'] ? 5 : -10
                setCurrentTime(secode)
                h5Player.play()
                //h5Player.playbackRate = 1
                //return false
            }
        })

        $('body').off('keydown.hhh_youku').on('keydown.hhh_youku',function(e){
            //---功能键---
            if(e.ctrlKey && (e.keyCode === keycode['up'] || e.keyCode === keycode['down'])){  //Ctrl+↑↓ 视频速度
                if(e.keyCode === keycode['up']){
                    select_rate(1)
                }else{
                    select_rate(-1)
                }
                return false
            }else if(e.ctrlKey && (e.keyCode === keycode['left'] || e.keyCode === keycode['right'])){  //Ctrl+←→ +/-30s
                let secode = e.keyCode === keycode['left'] ? -30 : 30
                setCurrentTime(secode)
                h5Player.play();
                return false
            }

            if(e.ctrlKey || e.shiftKey || e.altKey) return;

            //---非功能键---
            if(e.keyCode === keycode['up'] || e.keyCode === keycode['down']){  //↑↓音量
                if(e.keyCode === keycode['up']){
                    adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], 5, 0, 100)
                }else{
                    adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], -5, 0, 100)
                }
                //$('.kui-message-information-text font').text($('#volume-tip').text())  //set hint text
                //cut_InfoDisappear()
                return false
            }else if(e.keyCode === keycode['NumPad_Decimal'] || e.keyCode === keycode['NumPad0']){  //NumPad_Decimal numpad1音量
                if(e.keyCode === keycode['NumPad_Decimal']){
                    adjust_progress($('.kui-volumecontrol-volume-dashboard')[0], -1, 0, 100)
                }else{
                    adjust_progress($('.kui-volumecontrol-volume-dashboard')[0], 1, 0, 100)
                }
                return false
            }else if(e.keyCode === keycode['right']){  //
                ++keystrokes
                //if(keystrokes === 1) return false
            }else if(e.keyCode === 'W'.charCodeAt()){  //W 网页全屏
                $('.kui-webfullscreen-icon-0').click()
            }else if(e.keyCode === 'Q'.charCodeAt()){  //W 宽屏
                $('.iconzhankaijiantou-shang, .iconzhankaijiantou-xia').click()
            }else if(e.keyCode === 'D'.charCodeAt()){  //D 开关弹幕
                $('.switch-img_12hDa:first').click()
            }
        })
    }

    waitForTrue(()=>$('#kui_dashboard_volume-control_volumeSlider').length>0, ()=>{
        run()
    })

})();