@aigamo/nostalgic-diva 1.15.3-rc.1 → 1.16.0-rc.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/dist/{AudioPlayer-1K9W0RJb.cjs → AudioPlayer-ChUxlJDZ.cjs} +2 -2
- package/dist/{AudioPlayer-1K9W0RJb.cjs.map → AudioPlayer-ChUxlJDZ.cjs.map} +1 -1
- package/dist/{AudioPlayer-DYTgFDsb.js → AudioPlayer-DhWk9jmk.js} +3 -3
- package/dist/{AudioPlayer-DYTgFDsb.js.map → AudioPlayer-DhWk9jmk.js.map} +1 -1
- package/dist/{DailymotionPlayer-DZ0YvhEC.cjs → DailymotionPlayer-B8zqbBhR.cjs} +2 -2
- package/dist/{DailymotionPlayer-DZ0YvhEC.cjs.map → DailymotionPlayer-B8zqbBhR.cjs.map} +1 -1
- package/dist/{DailymotionPlayer-CHi90pep.js → DailymotionPlayer-BSHbcUjN.js} +4 -4
- package/dist/{DailymotionPlayer-CHi90pep.js.map → DailymotionPlayer-BSHbcUjN.js.map} +1 -1
- package/dist/{NiconicoPlayer-Cet5yuM9.cjs → NiconicoPlayer-BwAqm690.cjs} +2 -2
- package/dist/{NiconicoPlayer-Cet5yuM9.cjs.map → NiconicoPlayer-BwAqm690.cjs.map} +1 -1
- package/dist/{NiconicoPlayer-CAQQN_Ys.js → NiconicoPlayer-DMV313AB.js} +3 -3
- package/dist/{NiconicoPlayer-CAQQN_Ys.js.map → NiconicoPlayer-DMV313AB.js.map} +1 -1
- package/dist/{PlayerContainer-Da78F7M0.js → PlayerContainer-DXSGm8YE.js} +13 -13
- package/dist/{PlayerContainer-Da78F7M0.js.map → PlayerContainer-DXSGm8YE.js.map} +1 -1
- package/dist/{PlayerContainer-DpbwZ2CV.cjs → PlayerContainer-Dj5iknGZ.cjs} +2 -2
- package/dist/{PlayerContainer-DpbwZ2CV.cjs.map → PlayerContainer-Dj5iknGZ.cjs.map} +1 -1
- package/dist/{SoundCloudPlayer-CDxa1Q_V.js → SoundCloudPlayer-Bm189hDq.js} +4 -4
- package/dist/{SoundCloudPlayer-CDxa1Q_V.js.map → SoundCloudPlayer-Bm189hDq.js.map} +1 -1
- package/dist/{SoundCloudPlayer-COM7uCxE.cjs → SoundCloudPlayer-D4YrdzwT.cjs} +2 -2
- package/dist/{SoundCloudPlayer-COM7uCxE.cjs.map → SoundCloudPlayer-D4YrdzwT.cjs.map} +1 -1
- package/dist/{TwitchPlayer-BLwcNYI7.cjs → TwitchPlayer-CblxjaJf.cjs} +2 -2
- package/dist/{TwitchPlayer-BLwcNYI7.cjs.map → TwitchPlayer-CblxjaJf.cjs.map} +1 -1
- package/dist/{TwitchPlayer-G-2bnyQg.js → TwitchPlayer-DxWXK7yi.js} +4 -4
- package/dist/{TwitchPlayer-G-2bnyQg.js.map → TwitchPlayer-DxWXK7yi.js.map} +1 -1
- package/dist/{VimeoPlayer-EDnQb3iE.cjs → VimeoPlayer-Bvawu-tg.cjs} +2 -2
- package/dist/{VimeoPlayer-EDnQb3iE.cjs.map → VimeoPlayer-Bvawu-tg.cjs.map} +1 -1
- package/dist/{VimeoPlayer-C3YsFhMx.js → VimeoPlayer-D1gietos.js} +4 -4
- package/dist/{VimeoPlayer-C3YsFhMx.js.map → VimeoPlayer-D1gietos.js.map} +1 -1
- package/dist/YouTubePlayer-B2le8X1Q.js +39 -0
- package/dist/YouTubePlayer-B2le8X1Q.js.map +1 -0
- package/dist/YouTubePlayer-B_AlZSrj.cjs +2 -0
- package/dist/YouTubePlayer-B_AlZSrj.cjs.map +1 -0
- package/dist/controllers/PlayerController.d.ts +18 -0
- package/dist/{ensureScriptLoaded-Ci57s2DO.cjs → ensureScriptLoaded-DwZ4rRNx.cjs} +2 -2
- package/dist/{ensureScriptLoaded-Ci57s2DO.cjs.map → ensureScriptLoaded-DwZ4rRNx.cjs.map} +1 -1
- package/dist/{ensureScriptLoaded-BcG9pOxp.js → ensureScriptLoaded-dmCIpAFt.js} +2 -2
- package/dist/{ensureScriptLoaded-BcG9pOxp.js.map → ensureScriptLoaded-dmCIpAFt.js.map} +1 -1
- package/dist/{index-DbrueNLc.cjs → index-Bed2lKLA.cjs} +2 -2
- package/dist/index-Bed2lKLA.cjs.map +1 -0
- package/dist/{index-C4j8BPk4.js → index-Jg6bVhV4.js} +14 -14
- package/dist/index-Jg6bVhV4.js.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/package.json +1 -1
- package/dist/YouTubePlayer-BChwqwQX.js +0 -39
- package/dist/YouTubePlayer-BChwqwQX.js.map +0 -1
- package/dist/YouTubePlayer-CPB3Qzvb.cjs +0 -2
- package/dist/YouTubePlayer-CPB3Qzvb.cjs.map +0 -1
- package/dist/index-C4j8BPk4.js.map +0 -1
- package/dist/index-DbrueNLc.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DbrueNLc.cjs","sources":["../src/controllers/Logger.ts","../src/controllers/NullPlayerController.ts","../src/components/NostalgicDivaProvider.tsx","../src/controllers/PlayerController.ts","../src/services/VideoService.ts","../src/services/AudioVideoService.ts","../src/services/DailymotionVideoService.ts","../src/services/NiconicoVideoService.ts","../src/services/SoundCloudVideoService.ts","../src/services/TwitchVideoService.ts","../src/services/VimeoVideoService.ts","../src/services/YouTubeVideoService.ts","../src/services/findVideoService.ts","../src/components/NostalgicDiva.tsx","../src/components/defineNostalgicDiva.tsx","../src/controllers/PlayerControllerImpl.ts","../src/controllers/AudioPlayerController.ts","../src/controllers/DailymotionPlayerController.ts","../src/controllers/NiconicoPlayerController.ts","../src/controllers/SoundCloudPlayerController.ts","../src/controllers/TwitchPlayerController.ts","../src/controllers/VimeoPlayerController.ts","../src/controllers/YouTubePlayerController.ts"],"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\nclass Logger 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 defaultLogger = new Logger();\n","import {\n\tIPlayerCommands,\n\tIPlayerController,\n} from '@/controllers/PlayerController';\n\nclass NullPlayerController implements IPlayerController {\n\tasync attach(): Promise<void> {}\n\n\tasync detach(): Promise<void> {}\n\n\tasync loadVideo(id: string): Promise<void> {}\n\n\tasync play(): Promise<void> {}\n\n\tasync pause(): Promise<void> {}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {}\n\n\tasync setVolume(volume: number): Promise<void> {}\n\n\tasync setMuted(muted: boolean): Promise<void> {}\n\n\tasync setPlaybackRate(playbackRate: number): Promise<void> {}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn 0;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn 0;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn 0;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn false;\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn 0;\n\t}\n\n\tsupports(command: keyof IPlayerCommands): boolean {\n\t\treturn false;\n\t}\n}\n\nexport const nullPlayerController = new NullPlayerController();\n","import { ILogger, LogLevel, defaultLogger } from '@/controllers/Logger';\nimport { nullPlayerController } from '@/controllers/NullPlayerController';\nimport {\n\tIPlayerCommands,\n\tIPlayerController,\n} from '@/controllers/PlayerController';\nimport React, {\n\tReactElement,\n\tReactNode,\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseRef,\n} from 'react';\n\ninterface NostalgicDivaContextProps extends IPlayerController {\n\tlogger: ILogger;\n\thandleControllerChange: (value: IPlayerController) => void;\n}\n\nconst NostalgicDivaContext = createContext<NostalgicDivaContextProps>(\n\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\tundefined!,\n);\n\nexport interface NostalgicDivaProviderProps {\n\tchildren?: ReactNode;\n\tlogger?: ILogger;\n}\n\nexport const NostalgicDivaProvider = ({\n\tchildren,\n\tlogger = defaultLogger,\n}: NostalgicDivaProviderProps): ReactElement => {\n\tconst controllerRef = useRef<IPlayerController>(nullPlayerController);\n\n\tconst handleControllerChange = useCallback(\n\t\t(value: IPlayerController): void => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.handleControllerChange',\n\t\t\t\tcontrollerRef.current,\n\t\t\t\tvalue,\n\t\t\t);\n\n\t\t\tcontrollerRef.current = value;\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst loadVideo = useCallback(\n\t\tasync (id: string): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.loadVideo',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.loadVideo(id);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst play = useCallback(async (): Promise<void> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.play',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\tawait controllerRef.current.play();\n\t}, [logger]);\n\n\tconst pause = useCallback(async (): Promise<void> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.pause',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\tawait controllerRef.current.pause();\n\t}, [logger]);\n\n\tconst setCurrentTime = useCallback(\n\t\tasync (seconds: number): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setCurrentTime',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setCurrentTime(seconds);\n\t\t\tawait controllerRef.current.play();\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst setVolume = useCallback(\n\t\tasync (volume: number): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setVolume',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setVolume(volume);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst setMuted = useCallback(\n\t\tasync (muted: boolean): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setMuted',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setMuted(muted);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst setPlaybackRate = useCallback(\n\t\tasync (playbackRate: number): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setPlaybackRate',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setPlaybackRate(playbackRate);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst getDuration = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getDuration',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getDuration();\n\t}, [logger]);\n\n\tconst getCurrentTime = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getCurrentTime',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getCurrentTime();\n\t}, [logger]);\n\n\tconst getVolume = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getVolume',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getVolume();\n\t}, [logger]);\n\n\tconst getMuted = useCallback(async (): Promise<boolean> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getMuted',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getMuted();\n\t}, [logger]);\n\n\tconst getPlaybackRate = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getPlaybackRate',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getPlaybackRate();\n\t}, [logger]);\n\n\tconst supports = useCallback(\n\t\t(command: keyof IPlayerCommands): boolean =>\n\t\t\tcontrollerRef.current.supports(command),\n\t\t[],\n\t);\n\n\tconst value = useMemo(\n\t\t(): NostalgicDivaContextProps => ({\n\t\t\tlogger,\n\t\t\thandleControllerChange,\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\tsetPlaybackRate,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t\tgetMuted,\n\t\t\tgetPlaybackRate,\n\t\t\tsupports,\n\t\t}),\n\t\t[\n\t\t\tlogger,\n\t\t\thandleControllerChange,\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\tsetPlaybackRate,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t\tgetMuted,\n\t\t\tgetPlaybackRate,\n\t\t\tsupports,\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 useContext(NostalgicDivaContext);\n};\n","import { ILogger, LogLevel } from '@/controllers/Logger';\nimport { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\nexport enum PlayerType {\n\t'Audio' = 'Audio',\n\t'Dailymotion' = 'Dailymotion',\n\t'Niconico' = 'Niconico',\n\t'SoundCloud' = 'SoundCloud',\n\t'Twitch' = 'Twitch',\n\t'Vimeo' = 'Vimeo',\n\t'YouTube' = 'YouTube',\n}\n\nexport function validatePlayerType(value: string): value is PlayerType {\n\treturn PlayerType[value as keyof typeof PlayerType] !== undefined;\n}\n\nexport interface LoadedEvent {\n\tid: string;\n}\n\nexport interface TimeEvent {\n\tduration: number;\n\tpercent: number;\n\tseconds: number;\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 IPlayerCommands {\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\tsetPlaybackRate(playbackRate: number): Promise<void>;\n\tgetDuration(): Promise<number>;\n\tgetCurrentTime(): Promise<number>;\n\tgetVolume(): Promise<number>;\n\tgetMuted(): Promise<boolean>;\n\tgetPlaybackRate(): Promise<number>;\n}\n\nexport interface IPlayerController extends IPlayerCommands {\n\tsupports(command: keyof IPlayerCommands): boolean;\n}\n\nexport class PlayerController<\n\tTPlayer extends object,\n\tTController extends PlayerControllerImpl<TPlayer>,\n> implements IPlayerController\n{\n\tprivate static nextId = 1;\n\n\tprivate readonly id: number;\n\tprivate impl?: TController;\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 controllerFactory: new (\n\t\t\tlogger: ILogger,\n\t\t\tplayer: TPlayer,\n\t\t\toptions: PlayerOptions | undefined,\n\t\t) => TController,\n\t) {\n\t\tthis.id = PlayerController.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.controllerFactory(\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\tprivate createCommandNotSupportedError(\n\t\tcommand: keyof IPlayerCommands,\n\t): Error {\n\t\treturn new Error(`${command} is not supported`);\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\tif (this.impl.loadVideo === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('loadVideo');\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\tif (this.impl.play === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('play');\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\tif (this.impl.pause === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('pause');\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\tif (this.impl.setCurrentTime === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('setCurrentTime');\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\tif (this.impl.setVolume === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('setVolume');\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\tif (this.impl.setMuted === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('setMuted');\n\t\t}\n\n\t\treturn this.impl.setMuted(muted);\n\t}\n\n\tsetPlaybackRate(playbackRate: number): Promise<void> {\n\t\tthis.debug('setPlaybackRate', playbackRate);\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tif (this.impl.setPlaybackRate === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('setPlaybackRate');\n\t\t}\n\n\t\treturn this.impl.setPlaybackRate(playbackRate);\n\t}\n\n\tgetDuration(): Promise<number> {\n\t\tthis.debug('getDuration');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tif (this.impl.getDuration === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('getDuration');\n\t\t}\n\n\t\treturn this.impl.getDuration();\n\t}\n\n\tgetCurrentTime(): Promise<number> {\n\t\tthis.debug('getCurrentTime');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tif (this.impl.getCurrentTime === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('getCurrentTime');\n\t\t}\n\n\t\treturn this.impl.getCurrentTime();\n\t}\n\n\tgetVolume(): Promise<number> {\n\t\tthis.debug('getVolume');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tif (this.impl.getVolume === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('getVolume');\n\t\t}\n\n\t\treturn this.impl.getVolume();\n\t}\n\n\tgetMuted(): Promise<boolean> {\n\t\tthis.debug('getMuted');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tif (this.impl.getMuted === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('getMuted');\n\t\t}\n\n\t\treturn this.impl.getMuted();\n\t}\n\n\tgetPlaybackRate(): Promise<number> {\n\t\tthis.debug('getPlaybackRate');\n\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\tif (this.impl.getPlaybackRate === undefined) {\n\t\t\tthrow this.createCommandNotSupportedError('getPlaybackRate');\n\t\t}\n\n\t\treturn this.impl.getPlaybackRate();\n\t}\n\n\tsupports(command: keyof IPlayerCommands): boolean {\n\t\tif (this.impl === undefined) {\n\t\t\tthrow this.createPlayerNotAttachedError();\n\t\t}\n\n\t\treturn this.impl.supports(command);\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\n\nexport abstract class VideoService<TPlayerType extends PlayerType> {\n\tprotected constructor(readonly type: TPlayerType) {}\n\n\tabstract canPlay(url: string): boolean;\n\n\tabstract extractVideoId(url: string): string | undefined;\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst AUDIO_EXTENSIONS =\n\t/\\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\\?)/i;\nconst VIDEO_EXTENSIONS = /\\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\\d+]+)?($|\\?)/i;\n\nexport class AudioVideoService extends VideoService<PlayerType.Audio> {\n\tconstructor() {\n\t\tsuper(PlayerType.Audio);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn AUDIO_EXTENSIONS.test(url) || VIDEO_EXTENSIONS.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\treturn url;\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_DAILYMOTION =\n\t/^(?:(?:https?):)?(?:\\/\\/)?(?:www\\.)?(?:(?:dailymotion\\.com(?:\\/embed)?\\/video)|dai\\.ly)\\/([a-zA-Z0-9]+)(?:_[\\w_-]+)?(?:[\\w.#_-]+)?/;\n\nexport class DailymotionVideoService extends VideoService<PlayerType.Dailymotion> {\n\tconstructor() {\n\t\tsuper(PlayerType.Dailymotion);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_DAILYMOTION.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_DAILYMOTION.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\nconst MATCH_URL_NICONICO = /(?:www\\.|)?nicovideo\\.jp\\/watch\\/(\\w+)$/;\n\nexport class NiconicoVideoService extends VideoService<PlayerType.Niconico> {\n\tconstructor() {\n\t\tsuper(PlayerType.Niconico);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_NICONICO.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_NICONICO.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_SOUNDCLOUD = /(?:soundcloud\\.com|snd\\.sc)\\/[^.]+$/;\n\nexport class SoundCloudVideoService extends VideoService<PlayerType.SoundCloud> {\n\tconstructor() {\n\t\tsuper(PlayerType.SoundCloud);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_SOUNDCLOUD.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\treturn url;\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_TWITCH_VIDEO = /(?:www\\.|go\\.)?twitch\\.tv\\/videos\\/(\\d+)($|\\?)/;\n\nexport class TwitchVideoService extends VideoService<PlayerType.Twitch> {\n\tconstructor() {\n\t\tsuper(PlayerType.Twitch);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_TWITCH_VIDEO.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_TWITCH_VIDEO.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_VIMEO = /vimeo\\.com\\/(\\d+)$/;\n\nexport class VimeoVideoService extends VideoService<PlayerType.Vimeo> {\n\tconstructor() {\n\t\tsuper(PlayerType.Vimeo);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_VIMEO.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\treturn MATCH_URL_VIMEO.exec(url)?.[1];\n\t}\n}\n","import { PlayerType } from '@/controllers/PlayerController';\nimport { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_YOUTUBE =\n\t/(?:youtu\\.be\\/|youtube(?:-nocookie|education)?\\.com\\/(?:embed\\/|v\\/|watch\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((\\w|-){11})|youtube\\.com\\/playlist\\?list=|youtube\\.com\\/user\\//;\n\nexport class YouTubeVideoService extends VideoService<PlayerType.YouTube> {\n\tconstructor() {\n\t\tsuper(PlayerType.YouTube);\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_YOUTUBE.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_YOUTUBE.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { AudioVideoService } from '@/services/AudioVideoService';\nimport { DailymotionVideoService } from '@/services/DailymotionVideoService';\nimport { NiconicoVideoService } from '@/services/NiconicoVideoService';\nimport { SoundCloudVideoService } from '@/services/SoundCloudVideoService';\nimport { TwitchVideoService } from '@/services/TwitchVideoService';\nimport { VimeoVideoService } from '@/services/VimeoVideoService';\nimport { YouTubeVideoService } from '@/services/YouTubeVideoService';\n\nconst videoServices = [\n\tnew AudioVideoService(),\n\tnew DailymotionVideoService(),\n\tnew NiconicoVideoService(),\n\tnew SoundCloudVideoService(),\n\tnew TwitchVideoService(),\n\tnew VimeoVideoService(),\n\tnew YouTubeVideoService(),\n] as const;\n\nexport function findVideoService(\n\turl: string,\n): (typeof videoServices)[number] | undefined {\n\treturn videoServices.find((videoService) => videoService.canPlay(url));\n}\n","import { useNostalgicDiva } from '@/components/NostalgicDivaProvider';\nimport { PlayerProps } from '@/components/PlayerContainer';\nimport { LogLevel } from '@/controllers/Logger';\nimport {\n\tIPlayerController,\n\tPlayerOptions,\n\tPlayerType,\n} from '@/controllers/PlayerController';\nimport { findVideoService } from '@/services/findVideoService';\nimport React, {\n\tElementType,\n\tReactElement,\n\tSuspense,\n\tlazy,\n\tmemo,\n\tuseCallback,\n} from 'react';\n\nconst players: Record<PlayerType, ElementType<PlayerProps>> = {\n\tAudio: lazy(() => import('./AudioPlayer')),\n\tDailymotion: lazy(() => import('./DailymotionPlayer')),\n\tNiconico: lazy(() => import('./NiconicoPlayer')),\n\tSoundCloud: lazy(() => import('./SoundCloudPlayer')),\n\tTwitch: lazy(() => import('./TwitchPlayer')),\n\tVimeo: lazy(() => import('./VimeoPlayer')),\n\tYouTube: lazy(() => import('./YouTubePlayer')),\n};\n\nexport interface NostalgicDivaProps {\n\tsrc: string;\n\toptions?: PlayerOptions;\n\tonControllerChange?: (value: IPlayerController) => void;\n}\n\nfunction getTypeAndVideoId(\n\turl: string,\n): { type: PlayerType; videoId: string } | undefined {\n\tconst videoService = findVideoService(url);\n\tif (videoService === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst { type, extractVideoId } = videoService;\n\n\tconst videoId = extractVideoId(url);\n\tif (videoId === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn { type: type, videoId: videoId };\n}\n\nexport const NostalgicDiva = memo(\n\t({\n\t\tsrc,\n\t\toptions,\n\t\tonControllerChange,\n\t}: NostalgicDivaProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\tconst handleControllerChange = useCallback(\n\t\t\t(value: IPlayerController) => {\n\t\t\t\tdiva.handleControllerChange(value);\n\n\t\t\t\tonControllerChange?.(value);\n\t\t\t},\n\t\t\t[diva, onControllerChange],\n\t\t);\n\n\t\tdiva.logger.log(LogLevel.Debug, 'NostalgicDiva');\n\n\t\tconst typeAndVideoId = getTypeAndVideoId(src);\n\t\tif (typeAndVideoId === undefined) {\n\t\t\treturn (\n\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t<iframe\n\t\t\t\t\t\tsrc=\"about:blank\"\n\t\t\t\t\t\ttitle=\"about:blank\"\n\t\t\t\t\t\tstyle={{\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\tborder: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tconst { type, videoId } = typeAndVideoId;\n\n\t\tconst Player = players[type];\n\n\t\treturn (\n\t\t\t<Suspense fallback={null}>\n\t\t\t\t<Player\n\t\t\t\t\tlogger={diva.logger}\n\t\t\t\t\ttype={type}\n\t\t\t\t\tonControllerChange={handleControllerChange}\n\t\t\t\t\tvideoId={videoId}\n\t\t\t\t\toptions={options}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t);\n\t},\n);\n","import { NostalgicDiva } from '@/components/NostalgicDiva';\nimport { NostalgicDivaProvider } from '@/components/NostalgicDivaProvider';\nimport { nullPlayerController } from '@/controllers/NullPlayerController';\nimport {\n\tIPlayerCommands,\n\tIPlayerController,\n\tPlayerOptions,\n} from '@/controllers/PlayerController';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport class NostalgicDivaElement\n\textends HTMLElement\n\timplements IPlayerController\n{\n\tstatic readonly observedAttributes = ['src'];\n\n\tcontainer: ShadowRoot;\n\tcontroller: IPlayerController = nullPlayerController;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.container = this.attachShadow({ mode: 'closed' });\n\t}\n\n\tget src(): string {\n\t\treturn this.getAttribute('src') ?? '';\n\t}\n\n\tset src(value: string) {\n\t\tthis.setAttribute('src', value);\n\t}\n\n\treadonly #options: PlayerOptions = {\n\t\tonError: (e) =>\n\t\t\tthis.dispatchEvent(new CustomEvent('error', { detail: e })),\n\t\tonLoaded: (e) =>\n\t\t\tthis.dispatchEvent(new CustomEvent('loaded', { detail: e })),\n\t\tonPlay: () => this.dispatchEvent(new CustomEvent('play')),\n\t\tonPause: () => this.dispatchEvent(new CustomEvent('pause')),\n\t\tonEnded: () => this.dispatchEvent(new CustomEvent('ended')),\n\t\tonTimeUpdate: (e) =>\n\t\t\tthis.dispatchEvent(new CustomEvent('timeupdate', { detail: e })),\n\t};\n\n\t#handleControllerChange = (value: IPlayerController): void => {\n\t\tconsole.debug(\n\t\t\t'[@nostalgic-diva/web-components] handleControllerChange',\n\t\t);\n\n\t\tthis.controller = value;\n\t};\n\n\t#render(): void {\n\t\tReactDOM.render(\n\t\t\t<NostalgicDivaProvider>\n\t\t\t\t<NostalgicDiva\n\t\t\t\t\tsrc={this.src}\n\t\t\t\t\toptions={this.#options}\n\t\t\t\t\tonControllerChange={this.#handleControllerChange}\n\t\t\t\t/>\n\t\t\t</NostalgicDivaProvider>,\n\t\t\tthis.container,\n\t\t);\n\t}\n\n\tconnectedCallback(): void {\n\t\tconsole.debug('[@nostalgic-diva/web-components] connectedCallback');\n\n\t\tthis.#render();\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tconsole.debug('[@nostalgic-diva/web-components] disconnectedCallback');\n\t}\n\n\tattributeChangedCallback(): void {\n\t\tconsole.debug(\n\t\t\t'[@nostalgic-diva/web-components] attributeChangedCallback',\n\t\t);\n\n\t\tthis.#render();\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait this.controller.loadVideo(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tawait this.controller.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tawait this.controller.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tawait this.controller.setCurrentTime(seconds);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tawait this.controller.setVolume(volume);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tawait this.controller.setMuted(muted);\n\t}\n\n\tasync setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tawait this.controller.setPlaybackRate(playbackRate);\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn await this.controller.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn await this.controller.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn await this.controller.getVolume();\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn await this.controller.getMuted();\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn await this.controller.getPlaybackRate();\n\t}\n\n\tsupports(command: keyof IPlayerCommands): boolean {\n\t\treturn this.controller.supports(command);\n\t}\n}\n\nexport function defineNostalgicDiva(): void {\n\tcustomElements.define('nostalgic-diva', NostalgicDivaElement);\n}\n","import { ILogger, LogLevel } from '@/controllers/Logger';\nimport { IPlayerCommands, PlayerOptions } from '@/controllers/PlayerController';\n\nexport abstract class PlayerControllerImpl<TPlayer>\n\timplements Partial<IPlayerCommands>\n{\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 setPlaybackRate?(playbackRate: number): Promise<void>;\n\tabstract getDuration?(): Promise<number>;\n\tabstract getCurrentTime?(): Promise<number>;\n\tabstract getVolume?(): Promise<number>;\n\tabstract getMuted?(): Promise<boolean>;\n\tabstract getPlaybackRate?(): Promise<number>;\n\n\tsupports(command: keyof IPlayerCommands): boolean {\n\t\treturn this[command] !== undefined;\n\t}\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\n// https://github.com/VocaDB/vocadb/blob/61b8c54f3eca906a477101dab4fdd9b154be310e/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerFile.ts.\nexport class AudioPlayerController extends PlayerControllerImpl<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\tawait this.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 setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tthis.player.playbackRate = playbackRate;\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.volume;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.muted;\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn this.player.playbackRate;\n\t}\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\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 DailymotionPlayerController extends PlayerControllerImpl<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\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.volume;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.muted;\n\t}\n\n\tgetPlaybackRate = undefined;\n}\n","import { LogLevel } from '@/controllers/Logger';\nimport { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\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 NiconicoPlayerController extends PlayerControllerImpl<HTMLIFrameElement> {\n\tprivate static readonly origin = 'https://embed.nicovideo.jp';\n\n\tprivate duration = 0;\n\tprivate currentTime = 0;\n\tprivate volume = 0;\n\tprivate muted = false;\n\n\tprivate handleMessage = (e: nico.PlayerEvent): void => {\n\t\tif (e.origin !== NiconicoPlayerController.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? 0\n\t\t\t\t\t\t: data.data.currentTime / 1000;\n\n\t\t\t\tthis.volume = data.data.volume;\n\t\t\t\tthis.muted = data.data.muted;\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 !== 0 && this.duration !== 0\n\t\t\t\t\t\t\t? this.currentTime / this.duration\n\t\t\t\t\t\t\t: 0,\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 = 0;\n\t\t\tthis.currentTime = 0;\n\t\t\tthis.volume = 0;\n\t\t\tthis.muted = false;\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\tNiconicoPlayerController.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\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.volume;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.muted;\n\t}\n\n\tgetPlaybackRate = undefined;\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\n// https://github.com/VocaDB/vocadb/blob/e147650a8f1f85c8fa865d0ab562126c278527ec/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerSoundCloud.ts.\nexport class SoundCloudPlayerController extends PlayerControllerImpl<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 SoundCloudPlayerController.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\tsetMuted = undefined;\n\n\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\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> {\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> {\n\t\tconst volume = await this.getVolumeCore();\n\t\treturn volume / 100;\n\t}\n\n\tgetMuted = undefined;\n\n\tgetPlaybackRate = undefined;\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\nexport class TwitchPlayerController extends PlayerControllerImpl<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\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.getVolume();\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.getMuted();\n\t}\n\n\tgetPlaybackRate = undefined;\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\n// https://github.com/cookpete/react-player/blob/e3c324bc6845698179d065fa408db515c2296b4b/src/players/Vimeo.js\nexport class VimeoPlayerController extends PlayerControllerImpl<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 setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tawait this.player.setPlaybackRate(playbackRate);\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.getVolume();\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn await this.player.getMuted();\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn this.player.getPlaybackRate();\n\t}\n}\n","import { LogLevel } from '@/controllers/Logger';\nimport { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\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 YouTubePlayerController extends PlayerControllerImpl<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 setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tthis.player.setPlaybackRate(playbackRate);\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.getVolume() / 100;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.isMuted();\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn this.player.getPlaybackRate();\n\t}\n}\n"],"names":["LogLevel","Logger","message","optionalParams","logLevel","defaultLogger","NullPlayerController","id","seconds","volume","muted","playbackRate","command","nullPlayerController","NostalgicDivaContext","createContext","NostalgicDivaProvider","children","logger","controllerRef","useRef","handleControllerChange","useCallback","value","loadVideo","play","pause","setCurrentTime","setVolume","setMuted","setPlaybackRate","getDuration","getCurrentTime","getVolume","getMuted","getPlaybackRate","supports","useMemo","React","useNostalgicDiva","useContext","PlayerType","validatePlayerType","PlayerController","type","player","options","controllerFactory","VideoService","AUDIO_EXTENSIONS","VIDEO_EXTENSIONS","AudioVideoService","url","MATCH_URL_DAILYMOTION","DailymotionVideoService","MATCH_URL_NICONICO","NiconicoVideoService","MATCH_URL_SOUNDCLOUD","SoundCloudVideoService","MATCH_URL_TWITCH_VIDEO","TwitchVideoService","MATCH_URL_VIMEO","VimeoVideoService","MATCH_URL_YOUTUBE","YouTubeVideoService","videoServices","findVideoService","videoService","players","lazy","getTypeAndVideoId","extractVideoId","videoId","NostalgicDiva","memo","src","onControllerChange","diva","typeAndVideoId","Player","Suspense","NostalgicDivaElement","#options","#handleControllerChange","#render","ReactDOM","defineNostalgicDiva","PlayerControllerImpl","AudioPlayerController","event","events","DailymotionPlayerController","PlayerStatus","NiconicoPlayerController","data","resolve","reject","SoundCloudPlayerController","duration","TwitchPlayerController","VimeoPlayerController","fraction","PlayerState","YouTubePlayerController","currentTime"],"mappings":"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"}
|