@aigamo/nostalgic-diva 1.4.0 → 1.5.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/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +375 -350
- package/dist/index.es.js.map +1 -1
- package/dist/players/AudioPlayerApi.d.ts +1 -0
- package/dist/players/NiconicoPlayerApi.d.ts +2 -0
- package/dist/players/PlayerApi.d.ts +2 -0
- package/dist/players/PlayerApiImpl.d.ts +1 -0
- package/dist/players/SoundCloudPlayerApi.d.ts +4 -2
- package/dist/players/VimeoPlayerApi.d.ts +1 -0
- package/dist/players/YouTubePlayerApi.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.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 React from 'react';\n\nimport { ILogger, LogLevel } from './ILogger';\nimport { IPlayerApi, PlayerOptions } from './PlayerApi';\n\nexport abstract class PlayerApiImpl<TElement extends HTMLElement>\n\timplements IPlayerApi\n{\n\tprotected constructor(\n\t\tprotected readonly logger: ILogger,\n\t\tprotected readonly playerElementRef: React.MutableRefObject<TElement>,\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}\n","import React from 'react';\n\nimport { ILogger } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\nimport { 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\tprivate readonly player: HTMLAudioElement;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLAudioElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = playerElementRef.current;\n\t}\n\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","import React from 'react';\n\nimport { 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}\n\nexport class PlayerApi<\n\tTElement extends HTMLElement,\n\tTPlayer extends PlayerApiImpl<TElement>,\n> implements IPlayerApi\n{\n\tprivate static nextId = 1;\n\n\tprivate readonly id: number;\n\tprivate impl?: TPlayer;\n\n\tconstructor(\n\t\tprivate readonly logger: ILogger,\n\t\tprivate readonly type: PlayerType,\n\t\tprivate readonly playerElementRef: React.MutableRefObject<TElement>,\n\t\tprivate readonly options: PlayerOptions | undefined,\n\t\tprivate readonly loadScript: (() => Promise<void>) | undefined,\n\t\tprivate readonly playerApiFactory: new (\n\t\t\tlogger: ILogger,\n\t\t\tplayerElementRef: React.MutableRefObject<TElement>,\n\t\t\toptions: PlayerOptions | undefined,\n\t\t) => TPlayer,\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\tawait this.loadScript?.();\n\n\t\tthis.debug('Attaching player...');\n\n\t\tthis.impl = new this.playerApiFactory(\n\t\t\tthis.logger,\n\t\t\tthis.playerElementRef,\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","// 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 PlayerApiImpl<TElement>,\n> extends PlayerProps {\n\tloadScript: (() => Promise<void>) | undefined;\n\tplayerApiFactory: new (\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<TElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) => TPlayer;\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 PlayerApiImpl<TElement>,\n>({\n\tlogger,\n\ttype,\n\tplayerApiRef,\n\tvideoId,\n\toptions,\n\tloadScript,\n\tplayerApiFactory,\n\tchildren,\n}: PlayerContainerProps<TElement, TPlayer>): React.ReactElement<\n\tPlayerContainerProps<TElement, TPlayer>\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 [playerApi, setPlayerApi] = React.useState<IPlayerApi>();\n\n\t// Make sure that `options` do not change between re-rendering.\n\tReact.useEffect(() => {\n\t\tconst playerApi = new PlayerApi(\n\t\t\tlogger,\n\t\t\ttype,\n\t\t\tplayerElementRef,\n\t\t\toptions,\n\t\t\tloadScript,\n\t\t\tplayerApiFactory,\n\t\t);\n\n\t\tif (playerApiRef) playerApiRef.current = playerApi;\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().then(() => setPlayerApi(undefined));\n\t\t};\n\t}, [logger, type, options, loadScript, playerApiFactory, playerApiRef]);\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) return;\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\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 React from 'react';\n\nimport { ILogger, LogLevel } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\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 readonly player: HTMLIFrameElement;\n\n\tprivate duration?: number;\n\tprivate currentTime?: number;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLIFrameElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = playerElementRef.current;\n\t}\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.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","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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\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 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}),\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],\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 React from 'react';\n\nimport { ILogger } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/VocaDB/vocadb/blob/e147650a8f1f85c8fa865d0ab562126c278527ec/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerSoundCloud.ts.\nexport class SoundCloudPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {\n\tprivate readonly player: SC.SoundCloudWidget;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLIFrameElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = SC.Widget(this.playerElementRef.current);\n\t}\n\n\tprivate static playerGetDurationAsync(\n\t\tplayer: SC.SoundCloudWidget,\n\t): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tplayer.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 =\n\t\t\t\t\t\t\tawait SoundCloudPlayerApi.playerGetDurationAsync(\n\t\t\t\t\t\t\t\tthis.player,\n\t\t\t\t\t\t\t);\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 SoundCloudPlayerApi.playerGetDurationAsync(\n\t\t\tthis.player,\n\t\t);\n\n\t\treturn duration / 1000;\n\t}\n\n\tprivate static playerGetPositionAsync(\n\t\tplayer: SC.SoundCloudWidget,\n\t): Promise<number> {\n\t\treturn new Promise((resolve, reject /* TODO: Reject. */) => {\n\t\t\tplayer.getPosition(resolve);\n\t\t});\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\tconst position = await SoundCloudPlayerApi.playerGetPositionAsync(\n\t\t\tthis.player,\n\t\t);\n\n\t\treturn position / 1000;\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\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 React from 'react';\n\nimport { ILogger } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/cookpete/react-player/blob/e3c324bc6845698179d065fa408db515c2296b4b/src/players/Vimeo.js\nexport class VimeoPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {\n\tprivate readonly player: Vimeo.Player;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLIFrameElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = new Vimeo.Player(this.playerElementRef.current);\n\t}\n\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 await this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number | undefined> {\n\t\treturn await this.player.getCurrentTime();\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\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 React from 'react';\n\nimport { ILogger, LogLevel } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\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<HTMLDivElement> {\n\tprivate static readonly origin = 'https://www.youtube-nocookie.com';\n\n\tprivate readonly player: YT.Player;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLDivElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = new YT.Player(this.playerElementRef.current, {\n\t\t\thost: YouTubePlayerApi.origin,\n\t\t\twidth: '100%',\n\t\t\theight: '100%',\n\t\t});\n\t}\n\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","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\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\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","playerElementRef","options","AudioPlayerApi","__publicField","event","_b","_a","id","seconds","volume","muted","_PlayerApi","type","loadScript","playerApiFactory","message","optionalParams","PlayerApi","useFirstMountState","isFirst","useRef","strictEquals","prev","next","usePreviousDistinct","value","compare","prevRef","curRef","PlayerContainer","playerApiRef","videoId","children","videoIdRef","React","playerApi","setPlayerApi","previousVideoId","AudioPlayer","props","PlayerStatus","_NiconicoPlayerApi","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","useNostalgicDiva","SoundCloudPlayerApi","player","duration","url","getScript","script","loadState","urls","ensureScriptLoaded","error","SoundCloudPlayer","VimeoPlayerApi","fraction","VimeoPlayer","PlayerState","_YouTubePlayerApi","currentTime","YouTubePlayerApi","YouTubePlayer","players","NostalgicDiva","Player"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.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 React from 'react';\n\nimport { ILogger, LogLevel } from './ILogger';\nimport { IPlayerApi, PlayerOptions } from './PlayerApi';\n\nexport abstract class PlayerApiImpl<TElement extends HTMLElement>\n\timplements IPlayerApi\n{\n\tprotected constructor(\n\t\tprotected readonly logger: ILogger,\n\t\tprotected readonly playerElementRef: React.MutableRefObject<TElement>,\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 React from 'react';\n\nimport { ILogger } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\nimport { 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\tprivate readonly player: HTMLAudioElement;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLAudioElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = playerElementRef.current;\n\t}\n\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 React from 'react';\n\nimport { 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\tTElement extends HTMLElement,\n\tTPlayer extends PlayerApiImpl<TElement>,\n> implements IPlayerApi\n{\n\tprivate static nextId = 1;\n\n\tprivate readonly id: number;\n\tprivate impl?: TPlayer;\n\n\tconstructor(\n\t\tprivate readonly logger: ILogger,\n\t\tprivate readonly type: PlayerType,\n\t\tprivate readonly playerElementRef: React.MutableRefObject<TElement>,\n\t\tprivate readonly options: PlayerOptions | undefined,\n\t\tprivate readonly loadScript: (() => Promise<void>) | undefined,\n\t\tprivate readonly playerApiFactory: new (\n\t\t\tlogger: ILogger,\n\t\t\tplayerElementRef: React.MutableRefObject<TElement>,\n\t\t\toptions: PlayerOptions | undefined,\n\t\t) => TPlayer,\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\tawait this.loadScript?.();\n\n\t\tthis.debug('Attaching player...');\n\n\t\tthis.impl = new this.playerApiFactory(\n\t\t\tthis.logger,\n\t\t\tthis.playerElementRef,\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 PlayerApiImpl<TElement>,\n> extends PlayerProps {\n\tloadScript: (() => Promise<void>) | undefined;\n\tplayerApiFactory: new (\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<TElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) => TPlayer;\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 PlayerApiImpl<TElement>,\n>({\n\tlogger,\n\ttype,\n\tplayerApiRef,\n\tvideoId,\n\toptions,\n\tloadScript,\n\tplayerApiFactory,\n\tchildren,\n}: PlayerContainerProps<TElement, TPlayer>): React.ReactElement<\n\tPlayerContainerProps<TElement, TPlayer>\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 [playerApi, setPlayerApi] = React.useState<IPlayerApi>();\n\n\t// Make sure that `options` do not change between re-rendering.\n\tReact.useEffect(() => {\n\t\tconst playerApi = new PlayerApi(\n\t\t\tlogger,\n\t\t\ttype,\n\t\t\tplayerElementRef,\n\t\t\toptions,\n\t\t\tloadScript,\n\t\t\tplayerApiFactory,\n\t\t);\n\n\t\tif (playerApiRef) playerApiRef.current = playerApi;\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().then(() => setPlayerApi(undefined));\n\t\t};\n\t}, [logger, type, options, loadScript, playerApiFactory, playerApiRef]);\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) return;\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\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 React from 'react';\n\nimport { ILogger, LogLevel } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\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 readonly player: HTMLIFrameElement;\n\n\tprivate duration?: number;\n\tprivate currentTime?: number;\n\tprivate volume?: number;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLIFrameElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = playerElementRef.current;\n\t}\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={undefined}\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 React from 'react';\n\nimport { ILogger } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/VocaDB/vocadb/blob/e147650a8f1f85c8fa865d0ab562126c278527ec/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerSoundCloud.ts.\nexport class SoundCloudPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {\n\tprivate readonly player: SC.SoundCloudWidget;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLIFrameElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = SC.Widget(this.playerElementRef.current);\n\t}\n\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\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 React from 'react';\n\nimport { ILogger } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\nimport { PlayerApiImpl } from './PlayerApiImpl';\n\n// https://github.com/cookpete/react-player/blob/e3c324bc6845698179d065fa408db515c2296b4b/src/players/Vimeo.js\nexport class VimeoPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {\n\tprivate readonly player: Vimeo.Player;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLIFrameElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = new Vimeo.Player(this.playerElementRef.current);\n\t}\n\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\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 React from 'react';\n\nimport { ILogger, LogLevel } from './ILogger';\nimport { PlayerOptions } from './PlayerApi';\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<HTMLDivElement> {\n\tprivate static readonly origin = 'https://www.youtube-nocookie.com';\n\n\tprivate readonly player: YT.Player;\n\n\tconstructor(\n\t\tlogger: ILogger,\n\t\tplayerElementRef: React.MutableRefObject<HTMLDivElement>,\n\t\toptions: PlayerOptions | undefined,\n\t) {\n\t\tsuper(logger, playerElementRef, options);\n\n\t\tthis.player = new YT.Player(this.playerElementRef.current, {\n\t\t\thost: YouTubePlayerApi.origin,\n\t\t\twidth: '100%',\n\t\t\theight: '100%',\n\t\t});\n\t}\n\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();\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\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\treturn (\n\t\t\t<PlayerContainer\n\t\t\t\t{...props}\n\t\t\t\tloadScript={loadScript}\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","playerElementRef","options","AudioPlayerApi","__publicField","event","_b","_a","id","seconds","volume","muted","_PlayerApi","type","loadScript","playerApiFactory","message","optionalParams","PlayerApi","useFirstMountState","isFirst","useRef","strictEquals","prev","next","usePreviousDistinct","value","compare","prevRef","curRef","PlayerContainer","playerApiRef","videoId","children","videoIdRef","React","playerApi","setPlayerApi","previousVideoId","AudioPlayer","props","PlayerStatus","_NiconicoPlayerApi","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","player","url","getScript","script","loadState","urls","ensureScriptLoaded","error","SoundCloudPlayer","VimeoPlayerApi","fraction","VimeoPlayer","PlayerState","_YouTubePlayerApi","currentTime","YouTubePlayerApi","YouTubePlayer","players","NostalgicDiva","Player"],"mappings":"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"}
|
|
@@ -15,4 +15,5 @@ export declare class AudioPlayerApi extends PlayerApiImpl<HTMLAudioElement> {
|
|
|
15
15
|
setMuted(muted: boolean): Promise<void>;
|
|
16
16
|
getDuration(): Promise<number | undefined>;
|
|
17
17
|
getCurrentTime(): Promise<number | undefined>;
|
|
18
|
+
getVolume(): Promise<number | undefined>;
|
|
18
19
|
}
|
|
@@ -12,6 +12,7 @@ export declare class NiconicoPlayerApi extends PlayerApiImpl<HTMLIFrameElement>
|
|
|
12
12
|
private readonly player;
|
|
13
13
|
private duration?;
|
|
14
14
|
private currentTime?;
|
|
15
|
+
private volume?;
|
|
15
16
|
constructor(logger: ILogger, playerElementRef: React.MutableRefObject<HTMLIFrameElement>, options: PlayerOptions | undefined);
|
|
16
17
|
private handleMessage;
|
|
17
18
|
attach(): Promise<void>;
|
|
@@ -25,4 +26,5 @@ export declare class NiconicoPlayerApi extends PlayerApiImpl<HTMLIFrameElement>
|
|
|
25
26
|
setMuted(muted: boolean): Promise<void>;
|
|
26
27
|
getDuration(): Promise<number | undefined>;
|
|
27
28
|
getCurrentTime(): Promise<number | undefined>;
|
|
29
|
+
getVolume(): Promise<number | undefined>;
|
|
28
30
|
}
|
|
@@ -27,6 +27,7 @@ export interface IPlayerApi {
|
|
|
27
27
|
setMuted(muted: boolean): Promise<void>;
|
|
28
28
|
getDuration(): Promise<number | undefined>;
|
|
29
29
|
getCurrentTime(): Promise<number | undefined>;
|
|
30
|
+
getVolume(): Promise<number | undefined>;
|
|
30
31
|
}
|
|
31
32
|
export declare class PlayerApi<TElement extends HTMLElement, TPlayer extends PlayerApiImpl<TElement>> implements IPlayerApi {
|
|
32
33
|
private readonly logger;
|
|
@@ -53,4 +54,5 @@ export declare class PlayerApi<TElement extends HTMLElement, TPlayer extends Pla
|
|
|
53
54
|
setMuted(muted: boolean): Promise<void>;
|
|
54
55
|
getDuration(): Promise<number | undefined>;
|
|
55
56
|
getCurrentTime(): Promise<number | undefined>;
|
|
57
|
+
getVolume(): Promise<number | undefined>;
|
|
56
58
|
}
|
|
@@ -16,4 +16,5 @@ export declare abstract class PlayerApiImpl<TElement extends HTMLElement> implem
|
|
|
16
16
|
abstract setMuted(muted: boolean): Promise<void>;
|
|
17
17
|
abstract getDuration(): Promise<number | undefined>;
|
|
18
18
|
abstract getCurrentTime(): Promise<number | undefined>;
|
|
19
|
+
abstract getVolume(): Promise<number | undefined>;
|
|
19
20
|
}
|
|
@@ -5,7 +5,7 @@ import { PlayerApiImpl } from './PlayerApiImpl';
|
|
|
5
5
|
export declare class SoundCloudPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {
|
|
6
6
|
private readonly player;
|
|
7
7
|
constructor(logger: ILogger, playerElementRef: React.MutableRefObject<HTMLIFrameElement>, options: PlayerOptions | undefined);
|
|
8
|
-
private
|
|
8
|
+
private getDurationCore;
|
|
9
9
|
attach(id: string): Promise<void>;
|
|
10
10
|
detach(): Promise<void>;
|
|
11
11
|
private static playerLoadAsync;
|
|
@@ -16,6 +16,8 @@ export declare class SoundCloudPlayerApi extends PlayerApiImpl<HTMLIFrameElement
|
|
|
16
16
|
setVolume(volume: number): Promise<void>;
|
|
17
17
|
setMuted(muted: boolean): Promise<void>;
|
|
18
18
|
getDuration(): Promise<number | undefined>;
|
|
19
|
-
private
|
|
19
|
+
private getCurrentTimeCore;
|
|
20
20
|
getCurrentTime(): Promise<number | undefined>;
|
|
21
|
+
private getVolumeCore;
|
|
22
|
+
getVolume(): Promise<number | undefined>;
|
|
21
23
|
}
|
|
@@ -15,4 +15,5 @@ export declare class VimeoPlayerApi extends PlayerApiImpl<HTMLIFrameElement> {
|
|
|
15
15
|
setMuted(muted: boolean): Promise<void>;
|
|
16
16
|
getDuration(): Promise<number | undefined>;
|
|
17
17
|
getCurrentTime(): Promise<number | undefined>;
|
|
18
|
+
getVolume(): Promise<number | undefined>;
|
|
18
19
|
}
|
|
@@ -26,4 +26,5 @@ export declare class YouTubePlayerApi extends PlayerApiImpl<HTMLDivElement> {
|
|
|
26
26
|
setMuted(muted: boolean): Promise<void>;
|
|
27
27
|
getDuration(): Promise<number | undefined>;
|
|
28
28
|
getCurrentTime(): Promise<number | undefined>;
|
|
29
|
+
getVolume(): Promise<number | undefined>;
|
|
29
30
|
}
|