mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
1 line
12 KiB
JavaScript
1 line
12 KiB
JavaScript
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["video/player/speed"]=t():e["video/player/speed"]=t()}(self,(function(){return function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{plugin:function(){return j}});var n=coreApis.toast,r=coreApis.componentApis.video.playerAgent,s=coreApis.lifeCycle,o=coreApis.observer,i=coreApis.utils,a=coreApis.utils.sort,l=coreApis.settings;const c=e=>"function"==typeof e?{next:e}:e,d=e=>function e(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,s=!1;const o=[],i=[];let a=!1;const d=()=>{for(;o.length;)o.pop()();i.length=0,a=!0},p=e=>{a||(i.forEach((t=>{var n;null===(n=t.error)||void 0===n||n.call(t,e),(0,l.getGeneralSettings)().devMode&&console.error(e)})),d())},u=e=>{a||i.forEach((t=>{try{t.next(e)}catch(e){p(e)}}))},h=()=>{i.forEach((e=>{var t;null===(t=e.complete)||void 0===t||t.call(e)})),d()},b=()=>{if(s)return;const e=null==t?void 0:t({next:u,error:p,complete:h});e&&o.push(e),s=!0},m=e=>null==e?null:(i.push(e),()=>{lodash.pull(i,e)}),f=function(){for(var t=arguments.length,n=new Array(t),s=0;s<t;s++)n[s]=arguments[s];return 0===n.length?{subscribe:e=>{const t=m(c(e));return((null==r?void 0:r.connect)??b)(),t},pipe:f,next:u,error:p,complete:h,...r}:e(n[0],{subscribe:m},r||{connect:b,next:u}).pipe(...n.slice(1))};if(n){const e=null==t?void 0:t({subscribe:e=>n.subscribe({error:p,complete:h,...c(e)}),next:u,error:p,complete:h});e&&o.push(e)}return f()}(e),p=(e,t)=>d((n=>{let{next:r}=n;return e.addEventListener(t,r),()=>e.removeEventListener(t,r)})),u=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return d((t=>{let{next:r}=t;e(...n,r)}))},h=e=>new Promise(((t,n)=>{const r=e.subscribe({next:e=>{t(e),r()},error:()=>{n(),r()},complete:()=>{n(),r()}})})),b=e=>t=>{let{subscribe:n,next:r,complete:s,error:o}=t;n(lodash.mapValues({next:r,complete:s,error:o},(t=>e(t))))},m=e=>function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];Promise.resolve().then((()=>e(...n)))},f=e=>{const t=new Set;return e((e=>{lodash.castArray(e).forEach((e=>{t.add(e)}))})),()=>{t.forEach((e=>{e()}))}},v=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return d((e=>{let{next:n,error:r,complete:s}=e;return f((e=>{const o=[];let i=0;e(t.map(((e,a)=>e.pipe(b(m)).subscribe({next:e=>{o[a]=e,o.reduce((e=>e+1),0)===t.length&&n(o.slice())},complete:()=>{i++,i===t.length&&s()},error:r})))),e((()=>{o.length=0,i=0}))}))}))},y=e=>t=>{let{subscribe:n,next:r,error:s}=t;n(lodash.debounce((e=>{try{r(e)}catch(e){s(e)}}),e))},g=e=>t=>{let{subscribe:n,next:r}=t;n((t=>{e(t)&&r(t)}))},w=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return e=>{let{next:n,subscribe:r}=e,s=!1;r((e=>{s||t.forEach((e=>n(e))),n(e),s=!0}))}};var E=coreApis.pluginApis.data;const x=(e,t)=>{const n=t=>{(0,E.registerAndGetData)(e,t)[0]=t},r=(0,E.getData)(e);if(r.length)return[r[0],n];if(t){const e=t();return n(e),[e,n]}return[void 0,n]},S=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t&&1===e?"倍速":Math.trunc(e)===e?`${e}.0x`:`${e}x`},A=e=>{if("倍速"===e)return 1;const t=/([0-9]*[.]?[0-9]+)x/.exec(e);if(t)return parseFloat(t[1]);throw new Error(`unknown speed text: ${e}`)};const N=r.playerAgent.provideCustomQuery({video:{speedMenuList:".bilibili-player-video-btn-speed-menu",speedMenuItem:".bilibili-player-video-btn-speed-menu-list",speedNameBtn:".bilibili-player-video-btn-speed-name",speedContainer:".bilibili-player-video-btn-speed",active:".bilibili-player-active",show:".bilibili-player-speed-show"},bangumi:{speedMenuList:".squirtle-speed-select-list",speedMenuItem:".squirtle-select-item",speedNameBtn:".squirtle-speed-select-result",speedContainer:".squirtle-speed-wrap",active:".active",show:".bilibili-player-speed-show"}});let k;!function(e){e[e.MIN=0]="MIN",e[e.CURRENT=1]="CURRENT",e[e.MAX=2]="MAX"}(k||(k={}));const C=(e,t,n)=>{const r=new MutationObserver(n);return r.observe(e,t),r},T=e=>{let[t,n]=e;if(!t)throw new Error("speed container element not found!");if(!n)throw new Error("video element not found!");const r=t.querySelector(N.custom.speedNameBtn.selector),s=t.querySelector(N.custom.speedMenuList.selector);let o,l,c;const p=d(),u=d().pipe((e=>{let t,{subscribe:n,next:r}=e,s=!0;n((e=>{(s||t!==e)&&(s=!1,t=e,r(e))}))}));u.pipe(w(void 0),(e=>{let{subscribe:t,next:n}=e;const r=[];return t((e=>{2===r.length&&r.shift(),r.push(e),2===r.length&&n(r.slice())})),()=>{r.length=0}})).subscribe((e=>{let[t,n]=e;l=t,o=n}));const h=e=>{if(e)switch(e.nodeType){case Node.TEXT_NODE:u.next(A(e.data));break;case Node.ELEMENT_NODE:u.next(A(e.innerHTML));break;default:console.warn("The target parameter of updateActiveVideoSpeed must be a Node, and the node type must be one of TEXT_NODE and ELEMENT_NODE")}},b=()=>{c=lodash([...s.children]).map((e=>lodash.attempt((()=>A(e.textContent))))).reject((e=>lodash.isError(e))).sort((0,a.ascendingSort)()).value()};h(r),b();const m=C(s,{childList:!0,attributes:!0},(e=>{const{attributes:t=[],childList:n=[]}=lodash.groupBy(e,"type");n.length&&b(),p.next({attributes:t,childList:n})})),f=C(r,{childList:!0,subtree:!0},(e=>{e.forEach((e=>{const[t]=e.addedNodes;h(t)}))}));return{containerElement:t,videoElement:n,nameBtnElement:r,menuListElement:s,query:e=>{return(0,i.des)(`./*[contains(@class, "${t=N.custom.speedMenuItem.selector,t.replace(/^\./,"")}") and normalize-space()="${S(e)}"]`,s);var t},dispose:()=>{m.disconnect(),f.disconnect()},activeVideoSpeed$:u,menuListElementMutations$:p,getActiveVideoSpeed:()=>o,getOldActiveVideoSpeed:()=>l,getAvailableSpeedValues:()=>c}},O=e=>{const{videoElement:t,menuListElement:n}=e,r=p(n,"click").pipe((s=e=>{const{innerText:t,innerHTML:n}=e.target,r=t.trim()||n.trim();return lodash.attempt((()=>A(r)))},e=>{let{subscribe:t,next:n}=e;t((e=>{n(s(e))}))}),g((e=>!lodash.isError(e))));var s;const o=d((e=>{let{next:n}=e,r=t;do{r=Object.getPrototypeOf(r)}while(null===r||!Object.prototype.hasOwnProperty.call(r,"playbackRate"));const s=Object.getOwnPropertyDescriptor(r,"playbackRate");return Object.defineProperty(r,"playbackRate",{set(e){s.set.call(this,e),n(e)}}),()=>{Object.defineProperty(r,"playbackRate",s)}})),i=r.pipe((e=>{let t,{subscribe:n,next:r}=e,s=!0;n((e=>{(s||t!==e)&&(s=!1,t=e,r(e))}))})),a=o.pipe((e=>{let t,{subscribe:n,next:r}=e,s=!0;n((e=>{(s||t!==e)&&(s=!1,t=e,r(e))}))})),l=d((e=>{let{next:t}=e;const n=v(i,a);return n.subscribe((e=>{let[n,r]=e;n===r&&t(r)})),()=>n.complete()})).pipe((e=>{let t,{subscribe:n,next:r}=e,s=!0;n((e=>{(s||t!==e)&&(s=!1,t=e,r(e))}))}));let c;a.pipe(y(200),w(void 0),(e=>{let{subscribe:t,next:n}=e;const r=[];return t((e=>{2===r.length&&r.shift(),r.push(e),2===r.length&&n(r.slice())})),()=>{r.length=0}})).subscribe((e=>{let[t]=e;c=t}));const u={menuListElementClickSpeed$:r,menuListElementClickSpeedChange$:i,playbackRate$:o,playbackRateChange$:a,videoSpeedChange$:l};return{...e,...u,dispose:()=>{lodash.values(u).forEach((e=>{e.complete()})),e.dispose()},getOldPlaybackRate:()=>c}},[L]=x("speed.NoSuchSpeedMenuItemElementError",(()=>class extends Error{constructor(e){const t=lodash.attempt((()=>S(e))),n=lodash.isError(t)?String(e):String(t);var r,s,o;super(`There is no such speed menu item as ${n}`),this.speed=e,o=void 0,(s="formattedSpeed")in(r=this)?Object.defineProperty(r,s,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[s]=o,this.formattedSpeed=n}})),M=e=>{const{query:t,videoElement:n,videoSpeedChange$:r,getOldActiveVideoSpeed:s,getAvailableSpeedValues:o,getActiveVideoSpeed:i}=e,a=async function(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:200;const o=t(e);if(null==o)throw new L(e);o.click();const i=t=>{if((t??n.playbackRate)!==e)throw new Error(`failed to set ${S(e)} video speed.`)},a=[h(r.pipe(y(Math.max(0,s||0))))];s>0&&a.push(new Promise(((e,t)=>setTimeout((()=>setTimeout(t,s)))))),await Promise.all(a).then(i).catch(i)},l=async()=>{await a(1)},c=async(e,t)=>{if(lodash.isNil(e)&&(e=!1),"boolean"==typeof e)e||1===n.playbackRate?await a(s()):await l();else{const n=o();switch(t){case k.MIN:await a(n[e]);break;case k.MAX:await a(n[n.length-1+e]);break;case k.CURRENT:default:{const t=n.indexOf(i());if(-1===t)throw new Error("Unexpected Error: The available speed values do not include the active speed value, this should be a bug, please report the issue on github!");await a(n[t+e])}}}},d=async e=>{try{await c(e,k.CURRENT)}catch(e){if(console.warn(e),!(e instanceof L))throw e}};return Object.assign(e,{set:a,force:async e=>{n.playbackRate=e},reset:l,toggle:c,step:d,increase:async()=>{await d(1)},decrease:async()=>{await d(-1)}})},$=()=>x("speed.speedContext"),R=()=>x("speed.buildArguments$",(()=>{return d().pipe((e=e=>e.settings.enabled,t=>{let{subscribe:n,next:r}=t;const s=new Set;return n((t=>{const n=s.size;e(t)?s.add(t):s.delete(t),s.size!==n&&r([...s])})),()=>{s.clear()}}));var e})),j={name:"speed.keymap",displayName:"视频倍速 - 快捷键支持",author:{name:"JLoeve",link:"https://github.com/LonelySteve"},description:"\n\n为操作视频倍速提供快捷键支持:\n\n- 提高倍速\n- 降低倍速\n- 切换倍速\n\n若添加并启用了记忆倍速组件,则还会增加一个快捷键:\n\n- 清除倍速记忆\n ",setup:e=>{let{addData:t,addHook:r}=e;const i=e=>async t=>{const n=await async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:lodash.identity;const[t,n]=$();if(t)return t;let r,i;const[a]=x("lifeCycleComponentLoaded$",(()=>p(unsafeWindow,s.LifeCycleEventTypes.ComponentsLoaded))),[l]=R(),[c]=x("speed.videoChange$",(()=>u(o.videoChange).pipe(g((e=>{let{aid:t,cid:n}=e;return t||n}))))),[b]=x("speed.speedContext$",(()=>d((t=>{let{next:n}=t;return v(c,l,a).subscribe((t=>{var s;let[o,a]=t;const[l]=$();null==l||l.dispose(),null===(s=i)||void 0===s||s("context update");const d=new Promise(((e,t)=>{r=e,i=t}));Promise.all([Promise.all([N.custom.speedContainer(),N.query.video.element()]).then(r),d]).then((e=>{let[,t]=e;return t})).then(T).then(O).then(M).then((e=>Object.assign(e,{videoIdObject:o,speedContext$:b,videoChange$:c}))).then(e(a)).then(n).catch((e=>console.error(e)))}))}))));return b.subscribe(n),h(b)}();return await e(n),t.showTip(S(n.videoElement.playbackRate),"mdi-fast-forward"),!0};t("keymap.actions",(e=>{Object.assign(e,{videoSpeedIncrease:{displayName:"提高倍速",run:i((e=>{let{increase:t}=e;return t()}))},videoSpeedDecrease:{displayName:"降低倍速",run:i((e=>{let{decrease:t}=e;return t()}))},videoSpeedToggle:{displayName:"切换倍速",run:i((e=>{let{toggle:t}=e;t()}))}})})),t("keymap.presets",(e=>{e.videoSpeedIncrease="shift > 》 arrowUp",e.videoSpeedDecrease="shift < 《 arrowDown",e.videoSpeedToggle="shift ? ?"})),r("speed.component.rememberVideoSpeed",{after:e=>{t("keymap.actions",(t=>{t.videoSpeedForget={displayName:"清除倍速记忆",run:lodash.debounce(i((async()=>{e.settings.enabled?e.options.individualRemember?(e.forgetSpeed(),await e.resetVideoSpeed(),n.Toast.success("已清除当前视频倍速记忆值",e.metadata.displayName,3e3)):n.Toast.error("选项「各视频分别记忆」已禁用,不能清除当前视频倍速记忆值",e.metadata.displayName,5e3):n.Toast.error("组件已禁用,不能清除当前视频倍速记忆值",e.metadata.displayName,5e3)})),200)}})),t("keymap.presets",(e=>{e.videoSpeedForget="shift : :"}))}})},commitHash:"73fa9af28753b2618111f03f5b8f37ef7a4f6281",coreVersion:"2.1.10"};return t=t.plugin}()})); |