Greasy Fork is available in English.
滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节等
// ==UserScript== // @name 斗鱼(douyu)快捷操作 // @namespace hhh2000 // @version 0.4.2 // @description 滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节等 // @author hhh2000 // @match http*://www.douyu.com/* // @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, } function set_progress(selector, curr_percent, inc_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; //log(p, limit, bar_length, 128/100*p, bar_offset) return bar_offset; //百分比对应进度条位置 } // $('.controlbar-f41e38').removeClass('hide-6cf943') let e1 = new MouseEvent('mousedown'), e2 = new MouseEvent('mouseup') let rect = selector.getBoundingClientRect() let padding_top = +$(selector).css('padding-top').match(/\d+/)?.[0] let padding_bottom = +$(selector).css('padding-bottom').match(/\d+/)?.[0] let bar_offset = calc_bar_offset(curr_percent-inc_percent, (rect.height-padding_top-padding_bottom), limit_begin, limit_end) let clientY = rect.bottom - padding_bottom - bar_offset + 1 let o1 = calc_bar_offset(curr_percent, (rect.height-padding_top-padding_bottom), limit_begin, limit_end) let o2 = calc_bar_offset(curr_percent+inc_percent, (rect.height-padding_top-padding_bottom), limit_begin, limit_end) let o3 = calc_bar_offset(curr_percent-inc_percent, (rect.height-padding_top-padding_bottom), limit_begin, limit_end) // log(`当前音量:${curr_percent} 加音量${curr_percent+inc_percent} 减音量${curr_percent-inc_percent}`) // log(`当前距离:${o1} 加距离${o2} 减距离${o3}`) let percent = Math.max(Math.min(curr_percent - inc_percent, limit_end), limit_begin) let step = (rect.height-padding_top-padding_bottom)/(limit_end - limit_begin)/2 // 动态调整 for(let i=0; i<Math.abs(inc_percent*10); ++i){ //log(`------音量:${i}------`) //log(`原音量:${curr_percent}/${parseInt($('.tips-3df825').text().match(/\d+/))}`) e1.initMouseEvent('mousedown',1,1,window,1,0,0,0,clientY,0,0,0,0,0,null); e2.initMouseEvent('mouseup' ,1,1,window,1,0,0,0,clientY,0,0,0,0,0,null); selector.dispatchEvent(e1); selector.dispatchEvent(e2); let next_percent = parseInt($('.tips-3df825').text().match(/\d+/)) //log(`新音量:${percent}/${next_percent}/${$('.tips-3df825').text().match(/\d+/)}`) //log(`原音量:${percent} 新音量:${next_percent} 增减音量:${inc_percent} clientY: ${clientY} step: ${step}`) if(percent == next_percent) break else if(inc_percent > 0 && percent < next_percent) clientY += step else if(inc_percent < 0 && percent > next_percent) clientY -= step else break } } function adjust_progress(selector, inc_percent, range_bengin, range_end){ let e1 = new MouseEvent('mouseover'), e2 = new MouseEvent('mouseout') e1.initMouseEvent('mouseover',1,1,window,1,0,0,0,0,0,0,0,0,0,null) $('.volume-8e2726')?.[0]?.dispatchEvent(e1) $('.volume-silent-3eb726')?.[0]?.dispatchEvent(e1) //$('.VolumeBar-9010af').css('visibility', 'hidden') selector = $('.volume-bar-06542d')[0] const curr_percent = parseInt($('.tips-3df825').text().match(/\d+/)) set_progress(selector, curr_percent, parseInt(inc_percent), 0, 100) // $('.VolumeBar-9010af').css('visibility', 'visible') let t = $('.volume-bar-06542d').data('hhh_timeout') clearTimeout(t) t = setTimeout(()=>{ e2.initMouseEvent('mouseout',1,1,window,1,0,0,0,0,0,0,0,0,0,null) $('.volume-8e2726')?.[0]?.dispatchEvent(e2) $('.volume-silent-3eb726')?.[0]?.dispatchEvent(e2) }, 1000) $('.volume-bar-06542d').data('hhh_timeout', t) } //显示hint XXX 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') } } let log = console.log function dir(e) {console.dir(e)} function err(e) {console.error(e)} 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); } } //滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节 function run(){ log('douyu快捷操作加载完毕') $('.ActBase').hide() //非全屏滚轮音量调节 $('#__h5player').off('mousewheel.hhh_douyu').on('mousewheel.hhh_douyu',function(e){ let delta = e.originalEvent.wheelDelta if(delta >= 120){ //up adjust_progress($('.volume-bar-06542d')[0], -1, 0, 100) //volume-bar-06542d }else{ adjust_progress($('.volume-bar-06542d')[0], 1, 0, 100) } return false }) //功能键全屏 $('#__h5player').off('mousedown.hhh_douyu').on('mousedown.hhh_douyu',function(e){ if(e.buttons > 2){ $('.wfs-2a8e83, .wfs-exit-180268').not('.removed-9d4c42').click() return false } }) //快捷键 $('body').off('keydown.hhh_douyu').on('keydown.hhh_douyu',function(e){ if(e.keyCode === keycode['up'] || e.keyCode === keycode['down']){ //↑↓音量 if(e.keyCode === keycode['up']){ adjust_progress($('.volume-bar-06542d')[0], -5, 0, 100) }else{ adjust_progress($('.volume-bar-06542d')[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音量 //log($(e.originalEvent.path[0]).attr('type')) //log(e.originalEvent.path[0].nodeName) let nodenames = ['INPUT', 'TEXTAREA'] let nodetypes = ['text'] let path0_nodename = e.originalEvent.path[0].nodeName let path0_type = $(e.originalEvent.path[0]).attr('type') if(nodenames.includes(path0_nodename) === false || (path0_nodename === 'INPUT' && nodetypes.includes(path0_type) === false)){ //排除发送弹幕等情况 if(e.keyCode === keycode['NumPad_Decimal']){ adjust_progress($('.volume-bar-06542d')[0], -1, 0, 100) }else{ adjust_progress($('.volume-bar-06542d')[0], 1, 0, 100) } return false } }else if(e.keyCode === 'W'.charCodeAt()){ //W 网页全屏 $('.wfs-2a8e83, .wfs-exit-180268').not('.removed-9d4c42').click() }else if(e.keyCode === 'F'.charCodeAt()){ //W 全屏 $('.fs-781153, .fs-exit-b6e6a7').not('.removed-9d4c42').click() }else if(e.keyCode === 'Q'.charCodeAt()){ //W 隐藏右边框 $('.layout-Player-asidetoggleButton').click() }else if(e.keyCode === 'D'.charCodeAt()){ //D 开关弹幕 $('.showdanmu-42b0ac, .hidedanmu-5d54e2').not('.removed-9d4c42').click() } }) } waitForTrue(()=>$('#player-control-video').length>0, ()=>{ run() }) })();