@aigamo/nostalgic-diva 0.0.1-alpha.66

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.
Files changed (78) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +171 -0
  3. package/dist/AudioPlayer-BMxdg9dp.js +35 -0
  4. package/dist/AudioPlayer-BMxdg9dp.js.map +1 -0
  5. package/dist/AudioPlayer-CgUxIJwa.cjs +2 -0
  6. package/dist/AudioPlayer-CgUxIJwa.cjs.map +1 -0
  7. package/dist/DailymotionPlayer-B4M9j0Lx.js +65 -0
  8. package/dist/DailymotionPlayer-B4M9j0Lx.js.map +1 -0
  9. package/dist/DailymotionPlayer-BdI4qcvJ.cjs +2 -0
  10. package/dist/DailymotionPlayer-BdI4qcvJ.cjs.map +1 -0
  11. package/dist/NiconicoPlayer-C1bgzaCT.cjs +2 -0
  12. package/dist/NiconicoPlayer-C1bgzaCT.cjs.map +1 -0
  13. package/dist/NiconicoPlayer-Cx3hGYsw.js +36 -0
  14. package/dist/NiconicoPlayer-Cx3hGYsw.js.map +1 -0
  15. package/dist/SoundCloudPlayer-BiFTnxn9.cjs +2 -0
  16. package/dist/SoundCloudPlayer-BiFTnxn9.cjs.map +1 -0
  17. package/dist/SoundCloudPlayer-C8QVPCXH.js +43 -0
  18. package/dist/SoundCloudPlayer-C8QVPCXH.js.map +1 -0
  19. package/dist/TwitchPlayer-C9D_eEaj.js +40 -0
  20. package/dist/TwitchPlayer-C9D_eEaj.js.map +1 -0
  21. package/dist/TwitchPlayer-DdhZD1Bh.cjs +2 -0
  22. package/dist/TwitchPlayer-DdhZD1Bh.cjs.map +1 -0
  23. package/dist/VimeoPlayer-DfBZwtd9.cjs +2 -0
  24. package/dist/VimeoPlayer-DfBZwtd9.cjs.map +1 -0
  25. package/dist/VimeoPlayer-UnKk2VAq.js +43 -0
  26. package/dist/VimeoPlayer-UnKk2VAq.js.map +1 -0
  27. package/dist/YouTubePlayer-CeTkdcOO.cjs +2 -0
  28. package/dist/YouTubePlayer-CeTkdcOO.cjs.map +1 -0
  29. package/dist/YouTubePlayer-bNmEJD02.js +39 -0
  30. package/dist/YouTubePlayer-bNmEJD02.js.map +1 -0
  31. package/dist/components/AudioPlayer.d.ts +4 -0
  32. package/dist/components/DailymotionPlayer.d.ts +4 -0
  33. package/dist/components/NiconicoPlayer.d.ts +4 -0
  34. package/dist/components/NostalgicDiva.d.ts +10 -0
  35. package/dist/components/NostalgicDivaProvider.d.ts +14 -0
  36. package/dist/components/PlayerContainer.d.ts +19 -0
  37. package/dist/components/SoundCloudPlayer.d.ts +4 -0
  38. package/dist/components/TwitchPlayer.d.ts +4 -0
  39. package/dist/components/VimeoPlayer.d.ts +4 -0
  40. package/dist/components/YouTubePlayer.d.ts +4 -0
  41. package/dist/components/defineNostalgicDiva.d.ts +27 -0
  42. package/dist/components/index.d.ts +4 -0
  43. package/dist/components/useFirstMountState.d.ts +1 -0
  44. package/dist/components/usePreviousDistinct.d.ts +2 -0
  45. package/dist/controllers/AudioPlayerController.d.ts +17 -0
  46. package/dist/controllers/DailymotionPlayerController.d.ts +18 -0
  47. package/dist/controllers/Logger.d.ts +50 -0
  48. package/dist/controllers/NiconicoPlayerController.d.ts +29 -0
  49. package/dist/controllers/NullPlayerController.d.ts +20 -0
  50. package/dist/controllers/PlayerController.d.ts +67 -0
  51. package/dist/controllers/PlayerControllerImpl.d.ts +23 -0
  52. package/dist/controllers/SoundCloudPlayerController.d.ts +21 -0
  53. package/dist/controllers/TwitchPlayerController.d.ts +22 -0
  54. package/dist/controllers/VimeoPlayerController.d.ts +17 -0
  55. package/dist/controllers/YouTubePlayerController.d.ts +27 -0
  56. package/dist/controllers/ensureScriptLoaded.d.ts +2 -0
  57. package/dist/controllers/getScript.d.ts +1 -0
  58. package/dist/controllers/index.d.ts +11 -0
  59. package/dist/ensureScriptLoaded-CkK_-Amf.cjs +2 -0
  60. package/dist/ensureScriptLoaded-CkK_-Amf.cjs.map +1 -0
  61. package/dist/ensureScriptLoaded-HHnKf-aZ.js +24 -0
  62. package/dist/ensureScriptLoaded-HHnKf-aZ.js.map +1 -0
  63. package/dist/index.cjs.js +2 -0
  64. package/dist/index.cjs.js.map +1 -0
  65. package/dist/index.d.ts +3 -0
  66. package/dist/index.es.js +1238 -0
  67. package/dist/index.es.js.map +1 -0
  68. package/dist/services/AudioVideoService.d.ts +6 -0
  69. package/dist/services/DailymotionVideoService.d.ts +6 -0
  70. package/dist/services/NiconicoVideoService.d.ts +6 -0
  71. package/dist/services/SoundCloudVideoService.d.ts +6 -0
  72. package/dist/services/TwitchVideoService.d.ts +6 -0
  73. package/dist/services/VideoService.d.ts +7 -0
  74. package/dist/services/VimeoVideoService.d.ts +6 -0
  75. package/dist/services/YouTubeVideoService.d.ts +6 -0
  76. package/dist/services/findVideoService.d.ts +3 -0
  77. package/dist/services/index.d.ts +2 -0
  78. package/package.json +83 -0
