@aigamo/nostalgic-diva 1.5.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/components/DailymotionPlayer.d.ts +3 -0
- package/dist/components/PlayerContainer.d.ts +1 -1
- package/dist/components/TwitchPlayer.d.ts +3 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +661 -415
- package/dist/index.es.js.map +1 -1
- package/dist/players/DailymotionPlayerApi.d.ts +15 -0
- package/dist/players/PlayerApi.d.ts +1 -1
- package/dist/players/TwitchPlayerApi.d.ts +19 -0
- package/dist/players/index.d.ts +2 -0
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Nostalgic Diva
|
|
2
2
|
|
|
3
|
-
React function components for imperatively controlling embedded players (audio, [Niconico](https://www.nicovideo.jp/), [SoundCloud](https://soundcloud.com/), [Vimeo](https://vimeo.com/) and [YouTube](https://www.youtube.com/)) using refs.
|
|
3
|
+
React function components for imperatively controlling embedded players (audio, [Dailymotion](https://www.dailymotion.com/) [Niconico](https://www.nicovideo.jp/), [SoundCloud](https://soundcloud.com/), [Twitch](https://www.twitch.tv/), [Vimeo](https://vimeo.com/) and [YouTube](https://www.youtube.com/)) using refs.
|
|
4
4
|
|
|
5
5
|
This was originally developed in [VocaDB/vocadb#1101](https://github.com/VocaDB/vocadb/pull/1101) as a part of VocaDB.
|
|
6
6
|
|
|
@@ -123,3 +123,5 @@ The `attach` function is called when switching from another player (Audio, Nicon
|
|
|
123
123
|
- [YouTube Player API Reference for iframe Embeds | YouTube IFrame Player API | Google Developers](https://developers.google.com/youtube/iframe_api_reference)
|
|
124
124
|
- [How to support Reusable State in Effects · Discussion #18 · reactwg/react-18](https://github.com/reactwg/react-18/discussions/18)
|
|
125
125
|
- [Synchronizing with Effects](https://beta.reactjs.org/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development)
|
|
126
|
+
- [dailymotion/dailymotion-sdk-js: Dailymotion JavaScript client API](https://github.com/dailymotion/dailymotion-sdk-js)
|
|
127
|
+
- [Video & Clips | Twitch Developers](https://dev.twitch.tv/docs/embed/video-and-clips/)
|
|
@@ -11,7 +11,7 @@ export interface PlayerProps {
|
|
|
11
11
|
}
|
|
12
12
|
interface PlayerContainerProps<TElement extends HTMLElement, TPlayer extends object, TPlayerApi extends PlayerApiImpl<TPlayer>> extends PlayerProps {
|
|
13
13
|
loadScript: (() => Promise<void>) | undefined;
|
|
14
|
-
playerFactory: (element: TElement) => Promise<TPlayer>;
|
|
14
|
+
playerFactory: (element: TElement, videoId: string) => Promise<TPlayer>;
|
|
15
15
|
playerApiFactory: new (logger: ILogger, player: TPlayer, options: PlayerOptions | undefined) => TPlayerApi;
|
|
16
16
|
children: (playerElementRef: React.MutableRefObject<TElement>, videoId: string) => React.ReactNode;
|
|
17
17
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export * from './AudioPlayer';
|
|
2
|
+
export * from './DailymotionPlayer';
|
|
2
3
|
export * from './NiconicoPlayer';
|
|
3
4
|
export * from './NostalgicDiva';
|
|
4
5
|
export * from './NostalgicDivaProvider';
|
|
5
6
|
export * from './SoundCloudPlayer';
|
|
7
|
+
export * from './TwitchPlayer';
|
|
6
8
|
export * from './YouTubePlayer';
|
|
7
9
|
export * from './VimeoPlayer';
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var B=Object.defineProperty;var O=(r,e,t)=>e in r?B(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var v=(r,e,t)=>(O(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react");var c=(r=>(r[r.Trace=0]="Trace",r[r.Debug=1]="Debug",r[r.Information=2]="Information",r[r.Warning=3]="Warning",r[r.Error=4]="Error",r[r.Critical=5]="Critical",r[r.None=6]="None",r))(c||{});class C{constructor(e,t,a){this.logger=e,this.player=t,this.options=a,this.logger.log(c.Debug,"ctor")}}class S extends C{async attach(){this.player.onerror=e=>{var t,a;return(a=(t=this.options)==null?void 0:t.onError)==null?void 0:a.call(t,e)},this.player.onloadeddata=()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onLoaded)==null?void 0:t.call(e,{id:this.player.src})},this.player.onplay=()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onPlay)==null?void 0:t.call(e)},this.player.onpause=()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onPause)==null?void 0:t.call(e)},this.player.onended=()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onEnded)==null?void 0:t.call(e)},this.player.ontimeupdate=()=>{var e,t;(t=(e=this.options)==null?void 0:e.onTimeUpdate)==null||t.call(e,{duration:this.player.duration,percent:this.player.currentTime/this.player.duration,seconds:this.player.currentTime})}}async detach(){this.player.onerror=null,this.player.onloadeddata=null,this.player.onplay=null,this.player.onpause=null,this.player.onended=null,this.player.ontimeupdate=null}async loadVideo(e){this.player.src=e}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.currentTime=e}async setVolume(e){this.player.volume=e}async setMuted(e){this.player.muted=e}async getDuration(){return this.player.duration}async getCurrentTime(){return this.player.currentTime}async getVolume(){return this.player.volume}}const k=class{constructor(e,t,a,i,n){v(this,"id");v(this,"impl");this.logger=e,this.type=t,this.player=a,this.options=i,this.playerApiFactory=n,this.id=k.nextId++}createMessage(e){return`${this.type}#${this.id} ${e}`}debug(e,...t){this.logger.log(c.Debug,this.createMessage(e),...t)}error(e,...t){this.logger.log(c.Error,this.createMessage(e),...t)}async attach(e){if(this.debug("attach",e),this.impl){this.debug("player is already attached");return}this.debug("Attaching player..."),this.impl=new this.playerApiFactory(this.logger,this.player,this.options),await this.impl.attach(e),this.debug("player attached")}createPlayerNotAttachedError(){return new Error("player is not attached")}async detach(){if(this.debug("detach"),this.impl===void 0)throw this.createPlayerNotAttachedError();await this.impl.detach(),this.impl=void 0}async loadVideo(e){if(this.debug("loadVideo",e),this.impl===void 0)throw this.createPlayerNotAttachedError();this.debug("Loading video..."),await this.impl.loadVideo(e),this.debug("video loaded",e)}play(){if(this.debug("play"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.play()}pause(){if(this.debug("pause"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.pause()}setCurrentTime(e){if(this.debug("setCurrentTime",e),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.setCurrentTime(e)}setVolume(e){if(this.debug("setVolume",e),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.setVolume(e)}setMuted(e){if(this.debug("setMuted",e),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.setMuted(e)}getDuration(){if(this.debug("getDuration"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.getDuration()}getCurrentTime(){if(this.debug("getCurrentTime"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.getCurrentTime()}getVolume(){if(this.debug("getVolume"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.getVolume()}};let E=k;v(E,"nextId",1);function q(){const r=s.useRef(!0);return r.current?(r.current=!1,!0):r.current}const H=(r,e)=>r===e;function z(r,e=H){const t=s.useRef(),a=s.useRef(r);return!q()&&!e(a.current,r)&&(t.current=a.current,a.current=r),t.current}const T=({logger:r,type:e,loadScript:t,playerFactory:a,playerApiRef:i,videoId:n,options:o,playerApiFactory:u,children:d})=>{r.log(c.Debug,"PlayerContainer");const y=s.useRef(n),p=s.useRef(void 0),[g,m]=s.useState(),[l,h]=s.useState();s.useEffect(()=>{((t==null?void 0:t())??Promise.resolve()).then(()=>{a(p.current).then(b=>{m(b)})})},[t,a]),s.useEffect(()=>{if(g===void 0)return;const b=new E(r,e,g,o,u);return i&&(i.current=b),b.attach(y.current).then(()=>h(b)),()=>{if(i&&b!==i.current)throw new Error("playerApi differs");b.detach().finally(()=>h(void 0))}},[r,e,t,g,o,u,i]);const w=z(n);return s.useEffect(()=>{w!==void 0&&(l==null||l.loadVideo(n))},[w,n,l]),s.createElement(s.Fragment,null,d(p,y.current))},U=s.memo(({...r})=>{const{logger:e}=r;e.log(c.Debug,"AudioPlayer");const t=s.useCallback(a=>Promise.resolve(a),[]);return s.createElement(T,{...r,loadScript:void 0,playerFactory:t,playerApiFactory:S},(a,i)=>s.createElement("audio",{ref:a,src:i,style:{width:"100%",height:"100%"},preload:"auto",autoPlay:!0,controls:!0}))});var A=(r=>(r[r.Play=2]="Play",r[r.Pause=3]="Pause",r[r.End=4]="End",r))(A||{});const P=class extends C{constructor(){super(...arguments);v(this,"duration");v(this,"currentTime");v(this,"volume");v(this,"handleMessage",t=>{var i,n,o,u,d,y,p,g,m,l,h,w,b,N;if(t.origin!==P.origin)return;const a=t.data;switch(a.eventName){case"playerStatusChange":this.logger.log(c.Debug,`player status changed: ${A[a.data.playerStatus]??a.data.playerStatus}`);break;case"statusChange":switch(this.logger.log(c.Debug,`status changed: ${A[a.data.playerStatus]??a.data.playerStatus}`),a.data.playerStatus){case 2:(n=(i=this.options)==null?void 0:i.onPlay)==null||n.call(i);break;case 3:(u=(o=this.options)==null?void 0:o.onPause)==null||u.call(o);break;case 4:(y=(d=this.options)==null?void 0:d.onEnded)==null||y.call(d);break}break;case"playerMetadataChange":a.data.duration!==void 0&&(this.duration=a.data.duration/1e3),this.currentTime=a.data.currentTime===void 0?void 0:a.data.currentTime/1e3,this.volume=a.data.volume,(g=(p=this.options)==null?void 0:p.onTimeUpdate)==null||g.call(p,{duration:this.duration,percent:this.currentTime!==void 0&&this.duration!==void 0?this.currentTime/this.duration:void 0,seconds:this.currentTime});break;case"loadComplete":this.logger.log(c.Debug,"load completed"),this.duration=a.data.videoInfo.lengthInSeconds,(l=(m=this.options)==null?void 0:m.onLoaded)==null||l.call(m,{id:a.data.videoInfo.watchId});break;case"error":(w=(h=this.options)==null?void 0:h.onError)==null||w.call(h,a);break;case"player-error:video:play":case"player-error:video:seek":(N=(b=this.options)==null?void 0:b.onError)==null||N.call(b,a);break;default:this.logger.log(c.Debug,"message",a.eventName,a.data);break}})}async attach(){window.addEventListener("message",this.handleMessage)}async detach(){window.removeEventListener("message",this.handleMessage)}async loadVideo(t){return new Promise((a,i)=>{this.duration=void 0,this.currentTime=void 0,this.player.onload=()=>{this.player.onload=null,a()},this.player.src=`https://embed.nicovideo.jp/watch/${t}?jsapi=1&playerId=1`})}postMessage(t){var a;(a=this.player.contentWindow)==null||a.postMessage({...t,playerId:"1",sourceConnectorType:1},P.origin)}async play(){this.postMessage({eventName:"play"})}async pause(){this.postMessage({eventName:"pause"})}async setCurrentTime(t){this.postMessage({eventName:"seek",data:{time:t*1e3}})}async setVolume(t){this.postMessage({eventName:"volumeChange",data:{volume:t}})}async setMuted(t){this.postMessage({eventName:"mute",data:{mute:t}})}async getDuration(){return this.duration}async getCurrentTime(){return this.currentTime}async getVolume(){return this.volume}};let f=P;v(f,"origin","https://embed.nicovideo.jp");const M=s.memo(({...r})=>{const{logger:e}=r;e.log(c.Debug,"NiconicoPlayer");const t=s.useCallback(a=>Promise.resolve(a),[]);return s.createElement(T,{...r,loadScript:void 0,playerFactory:t,playerApiFactory:f},(a,i)=>s.createElement("div",{style:{width:"100%",height:"100%"}},s.createElement("iframe",{ref:a,src:`https://embed.nicovideo.jp/watch/${i}?jsapi=1&playerId=1`,width:"100%",height:"100%",allowFullScreen:!0,style:{border:"none"},allow:"autoplay; fullscreen"})))}),R=s.createContext(void 0),J=new class{constructor(){v(this,"title","nostalgic-diva")}createMessage(r){return`[${this.title}] ${r}`}debug(r,...e){console.debug(this.createMessage(r),...e)}error(r,...e){console.error(this.createMessage(r),...e)}warn(r,...e){console.warn(this.createMessage(r),...e)}isEnabled(){return!0}log(r,e,...t){switch(r){case c.Debug:this.debug(e,...t);break;case c.Warning:this.warn(e,...t);break;case c.Error:this.error(e,...t);break}}},K=({logger:r=J,children:e})=>{const t=s.useRef(),a=s.useCallback(async l=>{var h;await((h=t.current)==null?void 0:h.loadVideo(l))},[]),i=s.useCallback(async()=>{var l;await((l=t.current)==null?void 0:l.play())},[]),n=s.useCallback(async()=>{var l;await((l=t.current)==null?void 0:l.pause())},[]),o=s.useCallback(async l=>{const h=t.current;h&&(await h.setCurrentTime(l),await h.play())},[]),u=s.useCallback(async l=>{var h;await((h=t.current)==null?void 0:h.setVolume(l))},[]),d=s.useCallback(async l=>{var h;await((h=t.current)==null?void 0:h.setMuted(l))},[]),y=s.useCallback(async()=>{var l;return await((l=t.current)==null?void 0:l.getDuration())},[]),p=s.useCallback(async()=>{var l;return await((l=t.current)==null?void 0:l.getCurrentTime())},[]),g=s.useCallback(async()=>{var l;return await((l=t.current)==null?void 0:l.getVolume())},[]),m=s.useMemo(()=>({logger:r,playerApiRef:t,loadVideo:a,play:i,pause:n,setCurrentTime:o,setVolume:u,setMuted:d,getDuration:y,getCurrentTime:p,getVolume:g}),[r,a,i,n,o,u,d,y,p,g]);return s.createElement(R.Provider,{value:m},e)},F=()=>s.useContext(R);class D extends C{getDurationCore(){return new Promise((e,t)=>{this.player.getDuration(e)})}attach(e){return new Promise((t,a)=>{this.player.bind(SC.Widget.Events.READY,()=>{var i,n;this.player.bind(SC.Widget.Events.PLAY_PROGRESS,async o=>{var d,y;const u=await this.getDurationCore();(y=(d=this.options)==null?void 0:d.onTimeUpdate)==null||y.call(d,{duration:u/1e3,percent:o.currentPosition/u,seconds:o.currentPosition/1e3})}),this.player.bind(SC.Widget.Events.ERROR,o=>{var u,d;return(d=(u=this.options)==null?void 0:u.onError)==null?void 0:d.call(u,o)}),this.player.bind(SC.Widget.Events.PLAY,()=>{var o,u;return(u=(o=this.options)==null?void 0:o.onPlay)==null?void 0:u.call(o)}),this.player.bind(SC.Widget.Events.PAUSE,()=>{var o,u;return(u=(o=this.options)==null?void 0:o.onPause)==null?void 0:u.call(o)}),this.player.bind(SC.Widget.Events.FINISH,()=>{var o,u;return(u=(o=this.options)==null?void 0:o.onEnded)==null?void 0:u.call(o)}),(n=(i=this.options)==null?void 0:i.onLoaded)==null||n.call(i,{id:e}),t()})})}async detach(){this.player.unbind(SC.Widget.Events.READY),this.player.unbind(SC.Widget.Events.PLAY_PROGRESS),this.player.unbind(SC.Widget.Events.ERROR),this.player.unbind(SC.Widget.Events.PLAY),this.player.unbind(SC.Widget.Events.PAUSE),this.player.unbind(SC.Widget.Events.FINISH)}static playerLoadAsync(e,t,a){return new Promise((i,n)=>{e.load(t,{...a,callback:i})})}async loadVideo(e){var t,a;await D.playerLoadAsync(this.player,e,{auto_play:!0}),(a=(t=this.options)==null?void 0:t.onLoaded)==null||a.call(t,{id:e})}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.seekTo(e*1e3)}async setVolume(e){this.player.setVolume(e*100)}async setMuted(e){this.setVolume(e?0:1)}async getDuration(){return await this.getDurationCore()/1e3}getCurrentTimeCore(){return new Promise((e,t)=>{this.player.getPosition(e)})}async getCurrentTime(){return await this.getCurrentTimeCore()/1e3}getVolumeCore(){return new Promise((e,t)=>{this.player.getVolume(e)})}async getVolume(){return await this.getVolumeCore()/100}}function Q(r){return new Promise((e,t)=>{const a=document.createElement("script");a.src=r,a.async=!0,a.onerror=t,a.onload=a.onreadystatechange=function(){const i=this.readyState;i&&i!=="loaded"&&i!=="complete"||(a.onload=a.onreadystatechange=null,e())},document.head.appendChild(a)})}const V=[];async function I(r,e){if(V.includes(r))return e.log(c.Debug,r,"script is already loaded"),!1;try{return e.log(c.Debug,r,"Loading script..."),await Q(r),V.includes(r)?(e.log(c.Debug,r,"script is already loaded"),!1):(V.push(r),e.log(c.Debug,r,"script loaded"),!0)}catch(t){throw e.log(c.Error,r,"Failed to load script"),t}}const Y=s.memo(({...r})=>{const{logger:e}=r;e.log(c.Debug,"SoundCloudPlayer");const t=s.useCallback(async()=>{await I("https://w.soundcloud.com/player/api.js",e)},[e]),a=s.useCallback(i=>Promise.resolve(SC.Widget(i)),[]);return s.createElement(T,{...r,loadScript:t,playerFactory:a,playerApiFactory:D},(i,n)=>s.createElement("iframe",{ref:i,src:`https://w.soundcloud.com/player/?url=${n}`,frameBorder:0,allow:"autoplay",style:{width:"100%",height:"100%"}}))});class W extends C{async attach(){await this.player.ready(),this.player.on("error",e=>{var t,a;return(a=(t=this.options)==null?void 0:t.onError)==null?void 0:a.call(t,e)}),this.player.on("loaded",e=>{var t,a;return(a=(t=this.options)==null?void 0:t.onLoaded)==null?void 0:a.call(t,{id:e.id.toString()})}),this.player.on("play",()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onPlay)==null?void 0:t.call(e)}),this.player.on("pause",()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onPause)==null?void 0:t.call(e)}),this.player.on("ended",()=>{var e,t;return(t=(e=this.options)==null?void 0:e.onEnded)==null?void 0:t.call(e)}),this.player.on("timeupdate",e=>{var t,a;(a=(t=this.options)==null?void 0:t.onTimeUpdate)==null||a.call(t,{duration:e.duration,percent:e.percent,seconds:e.seconds})})}async detach(){this.player.off("error"),this.player.off("loaded"),this.player.off("play"),this.player.off("pause"),this.player.off("ended"),this.player.off("timeupdate")}async loadVideo(e){await this.player.loadVideo(e)}async play(){await this.player.play()}async pause(){await this.player.pause()}async setCurrentTime(e){await this.player.setCurrentTime(e)}async setVolume(e){await this.player.setVolume(e)}async setMuted(e){await this.player.setMuted(e)}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return await this.player.getCurrentTime()}async getVolume(){return await this.player.getVolume()}}const j=s.memo(({...r})=>{const{logger:e}=r;e.log(c.Debug,"VimeoPlayer");const t=s.useCallback(async()=>{await I("https://player.vimeo.com/api/player.js",e)},[e]),a=s.useCallback(i=>Promise.resolve(new Vimeo.Player(i)),[]);return s.createElement(T,{...r,loadScript:t,playerFactory:a,playerApiFactory:W},(i,n)=>s.createElement("iframe",{ref:i,src:`https://player.vimeo.com/video/${n}`,frameBorder:0,allow:"autoplay",style:{width:"100%",height:"100%"}}))});var $=(r=>(r[r.UNSTARTED=-1]="UNSTARTED",r[r.ENDED=0]="ENDED",r[r.PLAYING=1]="PLAYING",r[r.PAUSED=2]="PAUSED",r[r.BUFFERING=3]="BUFFERING",r[r.CUED=5]="CUED",r))($||{});class x extends C{constructor(){super(...arguments);v(this,"previousTime");v(this,"timeUpdateIntervalId")}clearTimeUpdateInterval(){this.logger.log(c.Debug,"clearTimeUpdateInterval",this.timeUpdateIntervalId),window.clearInterval(this.timeUpdateIntervalId),this.timeUpdateIntervalId=void 0}invokeTimeUpdate(t){var n,o;const a=t.getCurrentTime();if(a===this.previousTime)return;const i=t.getDuration();(o=(n=this.options)==null?void 0:n.onTimeUpdate)==null||o.call(n,{duration:i,percent:a/i,seconds:a}),this.previousTime=a}setTimeUpdateInterval(){this.logger.log(c.Debug,"setTimeUpdateInterval"),this.clearTimeUpdateInterval(),this.timeUpdateIntervalId=window.setInterval(()=>this.invokeTimeUpdate(this.player),250),this.logger.log(c.Debug,"timeUpdateIntervalId",this.timeUpdateIntervalId),this.invokeTimeUpdate(this.player)}attach(t){return new Promise((a,i)=>{this.player.addEventListener("onReady",async()=>{this.player.addEventListener("onError",n=>{var o,u;return(u=(o=this.options)==null?void 0:o.onError)==null?void 0:u.call(o,n.data)}),this.player.addEventListener("onStateChange",n=>{var o,u,d,y,p,g,m,l;switch(this.logger.log(c.Debug,`state changed: ${$[n.data]}`),n.data){case YT.PlayerState.CUED:(u=(o=this.options)==null?void 0:o.onLoaded)==null||u.call(o,{id:t});break;case YT.PlayerState.PLAYING:(y=(d=this.options)==null?void 0:d.onPlay)==null||y.call(d),this.setTimeUpdateInterval();break;case YT.PlayerState.PAUSED:(g=(p=this.options)==null?void 0:p.onPause)==null||g.call(p),this.clearTimeUpdateInterval();break;case YT.PlayerState.ENDED:(l=(m=this.options)==null?void 0:m.onEnded)==null||l.call(m),this.clearTimeUpdateInterval();break}}),await this.loadVideo(t),a()})})}async detach(){this.clearTimeUpdateInterval()}async loadVideo(t){this.previousTime=void 0,this.player.cueVideoById(t)}async play(){this.player.playVideo()}async pause(){this.player.pauseVideo()}async setCurrentTime(t){this.player.seekTo(t),this.invokeTimeUpdate(this.player)}async setVolume(t){this.player.setVolume(t*100)}async setMuted(t){t?this.player.mute():this.player.unMute()}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return this.player.getCurrentTime()}async getVolume(){return this.player.getVolume()/100}}const X="https://www.youtube-nocookie.com",G=s.memo(({...r})=>{const{logger:e}=r;e.log(c.Debug,"YouTubePlayer");const t=s.useCallback(()=>new Promise(async(i,n)=>{await I("https://www.youtube.com/iframe_api",e)?window.onYouTubeIframeAPIReady=()=>{e.log(c.Debug,"YouTube iframe API ready"),i()}:i()}),[e]),a=s.useCallback(i=>Promise.resolve(new YT.Player(i,{host:X,width:"100%",height:"100%"})),[]);return s.createElement(T,{...r,loadScript:t,playerFactory:a,playerApiFactory:x},i=>s.createElement("div",{style:{width:"100%",height:"100%"}},s.createElement("div",{ref:i})))}),Z={Audio:U,Niconico:M,SoundCloud:Y,Vimeo:j,YouTube:G},_=s.memo(({type:r,videoId:e,options:t})=>{const{logger:a,playerApiRef:i}=F();a.log(c.Debug,"NostalgicDiva");const n=Z[r];return s.createElement(n,{logger:a,type:r,playerApiRef:i,videoId:e,options:t})});exports.AudioPlayer=U;exports.AudioPlayerApi=S;exports.NiconicoPlayer=M;exports.NiconicoPlayerApi=f;exports.NostalgicDiva=_;exports.NostalgicDivaProvider=K;exports.PlayerApi=E;exports.SoundCloudPlayer=Y;exports.SoundCloudPlayerApi=D;exports.VimeoPlayer=j;exports.VimeoPlayerApi=W;exports.YouTubePlayer=G;exports.YouTubePlayerApi=x;exports.useNostalgicDiva=F;
|
|
1
|
+
"use strict";var H=Object.defineProperty;var K=(a,t,e)=>t in a?H(a,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[t]=e;var m=(a,t,e)=>(K(a,typeof t!="symbol"?t+"":t,e),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react");var d=(a=>(a[a.Trace=0]="Trace",a[a.Debug=1]="Debug",a[a.Information=2]="Information",a[a.Warning=3]="Warning",a[a.Error=4]="Error",a[a.Critical=5]="Critical",a[a.None=6]="None",a))(d||{});class w{constructor(t,e,r){this.logger=t,this.player=e,this.options=r,this.logger.log(d.Debug,"ctor")}}class U extends w{async attach(){this.player.onerror=t=>{var e,r;return(r=(e=this.options)==null?void 0:e.onError)==null?void 0:r.call(e,t)},this.player.onloadeddata=()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onLoaded)==null?void 0:e.call(t,{id:this.player.src})},this.player.onplay=()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onPlay)==null?void 0:e.call(t)},this.player.onpause=()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onPause)==null?void 0:e.call(t)},this.player.onended=()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onEnded)==null?void 0:e.call(t)},this.player.ontimeupdate=()=>{var t,e;(e=(t=this.options)==null?void 0:t.onTimeUpdate)==null||e.call(t,{duration:this.player.duration,percent:this.player.currentTime/this.player.duration,seconds:this.player.currentTime})}}async detach(){this.player.onerror=null,this.player.onloadeddata=null,this.player.onplay=null,this.player.onpause=null,this.player.onended=null,this.player.ontimeupdate=null}async loadVideo(t){this.player.src=t}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(t){this.player.currentTime=t}async setVolume(t){this.player.volume=t}async setMuted(t){this.player.muted=t}async getDuration(){return this.player.duration}async getCurrentTime(){return this.player.currentTime}async getVolume(){return this.player.volume}}const I=class{constructor(t,e,r,i,l){m(this,"id");m(this,"impl");this.logger=t,this.type=e,this.player=r,this.options=i,this.playerApiFactory=l,this.id=I.nextId++}createMessage(t){return`${this.type}#${this.id} ${t}`}debug(t,...e){this.logger.log(d.Debug,this.createMessage(t),...e)}error(t,...e){this.logger.log(d.Error,this.createMessage(t),...e)}async attach(t){if(this.debug("attach",t),this.impl){this.debug("player is already attached");return}this.debug("Attaching player..."),this.impl=new this.playerApiFactory(this.logger,this.player,this.options),await this.impl.attach(t),this.debug("player attached")}createPlayerNotAttachedError(){return new Error("player is not attached")}async detach(){if(this.debug("detach"),this.impl===void 0)throw this.createPlayerNotAttachedError();await this.impl.detach(),this.impl=void 0}async loadVideo(t){if(this.debug("loadVideo",t),this.impl===void 0)throw this.createPlayerNotAttachedError();this.debug("Loading video..."),await this.impl.loadVideo(t),this.debug("video loaded",t)}play(){if(this.debug("play"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.play()}pause(){if(this.debug("pause"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.pause()}setCurrentTime(t){if(this.debug("setCurrentTime",t),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.setCurrentTime(t)}setVolume(t){if(this.debug("setVolume",t),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.setVolume(t)}setMuted(t){if(this.debug("setMuted",t),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.setMuted(t)}getDuration(){if(this.debug("getDuration"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.getDuration()}getCurrentTime(){if(this.debug("getCurrentTime"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.getCurrentTime()}getVolume(){if(this.debug("getVolume"),this.impl===void 0)throw this.createPlayerNotAttachedError();return this.impl.getVolume()}};let T=I;m(T,"nextId",1);function z(){const a=s.useRef(!0);return a.current?(a.current=!1,!0):a.current}const J=(a,t)=>a===t;function Q(a,t=J){const e=s.useRef(),r=s.useRef(a);return!z()&&!t(r.current,a)&&(e.current=r.current,r.current=a),e.current}const E=({logger:a,type:t,loadScript:e,playerFactory:r,playerApiRef:i,videoId:l,options:o,playerApiFactory:n,children:u})=>{a.log(d.Debug,"PlayerContainer");const y=s.useRef(l),p=s.useRef(void 0),[g,v]=s.useState(),[c,h]=s.useState();s.useEffect(()=>{((e==null?void 0:e())??Promise.resolve()).then(()=>{r(p.current,y.current).then(b=>{v(b)})})},[e,r]),s.useEffect(()=>{if(g===void 0)return;const b=new T(a,t,g,o,n);return i&&(i.current=b),b.attach(y.current).then(()=>h(b)),()=>{if(i&&b!==i.current)throw new Error("playerApi differs");b.detach().finally(()=>h(void 0))}},[a,t,e,g,o,n,i]);const P=Q(l);return s.useEffect(()=>{P!==void 0&&(c==null||c.loadVideo(l))},[P,l,c]),s.createElement(s.Fragment,null,u(p,y.current))},M=s.memo(({...a})=>{const{logger:t}=a;t.log(d.Debug,"AudioPlayer");const e=s.useCallback(r=>Promise.resolve(r),[]);return s.createElement(E,{...a,loadScript:void 0,playerFactory:e,playerApiFactory:U},(r,i)=>s.createElement("audio",{ref:r,src:i,style:{width:"100%",height:"100%"},preload:"auto",autoPlay:!0,controls:!0}))}),S=["apiready","seeked","video_end","durationchange","pause","playing","error"];class R extends w{constructor(){super(...arguments);m(this,"handlePlayerEvents",e=>{var r,i,l,o,n,u,y,p,g,v,c,h;switch(e.type){case"apiready":(i=(r=this.options)==null?void 0:r.onLoaded)==null||i.call(r,{id:this.player.video.videoId});break;case"seeked":(o=(l=this.options)==null?void 0:l.onTimeUpdate)==null||o.call(l,{duration:this.player.duration,percent:this.player.currentTime/this.player.duration,seconds:this.player.currentTime});break;case"video_end":(u=(n=this.options)==null?void 0:n.onEnded)==null||u.call(n);break;case"durationchange":break;case"pause":(p=(y=this.options)==null?void 0:y.onPause)==null||p.call(y);break;case"playing":(v=(g=this.options)==null?void 0:g.onPlay)==null||v.call(g);break;case"error":(h=(c=this.options)==null?void 0:c.onError)==null||h.call(c,e);break}})}async attach(e){for(const r of S)this.player.addEventListener(r,this.handlePlayerEvents)}async detach(){for(const e of S)this.player.removeEventListener(e,this.handlePlayerEvents)}async loadVideo(e){this.player.load(e)}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.seek(e)}async setVolume(e){this.player.setVolume(e)}async setMuted(e){this.player.setMuted(e)}async getDuration(){return this.player.duration}async getCurrentTime(){return this.player.currentTime}async getVolume(){return this.player.volume}}function X(a){return new Promise((t,e)=>{const r=document.createElement("script");r.src=a,r.async=!0,r.onerror=e,r.onload=r.onreadystatechange=function(){const i=this.readyState;i&&i!=="loaded"&&i!=="complete"||(r.onload=r.onreadystatechange=null,t())},document.head.appendChild(r)})}const k=[];async function f(a,t){if(k.includes(a))return t.log(d.Debug,a,"script is already loaded"),!1;try{return t.log(d.Debug,a,"Loading script..."),await X(a),k.includes(a)?(t.log(d.Debug,a,"script is already loaded"),!1):(k.push(a),t.log(d.Debug,a,"script loaded"),!0)}catch(e){throw t.log(d.Error,a,"Failed to load script"),e}}const F=s.memo(({options:a,...t})=>{const{logger:e}=t;e.log(d.Debug,"DailymotionPlayer");const r=s.useCallback(async()=>{await f("https://api.dmcdn.net/all.js",e)},[e]),i=s.useCallback((l,o)=>Promise.resolve(new DM.player(l,{video:o,width:"100%",height:"100%",events:{apiready:()=>{var n;(n=a==null?void 0:a.onLoaded)==null||n.call(a,{id:o})},seeked:()=>{var n;(n=a==null?void 0:a.onTimeUpdate)==null||n.call(a,{duration:0,percent:0,seconds:0})},video_end:()=>{var n;(n=a==null?void 0:a.onEnded)==null||n.call(a)},durationchange:()=>{},pause:()=>{var n;(n=a==null?void 0:a.onPause)==null||n.call(a)},playing:()=>{var n;(n=a==null?void 0:a.onPlay)==null||n.call(a)},waiting:()=>{},error:n=>{var u;(u=a==null?void 0:a.onError)==null||u.call(a,n)}}})),[a]);return s.createElement(E,{...t,options:a,loadScript:r,playerFactory:i,playerApiFactory:R},l=>s.createElement("div",{style:{width:"100%",height:"100%"}},s.createElement("div",{ref:l})))});var A=(a=>(a[a.Play=2]="Play",a[a.Pause=3]="Pause",a[a.End=4]="End",a))(A||{});const D=class extends w{constructor(){super(...arguments);m(this,"duration");m(this,"currentTime");m(this,"volume");m(this,"handleMessage",e=>{var i,l,o,n,u,y,p,g,v,c,h,P,b,N;if(e.origin!==D.origin)return;const r=e.data;switch(r.eventName){case"playerStatusChange":this.logger.log(d.Debug,`player status changed: ${A[r.data.playerStatus]??r.data.playerStatus}`);break;case"statusChange":switch(this.logger.log(d.Debug,`status changed: ${A[r.data.playerStatus]??r.data.playerStatus}`),r.data.playerStatus){case 2:(l=(i=this.options)==null?void 0:i.onPlay)==null||l.call(i);break;case 3:(n=(o=this.options)==null?void 0:o.onPause)==null||n.call(o);break;case 4:(y=(u=this.options)==null?void 0:u.onEnded)==null||y.call(u);break}break;case"playerMetadataChange":r.data.duration!==void 0&&(this.duration=r.data.duration/1e3),this.currentTime=r.data.currentTime===void 0?void 0:r.data.currentTime/1e3,this.volume=r.data.volume,(g=(p=this.options)==null?void 0:p.onTimeUpdate)==null||g.call(p,{duration:this.duration,percent:this.currentTime!==void 0&&this.duration!==void 0?this.currentTime/this.duration:void 0,seconds:this.currentTime});break;case"loadComplete":this.logger.log(d.Debug,"load completed"),this.duration=r.data.videoInfo.lengthInSeconds,(c=(v=this.options)==null?void 0:v.onLoaded)==null||c.call(v,{id:r.data.videoInfo.watchId});break;case"error":(P=(h=this.options)==null?void 0:h.onError)==null||P.call(h,r);break;case"player-error:video:play":case"player-error:video:seek":(N=(b=this.options)==null?void 0:b.onError)==null||N.call(b,r);break;default:this.logger.log(d.Debug,"message",r.eventName,r.data);break}})}async attach(){window.addEventListener("message",this.handleMessage)}async detach(){window.removeEventListener("message",this.handleMessage)}async loadVideo(e){return new Promise((r,i)=>{this.duration=void 0,this.currentTime=void 0,this.player.onload=()=>{this.player.onload=null,r()},this.player.src=`https://embed.nicovideo.jp/watch/${e}?jsapi=1&playerId=1`})}postMessage(e){var r;(r=this.player.contentWindow)==null||r.postMessage({...e,playerId:"1",sourceConnectorType:1},D.origin)}async play(){this.postMessage({eventName:"play"})}async pause(){this.postMessage({eventName:"pause"})}async setCurrentTime(e){this.postMessage({eventName:"seek",data:{time:e*1e3}})}async setVolume(e){this.postMessage({eventName:"volumeChange",data:{volume:e}})}async setMuted(e){this.postMessage({eventName:"mute",data:{mute:e}})}async getDuration(){return this.duration}async getCurrentTime(){return this.currentTime}async getVolume(){return this.volume}};let C=D;m(C,"origin","https://embed.nicovideo.jp");const Y=s.memo(({...a})=>{const{logger:t}=a;t.log(d.Debug,"NiconicoPlayer");const e=s.useCallback(r=>Promise.resolve(r),[]);return s.createElement(E,{...a,loadScript:void 0,playerFactory:e,playerApiFactory:C},(r,i)=>s.createElement("div",{style:{width:"100%",height:"100%"}},s.createElement("iframe",{ref:r,src:`https://embed.nicovideo.jp/watch/${i}?jsapi=1&playerId=1`,width:"100%",height:"100%",allowFullScreen:!0,style:{border:"none"},allow:"autoplay; fullscreen"})))}),j=s.createContext(void 0),Z=new class{constructor(){m(this,"title","nostalgic-diva")}createMessage(a){return`[${this.title}] ${a}`}debug(a,...t){console.debug(this.createMessage(a),...t)}error(a,...t){console.error(this.createMessage(a),...t)}warn(a,...t){console.warn(this.createMessage(a),...t)}isEnabled(){return!0}log(a,t,...e){switch(a){case d.Debug:this.debug(t,...e);break;case d.Warning:this.warn(t,...e);break;case d.Error:this.error(t,...e);break}}},ee=({logger:a=Z,children:t})=>{const e=s.useRef(),r=s.useCallback(async c=>{var h;await((h=e.current)==null?void 0:h.loadVideo(c))},[]),i=s.useCallback(async()=>{var c;await((c=e.current)==null?void 0:c.play())},[]),l=s.useCallback(async()=>{var c;await((c=e.current)==null?void 0:c.pause())},[]),o=s.useCallback(async c=>{const h=e.current;h&&(await h.setCurrentTime(c),await h.play())},[]),n=s.useCallback(async c=>{var h;await((h=e.current)==null?void 0:h.setVolume(c))},[]),u=s.useCallback(async c=>{var h;await((h=e.current)==null?void 0:h.setMuted(c))},[]),y=s.useCallback(async()=>{var c;return await((c=e.current)==null?void 0:c.getDuration())},[]),p=s.useCallback(async()=>{var c;return await((c=e.current)==null?void 0:c.getCurrentTime())},[]),g=s.useCallback(async()=>{var c;return await((c=e.current)==null?void 0:c.getVolume())},[]),v=s.useMemo(()=>({logger:a,playerApiRef:e,loadVideo:r,play:i,pause:l,setCurrentTime:o,setVolume:n,setMuted:u,getDuration:y,getCurrentTime:p,getVolume:g}),[a,r,i,l,o,n,u,y,p,g]);return s.createElement(j.Provider,{value:v},t)},W=()=>s.useContext(j);class V extends w{getDurationCore(){return new Promise((t,e)=>{this.player.getDuration(t)})}attach(t){return new Promise((e,r)=>{this.player.bind(SC.Widget.Events.READY,()=>{var i,l;this.player.bind(SC.Widget.Events.PLAY_PROGRESS,async o=>{var u,y;const n=await this.getDurationCore();(y=(u=this.options)==null?void 0:u.onTimeUpdate)==null||y.call(u,{duration:n/1e3,percent:o.currentPosition/n,seconds:o.currentPosition/1e3})}),this.player.bind(SC.Widget.Events.ERROR,o=>{var n,u;return(u=(n=this.options)==null?void 0:n.onError)==null?void 0:u.call(n,o)}),this.player.bind(SC.Widget.Events.PLAY,()=>{var o,n;return(n=(o=this.options)==null?void 0:o.onPlay)==null?void 0:n.call(o)}),this.player.bind(SC.Widget.Events.PAUSE,()=>{var o,n;return(n=(o=this.options)==null?void 0:o.onPause)==null?void 0:n.call(o)}),this.player.bind(SC.Widget.Events.FINISH,()=>{var o,n;return(n=(o=this.options)==null?void 0:o.onEnded)==null?void 0:n.call(o)}),(l=(i=this.options)==null?void 0:i.onLoaded)==null||l.call(i,{id:t}),e()})})}async detach(){this.player.unbind(SC.Widget.Events.READY),this.player.unbind(SC.Widget.Events.PLAY_PROGRESS),this.player.unbind(SC.Widget.Events.ERROR),this.player.unbind(SC.Widget.Events.PLAY),this.player.unbind(SC.Widget.Events.PAUSE),this.player.unbind(SC.Widget.Events.FINISH)}static playerLoadAsync(t,e,r){return new Promise((i,l)=>{t.load(e,{...r,callback:i})})}async loadVideo(t){var e,r;await V.playerLoadAsync(this.player,t,{auto_play:!0}),(r=(e=this.options)==null?void 0:e.onLoaded)==null||r.call(e,{id:t})}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(t){this.player.seekTo(t*1e3)}async setVolume(t){this.player.setVolume(t*100)}async setMuted(t){this.setVolume(t?0:1)}async getDuration(){return await this.getDurationCore()/1e3}getCurrentTimeCore(){return new Promise((t,e)=>{this.player.getPosition(t)})}async getCurrentTime(){return await this.getCurrentTimeCore()/1e3}getVolumeCore(){return new Promise((t,e)=>{this.player.getVolume(t)})}async getVolume(){return await this.getVolumeCore()/100}}const x=s.memo(({...a})=>{const{logger:t}=a;t.log(d.Debug,"SoundCloudPlayer");const e=s.useCallback(async()=>{await f("https://w.soundcloud.com/player/api.js",t)},[t]),r=s.useCallback(i=>Promise.resolve(SC.Widget(i)),[]);return s.createElement(E,{...a,loadScript:e,playerFactory:r,playerApiFactory:V},(i,l)=>s.createElement("iframe",{ref:i,src:`https://w.soundcloud.com/player/?url=${l}`,frameBorder:0,allow:"autoplay",style:{width:"100%",height:"100%"}}))});class $ extends w{constructor(){super(...arguments);m(this,"handleReady",()=>{var e,r;(r=(e=this.options)==null?void 0:e.onLoaded)==null||r.call(e,{id:this.player.getVideo()})});m(this,"handlePlay",()=>{var e,r;(r=(e=this.options)==null?void 0:e.onPlay)==null||r.call(e)});m(this,"handlePause",()=>{var e,r;(r=(e=this.options)==null?void 0:e.onPause)==null||r.call(e)});m(this,"handleEnded",()=>{var e,r;(r=(e=this.options)==null?void 0:e.onEnded)==null||r.call(e)});m(this,"handleSeek",()=>{var e,r;(r=(e=this.options)==null?void 0:e.onTimeUpdate)==null||r.call(e,{duration:0,percent:0,seconds:0})})}async attach(e){this.player.addEventListener(Twitch.Player.READY,this.handleReady),this.player.addEventListener(Twitch.Player.PLAYING,this.handlePlay),this.player.addEventListener(Twitch.Player.PAUSE,this.handlePause),this.player.addEventListener(Twitch.Player.ENDED,this.handleEnded),this.player.addEventListener(Twitch.Player.SEEK,this.handleSeek)}async detach(){}async loadVideo(e){this.player.setVideo(e,0)}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.seek(e)}async setVolume(e){this.player.setVolume(e)}async setMuted(e){this.player.setMuted(e)}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return this.player.getCurrentTime()}async getVolume(){return this.player.getVolume()}}const L=s.memo(({...a})=>{const{logger:t}=a;t.log(d.Debug,"TwitchPlayer");const e=s.useCallback(async()=>{await f("https://embed.twitch.tv/embed/v1.js",t)},[t]),r=s.useCallback(async(i,l)=>Promise.resolve(new Twitch.Player(i,{video:l,width:"100%",height:"100%"})),[]);return s.createElement(E,{...a,loadScript:e,playerFactory:r,playerApiFactory:$},i=>s.createElement("div",{ref:i,style:{width:"100%",height:"100%"}}))});class G extends w{async attach(){await this.player.ready(),this.player.on("error",t=>{var e,r;return(r=(e=this.options)==null?void 0:e.onError)==null?void 0:r.call(e,t)}),this.player.on("loaded",t=>{var e,r;return(r=(e=this.options)==null?void 0:e.onLoaded)==null?void 0:r.call(e,{id:t.id.toString()})}),this.player.on("play",()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onPlay)==null?void 0:e.call(t)}),this.player.on("pause",()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onPause)==null?void 0:e.call(t)}),this.player.on("ended",()=>{var t,e;return(e=(t=this.options)==null?void 0:t.onEnded)==null?void 0:e.call(t)}),this.player.on("timeupdate",t=>{var e,r;(r=(e=this.options)==null?void 0:e.onTimeUpdate)==null||r.call(e,{duration:t.duration,percent:t.percent,seconds:t.seconds})})}async detach(){this.player.off("error"),this.player.off("loaded"),this.player.off("play"),this.player.off("pause"),this.player.off("ended"),this.player.off("timeupdate")}async loadVideo(t){await this.player.loadVideo(t)}async play(){await this.player.play()}async pause(){await this.player.pause()}async setCurrentTime(t){await this.player.setCurrentTime(t)}async setVolume(t){await this.player.setVolume(t)}async setMuted(t){await this.player.setMuted(t)}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return await this.player.getCurrentTime()}async getVolume(){return await this.player.getVolume()}}const B=s.memo(({...a})=>{const{logger:t}=a;t.log(d.Debug,"VimeoPlayer");const e=s.useCallback(async()=>{await f("https://player.vimeo.com/api/player.js",t)},[t]),r=s.useCallback(i=>Promise.resolve(new Vimeo.Player(i)),[]);return s.createElement(E,{...a,loadScript:e,playerFactory:r,playerApiFactory:G},(i,l)=>s.createElement("iframe",{ref:i,src:`https://player.vimeo.com/video/${l}`,frameBorder:0,allow:"autoplay",style:{width:"100%",height:"100%"}}))});var O=(a=>(a[a.UNSTARTED=-1]="UNSTARTED",a[a.ENDED=0]="ENDED",a[a.PLAYING=1]="PLAYING",a[a.PAUSED=2]="PAUSED",a[a.BUFFERING=3]="BUFFERING",a[a.CUED=5]="CUED",a))(O||{});class _ extends w{constructor(){super(...arguments);m(this,"previousTime");m(this,"timeUpdateIntervalId")}clearTimeUpdateInterval(){this.logger.log(d.Debug,"clearTimeUpdateInterval",this.timeUpdateIntervalId),window.clearInterval(this.timeUpdateIntervalId),this.timeUpdateIntervalId=void 0}invokeTimeUpdate(e){var l,o;const r=e.getCurrentTime();if(r===this.previousTime)return;const i=e.getDuration();(o=(l=this.options)==null?void 0:l.onTimeUpdate)==null||o.call(l,{duration:i,percent:r/i,seconds:r}),this.previousTime=r}setTimeUpdateInterval(){this.logger.log(d.Debug,"setTimeUpdateInterval"),this.clearTimeUpdateInterval(),this.timeUpdateIntervalId=window.setInterval(()=>this.invokeTimeUpdate(this.player),250),this.logger.log(d.Debug,"timeUpdateIntervalId",this.timeUpdateIntervalId),this.invokeTimeUpdate(this.player)}attach(e){return new Promise((r,i)=>{this.player.addEventListener("onReady",async()=>{this.player.addEventListener("onError",l=>{var o,n;return(n=(o=this.options)==null?void 0:o.onError)==null?void 0:n.call(o,l.data)}),this.player.addEventListener("onStateChange",l=>{var o,n,u,y,p,g,v,c;switch(this.logger.log(d.Debug,`state changed: ${O[l.data]}`),l.data){case YT.PlayerState.CUED:(n=(o=this.options)==null?void 0:o.onLoaded)==null||n.call(o,{id:e});break;case YT.PlayerState.PLAYING:(y=(u=this.options)==null?void 0:u.onPlay)==null||y.call(u),this.setTimeUpdateInterval();break;case YT.PlayerState.PAUSED:(g=(p=this.options)==null?void 0:p.onPause)==null||g.call(p),this.clearTimeUpdateInterval();break;case YT.PlayerState.ENDED:(c=(v=this.options)==null?void 0:v.onEnded)==null||c.call(v),this.clearTimeUpdateInterval();break}}),await this.loadVideo(e),r()})})}async detach(){this.clearTimeUpdateInterval()}async loadVideo(e){this.previousTime=void 0,this.player.cueVideoById(e)}async play(){this.player.playVideo()}async pause(){this.player.pauseVideo()}async setCurrentTime(e){this.player.seekTo(e),this.invokeTimeUpdate(this.player)}async setVolume(e){this.player.setVolume(e*100)}async setMuted(e){e?this.player.mute():this.player.unMute()}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return this.player.getCurrentTime()}async getVolume(){return this.player.getVolume()/100}}const te="https://www.youtube-nocookie.com",q=s.memo(({...a})=>{const{logger:t}=a;t.log(d.Debug,"YouTubePlayer");const e=s.useCallback(()=>new Promise(async(i,l)=>{await f("https://www.youtube.com/iframe_api",t)?window.onYouTubeIframeAPIReady=()=>{t.log(d.Debug,"YouTube iframe API ready"),i()}:i()}),[t]),r=s.useCallback(i=>Promise.resolve(new YT.Player(i,{host:te,width:"100%",height:"100%"})),[]);return s.createElement(E,{...a,loadScript:e,playerFactory:r,playerApiFactory:_},i=>s.createElement("div",{style:{width:"100%",height:"100%"}},s.createElement("div",{ref:i})))}),ae={Audio:M,Dailymotion:F,Niconico:Y,SoundCloud:x,Twitch:L,Vimeo:B,YouTube:q},re=s.memo(({type:a,videoId:t,options:e})=>{const{logger:r,playerApiRef:i}=W();r.log(d.Debug,"NostalgicDiva");const l=ae[a];return s.createElement(l,{logger:r,type:a,playerApiRef:i,videoId:t,options:e})});exports.AudioPlayer=M;exports.AudioPlayerApi=U;exports.DailymotionPlayer=F;exports.DailymotionPlayerApi=R;exports.NiconicoPlayer=Y;exports.NiconicoPlayerApi=C;exports.NostalgicDiva=re;exports.NostalgicDivaProvider=ee;exports.PlayerApi=T;exports.SoundCloudPlayer=x;exports.SoundCloudPlayerApi=V;exports.TwitchPlayer=L;exports.TwitchPlayerApi=$;exports.VimeoPlayer=B;exports.VimeoPlayerApi=G;exports.YouTubePlayer=q;exports.YouTubePlayerApi=_;exports.useNostalgicDiva=W;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/players/ILogger.ts","../src/players/PlayerApiImpl.ts","../src/players/AudioPlayerApi.ts","../src/players/PlayerApi.ts","../src/components/useFirstMountState.ts","../src/components/usePreviousDistinct.ts","../src/components/PlayerContainer.tsx","../src/components/AudioPlayer.tsx","../src/players/NiconicoPlayerApi.ts","../src/components/NiconicoPlayer.tsx","../src/components/NostalgicDivaProvider.tsx","../src/players/SoundCloudPlayerApi.ts","../src/players/getScript.ts","../src/players/ensureScriptLoaded.ts","../src/components/SoundCloudPlayer.tsx","../src/players/VimeoPlayerApi.ts","../src/components/VimeoPlayer.tsx","../src/players/YouTubePlayerApi.ts","../src/components/YouTubePlayer.tsx","../src/components/NostalgicDiva.tsx"],"sourcesContent":["// https://source.dot.net/#Microsoft.Extensions.Logging.Abstractions/LogLevel.cs,d07793e8b722b77e,references\nexport enum LogLevel {\n\t/**\n\t * Logs that contain the most detailed messages. These messages may contain sensitive application data.\n\t * These messages are disabled by default and should never be enabled in a production environment.\n\t */\n\tTrace = 0,\n\t/**\n\t * Logs that are used for interactive investigation during development. These logs should primarily contain\n\t * information useful for debugging and have no long-term value.\n\t */\n\tDebug = 1,\n\t/**\n\t * Logs that track the general flow of the application. These logs should have long-term value.\n\t */\n\tInformation = 2,\n\t/**\n\t * Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the\n\t * application execution to stop.\n\t */\n\tWarning = 3,\n\t/**\n\t * Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a\n\t * failure in the current activity, not an application-wide failure.\n\t */\n\tError = 4,\n\t/**\n\t * Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires\n\t * immediate attention.\n\t */\n\tCritical = 5,\n\t/**\n\t * Not used for writing log messages. Specifies that a logging category should not write any messages.\n\t */\n\tNone = 6,\n}\n\n// https://source.dot.net/#Microsoft.Extensions.Logging.Abstractions/ILogger.cs,0976525f5d1b9e54,references\nexport interface ILogger {\n\tisEnabled(logLevel: LogLevel): boolean;\n\tlog(logLevel: LogLevel, message?: any, ...optionalParams: any[]): void;\n}\n","import { ILogger, LogLevel } from './ILogger';\nimport { IPlayerApi, PlayerOptions } from './PlayerApi';\n\nexport abstract class PlayerApiImpl<TPlayer> implements IPlayerApi {\n\tconstructor(\n\t\tprotected readonly logger: ILogger,\n\t\tprotected readonly player: TPlayer,\n\t\tprotected readonly options: PlayerOptions | undefined,\n\t) {\n\t\tthis.logger.log(LogLevel.Debug, 'ctor');\n\t}\n\n\tabstract attach(id: string): Promise<void>;\n\tabstract detach(): Promise<void>;\n\tabstract loadVideo(id: string): Promise<void>;\n\tabstract play(): Promise<void>;\n\tabstract pause(): Promise<void>;\n\tabstract setCurrentTime(seconds: number): Promise<void>;\n\tabstract setVolume(volume: number): Promise<void>;\n\tabstract setMuted(muted: boolean): Promise<void>;\n\tabstract getDuration(): Promise<number | undefined>;\n\tabstract getCurrentTime(): Promise<number | undefined>;\n\tabstract getVolume(): Promise<number | undefined>;\n}\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/VocaDB/vocadb/blob/61b8c54f3eca906a477101dab4fdd9b154be310e/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerFile.ts.\nexport class AudioPlayerApi extends PlayerApiImpl<HTMLAudioElement> {\n\tasync attach(): Promise<void> {\n\t\tthis.player.onerror = (event): void => this.options?.onError?.(event);\n\t\tthis.player.onloadeddata = (): void =>\n\t\t\tthis.options?.onLoaded?.({ id: this.player.src });\n\t\tthis.player.onplay = (): void => this.options?.onPlay?.();\n\t\tthis.player.onpause = (): void => this.options?.onPause?.();\n\t\tthis.player.onended = (): void => this.options?.onEnded?.();\n\t\tthis.player.ontimeupdate = (): void => {\n\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\tduration: this.player.duration,\n\t\t\t\tpercent: this.player.currentTime / this.player.duration,\n\t\t\t\tseconds: this.player.currentTime,\n\t\t\t});\n\t\t};\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.onerror = null;\n\t\tthis.player.onloadeddata = null;\n\t\tthis.player.onplay = null;\n\t\tthis.player.onpause = null;\n\t\tthis.player.onended = null;\n\t\tthis.player.ontimeupdate = null;\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.src = id;\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.currentTime = seconds;\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.volume = volume;\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.muted = muted;\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.player.volume;\n\t}\n}\n","import { ILogger, LogLevel } from './ILogger';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\nexport type PlayerType =\n\t| 'Audio'\n\t| 'Niconico'\n\t| 'SoundCloud'\n\t| 'Vimeo'\n\t| 'YouTube';\n\nexport interface LoadedEvent {\n\tid: string;\n}\n\nexport interface TimeEvent {\n\tduration: number | undefined;\n\tpercent: number | undefined;\n\tseconds: number | undefined;\n}\n\nexport interface PlayerOptions {\n\tonError?(event: any): void;\n\tonLoaded?(event: LoadedEvent): void;\n\tonPlay?(): void;\n\tonPause?(): void;\n\tonEnded?(): void;\n\tonTimeUpdate?(event: TimeEvent): void;\n}\n\nexport interface IPlayerApi {\n\tloadVideo(id: string): Promise<void>;\n\tplay(): Promise<void>;\n\tpause(): Promise<void>;\n\tsetCurrentTime(seconds: number): Promise<void>;\n\tsetVolume(volume: number): Promise<void>;\n\tsetMuted(muted: boolean): Promise<void>;\n\tgetDuration(): Promise<number | undefined>;\n\tgetCurrentTime(): Promise<number | undefined>;\n\tgetVolume(): Promise<number | undefined>;\n}\n\nexport class PlayerApi<\n\tTPlayer extends object,\n\tTPlayerApi extends PlayerApiImpl<TPlayer>,\n> implements IPlayerApi\n{\n\tprivate static nextId = 1;\n\n\tprivate readonly id: number;\n\tprivate impl?: TPlayerApi;\n\n\tconstructor(\n\t\tprivate readonly logger: ILogger,\n\t\tprivate readonly type: PlayerType,\n\t\tprivate readonly player: TPlayer,\n\t\tprivate readonly options: PlayerOptions | undefined,\n\t\tprivate readonly playerApiFactory: new (\n\t\t\tlogger: ILogger,\n\t\t\tplayer: TPlayer,\n\t\t\toptions: PlayerOptions | undefined,\n\t\t) => TPlayerApi,\n\t) {\n\t\tthis.id = PlayerApi.nextId++;\n\t}\n\n\tprivate createMessage(message: any): string {\n\t\treturn `${this.type}#${this.id} ${message}`;\n\t}\n\n\tpublic debug(message?: any, ...optionalParams: any): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\tthis.createMessage(message),\n\t\t\t...optionalParams,\n\t\t);\n\t}\n\n\tpublic error(message?: any, ...optionalParams: any): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Error,\n\t\t\tthis.createMessage(message),\n\t\t\t...optionalParams,\n\t\t);\n\t}\n\n\tasync attach(id: string): Promise<void> {\n\t\tthis.debug('attach', id);\n\n\t\tif (this.impl) {\n\t\t\tthis.debug('player is already attached');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.debug('Attaching player...');\n\n\t\tthis.impl = new this.playerApiFactory(\n\t\t\tthis.logger,\n\t\t\tthis.player,\n\t\t\tthis.options,\n\t\t);\n\n\t\tawait this.impl.attach(id);\n\n\t\tthis.debug('player attached');\n\t}\n\n\tprivate createPlayerNotAttachedError(): Error {\n\t\treturn new Error('player is not attached');\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.debug('detach');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tawait this.impl.detach();\n\n\t\tthis.impl = undefined;\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.debug('loadVideo', id);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tthis.debug('Loading video...');\n\n\t\tawait this.impl.loadVideo(id);\n\n\t\tthis.debug('video loaded', id);\n\t}\n\n\tplay(): Promise<void> {\n\t\tthis.debug('play');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.play();\n\t}\n\n\tpause(): Promise<void> {\n\t\tthis.debug('pause');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.pause();\n\t}\n\n\tsetCurrentTime(seconds: number): Promise<void> {\n\t\tthis.debug('setCurrentTime', seconds);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.setCurrentTime(seconds);\n\t}\n\n\tsetVolume(volume: number): Promise<void> {\n\t\tthis.debug('setVolume', volume);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.setVolume(volume);\n\t}\n\n\tsetMuted(muted: boolean): Promise<void> {\n\t\tthis.debug('setMuted', muted);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.setMuted(muted);\n\t}\n\n\tgetDuration(): Promise<number | undefined> {\n\t\tthis.debug('getDuration');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.getDuration();\n\t}\n\n\tgetCurrentTime(): Promise<number | undefined> {\n\t\tthis.debug('getCurrentTime');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.getCurrentTime();\n\t}\n\n\tgetVolume(): Promise<number | undefined> {\n\t\tthis.debug('getVolume');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.getVolume();\n\t}\n}\n","// https://github.com/streamich/react-use/blob/8ceb4c0f0c5625124f487b435a2fd0d3b3bc2a4f/src/useFirstMountState.ts\nimport { useRef } from 'react';\n\nexport function useFirstMountState(): boolean {\n\tconst isFirst = useRef(true);\n\n\tif (isFirst.current) {\n\t\tisFirst.current = false;\n\n\t\treturn true;\n\t}\n\n\treturn isFirst.current;\n}\n","// https://github.com/streamich/react-use/blob/8ceb4c0f0c5625124f487b435a2fd0d3b3bc2a4f/src/usePreviousDistinct.ts.\nimport { useRef } from 'react';\n\nimport { useFirstMountState } from './useFirstMountState';\n\nexport type Predicate<T> = (prev: T | undefined, next: T) => boolean;\n\nconst strictEquals = <T>(prev: T | undefined, next: T): boolean =>\n\tprev === next;\n\nexport default function usePreviousDistinct<T>(\n\tvalue: T,\n\tcompare: Predicate<T> = strictEquals,\n): T | undefined {\n\tconst prevRef = useRef<T>();\n\tconst curRef = useRef<T>(value);\n\tconst isFirstMount = useFirstMountState();\n\n\tif (!isFirstMount && !compare(curRef.current, value)) {\n\t\tprevRef.current = curRef.current;\n\t\tcurRef.current = value;\n\t}\n\n\treturn prevRef.current;\n}\n","import React from 'react';\n\nimport { ILogger, LogLevel } from '../players/ILogger';\nimport {\n\tIPlayerApi,\n\tPlayerApi,\n\tPlayerOptions,\n\tPlayerType,\n} from '../players/PlayerApi';\nimport { PlayerApiImpl } from '../players/PlayerApiImpl';\nimport usePreviousDistinct from './usePreviousDistinct';\n\nexport interface PlayerProps {\n\tlogger: ILogger;\n\ttype: PlayerType;\n\tplayerApiRef: React.MutableRefObject<IPlayerApi | undefined> | undefined;\n\tvideoId: string;\n\toptions: PlayerOptions | undefined;\n}\n\ninterface PlayerContainerProps<\n\tTElement extends HTMLElement,\n\tTPlayer extends object,\n\tTPlayerApi extends PlayerApiImpl<TPlayer>,\n> extends PlayerProps {\n\tloadScript: (() => Promise<void>) | undefined;\n\tplayerFactory: (element: TElement) => Promise<TPlayer>;\n\tplayerApiFactory: new (\n\t\tlogger: ILogger,\n\t\tplayer: TPlayer,\n\t\toptions: PlayerOptions | undefined,\n\t) => TPlayerApi;\n\tchildren: (\n\t\tplayerElementRef: React.MutableRefObject<TElement>,\n\t\tvideoId: string,\n\t) => React.ReactNode;\n}\n\nexport const PlayerContainer = <\n\tTElement extends HTMLElement,\n\tTPlayer extends object,\n\tTPlayerApi extends PlayerApiImpl<TPlayer>,\n>({\n\tlogger,\n\ttype,\n\tloadScript,\n\tplayerFactory,\n\tplayerApiRef,\n\tvideoId,\n\toptions,\n\tplayerApiFactory,\n\tchildren,\n}: PlayerContainerProps<TElement, TPlayer, TPlayerApi>): React.ReactElement<\n\tPlayerContainerProps<TElement, TPlayer, TPlayerApi>\n> => {\n\tlogger.log(LogLevel.Debug, 'PlayerContainer');\n\n\tconst videoIdRef = React.useRef(videoId);\n\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\tconst playerElementRef = React.useRef<TElement>(undefined!);\n\n\tconst [player, setPlayer] = React.useState<TPlayer>();\n\tconst [playerApi, setPlayerApi] = React.useState<IPlayerApi>();\n\n\tReact.useEffect(() => {\n\t\t(loadScript?.() ?? Promise.resolve()).then(() => {\n\t\t\tplayerFactory(playerElementRef.current).then((player) => {\n\t\t\t\tsetPlayer(player);\n\t\t\t});\n\t\t});\n\t}, [loadScript, playerFactory]);\n\n\t// Make sure that `options` do not change between re-rendering.\n\tReact.useEffect(() => {\n\t\tif (player === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst playerApi = new PlayerApi(\n\t\t\tlogger,\n\t\t\ttype,\n\t\t\tplayer,\n\t\t\toptions,\n\t\t\tplayerApiFactory,\n\t\t);\n\n\t\tif (playerApiRef) {\n\t\t\tplayerApiRef.current = playerApi;\n\t\t}\n\n\t\tplayerApi\n\t\t\t.attach(videoIdRef.current)\n\t\t\t.then(() => setPlayerApi(playerApi));\n\n\t\treturn (): void => {\n\t\t\tif (playerApiRef) {\n\t\t\t\tif (playerApi !== playerApiRef.current) {\n\t\t\t\t\tthrow new Error('playerApi differs');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplayerApi.detach().finally(() => setPlayerApi(undefined));\n\t\t};\n\t}, [\n\t\tlogger,\n\t\ttype,\n\t\tloadScript,\n\t\tplayer,\n\t\toptions,\n\t\tplayerApiFactory,\n\t\tplayerApiRef,\n\t]);\n\n\tconst previousVideoId = usePreviousDistinct(videoId);\n\tReact.useEffect(() => {\n\t\t// If `previousVideoId` is undefined, then it means that the video has already been loaded by either\n\t\t// 1. `<audio>`s `src` attribute (e.g. `AudioPlayer`),\n\t\t// 2. `<iframe>`'s `src` attribute (e.g. `NiconicoPlayer`, `SoundCloudPlayer` and `VimeoPlayer`), or\n\t\t// 3. the `attach` method of the player API (e.g. `YouTubePlayer`).\n\t\tif (previousVideoId === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tplayerApi?.loadVideo(videoId);\n\t}, [previousVideoId, videoId, playerApi]);\n\n\t// Make sure that `videoId` does not change between re-rendering.\n\treturn <>{children(playerElementRef, videoIdRef.current)}</>;\n};\n","import React from 'react';\n\nimport { AudioPlayerApi } from '../players/AudioPlayerApi';\nimport { LogLevel } from '../players/ILogger';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const AudioPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'AudioPlayer');\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLAudioElement): Promise<HTMLAudioElement> => {\n\t\t\t\treturn Promise.resolve(element);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLAudioElement, HTMLAudioElement, AudioPlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={AudioPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t<audio\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tsrc={videoId}\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t\tpreload=\"auto\"\n\t\t\t\t\t\tautoPlay\n\t\t\t\t\t\tcontrols\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { LogLevel } from './ILogger';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\ndeclare global {\n\tinterface Window {\n\t\tonNicoPlayerFactoryReady: (callback: nico.NicoPlayerFactory) => void;\n\t}\n}\n\nenum PlayerStatus {\n\tPlay = 2,\n\tPause = 3,\n\tEnd = 4,\n}\n\n// https://github.com/VocaDB/vocadb/blob/a4b5f9d8186772d7e6f58f997bbcbb51509d2539/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerNico.ts.\nexport class NiconicoPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {\n\tprivate static readonly origin = 'https://embed.nicovideo.jp';\n\n\tprivate duration?: number;\n\tprivate currentTime?: number;\n\tprivate volume?: number;\n\n\tprivate handleMessage = (e: nico.PlayerEvent): void => {\n\t\tif (e.origin !== NiconicoPlayerApi.origin) return;\n\n\t\tconst data = e.data;\n\n\t\tswitch (data.eventName) {\n\t\t\tcase 'playerStatusChange':\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t`player status changed: ${\n\t\t\t\t\t\tPlayerStatus[data.data.playerStatus] ??\n\t\t\t\t\t\tdata.data.playerStatus\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase 'statusChange':\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t`status changed: ${\n\t\t\t\t\t\tPlayerStatus[data.data.playerStatus] ??\n\t\t\t\t\t\tdata.data.playerStatus\n\t\t\t\t\t}`,\n\t\t\t\t);\n\n\t\t\t\tswitch (data.data.playerStatus) {\n\t\t\t\t\tcase PlayerStatus.Play:\n\t\t\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PlayerStatus.Pause:\n\t\t\t\t\t\tthis.options?.onPause?.();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PlayerStatus.End:\n\t\t\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'playerMetadataChange':\n\t\t\t\tif (data.data.duration !== undefined)\n\t\t\t\t\tthis.duration = data.data.duration / 1000;\n\n\t\t\t\tthis.currentTime =\n\t\t\t\t\tdata.data.currentTime === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: data.data.currentTime / 1000;\n\n\t\t\t\tthis.volume = data.data.volume;\n\n\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t\tpercent:\n\t\t\t\t\t\tthis.currentTime !== undefined &&\n\t\t\t\t\t\tthis.duration !== undefined\n\t\t\t\t\t\t\t? this.currentTime / this.duration\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tseconds: this.currentTime,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 'loadComplete':\n\t\t\t\tthis.logger.log(LogLevel.Debug, 'load completed');\n\n\t\t\t\tthis.duration = data.data.videoInfo.lengthInSeconds;\n\n\t\t\t\tthis.options?.onLoaded?.({ id: data.data.videoInfo.watchId });\n\t\t\t\tbreak;\n\n\t\t\tcase 'error':\n\t\t\t\t// TODO: Implement.\n\n\t\t\t\tthis.options?.onError?.(data);\n\t\t\t\tbreak;\n\n\t\t\tcase 'player-error:video:play':\n\t\t\tcase 'player-error:video:seek':\n\t\t\t\tthis.options?.onError?.(data);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t'message',\n\t\t\t\t\t(data as any).eventName,\n\t\t\t\t\t(data as any).data,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tasync attach(): Promise<void> {\n\t\twindow.addEventListener('message', this.handleMessage);\n\t}\n\n\tasync detach(): Promise<void> {\n\t\twindow.removeEventListener('message', this.handleMessage);\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.duration = undefined;\n\t\t\tthis.currentTime = undefined;\n\n\t\t\t// Wait for iframe to load.\n\t\t\tthis.player.onload = (): void => {\n\t\t\t\tthis.player.onload = null;\n\t\t\t\tresolve();\n\t\t\t};\n\n\t\t\tthis.player.src = `https://embed.nicovideo.jp/watch/${id}?jsapi=1&playerId=1`;\n\t\t});\n\t}\n\n\t// https://blog.hayu.io/web/create/nicovideo-embed-player-api/.\n\tprivate postMessage(message: any): void {\n\t\tthis.player.contentWindow?.postMessage(\n\t\t\t{\n\t\t\t\t...message,\n\t\t\t\tplayerId: '1' /* Needs to be a string, not a number. */,\n\t\t\t\tsourceConnectorType: 1,\n\t\t\t},\n\t\t\tNiconicoPlayerApi.origin,\n\t\t);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.postMessage({ eventName: 'play' });\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.postMessage({ eventName: 'pause' });\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.postMessage({ eventName: 'seek', data: { time: seconds * 1000 } });\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.postMessage({\n\t\t\teventName: 'volumeChange',\n\t\t\tdata: { volume: volume },\n\t\t});\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.postMessage({\n\t\t\teventName: 'mute',\n\t\t\tdata: { mute: muted },\n\t\t});\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.volume;\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { NiconicoPlayerApi } from '../players/NiconicoPlayerApi';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const NiconicoPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'NiconicoPlayer');\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLIFrameElement): Promise<HTMLIFrameElement> => {\n\t\t\t\treturn Promise.resolve(element);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<\n\t\t\t\tHTMLIFrameElement,\n\t\t\t\tHTMLIFrameElement,\n\t\t\t\tNiconicoPlayerApi\n\t\t\t>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={NiconicoPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t\t{/* eslint-disable-next-line jsx-a11y/iframe-has-title */}\n\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\t\tsrc={`https://embed.nicovideo.jp/watch/${videoId}?jsapi=1&playerId=1`}\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\tallowFullScreen\n\t\t\t\t\t\t\tstyle={{ border: 'none' }}\n\t\t\t\t\t\t\t// The player has to have the allow=\"autoplay\" attribute.\n\t\t\t\t\t\t\t// Otherwise it throws a NotAllowedError: \"play() failed because the user didn't interact with the document first\".\n\t\t\t\t\t\t\t// See also: https://github.com/vimeo/player.js/issues/389.\n\t\t\t\t\t\t\t// NOTE: An iframe element created by `PVPlayerNiconico.playerFactory.create` doesn't have the allow=\"autoplay\" attribute,\n\t\t\t\t\t\t\t// which causes the above issue when trying to autoplay a video.\n\t\t\t\t\t\t\tallow=\"autoplay; fullscreen\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import React from 'react';\n\nimport { IPlayerApi } from '../players';\nimport { ILogger, LogLevel } from '../players/ILogger';\n\ninterface NostalgicDivaContextProps extends IPlayerApi {\n\tlogger: ILogger;\n\tplayerApiRef: React.MutableRefObject<IPlayerApi | undefined>;\n}\n\nconst NostalgicDivaContext = React.createContext<NostalgicDivaContextProps>(\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\tundefined!,\n);\n\ninterface NostalgicDivaProviderProps {\n\tlogger?: ILogger;\n\tchildren?: React.ReactNode;\n}\n\nconst defaultLogger = new (class implements ILogger {\n\tprivate readonly title = 'nostalgic-diva';\n\n\tprivate createMessage(message: any): string {\n\t\treturn `[${this.title}] ${message}`;\n\t}\n\n\tprivate debug(message?: any, ...optionalParams: any): void {\n\t\tconsole.debug(this.createMessage(message), ...optionalParams);\n\t}\n\n\tprivate error(message?: any, ...optionalParams: any): void {\n\t\tconsole.error(this.createMessage(message), ...optionalParams);\n\t}\n\n\tprivate warn(message?: any, ...optionalParams: any): void {\n\t\tconsole.warn(this.createMessage(message), ...optionalParams);\n\t}\n\n\tisEnabled(): boolean {\n\t\treturn true;\n\t}\n\n\tlog(logLevel: LogLevel, message?: any, ...optionalParams: any[]): void {\n\t\tswitch (logLevel) {\n\t\t\tcase LogLevel.Debug:\n\t\t\t\tthis.debug(message, ...optionalParams);\n\t\t\t\tbreak;\n\t\t\tcase LogLevel.Warning:\n\t\t\t\tthis.warn(message, ...optionalParams);\n\t\t\t\tbreak;\n\t\t\tcase LogLevel.Error:\n\t\t\t\tthis.error(message, ...optionalParams);\n\t\t\t\tbreak;\n\t\t}\n\t}\n})();\n\nexport const NostalgicDivaProvider = ({\n\tlogger = defaultLogger,\n\tchildren,\n}: NostalgicDivaProviderProps): React.ReactElement => {\n\tconst playerApiRef = React.useRef<IPlayerApi>();\n\n\tconst loadVideo = React.useCallback(async (id: string) => {\n\t\tawait playerApiRef.current?.loadVideo(id);\n\t}, []);\n\n\tconst play = React.useCallback(async () => {\n\t\tawait playerApiRef.current?.play();\n\t}, []);\n\n\tconst pause = React.useCallback(async () => {\n\t\tawait playerApiRef.current?.pause();\n\t}, []);\n\n\tconst setCurrentTime = React.useCallback(async (seconds: number) => {\n\t\tconst playerApi = playerApiRef.current;\n\t\tif (!playerApi) return;\n\n\t\tawait playerApi.setCurrentTime(seconds);\n\t\tawait playerApi.play();\n\t}, []);\n\n\tconst setVolume = React.useCallback(async (volume: number) => {\n\t\tawait playerApiRef.current?.setVolume(volume);\n\t}, []);\n\n\tconst setMuted = React.useCallback(async (muted: boolean) => {\n\t\tawait playerApiRef.current?.setMuted(muted);\n\t}, []);\n\n\tconst getDuration = React.useCallback(async () => {\n\t\treturn await playerApiRef.current?.getDuration();\n\t}, []);\n\n\tconst getCurrentTime = React.useCallback(async () => {\n\t\treturn await playerApiRef.current?.getCurrentTime();\n\t}, []);\n\n\tconst getVolume = React.useCallback(async () => {\n\t\treturn await playerApiRef.current?.getVolume();\n\t}, []);\n\n\tconst value = React.useMemo(\n\t\t(): NostalgicDivaContextProps => ({\n\t\t\tlogger,\n\t\t\tplayerApiRef,\n\t\t\tloadVideo,\n\t\t\tplay,\n\t\t\tpause,\n\t\t\tsetCurrentTime,\n\t\t\tsetVolume,\n\t\t\tsetMuted,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t}),\n\t\t[\n\t\t\tlogger,\n\t\t\tloadVideo,\n\t\t\tplay,\n\t\t\tpause,\n\t\t\tsetCurrentTime,\n\t\t\tsetVolume,\n\t\t\tsetMuted,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t],\n\t);\n\n\treturn (\n\t\t<NostalgicDivaContext.Provider value={value}>\n\t\t\t{children}\n\t\t</NostalgicDivaContext.Provider>\n\t);\n};\n\nexport const useNostalgicDiva = (): NostalgicDivaContextProps => {\n\treturn React.useContext(NostalgicDivaContext);\n};\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/VocaDB/vocadb/blob/e147650a8f1f85c8fa865d0ab562126c278527ec/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerSoundCloud.ts.\nexport class SoundCloudPlayerApi extends PlayerApiImpl<SC.SoundCloudWidget> {\n\tprivate getDurationCore(): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getDuration(resolve);\n\t\t});\n\t}\n\n\tattach(id: string): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: reject */) => {\n\t\t\tthis.player.bind(SC.Widget.Events.READY, () => {\n\t\t\t\tthis.player.bind(\n\t\t\t\t\tSC.Widget.Events.PLAY_PROGRESS,\n\t\t\t\t\tasync (event) => {\n\t\t\t\t\t\tconst duration = await this.getDurationCore();\n\n\t\t\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\t\t\tduration: duration / 1000,\n\t\t\t\t\t\t\tpercent: event.currentPosition / duration,\n\t\t\t\t\t\t\tseconds: event.currentPosition / 1000,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.ERROR, (event) =>\n\t\t\t\t\tthis.options?.onError?.(event),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.PLAY, () =>\n\t\t\t\t\tthis.options?.onPlay?.(),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.PAUSE, () =>\n\t\t\t\t\tthis.options?.onPause?.(),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.FINISH, () =>\n\t\t\t\t\tthis.options?.onEnded?.(),\n\t\t\t\t);\n\n\t\t\t\tthis.options?.onLoaded?.({ id: id });\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.unbind(SC.Widget.Events.READY);\n\t\tthis.player.unbind(SC.Widget.Events.PLAY_PROGRESS);\n\t\tthis.player.unbind(SC.Widget.Events.ERROR);\n\t\tthis.player.unbind(SC.Widget.Events.PLAY);\n\t\tthis.player.unbind(SC.Widget.Events.PAUSE);\n\t\tthis.player.unbind(SC.Widget.Events.FINISH);\n\t}\n\n\tprivate static playerLoadAsync(\n\t\tplayer: SC.SoundCloudWidget,\n\t\turl: string,\n\t\toptions: Omit<SC.SoundCloudLoadOptions, 'callback'>,\n\t): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tplayer.load(url, { ...options, callback: resolve });\n\t\t});\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait SoundCloudPlayerApi.playerLoadAsync(this.player, id, {\n\t\t\tauto_play: true,\n\t\t});\n\n\t\tthis.options?.onLoaded?.({ id: id });\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seekTo(seconds * 1000);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume * 100);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.setVolume(muted ? 0 : 1 /* TODO */);\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\tconst duration = await this.getDurationCore();\n\t\treturn duration / 1000;\n\t}\n\n\tprivate getCurrentTimeCore(): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getPosition(resolve);\n\t\t});\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\tconst position = await this.getCurrentTimeCore();\n\t\treturn position / 1000;\n\t}\n\n\tprivate getVolumeCore(): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getVolume(resolve);\n\t\t});\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\tconst volume = await this.getVolumeCore();\n\t\treturn volume / 100;\n\t}\n}\n","// https://stackoverflow.com/a/61903296.\nexport function getScript(url: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst script = document.createElement('script') as any; /* TODO */\n\t\tscript.src = url;\n\t\tscript.async = true;\n\n\t\tscript.onerror = reject;\n\n\t\tscript.onload = script.onreadystatechange = function (): void {\n\t\t\tconst loadState = this.readyState;\n\n\t\t\tif (loadState && loadState !== 'loaded' && loadState !== 'complete')\n\t\t\t\treturn;\n\n\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\tresolve();\n\t\t};\n\n\t\tdocument.head.appendChild(script);\n\t});\n}\n","import { ILogger, LogLevel } from './ILogger';\nimport { getScript } from './getScript';\n\nconst urls: string[] = [];\n\nexport async function ensureScriptLoaded(\n\turl: string,\n\tlogger: ILogger,\n): Promise<boolean> {\n\tif (urls.includes(url)) {\n\t\tlogger.log(LogLevel.Debug, url, 'script is already loaded');\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tlogger.log(LogLevel.Debug, url, 'Loading script...');\n\n\t\tawait getScript(url);\n\n\t\tif (urls.includes(url)) {\n\t\t\tlogger.log(LogLevel.Debug, url, 'script is already loaded');\n\t\t\treturn false;\n\t\t} else {\n\t\t\turls.push(url);\n\t\t\tlogger.log(LogLevel.Debug, url, 'script loaded');\n\t\t\treturn true;\n\t\t}\n\t} catch (error) {\n\t\tlogger.log(LogLevel.Error, url, 'Failed to load script');\n\t\tthrow error;\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { SoundCloudPlayerApi } from '../players/SoundCloudPlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const SoundCloudPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'SoundCloudPlayer');\n\n\t\tconst loadScript = React.useCallback(async () => {\n\t\t\tawait ensureScriptLoaded(\n\t\t\t\t'https://w.soundcloud.com/player/api.js',\n\t\t\t\tlogger,\n\t\t\t);\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLIFrameElement): Promise<SC.SoundCloudWidget> => {\n\t\t\t\treturn Promise.resolve(SC.Widget(element));\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<\n\t\t\t\tHTMLIFrameElement,\n\t\t\t\tSC.SoundCloudWidget,\n\t\t\t\tSoundCloudPlayerApi\n\t\t\t>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={SoundCloudPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t// eslint-disable-next-line jsx-a11y/iframe-has-title\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tsrc={`https://w.soundcloud.com/player/?url=${videoId}`}\n\t\t\t\t\t\tframeBorder={0}\n\t\t\t\t\t\tallow=\"autoplay\"\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/cookpete/react-player/blob/e3c324bc6845698179d065fa408db515c2296b4b/src/players/Vimeo.js\nexport class VimeoPlayerApi extends PlayerApiImpl<Vimeo.Player> {\n\tasync attach(): Promise<void> {\n\t\tawait this.player.ready();\n\n\t\tthis.player.on('error', (data) => this.options?.onError?.(data));\n\t\tthis.player.on('loaded', (event) =>\n\t\t\tthis.options?.onLoaded?.({ id: event.id.toString() }),\n\t\t);\n\t\tthis.player.on('play', () => this.options?.onPlay?.());\n\t\tthis.player.on('pause', () => this.options?.onPause?.());\n\t\tthis.player.on('ended', () => this.options?.onEnded?.());\n\t\tthis.player.on('timeupdate', (data) => {\n\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\tduration: data.duration,\n\t\t\t\tpercent: data.percent,\n\t\t\t\tseconds: data.seconds,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.off('error');\n\t\tthis.player.off('loaded');\n\t\tthis.player.off('play');\n\t\tthis.player.off('pause');\n\t\tthis.player.off('ended');\n\t\tthis.player.off('timeupdate');\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait this.player.loadVideo(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tawait this.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tawait this.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tawait this.player.setCurrentTime(seconds);\n\t}\n\n\tasync setVolume(fraction: number): Promise<void> {\n\t\tawait this.player.setVolume(fraction);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tawait this.player.setMuted(muted);\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn await this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn await this.player.getVolume();\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { VimeoPlayerApi } from '../players/VimeoPlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const VimeoPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'VimeoPlayer');\n\n\t\tconst loadScript = React.useCallback(async () => {\n\t\t\tawait ensureScriptLoaded(\n\t\t\t\t'https://player.vimeo.com/api/player.js',\n\t\t\t\tlogger,\n\t\t\t);\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLIFrameElement): Promise<Vimeo.Player> => {\n\t\t\t\treturn Promise.resolve(new Vimeo.Player(element));\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLIFrameElement, Vimeo.Player, VimeoPlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={VimeoPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t// eslint-disable-next-line jsx-a11y/iframe-has-title\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tsrc={`https://player.vimeo.com/video/${videoId}`}\n\t\t\t\t\t\tframeBorder={0}\n\t\t\t\t\t\tallow=\"autoplay\"\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { LogLevel } from './ILogger';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\ndeclare global {\n\tinterface Window {\n\t\tonYouTubeIframeAPIReady(): void;\n\t}\n}\n\nenum PlayerState {\n\tUNSTARTED = -1,\n\tENDED = 0,\n\tPLAYING = 1,\n\tPAUSED = 2,\n\tBUFFERING = 3,\n\tCUED = 5,\n}\n\n// https://github.com/VocaDB/vocadb/blob/076dac9f0808aba5da7332209fdfd2ff4e12c235/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerYoutube.ts.\nexport class YouTubePlayerApi extends PlayerApiImpl<YT.Player> {\n\tprivate previousTime?: number;\n\n\tprivate timeUpdateIntervalId?: number;\n\n\tprivate clearTimeUpdateInterval(): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'clearTimeUpdateInterval',\n\t\t\tthis.timeUpdateIntervalId,\n\t\t);\n\n\t\twindow.clearInterval(this.timeUpdateIntervalId);\n\n\t\tthis.timeUpdateIntervalId = undefined;\n\t}\n\n\tprivate invokeTimeUpdate(player: YT.Player): void {\n\t\tconst currentTime = player.getCurrentTime();\n\t\tif (currentTime === this.previousTime) return;\n\n\t\tconst duration = player.getDuration();\n\t\tthis.options?.onTimeUpdate?.({\n\t\t\tduration: duration,\n\t\t\tpercent: currentTime / duration,\n\t\t\tseconds: currentTime,\n\t\t});\n\n\t\tthis.previousTime = currentTime;\n\t}\n\n\tprivate setTimeUpdateInterval(): void {\n\t\tthis.logger.log(LogLevel.Debug, 'setTimeUpdateInterval');\n\n\t\tthis.clearTimeUpdateInterval();\n\n\t\tthis.timeUpdateIntervalId = window.setInterval(\n\t\t\t() => this.invokeTimeUpdate(this.player),\n\t\t\t250,\n\t\t);\n\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'timeUpdateIntervalId',\n\t\t\tthis.timeUpdateIntervalId,\n\t\t);\n\n\t\tthis.invokeTimeUpdate(this.player);\n\t}\n\n\tattach(id: string): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: reject */) => {\n\t\t\tthis.player.addEventListener('onReady', async () => {\n\t\t\t\tthis.player.addEventListener('onError', (event) =>\n\t\t\t\t\tthis.options?.onError?.(event.data),\n\t\t\t\t);\n\t\t\t\tthis.player.addEventListener(\n\t\t\t\t\t'onStateChange',\n\t\t\t\t\t(event: YT.EventArgs): void => {\n\t\t\t\t\t\tthis.logger.log(\n\t\t\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t\t\t`state changed: ${PlayerState[event.data]}`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tswitch (event.data) {\n\t\t\t\t\t\t\tcase YT.PlayerState.CUED:\n\t\t\t\t\t\t\t\tthis.options?.onLoaded?.({ id: id });\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.PLAYING:\n\t\t\t\t\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\t\t\t\t\tthis.setTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.PAUSED:\n\t\t\t\t\t\t\t\tthis.options?.onPause?.();\n\t\t\t\t\t\t\t\tthis.clearTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.ENDED:\n\t\t\t\t\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\t\t\t\t\tthis.clearTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait this.loadVideo(id);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.clearTimeUpdateInterval();\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.previousTime = undefined;\n\t\tthis.player.cueVideoById(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.playVideo();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pauseVideo();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seekTo(seconds);\n\n\t\tthis.invokeTimeUpdate(this.player);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume * 100);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tif (muted) {\n\t\t\tthis.player.mute();\n\t\t} else {\n\t\t\tthis.player.unMute();\n\t\t}\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.player.getVolume() / 100;\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { YouTubePlayerApi } from '../players/YouTubePlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nconst origin = 'https://www.youtube-nocookie.com';\n\nexport const YouTubePlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'YouTubePlayer');\n\n\t\tconst loadScript = React.useCallback((): Promise<void> => {\n\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\tconst first = await ensureScriptLoaded(\n\t\t\t\t\t'https://www.youtube.com/iframe_api',\n\t\t\t\t\tlogger,\n\t\t\t\t);\n\n\t\t\t\tif (first) {\n\t\t\t\t\t// https://stackoverflow.com/a/18154942.\n\t\t\t\t\twindow.onYouTubeIframeAPIReady = (): void => {\n\t\t\t\t\t\tlogger.log(LogLevel.Debug, 'YouTube iframe API ready');\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLDivElement): Promise<YT.Player> => {\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tnew YT.Player(element, {\n\t\t\t\t\t\thost: origin,\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLDivElement, YT.Player, YouTubePlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={YouTubePlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef): React.ReactElement => (\n\t\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t\t<div ref={playerElementRef} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { PlayerOptions, PlayerType } from '../players/PlayerApi';\nimport { AudioPlayer } from './AudioPlayer';\nimport { NiconicoPlayer } from './NiconicoPlayer';\nimport { useNostalgicDiva } from './NostalgicDivaProvider';\nimport { PlayerProps } from './PlayerContainer';\nimport { SoundCloudPlayer } from './SoundCloudPlayer';\nimport { VimeoPlayer } from './VimeoPlayer';\nimport { YouTubePlayer } from './YouTubePlayer';\n\nconst players: Record<PlayerType, React.ElementType<PlayerProps>> = {\n\tAudio: AudioPlayer,\n\tNiconico: NiconicoPlayer,\n\tSoundCloud: SoundCloudPlayer,\n\tVimeo: VimeoPlayer,\n\tYouTube: YouTubePlayer,\n};\n\ninterface NostalgicDivaProps {\n\ttype: PlayerType;\n\tvideoId: string;\n\toptions?: PlayerOptions;\n}\n\nexport const NostalgicDiva = React.memo(\n\t({ type, videoId, options }: NostalgicDivaProps): React.ReactElement => {\n\t\tconst { logger, playerApiRef } = useNostalgicDiva();\n\n\t\tlogger.log(LogLevel.Debug, 'NostalgicDiva');\n\n\t\tconst Player = players[type];\n\t\treturn (\n\t\t\t<Player\n\t\t\t\tlogger={logger}\n\t\t\t\ttype={type}\n\t\t\t\tplayerApiRef={playerApiRef}\n\t\t\t\tvideoId={videoId}\n\t\t\t\toptions={options}\n\t\t\t/>\n\t\t);\n\t},\n);\n"],"names":["LogLevel","PlayerApiImpl","logger","player","options","AudioPlayerApi","event","_b","_a","id","seconds","volume","muted","_PlayerApi","type","playerApiFactory","__publicField","message","optionalParams","PlayerApi","useFirstMountState","isFirst","useRef","strictEquals","prev","next","usePreviousDistinct","value","compare","prevRef","curRef","PlayerContainer","loadScript","playerFactory","playerApiRef","videoId","children","videoIdRef","React","playerElementRef","setPlayer","playerApi","setPlayerApi","previousVideoId","AudioPlayer","props","element","PlayerStatus","_NiconicoPlayerApi","e","data","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","_n","_m","resolve","reject","NiconicoPlayerApi","NiconicoPlayer","NostalgicDivaContext","defaultLogger","logLevel","NostalgicDivaProvider","loadVideo","play","pause","setCurrentTime","setVolume","setMuted","getDuration","getCurrentTime","getVolume","useNostalgicDiva","SoundCloudPlayerApi","duration","url","getScript","script","loadState","urls","ensureScriptLoaded","error","SoundCloudPlayer","VimeoPlayerApi","fraction","VimeoPlayer","PlayerState","YouTubePlayerApi","currentTime","origin","YouTubePlayer","players","NostalgicDiva","Player"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/players/ILogger.ts","../src/players/PlayerApiImpl.ts","../src/players/AudioPlayerApi.ts","../src/players/PlayerApi.ts","../src/components/useFirstMountState.ts","../src/components/usePreviousDistinct.ts","../src/components/PlayerContainer.tsx","../src/components/AudioPlayer.tsx","../src/players/DailymotionPlayerApi.ts","../src/players/getScript.ts","../src/players/ensureScriptLoaded.ts","../src/components/DailymotionPlayer.tsx","../src/players/NiconicoPlayerApi.ts","../src/components/NiconicoPlayer.tsx","../src/components/NostalgicDivaProvider.tsx","../src/players/SoundCloudPlayerApi.ts","../src/components/SoundCloudPlayer.tsx","../src/players/TwitchPlayerApi.ts","../src/components/TwitchPlayer.tsx","../src/players/VimeoPlayerApi.ts","../src/components/VimeoPlayer.tsx","../src/players/YouTubePlayerApi.ts","../src/components/YouTubePlayer.tsx","../src/components/NostalgicDiva.tsx"],"sourcesContent":["// https://source.dot.net/#Microsoft.Extensions.Logging.Abstractions/LogLevel.cs,d07793e8b722b77e,references\nexport enum LogLevel {\n\t/**\n\t * Logs that contain the most detailed messages. These messages may contain sensitive application data.\n\t * These messages are disabled by default and should never be enabled in a production environment.\n\t */\n\tTrace = 0,\n\t/**\n\t * Logs that are used for interactive investigation during development. These logs should primarily contain\n\t * information useful for debugging and have no long-term value.\n\t */\n\tDebug = 1,\n\t/**\n\t * Logs that track the general flow of the application. These logs should have long-term value.\n\t */\n\tInformation = 2,\n\t/**\n\t * Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the\n\t * application execution to stop.\n\t */\n\tWarning = 3,\n\t/**\n\t * Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a\n\t * failure in the current activity, not an application-wide failure.\n\t */\n\tError = 4,\n\t/**\n\t * Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires\n\t * immediate attention.\n\t */\n\tCritical = 5,\n\t/**\n\t * Not used for writing log messages. Specifies that a logging category should not write any messages.\n\t */\n\tNone = 6,\n}\n\n// https://source.dot.net/#Microsoft.Extensions.Logging.Abstractions/ILogger.cs,0976525f5d1b9e54,references\nexport interface ILogger {\n\tisEnabled(logLevel: LogLevel): boolean;\n\tlog(logLevel: LogLevel, message?: any, ...optionalParams: any[]): void;\n}\n","import { ILogger, LogLevel } from './ILogger';\nimport { IPlayerApi, PlayerOptions } from './PlayerApi';\n\nexport abstract class PlayerApiImpl<TPlayer> implements IPlayerApi {\n\tconstructor(\n\t\tprotected readonly logger: ILogger,\n\t\tprotected readonly player: TPlayer,\n\t\tprotected readonly options: PlayerOptions | undefined,\n\t) {\n\t\tthis.logger.log(LogLevel.Debug, 'ctor');\n\t}\n\n\tabstract attach(id: string): Promise<void>;\n\tabstract detach(): Promise<void>;\n\tabstract loadVideo(id: string): Promise<void>;\n\tabstract play(): Promise<void>;\n\tabstract pause(): Promise<void>;\n\tabstract setCurrentTime(seconds: number): Promise<void>;\n\tabstract setVolume(volume: number): Promise<void>;\n\tabstract setMuted(muted: boolean): Promise<void>;\n\tabstract getDuration(): Promise<number | undefined>;\n\tabstract getCurrentTime(): Promise<number | undefined>;\n\tabstract getVolume(): Promise<number | undefined>;\n}\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/VocaDB/vocadb/blob/61b8c54f3eca906a477101dab4fdd9b154be310e/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerFile.ts.\nexport class AudioPlayerApi extends PlayerApiImpl<HTMLAudioElement> {\n\tasync attach(): Promise<void> {\n\t\tthis.player.onerror = (event): void => this.options?.onError?.(event);\n\t\tthis.player.onloadeddata = (): void =>\n\t\t\tthis.options?.onLoaded?.({ id: this.player.src });\n\t\tthis.player.onplay = (): void => this.options?.onPlay?.();\n\t\tthis.player.onpause = (): void => this.options?.onPause?.();\n\t\tthis.player.onended = (): void => this.options?.onEnded?.();\n\t\tthis.player.ontimeupdate = (): void => {\n\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\tduration: this.player.duration,\n\t\t\t\tpercent: this.player.currentTime / this.player.duration,\n\t\t\t\tseconds: this.player.currentTime,\n\t\t\t});\n\t\t};\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.onerror = null;\n\t\tthis.player.onloadeddata = null;\n\t\tthis.player.onplay = null;\n\t\tthis.player.onpause = null;\n\t\tthis.player.onended = null;\n\t\tthis.player.ontimeupdate = null;\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.src = id;\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.currentTime = seconds;\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.volume = volume;\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.muted = muted;\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.player.volume;\n\t}\n}\n","import { ILogger, LogLevel } from './ILogger';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\nexport type PlayerType =\n\t| 'Audio'\n\t| 'Dailymotion'\n\t| 'Niconico'\n\t| 'SoundCloud'\n\t| 'Twitch'\n\t| 'Vimeo'\n\t| 'YouTube';\n\nexport interface LoadedEvent {\n\tid: string;\n}\n\nexport interface TimeEvent {\n\tduration: number | undefined;\n\tpercent: number | undefined;\n\tseconds: number | undefined;\n}\n\nexport interface PlayerOptions {\n\tonError?(event: any): void;\n\tonLoaded?(event: LoadedEvent): void;\n\tonPlay?(): void;\n\tonPause?(): void;\n\tonEnded?(): void;\n\tonTimeUpdate?(event: TimeEvent): void;\n}\n\nexport interface IPlayerApi {\n\tloadVideo(id: string): Promise<void>;\n\tplay(): Promise<void>;\n\tpause(): Promise<void>;\n\tsetCurrentTime(seconds: number): Promise<void>;\n\tsetVolume(volume: number): Promise<void>;\n\tsetMuted(muted: boolean): Promise<void>;\n\tgetDuration(): Promise<number | undefined>;\n\tgetCurrentTime(): Promise<number | undefined>;\n\tgetVolume(): Promise<number | undefined>;\n}\n\nexport class PlayerApi<\n\tTPlayer extends object,\n\tTPlayerApi extends PlayerApiImpl<TPlayer>,\n> implements IPlayerApi\n{\n\tprivate static nextId = 1;\n\n\tprivate readonly id: number;\n\tprivate impl?: TPlayerApi;\n\n\tconstructor(\n\t\tprivate readonly logger: ILogger,\n\t\tprivate readonly type: PlayerType,\n\t\tprivate readonly player: TPlayer,\n\t\tprivate readonly options: PlayerOptions | undefined,\n\t\tprivate readonly playerApiFactory: new (\n\t\t\tlogger: ILogger,\n\t\t\tplayer: TPlayer,\n\t\t\toptions: PlayerOptions | undefined,\n\t\t) => TPlayerApi,\n\t) {\n\t\tthis.id = PlayerApi.nextId++;\n\t}\n\n\tprivate createMessage(message: any): string {\n\t\treturn `${this.type}#${this.id} ${message}`;\n\t}\n\n\tpublic debug(message?: any, ...optionalParams: any): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\tthis.createMessage(message),\n\t\t\t...optionalParams,\n\t\t);\n\t}\n\n\tpublic error(message?: any, ...optionalParams: any): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Error,\n\t\t\tthis.createMessage(message),\n\t\t\t...optionalParams,\n\t\t);\n\t}\n\n\tasync attach(id: string): Promise<void> {\n\t\tthis.debug('attach', id);\n\n\t\tif (this.impl) {\n\t\t\tthis.debug('player is already attached');\n\t\t\treturn;\n\t\t}\n\n\t\tthis.debug('Attaching player...');\n\n\t\tthis.impl = new this.playerApiFactory(\n\t\t\tthis.logger,\n\t\t\tthis.player,\n\t\t\tthis.options,\n\t\t);\n\n\t\tawait this.impl.attach(id);\n\n\t\tthis.debug('player attached');\n\t}\n\n\tprivate createPlayerNotAttachedError(): Error {\n\t\treturn new Error('player is not attached');\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.debug('detach');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tawait this.impl.detach();\n\n\t\tthis.impl = undefined;\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.debug('loadVideo', id);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tthis.debug('Loading video...');\n\n\t\tawait this.impl.loadVideo(id);\n\n\t\tthis.debug('video loaded', id);\n\t}\n\n\tplay(): Promise<void> {\n\t\tthis.debug('play');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.play();\n\t}\n\n\tpause(): Promise<void> {\n\t\tthis.debug('pause');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.pause();\n\t}\n\n\tsetCurrentTime(seconds: number): Promise<void> {\n\t\tthis.debug('setCurrentTime', seconds);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.setCurrentTime(seconds);\n\t}\n\n\tsetVolume(volume: number): Promise<void> {\n\t\tthis.debug('setVolume', volume);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.setVolume(volume);\n\t}\n\n\tsetMuted(muted: boolean): Promise<void> {\n\t\tthis.debug('setMuted', muted);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.setMuted(muted);\n\t}\n\n\tgetDuration(): Promise<number | undefined> {\n\t\tthis.debug('getDuration');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.getDuration();\n\t}\n\n\tgetCurrentTime(): Promise<number | undefined> {\n\t\tthis.debug('getCurrentTime');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.getCurrentTime();\n\t}\n\n\tgetVolume(): Promise<number | undefined> {\n\t\tthis.debug('getVolume');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.getVolume();\n\t}\n}\n","// https://github.com/streamich/react-use/blob/8ceb4c0f0c5625124f487b435a2fd0d3b3bc2a4f/src/useFirstMountState.ts\nimport { useRef } from 'react';\n\nexport function useFirstMountState(): boolean {\n\tconst isFirst = useRef(true);\n\n\tif (isFirst.current) {\n\t\tisFirst.current = false;\n\n\t\treturn true;\n\t}\n\n\treturn isFirst.current;\n}\n","// https://github.com/streamich/react-use/blob/8ceb4c0f0c5625124f487b435a2fd0d3b3bc2a4f/src/usePreviousDistinct.ts.\nimport { useRef } from 'react';\n\nimport { useFirstMountState } from './useFirstMountState';\n\nexport type Predicate<T> = (prev: T | undefined, next: T) => boolean;\n\nconst strictEquals = <T>(prev: T | undefined, next: T): boolean =>\n\tprev === next;\n\nexport default function usePreviousDistinct<T>(\n\tvalue: T,\n\tcompare: Predicate<T> = strictEquals,\n): T | undefined {\n\tconst prevRef = useRef<T>();\n\tconst curRef = useRef<T>(value);\n\tconst isFirstMount = useFirstMountState();\n\n\tif (!isFirstMount && !compare(curRef.current, value)) {\n\t\tprevRef.current = curRef.current;\n\t\tcurRef.current = value;\n\t}\n\n\treturn prevRef.current;\n}\n","import React from 'react';\n\nimport { ILogger, LogLevel } from '../players/ILogger';\nimport {\n\tIPlayerApi,\n\tPlayerApi,\n\tPlayerOptions,\n\tPlayerType,\n} from '../players/PlayerApi';\nimport { PlayerApiImpl } from '../players/PlayerApiImpl';\nimport usePreviousDistinct from './usePreviousDistinct';\n\nexport interface PlayerProps {\n\tlogger: ILogger;\n\ttype: PlayerType;\n\tplayerApiRef: React.MutableRefObject<IPlayerApi | undefined> | undefined;\n\tvideoId: string;\n\toptions: PlayerOptions | undefined;\n}\n\ninterface PlayerContainerProps<\n\tTElement extends HTMLElement,\n\tTPlayer extends object,\n\tTPlayerApi extends PlayerApiImpl<TPlayer>,\n> extends PlayerProps {\n\tloadScript: (() => Promise<void>) | undefined;\n\tplayerFactory: (element: TElement, videoId: string) => Promise<TPlayer>;\n\tplayerApiFactory: new (\n\t\tlogger: ILogger,\n\t\tplayer: TPlayer,\n\t\toptions: PlayerOptions | undefined,\n\t) => TPlayerApi;\n\tchildren: (\n\t\tplayerElementRef: React.MutableRefObject<TElement>,\n\t\tvideoId: string,\n\t) => React.ReactNode;\n}\n\nexport const PlayerContainer = <\n\tTElement extends HTMLElement,\n\tTPlayer extends object,\n\tTPlayerApi extends PlayerApiImpl<TPlayer>,\n>({\n\tlogger,\n\ttype,\n\tloadScript,\n\tplayerFactory,\n\tplayerApiRef,\n\tvideoId,\n\toptions,\n\tplayerApiFactory,\n\tchildren,\n}: PlayerContainerProps<TElement, TPlayer, TPlayerApi>): React.ReactElement<\n\tPlayerContainerProps<TElement, TPlayer, TPlayerApi>\n> => {\n\tlogger.log(LogLevel.Debug, 'PlayerContainer');\n\n\tconst videoIdRef = React.useRef(videoId);\n\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\tconst playerElementRef = React.useRef<TElement>(undefined!);\n\n\tconst [player, setPlayer] = React.useState<TPlayer>();\n\tconst [playerApi, setPlayerApi] = React.useState<IPlayerApi>();\n\n\tReact.useEffect(() => {\n\t\t(loadScript?.() ?? Promise.resolve()).then(() => {\n\t\t\tplayerFactory(playerElementRef.current, videoIdRef.current).then(\n\t\t\t\t(player) => {\n\t\t\t\t\tsetPlayer(player);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}, [loadScript, playerFactory]);\n\n\t// Make sure that `options` do not change between re-rendering.\n\tReact.useEffect(() => {\n\t\tif (player === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst playerApi = new PlayerApi(\n\t\t\tlogger,\n\t\t\ttype,\n\t\t\tplayer,\n\t\t\toptions,\n\t\t\tplayerApiFactory,\n\t\t);\n\n\t\tif (playerApiRef) {\n\t\t\tplayerApiRef.current = playerApi;\n\t\t}\n\n\t\tplayerApi\n\t\t\t.attach(videoIdRef.current)\n\t\t\t.then(() => setPlayerApi(playerApi));\n\n\t\treturn (): void => {\n\t\t\tif (playerApiRef) {\n\t\t\t\tif (playerApi !== playerApiRef.current) {\n\t\t\t\t\tthrow new Error('playerApi differs');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplayerApi.detach().finally(() => setPlayerApi(undefined));\n\t\t};\n\t}, [\n\t\tlogger,\n\t\ttype,\n\t\tloadScript,\n\t\tplayer,\n\t\toptions,\n\t\tplayerApiFactory,\n\t\tplayerApiRef,\n\t]);\n\n\tconst previousVideoId = usePreviousDistinct(videoId);\n\tReact.useEffect(() => {\n\t\t// If `previousVideoId` is undefined, then it means that the video has already been loaded by either\n\t\t// 1. `<audio>`s `src` attribute (e.g. `AudioPlayer`),\n\t\t// 2. `<iframe>`'s `src` attribute (e.g. `NiconicoPlayer`, `SoundCloudPlayer` and `VimeoPlayer`), or\n\t\t// 3. the `attach` method of the player API (e.g. `YouTubePlayer`).\n\t\tif (previousVideoId === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tplayerApi?.loadVideo(videoId);\n\t}, [previousVideoId, videoId, playerApi]);\n\n\t// Make sure that `videoId` does not change between re-rendering.\n\treturn <>{children(playerElementRef, videoIdRef.current)}</>;\n};\n","import React from 'react';\n\nimport { AudioPlayerApi } from '../players/AudioPlayerApi';\nimport { LogLevel } from '../players/ILogger';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const AudioPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'AudioPlayer');\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLAudioElement): Promise<HTMLAudioElement> => {\n\t\t\t\treturn Promise.resolve(element);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLAudioElement, HTMLAudioElement, AudioPlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={AudioPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t<audio\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tsrc={videoId}\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t\tpreload=\"auto\"\n\t\t\t\t\t\tautoPlay\n\t\t\t\t\t\tcontrols\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\nconst events = [\n\t'apiready',\n\t'seeked',\n\t'video_end',\n\t'durationchange',\n\t'pause',\n\t'playing',\n\t'error',\n] satisfies DM.EventType[];\n\nexport class DailymotionPlayerApi extends PlayerApiImpl<DM.player> {\n\tprivate handlePlayerEvents = (e: { type: DM.EventType }): void => {\n\t\tswitch (e.type) {\n\t\t\tcase 'apiready':\n\t\t\t\tthis.options?.onLoaded?.({ id: this.player.video.videoId });\n\t\t\t\tbreak;\n\t\t\tcase 'seeked':\n\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\tduration: this.player.duration,\n\t\t\t\t\tpercent: this.player.currentTime / this.player.duration,\n\t\t\t\t\tseconds: this.player.currentTime,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 'video_end':\n\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\tbreak;\n\t\t\tcase 'durationchange':\n\t\t\t\tbreak;\n\t\t\tcase 'pause':\n\t\t\t\tthis.options?.onPause?.();\n\t\t\t\tbreak;\n\t\t\tcase 'playing':\n\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\tbreak;\n\t\t\tcase 'error':\n\t\t\t\tthis.options?.onError?.(e);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tasync attach(id: string): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\tthis.player.addEventListener(event, this.handlePlayerEvents);\n\t\t}\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\tthis.player.removeEventListener(event, this.handlePlayerEvents);\n\t\t}\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.load(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seek(seconds);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.setMuted(muted);\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.player.volume;\n\t}\n}\n","// https://stackoverflow.com/a/61903296.\nexport function getScript(url: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst script = document.createElement('script') as any; /* TODO */\n\t\tscript.src = url;\n\t\tscript.async = true;\n\n\t\tscript.onerror = reject;\n\n\t\tscript.onload = script.onreadystatechange = function (): void {\n\t\t\tconst loadState = this.readyState;\n\n\t\t\tif (loadState && loadState !== 'loaded' && loadState !== 'complete')\n\t\t\t\treturn;\n\n\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\tresolve();\n\t\t};\n\n\t\tdocument.head.appendChild(script);\n\t});\n}\n","import { ILogger, LogLevel } from './ILogger';\nimport { getScript } from './getScript';\n\nconst urls: string[] = [];\n\nexport async function ensureScriptLoaded(\n\turl: string,\n\tlogger: ILogger,\n): Promise<boolean> {\n\tif (urls.includes(url)) {\n\t\tlogger.log(LogLevel.Debug, url, 'script is already loaded');\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tlogger.log(LogLevel.Debug, url, 'Loading script...');\n\n\t\tawait getScript(url);\n\n\t\tif (urls.includes(url)) {\n\t\t\tlogger.log(LogLevel.Debug, url, 'script is already loaded');\n\t\t\treturn false;\n\t\t} else {\n\t\t\turls.push(url);\n\t\t\tlogger.log(LogLevel.Debug, url, 'script loaded');\n\t\t\treturn true;\n\t\t}\n\t} catch (error) {\n\t\tlogger.log(LogLevel.Error, url, 'Failed to load script');\n\t\tthrow error;\n\t}\n}\n","import React from 'react';\n\nimport { DailymotionPlayerApi } from '../players/DailymotionPlayerApi';\nimport { LogLevel } from '../players/ILogger';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const DailymotionPlayer = React.memo(\n\t({ options, ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'DailymotionPlayer');\n\n\t\tconst loadScript = React.useCallback(async () => {\n\t\t\tawait ensureScriptLoaded('https://api.dmcdn.net/all.js', logger);\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLDivElement, videoId: string): Promise<DM.player> => {\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tnew DM.player(element, {\n\t\t\t\t\t\tvideo: videoId,\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\tevents: {\n\t\t\t\t\t\t\tapiready: (): void => {\n\t\t\t\t\t\t\t\toptions?.onLoaded?.({ id: videoId });\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tseeked: (): void => {\n\t\t\t\t\t\t\t\toptions?.onTimeUpdate?.({\n\t\t\t\t\t\t\t\t\tduration: 0,\n\t\t\t\t\t\t\t\t\tpercent: 0,\n\t\t\t\t\t\t\t\t\tseconds: 0,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tvideo_end: (): void => {\n\t\t\t\t\t\t\t\toptions?.onEnded?.();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tdurationchange: (): void => {},\n\t\t\t\t\t\t\tpause: (): void => {\n\t\t\t\t\t\t\t\toptions?.onPause?.();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tplaying: (): void => {\n\t\t\t\t\t\t\t\toptions?.onPlay?.();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\twaiting: (): void => {},\n\t\t\t\t\t\t\terror: (error): void => {\n\t\t\t\t\t\t\t\toptions?.onError?.(error);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[options],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLDivElement, DM.player, DailymotionPlayerApi>\n\t\t\t\t{...props}\n\t\t\t\toptions={options}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={DailymotionPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef): React.ReactElement => (\n\t\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t\t<div ref={playerElementRef} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { LogLevel } from './ILogger';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\ndeclare global {\n\tinterface Window {\n\t\tonNicoPlayerFactoryReady: (callback: nico.NicoPlayerFactory) => void;\n\t}\n}\n\nenum PlayerStatus {\n\tPlay = 2,\n\tPause = 3,\n\tEnd = 4,\n}\n\n// https://github.com/VocaDB/vocadb/blob/a4b5f9d8186772d7e6f58f997bbcbb51509d2539/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerNico.ts.\nexport class NiconicoPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {\n\tprivate static readonly origin = 'https://embed.nicovideo.jp';\n\n\tprivate duration?: number;\n\tprivate currentTime?: number;\n\tprivate volume?: number;\n\n\tprivate handleMessage = (e: nico.PlayerEvent): void => {\n\t\tif (e.origin !== NiconicoPlayerApi.origin) return;\n\n\t\tconst data = e.data;\n\n\t\tswitch (data.eventName) {\n\t\t\tcase 'playerStatusChange':\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t`player status changed: ${\n\t\t\t\t\t\tPlayerStatus[data.data.playerStatus] ??\n\t\t\t\t\t\tdata.data.playerStatus\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase 'statusChange':\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t`status changed: ${\n\t\t\t\t\t\tPlayerStatus[data.data.playerStatus] ??\n\t\t\t\t\t\tdata.data.playerStatus\n\t\t\t\t\t}`,\n\t\t\t\t);\n\n\t\t\t\tswitch (data.data.playerStatus) {\n\t\t\t\t\tcase PlayerStatus.Play:\n\t\t\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PlayerStatus.Pause:\n\t\t\t\t\t\tthis.options?.onPause?.();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PlayerStatus.End:\n\t\t\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'playerMetadataChange':\n\t\t\t\tif (data.data.duration !== undefined)\n\t\t\t\t\tthis.duration = data.data.duration / 1000;\n\n\t\t\t\tthis.currentTime =\n\t\t\t\t\tdata.data.currentTime === undefined\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: data.data.currentTime / 1000;\n\n\t\t\t\tthis.volume = data.data.volume;\n\n\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t\tpercent:\n\t\t\t\t\t\tthis.currentTime !== undefined &&\n\t\t\t\t\t\tthis.duration !== undefined\n\t\t\t\t\t\t\t? this.currentTime / this.duration\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tseconds: this.currentTime,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 'loadComplete':\n\t\t\t\tthis.logger.log(LogLevel.Debug, 'load completed');\n\n\t\t\t\tthis.duration = data.data.videoInfo.lengthInSeconds;\n\n\t\t\t\tthis.options?.onLoaded?.({ id: data.data.videoInfo.watchId });\n\t\t\t\tbreak;\n\n\t\t\tcase 'error':\n\t\t\t\t// TODO: Implement.\n\n\t\t\t\tthis.options?.onError?.(data);\n\t\t\t\tbreak;\n\n\t\t\tcase 'player-error:video:play':\n\t\t\tcase 'player-error:video:seek':\n\t\t\t\tthis.options?.onError?.(data);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t'message',\n\t\t\t\t\t(data as any).eventName,\n\t\t\t\t\t(data as any).data,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tasync attach(): Promise<void> {\n\t\twindow.addEventListener('message', this.handleMessage);\n\t}\n\n\tasync detach(): Promise<void> {\n\t\twindow.removeEventListener('message', this.handleMessage);\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.duration = undefined;\n\t\t\tthis.currentTime = undefined;\n\n\t\t\t// Wait for iframe to load.\n\t\t\tthis.player.onload = (): void => {\n\t\t\t\tthis.player.onload = null;\n\t\t\t\tresolve();\n\t\t\t};\n\n\t\t\tthis.player.src = `https://embed.nicovideo.jp/watch/${id}?jsapi=1&playerId=1`;\n\t\t});\n\t}\n\n\t// https://blog.hayu.io/web/create/nicovideo-embed-player-api/.\n\tprivate postMessage(message: any): void {\n\t\tthis.player.contentWindow?.postMessage(\n\t\t\t{\n\t\t\t\t...message,\n\t\t\t\tplayerId: '1' /* Needs to be a string, not a number. */,\n\t\t\t\tsourceConnectorType: 1,\n\t\t\t},\n\t\t\tNiconicoPlayerApi.origin,\n\t\t);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.postMessage({ eventName: 'play' });\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.postMessage({ eventName: 'pause' });\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.postMessage({ eventName: 'seek', data: { time: seconds * 1000 } });\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.postMessage({\n\t\t\teventName: 'volumeChange',\n\t\t\tdata: { volume: volume },\n\t\t});\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.postMessage({\n\t\t\teventName: 'mute',\n\t\t\tdata: { mute: muted },\n\t\t});\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.volume;\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { NiconicoPlayerApi } from '../players/NiconicoPlayerApi';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const NiconicoPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'NiconicoPlayer');\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLIFrameElement): Promise<HTMLIFrameElement> => {\n\t\t\t\treturn Promise.resolve(element);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<\n\t\t\t\tHTMLIFrameElement,\n\t\t\t\tHTMLIFrameElement,\n\t\t\t\tNiconicoPlayerApi\n\t\t\t>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={NiconicoPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t\t{/* eslint-disable-next-line jsx-a11y/iframe-has-title */}\n\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\t\tsrc={`https://embed.nicovideo.jp/watch/${videoId}?jsapi=1&playerId=1`}\n\t\t\t\t\t\t\twidth=\"100%\"\n\t\t\t\t\t\t\theight=\"100%\"\n\t\t\t\t\t\t\tallowFullScreen\n\t\t\t\t\t\t\tstyle={{ border: 'none' }}\n\t\t\t\t\t\t\t// The player has to have the allow=\"autoplay\" attribute.\n\t\t\t\t\t\t\t// Otherwise it throws a NotAllowedError: \"play() failed because the user didn't interact with the document first\".\n\t\t\t\t\t\t\t// See also: https://github.com/vimeo/player.js/issues/389.\n\t\t\t\t\t\t\t// NOTE: An iframe element created by `PVPlayerNiconico.playerFactory.create` doesn't have the allow=\"autoplay\" attribute,\n\t\t\t\t\t\t\t// which causes the above issue when trying to autoplay a video.\n\t\t\t\t\t\t\tallow=\"autoplay; fullscreen\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import React from 'react';\n\nimport { IPlayerApi } from '../players';\nimport { ILogger, LogLevel } from '../players/ILogger';\n\ninterface NostalgicDivaContextProps extends IPlayerApi {\n\tlogger: ILogger;\n\tplayerApiRef: React.MutableRefObject<IPlayerApi | undefined>;\n}\n\nconst NostalgicDivaContext = React.createContext<NostalgicDivaContextProps>(\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\tundefined!,\n);\n\ninterface NostalgicDivaProviderProps {\n\tlogger?: ILogger;\n\tchildren?: React.ReactNode;\n}\n\nconst defaultLogger = new (class implements ILogger {\n\tprivate readonly title = 'nostalgic-diva';\n\n\tprivate createMessage(message: any): string {\n\t\treturn `[${this.title}] ${message}`;\n\t}\n\n\tprivate debug(message?: any, ...optionalParams: any): void {\n\t\tconsole.debug(this.createMessage(message), ...optionalParams);\n\t}\n\n\tprivate error(message?: any, ...optionalParams: any): void {\n\t\tconsole.error(this.createMessage(message), ...optionalParams);\n\t}\n\n\tprivate warn(message?: any, ...optionalParams: any): void {\n\t\tconsole.warn(this.createMessage(message), ...optionalParams);\n\t}\n\n\tisEnabled(): boolean {\n\t\treturn true;\n\t}\n\n\tlog(logLevel: LogLevel, message?: any, ...optionalParams: any[]): void {\n\t\tswitch (logLevel) {\n\t\t\tcase LogLevel.Debug:\n\t\t\t\tthis.debug(message, ...optionalParams);\n\t\t\t\tbreak;\n\t\t\tcase LogLevel.Warning:\n\t\t\t\tthis.warn(message, ...optionalParams);\n\t\t\t\tbreak;\n\t\t\tcase LogLevel.Error:\n\t\t\t\tthis.error(message, ...optionalParams);\n\t\t\t\tbreak;\n\t\t}\n\t}\n})();\n\nexport const NostalgicDivaProvider = ({\n\tlogger = defaultLogger,\n\tchildren,\n}: NostalgicDivaProviderProps): React.ReactElement => {\n\tconst playerApiRef = React.useRef<IPlayerApi>();\n\n\tconst loadVideo = React.useCallback(async (id: string) => {\n\t\tawait playerApiRef.current?.loadVideo(id);\n\t}, []);\n\n\tconst play = React.useCallback(async () => {\n\t\tawait playerApiRef.current?.play();\n\t}, []);\n\n\tconst pause = React.useCallback(async () => {\n\t\tawait playerApiRef.current?.pause();\n\t}, []);\n\n\tconst setCurrentTime = React.useCallback(async (seconds: number) => {\n\t\tconst playerApi = playerApiRef.current;\n\t\tif (!playerApi) return;\n\n\t\tawait playerApi.setCurrentTime(seconds);\n\t\tawait playerApi.play();\n\t}, []);\n\n\tconst setVolume = React.useCallback(async (volume: number) => {\n\t\tawait playerApiRef.current?.setVolume(volume);\n\t}, []);\n\n\tconst setMuted = React.useCallback(async (muted: boolean) => {\n\t\tawait playerApiRef.current?.setMuted(muted);\n\t}, []);\n\n\tconst getDuration = React.useCallback(async () => {\n\t\treturn await playerApiRef.current?.getDuration();\n\t}, []);\n\n\tconst getCurrentTime = React.useCallback(async () => {\n\t\treturn await playerApiRef.current?.getCurrentTime();\n\t}, []);\n\n\tconst getVolume = React.useCallback(async () => {\n\t\treturn await playerApiRef.current?.getVolume();\n\t}, []);\n\n\tconst value = React.useMemo(\n\t\t(): NostalgicDivaContextProps => ({\n\t\t\tlogger,\n\t\t\tplayerApiRef,\n\t\t\tloadVideo,\n\t\t\tplay,\n\t\t\tpause,\n\t\t\tsetCurrentTime,\n\t\t\tsetVolume,\n\t\t\tsetMuted,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t}),\n\t\t[\n\t\t\tlogger,\n\t\t\tloadVideo,\n\t\t\tplay,\n\t\t\tpause,\n\t\t\tsetCurrentTime,\n\t\t\tsetVolume,\n\t\t\tsetMuted,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t],\n\t);\n\n\treturn (\n\t\t<NostalgicDivaContext.Provider value={value}>\n\t\t\t{children}\n\t\t</NostalgicDivaContext.Provider>\n\t);\n};\n\nexport const useNostalgicDiva = (): NostalgicDivaContextProps => {\n\treturn React.useContext(NostalgicDivaContext);\n};\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/VocaDB/vocadb/blob/e147650a8f1f85c8fa865d0ab562126c278527ec/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerSoundCloud.ts.\nexport class SoundCloudPlayerApi extends PlayerApiImpl<SC.SoundCloudWidget> {\n\tprivate getDurationCore(): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getDuration(resolve);\n\t\t});\n\t}\n\n\tattach(id: string): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: reject */) => {\n\t\t\tthis.player.bind(SC.Widget.Events.READY, () => {\n\t\t\t\tthis.player.bind(\n\t\t\t\t\tSC.Widget.Events.PLAY_PROGRESS,\n\t\t\t\t\tasync (event) => {\n\t\t\t\t\t\tconst duration = await this.getDurationCore();\n\n\t\t\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\t\t\tduration: duration / 1000,\n\t\t\t\t\t\t\tpercent: event.currentPosition / duration,\n\t\t\t\t\t\t\tseconds: event.currentPosition / 1000,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.ERROR, (event) =>\n\t\t\t\t\tthis.options?.onError?.(event),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.PLAY, () =>\n\t\t\t\t\tthis.options?.onPlay?.(),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.PAUSE, () =>\n\t\t\t\t\tthis.options?.onPause?.(),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.FINISH, () =>\n\t\t\t\t\tthis.options?.onEnded?.(),\n\t\t\t\t);\n\n\t\t\t\tthis.options?.onLoaded?.({ id: id });\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.unbind(SC.Widget.Events.READY);\n\t\tthis.player.unbind(SC.Widget.Events.PLAY_PROGRESS);\n\t\tthis.player.unbind(SC.Widget.Events.ERROR);\n\t\tthis.player.unbind(SC.Widget.Events.PLAY);\n\t\tthis.player.unbind(SC.Widget.Events.PAUSE);\n\t\tthis.player.unbind(SC.Widget.Events.FINISH);\n\t}\n\n\tprivate static playerLoadAsync(\n\t\tplayer: SC.SoundCloudWidget,\n\t\turl: string,\n\t\toptions: Omit<SC.SoundCloudLoadOptions, 'callback'>,\n\t): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tplayer.load(url, { ...options, callback: resolve });\n\t\t});\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait SoundCloudPlayerApi.playerLoadAsync(this.player, id, {\n\t\t\tauto_play: true,\n\t\t});\n\n\t\tthis.options?.onLoaded?.({ id: id });\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seekTo(seconds * 1000);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume * 100);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.setVolume(muted ? 0 : 1 /* TODO */);\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\tconst duration = await this.getDurationCore();\n\t\treturn duration / 1000;\n\t}\n\n\tprivate getCurrentTimeCore(): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getPosition(resolve);\n\t\t});\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\tconst position = await this.getCurrentTimeCore();\n\t\treturn position / 1000;\n\t}\n\n\tprivate getVolumeCore(): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getVolume(resolve);\n\t\t});\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\tconst volume = await this.getVolumeCore();\n\t\treturn volume / 100;\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { SoundCloudPlayerApi } from '../players/SoundCloudPlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const SoundCloudPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'SoundCloudPlayer');\n\n\t\tconst loadScript = React.useCallback(async () => {\n\t\t\tawait ensureScriptLoaded(\n\t\t\t\t'https://w.soundcloud.com/player/api.js',\n\t\t\t\tlogger,\n\t\t\t);\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLIFrameElement): Promise<SC.SoundCloudWidget> => {\n\t\t\t\treturn Promise.resolve(SC.Widget(element));\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<\n\t\t\t\tHTMLIFrameElement,\n\t\t\t\tSC.SoundCloudWidget,\n\t\t\t\tSoundCloudPlayerApi\n\t\t\t>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={SoundCloudPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t// eslint-disable-next-line jsx-a11y/iframe-has-title\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tsrc={`https://w.soundcloud.com/player/?url=${videoId}`}\n\t\t\t\t\t\tframeBorder={0}\n\t\t\t\t\t\tallow=\"autoplay\"\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\nexport class TwitchPlayerApi extends PlayerApiImpl<Twitch.Player> {\n\tprivate handleReady = (): void => {\n\t\tthis.options?.onLoaded?.({ id: this.player.getVideo() });\n\t};\n\n\tprivate handlePlay = (): void => {\n\t\tthis.options?.onPlay?.();\n\t};\n\n\tprivate handlePause = (): void => {\n\t\tthis.options?.onPause?.();\n\t};\n\n\tprivate handleEnded = (): void => {\n\t\tthis.options?.onEnded?.();\n\t};\n\n\tprivate handleSeek = (): void => {\n\t\tthis.options?.onTimeUpdate?.({\n\t\t\tduration: 0,\n\t\t\tpercent: 0,\n\t\t\tseconds: 0,\n\t\t});\n\t};\n\n\tasync attach(id: string): Promise<void> {\n\t\tthis.player.addEventListener(Twitch.Player.READY, this.handleReady);\n\t\tthis.player.addEventListener(Twitch.Player.PLAYING, this.handlePlay);\n\t\tthis.player.addEventListener(Twitch.Player.PAUSE, this.handlePause);\n\t\tthis.player.addEventListener(Twitch.Player.ENDED, this.handleEnded);\n\t\tthis.player.addEventListener(Twitch.Player.SEEK, this.handleSeek);\n\t}\n\n\tasync detach(): Promise<void> {}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.setVideo(id, 0);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seek(seconds);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.setMuted(muted);\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.player.getVolume();\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { TwitchPlayerApi } from '../players/TwitchPlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const TwitchPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'TwitchPlayer');\n\n\t\tconst loadScript = React.useCallback(async () => {\n\t\t\tawait ensureScriptLoaded(\n\t\t\t\t'https://embed.twitch.tv/embed/v1.js',\n\t\t\t\tlogger,\n\t\t\t);\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\tasync (\n\t\t\t\telement: HTMLDivElement,\n\t\t\t\tvideoId: string,\n\t\t\t): Promise<Twitch.Player> => {\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tnew Twitch.Player(element, {\n\t\t\t\t\t\tvideo: videoId,\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLDivElement, Twitch.Player, TwitchPlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={TwitchPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef): React.ReactElement => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/cookpete/react-player/blob/e3c324bc6845698179d065fa408db515c2296b4b/src/players/Vimeo.js\nexport class VimeoPlayerApi extends PlayerApiImpl<Vimeo.Player> {\n\tasync attach(): Promise<void> {\n\t\tawait this.player.ready();\n\n\t\tthis.player.on('error', (data) => this.options?.onError?.(data));\n\t\tthis.player.on('loaded', (event) =>\n\t\t\tthis.options?.onLoaded?.({ id: event.id.toString() }),\n\t\t);\n\t\tthis.player.on('play', () => this.options?.onPlay?.());\n\t\tthis.player.on('pause', () => this.options?.onPause?.());\n\t\tthis.player.on('ended', () => this.options?.onEnded?.());\n\t\tthis.player.on('timeupdate', (data) => {\n\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\tduration: data.duration,\n\t\t\t\tpercent: data.percent,\n\t\t\t\tseconds: data.seconds,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.off('error');\n\t\tthis.player.off('loaded');\n\t\tthis.player.off('play');\n\t\tthis.player.off('pause');\n\t\tthis.player.off('ended');\n\t\tthis.player.off('timeupdate');\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait this.player.loadVideo(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tawait this.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tawait this.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tawait this.player.setCurrentTime(seconds);\n\t}\n\n\tasync setVolume(fraction: number): Promise<void> {\n\t\tawait this.player.setVolume(fraction);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tawait this.player.setMuted(muted);\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn await this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn await this.player.getVolume();\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { VimeoPlayerApi } from '../players/VimeoPlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nexport const VimeoPlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'VimeoPlayer');\n\n\t\tconst loadScript = React.useCallback(async () => {\n\t\t\tawait ensureScriptLoaded(\n\t\t\t\t'https://player.vimeo.com/api/player.js',\n\t\t\t\tlogger,\n\t\t\t);\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLIFrameElement): Promise<Vimeo.Player> => {\n\t\t\t\treturn Promise.resolve(new Vimeo.Player(element));\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLIFrameElement, Vimeo.Player, VimeoPlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={VimeoPlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef, videoId): React.ReactElement => (\n\t\t\t\t\t// eslint-disable-next-line jsx-a11y/iframe-has-title\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tref={playerElementRef}\n\t\t\t\t\t\tsrc={`https://player.vimeo.com/video/${videoId}`}\n\t\t\t\t\t\tframeBorder={0}\n\t\t\t\t\t\tallow=\"autoplay\"\n\t\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import { LogLevel } from './ILogger';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\ndeclare global {\n\tinterface Window {\n\t\tonYouTubeIframeAPIReady(): void;\n\t}\n}\n\nenum PlayerState {\n\tUNSTARTED = -1,\n\tENDED = 0,\n\tPLAYING = 1,\n\tPAUSED = 2,\n\tBUFFERING = 3,\n\tCUED = 5,\n}\n\n// https://github.com/VocaDB/vocadb/blob/076dac9f0808aba5da7332209fdfd2ff4e12c235/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerYoutube.ts.\nexport class YouTubePlayerApi extends PlayerApiImpl<YT.Player> {\n\tprivate previousTime?: number;\n\n\tprivate timeUpdateIntervalId?: number;\n\n\tprivate clearTimeUpdateInterval(): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'clearTimeUpdateInterval',\n\t\t\tthis.timeUpdateIntervalId,\n\t\t);\n\n\t\twindow.clearInterval(this.timeUpdateIntervalId);\n\n\t\tthis.timeUpdateIntervalId = undefined;\n\t}\n\n\tprivate invokeTimeUpdate(player: YT.Player): void {\n\t\tconst currentTime = player.getCurrentTime();\n\t\tif (currentTime === this.previousTime) return;\n\n\t\tconst duration = player.getDuration();\n\t\tthis.options?.onTimeUpdate?.({\n\t\t\tduration: duration,\n\t\t\tpercent: currentTime / duration,\n\t\t\tseconds: currentTime,\n\t\t});\n\n\t\tthis.previousTime = currentTime;\n\t}\n\n\tprivate setTimeUpdateInterval(): void {\n\t\tthis.logger.log(LogLevel.Debug, 'setTimeUpdateInterval');\n\n\t\tthis.clearTimeUpdateInterval();\n\n\t\tthis.timeUpdateIntervalId = window.setInterval(\n\t\t\t() => this.invokeTimeUpdate(this.player),\n\t\t\t250,\n\t\t);\n\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'timeUpdateIntervalId',\n\t\t\tthis.timeUpdateIntervalId,\n\t\t);\n\n\t\tthis.invokeTimeUpdate(this.player);\n\t}\n\n\tattach(id: string): Promise<void> {\n\t\treturn new Promise((resolve, reject /* TODO: reject */) => {\n\t\t\tthis.player.addEventListener('onReady', async () => {\n\t\t\t\tthis.player.addEventListener('onError', (event) =>\n\t\t\t\t\tthis.options?.onError?.(event.data),\n\t\t\t\t);\n\t\t\t\tthis.player.addEventListener(\n\t\t\t\t\t'onStateChange',\n\t\t\t\t\t(event: YT.EventArgs): void => {\n\t\t\t\t\t\tthis.logger.log(\n\t\t\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t\t\t`state changed: ${PlayerState[event.data]}`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tswitch (event.data) {\n\t\t\t\t\t\t\tcase YT.PlayerState.CUED:\n\t\t\t\t\t\t\t\tthis.options?.onLoaded?.({ id: id });\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.PLAYING:\n\t\t\t\t\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\t\t\t\t\tthis.setTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.PAUSED:\n\t\t\t\t\t\t\t\tthis.options?.onPause?.();\n\t\t\t\t\t\t\t\tthis.clearTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.ENDED:\n\t\t\t\t\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\t\t\t\t\tthis.clearTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait this.loadVideo(id);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.clearTimeUpdateInterval();\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.previousTime = undefined;\n\t\tthis.player.cueVideoById(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.playVideo();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pauseVideo();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seekTo(seconds);\n\n\t\tthis.invokeTimeUpdate(this.player);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume * 100);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tif (muted) {\n\t\t\tthis.player.mute();\n\t\t} else {\n\t\t\tthis.player.unMute();\n\t\t}\n\t}\n\n\tasync getDuration(): Promise<number | undefined> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number | undefined> {\n\t\treturn this.player.getVolume() / 100;\n\t}\n}\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { YouTubePlayerApi } from '../players/YouTubePlayerApi';\nimport { ensureScriptLoaded } from '../players/ensureScriptLoaded';\nimport { PlayerContainer, PlayerProps } from './PlayerContainer';\n\nconst origin = 'https://www.youtube-nocookie.com';\n\nexport const YouTubePlayer = React.memo(\n\t({ ...props }: PlayerProps): React.ReactElement => {\n\t\tconst { logger } = props;\n\n\t\tlogger.log(LogLevel.Debug, 'YouTubePlayer');\n\n\t\tconst loadScript = React.useCallback((): Promise<void> => {\n\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\tconst first = await ensureScriptLoaded(\n\t\t\t\t\t'https://www.youtube.com/iframe_api',\n\t\t\t\t\tlogger,\n\t\t\t\t);\n\n\t\t\t\tif (first) {\n\t\t\t\t\t// https://stackoverflow.com/a/18154942.\n\t\t\t\t\twindow.onYouTubeIframeAPIReady = (): void => {\n\t\t\t\t\t\tlogger.log(LogLevel.Debug, 'YouTube iframe API ready');\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t});\n\t\t}, [logger]);\n\n\t\tconst playerFactory = React.useCallback(\n\t\t\t(element: HTMLDivElement): Promise<YT.Player> => {\n\t\t\t\treturn Promise.resolve(\n\t\t\t\t\tnew YT.Player(element, {\n\t\t\t\t\t\thost: origin,\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t[],\n\t\t);\n\n\t\treturn (\n\t\t\t<PlayerContainer<HTMLDivElement, YT.Player, YouTubePlayerApi>\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\n\t\t\t\tplayerFactory={playerFactory}\n\t\t\t\tplayerApiFactory={YouTubePlayerApi}\n\t\t\t>\n\t\t\t\t{(playerElementRef): React.ReactElement => (\n\t\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t\t<div ref={playerElementRef} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PlayerContainer>\n\t\t);\n\t},\n);\n","import React from 'react';\n\nimport { LogLevel } from '../players/ILogger';\nimport { PlayerOptions, PlayerType } from '../players/PlayerApi';\nimport { AudioPlayer } from './AudioPlayer';\nimport { DailymotionPlayer } from './DailymotionPlayer';\nimport { NiconicoPlayer } from './NiconicoPlayer';\nimport { useNostalgicDiva } from './NostalgicDivaProvider';\nimport { PlayerProps } from './PlayerContainer';\nimport { SoundCloudPlayer } from './SoundCloudPlayer';\nimport { TwitchPlayer } from './TwitchPlayer';\nimport { VimeoPlayer } from './VimeoPlayer';\nimport { YouTubePlayer } from './YouTubePlayer';\n\nconst players: Record<PlayerType, React.ElementType<PlayerProps>> = {\n\tAudio: AudioPlayer,\n\tDailymotion: DailymotionPlayer,\n\tNiconico: NiconicoPlayer,\n\tSoundCloud: SoundCloudPlayer,\n\tTwitch: TwitchPlayer,\n\tVimeo: VimeoPlayer,\n\tYouTube: YouTubePlayer,\n};\n\ninterface NostalgicDivaProps {\n\ttype: PlayerType;\n\tvideoId: string;\n\toptions?: PlayerOptions;\n}\n\nexport const NostalgicDiva = React.memo(\n\t({ type, videoId, options }: NostalgicDivaProps): React.ReactElement => {\n\t\tconst { logger, playerApiRef } = useNostalgicDiva();\n\n\t\tlogger.log(LogLevel.Debug, 'NostalgicDiva');\n\n\t\tconst Player = players[type];\n\t\treturn (\n\t\t\t<Player\n\t\t\t\tlogger={logger}\n\t\t\t\ttype={type}\n\t\t\t\tplayerApiRef={playerApiRef}\n\t\t\t\tvideoId={videoId}\n\t\t\t\toptions={options}\n\t\t\t/>\n\t\t);\n\t},\n);\n"],"names":["LogLevel","PlayerApiImpl","logger","player","options","AudioPlayerApi","event","_b","_a","id","seconds","volume","muted","_PlayerApi","type","playerApiFactory","__publicField","message","optionalParams","PlayerApi","useFirstMountState","isFirst","useRef","strictEquals","prev","next","usePreviousDistinct","value","compare","prevRef","curRef","PlayerContainer","loadScript","playerFactory","playerApiRef","videoId","children","videoIdRef","React","playerElementRef","setPlayer","playerApi","setPlayerApi","previousVideoId","AudioPlayer","props","element","events","DailymotionPlayerApi","_d","_c","_f","_e","_h","_g","_j","_i","_l","_k","getScript","url","resolve","reject","script","loadState","urls","ensureScriptLoaded","error","DailymotionPlayer","PlayerStatus","_NiconicoPlayerApi","data","_n","_m","NiconicoPlayerApi","NiconicoPlayer","NostalgicDivaContext","defaultLogger","logLevel","NostalgicDivaProvider","loadVideo","play","pause","setCurrentTime","setVolume","setMuted","getDuration","getCurrentTime","getVolume","useNostalgicDiva","SoundCloudPlayerApi","duration","SoundCloudPlayer","TwitchPlayerApi","TwitchPlayer","VimeoPlayerApi","fraction","VimeoPlayer","PlayerState","YouTubePlayerApi","currentTime","origin","YouTubePlayer","players","NostalgicDiva","Player"],"mappings":"iRACY,IAAAA,GAAAA,IAKXA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QAKAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QAIAA,EAAAA,EAAA,YAAc,CAAd,EAAA,cAKAA,EAAAA,EAAA,QAAU,CAAV,EAAA,UAKAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QAKAA,EAAAA,EAAA,SAAW,CAAX,EAAA,WAIAA,EAAAA,EAAA,KAAO,CAAP,EAAA,OAjCWA,IAAAA,GAAA,CAAA,CAAA,ECEL,MAAeC,CAA6C,CAClE,YACoBC,EACAC,EACAC,EAClB,CAHkB,KAAA,OAAAF,EACA,KAAA,OAAAC,EACA,KAAA,QAAAC,EAEnB,KAAK,OAAO,IAAIJ,EAAS,MAAO,MAAM,CACvC,CAaD,CCpBO,MAAMK,UAAuBJ,CAAgC,CACnE,MAAM,QAAwB,CAC7B,KAAK,OAAO,QAAWK,GAAgB,SAAA,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,EAAwBF,IAC1D,KAAA,OAAO,aAAe,IAAA,SAC1B,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,WAAd,YAAAD,EAAA,KAAAC,EAAyB,CAAE,GAAI,KAAK,OAAO,GAAK,IACjD,KAAK,OAAO,OAAS,IAAY,SAAA,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,YAAAD,EAAA,KAAAC,IACjC,KAAK,OAAO,QAAU,IAAY,SAAA,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,IAClC,KAAK,OAAO,QAAU,IAAY,SAAA,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,IAC7B,KAAA,OAAO,aAAe,IAAY,UACtCD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAU,KAAK,OAAO,SACtB,QAAS,KAAK,OAAO,YAAc,KAAK,OAAO,SAC/C,QAAS,KAAK,OAAO,WAAA,EACrB,CAEH,CAEA,MAAM,QAAwB,CAC7B,KAAK,OAAO,QAAU,KACtB,KAAK,OAAO,aAAe,KAC3B,KAAK,OAAO,OAAS,KACrB,KAAK,OAAO,QAAU,KACtB,KAAK,OAAO,QAAU,KACtB,KAAK,OAAO,aAAe,IAC5B,CAEA,MAAM,UAAUC,EAA2B,CAC1C,KAAK,OAAO,IAAMA,CACnB,CAEA,MAAM,MAAsB,CAC3B,KAAK,OAAO,MACb,CAEA,MAAM,OAAuB,CAC5B,KAAK,OAAO,OACb,CAEA,MAAM,eAAeC,EAAgC,CACpD,KAAK,OAAO,YAAcA,CAC3B,CAEA,MAAM,UAAUC,EAA+B,CAC9C,KAAK,OAAO,OAASA,CACtB,CAEA,MAAM,SAASC,EAA+B,CAC7C,KAAK,OAAO,MAAQA,CACrB,CAEA,MAAM,aAA2C,CAChD,OAAO,KAAK,OAAO,QACpB,CAEA,MAAM,gBAA8C,CACnD,OAAO,KAAK,OAAO,WACpB,CAEA,MAAM,WAAyC,CAC9C,OAAO,KAAK,OAAO,MACpB,CACD,CCrBO,MAAMC,EAAN,KAIP,CAMC,YACkBX,EACAY,EACAX,EACAC,EACAW,EAKhB,CAbeC,EAAA,WACTA,EAAA,aAGU,KAAA,OAAAd,EACA,KAAA,KAAAY,EACA,KAAA,OAAAX,EACA,KAAA,QAAAC,EACA,KAAA,iBAAAW,EAMjB,KAAK,GAAKF,EAAU,QACrB,CAEQ,cAAcI,EAAsB,CAC3C,MAAO,GAAG,KAAK,QAAQ,KAAK,MAAMA,GACnC,CAEO,MAAMA,KAAkBC,EAA2B,CACzD,KAAK,OAAO,IACXlB,EAAS,MACT,KAAK,cAAciB,CAAO,EAC1B,GAAGC,CAAA,CAEL,CAEO,MAAMD,KAAkBC,EAA2B,CACzD,KAAK,OAAO,IACXlB,EAAS,MACT,KAAK,cAAciB,CAAO,EAC1B,GAAGC,CAAA,CAEL,CAEA,MAAM,OAAOT,EAA2B,CAGvC,GAFK,KAAA,MAAM,SAAUA,CAAE,EAEnB,KAAK,KAAM,CACd,KAAK,MAAM,4BAA4B,EACvC,OAGD,KAAK,MAAM,qBAAqB,EAE3B,KAAA,KAAO,IAAI,KAAK,iBACpB,KAAK,OACL,KAAK,OACL,KAAK,OAAA,EAGA,MAAA,KAAK,KAAK,OAAOA,CAAE,EAEzB,KAAK,MAAM,iBAAiB,CAC7B,CAEQ,8BAAsC,CACtC,OAAA,IAAI,MAAM,wBAAwB,CAC1C,CAEA,MAAM,QAAwB,CAGzB,GAFJ,KAAK,MAAM,QAAQ,EAEf,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGN,MAAA,KAAK,KAAK,SAEhB,KAAK,KAAO,MACb,CAEA,MAAM,UAAUA,EAA2B,CAGtC,GAFC,KAAA,MAAM,YAAaA,CAAE,EAEtB,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGZ,KAAK,MAAM,kBAAkB,EAEvB,MAAA,KAAK,KAAK,UAAUA,CAAE,EAEvB,KAAA,MAAM,eAAgBA,CAAE,CAC9B,CAEA,MAAsB,CAGjB,GAFJ,KAAK,MAAM,MAAM,EAEb,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,MAClB,CAEA,OAAuB,CAGlB,GAFJ,KAAK,MAAM,OAAO,EAEd,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,OAClB,CAEA,eAAeC,EAAgC,CAG1C,GAFC,KAAA,MAAM,iBAAkBA,CAAO,EAEhC,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,eAAeA,CAAO,CACxC,CAEA,UAAUC,EAA+B,CAGpC,GAFC,KAAA,MAAM,YAAaA,CAAM,EAE1B,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,UAAUA,CAAM,CAClC,CAEA,SAASC,EAA+B,CAGnC,GAFC,KAAA,MAAM,WAAYA,CAAK,EAExB,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,SAASA,CAAK,CAChC,CAEA,aAA2C,CAGtC,GAFJ,KAAK,MAAM,aAAa,EAEpB,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,aAClB,CAEA,gBAA8C,CAGzC,GAFJ,KAAK,MAAM,gBAAgB,EAEvB,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,gBAClB,CAEA,WAAyC,CAGpC,GAFJ,KAAK,MAAM,WAAW,EAElB,KAAK,OAAS,OACjB,MAAM,KAAK,+BAGL,OAAA,KAAK,KAAK,WAClB,CACD,EA9KO,IAAMO,EAANN,EAKNG,EALYG,EAKG,SAAS,GC7ClB,SAASC,GAA8B,CACvC,MAAAC,EAAUC,SAAO,EAAI,EAE3B,OAAID,EAAQ,SACXA,EAAQ,QAAU,GAEX,IAGDA,EAAQ,OAChB,CCNA,MAAME,EAAe,CAAIC,EAAqBC,IAC7CD,IAASC,EAEc,SAAAC,EACvBC,EACAC,EAAwBL,EACR,CAChB,MAAMM,EAAUP,EAAAA,SACVQ,EAASR,SAAUK,CAAK,EAG9B,MAAI,CAFiBP,KAEA,CAACQ,EAAQE,EAAO,QAASH,CAAK,IAClDE,EAAQ,QAAUC,EAAO,QACzBA,EAAO,QAAUH,GAGXE,EAAQ,OAChB,CCcO,MAAME,EAAkB,CAI7B,CACD,OAAA7B,EACA,KAAAY,EACA,WAAAkB,EACA,cAAAC,EACA,aAAAC,EACA,QAAAC,EACA,QAAA/B,EACA,iBAAAW,EACA,SAAAqB,CACD,IAEK,CACGlC,EAAA,IAAIF,EAAS,MAAO,iBAAiB,EAEtC,MAAAqC,EAAaC,EAAM,OAAOH,CAAO,EAGjCI,EAAmBD,EAAM,OAAiB,MAAU,EAEpD,CAACnC,EAAQqC,CAAS,EAAIF,EAAM,SAAkB,EAC9C,CAACG,EAAWC,CAAY,EAAIJ,EAAM,SAAqB,EAE7DA,EAAM,UAAU,IAAM,GACpBN,GAAA,YAAAA,MAAkB,QAAQ,QAAQ,GAAG,KAAK,IAAM,CAChDC,EAAcM,EAAiB,QAASF,EAAW,OAAO,EAAE,KAC1DlC,GAAW,CACXqC,EAAUrC,CAAM,CACjB,CAAA,CACD,CACA,CAAA,EACC,CAAC6B,EAAYC,CAAa,CAAC,EAG9BK,EAAM,UAAU,IAAM,CACrB,GAAInC,IAAW,OACd,OAGD,MAAMsC,EAAY,IAAItB,EACrBjB,EACAY,EACAX,EACAC,EACAW,CAAA,EAGD,OAAImB,IACHA,EAAa,QAAUO,GAGxBA,EACE,OAAOJ,EAAW,OAAO,EACzB,KAAK,IAAMK,EAAaD,CAAS,CAAC,EAE7B,IAAY,CAClB,GAAIP,GACCO,IAAcP,EAAa,QACxB,MAAA,IAAI,MAAM,mBAAmB,EAIrCO,EAAU,OAAO,EAAE,QAAQ,IAAMC,EAAa,MAAS,CAAC,CAAA,CACzD,EACE,CACFxC,EACAY,EACAkB,EACA7B,EACAC,EACAW,EACAmB,CAAA,CACA,EAEK,MAAAS,EAAkBjB,EAAoBS,CAAO,EACnD,OAAAG,EAAM,UAAU,IAAM,CAKjBK,IAAoB,SAIxBF,GAAA,MAAAA,EAAW,UAAUN,GACnB,EAAA,CAACQ,EAAiBR,EAASM,CAAS,CAAC,EAG9BH,EAAA,cAAAA,EAAA,SAAA,KAAAF,EAASG,EAAkBF,EAAW,OAAO,CAAE,CAC1D,EC7HaO,EAAcN,EAAM,KAChC,CAAC,CAAE,GAAGO,KAA6C,CAC5C,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,aAAa,EAExC,MAAMiC,EAAgBK,EAAM,YAC1BQ,GACO,QAAQ,QAAQA,CAAO,EAE/B,CAAC,CAAA,EAID,OAAAR,EAAA,cAACP,EAAA,CACC,GAAGc,EACJ,WAAY,OACZ,cAAAZ,EACA,iBAAkB5B,CAAA,EAEjB,CAACkC,EAAkBJ,IACnBG,EAAA,cAAC,QAAA,CACA,IAAKC,EACL,IAAKJ,EACL,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,EACvC,QAAQ,OACR,SAAQ,GACR,SAAQ,EAAA,CACT,CAAA,CAIJ,CACD,ECrCMY,EAAS,CACd,WACA,SACA,YACA,iBACA,QACA,UACA,OACD,EAEO,MAAMC,UAA6B/C,CAAyB,CAA5D,kCACEe,EAAA,0BAAsB,GAAoC,6BACjE,OAAQ,EAAE,KAAM,CACf,IAAK,YACCT,GAAAC,EAAA,KAAA,UAAA,YAAAA,EAAS,WAAT,MAAAD,EAAA,KAAAC,EAAoB,CAAE,GAAI,KAAK,OAAO,MAAM,UACjD,MACD,IAAK,UACJyC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAU,KAAK,OAAO,SACtB,QAAS,KAAK,OAAO,YAAc,KAAK,OAAO,SAC/C,QAAS,KAAK,OAAO,WAAA,GAEtB,MACD,IAAK,aACJC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,GACA,MACD,IAAK,iBACJ,MACD,IAAK,SACJC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,GACA,MACD,IAAK,WACJC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,MAAAD,EAAA,KAAAC,GACA,MACD,IAAK,SACCC,GAAAC,EAAA,KAAA,UAAA,YAAAA,EAAS,UAAT,MAAAD,EAAA,KAAAC,EAAmB,GACxB,KACF,CAAA,GAGD,MAAM,OAAOjD,EAA2B,CACvC,UAAWH,KAASyC,EACnB,KAAK,OAAO,iBAAiBzC,EAAO,KAAK,kBAAkB,CAE7D,CAEA,MAAM,QAAwB,CAC7B,UAAWA,KAASyC,EACnB,KAAK,OAAO,oBAAoBzC,EAAO,KAAK,kBAAkB,CAEhE,CAEA,MAAM,UAAUG,EAA2B,CACrC,KAAA,OAAO,KAAKA,CAAE,CACpB,CAEA,MAAM,MAAsB,CAC3B,KAAK,OAAO,MACb,CAEA,MAAM,OAAuB,CAC5B,KAAK,OAAO,OACb,CAEA,MAAM,eAAeC,EAAgC,CAC/C,KAAA,OAAO,KAAKA,CAAO,CACzB,CAEA,MAAM,UAAUC,EAA+B,CACzC,KAAA,OAAO,UAAUA,CAAM,CAC7B,CAEA,MAAM,SAASC,EAA+B,CACxC,KAAA,OAAO,SAASA,CAAK,CAC3B,CAEA,MAAM,aAA2C,CAChD,OAAO,KAAK,OAAO,QACpB,CAEA,MAAM,gBAA8C,CACnD,OAAO,KAAK,OAAO,WACpB,CAEA,MAAM,WAAyC,CAC9C,OAAO,KAAK,OAAO,MACpB,CACD,CCxFO,SAAS+C,EAAUC,EAA4B,CACrD,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACjC,MAAAC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,IAAMH,EACbG,EAAO,MAAQ,GAEfA,EAAO,QAAUD,EAEVC,EAAA,OAASA,EAAO,mBAAqB,UAAkB,CAC7D,MAAMC,EAAY,KAAK,WAEnBA,GAAaA,IAAc,UAAYA,IAAc,aAGlDD,EAAA,OAASA,EAAO,mBAAqB,KAEpCF,IAAA,EAGA,SAAA,KAAK,YAAYE,CAAM,CAAA,CAChC,CACF,CCnBA,MAAME,EAAiB,CAAA,EAED,eAAAC,EACrBN,EACA1D,EACmB,CACf,GAAA+D,EAAK,SAASL,CAAG,EACpB,OAAA1D,EAAO,IAAIF,EAAS,MAAO4D,EAAK,0BAA0B,EACnD,GAGJ,GAAA,CAKC,OAJJ1D,EAAO,IAAIF,EAAS,MAAO4D,EAAK,mBAAmB,EAEnD,MAAMD,EAAUC,CAAG,EAEfK,EAAK,SAASL,CAAG,GACpB1D,EAAO,IAAIF,EAAS,MAAO4D,EAAK,0BAA0B,EACnD,KAEPK,EAAK,KAAKL,CAAG,EACb1D,EAAO,IAAIF,EAAS,MAAO4D,EAAK,eAAe,EACxC,UAEAO,GACR,MAAAjE,EAAO,IAAIF,EAAS,MAAO4D,EAAK,uBAAuB,EACjDO,CACP,CACD,CCxBO,MAAMC,EAAoB9B,EAAM,KACtC,CAAC,CAAE,QAAAlC,EAAS,GAAGyC,KAA6C,CACrD,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,mBAAmB,EAExC,MAAAgC,EAAaM,EAAM,YAAY,SAAY,CAC1C,MAAA4B,EAAmB,+BAAgChE,CAAM,CAAA,EAC7D,CAACA,CAAM,CAAC,EAEL+B,EAAgBK,EAAM,YAC3B,CAACQ,EAAyBX,IAClB,QAAQ,QACd,IAAI,GAAG,OAAOW,EAAS,CACtB,MAAOX,EACP,MAAO,OACP,OAAQ,OACR,OAAQ,CACP,SAAU,IAAY,QACrB3B,EAAAJ,GAAA,YAAAA,EAAS,WAAT,MAAAI,EAAA,KAAAJ,EAAoB,CAAE,GAAI+B,CAAS,EACpC,EACA,OAAQ,IAAY,QACnB3B,EAAAJ,GAAA,YAAAA,EAAS,eAAT,MAAAI,EAAA,KAAAJ,EAAwB,CACvB,SAAU,EACV,QAAS,EACT,QAAS,CAAA,EAEX,EACA,UAAW,IAAY,QACtBI,EAAAJ,GAAA,YAAAA,EAAS,UAAT,MAAAI,EAAA,KAAAJ,EACD,EACA,eAAgB,IAAY,CAAC,EAC7B,MAAO,IAAY,QAClBI,EAAAJ,GAAA,YAAAA,EAAS,UAAT,MAAAI,EAAA,KAAAJ,EACD,EACA,QAAS,IAAY,QACpBI,EAAAJ,GAAA,YAAAA,EAAS,SAAT,MAAAI,EAAA,KAAAJ,EACD,EACA,QAAS,IAAY,CAAC,EACtB,MAAQ+D,GAAgB,QACvB3D,EAAAJ,GAAA,YAAAA,EAAS,UAAT,MAAAI,EAAA,KAAAJ,EAAmB+D,EACpB,CACD,CAAA,CACA,CAAA,EAGH,CAAC/D,CAAO,CAAA,EAIR,OAAAkC,EAAA,cAACP,EAAA,CACC,GAAGc,EACJ,QAAAzC,EACA,WAAA4B,EACA,cAAAC,EACA,iBAAkBe,CAAA,EAEhBT,GACAD,EAAA,cAAA,MAAA,CAAI,MAAO,CAAE,MAAO,OAAQ,OAAQ,MACpC,CAAA,EAAAA,EAAA,cAAC,MAAI,CAAA,IAAKC,EAAkB,CAC7B,CAAA,CAIJ,CACD,EC/DA,IAAK8B,GAAAA,IACJA,EAAAA,EAAA,KAAO,CAAP,EAAA,OACAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QACAA,EAAAA,EAAA,IAAM,CAAN,EAAA,MAHIA,IAAAA,GAAA,CAAA,CAAA,EAOE,MAAMC,EAAN,cAAgCrE,CAAiC,CAAjE,kCAGEe,EAAA,iBACAA,EAAA,oBACAA,EAAA,eAEAA,EAAA,qBAAiB,GAA8B,iCAClD,GAAA,EAAE,SAAWsD,EAAkB,OAAQ,OAE3C,MAAMC,EAAO,EAAE,KAEf,OAAQA,EAAK,UAAW,CACvB,IAAK,qBACJ,KAAK,OAAO,IACXvE,EAAS,MACT,0BACCqE,EAAaE,EAAK,KAAK,YAAY,GACnCA,EAAK,KAAK,cAAA,EAGZ,MAED,IAAK,eASI,OARR,KAAK,OAAO,IACXvE,EAAS,MACT,mBACCqE,EAAaE,EAAK,KAAK,YAAY,GACnCA,EAAK,KAAK,cAAA,EAIJA,EAAK,KAAK,aAAc,CAC/B,IAAK,IACJhE,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,MAAAD,EAAA,KAAAC,GACA,MAED,IAAK,IACJyC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,GACA,MAED,IAAK,IACJC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,GACA,KACF,CACA,MAED,IAAK,uBACAmB,EAAK,KAAK,WAAa,SACrB,KAAA,SAAWA,EAAK,KAAK,SAAW,KAEjC,KAAA,YACJA,EAAK,KAAK,cAAgB,OACvB,OACAA,EAAK,KAAK,YAAc,IAEvB,KAAA,OAASA,EAAK,KAAK,QAExBlB,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAU,KAAK,SACf,QACC,KAAK,cAAgB,QACrB,KAAK,WAAa,OACf,KAAK,YAAc,KAAK,SACxB,OACJ,QAAS,KAAK,WAAA,GAEf,MAED,IAAK,eACJ,KAAK,OAAO,IAAItD,EAAS,MAAO,gBAAgB,EAE3C,KAAA,SAAWuE,EAAK,KAAK,UAAU,iBAE/BhB,GAAAC,EAAA,KAAA,UAAA,YAAAA,EAAS,WAAT,MAAAD,EAAA,KAAAC,EAAoB,CAAE,GAAIe,EAAK,KAAK,UAAU,UACnD,MAED,IAAK,SAGCd,GAAAC,EAAA,KAAA,UAAA,YAAAA,EAAS,UAAT,MAAAD,EAAA,KAAAC,EAAmBa,GACxB,MAED,IAAK,0BACL,IAAK,2BACCC,GAAAC,EAAA,KAAA,UAAA,YAAAA,EAAS,UAAT,MAAAD,EAAA,KAAAC,EAAmBF,GACxB,MAED,QACC,KAAK,OAAO,IACXvE,EAAS,MACT,UACCuE,EAAa,UACbA,EAAa,IAAA,EAEf,KACF,CAAA,GAGD,MAAM,QAAwB,CACtB,OAAA,iBAAiB,UAAW,KAAK,aAAa,CACtD,CAEA,MAAM,QAAwB,CACtB,OAAA,oBAAoB,UAAW,KAAK,aAAa,CACzD,CAEA,MAAM,UAAU9D,EAA2B,CAC1C,OAAO,IAAI,QAAQ,CAACoD,EAASC,IAA+B,CAC3D,KAAK,SAAW,OAChB,KAAK,YAAc,OAGd,KAAA,OAAO,OAAS,IAAY,CAChC,KAAK,OAAO,OAAS,KACbD,GAAA,EAGJ,KAAA,OAAO,IAAM,oCAAoCpD,sBAAA,CACtD,CACF,CAGQ,YAAYQ,EAAoB,QACvCT,EAAA,KAAK,OAAO,gBAAZ,MAAAA,EAA2B,YAC1B,CACC,GAAGS,EACH,SAAU,IACV,oBAAqB,CACtB,EACAqD,EAAkB,OAEpB,CAEA,MAAM,MAAsB,CAC3B,KAAK,YAAY,CAAE,UAAW,MAAQ,CAAA,CACvC,CAEA,MAAM,OAAuB,CAC5B,KAAK,YAAY,CAAE,UAAW,OAAS,CAAA,CACxC,CAEA,MAAM,eAAe5D,EAAgC,CAC/C,KAAA,YAAY,CAAE,UAAW,OAAQ,KAAM,CAAE,KAAMA,EAAU,GAAK,CAAA,CAAG,CACvE,CAEA,MAAM,UAAUC,EAA+B,CAC9C,KAAK,YAAY,CAChB,UAAW,eACX,KAAM,CAAE,OAAAA,CAAe,CAAA,CACvB,CACF,CAEA,MAAM,SAASC,EAA+B,CAC7C,KAAK,YAAY,CAChB,UAAW,OACX,KAAM,CAAE,KAAMA,CAAM,CAAA,CACpB,CACF,CAEA,MAAM,aAA2C,CAChD,OAAO,KAAK,QACb,CAEA,MAAM,gBAA8C,CACnD,OAAO,KAAK,WACb,CAEA,MAAM,WAAyC,CAC9C,OAAO,KAAK,MACb,CACD,EA3KO,IAAM8D,EAANJ,EACNtD,EADY0D,EACY,SAAS,8BCX3B,MAAMC,EAAiBrC,EAAM,KACnC,CAAC,CAAE,GAAGO,KAA6C,CAC5C,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,gBAAgB,EAE3C,MAAMiC,EAAgBK,EAAM,YAC1BQ,GACO,QAAQ,QAAQA,CAAO,EAE/B,CAAC,CAAA,EAID,OAAAR,EAAA,cAACP,EAAA,CAKC,GAAGc,EACJ,WAAY,OACZ,cAAAZ,EACA,iBAAkByC,CAAA,EAEjB,CAACnC,EAAkBJ,IAClBG,EAAA,cAAA,MAAA,CAAI,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAA,CAEpC,EAAAA,EAAA,cAAC,SAAA,CACA,IAAKC,EACL,IAAK,oCAAoCJ,uBACzC,MAAM,OACN,OAAO,OACP,gBAAe,GACf,MAAO,CAAE,OAAQ,MAAO,EAMxB,MAAM,sBAAA,CAAA,CAER,CAAA,CAIJ,CACD,EC1CMyC,EAAuBtC,EAAM,cAElC,MACD,EAOMuC,EAAgB,IAAK,KAAyB,CAAzB,cACT7D,EAAA,aAAQ,kBAEjB,cAAcC,EAAsB,CACpC,MAAA,IAAI,KAAK,UAAUA,GAC3B,CAEQ,MAAMA,KAAkBC,EAA2B,CAC1D,QAAQ,MAAM,KAAK,cAAcD,CAAO,EAAG,GAAGC,CAAc,CAC7D,CAEQ,MAAMD,KAAkBC,EAA2B,CAC1D,QAAQ,MAAM,KAAK,cAAcD,CAAO,EAAG,GAAGC,CAAc,CAC7D,CAEQ,KAAKD,KAAkBC,EAA2B,CACzD,QAAQ,KAAK,KAAK,cAAcD,CAAO,EAAG,GAAGC,CAAc,CAC5D,CAEA,WAAqB,CACb,MAAA,EACR,CAEA,IAAI4D,EAAoB7D,KAAkBC,EAA6B,CACtE,OAAQ4D,EAAU,CACjB,KAAK9E,EAAS,MACR,KAAA,MAAMiB,EAAS,GAAGC,CAAc,EACrC,MACD,KAAKlB,EAAS,QACR,KAAA,KAAKiB,EAAS,GAAGC,CAAc,EACpC,MACD,KAAKlB,EAAS,MACR,KAAA,MAAMiB,EAAS,GAAGC,CAAc,EACrC,KACF,CACD,CACD,EAEa6D,GAAwB,CAAC,CACrC,OAAA7E,EAAS2E,EACT,SAAAzC,CACD,IAAsD,CAC/C,MAAAF,EAAeI,EAAM,SAErB0C,EAAY1C,EAAM,YAAY,MAAO7B,GAAe,OACnD,OAAAD,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,UAAUC,GACvC,EAAG,CAAE,CAAA,EAECwE,EAAO3C,EAAM,YAAY,SAAY,OACpC,OAAA9B,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,OAC7B,EAAG,CAAE,CAAA,EAEC0E,EAAQ5C,EAAM,YAAY,SAAY,OACrC,OAAA9B,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,QAC7B,EAAG,CAAE,CAAA,EAEC2E,EAAiB7C,EAAM,YAAY,MAAO5B,GAAoB,CACnE,MAAM+B,EAAYP,EAAa,QAC1BO,IAEC,MAAAA,EAAU,eAAe/B,CAAO,EACtC,MAAM+B,EAAU,OACjB,EAAG,CAAE,CAAA,EAEC2C,EAAY9C,EAAM,YAAY,MAAO3B,GAAmB,OACvD,OAAAH,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,UAAUG,GACvC,EAAG,CAAE,CAAA,EAEC0E,EAAW/C,EAAM,YAAY,MAAO1B,GAAmB,OACtD,OAAAJ,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,SAASI,GACtC,EAAG,CAAE,CAAA,EAEC0E,EAAchD,EAAM,YAAY,SAAY,OAC1C,OAAA,OAAM9B,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,cACpC,EAAG,CAAE,CAAA,EAEC+E,EAAiBjD,EAAM,YAAY,SAAY,OAC7C,OAAA,OAAM9B,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,iBACpC,EAAG,CAAE,CAAA,EAECgF,EAAYlD,EAAM,YAAY,SAAY,OACxC,OAAA,OAAM9B,EAAA0B,EAAa,UAAb,YAAA1B,EAAsB,YACpC,EAAG,CAAE,CAAA,EAECmB,EAAQW,EAAM,QACnB,KAAkC,CACjC,OAAApC,EACA,aAAAgC,EACA,UAAA8C,EACA,KAAAC,EACA,MAAAC,EACA,eAAAC,EACA,UAAAC,EACA,SAAAC,EACA,YAAAC,EACA,eAAAC,EACA,UAAAC,CAAA,GAED,CACCtF,EACA8E,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CACD,CAAA,EAGD,OACElD,EAAA,cAAAsC,EAAqB,SAArB,CAA8B,MAAAjD,GAC7BS,CACF,CAEF,EAEaqD,EAAmB,IACxBnD,EAAM,WAAWsC,CAAoB,ECzItC,MAAMc,UAA4BzF,CAAmC,CACnE,iBAAmC,CAC1C,OAAO,IAAI,QAAQ,CAAC4D,EAASC,IAA+B,CACtD,KAAA,OAAO,YAAYD,CAAO,CAAA,CAC/B,CACF,CAEA,OAAOpD,EAA2B,CACjC,OAAO,IAAI,QAAQ,CAACoD,EAASC,IAA8B,CAC1D,KAAK,OAAO,KAAK,GAAG,OAAO,OAAO,MAAO,IAAM,SAC9C,KAAK,OAAO,KACX,GAAG,OAAO,OAAO,cACjB,MAAOxD,GAAU,SACV,MAAAqF,EAAW,MAAM,KAAK,mBAE5BpF,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAUmF,EAAW,IACrB,QAASrF,EAAM,gBAAkBqF,EACjC,QAASrF,EAAM,gBAAkB,GAAA,EAEnC,CAAA,EAED,KAAK,OAAO,KAAK,GAAG,OAAO,OAAO,MAAQA,GAAA,SACzC,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,EAAwBF,GAAK,EAE9B,KAAK,OAAO,KAAK,GAAG,OAAO,OAAO,KAAM,aACvC,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,YAAAD,EAAA,KAAAC,GAAuB,EAExB,KAAK,OAAO,KAAK,GAAG,OAAO,OAAO,MAAO,aACxC,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,GAAwB,EAEzB,KAAK,OAAO,KAAK,GAAG,OAAO,OAAO,OAAQ,aACzC,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,GAAwB,GAGzBD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,WAAd,MAAAD,EAAA,KAAAC,EAAyB,CAAE,GAAAC,CAAQ,GAC3BoD,GAAA,CACR,CAAA,CACD,CACF,CAEA,MAAM,QAAwB,CAC7B,KAAK,OAAO,OAAO,GAAG,OAAO,OAAO,KAAK,EACzC,KAAK,OAAO,OAAO,GAAG,OAAO,OAAO,aAAa,EACjD,KAAK,OAAO,OAAO,GAAG,OAAO,OAAO,KAAK,EACzC,KAAK,OAAO,OAAO,GAAG,OAAO,OAAO,IAAI,EACxC,KAAK,OAAO,OAAO,GAAG,OAAO,OAAO,KAAK,EACzC,KAAK,OAAO,OAAO,GAAG,OAAO,OAAO,MAAM,CAC3C,CAEA,OAAe,gBACd1D,EACAyD,EACAxD,EACgB,CAChB,OAAO,IAAI,QAAQ,CAACyD,EAASC,IAA+B,CAC3D3D,EAAO,KAAKyD,EAAK,CAAE,GAAGxD,EAAS,SAAUyD,EAAS,CAAA,CAClD,CACF,CAEA,MAAM,UAAUpD,EAA2B,SAC1C,MAAMiF,EAAoB,gBAAgB,KAAK,OAAQjF,EAAI,CAC1D,UAAW,EAAA,CACX,GAEDF,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,WAAd,MAAAD,EAAA,KAAAC,EAAyB,CAAE,GAAAC,CAAQ,EACpC,CAEA,MAAM,MAAsB,CAC3B,KAAK,OAAO,MACb,CAEA,MAAM,OAAuB,CAC5B,KAAK,OAAO,OACb,CAEA,MAAM,eAAeC,EAAgC,CAC/C,KAAA,OAAO,OAAOA,EAAU,GAAI,CAClC,CAEA,MAAM,UAAUC,EAA+B,CACzC,KAAA,OAAO,UAAUA,EAAS,GAAG,CACnC,CAEA,MAAM,SAASC,EAA+B,CACxC,KAAA,UAAUA,EAAQ,EAAI,CAAA,CAC5B,CAEA,MAAM,aAA2C,CAEhD,OADiB,MAAM,KAAK,kBACV,GACnB,CAEQ,oBAAsC,CAC7C,OAAO,IAAI,QAAQ,CAACiD,EAASC,IAA+B,CACtD,KAAA,OAAO,YAAYD,CAAO,CAAA,CAC/B,CACF,CAEA,MAAM,gBAA8C,CAEnD,OADiB,MAAM,KAAK,qBACV,GACnB,CAEQ,eAAiC,CACxC,OAAO,IAAI,QAAQ,CAACA,EAASC,IAA+B,CACtD,KAAA,OAAO,UAAUD,CAAO,CAAA,CAC7B,CACF,CAEA,MAAM,WAAyC,CAE9C,OADe,MAAM,KAAK,gBACV,GACjB,CACD,CC9GO,MAAM+B,EAAmBtD,EAAM,KACrC,CAAC,CAAE,GAAGO,KAA6C,CAC5C,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,kBAAkB,EAEvC,MAAAgC,EAAaM,EAAM,YAAY,SAAY,CAC1C,MAAA4B,EACL,yCACAhE,CAAA,CACD,EACE,CAACA,CAAM,CAAC,EAEL+B,EAAgBK,EAAM,YAC1BQ,GACO,QAAQ,QAAQ,GAAG,OAAOA,CAAO,CAAC,EAE1C,CAAC,CAAA,EAID,OAAAR,EAAA,cAACP,EAAA,CAKC,GAAGc,EACJ,WAAAb,EACA,cAAAC,EACA,iBAAkByD,CAAA,EAEjB,CAACnD,EAAkBJ,IAEnBG,EAAA,cAAC,SAAA,CACA,IAAKC,EACL,IAAK,wCAAwCJ,IAC7C,YAAa,EACb,MAAM,WACN,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAA,CACxC,CAAA,CAIJ,CACD,ECjDO,MAAM0D,UAAwB5F,CAA6B,CAA3D,kCACEe,EAAA,mBAAc,IAAY,UAC5BT,GAAAC,EAAA,KAAA,UAAA,YAAAA,EAAS,WAAT,MAAAD,EAAA,KAAAC,EAAoB,CAAE,GAAI,KAAK,OAAO,YAAY,GAGhDQ,EAAA,kBAAa,IAAY,UAChCT,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,MAAAD,EAAA,KAAAC,EAAuB,GAGhBQ,EAAA,mBAAc,IAAY,UACjCT,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,EAAwB,GAGjBQ,EAAA,mBAAc,IAAY,UACjCT,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,EAAwB,GAGjBQ,EAAA,kBAAa,IAAY,UAChCT,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAU,EACV,QAAS,EACT,QAAS,CAAA,EACT,GAGF,MAAM,OAAOC,EAA2B,CACvC,KAAK,OAAO,iBAAiB,OAAO,OAAO,MAAO,KAAK,WAAW,EAClE,KAAK,OAAO,iBAAiB,OAAO,OAAO,QAAS,KAAK,UAAU,EACnE,KAAK,OAAO,iBAAiB,OAAO,OAAO,MAAO,KAAK,WAAW,EAClE,KAAK,OAAO,iBAAiB,OAAO,OAAO,MAAO,KAAK,WAAW,EAClE,KAAK,OAAO,iBAAiB,OAAO,OAAO,KAAM,KAAK,UAAU,CACjE,CAEA,MAAM,QAAwB,CAAC,CAE/B,MAAM,UAAUA,EAA2B,CACrC,KAAA,OAAO,SAASA,EAAI,CAAC,CAC3B,CAEA,MAAM,MAAsB,CAC3B,KAAK,OAAO,MACb,CAEA,MAAM,OAAuB,CAC5B,KAAK,OAAO,OACb,CAEA,MAAM,eAAeC,EAAgC,CAC/C,KAAA,OAAO,KAAKA,CAAO,CACzB,CAEA,MAAM,UAAUC,EAA+B,CACzC,KAAA,OAAO,UAAUA,CAAM,CAC7B,CAEA,MAAM,SAASC,EAA+B,CACxC,KAAA,OAAO,SAASA,CAAK,CAC3B,CAEA,MAAM,aAA2C,CACzC,OAAA,KAAK,OAAO,aACpB,CAEA,MAAM,gBAA8C,CAC5C,OAAA,KAAK,OAAO,gBACpB,CAEA,MAAM,WAAyC,CACvC,OAAA,KAAK,OAAO,WACpB,CACD,CCjEO,MAAMkF,EAAexD,EAAM,KACjC,CAAC,CAAE,GAAGO,KAA6C,CAC5C,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,cAAc,EAEnC,MAAAgC,EAAaM,EAAM,YAAY,SAAY,CAC1C,MAAA4B,EACL,sCACAhE,CAAA,CACD,EACE,CAACA,CAAM,CAAC,EAEL+B,EAAgBK,EAAM,YAC3B,MACCQ,EACAX,IAEO,QAAQ,QACd,IAAI,OAAO,OAAOW,EAAS,CAC1B,MAAOX,EACP,MAAO,OACP,OAAQ,MAAA,CACR,CAAA,EAGH,CAAC,CAAA,EAID,OAAAG,EAAA,cAACP,EAAA,CACC,GAAGc,EACJ,WAAAb,EACA,cAAAC,EACA,iBAAkB4D,CAAA,EAEhBtD,GACDD,EAAA,cAAC,MAAA,CACA,IAAKC,EACL,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAA,CACxC,CAAA,CAIJ,CACD,ECjDO,MAAMwD,UAAuB9F,CAA4B,CAC/D,MAAM,QAAwB,CACvB,MAAA,KAAK,OAAO,QAEb,KAAA,OAAO,GAAG,QAAUsE,YAAS,OAAAhE,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,EAAwB+D,GAAK,EAC/D,KAAK,OAAO,GAAG,SAAWjE,GACzB,SAAA,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,WAAd,YAAAD,EAAA,KAAAC,EAAyB,CAAE,GAAIF,EAAM,GAAG,SAAS,IAAG,EAErD,KAAK,OAAO,GAAG,OAAQ,IAAM,SAAA,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,YAAAD,EAAA,KAAAC,GAAwB,EACrD,KAAK,OAAO,GAAG,QAAS,IAAM,SAAA,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,GAAyB,EACvD,KAAK,OAAO,GAAG,QAAS,IAAM,SAAA,OAAAD,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,GAAyB,EACvD,KAAK,OAAO,GAAG,aAAe+D,GAAS,UACtChE,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAU+D,EAAK,SACf,QAASA,EAAK,QACd,QAASA,EAAK,OAAA,EACd,CACD,CACF,CAEA,MAAM,QAAwB,CACxB,KAAA,OAAO,IAAI,OAAO,EAClB,KAAA,OAAO,IAAI,QAAQ,EACnB,KAAA,OAAO,IAAI,MAAM,EACjB,KAAA,OAAO,IAAI,OAAO,EAClB,KAAA,OAAO,IAAI,OAAO,EAClB,KAAA,OAAO,IAAI,YAAY,CAC7B,CAEA,MAAM,UAAU9D,EAA2B,CACpC,MAAA,KAAK,OAAO,UAAUA,CAAE,CAC/B,CAEA,MAAM,MAAsB,CACrB,MAAA,KAAK,OAAO,MACnB,CAEA,MAAM,OAAuB,CACtB,MAAA,KAAK,OAAO,OACnB,CAEA,MAAM,eAAeC,EAAgC,CAC9C,MAAA,KAAK,OAAO,eAAeA,CAAO,CACzC,CAEA,MAAM,UAAUsF,EAAiC,CAC1C,MAAA,KAAK,OAAO,UAAUA,CAAQ,CACrC,CAEA,MAAM,SAASpF,EAA+B,CACvC,MAAA,KAAK,OAAO,SAASA,CAAK,CACjC,CAEA,MAAM,aAA2C,CACzC,OAAA,KAAK,OAAO,aACpB,CAEA,MAAM,gBAA8C,CAC5C,OAAA,MAAM,KAAK,OAAO,gBAC1B,CAEA,MAAM,WAAyC,CACvC,OAAA,MAAM,KAAK,OAAO,WAC1B,CACD,CC5DO,MAAMqF,EAAc3D,EAAM,KAChC,CAAC,CAAE,GAAGO,KAA6C,CAC5C,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,aAAa,EAElC,MAAAgC,EAAaM,EAAM,YAAY,SAAY,CAC1C,MAAA4B,EACL,yCACAhE,CAAA,CACD,EACE,CAACA,CAAM,CAAC,EAEL+B,EAAgBK,EAAM,YAC1BQ,GACO,QAAQ,QAAQ,IAAI,MAAM,OAAOA,CAAO,CAAC,EAEjD,CAAC,CAAA,EAID,OAAAR,EAAA,cAACP,EAAA,CACC,GAAGc,EACJ,WAAAb,EACA,cAAAC,EACA,iBAAkB8D,CAAA,EAEjB,CAACxD,EAAkBJ,IAEnBG,EAAA,cAAC,SAAA,CACA,IAAKC,EACL,IAAK,kCAAkCJ,IACvC,YAAa,EACb,MAAM,WACN,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAA,CACxC,CAAA,CAIJ,CACD,ECtCA,IAAK+D,GAAAA,IACJA,EAAAA,EAAA,UAAY,EAAZ,EAAA,YACAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QACAA,EAAAA,EAAA,QAAU,CAAV,EAAA,UACAA,EAAAA,EAAA,OAAS,CAAT,EAAA,SACAA,EAAAA,EAAA,UAAY,CAAZ,EAAA,YACAA,EAAAA,EAAA,KAAO,CAAP,EAAA,OANIA,IAAAA,GAAA,CAAA,CAAA,EAUE,MAAMC,UAAyBlG,CAAyB,CAAxD,kCACEe,EAAA,qBAEAA,EAAA,6BAEA,yBAAgC,CACvC,KAAK,OAAO,IACXhB,EAAS,MACT,0BACA,KAAK,oBAAA,EAGC,OAAA,cAAc,KAAK,oBAAoB,EAE9C,KAAK,qBAAuB,MAC7B,CAEQ,iBAAiBG,EAAyB,SAC3C,MAAAiG,EAAcjG,EAAO,iBAC3B,GAAIiG,IAAgB,KAAK,aAAc,OAEjC,MAAAT,EAAWxF,EAAO,eACxBI,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,eAAd,MAAAD,EAAA,KAAAC,EAA6B,CAC5B,SAAAmF,EACA,QAASS,EAAcT,EACvB,QAASS,CAAA,GAGV,KAAK,aAAeA,CACrB,CAEQ,uBAA8B,CACrC,KAAK,OAAO,IAAIpG,EAAS,MAAO,uBAAuB,EAEvD,KAAK,wBAAwB,EAE7B,KAAK,qBAAuB,OAAO,YAClC,IAAM,KAAK,iBAAiB,KAAK,MAAM,EACvC,GAAA,EAGD,KAAK,OAAO,IACXA,EAAS,MACT,uBACA,KAAK,oBAAA,EAGD,KAAA,iBAAiB,KAAK,MAAM,CAClC,CAEA,OAAOS,EAA2B,CACjC,OAAO,IAAI,QAAQ,CAACoD,EAASC,IAA8B,CACrD,KAAA,OAAO,iBAAiB,UAAW,SAAY,CACnD,KAAK,OAAO,iBAAiB,UAAYxD,GACxC,SAAA,OAAAC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,YAAAD,EAAA,KAAAC,EAAwBF,EAAM,MAAI,EAEnC,KAAK,OAAO,iBACX,gBACCA,GAA8B,qBAM9B,OALA,KAAK,OAAO,IACXN,EAAS,MACT,kBAAkBkG,EAAY5F,EAAM,IAAI,GAAA,EAGjCA,EAAM,KAAM,CACnB,KAAK,GAAG,YAAY,MACnBC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,WAAd,MAAAD,EAAA,KAAAC,EAAyB,CAAE,GAAAC,CAAQ,GACnC,MAED,KAAK,GAAG,YAAY,SACnBwC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,SAAd,MAAAD,EAAA,KAAAC,GACA,KAAK,sBAAsB,EAC3B,MAED,KAAK,GAAG,YAAY,QACnBC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,GACA,KAAK,wBAAwB,EAC7B,MAED,KAAK,GAAG,YAAY,OACnBC,GAAAC,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAd,MAAAD,EAAA,KAAAC,GACA,KAAK,wBAAwB,EAC7B,KACF,CACD,CAAA,EAGK,MAAA,KAAK,UAAU7C,CAAE,EACfoD,GAAA,CACR,CAAA,CACD,CACF,CAEA,MAAM,QAAwB,CAC7B,KAAK,wBAAwB,CAC9B,CAEA,MAAM,UAAUpD,EAA2B,CAC1C,KAAK,aAAe,OACf,KAAA,OAAO,aAAaA,CAAE,CAC5B,CAEA,MAAM,MAAsB,CAC3B,KAAK,OAAO,WACb,CAEA,MAAM,OAAuB,CAC5B,KAAK,OAAO,YACb,CAEA,MAAM,eAAeC,EAAgC,CAC/C,KAAA,OAAO,OAAOA,CAAO,EAErB,KAAA,iBAAiB,KAAK,MAAM,CAClC,CAEA,MAAM,UAAUC,EAA+B,CACzC,KAAA,OAAO,UAAUA,EAAS,GAAG,CACnC,CAEA,MAAM,SAASC,EAA+B,CACzCA,EACH,KAAK,OAAO,OAEZ,KAAK,OAAO,QAEd,CAEA,MAAM,aAA2C,CACzC,OAAA,KAAK,OAAO,aACpB,CAEA,MAAM,gBAA8C,CAC5C,OAAA,KAAK,OAAO,gBACpB,CAEA,MAAM,WAAyC,CACvC,OAAA,KAAK,OAAO,UAAA,EAAc,GAClC,CACD,CCvJA,MAAMyF,GAAS,mCAEFC,EAAgBhE,EAAM,KAClC,CAAC,CAAE,GAAGO,KAA6C,CAC5C,KAAA,CAAE,OAAA3C,CAAW,EAAA2C,EAEZ3C,EAAA,IAAIF,EAAS,MAAO,eAAe,EAEpC,MAAAgC,EAAaM,EAAM,YAAY,IAC7B,IAAI,QAAQ,MAAOuB,EAASC,IAAW,CAC/B,MAAMI,EACnB,qCACAhE,CAAA,EAKA,OAAO,wBAA0B,IAAY,CACrCA,EAAA,IAAIF,EAAS,MAAO,0BAA0B,EAC7C6D,GAAA,EAGDA,GACT,CACA,EACC,CAAC3D,CAAM,CAAC,EAEL+B,EAAgBK,EAAM,YAC1BQ,GACO,QAAQ,QACd,IAAI,GAAG,OAAOA,EAAS,CACtB,KAAMuD,GACN,MAAO,OACP,OAAQ,MAAA,CACR,CAAA,EAGH,CAAC,CAAA,EAID,OAAA/D,EAAA,cAACP,EAAA,CACC,GAAGc,EACJ,WAAAb,EACA,cAAAC,EACA,iBAAkBkE,CAAA,EAEhB5D,GACAD,EAAA,cAAA,MAAA,CAAI,MAAO,CAAE,MAAO,OAAQ,OAAQ,MACpC,CAAA,EAAAA,EAAA,cAAC,MAAI,CAAA,IAAKC,EAAkB,CAC7B,CAAA,CAIJ,CACD,EChDMgE,GAA8D,CACnE,MAAO3D,EACP,YAAawB,EACb,SAAUO,EACV,WAAYiB,EACZ,OAAQE,EACR,MAAOG,EACP,QAASK,CACV,EAQaE,GAAgBlE,EAAM,KAClC,CAAC,CAAE,KAAAxB,EAAM,QAAAqB,EAAS,QAAA/B,KAAsD,CACvE,KAAM,CAAE,OAAAF,EAAQ,aAAAgC,CAAa,EAAIuD,EAAiB,EAE3CvF,EAAA,IAAIF,EAAS,MAAO,eAAe,EAEpC,MAAAyG,EAASF,GAAQzF,CAAI,EAE1B,OAAAwB,EAAA,cAACmE,EAAA,CACA,OAAAvG,EACA,KAAAY,EACA,aAAAoB,EACA,QAAAC,EACA,QAAA/B,CAAA,CAAA,CAGH,CACD"}
|