diff --git a/min/keymap.min.js b/min/keymap.min.js index 3baaee0f7..40d147592 100644 --- a/min/keymap.min.js +++ b/min/keymap.min.js @@ -1 +1 @@ -(()=>(e,i)=>{const t=["https://www.bilibili.com/bangumi/","https://www.bilibili.com/video/","https://www.bilibili.com/cheese/","https://www.bilibili.com/watchlater/","https://www.bilibili.com/medialist/play/","https://www.bilibili.com/festival/2021bnj"];let o=undefined;if(t.some((e=>document.URL.startsWith(e)))){const t=e=>()=>{if(typeof e==="string"){var i;(i=dq(e))===null||i===void 0?void 0:i.click()}else{e.click()}};const n=e=>()=>{const i=dq(".bilibili-player-video video");if(!i||!unsafeWindow.player){return}unsafeWindow.player.seek(i.currentTime+e,i.paused)};let a;const l=(e,i)=>{let t=dq(".keymap-tip");if(!t){const o=dq(".bilibili-player-video-wrap");if(!o){return}o.insertAdjacentHTML("afterbegin",`\n
\n\n
${e}
\n
\n`);t=dq(".keymap-tip")}t.innerHTML=e;const o=dq(".keymap-tip-container");const n=dq(o,".mdi");n.classList.remove(...n.classList.values());n.classList.add("mdi",i);if(a){clearTimeout(a)}o.classList.add("show");a=window.setTimeout((()=>{o.classList.remove("show")}),2e3)};const s=e=>async()=>{const{VideoSpeedController:t}=await i.importAsync("video-speed-controller");const o=await t.getInstance();e(o,t.supportedRates);l(`${o.playbackRate}x`,"mdi-fast-forward")};const r={fullscreen:t(".bilibili-player-video-btn-fullscreen"),webFullscreen:t(".bilibili-player-video-web-fullscreen"),wideScreen:t(".bilibili-player-video-btn-widescreen"),volumeUp:()=>{const e=unsafeWindow.player.volume();unsafeWindow.player.volume(e+.1);l(`${Math.round(unsafeWindow.player.volume()*100)}%`,"mdi-volume-high")},volumeDown:()=>{const e=unsafeWindow.player.volume();unsafeWindow.player.volume(e-.1);const i=Math.round(unsafeWindow.player.volume()*100);if(i===0){l("静音","mdi-volume-off")}else{l(`${i}%`,"mdi-volume-high")}},mute:()=>{t(".bilibili-player-video-btn-volume .bilibili-player-iconfont-volume")();const e=unsafeWindow.player.isMute();if(e){l("已静音","mdi-volume-off")}else{l("已取消静音","mdi-volume-high")}},pictureInPicture:t(".bilibili-player-video-btn-pip"),coin:t(".video-toolbar .coin,.tool-bar .coin-info, .video-toolbar-module .coin-box, .play-options-ul > li:nth-child(2)"),favorite:t(".video-toolbar .collect, .video-toolbar-module .fav-box, .play-options-ul > li:nth-child(3)"),pause:t(".bilibili-player-video-btn-start"),like:(()=>{let e=true;return({isWatchlater:i,isMediaList:t,event:o})=>{if(t||i){const e=dq(".play-options-ul > li:first-child");if(e){e.click()}}else{const i=dq(".video-toolbar .like, .tool-bar .like-info");o.preventDefault();const t=(e,t)=>{const o=new CustomEvent(e,t);i.dispatchEvent(o)};e=true;setTimeout((()=>e=false),200);t("mousedown",o);document.body.addEventListener("keyup",(i=>{i.preventDefault();t("mouseup",i);if(e){t("click",i)}}),{once:true})}}})(),danmaku:()=>{const e=dq(".bilibili-player-video-danmaku-switch input");if(!e){return}e.checked=!e.checked;raiseEvent(e,"change")},longJumpBackward:n(-e.keymapJumpSeconds),longJumpForward:n(e.keymapJumpSeconds),jumpBackward:n(-5),jumpForward:n(5),playerMenu:()=>{const e=dq(".bilibili-player-video-wrap");if(!e){return}const i=e.getBoundingClientRect();e.dispatchEvent(new MouseEvent("contextmenu",{bubbles:true,cancelable:false,view:unsafeWindow,button:2,buttons:0,clientX:i.x+i.width/2-176.65/2,clientY:i.y+i.height/2-194/2}))},watchlater:t(".video-toolbar .ops .watchlater, .more-ops-list .ops-watch-later, .video-toolbar-module .see-later-box"),quickFavorite:t(".quick-favorite"),videoSpeedIncrease:s(((e,i)=>{e.setVideoSpeed(i.find((i=>i>e.playbackRate))||i[i.length-1])})),videoSpeedDecrease:s(((e,i)=>{e.setVideoSpeed([...i].reverse().find((i=>i{e.toggleVideoSpeed()})),videoSpeedForget:s((e=>{e.reset(true)})),takeScreenshot:t(".video-take-screenshot"),previousFrame:t(".prev-frame"),nextFrame:t(".next-frame"),seekBegin:()=>{if(!unsafeWindow.player){return}unsafeWindow.player.play();setTimeout((()=>{unsafeWindow.player.seek(0);const e=dq(".bilibili-player-video-toast-bottom .bilibili-player-video-toast-item:first-child .bilibili-player-video-toast-item-text span:nth-child(2)");if(e){e.textContent=" 00:00"}}))}};const d={fullscreen:"f",webFullscreen:"w",wideScreen:"t",volumeUp:"arrowUp",volumeDown:"arrowDown",mute:"m",pictureInPicture:"p",coin:"c",favorite:"s",pause:"space",like:"l",playerMenu:"`",longJumpForward:"j",longJumpBackward:"shift j",jumpBackward:"arrowLeft",jumpForward:"arrowRight",watchlater:"shift w",quickFavorite:"shift s",danmaku:"d",videoSpeedIncrease:"shift > 》 arrowUp",videoSpeedDecrease:"shift < 《 arrowDown",videoSpeedReset:"shift ? ?",videoSpeedForget:"shift : :",takeScreenshot:"ctrl alt c",previousFrame:"shift arrowLeft",nextFrame:"shift arrowRight",seekBegin:"0"};const c=e=>Object.entries(e).map((([e,i])=>{const t=i.split(" ");return{keys:t,action:r[e]||(()=>{})}}));(async()=>{const{loadKeyBindings:t}=await i.importAsync("key-bindings");const{presets:n}=await i.importAsync("key-binding-presets");addSettingsListener("keymapPreset",(()=>{const i=n[e.keymapPreset]||{};const a=c({...d,...i,...e.customKeyBindings});if(o){console.log("load preset",e.keymapPreset);o.bindings=a}else{o=t(a)}}),true);i.applyImportantStyle("keymapStyle")})()}return{reload:()=>o&&(o.enable=true),unload:()=>o&&(o.enable=false)}})(); \ No newline at end of file +(()=>(e,i)=>{const t=["https://www.bilibili.com/bangumi/","https://www.bilibili.com/video/","https://www.bilibili.com/cheese/","https://www.bilibili.com/watchlater/","https://www.bilibili.com/medialist/play/","https://www.bilibili.com/festival/2021bnj"];let o=undefined;if(t.some((e=>document.URL.startsWith(e)))){const t=e=>({event:i})=>{const t=new MouseEvent("click",{..._.pick(i,"ctrlKey","shiftKey","altKey","metaKey")});if(typeof e==="string"){var o;(o=dq(e))===null||o===void 0?void 0:o.dispatchEvent(t)}else{e.dispatchEvent(t)}};const n=e=>()=>{const i=dq(".bilibili-player-video video");if(!i||!unsafeWindow.player){return}unsafeWindow.player.seek(i.currentTime+e,i.paused)};let a;const l=(e,i)=>{let t=dq(".keymap-tip");if(!t){const o=dq(".bilibili-player-video-wrap");if(!o){return}o.insertAdjacentHTML("afterbegin",`\n
\n\n
${e}
\n
\n`);t=dq(".keymap-tip")}t.innerHTML=e;const o=dq(".keymap-tip-container");const n=dq(o,".mdi");n.classList.remove(...n.classList.values());n.classList.add("mdi",i);if(a){clearTimeout(a)}o.classList.add("show");a=window.setTimeout((()=>{o.classList.remove("show")}),2e3)};const s=e=>async()=>{const{VideoSpeedController:t}=await i.importAsync("video-speed-controller");const o=await t.getInstance();e(o,t.supportedRates);l(`${o.playbackRate}x`,"mdi-fast-forward")};const r={fullscreen:t(".bilibili-player-video-btn-fullscreen"),webFullscreen:t(".bilibili-player-video-web-fullscreen"),wideScreen:t(".bilibili-player-video-btn-widescreen"),volumeUp:()=>{const e=unsafeWindow.player.volume();unsafeWindow.player.volume(e+.1);l(`${Math.round(unsafeWindow.player.volume()*100)}%`,"mdi-volume-high")},volumeDown:()=>{const e=unsafeWindow.player.volume();unsafeWindow.player.volume(e-.1);const i=Math.round(unsafeWindow.player.volume()*100);if(i===0){l("静音","mdi-volume-off")}else{l(`${i}%`,"mdi-volume-high")}},mute:e=>{t(".bilibili-player-video-btn-volume .bilibili-player-iconfont-volume")(e);const i=unsafeWindow.player.isMute();if(i){l("已静音","mdi-volume-off")}else{l("已取消静音","mdi-volume-high")}},pictureInPicture:t(".bilibili-player-video-btn-pip"),coin:t(".video-toolbar .coin,.tool-bar .coin-info, .video-toolbar-module .coin-box, .play-options-ul > li:nth-child(2)"),favorite:t(".video-toolbar .collect, .video-toolbar-module .fav-box, .play-options-ul > li:nth-child(3)"),pause:t(".bilibili-player-video-btn-start"),like:(()=>{let e=true;return({isWatchlater:i,isMediaList:t,event:o})=>{if(t||i){const e=dq(".play-options-ul > li:first-child");if(e){e.click()}}else{const i=dq(".video-toolbar .like, .tool-bar .like-info");o.preventDefault();const t=(e,t)=>{const o=new CustomEvent(e,t);i.dispatchEvent(o)};e=true;setTimeout((()=>e=false),200);t("mousedown",o);document.body.addEventListener("keyup",(i=>{i.preventDefault();t("mouseup",i);if(e){t("click",i)}}),{once:true})}}})(),danmaku:()=>{const e=dq(".bilibili-player-video-danmaku-switch input");if(!e){return}e.checked=!e.checked;raiseEvent(e,"change")},longJumpBackward:n(-e.keymapJumpSeconds),longJumpForward:n(e.keymapJumpSeconds),jumpBackward:n(-5),jumpForward:n(5),playerMenu:()=>{const e=dq(".bilibili-player-video-wrap");if(!e){return}const i=e.getBoundingClientRect();e.dispatchEvent(new MouseEvent("contextmenu",{bubbles:true,cancelable:false,view:unsafeWindow,button:2,buttons:0,clientX:i.x+i.width/2-176.65/2,clientY:i.y+i.height/2-194/2}))},watchlater:t(".video-toolbar .ops .watchlater, .more-ops-list .ops-watch-later, .video-toolbar-module .see-later-box"),quickFavorite:t(".quick-favorite"),videoSpeedIncrease:s(((e,i)=>{e.setVideoSpeed(i.find((i=>i>e.playbackRate))||i[i.length-1])})),videoSpeedDecrease:s(((e,i)=>{e.setVideoSpeed([...i].reverse().find((i=>i{e.toggleVideoSpeed()})),videoSpeedForget:s((e=>{e.reset(true)})),takeScreenshot:t(".video-take-screenshot"),previousFrame:t(".prev-frame"),nextFrame:t(".next-frame"),seekBegin:()=>{if(!unsafeWindow.player){return}unsafeWindow.player.play();setTimeout((()=>{unsafeWindow.player.seek(0);const e=dq(".bilibili-player-video-toast-bottom .bilibili-player-video-toast-item:first-child .bilibili-player-video-toast-item-text span:nth-child(2)");if(e){e.textContent=" 00:00"}}))}};const d={fullscreen:"f",webFullscreen:"w",wideScreen:"t",volumeUp:"arrowUp",volumeDown:"arrowDown",mute:"m",pictureInPicture:"p",coin:"c",favorite:"s",pause:"space",like:"l",playerMenu:"`",longJumpForward:"j",longJumpBackward:"shift j",jumpBackward:"arrowLeft",jumpForward:"arrowRight",watchlater:"shift w",quickFavorite:"shift s",danmaku:"d",videoSpeedIncrease:"shift > 》 arrowUp",videoSpeedDecrease:"shift < 《 arrowDown",videoSpeedReset:"shift ? ?",videoSpeedForget:"shift : :",takeScreenshot:"ctrl [shift] alt c",previousFrame:"shift arrowLeft",nextFrame:"shift arrowRight",seekBegin:"0"};const c=e=>Object.entries(e).map((([e,i])=>{const t=i.split(" ");return{keys:t,action:r[e]||(()=>{})}}));(async()=>{const{loadKeyBindings:t}=await i.importAsync("key-bindings");const{presets:n}=await i.importAsync("key-binding-presets");addSettingsListener("keymapPreset",(()=>{const i=n[e.keymapPreset]||{};const a=c({...d,...i,...e.customKeyBindings});if(o){console.log("load preset",e.keymapPreset);o.bindings=a}else{o=t(a)}}),true);i.applyImportantStyle("keymapStyle")})()}return{reload:()=>o&&(o.enable=true),unload:()=>o&&(o.enable=false)}})(); \ No newline at end of file diff --git a/src/video/keymap/key-bindings.ts b/src/video/keymap/key-bindings.ts index 753f098f4..2634c398b 100644 --- a/src/video/keymap/key-bindings.ts +++ b/src/video/keymap/key-bindings.ts @@ -1,9 +1,10 @@ -export type KeyBindingAction = (context: { +export interface KeyBindingActionContext { binding: KeyBinding event: KeyboardEvent isWatchlater: boolean isMediaList: boolean -}) => void +} +export type KeyBindingAction = (context: KeyBindingActionContext) => void export interface KeyBinding { keys: string[] action: KeyBindingAction diff --git a/src/video/keymap/keymap.ts b/src/video/keymap/keymap.ts index 3f71a165c..20a03ed4f 100644 --- a/src/video/keymap/keymap.ts +++ b/src/video/keymap/keymap.ts @@ -1,5 +1,5 @@ import { VideoSpeedController } from '../video-speed/video-speed-controller' -import { KeyBinding, KeyBindingAction } from './key-bindings' +import { KeyBinding, KeyBindingAction, KeyBindingActionContext } from './key-bindings' const supportedUrls = [ 'https://www.bilibili.com/bangumi/', @@ -13,11 +13,14 @@ const supportedUrls = [ let config: { enable: boolean, bindings: KeyBinding[] } | undefined = undefined if (supportedUrls.some(url => document.URL.startsWith(url))) { const clickElement = (target: string | HTMLElement) => { - return () => { + return ({ event }: KeyBindingActionContext) => { + const mouseEvent = new MouseEvent('click', { + ..._.pick(event, 'ctrlKey', 'shiftKey', 'altKey', 'metaKey') + }) if (typeof target === 'string') { - (dq(target) as HTMLElement)?.click() + (dq(target) as HTMLElement)?.dispatchEvent(mouseEvent) } else { - target.click() + target.dispatchEvent(mouseEvent) } } } @@ -92,8 +95,8 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) { showTip(`${after}%`, 'mdi-volume-high') } }, - mute: () => { - clickElement('.bilibili-player-video-btn-volume .bilibili-player-iconfont-volume')() + mute: (context: KeyBindingActionContext) => { + clickElement('.bilibili-player-video-btn-volume .bilibili-player-iconfont-volume')(context) const isMute = unsafeWindow.player.isMute() if (isMute) { showTip('已静音', 'mdi-volume-off') @@ -219,7 +222,7 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) { videoSpeedDecrease: 'shift < 《 arrowDown', videoSpeedReset: 'shift ? ?', videoSpeedForget: 'shift : :', - takeScreenshot: 'ctrl alt c', + takeScreenshot: 'ctrl [shift] alt c', previousFrame: 'shift arrowLeft', nextFrame: 'shift arrowRight', seekBegin: '0',