优酷(youku)快捷操作

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

  1. // ==UserScript==
  2. // @name 优酷(youku)快捷操作
  3. // @namespace hhh2000
  4. // @version 0.1
  5. // @description 滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节、←→快进快退改成5s、Ctrl+←→快进快退30s
  6. // @author hhh2000
  7. // @match http*://v.youku.com/v_show/*
  8. // @require https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
  9. // @run-at document-end
  10. // @grant none
  11. // @compatible chrome
  12. /* globals jQuery, $, waitForkeyElements */
  13. /* eslint-disable no-multi-spaces, dot-notation */
  14. /* eslint no-eval:0 */
  15. // ==/UserScript==
  16.  
  17. 'use strict';
  18. (function() {
  19. function getkeyCode(k) {
  20. var keyCodes = {
  21. 300: '滚↑轮',
  22. 301: '滚↓轮',
  23. 302: '鼠标左键',
  24. 303: '鼠标右键',
  25. 304: '鼠标中键',
  26. 305: '鼠标左前侧键',
  27. 306: '鼠标左后侧键',
  28. 307: '鼠标右前侧键',
  29. 308: '鼠标右后侧键',
  30. 309: '鼠标中前侧键',
  31. 310: '鼠标中后侧键',
  32.  
  33. 0: "",
  34. 3: "break",
  35. 8: "Backspace",
  36. 9: "Tab",
  37. 12: "Clear",
  38. 13: "Enter",
  39. 16: "Shift",
  40. 17: "Ctrl",
  41. 18: "Alt",
  42. 19: "PauseBreak",
  43. 20: "CapsLock",
  44. 27: "Escape",
  45. 32: "Space",
  46. 33: "PageUp",
  47. 34: "PageDown",
  48. 35: "End",
  49. 36: "Home",
  50. 37: "←", //LeftArrow ↑ ↓ ← →
  51. 38: "↑", //UpArrow
  52. 39: "→", //RightArrow
  53. 40: "↓", //DownArrow
  54. 45: "Insert",
  55. 46: "Delete",
  56. 48: "0",
  57. 49: "1",
  58. 50: "2",
  59. 51: "3",
  60. 52: "4",
  61. 53: "5",
  62. 54: "6",
  63. 55: "7",
  64. 56: "8",
  65. 57: "9",
  66. 65: "A",
  67. 66: "B",
  68. 67: "C",
  69. 68: "D",
  70. 69: "E",
  71. 70: "F",
  72. 71: "G",
  73. 72: "H",
  74. 73: "I",
  75. 74: "J",
  76. 75: "K",
  77. 76: "L",
  78. 77: "M",
  79. 78: "N",
  80. 79: "O",
  81. 80: "P",
  82. 81: "Q",
  83. 82: "R",
  84. 83: "S",
  85. 84: "T",
  86. 85: "U",
  87. 86: "V",
  88. 87: "W",
  89. 88: "X",
  90. 89: "Y",
  91. 90: "Z",
  92. 93: "ContextMenu",
  93. 96: "NumPad0",
  94. 97: "NumPad1",
  95. 98: "NumPad2",
  96. 99: "NumPad3",
  97. 100: "NumPad4",
  98. 101: "NumPad5",
  99. 102: "NumPad6",
  100. 103: "NumPad7",
  101. 104: "NumPad8",
  102. 105: "NumPad9",
  103. 106: "NumPad_Multiply",
  104. 107: "NumPad_Add",
  105. 108: "NumPad_Separator",
  106. 109: "NumPad_Subtract",
  107. 110: "NumPad_Decimal",
  108. 111: "NumPad_Divide",
  109. 112: "F1",
  110. 113: "F2",
  111. 114: "F3",
  112. 115: "F4",
  113. 116: "F5",
  114. 117: "F6",
  115. 118: "F7",
  116. 119: "F8",
  117. 120: "F9",
  118. 121: "F10",
  119. 122: "F11",
  120. 123: "F12",
  121. 124: "F13",
  122. 125: "F14",
  123. 126: "F15",
  124. 127: "F16",
  125. 128: "F17",
  126. 129: "F18",
  127. 130: "F19",
  128. 144: "NumLock",
  129. 145: "ScrollLock",
  130. 166: "BrowserBack",
  131. 167: "BrowserForward",
  132. 170: "BrowserSearch",
  133. 172: "BrowserHome",
  134. 173: "AudioVolumeMute",
  135. 174: "AudioVolumeDown",
  136. 175: "AudioVolumeUp",
  137. 176: "MediaTrackNext",
  138. 177: "MediaTrackPrevious",
  139. 178: "MediaStop",
  140. 179: "MediaPlayPause",
  141. 180: "LaunchMail",
  142. 181: "LaunchMediaPlayer",
  143. 183: "LaunchApp2",
  144. 186: ";",
  145. 187: "=",
  146. 188: ",",
  147. 189: "-",
  148. 190: ".",
  149. 191: "/",
  150. 192: "`",
  151. 193: "ABNT_C1",
  152. 194: "ABNT_C2",
  153. 219: "[",
  154. 220: "\\",
  155. 221: "]",
  156. 222: "'",
  157. 223: "OEM_8",
  158. 226: "OEM_102",
  159. 229: "KeyInComposition",
  160. };
  161. return keyCodes[k];
  162. }
  163. let keycode = {
  164. 'Enter': 13,
  165. 'Ctrl': 17,
  166. 'Esc': 27,
  167. 'left': 37,
  168. 'right': 39,
  169. 'up': 38,
  170. 'down': 40,
  171. 'space': 32,
  172. 'NumPad0': 96,
  173. 'NumPad_Decimal': 110,
  174. }
  175. let h5Player
  176.  
  177. let log = console.log
  178. let dir = console.dir
  179. let err = console.error
  180. function waitForTrue(ifTrue, callback, time=100) {
  181. if(--time < 0) {err('waitForTrue 超时 '+ifTrue); return false;}
  182. const fn = waitForTrue;
  183. //let fn = arguments.callee;
  184. if (ifTrue()) {
  185. callback(); return true;
  186. } else {
  187. setTimeout(function() { fn(ifTrue, callback, time); }, 50);
  188. }
  189. }
  190. function geth5Player(){ return $('video')[0] }
  191.  
  192. function set_progress(selector, percent, limit_begin, limit_end){
  193.  
  194. function calc_bar_offset(percent, bar_length, limit_begin, limit_end){
  195. let p = Math.max(Math.min(+percent, limit_end), limit_begin);
  196. let limit = limit_end - limit_begin;
  197. let bar_offset = (p-limit_begin) * bar_length / limit;
  198. //console.log(p, limit, bar_offset)
  199. //return Math.round(bar_offset); //百分比对应进度条位置
  200. return bar_offset; //百分比对应进度条位置
  201. }
  202.  
  203. $('.kui-dashboard-dashboard-panel').css('display','flex')
  204. $('.kui-volumecontrol-').addClass('kui-s-hover')
  205.  
  206. let e = new MouseEvent('click')
  207.  
  208. let rect = selector.getBoundingClientRect()
  209. //console.log(rect)
  210. //console.log(percent, rect.bottom-rect.top, limit_begin, limit_end)
  211. let bar_offset = calc_bar_offset(percent, rect.bottom-rect.top, limit_begin, limit_end)
  212. let clientY = rect.bottom - bar_offset
  213. //console.log(bar_offset+' - '+clientY)
  214. e.initMouseEvent('click',1,1,window,1,0,0,0,clientY+0.5,0,0,0,0,0,null)
  215. selector.dispatchEvent(e)
  216.  
  217. $('.kui-volumecontrol-').removeClass('kui-s-hover')
  218. $('.kui-dashboard-dashboard-panel').css('display','')
  219. }
  220.  
  221. function adjust_progress(selector, inc_percent, range_bengin, range_end){
  222. const curr_percent = parseInt($('#volume-tip').text())
  223. //console.log(curr_percent,inc_percent,(curr_percent+parseInt(inc_percent)))
  224. set_progress(selector, curr_percent+parseInt(inc_percent), 0, 100)
  225. }
  226.  
  227. //显示hint
  228. function cut_InfoDisappear(){
  229. if($('.kui-message-information-item').css('animation-name') === 'InfoDisappear'){
  230. $('.kui-message-information-item').css('animation-name', 'InfoDisappear1')
  231. }else{
  232. $('.kui-message-information-item').css('animation-name', 'InfoDisappear')
  233. }
  234. }
  235.  
  236. function select_rate(diff){
  237. let rate_text = ['0.5X','1.0X','1.25X','1.5X','2.0X']
  238. let curr_rate_text = $('.kui-playrate-rate-item[style*=color]').text()
  239. //console.log(curr_rate_text)
  240. let rate_index = rate_text.indexOf(curr_rate_text) + diff
  241. rate_index = Math.min(Math.max(rate_index, 0), rate_text.length-1)
  242. //console.log(rate_index)
  243. $(`.kui-playrate-rate-item:contains(${rate_text[rate_index]})`).click()
  244. $('.kui-message-information-item .kui-message-information-text').text(`${rate_text[rate_index]}`)
  245. //curr_rate_text = $('.kui-playrate-rate-item[style*=color]').text()
  246. //console.log(curr_rate_text)
  247. }
  248.  
  249. function setCurrentTime(second){
  250. h5Player = geth5Player()
  251. h5Player.currentTime = h5Player.currentTime + second;
  252. }
  253.  
  254. //滚轮音量调节;鼠标功能键全屏;快捷键:开关弹幕D、网页全屏W、隐藏有边框Q、↑↓键音量调节、←→快进快退改成5s、Ctrl+←→快进快退30s
  255. function run(){
  256. log('youku快捷操作加载完毕')
  257. h5Player = geth5Player()
  258. let keystrokes = 0
  259.  
  260. //非全屏滚轮音量调节
  261. $('#player').off('mousewheel.hhh_youku').on('mousewheel.hhh_youku',function(e){
  262. let delta = e.originalEvent.wheelDelta
  263. if(delta >= 120){ //up
  264. adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], 1, 0, 100)
  265. }else{
  266. adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], -1, 0, 100)
  267. }
  268. return false
  269. })
  270.  
  271. //功能键全屏
  272. $('#player').off('mousedown.hhh_youku').on('mousedown.hhh_youku',function(e){
  273. if(e.buttons > 2){
  274. $('.kui-webfullscreen-icon-0').click()
  275. return false
  276. }
  277. })
  278.  
  279. //======快捷键======
  280. $('body').off('keyup.hhh_youku').on('keyup.hhh_youku',function(e){
  281. if(e.ctrlKey && (e.keyCode === keycode['left'] || e.keyCode === keycode['right'])){ //←→ +/-30s
  282. return false
  283. }
  284.  
  285. if(e.keyCode === keycode['left'] || e.keyCode === keycode['right']){ //←→ +/-5s
  286. //log('keystrokes: ',keystrokes)
  287. if(e.keyCode === keycode['right'] && keystrokes > 1){
  288. keystrokes = 0
  289. return
  290. }
  291. keystrokes = 0
  292. let secode = e.keyCode === keycode['left'] ? 5 : -10
  293. setCurrentTime(secode)
  294. h5Player.play()
  295. //h5Player.playbackRate = 1
  296. //return false
  297. }
  298. })
  299.  
  300. $('body').off('keydown.hhh_youku').on('keydown.hhh_youku',function(e){
  301. //---功能键---
  302. if(e.ctrlKey && (e.keyCode === keycode['up'] || e.keyCode === keycode['down'])){ //Ctrl+↑↓ 视频速度
  303. if(e.keyCode === keycode['up']){
  304. select_rate(1)
  305. }else{
  306. select_rate(-1)
  307. }
  308. return false
  309. }else if(e.ctrlKey && (e.keyCode === keycode['left'] || e.keyCode === keycode['right'])){ //Ctrl+←→ +/-30s
  310. let secode = e.keyCode === keycode['left'] ? -30 : 30
  311. setCurrentTime(secode)
  312. h5Player.play();
  313. return false
  314. }
  315.  
  316. if(e.ctrlKey || e.shiftKey || e.altKey) return;
  317.  
  318. //---非功能键---
  319. if(e.keyCode === keycode['up'] || e.keyCode === keycode['down']){ //↑↓音量
  320. if(e.keyCode === keycode['up']){
  321. adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], 5, 0, 100)
  322. }else{
  323. adjust_progress($('#kui_dashboard_volume-control_volumeSlider')[0], -5, 0, 100)
  324. }
  325. //$('.kui-message-information-text font').text($('#volume-tip').text()) //set hint text
  326. //cut_InfoDisappear()
  327. return false
  328. }else if(e.keyCode === keycode['NumPad_Decimal'] || e.keyCode === keycode['NumPad0']){ //NumPad_Decimal numpad1音量
  329. if(e.keyCode === keycode['NumPad_Decimal']){
  330. adjust_progress($('.kui-volumecontrol-volume-dashboard')[0], -1, 0, 100)
  331. }else{
  332. adjust_progress($('.kui-volumecontrol-volume-dashboard')[0], 1, 0, 100)
  333. }
  334. return false
  335. }else if(e.keyCode === keycode['right']){ //
  336. ++keystrokes
  337. //if(keystrokes === 1) return false
  338. }else if(e.keyCode === 'W'.charCodeAt()){ //W 网页全屏
  339. $('.kui-webfullscreen-icon-0').click()
  340. }else if(e.keyCode === 'Q'.charCodeAt()){ //W 宽屏
  341. $('.iconzhankaijiantou-shang, .iconzhankaijiantou-xia').click()
  342. }else if(e.keyCode === 'D'.charCodeAt()){ //D 开关弹幕
  343. $('.switch-img_12hDa:first').click()
  344. }
  345. })
  346. }
  347.  
  348. waitForTrue(()=>$('#kui_dashboard_volume-control_volumeSlider').length>0, ()=>{
  349. run()
  350. })
  351.  
  352. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址