@@ -0,0 +1,39 @@
1
+ import { jsx as r } from "react/jsx-runtime";
2
+ import { LogLevel as i, PlayerContainer as u, YouTubePlayerController as s } from "./index.es.js";
3
+ import { e as c } from "./ensureScriptLoaded-HHnKf-aZ.js";
4
+ import { memo as m, useCallback as a } from "react";
5
+ const y = "https://www.youtube-nocookie.com", p = m(({ ...t }) => {
6
+ const { logger: o } = t;
7
+ o.log(i.Debug, "YouTubePlayer");
8
+ const n = a(() => new Promise(async (e, d) => {
9
+ await c(
10
+ "https://www.youtube.com/iframe_api",
11
+ o
12
+ ) ? window.onYouTubeIframeAPIReady = () => {
13
+ o.log(i.Debug, "YouTube iframe API ready"), e();
14
+ } : e();
15
+ }), [o]), l = a(
16
+ (e) => Promise.resolve(
17
+ new YT.Player(e, {
18
+ host: y,
19
+ width: "100%",
20
+ height: "100%"
21
+ })
22
+ ),
23
+ []
24
+ );
25
+ return /* @__PURE__ */ r(
26
+ u,
27
+ {
28
+ ...t,
29
+ loadScript: n,
30
+ playerFactory: l,
31
+ controllerFactory: s,
32
+ children: (e) => /* @__PURE__ */ r("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ r("div", { ref: e }) })
33
+ }
34
+ );
35
+ });
36
+ export {
37
+ p as default
38
+ };
39
+ //# sourceMappingURL=YouTubePlayer-bNmEJD02.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YouTubePlayer-bNmEJD02.js","sources":["../src/components/YouTubePlayer.tsx"],"sourcesContent":["import {\n\tPlayerContainer,\n\ttype PlayerProps,\n} from '@/components/PlayerContainer';\nimport { LogLevel } from '@/controllers/Logger';\nimport { YouTubePlayerController } from '@/controllers/YouTubePlayerController';\nimport { ensureScriptLoaded } from '@/controllers/ensureScriptLoaded';\nimport { type ReactElement, memo, useCallback } from 'react';\n\nconst origin = 'https://www.youtube-nocookie.com';\n\nconst YouTubePlayer = memo(({ ...props }: PlayerProps): ReactElement => {\n\tconst { logger } = props;\n\n\tlogger.log(LogLevel.Debug, 'YouTubePlayer');\n\n\tconst loadScript = useCallback((): Promise<void> => {\n\t\treturn new Promise(async (resolve, _reject) => {\n\t\t\tconst first = await ensureScriptLoaded(\n\t\t\t\t'https://www.youtube.com/iframe_api',\n\t\t\t\tlogger,\n\t\t\t);\n\n\t\t\tif (first) {\n\t\t\t\t// https://stackoverflow.com/a/18154942.\n\t\t\t\twindow.onYouTubeIframeAPIReady = (): void => {\n\t\t\t\t\tlogger.log(LogLevel.Debug, 'YouTube iframe API ready');\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}, [logger]);\n\n\tconst playerFactory = useCallback(\n\t\t(element: HTMLDivElement): Promise<YT.Player> => {\n\t\t\treturn Promise.resolve(\n\t\t\t\tnew YT.Player(element, {\n\t\t\t\t\thost: origin,\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%',\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<PlayerContainer\n\t\t\t{...props}\n\t\t\tloadScript={loadScript}\n\t\t\tplayerFactory={playerFactory}\n\t\t\tcontrollerFactory={YouTubePlayerController}\n\t\t>\n\t\t\t{(elementRef): ReactElement => (\n\t\t\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t\t\t<div ref={elementRef} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</PlayerContainer>\n\t);\n});\n\nexport default YouTubePlayer;\n"],"names":["origin","YouTubePlayer","memo","props","logger","LogLevel","loadScript","useCallback","resolve","_reject","ensureScriptLoaded","playerFactory","element","jsx","PlayerContainer","YouTubePlayerController","elementRef"],"mappings":";;;;AASA,MAAMA,IAAS,oCAETC,IAAgBC,EAAK,CAAC,EAAE,GAAGC,QAAuC;AACvE,QAAM,EAAE,QAAAC,MAAWD;AAEnB,EAAAC,EAAO,IAAIC,EAAS,OAAO,eAAe;AAE1C,QAAMC,IAAaC,EAAY,MACvB,IAAI,QAAQ,OAAOC,GAASC,MAAY;AAM9C,IALc,MAAMC;AAAA,MACnB;AAAA,MACAN;AAAA,IAAA,IAKA,OAAO,0BAA0B,MAAY;AAC5C,MAAAA,EAAO,IAAIC,EAAS,OAAO,0BAA0B,GACrDG,EAAA;AAAA,IACD,IAEAA,EAAA;AAAA,EAEF,CAAC,GACC,CAACJ,CAAM,CAAC,GAELO,IAAgBJ;AAAA,IACrB,CAACK,MACO,QAAQ;AAAA,MACd,IAAI,GAAG,OAAOA,GAAS;AAAA,QACtB,MAAMZ;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA,CACR;AAAA,IAAA;AAAA,IAGH,CAAA;AAAA,EAAC;AAGF,SACC,gBAAAa;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,GAAGX;AAAA,MACJ,YAAAG;AAAA,MACA,eAAAK;AAAA,MACA,mBAAmBI;AAAA,MAElB,UAAA,CAACC,MACD,gBAAAH,EAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,UACpC,UAAA,gBAAAA,EAAC,OAAA,EAAI,KAAKG,GAAY,EAAA,CACvB;AAAA,IAAA;AAAA,EAAA;AAIJ,CAAC;"}
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const AudioPlayer: import('react').MemoExoticComponent<({ ...props }: PlayerProps) => ReactElement>;
4
+ export default AudioPlayer;
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const DailymotionPlayer: import('react').MemoExoticComponent<({ options, ...props }: PlayerProps) => ReactElement>;
4
+ export default DailymotionPlayer;
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const NiconicoPlayer: import('react').MemoExoticComponent<({ ...props }: PlayerProps) => ReactElement>;
4
+ export default NiconicoPlayer;
@@ -0,0 +1,10 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { IPlayerController, PlayerOptions, PlayerType } from '../controllers/PlayerController';
3
+ import { ElementType, ReactElement } from 'react';
4
+ export declare const players: Map<PlayerType, ElementType<PlayerProps>>;
5
+ export interface NostalgicDivaProps {
6
+ src: string;
7
+ options?: PlayerOptions;
8
+ onControllerChange?: (value: IPlayerController) => void;
9
+ }
10
+ export declare const NostalgicDiva: import('react').MemoExoticComponent<({ src, options, onControllerChange, }: NostalgicDivaProps) => ReactElement>;
@@ -0,0 +1,14 @@
1
+ import { ILogger } from '../controllers/Logger';
2
+ import { IPlayerController } from '../controllers/PlayerController';
3
+ import { ReactElement, ReactNode } from 'react';
4
+ interface NostalgicDivaContextProps extends IPlayerController {
5
+ logger: ILogger;
6
+ handleControllerChange: (value: IPlayerController) => void;
7
+ }
8
+ export interface NostalgicDivaProviderProps {
9
+ children?: ReactNode;
10
+ logger?: ILogger;
11
+ }
12
+ export declare const NostalgicDivaProvider: ({ children, logger, }: NostalgicDivaProviderProps) => ReactElement;
13
+ export declare const useNostalgicDiva: () => NostalgicDivaContextProps;
14
+ export {};
@@ -0,0 +1,19 @@
1
+ import { ILogger } from '../controllers/Logger';
2
+ import { IPlayerController, PlayerOptions, PlayerType } from '../controllers/PlayerController';
3
+ import { PlayerControllerImpl } from '../controllers/PlayerControllerImpl';
4
+ import { MutableRefObject, ReactElement, ReactNode } from 'react';
5
+ export interface PlayerProps {
6
+ logger: ILogger;
7
+ type: PlayerType;
8
+ onControllerChange: ((value: IPlayerController) => void) | undefined;
9
+ videoId: string;
10
+ options: PlayerOptions | undefined;
11
+ }
12
+ interface PlayerContainerProps<TElement extends HTMLElement, TPlayer extends object, TController extends PlayerControllerImpl<TPlayer>> extends PlayerProps {
13
+ loadScript: (() => Promise<void>) | undefined;
14
+ playerFactory: (element: TElement, videoId: string) => Promise<TPlayer>;
15
+ controllerFactory: new (logger: ILogger, player: TPlayer, options: PlayerOptions | undefined) => TController;
16
+ children: (elementRef: MutableRefObject<TElement>, videoId: string) => ReactNode;
17
+ }
18
+ export declare const PlayerContainer: <TElement extends HTMLElement, TPlayer extends object, TController extends PlayerControllerImpl<TPlayer>>({ logger, type, loadScript, playerFactory, onControllerChange, videoId, options, controllerFactory, children, }: PlayerContainerProps<TElement, TPlayer, TController>) => ReactElement<PlayerContainerProps<TElement, TPlayer, TController>>;
19
+ export {};
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const SoundCloudPlayer: import('react').MemoExoticComponent<({ ...props }: PlayerProps) => ReactElement>;
4
+ export default SoundCloudPlayer;
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const TwitchPlayer: import('react').MemoExoticComponent<({ ...props }: PlayerProps) => ReactElement>;
4
+ export default TwitchPlayer;
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const VimeoPlayer: import('react').MemoExoticComponent<({ ...props }: PlayerProps) => ReactElement>;
4
+ export default VimeoPlayer;
@@ -0,0 +1,4 @@
1
+ import { PlayerProps } from './PlayerContainer';
2
+ import { ReactElement } from 'react';
3
+ declare const YouTubePlayer: import('react').MemoExoticComponent<({ ...props }: PlayerProps) => ReactElement>;
4
+ export default YouTubePlayer;
@@ -0,0 +1,27 @@
1
+ import { IPlayerCommands, IPlayerController } from '../controllers/PlayerController';
2
+ export declare class NostalgicDivaElement extends HTMLElement implements IPlayerController {
3
+ #private;
4
+ static readonly observedAttributes: string[];
5
+ container: ShadowRoot;
6
+ controller: IPlayerController;
7
+ constructor();
8
+ get src(): string;
9
+ set src(value: string);
10
+ connectedCallback(): void;
11
+ disconnectedCallback(): void;
12
+ attributeChangedCallback(): void;
13
+ loadVideo(id: string): Promise<void>;
14
+ play(): Promise<void>;
15
+ pause(): Promise<void>;
16
+ setCurrentTime(seconds: number): Promise<void>;
17
+ setVolume(volume: number): Promise<void>;
18
+ setMuted(muted: boolean): Promise<void>;
19
+ setPlaybackRate(playbackRate: number): Promise<void>;
20
+ getDuration(): Promise<number>;
21
+ getCurrentTime(): Promise<number>;
22
+ getVolume(): Promise<number>;
23
+ getMuted(): Promise<boolean>;
24
+ getPlaybackRate(): Promise<number>;
25
+ supports(command: keyof IPlayerCommands): boolean;
26
+ }
27
+ export declare function defineNostalgicDiva(): void;
@@ -0,0 +1,4 @@
1
+ export * from './NostalgicDiva';
2
+ export * from './NostalgicDivaProvider';
3
+ export * from './defineNostalgicDiva';
4
+ export * from './PlayerContainer';
@@ -0,0 +1 @@
1
+ export declare function useFirstMountState(): boolean;
@@ -0,0 +1,2 @@
1
+ export type Predicate<T> = (prev: T | undefined, next: T) => boolean;
2
+ export default function usePreviousDistinct<T>(value: T, compare?: Predicate<T>): T | undefined;
@@ -0,0 +1,17 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ export declare class AudioPlayerController extends PlayerControllerImpl<HTMLAudioElement> {
3
+ attach(): Promise<void>;
4
+ detach(): Promise<void>;
5
+ loadVideo(id: string): Promise<void>;
6
+ play(): Promise<void>;
7
+ pause(): Promise<void>;
8
+ setCurrentTime(seconds: number): Promise<void>;
9
+ setVolume(volume: number): Promise<void>;
10
+ setMuted(muted: boolean): Promise<void>;
11
+ setPlaybackRate(playbackRate: number): Promise<void>;
12
+ getDuration(): Promise<number>;
13
+ getCurrentTime(): Promise<number>;
14
+ getVolume(): Promise<number>;
15
+ getMuted(): Promise<boolean>;
16
+ getPlaybackRate(): Promise<number>;
17
+ }
@@ -0,0 +1,18 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ export declare class DailymotionPlayerController extends PlayerControllerImpl<DM.player> {
3
+ private handlePlayerEvents;
4
+ attach(_id: string): Promise<void>;
5
+ detach(): Promise<void>;
6
+ loadVideo(id: string): Promise<void>;
7
+ play(): Promise<void>;
8
+ pause(): Promise<void>;
9
+ setCurrentTime(seconds: number): Promise<void>;
10
+ setVolume(volume: number): Promise<void>;
11
+ setMuted(muted: boolean): Promise<void>;
12
+ setPlaybackRate: undefined;
13
+ getDuration(): Promise<number>;
14
+ getCurrentTime(): Promise<number>;
15
+ getVolume(): Promise<number>;
16
+ getMuted(): Promise<boolean>;
17
+ getPlaybackRate: undefined;
18
+ }
@@ -0,0 +1,50 @@
1
+ export declare enum LogLevel {
2
+ /**
3
+ * Logs that contain the most detailed messages. These messages may contain sensitive application data.
4
+ * These messages are disabled by default and should never be enabled in a production environment.
5
+ */
6
+ Trace = 0,
7
+ /**
8
+ * Logs that are used for interactive investigation during development. These logs should primarily contain
9
+ * information useful for debugging and have no long-term value.
10
+ */
11
+ Debug = 1,
12
+ /**
13
+ * Logs that track the general flow of the application. These logs should have long-term value.
14
+ */
15
+ Information = 2,
16
+ /**
17
+ * Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the
18
+ * application execution to stop.
19
+ */
20
+ Warning = 3,
21
+ /**
22
+ * Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a
23
+ * failure in the current activity, not an application-wide failure.
24
+ */
25
+ Error = 4,
26
+ /**
27
+ * Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires
28
+ * immediate attention.
29
+ */
30
+ Critical = 5,
31
+ /**
32
+ * Not used for writing log messages. Specifies that a logging category should not write any messages.
33
+ */
34
+ None = 6
35
+ }
36
+ export interface ILogger {
37
+ isEnabled(logLevel: LogLevel): boolean;
38
+ log(logLevel: LogLevel, message?: any, ...optionalParams: any[]): void;
39
+ }
40
+ declare class Logger implements ILogger {
41
+ private readonly title;
42
+ private createMessage;
43
+ private debug;
44
+ private error;
45
+ private warn;
46
+ isEnabled(): boolean;
47
+ log(logLevel: LogLevel, message?: any, ...optionalParams: any[]): void;
48
+ }
49
+ export declare const defaultLogger: Logger;
50
+ export {};
@@ -0,0 +1,29 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ declare global {
3
+ interface Window {
4
+ onNicoPlayerFactoryReady: (callback: nico.NicoPlayerFactory) => void;
5
+ }
6
+ }
7
+ export declare class NiconicoPlayerController extends PlayerControllerImpl<HTMLIFrameElement> {
8
+ private static readonly origin;
9
+ private duration;
10
+ private currentTime;
11
+ private volume;
12
+ private muted;
13
+ private handleMessage;
14
+ attach(): Promise<void>;
15
+ detach(): Promise<void>;
16
+ loadVideo(id: string): Promise<void>;
17
+ private postMessage;
18
+ play(): Promise<void>;
19
+ pause(): Promise<void>;
20
+ setCurrentTime(seconds: number): Promise<void>;
21
+ setVolume(volume: number): Promise<void>;
22
+ setMuted(muted: boolean): Promise<void>;
23
+ setPlaybackRate: undefined;
24
+ getDuration(): Promise<number>;
25
+ getCurrentTime(): Promise<number>;
26
+ getVolume(): Promise<number>;
27
+ getMuted(): Promise<boolean>;
28
+ getPlaybackRate: undefined;
29
+ }
@@ -0,0 +1,20 @@
1
+ import { IPlayerCommands, IPlayerController } from './PlayerController';
2
+ declare class NullPlayerController implements IPlayerController {
3
+ attach(): Promise<void>;
4
+ detach(): Promise<void>;
5
+ loadVideo(_id: string): Promise<void>;
6
+ play(): Promise<void>;
7
+ pause(): Promise<void>;
8
+ setCurrentTime(_seconds: number): Promise<void>;
9
+ setVolume(_volume: number): Promise<void>;
10
+ setMuted(_muted: boolean): Promise<void>;
11
+ setPlaybackRate(_playbackRate: number): Promise<void>;
12
+ getDuration(): Promise<number>;
13
+ getCurrentTime(): Promise<number>;
14
+ getVolume(): Promise<number>;
15
+ getMuted(): Promise<boolean>;
16
+ getPlaybackRate(): Promise<number>;
17
+ supports(_command: keyof IPlayerCommands): boolean;
18
+ }
19
+ export declare const nullPlayerController: NullPlayerController;
20
+ export {};
@@ -0,0 +1,67 @@
1
+ import { ILogger } from './Logger';
2
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
3
+ export type PlayerType = 'Audio' | 'Dailymotion' | 'Niconico' | 'SoundCloud' | 'Twitch' | 'Vimeo' | 'YouTube' | (string & {});
4
+ export interface LoadedEvent {
5
+ id: string;
6
+ }
7
+ export interface TimeEvent {
8
+ duration: number;
9
+ percent: number;
10
+ seconds: number;
11
+ }
12
+ export interface PlayerOptions {
13
+ onError?(event: any): void;
14
+ onLoaded?(event: LoadedEvent): void;
15
+ onPlay?(): void;
16
+ onPause?(): void;
17
+ onEnded?(): void;
18
+ onTimeUpdate?(event: TimeEvent): void;
19
+ }
20
+ export interface IPlayerCommands {
21
+ loadVideo(id: string): Promise<void>;
22
+ play(): Promise<void>;
23
+ pause(): Promise<void>;
24
+ setCurrentTime(seconds: number): Promise<void>;
25
+ setVolume(volume: number): Promise<void>;
26
+ setMuted(muted: boolean): Promise<void>;
27
+ setPlaybackRate(playbackRate: number): Promise<void>;
28
+ getDuration(): Promise<number>;
29
+ getCurrentTime(): Promise<number>;
30
+ getVolume(): Promise<number>;
31
+ getMuted(): Promise<boolean>;
32
+ getPlaybackRate(): Promise<number>;
33
+ }
34
+ export interface IPlayerController extends IPlayerCommands {
35
+ supports(command: keyof IPlayerCommands): boolean;
36
+ }
37
+ export declare class PlayerController<TPlayer extends object, TController extends PlayerControllerImpl<TPlayer>> implements IPlayerController {
38
+ private readonly logger;
39
+ private readonly type;
40
+ private readonly player;
41
+ private readonly options;
42
+ private readonly controllerFactory;
43
+ private static nextId;
44
+ private readonly id;
45
+ private impl?;
46
+ constructor(logger: ILogger, type: PlayerType, player: TPlayer, options: PlayerOptions | undefined, controllerFactory: new (logger: ILogger, player: TPlayer, options: PlayerOptions | undefined) => TController);
47
+ private createMessage;
48
+ debug(message?: any, ...optionalParams: any): void;
49
+ error(message?: any, ...optionalParams: any): void;
50
+ attach(id: string): Promise<void>;
51
+ private createPlayerNotAttachedError;
52
+ private createCommandNotSupportedError;
53
+ detach(): Promise<void>;
54
+ loadVideo(id: string): Promise<void>;
55
+ play(): Promise<void>;
56
+ pause(): Promise<void>;
57
+ setCurrentTime(seconds: number): Promise<void>;
58
+ setVolume(volume: number): Promise<void>;
59
+ setMuted(muted: boolean): Promise<void>;
60
+ setPlaybackRate(playbackRate: number): Promise<void>;
61
+ getDuration(): Promise<number>;
62
+ getCurrentTime(): Promise<number>;
63
+ getVolume(): Promise<number>;
64
+ getMuted(): Promise<boolean>;
65
+ getPlaybackRate(): Promise<number>;
66
+ supports(command: keyof IPlayerCommands): boolean;
67
+ }
@@ -0,0 +1,23 @@
1
+ import { ILogger } from './Logger';
2
+ import { IPlayerCommands, PlayerOptions } from './PlayerController';
3
+ export declare abstract class PlayerControllerImpl<TPlayer> implements Partial<IPlayerCommands> {
4
+ protected readonly logger: ILogger;
5
+ protected readonly player: TPlayer;
6
+ protected readonly options: PlayerOptions | undefined;
7
+ constructor(logger: ILogger, player: TPlayer, options: PlayerOptions | undefined);
8
+ abstract attach(id: string): Promise<void>;
9
+ abstract detach(): Promise<void>;
10
+ abstract loadVideo?(id: string): Promise<void>;
11
+ abstract play?(): Promise<void>;
12
+ abstract pause?(): Promise<void>;
13
+ abstract setCurrentTime?(seconds: number): Promise<void>;
14
+ abstract setVolume?(volume: number): Promise<void>;
15
+ abstract setMuted?(muted: boolean): Promise<void>;
16
+ abstract setPlaybackRate?(playbackRate: number): Promise<void>;
17
+ abstract getDuration?(): Promise<number>;
18
+ abstract getCurrentTime?(): Promise<number>;
19
+ abstract getVolume?(): Promise<number>;
20
+ abstract getMuted?(): Promise<boolean>;
21
+ abstract getPlaybackRate?(): Promise<number>;
22
+ supports(command: keyof IPlayerCommands): boolean;
23
+ }
@@ -0,0 +1,21 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ export declare class SoundCloudPlayerController extends PlayerControllerImpl<SC.SoundCloudWidget> {
3
+ private getDurationCore;
4
+ attach(id: string): Promise<void>;
5
+ detach(): Promise<void>;
6
+ private static playerLoadAsync;
7
+ loadVideo(id: string): Promise<void>;
8
+ play(): Promise<void>;
9
+ pause(): Promise<void>;
10
+ setCurrentTime(seconds: number): Promise<void>;
11
+ setVolume(volume: number): Promise<void>;
12
+ setMuted: undefined;
13
+ setPlaybackRate: undefined;
14
+ getDuration(): Promise<number>;
15
+ private getCurrentTimeCore;
16
+ getCurrentTime(): Promise<number>;
17
+ private getVolumeCore;
18
+ getVolume(): Promise<number>;
19
+ getMuted: undefined;
20
+ getPlaybackRate: undefined;
21
+ }
@@ -0,0 +1,22 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ export declare class TwitchPlayerController extends PlayerControllerImpl<Twitch.Player> {
3
+ private handleReady;
4
+ private handlePlay;
5
+ private handlePause;
6
+ private handleEnded;
7
+ private handleSeek;
8
+ attach(_id: string): Promise<void>;
9
+ detach(): Promise<void>;
10
+ loadVideo(id: string): Promise<void>;
11
+ play(): Promise<void>;
12
+ pause(): Promise<void>;
13
+ setCurrentTime(seconds: number): Promise<void>;
14
+ setVolume(volume: number): Promise<void>;
15
+ setMuted(muted: boolean): Promise<void>;
16
+ setPlaybackRate: undefined;
17
+ getDuration(): Promise<number>;
18
+ getCurrentTime(): Promise<number>;
19
+ getVolume(): Promise<number>;
20
+ getMuted(): Promise<boolean>;
21
+ getPlaybackRate: undefined;
22
+ }
@@ -0,0 +1,17 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ export declare class VimeoPlayerController extends PlayerControllerImpl<Vimeo.Player> {
3
+ attach(): Promise<void>;
4
+ detach(): Promise<void>;
5
+ loadVideo(id: string): Promise<void>;
6
+ play(): Promise<void>;
7
+ pause(): Promise<void>;
8
+ setCurrentTime(seconds: number): Promise<void>;
9
+ setVolume(fraction: number): Promise<void>;
10
+ setMuted(muted: boolean): Promise<void>;
11
+ setPlaybackRate(playbackRate: number): Promise<void>;
12
+ getDuration(): Promise<number>;
13
+ getCurrentTime(): Promise<number>;
14
+ getVolume(): Promise<number>;
15
+ getMuted(): Promise<boolean>;
16
+ getPlaybackRate(): Promise<number>;
17
+ }
@@ -0,0 +1,27 @@
1
+ import { PlayerControllerImpl } from './PlayerControllerImpl';
2
+ declare global {
3
+ interface Window {
4
+ onYouTubeIframeAPIReady(): void;
5
+ }
6
+ }
7
+ export declare class YouTubePlayerController extends PlayerControllerImpl<YT.Player> {
8
+ private previousTime?;
9
+ private timeUpdateIntervalId?;
10
+ private clearTimeUpdateInterval;
11
+ private invokeTimeUpdate;
12
+ private setTimeUpdateInterval;
13
+ attach(id: string): Promise<void>;
14
+ detach(): Promise<void>;
15
+ loadVideo(id: string): Promise<void>;
16
+ play(): Promise<void>;
17
+ pause(): Promise<void>;
18
+ setCurrentTime(seconds: number): Promise<void>;
19
+ setVolume(volume: number): Promise<void>;
20
+ setMuted(muted: boolean): Promise<void>;
21
+ setPlaybackRate(playbackRate: number): Promise<void>;
22
+ getDuration(): Promise<number>;
23
+ getCurrentTime(): Promise<number>;
24
+ getVolume(): Promise<number>;
25
+ getMuted(): Promise<boolean>;
26
+ getPlaybackRate(): Promise<number>;
27
+ }
@@ -0,0 +1,2 @@
1
+ import { ILogger } from './Logger';
2
+ export declare function ensureScriptLoaded(url: string, logger: ILogger): Promise<boolean>;
@@ -0,0 +1 @@
1
+ export declare function getScript(url: string): Promise<void>;
@@ -0,0 +1,11 @@
1
+ export * from './AudioPlayerController';
2
+ export * from './DailymotionPlayerController';
3
+ export * from './Logger';
4
+ export * from './NiconicoPlayerController';
5
+ export * from './NullPlayerController';
6
+ export * from './PlayerController';
7
+ export * from './PlayerControllerImpl';
8
+ export * from './SoundCloudPlayerController';
9
+ export * from './TwitchPlayerController';
10
+ export * from './VimeoPlayerController';
11
+ export * from './YouTubePlayerController';
@@ -0,0 +1,2 @@
1
+ "use strict";const n=require("./index.cjs.js");function d(e){return new Promise((o,a)=>{const t=document.createElement("script");t.src=e,t.async=!0,t.onerror=a,t.onload=t.onreadystatechange=function(){const r=this.readyState;r&&r!=="loaded"&&r!=="complete"||(t.onload=t.onreadystatechange=null,o())},document.head.appendChild(t)})}const c=[];async function s(e,o){if(c.includes(e))return o.log(n.LogLevel.Debug,e,"script is already loaded"),!1;try{return o.log(n.LogLevel.Debug,e,"Loading script..."),await d(e),c.includes(e)?(o.log(n.LogLevel.Debug,e,"script is already loaded"),!1):(c.push(e),o.log(n.LogLevel.Debug,e,"script loaded"),!0)}catch(a){throw o.log(n.LogLevel.Error,e,"Failed to load script"),a}}exports.ensureScriptLoaded=s;
2
+ //# sourceMappingURL=ensureScriptLoaded-CkK_-Amf.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureScriptLoaded-CkK_-Amf.cjs","sources":["../src/controllers/getScript.ts","../src/controllers/ensureScriptLoaded.ts"],"sourcesContent":["// 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 { type ILogger, LogLevel } from '@/controllers/Logger';\nimport { getScript } from '@/controllers/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"],"names":["getScript","url","resolve","reject","script","loadState","urls","ensureScriptLoaded","logger","LogLevel","error"],"mappings":"+CACO,SAASA,EAAUC,EAA4B,CACrD,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACvC,MAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,IAAMH,EACbG,EAAO,MAAQ,GAEfA,EAAO,QAAUD,EAEjBC,EAAO,OAASA,EAAO,mBAAqB,UAAkB,CAC7D,MAAMC,EAAY,KAAK,WAEnBA,GAAaA,IAAc,UAAYA,IAAc,aAGzDD,EAAO,OAASA,EAAO,mBAAqB,KAE5CF,EAAA,EACD,EAEA,SAAS,KAAK,YAAYE,CAAM,CACjC,CAAC,CACF,CCnBA,MAAME,EAAiB,CAAA,EAEvB,eAAsBC,EACrBN,EACAO,EACmB,CACnB,GAAIF,EAAK,SAASL,CAAG,EACpB,OAAAO,EAAO,IAAIC,EAAAA,SAAS,MAAOR,EAAK,0BAA0B,EACnD,GAGR,GAAI,CAKH,OAJAO,EAAO,IAAIC,EAAAA,SAAS,MAAOR,EAAK,mBAAmB,EAEnD,MAAMD,EAAUC,CAAG,EAEfK,EAAK,SAASL,CAAG,GACpBO,EAAO,IAAIC,EAAAA,SAAS,MAAOR,EAAK,0BAA0B,EACnD,KAEPK,EAAK,KAAKL,CAAG,EACbO,EAAO,IAAIC,EAAAA,SAAS,MAAOR,EAAK,eAAe,EACxC,GAET,OAASS,EAAO,CACf,MAAAF,EAAO,IAAIC,EAAAA,SAAS,MAAOR,EAAK,uBAAuB,EACjDS,CACP,CACD"}
@@ -0,0 +1,24 @@
1
+ import { LogLevel as o } from "./index.es.js";
2
+ function d(e) {
3
+ return new Promise((a, n) => {
4
+ const t = document.createElement("script");
5
+ t.src = e, t.async = !0, t.onerror = n, t.onload = t.onreadystatechange = function() {
6
+ const r = this.readyState;
7
+ r && r !== "loaded" && r !== "complete" || (t.onload = t.onreadystatechange = null, a());
8
+ }, document.head.appendChild(t);
9
+ });
10
+ }
11
+ const c = [];
12
+ async function i(e, a) {
13
+ if (c.includes(e))
14
+ return a.log(o.Debug, e, "script is already loaded"), !1;
15
+ try {
16
+ return a.log(o.Debug, e, "Loading script..."), await d(e), c.includes(e) ? (a.log(o.Debug, e, "script is already loaded"), !1) : (c.push(e), a.log(o.Debug, e, "script loaded"), !0);
17
+ } catch (n) {
18
+ throw a.log(o.Error, e, "Failed to load script"), n;
19
+ }
20
+ }
21
+ export {
22
+ i as e
23
+ };
24
+ //# sourceMappingURL=ensureScriptLoaded-HHnKf-aZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureScriptLoaded-HHnKf-aZ.js","sources":["../src/controllers/getScript.ts","../src/controllers/ensureScriptLoaded.ts"],"sourcesContent":["// 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 { type ILogger, LogLevel } from '@/controllers/Logger';\nimport { getScript } from '@/controllers/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"],"names":["getScript","url","resolve","reject","script","loadState","urls","ensureScriptLoaded","logger","LogLevel","error"],"mappings":";AACO,SAASA,EAAUC,GAA4B;AACrD,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACvC,UAAMC,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,MAAMH,GACbG,EAAO,QAAQ,IAEfA,EAAO,UAAUD,GAEjBC,EAAO,SAASA,EAAO,qBAAqB,WAAkB;AAC7D,YAAMC,IAAY,KAAK;AAEvB,MAAIA,KAAaA,MAAc,YAAYA,MAAc,eAGzDD,EAAO,SAASA,EAAO,qBAAqB,MAE5CF,EAAA;AAAA,IACD,GAEA,SAAS,KAAK,YAAYE,CAAM;AAAA,EACjC,CAAC;AACF;ACnBA,MAAME,IAAiB,CAAA;AAEvB,eAAsBC,EACrBN,GACAO,GACmB;AACnB,MAAIF,EAAK,SAASL,CAAG;AACpB,WAAAO,EAAO,IAAIC,EAAS,OAAOR,GAAK,0BAA0B,GACnD;AAGR,MAAI;AAKH,WAJAO,EAAO,IAAIC,EAAS,OAAOR,GAAK,mBAAmB,GAEnD,MAAMD,EAAUC,CAAG,GAEfK,EAAK,SAASL,CAAG,KACpBO,EAAO,IAAIC,EAAS,OAAOR,GAAK,0BAA0B,GACnD,OAEPK,EAAK,KAAKL,CAAG,GACbO,EAAO,IAAIC,EAAS,OAAOR,GAAK,eAAe,GACxC;AAAA,EAET,SAASS,GAAO;AACf,UAAAF,EAAO,IAAIC,EAAS,OAAOR,GAAK,uBAAuB,GACjDS;AAAA,EACP;AACD;"}