// ==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()
})
})();