@aigamo/nostalgic-diva 1.19.0 → 1.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AudioPlayer-CWI95ZSf.cjs +2 -0
- package/dist/AudioPlayer-CWI95ZSf.cjs.map +1 -0
- package/dist/AudioPlayer-Rgj403rr.js +30 -0
- package/dist/AudioPlayer-Rgj403rr.js.map +1 -0
- package/dist/DailymotionPlayer-CqYR3YjJ.cjs +2 -0
- package/dist/DailymotionPlayer-CqYR3YjJ.cjs.map +1 -0
- package/dist/DailymotionPlayer-DKnJvBrE.js +60 -0
- package/dist/DailymotionPlayer-DKnJvBrE.js.map +1 -0
- package/dist/NiconicoPlayer-BWepjJRp.js +34 -0
- package/dist/NiconicoPlayer-BWepjJRp.js.map +1 -0
- package/dist/NiconicoPlayer-DK-XPLSb.cjs +2 -0
- package/dist/NiconicoPlayer-DK-XPLSb.cjs.map +1 -0
- package/dist/PlayerContainer-CxyDj9x4.js +690 -0
- package/dist/PlayerContainer-CxyDj9x4.js.map +1 -0
- package/dist/PlayerContainer-LUwekvvj.cjs +17 -0
- package/dist/PlayerContainer-LUwekvvj.cjs.map +1 -0
- package/dist/SoundCloudPlayer-CIo1SPsW.js +32 -0
- package/dist/SoundCloudPlayer-CIo1SPsW.js.map +1 -0
- package/dist/SoundCloudPlayer-D1-SE7fO.cjs +2 -0
- package/dist/SoundCloudPlayer-D1-SE7fO.cjs.map +1 -0
- package/dist/TwitchPlayer-C-Zg7RPI.cjs +2 -0
- package/dist/TwitchPlayer-C-Zg7RPI.cjs.map +1 -0
- package/dist/TwitchPlayer-CipxSXDX.js +33 -0
- package/dist/TwitchPlayer-CipxSXDX.js.map +1 -0
- package/dist/VimeoPlayer-B2ew922s.cjs +2 -0
- package/dist/VimeoPlayer-B2ew922s.cjs.map +1 -0
- package/dist/VimeoPlayer-C-0MryDy.js +32 -0
- package/dist/VimeoPlayer-C-0MryDy.js.map +1 -0
- package/dist/YouTubePlayer-DXq_8Mrm.js +35 -0
- package/dist/YouTubePlayer-DXq_8Mrm.js.map +1 -0
- package/dist/YouTubePlayer-RHJqDD5s.cjs +2 -0
- package/dist/YouTubePlayer-RHJqDD5s.cjs.map +1 -0
- package/dist/ensureScriptLoaded-Bd04DRhn.js +26 -0
- package/dist/ensureScriptLoaded-Bd04DRhn.js.map +1 -0
- package/dist/ensureScriptLoaded-TVFV277C.cjs +2 -0
- package/dist/ensureScriptLoaded-TVFV277C.cjs.map +1 -0
- package/dist/index.cjs.js +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +772 -25
- package/dist/index.es.js.map +1 -1
- package/package.json +4 -4
- package/dist/AudioPlayer-B3HUFxrt.cjs +0 -2
- package/dist/AudioPlayer-B3HUFxrt.cjs.map +0 -1
- package/dist/AudioPlayer-D3YsODf_.js +0 -34
- package/dist/AudioPlayer-D3YsODf_.js.map +0 -1
- package/dist/DailymotionPlayer-BbM7QPqY.js +0 -64
- package/dist/DailymotionPlayer-BbM7QPqY.js.map +0 -1
- package/dist/DailymotionPlayer-CUowHniC.cjs +0 -2
- package/dist/DailymotionPlayer-CUowHniC.cjs.map +0 -1
- package/dist/NiconicoPlayer-BQO6a8Vb.js +0 -35
- package/dist/NiconicoPlayer-BQO6a8Vb.js.map +0 -1
- package/dist/NiconicoPlayer-DpSXQj5m.cjs +0 -2
- package/dist/NiconicoPlayer-DpSXQj5m.cjs.map +0 -1
- package/dist/SoundCloudPlayer-B8jkHu8t.js +0 -42
- package/dist/SoundCloudPlayer-B8jkHu8t.js.map +0 -1
- package/dist/SoundCloudPlayer-BV22QlM7.cjs +0 -2
- package/dist/SoundCloudPlayer-BV22QlM7.cjs.map +0 -1
- package/dist/TwitchPlayer-C9mAN-zs.js +0 -39
- package/dist/TwitchPlayer-C9mAN-zs.js.map +0 -1
- package/dist/TwitchPlayer-CAtEBZ_D.cjs +0 -2
- package/dist/TwitchPlayer-CAtEBZ_D.cjs.map +0 -1
- package/dist/VimeoPlayer-BeD9InZ2.cjs +0 -2
- package/dist/VimeoPlayer-BeD9InZ2.cjs.map +0 -1
- package/dist/VimeoPlayer-Dj_TPJOD.js +0 -42
- package/dist/VimeoPlayer-Dj_TPJOD.js.map +0 -1
- package/dist/YouTubePlayer-DLqd36LF.cjs +0 -2
- package/dist/YouTubePlayer-DLqd36LF.cjs.map +0 -1
- package/dist/YouTubePlayer-DnM2aTnC.js +0 -38
- package/dist/YouTubePlayer-DnM2aTnC.js.map +0 -1
- package/dist/ensureScriptLoaded-Blm1fjMc.cjs +0 -2
- package/dist/ensureScriptLoaded-Blm1fjMc.cjs.map +0 -1
- package/dist/ensureScriptLoaded-Jw9e6HLc.js +0 -24
- package/dist/ensureScriptLoaded-Jw9e6HLc.js.map +0 -1
- package/dist/index-D5CazY1_.js +0 -1848
- package/dist/index-D5CazY1_.js.map +0 -1
- package/dist/index-DFsUhc9i.cjs +0 -15
- package/dist/index-DFsUhc9i.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VimeoPlayer-B2ew922s.cjs","names":[],"sources":["../src/components/VimeoPlayer.tsx"],"sourcesContent":["import {\n\tPlayerContainer,\n\ttype PlayerProps,\n} from '@/components/PlayerContainer';\nimport { LogLevel } from '@/controllers/Logger';\nimport { VimeoPlayerController } from '@/controllers/VimeoPlayerController';\nimport { ensureScriptLoaded } from '@/controllers/ensureScriptLoaded';\nimport { type ReactElement, memo, useCallback } from 'react';\n\nconst VimeoPlayer = memo(({ ...props }: PlayerProps): ReactElement => {\n\tconst { logger } = props;\n\n\tlogger.log(LogLevel.Debug, 'VimeoPlayer');\n\n\tconst loadScript = useCallback(async () => {\n\t\tawait ensureScriptLoaded(\n\t\t\t'https://player.vimeo.com/api/player.js',\n\t\t\tlogger,\n\t\t);\n\t}, [logger]);\n\n\tconst playerFactory = useCallback(\n\t\t(element: HTMLIFrameElement): Promise<Vimeo.Player> => {\n\t\t\treturn Promise.resolve(new Vimeo.Player(element));\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={VimeoPlayerController}\n\t\t>\n\t\t\t{(elementRef, videoId): ReactElement => (\n\t\t\t\t// eslint-disable-next-line jsx-a11y/iframe-has-title\n\t\t\t\t<iframe\n\t\t\t\t\tref={elementRef}\n\t\t\t\t\tsrc={`https://player.vimeo.com/video/${videoId}`}\n\t\t\t\t\tframeBorder={0}\n\t\t\t\t\tallow=\"autoplay\"\n\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PlayerContainer>\n\t);\n});\n\nexport default VimeoPlayer;\n"],"mappings":"gKASM,GAAA,EAAA,EAAA,OAAoB,CAAE,GAAG,KAAuC,CACrE,GAAM,CAAE,UAAW,EAEnB,EAAO,IAAI,EAAA,EAAS,MAAO,cAAc,CAEzC,IAAM,GAAA,EAAA,EAAA,aAAyB,SAAY,CAC1C,MAAM,EAAA,EACL,yCACA,EACA,EACC,CAAC,EAAO,CAAC,CAEN,GAAA,EAAA,EAAA,aACJ,GACO,QAAQ,QAAQ,IAAI,MAAM,OAAO,EAAQ,CAAC,CAElD,EAAE,CACF,CAED,OAAA,EAAA,EAAA,KACE,EAAA,EAAD,CACC,GAAI,EACQ,aACG,gBACf,kBAAmB,EAAA,gCAEjB,EAAY,KAAA,EAAA,EAAA,KAEZ,SAAD,CACC,IAAK,EACL,IAAK,kCAAkC,IACvC,YAAa,EACb,MAAM,WACN,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,CACvC,CAAA,CAEc,CAAA,EAElB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { i as e, o as t, t as n } from "./PlayerContainer-CxyDj9x4.js";
|
|
2
|
+
import { VimeoPlayerController as r } from "./index.es.js";
|
|
3
|
+
import { t as i } from "./ensureScriptLoaded-Bd04DRhn.js";
|
|
4
|
+
import { memo as a, useCallback as o } from "react";
|
|
5
|
+
//#region src/components/VimeoPlayer.tsx
|
|
6
|
+
var s = e(), c = a(({ ...e }) => {
|
|
7
|
+
let { logger: a } = e;
|
|
8
|
+
a.log(t.Debug, "VimeoPlayer");
|
|
9
|
+
let c = o(async () => {
|
|
10
|
+
await i("https://player.vimeo.com/api/player.js", a);
|
|
11
|
+
}, [a]), l = o((e) => Promise.resolve(new Vimeo.Player(e)), []);
|
|
12
|
+
return /* @__PURE__ */ (0, s.jsx)(n, {
|
|
13
|
+
...e,
|
|
14
|
+
loadScript: c,
|
|
15
|
+
playerFactory: l,
|
|
16
|
+
controllerFactory: r,
|
|
17
|
+
children: (e, t) => /* @__PURE__ */ (0, s.jsx)("iframe", {
|
|
18
|
+
ref: e,
|
|
19
|
+
src: `https://player.vimeo.com/video/${t}`,
|
|
20
|
+
frameBorder: 0,
|
|
21
|
+
allow: "autoplay",
|
|
22
|
+
style: {
|
|
23
|
+
width: "100%",
|
|
24
|
+
height: "100%"
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//#endregion
|
|
30
|
+
export { c as default };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=VimeoPlayer-C-0MryDy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VimeoPlayer-C-0MryDy.js","names":[],"sources":["../src/components/VimeoPlayer.tsx"],"sourcesContent":["import {\n\tPlayerContainer,\n\ttype PlayerProps,\n} from '@/components/PlayerContainer';\nimport { LogLevel } from '@/controllers/Logger';\nimport { VimeoPlayerController } from '@/controllers/VimeoPlayerController';\nimport { ensureScriptLoaded } from '@/controllers/ensureScriptLoaded';\nimport { type ReactElement, memo, useCallback } from 'react';\n\nconst VimeoPlayer = memo(({ ...props }: PlayerProps): ReactElement => {\n\tconst { logger } = props;\n\n\tlogger.log(LogLevel.Debug, 'VimeoPlayer');\n\n\tconst loadScript = useCallback(async () => {\n\t\tawait ensureScriptLoaded(\n\t\t\t'https://player.vimeo.com/api/player.js',\n\t\t\tlogger,\n\t\t);\n\t}, [logger]);\n\n\tconst playerFactory = useCallback(\n\t\t(element: HTMLIFrameElement): Promise<Vimeo.Player> => {\n\t\t\treturn Promise.resolve(new Vimeo.Player(element));\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={VimeoPlayerController}\n\t\t>\n\t\t\t{(elementRef, videoId): ReactElement => (\n\t\t\t\t// eslint-disable-next-line jsx-a11y/iframe-has-title\n\t\t\t\t<iframe\n\t\t\t\t\tref={elementRef}\n\t\t\t\t\tsrc={`https://player.vimeo.com/video/${videoId}`}\n\t\t\t\t\tframeBorder={0}\n\t\t\t\t\tallow=\"autoplay\"\n\t\t\t\t\tstyle={{ width: '100%', height: '100%' }}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</PlayerContainer>\n\t);\n});\n\nexport default VimeoPlayer;\n"],"mappings":";;;;;aASM,IAAc,GAAM,EAAE,GAAG,QAAuC;CACrE,IAAM,EAAE,cAAW;AAEnB,GAAO,IAAI,EAAS,OAAO,cAAc;CAEzC,IAAM,IAAa,EAAY,YAAY;AAC1C,QAAM,EACL,0CACA,EACA;IACC,CAAC,EAAO,CAAC,EAEN,IAAgB,GACpB,MACO,QAAQ,QAAQ,IAAI,MAAM,OAAO,EAAQ,CAAC,EAElD,EAAE,CACF;AAED,QACC,iBAAA,GAAA,EAAA,KAAC,GAAD;EACC,GAAI;EACQ;EACG;EACf,mBAAmB;aAEjB,GAAY,MAEb,iBAAA,GAAA,EAAA,KAAC,UAAD;GACC,KAAK;GACL,KAAK,kCAAkC;GACvC,aAAa;GACb,OAAM;GACN,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ;GACvC,CAAA;EAEc,CAAA;EAElB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { i as e, o as t, t as n } from "./PlayerContainer-CxyDj9x4.js";
|
|
2
|
+
import { YouTubePlayerController as r } from "./index.es.js";
|
|
3
|
+
import { t as i } from "./ensureScriptLoaded-Bd04DRhn.js";
|
|
4
|
+
import { memo as a, useCallback as o } from "react";
|
|
5
|
+
//#region src/components/YouTubePlayer.tsx
|
|
6
|
+
var s = e(), c = "https://www.youtube-nocookie.com", l = a(({ ...e }) => {
|
|
7
|
+
let { logger: a } = e;
|
|
8
|
+
a.log(t.Debug, "YouTubePlayer");
|
|
9
|
+
let l = o(() => new Promise(async (e, n) => {
|
|
10
|
+
await i("https://www.youtube.com/iframe_api", a) ? window.onYouTubeIframeAPIReady = () => {
|
|
11
|
+
a.log(t.Debug, "YouTube iframe API ready"), e();
|
|
12
|
+
} : e();
|
|
13
|
+
}), [a]), u = o((e) => Promise.resolve(new YT.Player(e, {
|
|
14
|
+
host: c,
|
|
15
|
+
width: "100%",
|
|
16
|
+
height: "100%"
|
|
17
|
+
})), []);
|
|
18
|
+
return /* @__PURE__ */ (0, s.jsx)(n, {
|
|
19
|
+
...e,
|
|
20
|
+
loadScript: l,
|
|
21
|
+
playerFactory: u,
|
|
22
|
+
controllerFactory: r,
|
|
23
|
+
children: (e) => /* @__PURE__ */ (0, s.jsx)("div", {
|
|
24
|
+
style: {
|
|
25
|
+
width: "100%",
|
|
26
|
+
height: "100%"
|
|
27
|
+
},
|
|
28
|
+
children: /* @__PURE__ */ (0, s.jsx)("div", { ref: e })
|
|
29
|
+
})
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//#endregion
|
|
33
|
+
export { l as default };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=YouTubePlayer-DXq_8Mrm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"YouTubePlayer-DXq_8Mrm.js","names":[],"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"],"mappings":";;;;;aASM,IAAS,oCAET,IAAgB,GAAM,EAAE,GAAG,QAAuC;CACvE,IAAM,EAAE,cAAW;AAEnB,GAAO,IAAI,EAAS,OAAO,gBAAgB;CAE3C,IAAM,IAAa,QACX,IAAI,QAAQ,OAAO,GAAS,MAAY;AAM9C,EALc,MAAM,EACnB,sCACA,EACA,GAIA,OAAO,gCAAsC;AAE5C,GADA,EAAO,IAAI,EAAS,OAAO,2BAA2B,EACtD,GAAS;MAGV,GAAS;GAET,EACA,CAAC,EAAO,CAAC,EAEN,IAAgB,GACpB,MACO,QAAQ,QACd,IAAI,GAAG,OAAO,GAAS;EACtB,MAAM;EACN,OAAO;EACP,QAAQ;EACR,CAAC,CACF,EAEF,EAAE,CACF;AAED,QACC,iBAAA,GAAA,EAAA,KAAC,GAAD;EACC,GAAI;EACQ;EACG;EACf,mBAAmB;aAEjB,MACD,iBAAA,GAAA,EAAA,KAAC,OAAD;GAAK,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ;aAC5C,iBAAA,GAAA,EAAA,KAAC,OAAD,EAAK,KAAK,GAAc,CAAA;GACnB,CAAA;EAEU,CAAA;EAElB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./PlayerContainer-LUwekvvj.cjs`),t=require(`./index.cjs.js`),n=require(`./ensureScriptLoaded-TVFV277C.cjs`);let r=require(`react`);var i=e.i(),a=`https://www.youtube-nocookie.com`,o=(0,r.memo)(({...o})=>{let{logger:s}=o;s.log(e.o.Debug,`YouTubePlayer`);let c=(0,r.useCallback)(()=>new Promise(async(t,r)=>{await n.t(`https://www.youtube.com/iframe_api`,s)?window.onYouTubeIframeAPIReady=()=>{s.log(e.o.Debug,`YouTube iframe API ready`),t()}:t()}),[s]),l=(0,r.useCallback)(e=>Promise.resolve(new YT.Player(e,{host:a,width:`100%`,height:`100%`})),[]);return(0,i.jsx)(e.t,{...o,loadScript:c,playerFactory:l,controllerFactory:t.YouTubePlayerController,children:e=>(0,i.jsx)(`div`,{style:{width:`100%`,height:`100%`},children:(0,i.jsx)(`div`,{ref:e})})})});exports.default=o;
|
|
2
|
+
//# sourceMappingURL=YouTubePlayer-RHJqDD5s.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"YouTubePlayer-RHJqDD5s.cjs","names":[],"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"],"mappings":"gKASM,EAAS,mCAET,GAAA,EAAA,EAAA,OAAsB,CAAE,GAAG,KAAuC,CACvE,GAAM,CAAE,UAAW,EAEnB,EAAO,IAAI,EAAA,EAAS,MAAO,gBAAgB,CAE3C,IAAM,GAAA,EAAA,EAAA,iBACE,IAAI,QAAQ,MAAO,EAAS,IAAY,CAChC,MAAM,EAAA,EACnB,qCACA,EACA,CAIA,OAAO,4BAAsC,CAC5C,EAAO,IAAI,EAAA,EAAS,MAAO,2BAA2B,CACtD,GAAS,EAGV,GAAS,EAET,CACA,CAAC,EAAO,CAAC,CAEN,GAAA,EAAA,EAAA,aACJ,GACO,QAAQ,QACd,IAAI,GAAG,OAAO,EAAS,CACtB,KAAM,EACN,MAAO,OACP,OAAQ,OACR,CAAC,CACF,CAEF,EAAE,CACF,CAED,OAAA,EAAA,EAAA,KACE,EAAA,EAAD,CACC,GAAI,EACQ,aACG,gBACf,kBAAmB,EAAA,iCAEjB,IAAA,EAAA,EAAA,KACA,MAAD,CAAK,MAAO,CAAE,MAAO,OAAQ,OAAQ,OAAQ,oBAC3C,MAAD,CAAK,IAAK,EAAc,CAAA,CACnB,CAAA,CAEU,CAAA,EAElB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { o as e } from "./PlayerContainer-CxyDj9x4.js";
|
|
2
|
+
//#region src/controllers/getScript.ts
|
|
3
|
+
function t(e) {
|
|
4
|
+
return new Promise((t, n) => {
|
|
5
|
+
let r = document.createElement("script");
|
|
6
|
+
r.src = e, r.async = !0, r.onerror = n, r.onload = r.onreadystatechange = function() {
|
|
7
|
+
let e = this.readyState;
|
|
8
|
+
e && e !== "loaded" && e !== "complete" || (r.onload = r.onreadystatechange = null, t());
|
|
9
|
+
}, document.head.appendChild(r);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/controllers/ensureScriptLoaded.ts
|
|
14
|
+
var n = [];
|
|
15
|
+
async function r(r, i) {
|
|
16
|
+
if (n.includes(r)) return i.log(e.Debug, r, "script is already loaded"), !1;
|
|
17
|
+
try {
|
|
18
|
+
return i.log(e.Debug, r, "Loading script..."), await t(r), n.includes(r) ? (i.log(e.Debug, r, "script is already loaded"), !1) : (n.push(r), i.log(e.Debug, r, "script loaded"), !0);
|
|
19
|
+
} catch (t) {
|
|
20
|
+
throw i.log(e.Error, r, "Failed to load script"), t;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { r as t };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=ensureScriptLoaded-Bd04DRhn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureScriptLoaded-Bd04DRhn.js","names":[],"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"],"mappings":";;AACA,SAAgB,EAAU,GAA4B;AACrD,QAAO,IAAI,SAAS,GAAS,MAAW;EACvC,IAAM,IAAS,SAAS,cAAc,SAAS;AAiB/C,EAhBA,EAAO,MAAM,GACb,EAAO,QAAQ,IAEf,EAAO,UAAU,GAEjB,EAAO,SAAS,EAAO,qBAAqB,WAAkB;GAC7D,IAAM,IAAY,KAAK;AAEnB,QAAa,MAAc,YAAY,MAAc,eAGzD,EAAO,SAAS,EAAO,qBAAqB,MAE5C,GAAS;KAGV,SAAS,KAAK,YAAY,EAAO;GAChC;;;;AClBH,IAAM,IAAiB,EAAE;AAEzB,eAAsB,EACrB,GACA,GACmB;AACnB,KAAI,EAAK,SAAS,EAAI,CAErB,QADA,EAAO,IAAI,EAAS,OAAO,GAAK,2BAA2B,EACpD;AAGR,KAAI;AAWF,SAVD,EAAO,IAAI,EAAS,OAAO,GAAK,oBAAoB,EAEpD,MAAM,EAAU,EAAI,EAEhB,EAAK,SAAS,EAAI,IACrB,EAAO,IAAI,EAAS,OAAO,GAAK,2BAA2B,EACpD,OAEP,EAAK,KAAK,EAAI,EACd,EAAO,IAAI,EAAS,OAAO,GAAK,gBAAgB,EACzC;UAEA,GAAO;AAEf,QADA,EAAO,IAAI,EAAS,OAAO,GAAK,wBAAwB,EAClD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`./PlayerContainer-LUwekvvj.cjs`);function t(e){return new Promise((t,n)=>{let r=document.createElement(`script`);r.src=e,r.async=!0,r.onerror=n,r.onload=r.onreadystatechange=function(){let e=this.readyState;e&&e!==`loaded`&&e!==`complete`||(r.onload=r.onreadystatechange=null,t())},document.head.appendChild(r)})}var n=[];async function r(r,i){if(n.includes(r))return i.log(e.o.Debug,r,`script is already loaded`),!1;try{return i.log(e.o.Debug,r,`Loading script...`),await t(r),n.includes(r)?(i.log(e.o.Debug,r,`script is already loaded`),!1):(n.push(r),i.log(e.o.Debug,r,`script loaded`),!0)}catch(t){throw i.log(e.o.Error,r,`Failed to load script`),t}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
|
|
2
|
+
//# sourceMappingURL=ensureScriptLoaded-TVFV277C.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureScriptLoaded-TVFV277C.cjs","names":[],"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"],"mappings":"kDACA,SAAgB,EAAU,EAA4B,CACrD,OAAO,IAAI,SAAS,EAAS,IAAW,CACvC,IAAM,EAAS,SAAS,cAAc,SAAS,CAC/C,EAAO,IAAM,EACb,EAAO,MAAQ,GAEf,EAAO,QAAU,EAEjB,EAAO,OAAS,EAAO,mBAAqB,UAAkB,CAC7D,IAAM,EAAY,KAAK,WAEnB,GAAa,IAAc,UAAY,IAAc,aAGzD,EAAO,OAAS,EAAO,mBAAqB,KAE5C,GAAS,GAGV,SAAS,KAAK,YAAY,EAAO,EAChC,CClBH,IAAM,EAAiB,EAAE,CAEzB,eAAsB,EACrB,EACA,EACmB,CACnB,GAAI,EAAK,SAAS,EAAI,CAErB,OADA,EAAO,IAAI,EAAA,EAAS,MAAO,EAAK,2BAA2B,CACpD,GAGR,GAAI,CAWF,OAVD,EAAO,IAAI,EAAA,EAAS,MAAO,EAAK,oBAAoB,CAEpD,MAAM,EAAU,EAAI,CAEhB,EAAK,SAAS,EAAI,EACrB,EAAO,IAAI,EAAA,EAAS,MAAO,EAAK,2BAA2B,CACpD,KAEP,EAAK,KAAK,EAAI,CACd,EAAO,IAAI,EAAA,EAAS,MAAO,EAAK,gBAAgB,CACzC,UAEA,EAAO,CAEf,MADA,EAAO,IAAI,EAAA,EAAS,MAAO,EAAK,wBAAwB,CAClD"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DFsUhc9i.cjs");exports.AudioPlayerController=e.AudioPlayerController;exports.DailymotionPlayerController=e.DailymotionPlayerController;exports.LogLevel=e.LogLevel;exports.NiconicoPlayerController=e.NiconicoPlayerController;exports.NostalgicDiva=e.NostalgicDiva;exports.NostalgicDivaElement=e.NostalgicDivaElement;exports.NostalgicDivaProvider=e.NostalgicDivaProvider;exports.PlayerContainer=e.PlayerContainer;exports.PlayerController=e.PlayerController;exports.PlayerControllerImpl=e.PlayerControllerImpl;exports.SoundCloudPlayerController=e.SoundCloudPlayerController;exports.TwitchPlayerController=e.TwitchPlayerController;exports.VideoService=e.VideoService;exports.VimeoPlayerController=e.VimeoPlayerController;exports.YouTubePlayerController=e.YouTubePlayerController;exports.defaultLogger=e.defaultLogger;exports.defineNostalgicDiva=e.defineNostalgicDiva;exports.findVideoService=e.findVideoService;exports.nullPlayerController=e.nullPlayerController;exports.players=e.players;exports.useNostalgicDiva=e.useNostalgicDiva;exports.videoServices=e.videoServices;
|
|
2
|
-
//# sourceMappingURL=index.cjs.js.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./PlayerContainer-LUwekvvj.cjs`);let t=require(`react`),n=require(`react-dom`);n=e.c(n);var r=e.i(),i=(0,t.createContext)(void 0),a=({children:n,logger:a=e.s})=>{let o=(0,t.useRef)(e.a),s=(0,t.useCallback)(t=>{a.log(e.o.Debug,`NostalgicDivaProvider.handleControllerChange`,o.current,t),o.current=t},[a]),c=(0,t.useCallback)(async t=>{a.log(e.o.Debug,`NostalgicDivaProvider.loadVideo`,o.current),await o.current.loadVideo(t)},[a]),l=(0,t.useCallback)(async()=>{a.log(e.o.Debug,`NostalgicDivaProvider.play`,o.current),await o.current.play()},[a]),u=(0,t.useCallback)(async()=>{a.log(e.o.Debug,`NostalgicDivaProvider.pause`,o.current),await o.current.pause()},[a]),d=(0,t.useCallback)(async t=>{a.log(e.o.Debug,`NostalgicDivaProvider.setCurrentTime`,o.current),await o.current.setCurrentTime(t),await o.current.play()},[a]),f=(0,t.useCallback)(async t=>{a.log(e.o.Debug,`NostalgicDivaProvider.setVolume`,o.current),await o.current.setVolume(t)},[a]),p=(0,t.useCallback)(async t=>{a.log(e.o.Debug,`NostalgicDivaProvider.setMuted`,o.current),await o.current.setMuted(t)},[a]),m=(0,t.useCallback)(async t=>{a.log(e.o.Debug,`NostalgicDivaProvider.setPlaybackRate`,o.current),await o.current.setPlaybackRate(t)},[a]),h=(0,t.useCallback)(async()=>(a.log(e.o.Debug,`NostalgicDivaProvider.getDuration`,o.current),await o.current.getDuration()),[a]),g=(0,t.useCallback)(async()=>(a.log(e.o.Debug,`NostalgicDivaProvider.getCurrentTime`,o.current),await o.current.getCurrentTime()),[a]),_=(0,t.useCallback)(async()=>(a.log(e.o.Debug,`NostalgicDivaProvider.getVolume`,o.current),await o.current.getVolume()),[a]),v=(0,t.useCallback)(async()=>(a.log(e.o.Debug,`NostalgicDivaProvider.getMuted`,o.current),await o.current.getMuted()),[a]),y=(0,t.useCallback)(async()=>(a.log(e.o.Debug,`NostalgicDivaProvider.getPlaybackRate`,o.current),await o.current.getPlaybackRate()),[a]),b=(0,t.useCallback)(e=>o.current.supports(e),[]),x=(0,t.useMemo)(()=>({logger:a,handleControllerChange:s,loadVideo:c,play:l,pause:u,setCurrentTime:d,setVolume:f,setMuted:p,setPlaybackRate:m,getDuration:h,getCurrentTime:g,getVolume:_,getMuted:v,getPlaybackRate:y,supports:b}),[a,s,c,l,u,d,f,p,m,h,g,_,v,y,b]);return(0,r.jsx)(i.Provider,{value:x,children:n})},o=()=>(0,t.useContext)(i),s=class{constructor(e){this.type=e}},c=/\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\?)/i,l=/\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\d+]+)?($|\?)/i,u=class extends s{constructor(){super(`Audio`)}canPlay(e){return c.test(e)||l.test(e)}extractVideoId(e){return e}},d=/^(?:(?:https?):)?(?:\/\/)?(?:www\.)?(?:(?:dailymotion\.com(?:\/embed)?\/video)|dai\.ly)\/([a-zA-Z0-9]+)(?:_[\w_-]+)?(?:[\w.#_-]+)?/,f=class extends s{constructor(){super(`Dailymotion`)}canPlay(e){return d.test(e)}extractVideoId(e){return d.exec(e)?.[1]}},p=/(?:www\.|)?nicovideo\.jp\/watch\/(\w+)$/,m=class extends s{constructor(){super(`Niconico`)}canPlay(e){return p.test(e)}extractVideoId(e){return p.exec(e)?.[1]}},h=/(?:soundcloud\.com|snd\.sc)\/[^.]+$/,g=class extends s{constructor(){super(`SoundCloud`)}canPlay(e){return h.test(e)}extractVideoId(e){return e}},_=/(?:www\.|go\.)?twitch\.tv\/videos\/(\d+)($|\?)/,v=class extends s{constructor(){super(`Twitch`)}canPlay(e){return _.test(e)}extractVideoId(e){return _.exec(e)?.[1]}},y=/vimeo\.com\/(\d+)$/,b=class extends s{constructor(){super(`Vimeo`)}canPlay(e){return y.test(e)}extractVideoId(e){return y.exec(e)?.[1]}},x=/(?:youtu\.be\/|youtube(?:-nocookie|education)?\.com\/(?:embed\/|v\/|watch\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((\w|-){11})|youtube\.com\/playlist\?list=|youtube\.com\/user\//,S=[new class extends s{constructor(){super(`YouTube`)}canPlay(e){return x.test(e)}extractVideoId(e){return x.exec(e)?.[1]}},new v,new b,new f,new g,new u,new m];function C(e){return S.find(t=>t.canPlay(e))}var w=new Map(Object.entries({Audio:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./AudioPlayer-CWI95ZSf.cjs`))),Dailymotion:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./DailymotionPlayer-CqYR3YjJ.cjs`))),Niconico:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./NiconicoPlayer-DK-XPLSb.cjs`))),SoundCloud:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./SoundCloudPlayer-D1-SE7fO.cjs`))),Twitch:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./TwitchPlayer-C-Zg7RPI.cjs`))),Vimeo:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./VimeoPlayer-B2ew922s.cjs`))),YouTube:(0,t.lazy)(()=>Promise.resolve().then(()=>require(`./YouTubePlayer-RHJqDD5s.cjs`)))}));function T(e){let t=C(e);if(t===void 0)return;let{type:n,extractVideoId:r}=t,i=r(e);if(i!==void 0)return{type:n,videoId:i}}var E=(0,t.memo)(()=>(0,r.jsx)(`div`,{style:{width:`100%`,height:`100%`},children:(0,r.jsx)(`iframe`,{src:`about:blank`,title:`about:blank`,style:{width:`100%`,height:`100%`,border:0}})})),D=(0,t.memo)(({src:n,options:i,onControllerChange:a})=>{let s=o(),c=(0,t.useCallback)(e=>{s.handleControllerChange(e),a?.(e)},[s,a]);s.logger.log(e.o.Debug,`NostalgicDiva`);let l=T(n);if(l===void 0)return s.logger.log(e.o.Warning,`Failed to extract type and videoId from src: "${n}". Returning EmptyPlayer.`),(0,r.jsx)(E,{});let{type:u,videoId:d}=l,f=w.get(u);return f===void 0?(s.logger.log(e.o.Warning,`No player found for type "${u}" (videoId: "${d}"). Returning EmptyPlayer.`),(0,r.jsx)(E,{})):(0,r.jsx)(t.Suspense,{fallback:null,children:(0,r.jsx)(f,{logger:s.logger,type:u,onControllerChange:c,videoId:d,options:i})})}),O=class extends HTMLElement{static observedAttributes=[`src`];container;controller=e.a;constructor(){super(),this.container=this.attachShadow({mode:`closed`})}get src(){return this.getAttribute(`src`)??``}set src(e){this.setAttribute(`src`,e)}#e={onError:e=>this.dispatchEvent(new CustomEvent(`error`,{detail:e})),onLoaded:e=>this.dispatchEvent(new CustomEvent(`loaded`,{detail:e})),onPlay:()=>this.dispatchEvent(new CustomEvent(`play`)),onPause:()=>this.dispatchEvent(new CustomEvent(`pause`)),onEnded:()=>this.dispatchEvent(new CustomEvent(`ended`)),onTimeUpdate:e=>this.dispatchEvent(new CustomEvent(`timeupdate`,{detail:e}))};#t=e=>{console.debug(`[@nostalgic-diva/web-components] handleControllerChange`),this.controller=e};#n(){n.default.render((0,r.jsx)(a,{children:(0,r.jsx)(D,{src:this.src,options:this.#e,onControllerChange:this.#t})}),this.container)}connectedCallback(){console.debug(`[@nostalgic-diva/web-components] connectedCallback`),this.#n()}disconnectedCallback(){console.debug(`[@nostalgic-diva/web-components] disconnectedCallback`)}attributeChangedCallback(){console.debug(`[@nostalgic-diva/web-components] attributeChangedCallback`),this.#n()}async loadVideo(e){await this.controller.loadVideo(e)}async play(){await this.controller.play()}async pause(){await this.controller.pause()}async setCurrentTime(e){await this.controller.setCurrentTime(e)}async setVolume(e){await this.controller.setVolume(e)}async setMuted(e){await this.controller.setMuted(e)}async setPlaybackRate(e){await this.controller.setPlaybackRate(e)}async getDuration(){return await this.controller.getDuration()}async getCurrentTime(){return await this.controller.getCurrentTime()}async getVolume(){return await this.controller.getVolume()}async getMuted(){return await this.controller.getMuted()}async getPlaybackRate(){return await this.controller.getPlaybackRate()}supports(e){return this.controller.supports(e)}};function k(){customElements.define(`nostalgic-diva`,O)}var A=class extends e.r{async attach(){this.player.onerror=e=>this.options?.onError?.(e),this.player.onloadeddata=()=>this.options?.onLoaded?.({id:this.player.src}),this.player.onplay=()=>this.options?.onPlay?.(),this.player.onpause=()=>this.options?.onPause?.(),this.player.onended=()=>this.options?.onEnded?.(),this.player.ontimeupdate=()=>{this.options?.onTimeUpdate?.({duration:this.player.duration,percent:this.player.currentTime/this.player.duration,seconds:this.player.currentTime})}}async detach(){this.player.onerror=null,this.player.onloadeddata=null,this.player.onplay=null,this.player.onpause=null,this.player.onended=null,this.player.ontimeupdate=null}async loadVideo(e){this.player.src=e}async play(){await this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.currentTime=e}async setVolume(e){this.player.volume=e}async setMuted(e){this.player.muted=e}async setPlaybackRate(e){this.player.playbackRate=e}async getDuration(){return this.player.duration}async getCurrentTime(){return this.player.currentTime}async getVolume(){return this.player.volume}async getMuted(){return this.player.muted}async getPlaybackRate(){return this.player.playbackRate}},j=[`apiready`,`seeked`,`video_end`,`durationchange`,`pause`,`playing`,`error`],M=class extends e.r{handlePlayerEvents=e=>{switch(e.type){case`apiready`:this.options?.onLoaded?.({id:this.player.video.videoId});break;case`seeked`:this.options?.onTimeUpdate?.({duration:this.player.duration,percent:this.player.currentTime/this.player.duration,seconds:this.player.currentTime});break;case`video_end`:this.options?.onEnded?.();break;case`durationchange`:break;case`pause`:this.options?.onPause?.();break;case`playing`:this.options?.onPlay?.();break;case`error`:this.options?.onError?.(e);break}};async attach(e){for(let e of j)this.player.addEventListener(e,this.handlePlayerEvents)}async detach(){for(let e of j)this.player.removeEventListener(e,this.handlePlayerEvents)}async loadVideo(e){this.player.load(e)}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.seek(e)}async setVolume(e){this.player.setVolume(e)}async setMuted(e){this.player.setMuted(e)}setPlaybackRate=void 0;async getDuration(){return this.player.duration}async getCurrentTime(){return this.player.currentTime}async getVolume(){return this.player.volume}async getMuted(){return this.player.muted}getPlaybackRate=void 0},N=function(e){return e[e.Play=2]=`Play`,e[e.Pause=3]=`Pause`,e[e.End=4]=`End`,e}(N||{}),P=class t extends e.r{static origin=`https://embed.nicovideo.jp`;duration=0;currentTime=0;volume=0;muted=!1;handleMessage=n=>{if(n.origin!==t.origin)return;let r=n.data;switch(r.eventName){case`playerStatusChange`:this.logger.log(e.o.Debug,`player status changed: ${N[r.data.playerStatus]??r.data.playerStatus}`);break;case`statusChange`:switch(this.logger.log(e.o.Debug,`status changed: ${N[r.data.playerStatus]??r.data.playerStatus}`),r.data.playerStatus){case N.Play:this.options?.onPlay?.();break;case N.Pause:this.options?.onPause?.();break;case N.End:this.options?.onEnded?.();break}break;case`playerMetadataChange`:r.data.duration!==void 0&&(this.duration=r.data.duration/1e3),this.currentTime=r.data.currentTime===void 0?0:r.data.currentTime/1e3,this.volume=r.data.volume,this.muted=r.data.muted,this.options?.onTimeUpdate?.({duration:this.duration,percent:this.currentTime!==0&&this.duration!==0?this.currentTime/this.duration:0,seconds:this.currentTime});break;case`loadComplete`:this.logger.log(e.o.Debug,`load completed`),this.duration=r.data.videoInfo.lengthInSeconds,this.options?.onLoaded?.({id:r.data.videoInfo.watchId});break;case`error`:this.options?.onError?.(r);break;case`player-error:video:play`:case`player-error:video:seek`:this.options?.onError?.(r);break;default:this.logger.log(e.o.Debug,`message`,r.eventName,r.data);break}};async attach(){window.addEventListener(`message`,this.handleMessage)}async detach(){window.removeEventListener(`message`,this.handleMessage)}async loadVideo(e){return new Promise((t,n)=>{this.duration=0,this.currentTime=0,this.volume=0,this.muted=!1,this.player.onload=()=>{this.player.onload=null,t()},this.player.src=`https://embed.nicovideo.jp/watch/${e}?jsapi=1&playerId=1`})}postMessage(e){this.player.contentWindow?.postMessage({...e,playerId:`1`,sourceConnectorType:1},t.origin)}async play(){this.postMessage({eventName:`play`})}async pause(){this.postMessage({eventName:`pause`})}async setCurrentTime(e){this.postMessage({eventName:`seek`,data:{time:e*1e3}})}async setVolume(e){this.postMessage({eventName:`volumeChange`,data:{volume:e}})}async setMuted(e){this.postMessage({eventName:`mute`,data:{mute:e}})}setPlaybackRate=void 0;async getDuration(){return this.duration}async getCurrentTime(){return this.currentTime}async getVolume(){return this.volume}async getMuted(){return this.muted}getPlaybackRate=void 0},F=class t extends e.r{getDurationCore(){return new Promise((e,t)=>{this.player.getDuration(e)})}attach(e){return new Promise((t,n)=>{this.player.bind(SC.Widget.Events.READY,()=>{this.player.bind(SC.Widget.Events.PLAY_PROGRESS,async e=>{let t=await this.getDurationCore();this.options?.onTimeUpdate?.({duration:t/1e3,percent:e.currentPosition/t,seconds:e.currentPosition/1e3})}),this.player.bind(SC.Widget.Events.ERROR,e=>this.options?.onError?.(e)),this.player.bind(SC.Widget.Events.PLAY,()=>this.options?.onPlay?.()),this.player.bind(SC.Widget.Events.PAUSE,()=>this.options?.onPause?.()),this.player.bind(SC.Widget.Events.FINISH,()=>this.options?.onEnded?.()),this.options?.onLoaded?.({id:e}),t()})})}async detach(){this.player.unbind(SC.Widget.Events.READY),this.player.unbind(SC.Widget.Events.PLAY_PROGRESS),this.player.unbind(SC.Widget.Events.ERROR),this.player.unbind(SC.Widget.Events.PLAY),this.player.unbind(SC.Widget.Events.PAUSE),this.player.unbind(SC.Widget.Events.FINISH)}static playerLoadAsync(e,t,n){return new Promise((r,i)=>{e.load(t,{...n,callback:r})})}async loadVideo(e){await t.playerLoadAsync(this.player,e,{auto_play:!0}),this.options?.onLoaded?.({id:e})}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.seekTo(e*1e3)}async setVolume(e){this.player.setVolume(e*100)}setMuted=void 0;setPlaybackRate=void 0;async getDuration(){return await this.getDurationCore()/1e3}getCurrentTimeCore(){return new Promise((e,t)=>{this.player.getPosition(e)})}async getCurrentTime(){return await this.getCurrentTimeCore()/1e3}getVolumeCore(){return new Promise((e,t)=>{this.player.getVolume(e)})}async getVolume(){return await this.getVolumeCore()/100}getMuted=void 0;getPlaybackRate=void 0},I=class extends e.r{handleReady=()=>{this.options?.onLoaded?.({id:this.player.getVideo()})};handlePlay=()=>{this.options?.onPlay?.()};handlePause=()=>{this.options?.onPause?.()};handleEnded=()=>{this.options?.onEnded?.()};handleSeek=()=>{this.options?.onTimeUpdate?.({duration:0,percent:0,seconds:0})};async attach(e){this.player.addEventListener(Twitch.Player.READY,this.handleReady),this.player.addEventListener(Twitch.Player.PLAYING,this.handlePlay),this.player.addEventListener(Twitch.Player.PAUSE,this.handlePause),this.player.addEventListener(Twitch.Player.ENDED,this.handleEnded),this.player.addEventListener(Twitch.Player.SEEK,this.handleSeek)}async detach(){}async loadVideo(e){this.player.setVideo(e,0)}async play(){this.player.play()}async pause(){this.player.pause()}async setCurrentTime(e){this.player.seek(e)}async setVolume(e){this.player.setVolume(e)}async setMuted(e){this.player.setMuted(e)}setPlaybackRate=void 0;async getDuration(){return this.player.getDuration()}async getCurrentTime(){return this.player.getCurrentTime()}async getVolume(){return this.player.getVolume()}async getMuted(){return this.player.getMuted()}getPlaybackRate=void 0},L=class extends e.r{async attach(){await this.player.ready(),this.player.on(`error`,e=>this.options?.onError?.(e)),this.player.on(`loaded`,e=>this.options?.onLoaded?.({id:e.id.toString()})),this.player.on(`play`,()=>this.options?.onPlay?.()),this.player.on(`pause`,()=>this.options?.onPause?.()),this.player.on(`ended`,()=>this.options?.onEnded?.()),this.player.on(`timeupdate`,e=>{this.options?.onTimeUpdate?.({duration:e.duration,percent:e.percent,seconds:e.seconds})})}async detach(){this.player.off(`error`),this.player.off(`loaded`),this.player.off(`play`),this.player.off(`pause`),this.player.off(`ended`),this.player.off(`timeupdate`)}async loadVideo(e){await this.player.loadVideo(e)}async play(){await this.player.play()}async pause(){await this.player.pause()}async setCurrentTime(e){await this.player.setCurrentTime(e)}async setVolume(e){await this.player.setVolume(e)}async setMuted(e){await this.player.setMuted(e)}async setPlaybackRate(e){await this.player.setPlaybackRate(e)}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return this.player.getCurrentTime()}async getVolume(){return this.player.getVolume()}async getMuted(){return await this.player.getMuted()}async getPlaybackRate(){return this.player.getPlaybackRate()}},R=function(e){return e[e.UNSTARTED=-1]=`UNSTARTED`,e[e.ENDED=0]=`ENDED`,e[e.PLAYING=1]=`PLAYING`,e[e.PAUSED=2]=`PAUSED`,e[e.BUFFERING=3]=`BUFFERING`,e[e.CUED=5]=`CUED`,e}(R||{}),z=class extends e.r{previousTime;timeUpdateIntervalId;clearTimeUpdateInterval(){this.logger.log(e.o.Debug,`clearTimeUpdateInterval`,this.timeUpdateIntervalId),window.clearInterval(this.timeUpdateIntervalId),this.timeUpdateIntervalId=void 0}invokeTimeUpdate(e){let t=e.getCurrentTime();if(t===this.previousTime)return;let n=e.getDuration();this.options?.onTimeUpdate?.({duration:n,percent:t/n,seconds:t}),this.previousTime=t}setTimeUpdateInterval(){this.logger.log(e.o.Debug,`setTimeUpdateInterval`),this.clearTimeUpdateInterval(),this.timeUpdateIntervalId=window.setInterval(()=>this.invokeTimeUpdate(this.player),250),this.logger.log(e.o.Debug,`timeUpdateIntervalId`,this.timeUpdateIntervalId),this.invokeTimeUpdate(this.player)}attach(t){return new Promise((n,r)=>{this.player.addEventListener(`onReady`,async()=>{this.player.addEventListener(`onError`,e=>this.options?.onError?.(e.data)),this.player.addEventListener(`onStateChange`,n=>{switch(this.logger.log(e.o.Debug,`state changed: ${R[n.data]}`),n.data){case YT.PlayerState.CUED:this.options?.onLoaded?.({id:t});break;case YT.PlayerState.PLAYING:this.options?.onPlay?.(),this.setTimeUpdateInterval();break;case YT.PlayerState.PAUSED:this.options?.onPause?.(),this.clearTimeUpdateInterval();break;case YT.PlayerState.ENDED:this.options?.onEnded?.(),this.clearTimeUpdateInterval();break}}),await this.loadVideo(t),n()})})}async detach(){this.clearTimeUpdateInterval()}async loadVideo(e){this.previousTime=void 0,this.player.cueVideoById(e)}async play(){this.player.playVideo()}async pause(){this.player.pauseVideo()}async setCurrentTime(e){this.player.seekTo(e),this.invokeTimeUpdate(this.player)}async setVolume(e){this.player.setVolume(e*100)}async setMuted(e){e?this.player.mute():this.player.unMute()}async setPlaybackRate(e){this.player.setPlaybackRate(e)}async getDuration(){return this.player.getDuration()}async getCurrentTime(){return this.player.getCurrentTime()}async getVolume(){return this.player.getVolume()/100}async getMuted(){return this.player.isMuted()}async getPlaybackRate(){return this.player.getPlaybackRate()}};exports.AudioPlayerController=A,exports.DailymotionPlayerController=M,exports.LogLevel=e.o,exports.NiconicoPlayerController=P,exports.NostalgicDiva=D,exports.NostalgicDivaElement=O,exports.NostalgicDivaProvider=a,exports.PlayerContainer=e.t,exports.PlayerController=e.n,exports.PlayerControllerImpl=e.r,exports.SoundCloudPlayerController=F,exports.TwitchPlayerController=I,exports.VideoService=s,exports.VimeoPlayerController=L,exports.YouTubePlayerController=z,exports.defaultLogger=e.s,exports.defineNostalgicDiva=k,exports.findVideoService=C,exports.nullPlayerController=e.a,exports.players=w,exports.useNostalgicDiva=o,exports.videoServices=S;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","names":["#options","#handleControllerChange","#render"],"sources":["../src/components/NostalgicDivaProvider.tsx","../src/services/VideoService.ts","../src/services/AudioVideoService.ts","../src/services/DailymotionVideoService.ts","../src/services/NiconicoVideoService.ts","../src/services/SoundCloudVideoService.ts","../src/services/TwitchVideoService.ts","../src/services/VimeoVideoService.ts","../src/services/YouTubeVideoService.ts","../src/services/findVideoService.ts","../src/components/NostalgicDiva.tsx","../src/components/defineNostalgicDiva.tsx","../src/controllers/AudioPlayerController.ts","../src/controllers/DailymotionPlayerController.ts","../src/controllers/NiconicoPlayerController.ts","../src/controllers/SoundCloudPlayerController.ts","../src/controllers/TwitchPlayerController.ts","../src/controllers/VimeoPlayerController.ts","../src/controllers/YouTubePlayerController.ts"],"sourcesContent":["import { type ILogger, LogLevel, defaultLogger } from '@/controllers/Logger';\nimport { nullPlayerController } from '@/controllers/NullPlayerController';\nimport type {\n\tIPlayerCommands,\n\tIPlayerController,\n} from '@/controllers/PlayerController';\nimport {\n\ttype ReactElement,\n\ttype ReactNode,\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseRef,\n} from 'react';\n\ninterface NostalgicDivaContextProps extends IPlayerController {\n\tlogger: ILogger;\n\thandleControllerChange: (value: IPlayerController) => void;\n}\n\nconst NostalgicDivaContext = createContext<NostalgicDivaContextProps>(\n\tundefined!,\n);\n\nexport interface NostalgicDivaProviderProps {\n\tchildren?: ReactNode;\n\tlogger?: ILogger;\n}\n\nexport const NostalgicDivaProvider = ({\n\tchildren,\n\tlogger = defaultLogger,\n}: NostalgicDivaProviderProps): ReactElement => {\n\tconst controllerRef = useRef<IPlayerController>(nullPlayerController);\n\n\tconst handleControllerChange = useCallback(\n\t\t(value: IPlayerController): void => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.handleControllerChange',\n\t\t\t\tcontrollerRef.current,\n\t\t\t\tvalue,\n\t\t\t);\n\n\t\t\tcontrollerRef.current = value;\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst loadVideo = useCallback(\n\t\tasync (id: string): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.loadVideo',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.loadVideo(id);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst play = useCallback(async (): Promise<void> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.play',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\tawait controllerRef.current.play();\n\t}, [logger]);\n\n\tconst pause = useCallback(async (): Promise<void> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.pause',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\tawait controllerRef.current.pause();\n\t}, [logger]);\n\n\tconst setCurrentTime = useCallback(\n\t\tasync (seconds: number): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setCurrentTime',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setCurrentTime(seconds);\n\t\t\tawait controllerRef.current.play();\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst setVolume = useCallback(\n\t\tasync (volume: number): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setVolume',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setVolume(volume);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst setMuted = useCallback(\n\t\tasync (muted: boolean): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setMuted',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setMuted(muted);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst setPlaybackRate = useCallback(\n\t\tasync (playbackRate: number): Promise<void> => {\n\t\t\tlogger.log(\n\t\t\t\tLogLevel.Debug,\n\t\t\t\t'NostalgicDivaProvider.setPlaybackRate',\n\t\t\t\tcontrollerRef.current,\n\t\t\t);\n\n\t\t\tawait controllerRef.current.setPlaybackRate(playbackRate);\n\t\t},\n\t\t[logger],\n\t);\n\n\tconst getDuration = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getDuration',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getDuration();\n\t}, [logger]);\n\n\tconst getCurrentTime = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getCurrentTime',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getCurrentTime();\n\t}, [logger]);\n\n\tconst getVolume = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getVolume',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getVolume();\n\t}, [logger]);\n\n\tconst getMuted = useCallback(async (): Promise<boolean> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getMuted',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getMuted();\n\t}, [logger]);\n\n\tconst getPlaybackRate = useCallback(async (): Promise<number> => {\n\t\tlogger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'NostalgicDivaProvider.getPlaybackRate',\n\t\t\tcontrollerRef.current,\n\t\t);\n\n\t\treturn await controllerRef.current.getPlaybackRate();\n\t}, [logger]);\n\n\tconst supports = useCallback(\n\t\t(command: keyof IPlayerCommands): boolean =>\n\t\t\tcontrollerRef.current.supports(command),\n\t\t[],\n\t);\n\n\tconst value = useMemo(\n\t\t(): NostalgicDivaContextProps => ({\n\t\t\tlogger,\n\t\t\thandleControllerChange,\n\t\t\tloadVideo,\n\t\t\tplay,\n\t\t\tpause,\n\t\t\tsetCurrentTime,\n\t\t\tsetVolume,\n\t\t\tsetMuted,\n\t\t\tsetPlaybackRate,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t\tgetMuted,\n\t\t\tgetPlaybackRate,\n\t\t\tsupports,\n\t\t}),\n\t\t[\n\t\t\tlogger,\n\t\t\thandleControllerChange,\n\t\t\tloadVideo,\n\t\t\tplay,\n\t\t\tpause,\n\t\t\tsetCurrentTime,\n\t\t\tsetVolume,\n\t\t\tsetMuted,\n\t\t\tsetPlaybackRate,\n\t\t\tgetDuration,\n\t\t\tgetCurrentTime,\n\t\t\tgetVolume,\n\t\t\tgetMuted,\n\t\t\tgetPlaybackRate,\n\t\t\tsupports,\n\t\t],\n\t);\n\n\treturn (\n\t\t<NostalgicDivaContext.Provider value={value}>\n\t\t\t{children}\n\t\t</NostalgicDivaContext.Provider>\n\t);\n};\n\nexport const useNostalgicDiva = (): NostalgicDivaContextProps => {\n\treturn useContext(NostalgicDivaContext);\n};\n","import type { PlayerType } from '@/controllers/PlayerController';\n\nexport abstract class VideoService {\n\tprotected constructor(readonly type: PlayerType) {}\n\n\tabstract canPlay(url: string): boolean;\n\n\tabstract extractVideoId(url: string): string | undefined;\n}\n","import { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst AUDIO_EXTENSIONS =\n\t/\\.(m4a|m4b|mp4a|mpga|mp2|mp2a|mp3|m2a|m3a|wav|weba|aac|oga|spx)($|\\?)/i;\nconst VIDEO_EXTENSIONS = /\\.(mp4|og[gv]|webm|mov|m4v)(#t=[,\\d+]+)?($|\\?)/i;\n\nexport class AudioVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('Audio');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn AUDIO_EXTENSIONS.test(url) || VIDEO_EXTENSIONS.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\treturn url;\n\t}\n}\n","import { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_DAILYMOTION =\n\t/^(?:(?:https?):)?(?:\\/\\/)?(?:www\\.)?(?:(?:dailymotion\\.com(?:\\/embed)?\\/video)|dai\\.ly)\\/([a-zA-Z0-9]+)(?:_[\\w_-]+)?(?:[\\w.#_-]+)?/;\n\nexport class DailymotionVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('Dailymotion');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_DAILYMOTION.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_DAILYMOTION.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { VideoService } from '@/services/VideoService';\n\nconst MATCH_URL_NICONICO = /(?:www\\.|)?nicovideo\\.jp\\/watch\\/(\\w+)$/;\n\nexport class NiconicoVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('Niconico');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_NICONICO.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_NICONICO.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_SOUNDCLOUD = /(?:soundcloud\\.com|snd\\.sc)\\/[^.]+$/;\n\nexport class SoundCloudVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('SoundCloud');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_SOUNDCLOUD.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\treturn url;\n\t}\n}\n","import { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_TWITCH_VIDEO = /(?:www\\.|go\\.)?twitch\\.tv\\/videos\\/(\\d+)($|\\?)/;\n\nexport class TwitchVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('Twitch');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_TWITCH_VIDEO.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_TWITCH_VIDEO.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_VIMEO = /vimeo\\.com\\/(\\d+)$/;\n\nexport class VimeoVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('Vimeo');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_VIMEO.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\treturn MATCH_URL_VIMEO.exec(url)?.[1];\n\t}\n}\n","import { VideoService } from '@/services/VideoService';\n\n// https://github.com/cookpete/react-player/blob/2811bc59b9368170acc20d4f1e39555413d0d9e1/src/patterns.js\nconst MATCH_URL_YOUTUBE =\n\t/(?:youtu\\.be\\/|youtube(?:-nocookie|education)?\\.com\\/(?:embed\\/|v\\/|watch\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((\\w|-){11})|youtube\\.com\\/playlist\\?list=|youtube\\.com\\/user\\//;\n\nexport class YouTubeVideoService extends VideoService {\n\tconstructor() {\n\t\tsuper('YouTube');\n\t}\n\n\tcanPlay(url: string): boolean {\n\t\treturn MATCH_URL_YOUTUBE.test(url);\n\t}\n\n\textractVideoId(url: string): string | undefined {\n\t\tconst matches = MATCH_URL_YOUTUBE.exec(url);\n\t\treturn matches?.[1];\n\t}\n}\n","import { AudioVideoService } from '@/services/AudioVideoService';\nimport { DailymotionVideoService } from '@/services/DailymotionVideoService';\nimport { NiconicoVideoService } from '@/services/NiconicoVideoService';\nimport { SoundCloudVideoService } from '@/services/SoundCloudVideoService';\nimport { TwitchVideoService } from '@/services/TwitchVideoService';\nimport type { VideoService } from '@/services/VideoService';\nimport { VimeoVideoService } from '@/services/VimeoVideoService';\nimport { YouTubeVideoService } from '@/services/YouTubeVideoService';\n\nexport const videoServices: VideoService[] = [\n\tnew YouTubeVideoService(),\n\tnew TwitchVideoService(),\n\tnew VimeoVideoService(),\n\tnew DailymotionVideoService(),\n\tnew SoundCloudVideoService(),\n\tnew AudioVideoService(),\n\tnew NiconicoVideoService(),\n];\n\nexport function findVideoService(url: string): VideoService | undefined {\n\treturn videoServices.find((videoService) => videoService.canPlay(url));\n}\n","import { useNostalgicDiva } from '@/components/NostalgicDivaProvider';\nimport type { PlayerProps } from '@/components/PlayerContainer';\nimport { LogLevel } from '@/controllers/Logger';\nimport type {\n\tIPlayerController,\n\tPlayerOptions,\n\tPlayerType,\n} from '@/controllers/PlayerController';\nimport { findVideoService } from '@/services/findVideoService';\nimport {\n\ttype ElementType,\n\ttype ReactElement,\n\tSuspense,\n\tlazy,\n\tmemo,\n\tuseCallback,\n} from 'react';\n\nexport const players: Map<PlayerType, ElementType<PlayerProps>> = new Map(\n\tObject.entries({\n\t\tAudio: lazy(() => import('./AudioPlayer')),\n\t\tDailymotion: lazy(() => import('./DailymotionPlayer')),\n\t\tNiconico: lazy(() => import('./NiconicoPlayer')),\n\t\tSoundCloud: lazy(() => import('./SoundCloudPlayer')),\n\t\tTwitch: lazy(() => import('./TwitchPlayer')),\n\t\tVimeo: lazy(() => import('./VimeoPlayer')),\n\t\tYouTube: lazy(() => import('./YouTubePlayer')),\n\t}),\n);\n\nexport interface NostalgicDivaProps {\n\tsrc: string;\n\toptions?: PlayerOptions;\n\tonControllerChange?: (value: IPlayerController) => void;\n}\n\nfunction getTypeAndVideoId(\n\turl: string,\n): { type: PlayerType; videoId: string } | undefined {\n\tconst videoService = findVideoService(url);\n\tif (videoService === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst { type, extractVideoId } = videoService;\n\n\tconst videoId = extractVideoId(url);\n\tif (videoId === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn { type: type, videoId: videoId };\n}\n\nconst EmptyPlayer = memo((): ReactElement => {\n\treturn (\n\t\t<div style={{ width: '100%', height: '100%' }}>\n\t\t\t<iframe\n\t\t\t\tsrc=\"about:blank\"\n\t\t\t\ttitle=\"about:blank\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%',\n\t\t\t\t\tborder: 0,\n\t\t\t\t}}\n\t\t\t/>\n\t\t</div>\n\t);\n});\n\nexport const NostalgicDiva = memo(\n\t({\n\t\tsrc,\n\t\toptions,\n\t\tonControllerChange,\n\t}: NostalgicDivaProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\tconst handleControllerChange = useCallback(\n\t\t\t(value: IPlayerController) => {\n\t\t\t\tdiva.handleControllerChange(value);\n\n\t\t\t\tonControllerChange?.(value);\n\t\t\t},\n\t\t\t[diva, onControllerChange],\n\t\t);\n\n\t\tdiva.logger.log(LogLevel.Debug, 'NostalgicDiva');\n\n\t\tconst typeAndVideoId = getTypeAndVideoId(src);\n\t\tif (typeAndVideoId === undefined) {\n\t\t\tdiva.logger.log(\n\t\t\t\tLogLevel.Warning,\n\t\t\t\t`Failed to extract type and videoId from src: \"${src}\". Returning EmptyPlayer.`,\n\t\t\t);\n\t\t\treturn <EmptyPlayer />;\n\t\t}\n\n\t\tconst { type, videoId } = typeAndVideoId;\n\n\t\tconst Player = players.get(type);\n\t\tif (Player === undefined) {\n\t\t\tdiva.logger.log(\n\t\t\t\tLogLevel.Warning,\n\t\t\t\t`No player found for type \"${type}\" (videoId: \"${videoId}\"). Returning EmptyPlayer.`,\n\t\t\t);\n\t\t\treturn <EmptyPlayer />;\n\t\t}\n\n\t\treturn (\n\t\t\t<Suspense fallback={null}>\n\t\t\t\t<Player\n\t\t\t\t\tlogger={diva.logger}\n\t\t\t\t\ttype={type}\n\t\t\t\t\tonControllerChange={handleControllerChange}\n\t\t\t\t\tvideoId={videoId}\n\t\t\t\t\toptions={options}\n\t\t\t\t/>\n\t\t\t</Suspense>\n\t\t);\n\t},\n);\n","import { NostalgicDiva } from '@/components/NostalgicDiva';\nimport { NostalgicDivaProvider } from '@/components/NostalgicDivaProvider';\nimport { nullPlayerController } from '@/controllers/NullPlayerController';\nimport type {\n\tIPlayerCommands,\n\tIPlayerController,\n\tPlayerOptions,\n} from '@/controllers/PlayerController';\nimport ReactDOM from 'react-dom';\n\nexport class NostalgicDivaElement\n\textends HTMLElement\n\timplements IPlayerController\n{\n\tstatic readonly observedAttributes = ['src'];\n\n\tcontainer: ShadowRoot;\n\tcontroller: IPlayerController = nullPlayerController;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.container = this.attachShadow({ mode: 'closed' });\n\t}\n\n\tget src(): string {\n\t\treturn this.getAttribute('src') ?? '';\n\t}\n\n\tset src(value: string) {\n\t\tthis.setAttribute('src', value);\n\t}\n\n\treadonly #options: PlayerOptions = {\n\t\tonError: (e) =>\n\t\t\tthis.dispatchEvent(new CustomEvent('error', { detail: e })),\n\t\tonLoaded: (e) =>\n\t\t\tthis.dispatchEvent(new CustomEvent('loaded', { detail: e })),\n\t\tonPlay: () => this.dispatchEvent(new CustomEvent('play')),\n\t\tonPause: () => this.dispatchEvent(new CustomEvent('pause')),\n\t\tonEnded: () => this.dispatchEvent(new CustomEvent('ended')),\n\t\tonTimeUpdate: (e) =>\n\t\t\tthis.dispatchEvent(new CustomEvent('timeupdate', { detail: e })),\n\t};\n\n\t#handleControllerChange = (value: IPlayerController): void => {\n\t\tconsole.debug(\n\t\t\t'[@nostalgic-diva/web-components] handleControllerChange',\n\t\t);\n\n\t\tthis.controller = value;\n\t};\n\n\t#render(): void {\n\t\tReactDOM.render(\n\t\t\t<NostalgicDivaProvider>\n\t\t\t\t<NostalgicDiva\n\t\t\t\t\tsrc={this.src}\n\t\t\t\t\toptions={this.#options}\n\t\t\t\t\tonControllerChange={this.#handleControllerChange}\n\t\t\t\t/>\n\t\t\t</NostalgicDivaProvider>,\n\t\t\tthis.container,\n\t\t);\n\t}\n\n\tconnectedCallback(): void {\n\t\tconsole.debug('[@nostalgic-diva/web-components] connectedCallback');\n\n\t\tthis.#render();\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tconsole.debug('[@nostalgic-diva/web-components] disconnectedCallback');\n\t}\n\n\tattributeChangedCallback(): void {\n\t\tconsole.debug(\n\t\t\t'[@nostalgic-diva/web-components] attributeChangedCallback',\n\t\t);\n\n\t\tthis.#render();\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait this.controller.loadVideo(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tawait this.controller.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tawait this.controller.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tawait this.controller.setCurrentTime(seconds);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tawait this.controller.setVolume(volume);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tawait this.controller.setMuted(muted);\n\t}\n\n\tasync setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tawait this.controller.setPlaybackRate(playbackRate);\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn await this.controller.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn await this.controller.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn await this.controller.getVolume();\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn await this.controller.getMuted();\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn await this.controller.getPlaybackRate();\n\t}\n\n\tsupports(command: keyof IPlayerCommands): boolean {\n\t\treturn this.controller.supports(command);\n\t}\n}\n\nexport function defineNostalgicDiva(): void {\n\tcustomElements.define('nostalgic-diva', NostalgicDivaElement);\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\n// https://github.com/VocaDB/vocadb/blob/61b8c54f3eca906a477101dab4fdd9b154be310e/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerFile.ts.\nexport class AudioPlayerController extends PlayerControllerImpl<HTMLAudioElement> {\n\tasync attach(): Promise<void> {\n\t\tthis.player.onerror = (event): void => this.options?.onError?.(event);\n\t\tthis.player.onloadeddata = (): void =>\n\t\t\tthis.options?.onLoaded?.({ id: this.player.src });\n\t\tthis.player.onplay = (): void => this.options?.onPlay?.();\n\t\tthis.player.onpause = (): void => this.options?.onPause?.();\n\t\tthis.player.onended = (): void => this.options?.onEnded?.();\n\t\tthis.player.ontimeupdate = (): void => {\n\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\tduration: this.player.duration,\n\t\t\t\tpercent: this.player.currentTime / this.player.duration,\n\t\t\t\tseconds: this.player.currentTime,\n\t\t\t});\n\t\t};\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.onerror = null;\n\t\tthis.player.onloadeddata = null;\n\t\tthis.player.onplay = null;\n\t\tthis.player.onpause = null;\n\t\tthis.player.onended = null;\n\t\tthis.player.ontimeupdate = null;\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.src = id;\n\t}\n\n\tasync play(): Promise<void> {\n\t\tawait this.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.currentTime = seconds;\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.volume = volume;\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.muted = muted;\n\t}\n\n\tasync setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tthis.player.playbackRate = playbackRate;\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.volume;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.muted;\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn this.player.playbackRate;\n\t}\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\nconst events = [\n\t'apiready',\n\t'seeked',\n\t'video_end',\n\t'durationchange',\n\t'pause',\n\t'playing',\n\t'error',\n] satisfies DM.EventType[];\n\nexport class DailymotionPlayerController extends PlayerControllerImpl<DM.player> {\n\tprivate handlePlayerEvents = (e: { type: DM.EventType }): void => {\n\t\tswitch (e.type) {\n\t\t\tcase 'apiready':\n\t\t\t\tthis.options?.onLoaded?.({ id: this.player.video.videoId });\n\t\t\t\tbreak;\n\t\t\tcase 'seeked':\n\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\tduration: this.player.duration,\n\t\t\t\t\tpercent: this.player.currentTime / this.player.duration,\n\t\t\t\t\tseconds: this.player.currentTime,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 'video_end':\n\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\tbreak;\n\t\t\tcase 'durationchange':\n\t\t\t\tbreak;\n\t\t\tcase 'pause':\n\t\t\t\tthis.options?.onPause?.();\n\t\t\t\tbreak;\n\t\t\tcase 'playing':\n\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\tbreak;\n\t\t\tcase 'error':\n\t\t\t\tthis.options?.onError?.(e);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tasync attach(_id: string): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\tthis.player.addEventListener(event, this.handlePlayerEvents);\n\t\t}\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tfor (const event of events) {\n\t\t\tthis.player.removeEventListener(event, this.handlePlayerEvents);\n\t\t}\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.load(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seek(seconds);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.setMuted(muted);\n\t}\n\n\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.volume;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.muted;\n\t}\n\n\tgetPlaybackRate = undefined;\n}\n","import { LogLevel } from '@/controllers/Logger';\nimport { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\ndeclare global {\n\tinterface Window {\n\t\tonNicoPlayerFactoryReady: (callback: nico.NicoPlayerFactory) => void;\n\t}\n}\n\nenum PlayerStatus {\n\tPlay = 2,\n\tPause = 3,\n\tEnd = 4,\n}\n\n// https://github.com/VocaDB/vocadb/blob/a4b5f9d8186772d7e6f58f997bbcbb51509d2539/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerNico.ts.\nexport class NiconicoPlayerController extends PlayerControllerImpl<HTMLIFrameElement> {\n\tprivate static readonly origin = 'https://embed.nicovideo.jp';\n\n\tprivate duration = 0;\n\tprivate currentTime = 0;\n\tprivate volume = 0;\n\tprivate muted = false;\n\n\tprivate handleMessage = (e: nico.PlayerEvent): void => {\n\t\tif (e.origin !== NiconicoPlayerController.origin) return;\n\n\t\tconst data = e.data;\n\n\t\tswitch (data.eventName) {\n\t\t\tcase 'playerStatusChange':\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t`player status changed: ${\n\t\t\t\t\t\tPlayerStatus[data.data.playerStatus] ??\n\t\t\t\t\t\tdata.data.playerStatus\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase 'statusChange':\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t`status changed: ${\n\t\t\t\t\t\tPlayerStatus[data.data.playerStatus] ??\n\t\t\t\t\t\tdata.data.playerStatus\n\t\t\t\t\t}`,\n\t\t\t\t);\n\n\t\t\t\tswitch (data.data.playerStatus) {\n\t\t\t\t\tcase PlayerStatus.Play:\n\t\t\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PlayerStatus.Pause:\n\t\t\t\t\t\tthis.options?.onPause?.();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PlayerStatus.End:\n\t\t\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'playerMetadataChange':\n\t\t\t\tif (data.data.duration !== undefined)\n\t\t\t\t\tthis.duration = data.data.duration / 1000;\n\n\t\t\t\tthis.currentTime =\n\t\t\t\t\tdata.data.currentTime === undefined\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: data.data.currentTime / 1000;\n\n\t\t\t\tthis.volume = data.data.volume;\n\t\t\t\tthis.muted = data.data.muted;\n\n\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\tduration: this.duration,\n\t\t\t\t\tpercent:\n\t\t\t\t\t\tthis.currentTime !== 0 && this.duration !== 0\n\t\t\t\t\t\t\t? this.currentTime / this.duration\n\t\t\t\t\t\t\t: 0,\n\t\t\t\t\tseconds: this.currentTime,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 'loadComplete':\n\t\t\t\tthis.logger.log(LogLevel.Debug, 'load completed');\n\n\t\t\t\tthis.duration = data.data.videoInfo.lengthInSeconds;\n\n\t\t\t\tthis.options?.onLoaded?.({ id: data.data.videoInfo.watchId });\n\t\t\t\tbreak;\n\n\t\t\tcase 'error':\n\t\t\t\t// TODO: Implement.\n\n\t\t\t\tthis.options?.onError?.(data);\n\t\t\t\tbreak;\n\n\t\t\tcase 'player-error:video:play':\n\t\t\tcase 'player-error:video:seek':\n\t\t\t\tthis.options?.onError?.(data);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.logger.log(\n\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t'message',\n\t\t\t\t\t(data as any).eventName,\n\t\t\t\t\t(data as any).data,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\tasync attach(): Promise<void> {\n\t\twindow.addEventListener('message', this.handleMessage);\n\t}\n\n\tasync detach(): Promise<void> {\n\t\twindow.removeEventListener('message', this.handleMessage);\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\treturn new Promise((resolve, _reject /* TODO: Reject. */) => {\n\t\t\tthis.duration = 0;\n\t\t\tthis.currentTime = 0;\n\t\t\tthis.volume = 0;\n\t\t\tthis.muted = false;\n\n\t\t\t// Wait for iframe to load.\n\t\t\tthis.player.onload = (): void => {\n\t\t\t\tthis.player.onload = null;\n\t\t\t\tresolve();\n\t\t\t};\n\n\t\t\tthis.player.src = `https://embed.nicovideo.jp/watch/${id}?jsapi=1&playerId=1`;\n\t\t});\n\t}\n\n\t// https://blog.hayu.io/web/create/nicovideo-embed-player-api/.\n\tprivate postMessage(message: any): void {\n\t\tthis.player.contentWindow?.postMessage(\n\t\t\t{\n\t\t\t\t...message,\n\t\t\t\tplayerId: '1' /* Needs to be a string, not a number. */,\n\t\t\t\tsourceConnectorType: 1,\n\t\t\t},\n\t\t\tNiconicoPlayerController.origin,\n\t\t);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.postMessage({ eventName: 'play' });\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.postMessage({ eventName: 'pause' });\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.postMessage({ eventName: 'seek', data: { time: seconds * 1000 } });\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.postMessage({\n\t\t\teventName: 'volumeChange',\n\t\t\tdata: { volume: volume },\n\t\t});\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.postMessage({\n\t\t\teventName: 'mute',\n\t\t\tdata: { mute: muted },\n\t\t});\n\t}\n\n\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.duration;\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.currentTime;\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.volume;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.muted;\n\t}\n\n\tgetPlaybackRate = undefined;\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\n// https://github.com/VocaDB/vocadb/blob/e147650a8f1f85c8fa865d0ab562126c278527ec/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerSoundCloud.ts.\nexport class SoundCloudPlayerController extends PlayerControllerImpl<SC.SoundCloudWidget> {\n\tprivate getDurationCore(): Promise<number> {\n\t\treturn new Promise((resolve, _reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getDuration(resolve);\n\t\t});\n\t}\n\n\tattach(id: string): Promise<void> {\n\t\treturn new Promise((resolve, _reject /* TODO: reject */) => {\n\t\t\tthis.player.bind(SC.Widget.Events.READY, () => {\n\t\t\t\tthis.player.bind(\n\t\t\t\t\tSC.Widget.Events.PLAY_PROGRESS,\n\t\t\t\t\tasync (event) => {\n\t\t\t\t\t\tconst duration = await this.getDurationCore();\n\n\t\t\t\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\t\t\t\tduration: duration / 1000,\n\t\t\t\t\t\t\tpercent: event.currentPosition / duration,\n\t\t\t\t\t\t\tseconds: event.currentPosition / 1000,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.ERROR, (event) =>\n\t\t\t\t\tthis.options?.onError?.(event),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.PLAY, () =>\n\t\t\t\t\tthis.options?.onPlay?.(),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.PAUSE, () =>\n\t\t\t\t\tthis.options?.onPause?.(),\n\t\t\t\t);\n\t\t\t\tthis.player.bind(SC.Widget.Events.FINISH, () =>\n\t\t\t\t\tthis.options?.onEnded?.(),\n\t\t\t\t);\n\n\t\t\t\tthis.options?.onLoaded?.({ id: id });\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.unbind(SC.Widget.Events.READY);\n\t\tthis.player.unbind(SC.Widget.Events.PLAY_PROGRESS);\n\t\tthis.player.unbind(SC.Widget.Events.ERROR);\n\t\tthis.player.unbind(SC.Widget.Events.PLAY);\n\t\tthis.player.unbind(SC.Widget.Events.PAUSE);\n\t\tthis.player.unbind(SC.Widget.Events.FINISH);\n\t}\n\n\tprivate static playerLoadAsync(\n\t\tplayer: SC.SoundCloudWidget,\n\t\turl: string,\n\t\toptions: Omit<SC.SoundCloudLoadOptions, 'callback'>,\n\t): Promise<void> {\n\t\treturn new Promise((resolve, _reject /* TODO: Reject. */) => {\n\t\t\tplayer.load(url, { ...options, callback: resolve });\n\t\t});\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait SoundCloudPlayerController.playerLoadAsync(this.player, id, {\n\t\t\tauto_play: true,\n\t\t});\n\n\t\tthis.options?.onLoaded?.({ id: id });\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seekTo(seconds * 1000);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume * 100);\n\t}\n\n\tsetMuted = undefined;\n\n\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\tconst duration = await this.getDurationCore();\n\t\treturn duration / 1000;\n\t}\n\n\tprivate getCurrentTimeCore(): Promise<number> {\n\t\treturn new Promise((resolve, _reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getPosition(resolve);\n\t\t});\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\tconst position = await this.getCurrentTimeCore();\n\t\treturn position / 1000;\n\t}\n\n\tprivate getVolumeCore(): Promise<number> {\n\t\treturn new Promise((resolve, _reject /* TODO: Reject. */) => {\n\t\t\tthis.player.getVolume(resolve);\n\t\t});\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\tconst volume = await this.getVolumeCore();\n\t\treturn volume / 100;\n\t}\n\n\tgetMuted = undefined;\n\n\tgetPlaybackRate = undefined;\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\nexport class TwitchPlayerController extends PlayerControllerImpl<Twitch.Player> {\n\tprivate handleReady = (): void => {\n\t\tthis.options?.onLoaded?.({ id: this.player.getVideo() });\n\t};\n\n\tprivate handlePlay = (): void => {\n\t\tthis.options?.onPlay?.();\n\t};\n\n\tprivate handlePause = (): void => {\n\t\tthis.options?.onPause?.();\n\t};\n\n\tprivate handleEnded = (): void => {\n\t\tthis.options?.onEnded?.();\n\t};\n\n\tprivate handleSeek = (): void => {\n\t\tthis.options?.onTimeUpdate?.({\n\t\t\tduration: 0,\n\t\t\tpercent: 0,\n\t\t\tseconds: 0,\n\t\t});\n\t};\n\n\tasync attach(_id: string): Promise<void> {\n\t\tthis.player.addEventListener(Twitch.Player.READY, this.handleReady);\n\t\tthis.player.addEventListener(Twitch.Player.PLAYING, this.handlePlay);\n\t\tthis.player.addEventListener(Twitch.Player.PAUSE, this.handlePause);\n\t\tthis.player.addEventListener(Twitch.Player.ENDED, this.handleEnded);\n\t\tthis.player.addEventListener(Twitch.Player.SEEK, this.handleSeek);\n\t}\n\n\tasync detach(): Promise<void> {}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.player.setVideo(id, 0);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seek(seconds);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tthis.player.setMuted(muted);\n\t}\n\n\tsetPlaybackRate = undefined;\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.getVolume();\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.getMuted();\n\t}\n\n\tgetPlaybackRate = undefined;\n}\n","import { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\n// https://github.com/cookpete/react-player/blob/e3c324bc6845698179d065fa408db515c2296b4b/src/players/Vimeo.js\nexport class VimeoPlayerController extends PlayerControllerImpl<Vimeo.Player> {\n\tasync attach(): Promise<void> {\n\t\tawait this.player.ready();\n\n\t\tthis.player.on('error', (data) => this.options?.onError?.(data));\n\t\tthis.player.on('loaded', (event) =>\n\t\t\tthis.options?.onLoaded?.({ id: event.id.toString() }),\n\t\t);\n\t\tthis.player.on('play', () => this.options?.onPlay?.());\n\t\tthis.player.on('pause', () => this.options?.onPause?.());\n\t\tthis.player.on('ended', () => this.options?.onEnded?.());\n\t\tthis.player.on('timeupdate', (data) => {\n\t\t\tthis.options?.onTimeUpdate?.({\n\t\t\t\tduration: data.duration,\n\t\t\t\tpercent: data.percent,\n\t\t\t\tseconds: data.seconds,\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.player.off('error');\n\t\tthis.player.off('loaded');\n\t\tthis.player.off('play');\n\t\tthis.player.off('pause');\n\t\tthis.player.off('ended');\n\t\tthis.player.off('timeupdate');\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tawait this.player.loadVideo(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tawait this.player.play();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tawait this.player.pause();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tawait this.player.setCurrentTime(seconds);\n\t}\n\n\tasync setVolume(fraction: number): Promise<void> {\n\t\tawait this.player.setVolume(fraction);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tawait this.player.setMuted(muted);\n\t}\n\n\tasync setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tawait this.player.setPlaybackRate(playbackRate);\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.getVolume();\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn await this.player.getMuted();\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn this.player.getPlaybackRate();\n\t}\n}\n","import { LogLevel } from '@/controllers/Logger';\nimport { PlayerControllerImpl } from '@/controllers/PlayerControllerImpl';\n\ndeclare global {\n\tinterface Window {\n\t\tonYouTubeIframeAPIReady(): void;\n\t}\n}\n\nenum PlayerState {\n\tUNSTARTED = -1,\n\tENDED = 0,\n\tPLAYING = 1,\n\tPAUSED = 2,\n\tBUFFERING = 3,\n\tCUED = 5,\n}\n\n// https://github.com/VocaDB/vocadb/blob/076dac9f0808aba5da7332209fdfd2ff4e12c235/VocaDbWeb/Scripts/ViewModels/PVs/PVPlayerYoutube.ts.\nexport class YouTubePlayerController extends PlayerControllerImpl<YT.Player> {\n\tprivate previousTime?: number;\n\n\tprivate timeUpdateIntervalId?: number;\n\n\tprivate clearTimeUpdateInterval(): void {\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'clearTimeUpdateInterval',\n\t\t\tthis.timeUpdateIntervalId,\n\t\t);\n\n\t\twindow.clearInterval(this.timeUpdateIntervalId);\n\n\t\tthis.timeUpdateIntervalId = undefined;\n\t}\n\n\tprivate invokeTimeUpdate(player: YT.Player): void {\n\t\tconst currentTime = player.getCurrentTime();\n\t\tif (currentTime === this.previousTime) return;\n\n\t\tconst duration = player.getDuration();\n\t\tthis.options?.onTimeUpdate?.({\n\t\t\tduration: duration,\n\t\t\tpercent: currentTime / duration,\n\t\t\tseconds: currentTime,\n\t\t});\n\n\t\tthis.previousTime = currentTime;\n\t}\n\n\tprivate setTimeUpdateInterval(): void {\n\t\tthis.logger.log(LogLevel.Debug, 'setTimeUpdateInterval');\n\n\t\tthis.clearTimeUpdateInterval();\n\n\t\tthis.timeUpdateIntervalId = window.setInterval(\n\t\t\t() => this.invokeTimeUpdate(this.player),\n\t\t\t250,\n\t\t);\n\n\t\tthis.logger.log(\n\t\t\tLogLevel.Debug,\n\t\t\t'timeUpdateIntervalId',\n\t\t\tthis.timeUpdateIntervalId,\n\t\t);\n\n\t\tthis.invokeTimeUpdate(this.player);\n\t}\n\n\tattach(id: string): Promise<void> {\n\t\treturn new Promise((resolve, _reject /* TODO: reject */) => {\n\t\t\tthis.player.addEventListener('onReady', async () => {\n\t\t\t\tthis.player.addEventListener('onError', (event) =>\n\t\t\t\t\tthis.options?.onError?.(event.data),\n\t\t\t\t);\n\t\t\t\tthis.player.addEventListener(\n\t\t\t\t\t'onStateChange',\n\t\t\t\t\t(event: YT.EventArgs): void => {\n\t\t\t\t\t\tthis.logger.log(\n\t\t\t\t\t\t\tLogLevel.Debug,\n\t\t\t\t\t\t\t`state changed: ${PlayerState[event.data]}`,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tswitch (event.data) {\n\t\t\t\t\t\t\tcase YT.PlayerState.CUED:\n\t\t\t\t\t\t\t\tthis.options?.onLoaded?.({ id: id });\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.PLAYING:\n\t\t\t\t\t\t\t\tthis.options?.onPlay?.();\n\t\t\t\t\t\t\t\tthis.setTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.PAUSED:\n\t\t\t\t\t\t\t\tthis.options?.onPause?.();\n\t\t\t\t\t\t\t\tthis.clearTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase YT.PlayerState.ENDED:\n\t\t\t\t\t\t\t\tthis.options?.onEnded?.();\n\t\t\t\t\t\t\t\tthis.clearTimeUpdateInterval();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tawait this.loadVideo(id);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync detach(): Promise<void> {\n\t\tthis.clearTimeUpdateInterval();\n\t}\n\n\tasync loadVideo(id: string): Promise<void> {\n\t\tthis.previousTime = undefined;\n\t\tthis.player.cueVideoById(id);\n\t}\n\n\tasync play(): Promise<void> {\n\t\tthis.player.playVideo();\n\t}\n\n\tasync pause(): Promise<void> {\n\t\tthis.player.pauseVideo();\n\t}\n\n\tasync setCurrentTime(seconds: number): Promise<void> {\n\t\tthis.player.seekTo(seconds);\n\n\t\tthis.invokeTimeUpdate(this.player);\n\t}\n\n\tasync setVolume(volume: number): Promise<void> {\n\t\tthis.player.setVolume(volume * 100);\n\t}\n\n\tasync setMuted(muted: boolean): Promise<void> {\n\t\tif (muted) {\n\t\t\tthis.player.mute();\n\t\t} else {\n\t\t\tthis.player.unMute();\n\t\t}\n\t}\n\n\tasync setPlaybackRate(playbackRate: number): Promise<void> {\n\t\tthis.player.setPlaybackRate(playbackRate);\n\t}\n\n\tasync getDuration(): Promise<number> {\n\t\treturn this.player.getDuration();\n\t}\n\n\tasync getCurrentTime(): Promise<number> {\n\t\treturn this.player.getCurrentTime();\n\t}\n\n\tasync getVolume(): Promise<number> {\n\t\treturn this.player.getVolume() / 100;\n\t}\n\n\tasync getMuted(): Promise<boolean> {\n\t\treturn this.player.isMuted();\n\t}\n\n\tasync getPlaybackRate(): Promise<number> {\n\t\treturn this.player.getPlaybackRate();\n\t}\n}\n"],"mappings":"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"}
|