Bilibili-Evolved/min/video-speed-controller.min.js
2021-01-19 16:01:50 +08:00

1 line
5.4 KiB
JavaScript

(()=>(e,t)=>{function i(e,t,i){if(t in e){Object.defineProperty(e,t,{value:i,enumerable:true,configurable:true,writable:true})}else{e[t]=i}return e}class a{static get extendedSupportedRates(){return Array.from(new Set(e.extendVideoSpeedList)).sort(((e,t)=>e-t))}static get supportedRates(){if(e.extendVideoSpeed){return[...a.nativeSupportedRates,...a.extendedSupportedRates]}return a.nativeSupportedRates}static get fallbackVideoSpeed(){if(e.useDefaultVideoSpeed){return parseFloat(e.defaultVideoSpeed)}}static formatSpeedText(e){if(e===1){return"倍数"}return Math.trunc(e)===e?`${e}.0x`:`${e}x`}static getRememberSpeed(t){for(const[i,a]of Object.entries(e.rememberVideoSpeedList)){if(a.some((e=>e===getAid(t)))){return parseFloat(i)}}}static forgetSpeed(t){t=getAid(t);let i=-1;for(const a of Object.values(e.rememberVideoSpeedList)){i=a.indexOf(t);if(i!==-1){a.splice(i,1);break}}e.rememberVideoSpeedList=e.rememberVideoSpeedList;return i!==-1}static rememberSpeed(t,i=false,s){s=getAid(s);const n=a.forgetSpeed(s);if(!n&&!i){return}if(!e.rememberVideoSpeedList[t]){e.rememberVideoSpeedList[t]=[]}e.rememberVideoSpeedList[t].push(s);e.rememberVideoSpeedList=e.rememberVideoSpeedList}static async getInstance(e){const t=await SpinQuery.select(`.${a.classNameMap.speedContainer}`);const i=await SpinQuery.select(`.${a.classNameMap.video} video`);if(!t){throw"speed container element not found!"}if(!i){throw"video element not found!"}return new a(t,i,e)}constructor(e,t,s){var n;i(this,"_containerElement",void 0);i(this,"_menuListElement",void 0);i(this,"_nameBtn",void 0);i(this,"_videoElement",void 0);i(this,"_nativeSpeedVal",void 0);i(this,"_previousSpeedVal",void 0);const d=a.instanceMap.get(e);if(d&&(!s||d.playbackRate===s)){return d}this._videoElement=t;s=(n=s)!==null&&n!==void 0?n:this.playbackRate;this._containerElement=e;this._previousSpeedVal=s;this._nativeSpeedVal=a.nativeSupportedRates.includes(s)?s:1;this._nameBtn=this._containerElement.querySelector(`.${a.classNameMap.speedNameBtn}`);this._menuListElement=this._containerElement.querySelector(`.${a.classNameMap.speedMenuList}`);a.instanceMap.set(e,this)}get menuListElement(){return this._menuListElement}get containerElement(){return this._containerElement}get videoElement(){return this._videoElement}get playbackRate(){return this._videoElement.playbackRate}getSpeedMenuItem(e){if(e){return this._menuListElement.querySelector(`.${a.classNameMap.speedMenuItem}[data-value="${e}"]`)}return this._menuListElement.querySelector(`.${a.classNameMap.speedMenuItem}.${a.classNameMap.active}`)}observe(){Observer.all(this._menuListElement,(t=>{let[i,s]=[undefined,undefined];t.forEach((t=>{var n;const d=t.target;if(!d.classList.contains(a.classNameMap.active)){var r;i=parseFloat((r=d.dataset.value)!==null&&r!==void 0?r:"1");return}s=parseFloat((n=d.dataset.value)!==null&&n!==void 0?n:"1");this._containerElement.dispatchEvent(new CustomEvent("changed",{detail:{speed:s,previousSpeed:this._previousSpeedVal}}));if(a.nativeSupportedRates.includes(s)){this._nativeSpeedVal=s}if(e.extendVideoSpeed&&a.nativeSupportedRates.includes(s)){var l;(l=this._menuListElement.querySelector(`.${a.classNameMap.speedMenuItem}.extended.${a.classNameMap.active}`))===null||l===void 0?void 0:l.classList.remove(a.classNameMap.active)}if(e.useDefaultVideoSpeed){if(e.rememberVideoSpeed){a.rememberSpeed(s,s!==a.fallbackVideoSpeed)}else{e.defaultVideoSpeed=s.toString()}}}));if(i&&i!==s){this._previousSpeedVal=i}}))}toggleVideoSpeed(){this.setVideoSpeed(this._previousSpeedVal)}reset(e=false){if(e){a.forgetSpeed();this.setVideoSpeed(a.fallbackVideoSpeed||1)}else{this.setVideoSpeed(1)}}setVideoSpeed(e){this.getSpeedMenuItem(e).click()}setExtendedVideoSpeed(e){if(a.nativeSupportedRates.includes(e)){this.getSpeedMenuItem(e).click()}else{this.forceUpdate(e)}}forceUpdate(e){var t,i;(t=this._menuListElement.querySelector(`.${a.classNameMap.speedMenuItem}[data-value="${this.playbackRate}"]`))===null||t===void 0?void 0:t.classList.remove(a.classNameMap.active);(i=this._menuListElement.querySelector(`.${a.classNameMap.speedMenuItem}[data-value="${e}"]`))===null||i===void 0?void 0:i.classList.add(a.classNameMap.active);this._videoElement.playbackRate=e;this._containerElement.classList.remove(a.classNameMap.show);this._nameBtn.innerText=a.formatSpeedText(e)}}i(a,"classNameMap",{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",video:"bilibili-player-video"});i(a,"nativeSupportedRates",[.5,.75,1,1.25,1.5,2]);i(a,"instanceMap",new WeakMap);i(a,"init",_.once((()=>{let i=1;let s;Observer.videoChange((async()=>{const{getExtraSpeedMenuItemElements:n}=await t.importAsync("extend-video-speed");const d=await a.getInstance(i);d.observe();if(e.extendVideoSpeed){d._menuListElement.prepend(...await n());d._menuListElement.addEventListener("click",(e=>{const t=e.target;const i=parseFloat(t.dataset.value);if(e.target.classList.contains("extended")){d.setExtendedVideoSpeed(i)}if(a.extendedSupportedRates.includes(d.playbackRate)&&d._nativeSpeedVal===i){d.forceUpdate(i)}}))}({containerElement:s}=d);s.addEventListener("changed",(({detail:{speed:e}})=>{i=e}));setTimeout((()=>{d.setVideoSpeed(e.useDefaultVideoSpeed&&e.rememberVideoSpeed&&a.getRememberSpeed()||a.fallbackVideoSpeed||i)}),100)}))})));return{export:{VideoSpeedController:a}}})();