@videojs/html 10.0.0-beta.27 → 10.0.0-beta.29
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/cdn/{adapter-XTen-YVQ.js → adapter-CEnNWvii.js} +17 -4
- package/cdn/adapter-CEnNWvii.js.map +1 -0
- package/cdn/adapter-DaKW8NzI.js +2 -0
- package/cdn/adapter-DaKW8NzI.js.map +1 -0
- package/cdn/audio-headless.dev.js +1 -1
- package/cdn/audio-headless.js +1 -1
- package/cdn/audio-minimal-ui.dev.js +2 -2
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +5 -5
- package/cdn/audio-minimal.dev.js.map +1 -1
- package/cdn/audio-minimal.js +1 -1
- package/cdn/audio-minimal.js.map +1 -1
- package/cdn/audio-ui.dev.js +2 -2
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +5 -5
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background-video-WKumpp49.js +59 -0
- package/cdn/background-video-WKumpp49.js.map +1 -0
- package/cdn/background-video-YHY_3-lX.js +2 -0
- package/cdn/background-video-YHY_3-lX.js.map +1 -0
- package/cdn/background.dev.js +3 -56
- package/cdn/background.dev.js.map +1 -1
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/bn-CcLIScl6.js +108 -0
- package/cdn/bn-CcLIScl6.js.map +1 -0
- package/cdn/bn-KcCmQhYd.js +2 -0
- package/cdn/bn-KcCmQhYd.js.map +1 -0
- package/cdn/compounds-C4YYLyL2.js +8 -0
- package/cdn/compounds-C4YYLyL2.js.map +1 -0
- package/cdn/{compounds-CCvdpvge.js → compounds-C73u1MeO.js} +68 -71
- package/cdn/compounds-C73u1MeO.js.map +1 -0
- package/cdn/container-element-Dd0ZCdhK.js +14 -0
- package/cdn/container-element-Dd0ZCdhK.js.map +1 -0
- package/cdn/container-element-HHK_KZOE.js +376 -0
- package/cdn/container-element-HHK_KZOE.js.map +1 -0
- package/cdn/create-player-BU8LDJDL.js +2 -0
- package/cdn/create-player-BU8LDJDL.js.map +1 -0
- package/cdn/{create-player-BHFyOnWi.js → create-player-Db1CIvlK.js} +76 -424
- package/cdn/create-player-Db1CIvlK.js.map +1 -0
- package/cdn/{default-BqQDVloS.js → default-A3aM0skz.js} +2 -2
- package/cdn/default-A3aM0skz.js.map +1 -0
- package/cdn/default-BDyhiTCm.js +2 -0
- package/cdn/default-BDyhiTCm.js.map +1 -0
- package/cdn/{default-I2LasfxC.js → default-C1_k1NeB.js} +2 -2
- package/cdn/default-C1_k1NeB.js.map +1 -0
- package/cdn/default-DHrMd4ie.js +2 -0
- package/cdn/default-DHrMd4ie.js.map +1 -0
- package/cdn/embed-params-D2e8u0d4.js +2 -0
- package/cdn/embed-params-D2e8u0d4.js.map +1 -0
- package/cdn/embed-params-W6T88S8x.js +39 -0
- package/cdn/embed-params-W6T88S8x.js.map +1 -0
- package/cdn/error-surface-BID4D3DW.js +59 -0
- package/cdn/error-surface-BID4D3DW.js.map +1 -0
- package/cdn/{select-tracks-nRPBa1NC.js → error-surface-D0bo71gD.js} +442 -48
- package/cdn/error-surface-D0bo71gD.js.map +1 -0
- package/cdn/{gesture-element-BNfMI8eh.js → gesture-element-CeRy1IVs.js} +2 -2
- package/cdn/gesture-element-CeRy1IVs.js.map +1 -0
- package/cdn/{gesture-element-CG-Sx_5t.js → gesture-element-DB67OYCE.js} +3 -3
- package/cdn/gesture-element-DB67OYCE.js.map +1 -0
- package/cdn/hls-js-CiE4wOrG.js +2 -0
- package/cdn/{hls-js-6lW7L4th.js.map → hls-js-CiE4wOrG.js.map} +1 -1
- package/cdn/hls-js-DBKRCbQm.js +2 -0
- package/cdn/{hls-js-DCQzjzB5.js.map → hls-js-DBKRCbQm.js.map} +1 -1
- package/cdn/{hls-js-g1zdcyvE.js → hls-js-DX2NGCAr.js} +3 -2
- package/cdn/{hls-js-g1zdcyvE.js.map → hls-js-DX2NGCAr.js.map} +1 -1
- package/cdn/{hls-js-Cwj8UBx9.js → hls-js-JeH8yvsP.js} +3 -2
- package/cdn/{hls-js-Cwj8UBx9.js.map → hls-js-JeH8yvsP.js.map} +1 -1
- package/cdn/i18n-CE4KxKuj.js +2 -0
- package/cdn/i18n-CE4KxKuj.js.map +1 -0
- package/cdn/i18n-CpBDXf6M.js +2 -0
- package/cdn/{i18n-DfKGl5Rh.js.map → i18n-CpBDXf6M.js.map} +1 -1
- package/cdn/{i18n-Mtlmj1AA.js → i18n-D0nhPa0m.js} +2 -2
- package/cdn/{i18n-Mtlmj1AA.js.map → i18n-D0nhPa0m.js.map} +1 -1
- package/cdn/i18n-DyF_NfCk.js +157 -0
- package/cdn/i18n-DyF_NfCk.js.map +1 -0
- package/cdn/i18n.dev.js +3 -152
- package/cdn/i18n.dev.js.map +1 -1
- package/cdn/i18n.js +1 -1
- package/cdn/i18n.js.map +1 -1
- package/cdn/live-button-element-Co8z2LkI.js +2 -0
- package/cdn/{live-button-element-CWfkQUoy.js.map → live-button-element-Co8z2LkI.js.map} +1 -1
- package/cdn/{live-button-element-B_y-ZJBy.js → live-button-element-zE-8uoR2.js} +5 -4
- package/cdn/live-button-element-zE-8uoR2.js.map +1 -0
- package/cdn/live-video-minimal.dev.js +12 -10
- package/cdn/live-video-minimal.dev.js.map +1 -1
- package/cdn/live-video-minimal.js +1 -1
- package/cdn/live-video-minimal.js.map +1 -1
- package/cdn/live-video.dev.js +13 -11
- package/cdn/live-video.dev.js.map +1 -1
- package/cdn/live-video.js +1 -1
- package/cdn/live-video.js.map +1 -1
- package/cdn/locales/bn.dev.js +1 -1
- package/cdn/locales/bn.js +1 -1
- package/cdn/media/background-video.dev.d.ts +1 -0
- package/cdn/media/background-video.dev.js +3 -0
- package/cdn/media/background-video.js +1 -0
- package/cdn/media/cloudflare-video.dev.d.ts +1 -0
- package/cdn/media/cloudflare-video.dev.js +668 -0
- package/cdn/media/cloudflare-video.dev.js.map +1 -0
- package/cdn/media/cloudflare-video.js +2 -0
- package/cdn/media/cloudflare-video.js.map +1 -0
- package/cdn/media/container.dev.d.ts +1 -0
- package/cdn/media/container.dev.js +8 -0
- package/cdn/media/container.dev.js.map +1 -0
- package/cdn/media/container.js +2 -0
- package/cdn/media/container.js.map +1 -0
- package/cdn/media/dash-video.dev.js +2 -1
- package/cdn/media/dash-video.js +2 -2
- package/cdn/media/dash-video.js.map +1 -1
- package/cdn/media/google-cast.dev.js +2 -31
- package/cdn/media/google-cast.dev.js.map +1 -1
- package/cdn/media/google-cast.js +3 -3
- package/cdn/media/google-cast.js.map +1 -1
- package/cdn/media/hls-audio.dev.js +2 -1
- package/cdn/media/hls-audio.js +1 -1
- package/cdn/media/hls-audio.js.map +1 -1
- package/cdn/media/hls-background-video.dev.js +2 -1
- package/cdn/media/hls-background-video.js +1 -1
- package/cdn/media/hls-background-video.js.map +1 -1
- package/cdn/media/hls-video.dev.js +2 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/hls-video.js.map +1 -1
- package/cdn/media/hlsjs-video.dev.js +2 -1
- package/cdn/media/hlsjs-video.js +1 -1
- package/cdn/media/hlsjs-video.js.map +1 -1
- package/cdn/media/mux-audio/hls-js.dev.js +3 -1
- package/cdn/media/mux-audio/hls-js.js +1 -1
- package/cdn/media/mux-audio/spf.dev.js +3 -2
- package/cdn/media/mux-audio/spf.js +1 -1
- package/cdn/media/mux-audio/spf.js.map +1 -1
- package/cdn/media/mux-audio.dev.js +3 -1
- package/cdn/media/mux-audio.js +1 -1
- package/cdn/media/mux-background-video.dev.js +2 -1
- package/cdn/media/mux-background-video.js +1 -1
- package/cdn/media/mux-background-video.js.map +1 -1
- package/cdn/media/mux-data.dev.js +2 -1
- package/cdn/media/mux-data.dev.js.map +1 -1
- package/cdn/media/mux-data.js +2 -2
- package/cdn/media/mux-data.js.map +1 -1
- package/cdn/media/mux-video/hls-js.dev.js +3 -1
- package/cdn/media/mux-video/hls-js.js +1 -1
- package/cdn/media/mux-video/spf.dev.js +3 -2
- package/cdn/media/mux-video/spf.js +1 -1
- package/cdn/media/mux-video/spf.js.map +1 -1
- package/cdn/media/mux-video.dev.js +3 -1
- package/cdn/media/mux-video.js +1 -1
- package/cdn/media/native-hls-video.dev.js +1 -0
- package/cdn/media/native-hls-video.js +1 -1
- package/cdn/media/native-hls-video.js.map +1 -1
- package/cdn/media/spotify-audio.dev.d.ts +1 -0
- package/cdn/media/spotify-audio.dev.js +605 -0
- package/cdn/media/spotify-audio.dev.js.map +1 -0
- package/cdn/media/spotify-audio.js +2 -0
- package/cdn/media/spotify-audio.js.map +1 -0
- package/cdn/media/tiktok-video.dev.d.ts +1 -0
- package/cdn/media/tiktok-video.dev.js +636 -0
- package/cdn/media/tiktok-video.dev.js.map +1 -0
- package/cdn/media/tiktok-video.js +2 -0
- package/cdn/media/tiktok-video.js.map +1 -0
- package/cdn/media/twitch-video.dev.d.ts +1 -0
- package/cdn/media/twitch-video.dev.js +627 -0
- package/cdn/media/twitch-video.dev.js.map +1 -0
- package/cdn/media/twitch-video.js +2 -0
- package/cdn/media/twitch-video.js.map +1 -0
- package/cdn/media/vimeo-video.dev.d.ts +1 -0
- package/cdn/media/vimeo-video.dev.js +3011 -0
- package/cdn/media/vimeo-video.dev.js.map +1 -0
- package/cdn/media/vimeo-video.js +16 -0
- package/cdn/media/vimeo-video.js.map +1 -0
- package/cdn/media/youtube-video.dev.d.ts +1 -0
- package/cdn/media/youtube-video.dev.js +713 -0
- package/cdn/media/youtube-video.dev.js.map +1 -0
- package/cdn/media/youtube-video.js +2 -0
- package/cdn/media/youtube-video.js.map +1 -0
- package/cdn/{media-Uxm0d3Vx.js → media-BI8caj07.js} +3 -3
- package/cdn/{media-Uxm0d3Vx.js.map → media-BI8caj07.js.map} +1 -1
- package/cdn/{media-B_gQXwri.js → media-BNuI0Im7.js} +30 -8
- package/cdn/media-BNuI0Im7.js.map +1 -0
- package/cdn/{media-Cp3acYc8.js → media-BavrGKqa.js} +274 -5
- package/cdn/media-BavrGKqa.js.map +1 -0
- package/cdn/media-CQxFuDcv.js +2 -0
- package/cdn/{media-CbWsJJhU.js.map → media-CQxFuDcv.js.map} +1 -1
- package/cdn/media-CanBm0Jh.js +41 -0
- package/cdn/media-CanBm0Jh.js.map +1 -0
- package/cdn/media-D4tG62L5.js +2 -0
- package/cdn/{media-BTipOcKo.js.map → media-D4tG62L5.js.map} +1 -1
- package/cdn/{media-DRo3n8tM.js → media-DI6DvYm3.js} +4 -4
- package/cdn/{media-DRo3n8tM.js.map → media-DI6DvYm3.js.map} +1 -1
- package/cdn/media-DU3Xf5XR.js +2 -0
- package/cdn/media-DU3Xf5XR.js.map +1 -0
- package/cdn/media-mYKOAsk3.js +825 -0
- package/cdn/media-mYKOAsk3.js.map +1 -0
- package/cdn/media-played-ranges-CM2zeOGr.js +2 -0
- package/cdn/media-played-ranges-CM2zeOGr.js.map +1 -0
- package/cdn/media-played-ranges-Yd9acuMt.js +156 -0
- package/cdn/media-played-ranges-Yd9acuMt.js.map +1 -0
- package/cdn/media-zReLnePj.js +2 -0
- package/cdn/media-zReLnePj.js.map +1 -0
- package/cdn/{minimal-DQCLKRyR.js → minimal-3OmH0xQS.js} +2 -2
- package/cdn/minimal-3OmH0xQS.js.map +1 -0
- package/cdn/{minimal-DLosvq31.js → minimal-6w_Vyyl9.js} +2 -2
- package/cdn/minimal-6w_Vyyl9.js.map +1 -0
- package/cdn/minimal-BWLTn7oQ.js +2 -0
- package/cdn/minimal-BWLTn7oQ.js.map +1 -0
- package/cdn/minimal-DIGrklyh.js +2 -0
- package/cdn/minimal-DIGrklyh.js.map +1 -0
- package/cdn/{minimal-ui-Bxcpf5Mb.js → minimal-ui-BCIESK8f.js} +9 -9
- package/cdn/{minimal-ui-Bxcpf5Mb.js.map → minimal-ui-BCIESK8f.js.map} +1 -1
- package/cdn/minimal-ui-BXrq3z4U.js +2 -0
- package/cdn/{minimal-ui-BVKu9LWj.js.map → minimal-ui-BXrq3z4U.js.map} +1 -1
- package/cdn/{minimal-ui--JsmpU2q.js → minimal-ui-DEalpMk6.js} +5 -5
- package/cdn/{minimal-ui--JsmpU2q.js.map → minimal-ui-DEalpMk6.js.map} +1 -1
- package/cdn/minimal-ui-vY3QgohH.js +2 -0
- package/cdn/{minimal-ui-AFk6Ut5f.js.map → minimal-ui-vY3QgohH.js.map} +1 -1
- package/cdn/mixin-BqN0V06a.js +2 -0
- package/cdn/{mixin-DiB7dIef.js.map → mixin-BqN0V06a.js.map} +1 -1
- package/cdn/{mixin-CkNZwQXF.js → mixin-C193v40v.js} +67 -67
- package/cdn/mixin-C193v40v.js.map +1 -0
- package/cdn/noop-BxkeRIz9.js +6 -0
- package/cdn/noop-BxkeRIz9.js.map +1 -0
- package/cdn/noop-Ch0IHcOP.js +2 -0
- package/cdn/noop-Ch0IHcOP.js.map +1 -0
- package/cdn/{player-C4ix6TQq.js → player-B3GlPF90.js} +3 -2
- package/cdn/{player-C4ix6TQq.js.map → player-B3GlPF90.js.map} +1 -1
- package/cdn/player-CtTC7qa5.js +2 -0
- package/cdn/{player-B0ccW5-n.js.map → player-CtTC7qa5.js.map} +1 -1
- package/cdn/player-DKkph8UM.js +2 -0
- package/cdn/{player-srq1RGTj.js.map → player-DKkph8UM.js.map} +1 -1
- package/cdn/{player-B0qnepD5.js → player-DPDmTRvg.js} +3 -2
- package/cdn/{player-B0qnepD5.js.map → player-DPDmTRvg.js.map} +1 -1
- package/cdn/player-DrDd7LJi.js +2 -0
- package/cdn/{player-iIewo8Y9.js.map → player-DrDd7LJi.js.map} +1 -1
- package/cdn/{player-D4fdOLLk.js → player-L5UpZmT4.js} +3 -2
- package/cdn/{player-D4fdOLLk.js.map → player-L5UpZmT4.js.map} +1 -1
- package/cdn/{poster-element-BP1Ypgbf.js → poster-element-B5tdJ2ub.js} +192 -39
- package/cdn/poster-element-B5tdJ2ub.js.map +1 -0
- package/cdn/poster-element-B8QwXSU_.js +2 -0
- package/cdn/poster-element-B8QwXSU_.js.map +1 -0
- package/cdn/{error-surface-drmCvBVW.js → relocation-pipelines-Dh8CcgHw.js} +5 -343
- package/cdn/relocation-pipelines-Dh8CcgHw.js.map +1 -0
- package/cdn/relocation-pipelines-DunE4gcV.js +2 -0
- package/cdn/relocation-pipelines-DunE4gcV.js.map +1 -0
- package/cdn/script-D3ZkiqwO.js +2 -0
- package/cdn/script-D3ZkiqwO.js.map +1 -0
- package/cdn/script-erPJaaTz.js +33 -0
- package/cdn/script-erPJaaTz.js.map +1 -0
- package/cdn/{seek-button-element-TErrbilI.js → seek-button-element-5co-k0Dx.js} +7 -6
- package/cdn/seek-button-element-5co-k0Dx.js.map +1 -0
- package/cdn/seek-button-element-B8TkILg-.js +2 -0
- package/cdn/seek-button-element-B8TkILg-.js.map +1 -0
- package/cdn/shallow-equal-C7S8rj2f.js +16 -0
- package/cdn/shallow-equal-C7S8rj2f.js.map +1 -0
- package/cdn/shallow-equal-KV1zFqZi.js +2 -0
- package/cdn/shallow-equal-KV1zFqZi.js.map +1 -0
- package/cdn/{skin-element-wPSb4AAs.js → skin-element-DrkI8xuM.js} +2 -2
- package/cdn/{skin-element-wPSb4AAs.js.map → skin-element-DrkI8xuM.js.map} +1 -1
- package/cdn/{skin-element-1_MG2zgS.js → skin-element-DvX6Bxsv.js} +2 -2
- package/cdn/{skin-element-1_MG2zgS.js.map → skin-element-DvX6Bxsv.js.map} +1 -1
- package/cdn/text-element-BoY6AhMn.js +2 -0
- package/cdn/{text-element-Bsyglab8.js.map → text-element-BoY6AhMn.js.map} +1 -1
- package/cdn/{text-element-DTB9_2HX.js → text-element-cg6l21cd.js} +3 -3
- package/cdn/{text-element-DTB9_2HX.js.map → text-element-cg6l21cd.js.map} +1 -1
- package/cdn/time-slider-chapters-element-BfLjdnU4.js +2 -0
- package/cdn/time-slider-chapters-element-BfLjdnU4.js.map +1 -0
- package/cdn/{time-slider-chapters-element-DPgaLdBt.js → time-slider-chapters-element-CznFQWFm.js} +7 -6
- package/cdn/time-slider-chapters-element-CznFQWFm.js.map +1 -0
- package/cdn/{translate-text-DP0CzUCC.js → translate-text-BWvoW5-r.js} +2 -7
- package/cdn/translate-text-BWvoW5-r.js.map +1 -0
- package/cdn/translate-text-TzSgu_oe.js +2 -0
- package/cdn/translate-text-TzSgu_oe.js.map +1 -0
- package/cdn/{ui-D0AokGxw.js → ui-BwzqkJNK.js} +8 -8
- package/cdn/{ui-D0AokGxw.js.map → ui-BwzqkJNK.js.map} +1 -1
- package/cdn/ui-DayfItun.js +2 -0
- package/cdn/{ui-CecDxhTX.js.map → ui-DayfItun.js.map} +1 -1
- package/cdn/ui-PSnD-pv8.js +2 -0
- package/cdn/{ui-ChWM6Xz2.js.map → ui-PSnD-pv8.js.map} +1 -1
- package/cdn/{ui-p36Szn71.js → ui-fnKp94a7.js} +10 -10
- package/cdn/{ui-p36Szn71.js.map → ui-fnKp94a7.js.map} +1 -1
- package/cdn/video-headless.dev.js +1 -1
- package/cdn/video-headless.js +1 -1
- package/cdn/video-minimal-ui.dev.js +2 -2
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +8 -6
- package/cdn/video-minimal.dev.js.map +1 -1
- package/cdn/video-minimal.js +1 -1
- package/cdn/video-minimal.js.map +1 -1
- package/cdn/video-ui.dev.js +2 -2
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +9 -7
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- package/dist/default/__generated__/skins/default-video/styles/buttons.css +132 -18
- package/dist/default/__generated__/skins/default-video/styles/captions.css +22 -0
- package/dist/default/__generated__/skins/default-video/styles/container.css +121 -8
- package/dist/default/__generated__/skins/default-video/styles/controls.css +436 -21
- package/dist/default/__generated__/skins/default-video/styles/dialog.css +169 -0
- package/dist/default/__generated__/skins/default-video/styles/indicator.css +459 -0
- package/dist/default/__generated__/skins/default-video/styles/menus.css +254 -0
- package/dist/default/__generated__/skins/default-video/styles/overlays.css +26 -2
- package/dist/default/__generated__/skins/default-video/styles/popups.css +338 -12
- package/dist/default/__generated__/skins/default-video/styles/poster.css +4 -4
- package/dist/default/__generated__/skins/default-video/styles/sliders.css +355 -31
- package/dist/default/__generated__/skins/default-video/styles/styles.css +2455 -216
- package/dist/default/__generated__/skins/default-video/styles/theme.css +4 -19
- package/dist/default/__generated__/skins/default-video/styles/video.css +29 -0
- package/dist/default/__generated__/skins/minimal-video/styles/base.css +25 -0
- package/dist/default/__generated__/skins/minimal-video/styles/buttons.css +266 -0
- package/dist/default/__generated__/skins/minimal-video/styles/captions.css +22 -0
- package/dist/default/__generated__/skins/minimal-video/styles/container.css +158 -0
- package/dist/default/__generated__/skins/minimal-video/styles/controls.css +182 -0
- package/dist/default/__generated__/skins/minimal-video/styles/dialog.css +77 -0
- package/dist/default/__generated__/skins/minimal-video/styles/indicator.css +322 -0
- package/dist/default/__generated__/skins/minimal-video/styles/menus.css +254 -0
- package/dist/default/__generated__/skins/minimal-video/styles/overlays.css +35 -0
- package/dist/default/__generated__/skins/minimal-video/styles/popups.css +371 -0
- package/dist/default/__generated__/skins/minimal-video/styles/poster.css +47 -0
- package/dist/default/__generated__/skins/minimal-video/styles/sliders.css +436 -0
- package/dist/default/__generated__/skins/minimal-video/styles/styles.css +2246 -0
- package/dist/default/__generated__/skins/minimal-video/styles/theme.css +7 -0
- package/dist/default/__generated__/skins/minimal-video/styles/video.css +29 -0
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.css +117 -118
- package/dist/default/define/audio/skin.css +95 -99
- package/dist/default/define/live-audio/minimal-skin.css +117 -118
- package/dist/default/define/live-audio/skin.css +95 -99
- package/dist/default/define/live-video/minimal-skin.css +158 -137
- package/dist/default/define/live-video/minimal-skin.js +1 -1
- package/dist/default/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/live-video/skin.css +120 -106
- package/dist/default/define/live-video/skin.js +1 -1
- package/dist/default/define/live-video/skin.js.map +1 -1
- package/dist/default/define/live-video/skin.tailwind.js +1 -1
- package/dist/default/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/default/define/ui/gesture.js +7 -0
- package/dist/default/define/ui/gesture.js.map +1 -0
- package/dist/default/define/video/minimal-skin.css +158 -137
- package/dist/default/define/video/minimal-skin.js +1 -1
- package/dist/default/define/video/minimal-skin.js.map +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/video/skin.css +120 -106
- package/dist/default/define/video/skin.js +1 -1
- package/dist/default/define/video/skin.js.map +1 -1
- package/dist/default/define/video/skin.tailwind.js +1 -1
- package/dist/default/define/video/skin.tailwind.js.map +1 -1
- package/dist/default/icons/dist/element/default/icons.js +1 -1
- package/dist/default/icons/dist/element/default/icons.js.map +1 -1
- package/dist/default/icons/dist/element/minimal/icons.js +1 -1
- package/dist/default/icons/dist/element/minimal/icons.js.map +1 -1
- package/dist/default/icons/dist/html/default/airplay-exit.js +1 -1
- package/dist/default/icons/dist/html/default/airplay-exit.js.map +1 -1
- package/dist/default/icons/dist/html/minimal/airplay-exit.js +1 -1
- package/dist/default/icons/dist/html/minimal/airplay-exit.js.map +1 -1
- package/dist/default/icons/dist/render/default/index.js +1 -1
- package/dist/default/icons/dist/render/default/index.js.map +1 -1
- package/dist/default/icons/dist/render/minimal/index.js +1 -1
- package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/default/media/hls-background-video/media.js +18 -0
- package/dist/default/media/hls-background-video/media.js.map +1 -1
- package/dist/default/media/tiktok-video/media.js +3 -2
- package/dist/default/media/tiktok-video/media.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js +8 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js +13 -13
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +3 -3
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +7 -6
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +4 -4
- package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
- package/dist/default/store/provider-mixin.js +22 -8
- package/dist/default/store/provider-mixin.js.map +1 -1
- package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
- package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
- package/dist/default/ui/captions-radio-group/captions-radio-group-element.js +1 -1
- package/dist/default/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
- package/dist/default/ui/gesture/gesture-element.js.map +1 -1
- package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/default/ui/menu/context.js.map +1 -1
- package/dist/default/ui/menu/menu-element.js +28 -27
- package/dist/default/ui/menu/menu-element.js.map +1 -1
- package/dist/default/ui/menu/menu-radio-group-element.js +14 -14
- package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -1
- package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -2
- package/dist/default/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
- package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
- package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
- package/dist/default/ui/poster/poster-element.js +138 -8
- package/dist/default/ui/poster/poster-element.js.map +1 -1
- package/dist/default/ui/quality-radio-group/quality-radio-group-element.js +1 -1
- package/dist/default/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
- package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
- package/dist/dev/__generated__/skins/default-video/styles/buttons.css +132 -18
- package/dist/dev/__generated__/skins/default-video/styles/captions.css +22 -0
- package/dist/dev/__generated__/skins/default-video/styles/container.css +121 -8
- package/dist/dev/__generated__/skins/default-video/styles/controls.css +436 -21
- package/dist/dev/__generated__/skins/default-video/styles/dialog.css +169 -0
- package/dist/dev/__generated__/skins/default-video/styles/indicator.css +459 -0
- package/dist/dev/__generated__/skins/default-video/styles/menus.css +254 -0
- package/dist/dev/__generated__/skins/default-video/styles/overlays.css +26 -2
- package/dist/dev/__generated__/skins/default-video/styles/popups.css +338 -12
- package/dist/dev/__generated__/skins/default-video/styles/poster.css +4 -4
- package/dist/dev/__generated__/skins/default-video/styles/sliders.css +355 -31
- package/dist/dev/__generated__/skins/default-video/styles/styles.css +2455 -216
- package/dist/dev/__generated__/skins/default-video/styles/theme.css +4 -19
- package/dist/dev/__generated__/skins/default-video/styles/video.css +29 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/base.css +25 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/buttons.css +266 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/captions.css +22 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/container.css +158 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/controls.css +182 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/dialog.css +77 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/indicator.css +322 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/menus.css +254 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/overlays.css +35 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/popups.css +371 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/poster.css +47 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/sliders.css +436 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/styles.css +2246 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/theme.css +7 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/video.css +29 -0
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +117 -118
- package/dist/dev/define/audio/skin.css +95 -99
- package/dist/dev/define/live-audio/minimal-skin.css +117 -118
- package/dist/dev/define/live-audio/skin.css +95 -99
- package/dist/dev/define/live-video/minimal-skin.css +158 -137
- package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.js +3 -1
- package/dist/dev/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js +3 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-video/skin.css +120 -106
- package/dist/dev/define/live-video/skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.js +3 -1
- package/dist/dev/define/live-video/skin.js.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.js +4 -2
- package/dist/dev/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/dev/define/ui/gesture.d.ts +8 -0
- package/dist/dev/define/ui/gesture.d.ts.map +1 -0
- package/dist/dev/define/ui/gesture.js +7 -0
- package/dist/dev/define/ui/gesture.js.map +1 -0
- package/dist/dev/define/video/minimal-skin.css +158 -137
- package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.js +3 -1
- package/dist/dev/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js +3 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/video/skin.css +120 -106
- package/dist/dev/define/video/skin.d.ts.map +1 -1
- package/dist/dev/define/video/skin.js +3 -1
- package/dist/dev/define/video/skin.js.map +1 -1
- package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/skin.tailwind.js +4 -2
- package/dist/dev/define/video/skin.tailwind.js.map +1 -1
- package/dist/dev/media/hls-background-video/media.d.ts +16 -0
- package/dist/dev/media/hls-background-video/media.d.ts.map +1 -1
- package/dist/dev/media/hls-background-video/media.js +18 -0
- package/dist/dev/media/hls-background-video/media.js.map +1 -1
- package/dist/dev/media/tiktok-video/media.d.ts.map +1 -1
- package/dist/dev/media/tiktok-video/media.js +10 -7
- package/dist/dev/media/tiktok-video/media.js.map +1 -1
- package/dist/dev/packages/icons/dist/element/default/icons.js +1 -1
- package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -1
- package/dist/dev/packages/icons/dist/element/minimal/icons.js +1 -1
- package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -1
- package/dist/dev/packages/icons/dist/html/default/airplay-exit.js +1 -1
- package/dist/dev/packages/icons/dist/html/default/airplay-exit.js.map +1 -1
- package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js +1 -1
- package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js.map +1 -1
- package/dist/dev/packages/icons/dist/render/default/index.js +1 -1
- package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -1
- package/dist/dev/packages/icons/dist/render/minimal/index.js +1 -1
- package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +3 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js +8 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +13 -13
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +3 -3
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +7 -6
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js +4 -4
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
- package/dist/dev/store/provider-mixin.d.ts.map +1 -1
- package/dist/dev/store/provider-mixin.js +24 -8
- package/dist/dev/store/provider-mixin.js.map +1 -1
- package/dist/dev/store/types.d.ts +2 -2
- package/dist/dev/store/types.d.ts.map +1 -1
- package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
- package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
- package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js +1 -1
- package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.d.ts +7 -7
- package/dist/dev/ui/gesture/gesture-element.d.ts.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.d.ts +6 -6
- package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/dev/ui/menu/context.d.ts +8 -8
- package/dist/dev/ui/menu/context.d.ts.map +1 -1
- package/dist/dev/ui/menu/context.js.map +1 -1
- package/dist/dev/ui/menu/menu-element.d.ts.map +1 -1
- package/dist/dev/ui/menu/menu-element.js +28 -27
- package/dist/dev/ui/menu/menu-element.js.map +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.js +14 -14
- package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -1
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.d.ts.map +1 -1
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -2
- package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
- package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
- package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
- package/dist/dev/ui/poster/poster-element.d.ts +20 -18
- package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
- package/dist/dev/ui/poster/poster-element.js +145 -8
- package/dist/dev/ui/poster/poster-element.js.map +1 -1
- package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js +1 -1
- package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
- package/dist/dev/ui/slider/slider-preview-element.d.ts +2 -2
- package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -1
- package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/features.md +2 -2
- package/docs/concepts/media-sources.md +79 -1
- package/docs/concepts/skins.md +122 -108
- package/docs/how-to/build-your-own-component.md +1 -1
- package/docs/how-to/customize-skins.md +499 -469
- package/docs/how-to/migrate-from-media-chrome.md +359 -0
- package/docs/how-to/migrate-from-mux-player.md +535 -0
- package/docs/how-to/migrate-from-plyr.md +394 -0
- package/docs/how-to/migrate-from-video-js-8.md +594 -0
- package/docs/llms.txt +9 -0
- package/docs/reference/feature-volume.md +3 -1
- package/docs/reference/menu.md +3 -19
- package/docs/reference/mute-button.md +34 -0
- package/docs/reference/popover.md +2 -2
- package/docs/reference/poster.md +211 -21
- package/docs/reference/slider.md +1 -1
- package/docs/reference/time-slider.md +1 -1
- package/docs/reference/tooltip.md +6 -6
- package/docs/reference/volume-slider.md +2 -2
- package/package.json +15 -9
- package/cdn/adapter-Bk03SAxn.js +0 -2
- package/cdn/adapter-Bk03SAxn.js.map +0 -1
- package/cdn/adapter-XTen-YVQ.js.map +0 -1
- package/cdn/bn-DdelKD_n.js +0 -108
- package/cdn/bn-DdelKD_n.js.map +0 -1
- package/cdn/bn-YS8ruMcO.js +0 -2
- package/cdn/bn-YS8ruMcO.js.map +0 -1
- package/cdn/compounds-CCvdpvge.js.map +0 -1
- package/cdn/compounds-CJ6SbYAh.js +0 -8
- package/cdn/compounds-CJ6SbYAh.js.map +0 -1
- package/cdn/create-player-BHFyOnWi.js.map +0 -1
- package/cdn/create-player-CbpxjDaZ.js +0 -14
- package/cdn/create-player-CbpxjDaZ.js.map +0 -1
- package/cdn/default-BqQDVloS.js.map +0 -1
- package/cdn/default-CXWVp2oG.js +0 -2
- package/cdn/default-CXWVp2oG.js.map +0 -1
- package/cdn/default-Dw6cIEqT.js +0 -2
- package/cdn/default-Dw6cIEqT.js.map +0 -1
- package/cdn/default-I2LasfxC.js.map +0 -1
- package/cdn/error-surface-DCT1m2p1.js +0 -2
- package/cdn/error-surface-DCT1m2p1.js.map +0 -1
- package/cdn/error-surface-drmCvBVW.js.map +0 -1
- package/cdn/gesture-element-BNfMI8eh.js.map +0 -1
- package/cdn/gesture-element-CG-Sx_5t.js.map +0 -1
- package/cdn/hls-js-6lW7L4th.js +0 -2
- package/cdn/hls-js-DCQzjzB5.js +0 -2
- package/cdn/i18n-DfKGl5Rh.js +0 -2
- package/cdn/live-button-element-B_y-ZJBy.js.map +0 -1
- package/cdn/live-button-element-CWfkQUoy.js +0 -2
- package/cdn/media-5ODYtX1-.js +0 -2
- package/cdn/media-5ODYtX1-.js.map +0 -1
- package/cdn/media-BTipOcKo.js +0 -2
- package/cdn/media-B_gQXwri.js.map +0 -1
- package/cdn/media-CPWNSZFX.js +0 -41
- package/cdn/media-CPWNSZFX.js.map +0 -1
- package/cdn/media-CbWsJJhU.js +0 -2
- package/cdn/media-Cp3acYc8.js.map +0 -1
- package/cdn/media-Dq4zmIJa2.js +0 -2
- package/cdn/media-Dq4zmIJa2.js.map +0 -1
- package/cdn/media-suYcjCG22.js +0 -445
- package/cdn/media-suYcjCG22.js.map +0 -1
- package/cdn/minimal-BedCvMBG.js +0 -2
- package/cdn/minimal-BedCvMBG.js.map +0 -1
- package/cdn/minimal-BoP112ye.js +0 -2
- package/cdn/minimal-BoP112ye.js.map +0 -1
- package/cdn/minimal-DLosvq31.js.map +0 -1
- package/cdn/minimal-DQCLKRyR.js.map +0 -1
- package/cdn/minimal-ui-AFk6Ut5f.js +0 -2
- package/cdn/minimal-ui-BVKu9LWj.js +0 -2
- package/cdn/mixin-CkNZwQXF.js.map +0 -1
- package/cdn/mixin-DiB7dIef.js +0 -2
- package/cdn/player-B0ccW5-n.js +0 -2
- package/cdn/player-iIewo8Y9.js +0 -2
- package/cdn/player-srq1RGTj.js +0 -2
- package/cdn/poster-element-BP1Ypgbf.js.map +0 -1
- package/cdn/poster-element-S-rr412t.js +0 -2
- package/cdn/poster-element-S-rr412t.js.map +0 -1
- package/cdn/seek-button-element-DxLmm58Y.js +0 -2
- package/cdn/seek-button-element-DxLmm58Y.js.map +0 -1
- package/cdn/seek-button-element-TErrbilI.js.map +0 -1
- package/cdn/select-tracks-nRPBa1NC.js.map +0 -1
- package/cdn/select-tracks-xV1s28xD.js +0 -59
- package/cdn/select-tracks-xV1s28xD.js.map +0 -1
- package/cdn/text-element-Bsyglab8.js +0 -2
- package/cdn/time-slider-chapters-element-DPgaLdBt.js.map +0 -1
- package/cdn/time-slider-chapters-element-MdlcovBu.js +0 -2
- package/cdn/time-slider-chapters-element-MdlcovBu.js.map +0 -1
- package/cdn/translate-text-BPMWpzFm.js +0 -2
- package/cdn/translate-text-BPMWpzFm.js.map +0 -1
- package/cdn/translate-text-DP0CzUCC.js.map +0 -1
- package/cdn/ui-CecDxhTX.js +0 -2
- package/cdn/ui-ChWM6Xz2.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube-video.dev.js","names":["#player","#target","#beginLoad","#createPlayer","#attachId","#stopPolling","#teardownTextTracks","#playerReady","#pendingLoad","#creatingPlayer","#loadComplete","#resetState","#src","#source","#readyState","#error","#autoplay","#paused","#ended","#seeking","#currentTime","#afterLoad","#duration","#volume","#muted","#playbackRate","#defaultMuted","#loop","#controls","#playsInline","#preload","#poster","#progress","#textTracksHost","#isFullscreen","#snapshotProps","#createPlayerApi","#isStale","#onPlayerReady","#onError","#bindPlayerEvents","#setupTextTracks","#loaded","#playFired","#onLoaded","#startPolling","#syncTextTracks","#pollInterval","#poll","#textTracksDisconnect"],"sources":["../../../media/dist/dev/dom/youtube/props.js","../../../media/dist/dev/dom/youtube/source.js","../../../media/dist/dev/dom/youtube/iframe-api.js","../../../media/dist/dev/dom/youtube/media.js","../../src/media/youtube-video/media.ts","../../src/define/media/youtube-video.ts"],"sourcesContent":["//#region src/dom/youtube/props.ts\nconst youtubeMediaDefaultProps = {\n\tsrc: \"\",\n\tautoplay: false,\n\tdefaultMuted: false,\n\tmuted: false,\n\tloop: false,\n\tcontrols: false,\n\tplaysInline: true,\n\tpreload: \"metadata\",\n\tposter: \"\",\n\tsource: null\n};\n//#endregion\nexport { youtubeMediaDefaultProps };\n\n//# sourceMappingURL=props.js.map","import { serializeEmbedParams } from \"../utils/embed-params.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\n//#region src/dom/youtube/source.ts\n/** Extract a YouTube video id from a raw 11-character id or any recognized URL. */\nfunction parseYouTubeVideoId(src) {\n\treturn parseYouTubeSource(src)?.id ?? null;\n}\n/**\n* Parse a YouTube source string. Recognizes raw 11-character ids, `youtu.be`\n* short links, `watch?v=`, `embed/`, `v/`, `shorts/` and `live/` URLs (with or\n* without the `-nocookie` host), playlist URLs via the `list` parameter, and\n* start times via the `t` parameter.\n*/\nfunction parseYouTubeSource(src) {\n\tif (!src) return null;\n\tif (/^[\\w-]{11}$/.test(src)) return {\n\t\tid: src,\n\t\tkind: \"video\",\n\t\tlistId: null,\n\t\tstartTime: null,\n\t\tnoCookie: false\n\t};\n\tconst noCookie = src.includes(\"-nocookie\");\n\tconst videoMatch = VIDEO_MATCH_SRC.exec(src);\n\tconst listMatch = PLAYLIST_MATCH_SRC.exec(src);\n\tconst videoId = videoMatch?.[1] ?? null;\n\tconst id = videoId === \"videoseries\" ? null : videoId;\n\tif (!id && !listMatch) return null;\n\treturn {\n\t\tid,\n\t\tkind: id ? \"video\" : \"playlist\",\n\t\tlistId: listMatch?.[1] ?? null,\n\t\tstartTime: parseStartTime(src),\n\t\tnoCookie\n\t};\n}\n/** Build the iframe `src` URL for an initial YouTube embed from the given props. */\nfunction buildYouTubeIframeSrc(src, props = {}) {\n\tconst parsed = parseYouTubeSource(src);\n\tif (!parsed) return \"\";\n\tconst embedBase = parsed.noCookie ? EMBED_BASE_NOCOOKIE : EMBED_BASE;\n\tconst params = {\n\t\tcontrols: props.controls === true ? null : 0,\n\t\tautoplay: props.autoplay,\n\t\tloop: props.loop,\n\t\tmute: props.defaultMuted,\n\t\tplaysinline: props.playsInline ?? youtubeMediaDefaultProps.playsInline,\n\t\tpreload: props.preload ?? youtubeMediaDefaultProps.preload,\n\t\tenablejsapi: 1,\n\t\trel: 0,\n\t\tiv_load_policy: 3,\n\t\tstart: parsed.startTime,\n\t\t...props.source?.engine?.youtube ?? void 0\n\t};\n\tif (parsed.kind === \"playlist\" && parsed.listId) return `${embedBase}?${serializeEmbedParams({\n\t\tlistType: \"playlist\",\n\t\tlist: parsed.listId,\n\t\t...params\n\t})}`;\n\treturn `${embedBase}/${parsed.id}?${serializeEmbedParams(params)}`;\n}\n/**\n* Parse the `t` parameter from a YouTube URL and convert it to seconds.\n* Supports formats like: `t=171`, `t=171s`, `t=2m51s`, `t=2m`, `t=1h30m15s`.\n*/\nfunction parseStartTime(url) {\n\tconst tValue = /[?&]t=([\\dhms]+)/i.exec(url)?.[1]?.toLowerCase();\n\tif (!tValue) return null;\n\tlet totalSeconds = 0;\n\tlet hasValue = false;\n\tconst hours = /(\\d+)h/.exec(tValue)?.[1];\n\tif (hours) {\n\t\ttotalSeconds += Number.parseInt(hours, 10) * 3600;\n\t\thasValue = true;\n\t}\n\tconst minutes = /(\\d+)m/.exec(tValue)?.[1];\n\tif (minutes) {\n\t\ttotalSeconds += Number.parseInt(minutes, 10) * 60;\n\t\thasValue = true;\n\t}\n\tconst seconds = /(\\d+)s?$/.exec(tValue)?.[1];\n\tif (seconds) {\n\t\ttotalSeconds += Number.parseInt(seconds, 10);\n\t\thasValue = true;\n\t}\n\treturn hasValue ? totalSeconds : null;\n}\nconst EMBED_BASE = \"https://www.youtube.com/embed\";\nconst EMBED_BASE_NOCOOKIE = \"https://www.youtube-nocookie.com/embed\";\nconst VIDEO_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((?:\\w|-){11})/;\nconst PLAYLIST_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/.*?[?&]list=)([\\w-]+)/;\n//#endregion\nexport { buildYouTubeIframeSrc, parseYouTubeSource, parseYouTubeVideoId };\n\n//# sourceMappingURL=source.js.map","import { MediaError } from \"../../core/media-error.js\";\nimport { loadScript } from \"@videojs/utils/dom\";\n//#region src/dom/youtube/iframe-api.ts\nconst API_URL = \"https://www.youtube.com/iframe_api\";\n/** Load the iframe API once, reusing it if another host already pulled it in. */\nasync function loadYouTubeApi() {\n\tconst existing = globalThis.YT;\n\tif (existing?.Player) return existing;\n\tawait loadScript(API_URL);\n\tconst api = globalThis.YT;\n\tif (!api) throw new Error(\"YouTube iframe API failed to load\");\n\tawait new Promise((resolve) => api.ready(resolve));\n\treturn api;\n}\nconst youtubeErrorCodeToMediaErrorCode = {\n\t2: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t5: MediaError.MEDIA_ERR_DECODE,\n\t100: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t101: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t150: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED\n};\n//#endregion\nexport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode };\n\n//# sourceMappingURL=iframe-api.js.map","import { EMPTY_TEXT_TRACKS, EMPTY_TIME_RANGES } from \"../../core/constants.js\";\nimport { MediaError } from \"../../core/media-error.js\";\nimport { createTimeRange } from \"../utils/time-ranges.js\";\nimport { MediaPlayedRangesMixin } from \"../media-played-ranges/media-played-ranges.js\";\nimport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode } from \"./iframe-api.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\nimport { buildYouTubeIframeSrc, parseYouTubeSource } from \"./source.js\";\nimport { isNumber, isUndefined } from \"@videojs/utils/predicate\";\nimport { deepEqual } from \"@videojs/utils/object\";\nimport { createPublicPromise, noop, tryCall } from \"@videojs/utils/function\";\n//#region src/dom/youtube/media.ts\nconst YouTubeMediaBase = MediaPlayedRangesMixin(EventTarget);\nvar YouTubeMedia = class extends YouTubeMediaBase {\n\t#target = null;\n\t#player = null;\n\t#playerReady = false;\n\t#pendingLoad = false;\n\t#creatingPlayer = false;\n\t#loadComplete = createPublicPromise();\n\t#attachId = 0;\n\t#src = youtubeMediaDefaultProps.src;\n\t#autoplay = youtubeMediaDefaultProps.autoplay;\n\t#defaultMuted = youtubeMediaDefaultProps.defaultMuted;\n\t#loop = youtubeMediaDefaultProps.loop;\n\t#controls = youtubeMediaDefaultProps.controls;\n\t#playsInline = youtubeMediaDefaultProps.playsInline;\n\t#preload = youtubeMediaDefaultProps.preload;\n\t#poster = youtubeMediaDefaultProps.poster;\n\t#source = youtubeMediaDefaultProps.source;\n\t#paused = true;\n\t#ended = false;\n\t#seeking = false;\n\t#loaded = false;\n\t#playFired = false;\n\t#currentTime = 0;\n\t#duration = NaN;\n\t#volume = 1;\n\t#muted = false;\n\t#playbackRate = 1;\n\t#progress = 0;\n\t#readyState = READY_STATE_HAVE_NOTHING;\n\t#error = null;\n\t#isFullscreen = false;\n\t#pollInterval = null;\n\t#textTracksHost = null;\n\t#textTracksDisconnect = null;\n\tstatic PLAYER_SOFTWARE_NAME = \"youtube-video\";\n\t/** Underlying YouTube iframe API player instance (null until the API loads). */\n\tget engine() {\n\t\treturn this.#player;\n\t}\n\tget target() {\n\t\treturn this.#target;\n\t}\n\t/**\n\t* Bind the iframe hosting the embed. The player follows once an embed URL can be resolved,\n\t* which may not be now: an iframe attached before `src` is set is picked up by the next `load()`.\n\t*/\n\tattach(target) {\n\t\tif (!target || this.#target === target) return;\n\t\tif (this.#target) this.detach();\n\t\tthis.#target = target;\n\t\tthis.#beginLoad();\n\t\tthis.#createPlayer();\n\t}\n\tdetach() {\n\t\tif (!this.#target) return;\n\t\tthis.#attachId++;\n\t\tthis.#stopPolling();\n\t\tthis.#teardownTextTracks();\n\t\ttryCall(() => this.#player?.destroy());\n\t\tthis.#player = null;\n\t\tthis.#playerReady = false;\n\t\tthis.#pendingLoad = false;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#target = null;\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#resetState();\n\t}\n\tdestroy() {\n\t\tthis.detach();\n\t\tsuper.destroy();\n\t}\n\tget src() {\n\t\treturn this.#src;\n\t}\n\t/** YouTube URL or id. Setting it re-derives `source`, carrying its player parameters over. */\n\tset src(value) {\n\t\tconst { engine } = this.#source ?? {};\n\t\tconst next = {\n\t\t\t...engine && { engine },\n\t\t\t...value && { src: value }\n\t\t};\n\t\tthis.source = Object.keys(next).length > 0 ? next : null;\n\t}\n\tget currentSrc() {\n\t\treturn this.#target?.getAttribute(\"src\") ?? \"\";\n\t}\n\tget readyState() {\n\t\treturn this.#readyState;\n\t}\n\t/** Reload the current source via the iframe API; deferred until the player is ready. */\n\tasync load() {\n\t\tif (!this.#player || !this.#playerReady) {\n\t\t\tthis.#pendingLoad = !!this.#target;\n\t\t\tif (this.#target && !this.#player && !this.#creatingPlayer) {\n\t\t\t\tconst load = this.#beginLoad();\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (load !== this.#loadComplete) return;\n\t\t\t\tthis.#createPlayer();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst load = this.#beginLoad();\n\t\tthis.#resetState();\n\t\tthis.dispatchEvent(new Event(\"emptied\"));\n\t\tif (!this.#src) {\n\t\t\tload.resolve();\n\t\t\tthis.#stopPolling();\n\t\t\ttryCall(() => this.#player?.stopVideo());\n\t\t\treturn;\n\t\t}\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tconst parsed = parseYouTubeSource(this.#src);\n\t\tif (!parsed) {\n\t\t\tthis.#error = new MediaError(`Unrecognized YouTube source: ${this.#src}`, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tload.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (parsed.kind === \"playlist\" && parsed.listId) {\n\t\t\tconst options = {\n\t\t\t\tlist: parsed.listId,\n\t\t\t\tlistType: \"playlist\"\n\t\t\t};\n\t\t\tif (this.#autoplay) this.#player.loadPlaylist(options);\n\t\t\telse this.#player.cuePlaylist(options);\n\t\t} else if (parsed.id) {\n\t\t\tconst options = { videoId: parsed.id };\n\t\t\tif (parsed.startTime != null) options.startSeconds = parsed.startTime;\n\t\t\tif (this.#autoplay) this.#player.loadVideoById(options);\n\t\t\telse this.#player.cueVideoById(options);\n\t\t}\n\t}\n\t#beginLoad() {\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#loadComplete = createPublicPromise();\n\t\treturn this.#loadComplete;\n\t}\n\tget paused() {\n\t\treturn this.#paused;\n\t}\n\tget ended() {\n\t\treturn this.#ended;\n\t}\n\tget seeking() {\n\t\treturn this.#seeking;\n\t}\n\tasync play() {\n\t\tawait this.#loadComplete;\n\t\tif (!this.#src) return;\n\t\tthis.#player?.playVideo();\n\t}\n\tpause() {\n\t\tthis.#player?.pauseVideo();\n\t}\n\tget currentTime() {\n\t\treturn this.#currentTime;\n\t}\n\tset currentTime(value) {\n\t\tif (this.#currentTime === value) return;\n\t\tthis.#currentTime = value;\n\t\tthis.#afterLoad((p) => p.seekTo(value, true));\n\t}\n\tget duration() {\n\t\treturn this.#duration;\n\t}\n\tget volume() {\n\t\treturn this.#volume;\n\t}\n\tset volume(value) {\n\t\tif (this.#volume === value) return;\n\t\tthis.#volume = value;\n\t\tthis.#afterLoad((p) => p.setVolume(value * 100));\n\t}\n\tget muted() {\n\t\treturn this.#muted;\n\t}\n\tset muted(value) {\n\t\tif (this.#muted === value) return;\n\t\tthis.#muted = value;\n\t\tthis.#afterLoad((p) => value ? p.mute() : p.unMute());\n\t}\n\tget playbackRate() {\n\t\treturn this.#playbackRate;\n\t}\n\tset playbackRate(value) {\n\t\tif (this.#playbackRate === value) return;\n\t\tthis.#playbackRate = value;\n\t\tthis.#afterLoad((p) => p.setPlaybackRate(value));\n\t}\n\tget autoplay() {\n\t\treturn this.#autoplay;\n\t}\n\tset autoplay(value) {\n\t\tthis.#autoplay = value;\n\t}\n\tget defaultMuted() {\n\t\treturn this.#defaultMuted;\n\t}\n\tset defaultMuted(value) {\n\t\tthis.#defaultMuted = value;\n\t}\n\tget loop() {\n\t\treturn this.#loop;\n\t}\n\tset loop(value) {\n\t\tthis.#loop = value;\n\t}\n\tget controls() {\n\t\treturn this.#controls;\n\t}\n\tset controls(value) {\n\t\tthis.#controls = value;\n\t}\n\tget playsInline() {\n\t\treturn this.#playsInline;\n\t}\n\tset playsInline(value) {\n\t\tthis.#playsInline = value;\n\t}\n\tget preload() {\n\t\treturn this.#preload;\n\t}\n\tset preload(value) {\n\t\tthis.#preload = value;\n\t}\n\tget poster() {\n\t\treturn this.#poster;\n\t}\n\tset poster(value) {\n\t\tthis.#poster = value;\n\t}\n\t/** YouTube URL or id in `src`, plus player parameters under `engine.youtube`. Replacing it re-derives `src`. */\n\tget source() {\n\t\treturn this.#source;\n\t}\n\tset source(value) {\n\t\tconst source = value ?? null;\n\t\tif (source === this.#source) return;\n\t\tconst src = source?.src ?? \"\";\n\t\tconst srcChanged = this.#src !== src;\n\t\tconst engineChanged = !deepEqual(this.#source?.engine?.youtube ?? null, source?.engine?.youtube ?? null);\n\t\tthis.#source = source;\n\t\tthis.#src = src;\n\t\tif (srcChanged || engineChanged) this.load();\n\t\tthis.dispatchEvent(new Event(\"sourcechange\"));\n\t}\n\tget buffered() {\n\t\treturn this.#progress > 0 ? createTimeRange(0, this.#progress) : EMPTY_TIME_RANGES;\n\t}\n\tget seekable() {\n\t\treturn this.#duration > 0 && Number.isFinite(this.#duration) ? createTimeRange(0, this.#duration) : EMPTY_TIME_RANGES;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tget textTracks() {\n\t\tthis.#textTracksHost ??= globalThis.document?.createElement(\"video\") ?? null;\n\t\treturn this.#textTracksHost?.textTracks ?? EMPTY_TEXT_TRACKS;\n\t}\n\tget isFullscreen() {\n\t\treturn this.#isFullscreen;\n\t}\n\tasync requestFullscreen() {\n\t\tif (!this.#target?.requestFullscreen) return;\n\t\tawait this.#target.requestFullscreen();\n\t\tthis.#isFullscreen = true;\n\t}\n\tasync exitFullscreen() {\n\t\tconst doc = globalThis.document;\n\t\tif (doc?.fullscreenElement && doc.fullscreenElement === this.#target) await doc.exitFullscreen();\n\t\tthis.#isFullscreen = false;\n\t}\n\t#createPlayer() {\n\t\tconst target = this.#target;\n\t\tif (!target || this.#player || this.#creatingPlayer) return false;\n\t\tif (!target.getAttribute(\"src\")) {\n\t\t\tconst initialSrc = buildYouTubeIframeSrc(this.#src, this.#snapshotProps());\n\t\t\tif (!initialSrc) {\n\t\t\t\tthis.#loadComplete.resolve();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttarget.src = initialSrc;\n\t\t}\n\t\tthis.#creatingPlayer = true;\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tthis.#createPlayerApi(target);\n\t\treturn true;\n\t}\n\tasync #createPlayerApi(target) {\n\t\tconst attachId = this.#attachId;\n\t\tlet api;\n\t\ttry {\n\t\t\tapi = await loadYouTubeApi();\n\t\t} catch {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#creatingPlayer = false;\n\t\t\tthis.#error = new MediaError(\"Failed to load the YouTube iframe API\", MediaError.MEDIA_ERR_NETWORK);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tthis.#loadComplete.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#isStale(attachId) || this.#target !== target) return;\n\t\tconst player = new api.Player(target, { events: {\n\t\t\tonReady: () => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onPlayerReady();\n\t\t\t},\n\t\t\tonError: (event) => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onError(event.data);\n\t\t\t}\n\t\t} });\n\t\tthis.#player = player;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#bindPlayerEvents(player, attachId);\n\t\tthis.#setupTextTracks(player);\n\t}\n\t#isStale(attachId) {\n\t\treturn attachId !== this.#attachId;\n\t}\n\t#afterLoad(fn) {\n\t\tthis.#loadComplete.then(() => {\n\t\t\tconst player = this.#player;\n\t\t\tif (player) tryCall(() => fn(player));\n\t\t}, noop);\n\t}\n\t#snapshotProps() {\n\t\treturn {\n\t\t\tautoplay: this.#autoplay,\n\t\t\tdefaultMuted: this.#defaultMuted,\n\t\t\tloop: this.#loop,\n\t\t\tcontrols: this.#controls,\n\t\t\tplaysInline: this.#playsInline,\n\t\t\tpreload: this.#preload || youtubeMediaDefaultProps.preload,\n\t\t\tsource: this.#source\n\t\t};\n\t}\n\t#resetState() {\n\t\tthis.#currentTime = 0;\n\t\tthis.#duration = NaN;\n\t\tthis.#muted = false;\n\t\tthis.#paused = !this.#autoplay;\n\t\tthis.#ended = false;\n\t\tthis.#playbackRate = 1;\n\t\tthis.#progress = 0;\n\t\tthis.#readyState = READY_STATE_HAVE_NOTHING;\n\t\tthis.#seeking = false;\n\t\tthis.#loaded = false;\n\t\tthis.#playFired = false;\n\t\tthis.#volume = 1;\n\t\tthis.#error = null;\n\t\tthis.#isFullscreen = false;\n\t}\n\t#onPlayerReady() {\n\t\tthis.#playerReady = true;\n\t\tif (this.#pendingLoad) {\n\t\t\tthis.#pendingLoad = false;\n\t\t\tthis.load();\n\t\t\treturn;\n\t\t}\n\t\tthis.#onLoaded();\n\t}\n\t#onLoaded() {\n\t\tif (this.#loaded) return;\n\t\tthis.#loaded = true;\n\t\tthis.#readyState = READY_STATE_HAVE_METADATA;\n\t\tconst player = this.#player;\n\t\tif (player) {\n\t\t\tthis.#duration = player.getDuration() || NaN;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t}\n\t\tfor (const type of [\n\t\t\t\"loadedmetadata\",\n\t\t\t\"durationchange\",\n\t\t\t\"volumechange\",\n\t\t\t\"loadcomplete\"\n\t\t]) this.dispatchEvent(new Event(type));\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#startPolling();\n\t}\n\t#onError(code) {\n\t\tconst error = new MediaError(`YouTube iframe player error #${code}; visit https://developers.google.com/youtube/iframe_api_reference#onError for the full error message.`, youtubeErrorCodeToMediaErrorCode[code] ?? MediaError.MEDIA_ERR_CUSTOM, true);\n\t\terror.data = { youtubeErrorCode: code };\n\t\tthis.#error = error;\n\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\tthis.#loadComplete.resolve();\n\t}\n\t#bindPlayerEvents(player, attachId) {\n\t\tconst emit = (type) => this.dispatchEvent(new Event(type));\n\t\tplayer.addEventListener(\"onStateChange\", ({ data: state }) => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tif (this.#src && !this.#loaded && state !== -1) this.#onLoaded();\n\t\t\tif (state === 1 || state === 3) {\n\t\t\t\tif (!this.#playFired) {\n\t\t\t\t\tthis.#playFired = true;\n\t\t\t\t\tthis.#paused = false;\n\t\t\t\t\tthis.#ended = false;\n\t\t\t\t\temit(\"play\");\n\t\t\t\t}\n\t\t\t\tthis.#syncTextTracks(player);\n\t\t\t}\n\t\t\tif (state === 3) emit(\"waiting\");\n\t\t\telse if (state === 1) {\n\t\t\t\tif (this.#seeking) {\n\t\t\t\t\tthis.#seeking = false;\n\t\t\t\t\temit(\"seeked\");\n\t\t\t\t}\n\t\t\t\tthis.#readyState = READY_STATE_HAVE_FUTURE_DATA;\n\t\t\t\tthis.#paused = false;\n\t\t\t\temit(\"playing\");\n\t\t\t} else if (state === 2) {\n\t\t\t\tconst diff = Math.abs(player.getCurrentTime() - this.#currentTime);\n\t\t\t\tif (!this.#seeking && diff > .1) {\n\t\t\t\t\tthis.#seeking = true;\n\t\t\t\t\temit(\"seeking\");\n\t\t\t\t}\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t} else if (state === 0) {\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t\tthis.#ended = true;\n\t\t\t\temit(\"ended\");\n\t\t\t\tif (this.#loop) this.play();\n\t\t\t}\n\t\t});\n\t\tplayer.addEventListener(\"onPlaybackRateChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t\temit(\"ratechange\");\n\t\t});\n\t\tplayer.addEventListener(\"onVolumeChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\temit(\"volumechange\");\n\t\t});\n\t}\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollInterval = setInterval(() => this.#poll(), 50);\n\t}\n\t#stopPolling() {\n\t\tif (this.#pollInterval !== null) {\n\t\t\tclearInterval(this.#pollInterval);\n\t\t\tthis.#pollInterval = null;\n\t\t}\n\t}\n\t#poll() {\n\t\tconst player = this.#player;\n\t\tif (!player) return;\n\t\tconst time = player.getCurrentTime();\n\t\tconst duration = player.getDuration();\n\t\tconst bufferedEnd = player.getVideoLoadedFraction() * duration;\n\t\tif (this.#seeking && bufferedEnd > .1) {\n\t\t\tthis.#seeking = false;\n\t\t\tthis.dispatchEvent(new Event(\"seeked\"));\n\t\t} else if (!this.#seeking && Math.abs(time - this.#currentTime) > .1) {\n\t\t\tthis.#seeking = true;\n\t\t\tthis.dispatchEvent(new Event(\"seeking\"));\n\t\t}\n\t\tif (time !== this.#currentTime) {\n\t\t\tthis.#currentTime = time;\n\t\t\tthis.dispatchEvent(new Event(\"timeupdate\"));\n\t\t}\n\t\tif (isNumber(duration) && duration > 0 && duration !== this.#duration) {\n\t\t\tthis.#duration = duration;\n\t\t\tthis.dispatchEvent(new Event(\"durationchange\"));\n\t\t}\n\t\tif (bufferedEnd !== this.#progress) {\n\t\t\tthis.#progress = bufferedEnd;\n\t\t\tif (duration > 0 && bufferedEnd >= duration) this.#readyState = READY_STATE_HAVE_ENOUGH_DATA;\n\t\t\tthis.dispatchEvent(new Event(\"progress\"));\n\t\t}\n\t}\n\t#setupTextTracks(player) {\n\t\tconst doc = globalThis.document;\n\t\tif (isUndefined(doc)) return;\n\t\tthis.#teardownTextTracks();\n\t\tconst host = doc.createElement(\"video\");\n\t\tthis.#textTracksHost = host;\n\t\tthis.#textTracksDisconnect = new AbortController();\n\t\thost.textTracks?.addEventListener?.(\"change\", () => {\n\t\t\tconst showing = Array.from(host.textTracks).find((t) => t.mode === \"showing\");\n\t\t\ttryCall(() => player.setOption(\"captions\", \"track\", showing ? { languageCode: showing.language } : {}));\n\t\t}, { signal: this.#textTracksDisconnect.signal });\n\t}\n\t#syncTextTracks(player) {\n\t\tconst host = this.#textTracksHost;\n\t\tif (!host) return;\n\t\tconst trackList = player.getOption(\"captions\", \"tracklist\") ?? [];\n\t\tfor (const track of trackList) {\n\t\t\tif (!track.languageCode) continue;\n\t\t\tif (Array.from(host.textTracks).some((t) => t.language === track.languageCode)) continue;\n\t\t\ttryCall(() => host.addTextTrack?.(\"subtitles\", track.displayName ?? \"\", track.languageCode));\n\t\t}\n\t}\n\t#teardownTextTracks() {\n\t\tthis.#textTracksDisconnect?.abort();\n\t\tthis.#textTracksDisconnect = null;\n\t\tthis.#textTracksHost = null;\n\t}\n};\nconst READY_STATE_HAVE_NOTHING = 0;\nconst READY_STATE_HAVE_METADATA = 1;\nconst READY_STATE_HAVE_FUTURE_DATA = 3;\nconst READY_STATE_HAVE_ENOUGH_DATA = 4;\n//#endregion\nexport { YouTubeMedia };\n\n//# sourceMappingURL=media.js.map","import { CustomMediaElement } from '@videojs/media/dom/custom-media-element';\nimport { buildYouTubeIframeSrc, YouTubeMedia } from '@videojs/media/dom/youtube';\nimport { escapeHtml } from '@videojs/utils/string';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nclass YouTubeCustomMediaElement extends CustomMediaElement('iframe', YouTubeMedia) {\n static override getTemplateHTML = (attrs: Record<string, string>): string => {\n const initialSrc = buildYouTubeIframeSrc(attrs.src ?? '', templateAttrsToEmbedProps(attrs));\n const srcAttr = initialSrc ? ` src=\"${escapeHtml(initialSrc)}\"` : '';\n return /*html*/ `\n <style>\n :host {\n display: inline-block;\n min-width: 300px;\n min-height: 150px;\n position: relative;\n }\n iframe {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n :host(:not([controls])) {\n pointer-events: none;\n }\n </style>\n <iframe\n part=\"iframe\"\n ${srcAttr}\n allow=\"accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n frameborder=\"0\"\n width=\"100%\"\n height=\"100%\"\n referrerpolicy=\"${escapeHtml(attrs.referrerpolicy ?? '')}\"\n ></iframe>\n `;\n };\n}\n\nfunction templateAttrsToEmbedProps(attrs: Record<string, string>) {\n return {\n autoplay: attrs.autoplay !== undefined,\n defaultMuted: attrs.muted !== undefined,\n loop: attrs.loop !== undefined,\n controls: attrs.controls !== undefined,\n playsInline: attrs.playsinline !== undefined,\n preload: (attrs.preload as 'none' | 'metadata' | 'auto' | undefined) ?? 'metadata',\n };\n}\n\nexport class YouTubeVideo extends MediaAttachMixin(YouTubeCustomMediaElement) {}\n","import { YouTubeVideo } from '../../media/youtube-video';\nimport { safeDefine } from '../safe-define';\n\nexport class YouTubeVideoElement extends YouTubeVideo {\n static readonly tagName = 'youtube-video';\n}\n\nsafeDefine(YouTubeVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [YouTubeVideoElement.tagName]: YouTubeVideoElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{o as e,u as t}from"../predicate-LbFu-fPH.js";import{t as n}from"../deep-equal-CcwdHo6t.js";import{t as r}from"../custom-media-element-8pSkwn42.js";import{a as i}from"../attributes-CwICYz98.js";import{i as a}from"../context-C2rsoDxk.js";import{t as o}from"../noop-Ch0IHcOP.js";import{t as s}from"../script-D3ZkiqwO.js";import{n as c,r as l,t as u}from"../media-played-ranges-CM2zeOGr.js";import{n as d,t as f}from"../embed-params-D2e8u0d4.js";import{n as p,r as m}from"../constants-B4LD5zrj.js";import{t as h}from"../media-error-CtsbOTR1.js";import{t as g}from"../media-attach-mixin-Igi3-1UG.js";const _={src:``,autoplay:!1,defaultMuted:!1,muted:!1,loop:!1,controls:!1,playsInline:!0,preload:`metadata`,poster:``,source:null};function v(e){if(!e)return null;if(/^[\w-]{11}$/.test(e))return{id:e,kind:`video`,listId:null,startTime:null,noCookie:!1};let t=e.includes(`-nocookie`),n=C.exec(e),r=w.exec(e),i=n?.[1]??null,a=i===`videoseries`?null:i;return!a&&!r?null:{id:a,kind:a?`video`:`playlist`,listId:r?.[1]??null,startTime:b(e),noCookie:t}}function y(e,t={}){let n=v(e);if(!n)return``;let r=n.noCookie?S:x,i={controls:t.controls===!0?null:0,autoplay:t.autoplay,loop:t.loop,mute:t.defaultMuted,playsinline:t.playsInline??_.playsInline,preload:t.preload??_.preload,enablejsapi:1,rel:0,iv_load_policy:3,start:n.startTime,...t.source?.engine?.youtube??void 0};return n.kind===`playlist`&&n.listId?`${r}?${f({listType:`playlist`,list:n.listId,...i})}`:`${r}/${n.id}?${f(i)}`}function b(e){let t=/[?&]t=([\dhms]+)/i.exec(e)?.[1]?.toLowerCase();if(!t)return null;let n=0,r=!1,i=/(\d+)h/.exec(t)?.[1];i&&(n+=Number.parseInt(i,10)*3600,r=!0);let a=/(\d+)m/.exec(t)?.[1];a&&(n+=Number.parseInt(a,10)*60,r=!0);let o=/(\d+)s?$/.exec(t)?.[1];return o&&(n+=Number.parseInt(o,10),r=!0),r?n:null}const x=`https://www.youtube.com/embed`,S=`https://www.youtube-nocookie.com/embed`,C=/(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=|shorts\/|live\/))((?:\w|-){11})/,w=/(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/.*?[?&]list=)([\w-]+)/;async function T(){let e=globalThis.YT;if(e?.Player)return e;await s(`https://www.youtube.com/iframe_api`);let t=globalThis.YT;if(!t)throw Error(`YouTube iframe API failed to load`);return await new Promise(e=>t.ready(e)),t}const E={2:h.MEDIA_ERR_SRC_NOT_SUPPORTED,5:h.MEDIA_ERR_DECODE,100:h.MEDIA_ERR_SRC_NOT_SUPPORTED,101:h.MEDIA_ERR_SRC_NOT_SUPPORTED,150:h.MEDIA_ERR_SRC_NOT_SUPPORTED},D=u(EventTarget);var O=class extends D{#e=null;#t=null;#n=!1;#r=!1;#i=!1;#a=l();#o=0;#s=_.src;#c=_.autoplay;#l=_.defaultMuted;#u=_.loop;#d=_.controls;#f=_.playsInline;#p=_.preload;#m=_.poster;#h=_.source;#g=!0;#_=!1;#v=!1;#y=!1;#b=!1;#x=0;#S=NaN;#C=1;#w=!1;#T=1;#E=0;#D=k;#O=null;#k=!1;#A=null;#j=null;#M=null;static PLAYER_SOFTWARE_NAME=`youtube-video`;get engine(){return this.#t}get target(){return this.#e}attach(e){!e||this.#e===e||(this.#e&&this.detach(),this.#e=e,this.#N(),this.#P())}detach(){this.#e&&(this.#o++,this.#G(),this.#Y(),d(()=>this.#t?.destroy()),this.#t=null,this.#n=!1,this.#r=!1,this.#i=!1,this.#e=null,this.#a.resolve(),this.#z())}destroy(){this.detach(),super.destroy()}get src(){return this.#s}set src(e){let{engine:t}=this.#h??{},n={...t&&{engine:t},...e&&{src:e}};this.source=Object.keys(n).length>0?n:null}get currentSrc(){return this.#e?.getAttribute(`src`)??``}get readyState(){return this.#D}async load(){if(!this.#t||!this.#n){if(this.#r=!!this.#e,this.#e&&!this.#t&&!this.#i){let e=this.#N();if(await Promise.resolve(),e!==this.#a)return;this.#P()}return}let e=this.#N();if(this.#z(),this.dispatchEvent(new Event(`emptied`)),!this.#s){e.resolve(),this.#G(),d(()=>this.#t?.stopVideo());return}this.dispatchEvent(new Event(`loadstart`));let t=v(this.#s);if(!t){this.#O=new h(`Unrecognized YouTube source: ${this.#s}`,h.MEDIA_ERR_SRC_NOT_SUPPORTED),this.dispatchEvent(new Event(`error`)),e.resolve();return}if(t.kind===`playlist`&&t.listId){let e={list:t.listId,listType:`playlist`};this.#c?this.#t.loadPlaylist(e):this.#t.cuePlaylist(e)}else if(t.id){let e={videoId:t.id};t.startTime!=null&&(e.startSeconds=t.startTime),this.#c?this.#t.loadVideoById(e):this.#t.cueVideoById(e)}}#N(){return this.#a.resolve(),this.#a=l(),this.#a}get paused(){return this.#g}get ended(){return this.#_}get seeking(){return this.#v}async play(){await this.#a,this.#s&&this.#t?.playVideo()}pause(){this.#t?.pauseVideo()}get currentTime(){return this.#x}set currentTime(e){this.#x!==e&&(this.#x=e,this.#L(t=>t.seekTo(e,!0)))}get duration(){return this.#S}get volume(){return this.#C}set volume(e){this.#C!==e&&(this.#C=e,this.#L(t=>t.setVolume(e*100)))}get muted(){return this.#w}set muted(e){this.#w!==e&&(this.#w=e,this.#L(t=>e?t.mute():t.unMute()))}get playbackRate(){return this.#T}set playbackRate(e){this.#T!==e&&(this.#T=e,this.#L(t=>t.setPlaybackRate(e)))}get autoplay(){return this.#c}set autoplay(e){this.#c=e}get defaultMuted(){return this.#l}set defaultMuted(e){this.#l=e}get loop(){return this.#u}set loop(e){this.#u=e}get controls(){return this.#d}set controls(e){this.#d=e}get playsInline(){return this.#f}set playsInline(e){this.#f=e}get preload(){return this.#p}set preload(e){this.#p=e}get poster(){return this.#m}set poster(e){this.#m=e}get source(){return this.#h}set source(e){let t=e??null;if(t===this.#h)return;let r=t?.src??``,i=this.#s!==r,a=!n(this.#h?.engine?.youtube??null,t?.engine?.youtube??null);this.#h=t,this.#s=r,(i||a)&&this.load(),this.dispatchEvent(new Event(`sourcechange`))}get buffered(){return this.#E>0?c(0,this.#E):m}get seekable(){return this.#S>0&&Number.isFinite(this.#S)?c(0,this.#S):m}get error(){return this.#O}get textTracks(){return this.#j??=globalThis.document?.createElement(`video`)??null,this.#j?.textTracks??p}get isFullscreen(){return this.#k}async requestFullscreen(){this.#e?.requestFullscreen&&(await this.#e.requestFullscreen(),this.#k=!0)}async exitFullscreen(){let e=globalThis.document;e?.fullscreenElement&&e.fullscreenElement===this.#e&&await e.exitFullscreen(),this.#k=!1}#P(){let e=this.#e;if(!e||this.#t||this.#i)return!1;if(!e.getAttribute(`src`)){let t=y(this.#s,this.#R());if(!t)return this.#a.resolve(),!1;e.src=t}return this.#i=!0,this.dispatchEvent(new Event(`loadstart`)),this.#F(e),!0}async#F(e){let t=this.#o,n;try{n=await T()}catch{if(this.#I(t))return;this.#i=!1,this.#O=new h(`Failed to load the YouTube iframe API`,h.MEDIA_ERR_NETWORK),this.dispatchEvent(new Event(`error`)),this.#a.resolve();return}if(this.#I(t)||this.#e!==e)return;let r=new n.Player(e,{events:{onReady:()=>{this.#I(t)||this.#B()},onError:e=>{this.#I(t)||this.#H(e.data)}}});this.#t=r,this.#i=!1,this.#U(r,t),this.#q(r)}#I(e){return e!==this.#o}#L(e){this.#a.then(()=>{let t=this.#t;t&&d(()=>e(t))},o)}#R(){return{autoplay:this.#c,defaultMuted:this.#l,loop:this.#u,controls:this.#d,playsInline:this.#f,preload:this.#p||_.preload,source:this.#h}}#z(){this.#x=0,this.#S=NaN,this.#w=!1,this.#g=!this.#c,this.#_=!1,this.#T=1,this.#E=0,this.#D=k,this.#v=!1,this.#y=!1,this.#b=!1,this.#C=1,this.#O=null,this.#k=!1}#B(){if(this.#n=!0,this.#r){this.#r=!1,this.load();return}this.#V()}#V(){if(this.#y)return;this.#y=!0,this.#D=A;let e=this.#t;e&&(this.#S=e.getDuration()||NaN,this.#w=e.isMuted(),this.#C=e.getVolume()/100,this.#T=e.getPlaybackRate());for(let e of[`loadedmetadata`,`durationchange`,`volumechange`,`loadcomplete`])this.dispatchEvent(new Event(e));this.#a.resolve(),this.#W()}#H(e){let t=new h(`YouTube iframe player error #${e}; visit https://developers.google.com/youtube/iframe_api_reference#onError for the full error message.`,E[e]??h.MEDIA_ERR_CUSTOM,!0);t.data={youtubeErrorCode:e},this.#O=t,this.dispatchEvent(new Event(`error`)),this.#a.resolve()}#U(e,t){let n=e=>this.dispatchEvent(new Event(e));e.addEventListener(`onStateChange`,({data:r})=>{if(!this.#I(t))if(this.#s&&!this.#y&&r!==-1&&this.#V(),(r===1||r===3)&&(this.#b||(this.#b=!0,this.#g=!1,this.#_=!1,n(`play`)),this.#J(e)),r===3)n(`waiting`);else if(r===1)this.#v&&(this.#v=!1,n(`seeked`)),this.#D=j,this.#g=!1,n(`playing`);else if(r===2){let t=Math.abs(e.getCurrentTime()-this.#x);!this.#v&&t>.1&&(this.#v=!0,n(`seeking`)),this.#b=!1,this.#g=!0,n(`pause`)}else r===0&&(this.#b=!1,this.#g=!0,n(`pause`),this.#_=!0,n(`ended`),this.#u&&this.play())}),e.addEventListener(`onPlaybackRateChange`,()=>{this.#I(t)||(this.#T=e.getPlaybackRate(),n(`ratechange`))}),e.addEventListener(`onVolumeChange`,()=>{this.#I(t)||(this.#C=e.getVolume()/100,this.#w=e.isMuted(),n(`volumechange`))})}#W(){this.#G(),this.#A=setInterval(()=>this.#K(),50)}#G(){this.#A!==null&&(clearInterval(this.#A),this.#A=null)}#K(){let t=this.#t;if(!t)return;let n=t.getCurrentTime(),r=t.getDuration(),i=t.getVideoLoadedFraction()*r;this.#v&&i>.1?(this.#v=!1,this.dispatchEvent(new Event(`seeked`))):!this.#v&&Math.abs(n-this.#x)>.1&&(this.#v=!0,this.dispatchEvent(new Event(`seeking`))),n!==this.#x&&(this.#x=n,this.dispatchEvent(new Event(`timeupdate`))),e(r)&&r>0&&r!==this.#S&&(this.#S=r,this.dispatchEvent(new Event(`durationchange`))),i!==this.#E&&(this.#E=i,r>0&&i>=r&&(this.#D=M),this.dispatchEvent(new Event(`progress`)))}#q(e){let n=globalThis.document;if(t(n))return;this.#Y();let r=n.createElement(`video`);this.#j=r,this.#M=new AbortController,r.textTracks?.addEventListener?.(`change`,()=>{let t=Array.from(r.textTracks).find(e=>e.mode===`showing`);d(()=>e.setOption(`captions`,`track`,t?{languageCode:t.language}:{}))},{signal:this.#M.signal})}#J(e){let t=this.#j;if(!t)return;let n=e.getOption(`captions`,`tracklist`)??[];for(let e of n)e.languageCode&&(Array.from(t.textTracks).some(t=>t.language===e.languageCode)||d(()=>t.addTextTrack?.(`subtitles`,e.displayName??``,e.languageCode)))}#Y(){this.#M?.abort(),this.#M=null,this.#j=null}};const k=0,A=1,j=3,M=4;var N=class extends r(`iframe`,O){static{this.getTemplateHTML=e=>{let t=y(e.src??``,P(e));return`<style> :host { display: inline-block; min-width: 300px; min-height: 150px; position: relative; } iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; } :host(:not([controls])) { pointer-events: none; } </style><iframe part="iframe" ${t?` src="${i(t)}"`:``} allow="accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen frameborder="0" width="100%" height="100%" referrerpolicy="${i(e.referrerpolicy??``)}" ></iframe>`}}};function P(e){return{autoplay:e.autoplay!==void 0,defaultMuted:e.muted!==void 0,loop:e.loop!==void 0,controls:e.controls!==void 0,playsInline:e.playsinline!==void 0,preload:e.preload??`metadata`}}var F=class extends g(N){},I=class extends F{static{this.tagName=`youtube-video`}};a(I);export{I as YouTubeVideoElement};
|
|
2
|
+
//# sourceMappingURL=youtube-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube-video.js","names":["#player","#target","#beginLoad","#createPlayer","#attachId","#stopPolling","#teardownTextTracks","#playerReady","#pendingLoad","#creatingPlayer","#loadComplete","#resetState","#src","#source","#readyState","#error","#autoplay","#paused","#ended","#seeking","#currentTime","#afterLoad","#duration","#volume","#muted","#playbackRate","#defaultMuted","#loop","#controls","#playsInline","#preload","#poster","#progress","#textTracksHost","#isFullscreen","#snapshotProps","#createPlayerApi","#isStale","#onPlayerReady","#onError","#bindPlayerEvents","#setupTextTracks","#loaded","#playFired","#onLoaded","#startPolling","#syncTextTracks","#pollInterval","#poll","#textTracksDisconnect"],"sources":["../../../media/dist/default/dom/youtube/props.js","../../../media/dist/default/dom/youtube/source.js","../../../media/dist/default/dom/youtube/iframe-api.js","../../../media/dist/default/dom/youtube/media.js","../../src/media/youtube-video/media.ts","../../src/define/media/youtube-video.ts"],"sourcesContent":["//#region src/dom/youtube/props.ts\nconst youtubeMediaDefaultProps = {\n\tsrc: \"\",\n\tautoplay: false,\n\tdefaultMuted: false,\n\tmuted: false,\n\tloop: false,\n\tcontrols: false,\n\tplaysInline: true,\n\tpreload: \"metadata\",\n\tposter: \"\",\n\tsource: null\n};\n//#endregion\nexport { youtubeMediaDefaultProps };\n\n//# sourceMappingURL=props.js.map","import { serializeEmbedParams } from \"../utils/embed-params.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\n//#region src/dom/youtube/source.ts\n/** Extract a YouTube video id from a raw 11-character id or any recognized URL. */\nfunction parseYouTubeVideoId(src) {\n\treturn parseYouTubeSource(src)?.id ?? null;\n}\n/**\n* Parse a YouTube source string. Recognizes raw 11-character ids, `youtu.be`\n* short links, `watch?v=`, `embed/`, `v/`, `shorts/` and `live/` URLs (with or\n* without the `-nocookie` host), playlist URLs via the `list` parameter, and\n* start times via the `t` parameter.\n*/\nfunction parseYouTubeSource(src) {\n\tif (!src) return null;\n\tif (/^[\\w-]{11}$/.test(src)) return {\n\t\tid: src,\n\t\tkind: \"video\",\n\t\tlistId: null,\n\t\tstartTime: null,\n\t\tnoCookie: false\n\t};\n\tconst noCookie = src.includes(\"-nocookie\");\n\tconst videoMatch = VIDEO_MATCH_SRC.exec(src);\n\tconst listMatch = PLAYLIST_MATCH_SRC.exec(src);\n\tconst videoId = videoMatch?.[1] ?? null;\n\tconst id = videoId === \"videoseries\" ? null : videoId;\n\tif (!id && !listMatch) return null;\n\treturn {\n\t\tid,\n\t\tkind: id ? \"video\" : \"playlist\",\n\t\tlistId: listMatch?.[1] ?? null,\n\t\tstartTime: parseStartTime(src),\n\t\tnoCookie\n\t};\n}\n/** Build the iframe `src` URL for an initial YouTube embed from the given props. */\nfunction buildYouTubeIframeSrc(src, props = {}) {\n\tconst parsed = parseYouTubeSource(src);\n\tif (!parsed) return \"\";\n\tconst embedBase = parsed.noCookie ? EMBED_BASE_NOCOOKIE : EMBED_BASE;\n\tconst params = {\n\t\tcontrols: props.controls === true ? null : 0,\n\t\tautoplay: props.autoplay,\n\t\tloop: props.loop,\n\t\tmute: props.defaultMuted,\n\t\tplaysinline: props.playsInline ?? youtubeMediaDefaultProps.playsInline,\n\t\tpreload: props.preload ?? youtubeMediaDefaultProps.preload,\n\t\tenablejsapi: 1,\n\t\trel: 0,\n\t\tiv_load_policy: 3,\n\t\tstart: parsed.startTime,\n\t\t...props.source?.engine?.youtube ?? void 0\n\t};\n\tif (parsed.kind === \"playlist\" && parsed.listId) return `${embedBase}?${serializeEmbedParams({\n\t\tlistType: \"playlist\",\n\t\tlist: parsed.listId,\n\t\t...params\n\t})}`;\n\treturn `${embedBase}/${parsed.id}?${serializeEmbedParams(params)}`;\n}\n/**\n* Parse the `t` parameter from a YouTube URL and convert it to seconds.\n* Supports formats like: `t=171`, `t=171s`, `t=2m51s`, `t=2m`, `t=1h30m15s`.\n*/\nfunction parseStartTime(url) {\n\tconst tValue = /[?&]t=([\\dhms]+)/i.exec(url)?.[1]?.toLowerCase();\n\tif (!tValue) return null;\n\tlet totalSeconds = 0;\n\tlet hasValue = false;\n\tconst hours = /(\\d+)h/.exec(tValue)?.[1];\n\tif (hours) {\n\t\ttotalSeconds += Number.parseInt(hours, 10) * 3600;\n\t\thasValue = true;\n\t}\n\tconst minutes = /(\\d+)m/.exec(tValue)?.[1];\n\tif (minutes) {\n\t\ttotalSeconds += Number.parseInt(minutes, 10) * 60;\n\t\thasValue = true;\n\t}\n\tconst seconds = /(\\d+)s?$/.exec(tValue)?.[1];\n\tif (seconds) {\n\t\ttotalSeconds += Number.parseInt(seconds, 10);\n\t\thasValue = true;\n\t}\n\treturn hasValue ? totalSeconds : null;\n}\nconst EMBED_BASE = \"https://www.youtube.com/embed\";\nconst EMBED_BASE_NOCOOKIE = \"https://www.youtube-nocookie.com/embed\";\nconst VIDEO_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|shorts\\/|live\\/))((?:\\w|-){11})/;\nconst PLAYLIST_MATCH_SRC = /(?:youtu\\.be\\/|youtube(?:-nocookie)?\\.com\\/.*?[?&]list=)([\\w-]+)/;\n//#endregion\nexport { buildYouTubeIframeSrc, parseYouTubeSource, parseYouTubeVideoId };\n\n//# sourceMappingURL=source.js.map","import { MediaError } from \"../../core/media-error.js\";\nimport { loadScript } from \"@videojs/utils/dom\";\n//#region src/dom/youtube/iframe-api.ts\nconst API_URL = \"https://www.youtube.com/iframe_api\";\n/** Load the iframe API once, reusing it if another host already pulled it in. */\nasync function loadYouTubeApi() {\n\tconst existing = globalThis.YT;\n\tif (existing?.Player) return existing;\n\tawait loadScript(API_URL);\n\tconst api = globalThis.YT;\n\tif (!api) throw new Error(\"YouTube iframe API failed to load\");\n\tawait new Promise((resolve) => api.ready(resolve));\n\treturn api;\n}\nconst youtubeErrorCodeToMediaErrorCode = {\n\t2: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t5: MediaError.MEDIA_ERR_DECODE,\n\t100: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t101: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED,\n\t150: MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED\n};\n//#endregion\nexport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode };\n\n//# sourceMappingURL=iframe-api.js.map","import { EMPTY_TEXT_TRACKS, EMPTY_TIME_RANGES } from \"../../core/constants.js\";\nimport { MediaError } from \"../../core/media-error.js\";\nimport { createTimeRange } from \"../utils/time-ranges.js\";\nimport { MediaPlayedRangesMixin } from \"../media-played-ranges/media-played-ranges.js\";\nimport { loadYouTubeApi, youtubeErrorCodeToMediaErrorCode } from \"./iframe-api.js\";\nimport { youtubeMediaDefaultProps } from \"./props.js\";\nimport { buildYouTubeIframeSrc, parseYouTubeSource } from \"./source.js\";\nimport { isNumber, isUndefined } from \"@videojs/utils/predicate\";\nimport { deepEqual } from \"@videojs/utils/object\";\nimport { createPublicPromise, noop, tryCall } from \"@videojs/utils/function\";\n//#region src/dom/youtube/media.ts\nconst YouTubeMediaBase = MediaPlayedRangesMixin(EventTarget);\nvar YouTubeMedia = class extends YouTubeMediaBase {\n\t#target = null;\n\t#player = null;\n\t#playerReady = false;\n\t#pendingLoad = false;\n\t#creatingPlayer = false;\n\t#loadComplete = createPublicPromise();\n\t#attachId = 0;\n\t#src = youtubeMediaDefaultProps.src;\n\t#autoplay = youtubeMediaDefaultProps.autoplay;\n\t#defaultMuted = youtubeMediaDefaultProps.defaultMuted;\n\t#loop = youtubeMediaDefaultProps.loop;\n\t#controls = youtubeMediaDefaultProps.controls;\n\t#playsInline = youtubeMediaDefaultProps.playsInline;\n\t#preload = youtubeMediaDefaultProps.preload;\n\t#poster = youtubeMediaDefaultProps.poster;\n\t#source = youtubeMediaDefaultProps.source;\n\t#paused = true;\n\t#ended = false;\n\t#seeking = false;\n\t#loaded = false;\n\t#playFired = false;\n\t#currentTime = 0;\n\t#duration = NaN;\n\t#volume = 1;\n\t#muted = false;\n\t#playbackRate = 1;\n\t#progress = 0;\n\t#readyState = READY_STATE_HAVE_NOTHING;\n\t#error = null;\n\t#isFullscreen = false;\n\t#pollInterval = null;\n\t#textTracksHost = null;\n\t#textTracksDisconnect = null;\n\tstatic PLAYER_SOFTWARE_NAME = \"youtube-video\";\n\t/** Underlying YouTube iframe API player instance (null until the API loads). */\n\tget engine() {\n\t\treturn this.#player;\n\t}\n\tget target() {\n\t\treturn this.#target;\n\t}\n\t/**\n\t* Bind the iframe hosting the embed. The player follows once an embed URL can be resolved,\n\t* which may not be now: an iframe attached before `src` is set is picked up by the next `load()`.\n\t*/\n\tattach(target) {\n\t\tif (!target || this.#target === target) return;\n\t\tif (this.#target) this.detach();\n\t\tthis.#target = target;\n\t\tthis.#beginLoad();\n\t\tthis.#createPlayer();\n\t}\n\tdetach() {\n\t\tif (!this.#target) return;\n\t\tthis.#attachId++;\n\t\tthis.#stopPolling();\n\t\tthis.#teardownTextTracks();\n\t\ttryCall(() => this.#player?.destroy());\n\t\tthis.#player = null;\n\t\tthis.#playerReady = false;\n\t\tthis.#pendingLoad = false;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#target = null;\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#resetState();\n\t}\n\tdestroy() {\n\t\tthis.detach();\n\t\tsuper.destroy();\n\t}\n\tget src() {\n\t\treturn this.#src;\n\t}\n\t/** YouTube URL or id. Setting it re-derives `source`, carrying its player parameters over. */\n\tset src(value) {\n\t\tconst { engine } = this.#source ?? {};\n\t\tconst next = {\n\t\t\t...engine && { engine },\n\t\t\t...value && { src: value }\n\t\t};\n\t\tthis.source = Object.keys(next).length > 0 ? next : null;\n\t}\n\tget currentSrc() {\n\t\treturn this.#target?.getAttribute(\"src\") ?? \"\";\n\t}\n\tget readyState() {\n\t\treturn this.#readyState;\n\t}\n\t/** Reload the current source via the iframe API; deferred until the player is ready. */\n\tasync load() {\n\t\tif (!this.#player || !this.#playerReady) {\n\t\t\tthis.#pendingLoad = !!this.#target;\n\t\t\tif (this.#target && !this.#player && !this.#creatingPlayer) {\n\t\t\t\tconst load = this.#beginLoad();\n\t\t\t\tawait Promise.resolve();\n\t\t\t\tif (load !== this.#loadComplete) return;\n\t\t\t\tthis.#createPlayer();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst load = this.#beginLoad();\n\t\tthis.#resetState();\n\t\tthis.dispatchEvent(new Event(\"emptied\"));\n\t\tif (!this.#src) {\n\t\t\tload.resolve();\n\t\t\tthis.#stopPolling();\n\t\t\ttryCall(() => this.#player?.stopVideo());\n\t\t\treturn;\n\t\t}\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tconst parsed = parseYouTubeSource(this.#src);\n\t\tif (!parsed) {\n\t\t\tthis.#error = new MediaError(`Unrecognized YouTube source: ${this.#src}`, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tload.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (parsed.kind === \"playlist\" && parsed.listId) {\n\t\t\tconst options = {\n\t\t\t\tlist: parsed.listId,\n\t\t\t\tlistType: \"playlist\"\n\t\t\t};\n\t\t\tif (this.#autoplay) this.#player.loadPlaylist(options);\n\t\t\telse this.#player.cuePlaylist(options);\n\t\t} else if (parsed.id) {\n\t\t\tconst options = { videoId: parsed.id };\n\t\t\tif (parsed.startTime != null) options.startSeconds = parsed.startTime;\n\t\t\tif (this.#autoplay) this.#player.loadVideoById(options);\n\t\t\telse this.#player.cueVideoById(options);\n\t\t}\n\t}\n\t#beginLoad() {\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#loadComplete = createPublicPromise();\n\t\treturn this.#loadComplete;\n\t}\n\tget paused() {\n\t\treturn this.#paused;\n\t}\n\tget ended() {\n\t\treturn this.#ended;\n\t}\n\tget seeking() {\n\t\treturn this.#seeking;\n\t}\n\tasync play() {\n\t\tawait this.#loadComplete;\n\t\tif (!this.#src) return;\n\t\tthis.#player?.playVideo();\n\t}\n\tpause() {\n\t\tthis.#player?.pauseVideo();\n\t}\n\tget currentTime() {\n\t\treturn this.#currentTime;\n\t}\n\tset currentTime(value) {\n\t\tif (this.#currentTime === value) return;\n\t\tthis.#currentTime = value;\n\t\tthis.#afterLoad((p) => p.seekTo(value, true));\n\t}\n\tget duration() {\n\t\treturn this.#duration;\n\t}\n\tget volume() {\n\t\treturn this.#volume;\n\t}\n\tset volume(value) {\n\t\tif (this.#volume === value) return;\n\t\tthis.#volume = value;\n\t\tthis.#afterLoad((p) => p.setVolume(value * 100));\n\t}\n\tget muted() {\n\t\treturn this.#muted;\n\t}\n\tset muted(value) {\n\t\tif (this.#muted === value) return;\n\t\tthis.#muted = value;\n\t\tthis.#afterLoad((p) => value ? p.mute() : p.unMute());\n\t}\n\tget playbackRate() {\n\t\treturn this.#playbackRate;\n\t}\n\tset playbackRate(value) {\n\t\tif (this.#playbackRate === value) return;\n\t\tthis.#playbackRate = value;\n\t\tthis.#afterLoad((p) => p.setPlaybackRate(value));\n\t}\n\tget autoplay() {\n\t\treturn this.#autoplay;\n\t}\n\tset autoplay(value) {\n\t\tthis.#autoplay = value;\n\t}\n\tget defaultMuted() {\n\t\treturn this.#defaultMuted;\n\t}\n\tset defaultMuted(value) {\n\t\tthis.#defaultMuted = value;\n\t}\n\tget loop() {\n\t\treturn this.#loop;\n\t}\n\tset loop(value) {\n\t\tthis.#loop = value;\n\t}\n\tget controls() {\n\t\treturn this.#controls;\n\t}\n\tset controls(value) {\n\t\tthis.#controls = value;\n\t}\n\tget playsInline() {\n\t\treturn this.#playsInline;\n\t}\n\tset playsInline(value) {\n\t\tthis.#playsInline = value;\n\t}\n\tget preload() {\n\t\treturn this.#preload;\n\t}\n\tset preload(value) {\n\t\tthis.#preload = value;\n\t}\n\tget poster() {\n\t\treturn this.#poster;\n\t}\n\tset poster(value) {\n\t\tthis.#poster = value;\n\t}\n\t/** YouTube URL or id in `src`, plus player parameters under `engine.youtube`. Replacing it re-derives `src`. */\n\tget source() {\n\t\treturn this.#source;\n\t}\n\tset source(value) {\n\t\tconst source = value ?? null;\n\t\tif (source === this.#source) return;\n\t\tconst src = source?.src ?? \"\";\n\t\tconst srcChanged = this.#src !== src;\n\t\tconst engineChanged = !deepEqual(this.#source?.engine?.youtube ?? null, source?.engine?.youtube ?? null);\n\t\tthis.#source = source;\n\t\tthis.#src = src;\n\t\tif (srcChanged || engineChanged) this.load();\n\t\tthis.dispatchEvent(new Event(\"sourcechange\"));\n\t}\n\tget buffered() {\n\t\treturn this.#progress > 0 ? createTimeRange(0, this.#progress) : EMPTY_TIME_RANGES;\n\t}\n\tget seekable() {\n\t\treturn this.#duration > 0 && Number.isFinite(this.#duration) ? createTimeRange(0, this.#duration) : EMPTY_TIME_RANGES;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tget textTracks() {\n\t\tthis.#textTracksHost ??= globalThis.document?.createElement(\"video\") ?? null;\n\t\treturn this.#textTracksHost?.textTracks ?? EMPTY_TEXT_TRACKS;\n\t}\n\tget isFullscreen() {\n\t\treturn this.#isFullscreen;\n\t}\n\tasync requestFullscreen() {\n\t\tif (!this.#target?.requestFullscreen) return;\n\t\tawait this.#target.requestFullscreen();\n\t\tthis.#isFullscreen = true;\n\t}\n\tasync exitFullscreen() {\n\t\tconst doc = globalThis.document;\n\t\tif (doc?.fullscreenElement && doc.fullscreenElement === this.#target) await doc.exitFullscreen();\n\t\tthis.#isFullscreen = false;\n\t}\n\t#createPlayer() {\n\t\tconst target = this.#target;\n\t\tif (!target || this.#player || this.#creatingPlayer) return false;\n\t\tif (!target.getAttribute(\"src\")) {\n\t\t\tconst initialSrc = buildYouTubeIframeSrc(this.#src, this.#snapshotProps());\n\t\t\tif (!initialSrc) {\n\t\t\t\tthis.#loadComplete.resolve();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\ttarget.src = initialSrc;\n\t\t}\n\t\tthis.#creatingPlayer = true;\n\t\tthis.dispatchEvent(new Event(\"loadstart\"));\n\t\tthis.#createPlayerApi(target);\n\t\treturn true;\n\t}\n\tasync #createPlayerApi(target) {\n\t\tconst attachId = this.#attachId;\n\t\tlet api;\n\t\ttry {\n\t\t\tapi = await loadYouTubeApi();\n\t\t} catch {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#creatingPlayer = false;\n\t\t\tthis.#error = new MediaError(\"Failed to load the YouTube iframe API\", MediaError.MEDIA_ERR_NETWORK);\n\t\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\t\tthis.#loadComplete.resolve();\n\t\t\treturn;\n\t\t}\n\t\tif (this.#isStale(attachId) || this.#target !== target) return;\n\t\tconst player = new api.Player(target, { events: {\n\t\t\tonReady: () => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onPlayerReady();\n\t\t\t},\n\t\t\tonError: (event) => {\n\t\t\t\tif (this.#isStale(attachId)) return;\n\t\t\t\tthis.#onError(event.data);\n\t\t\t}\n\t\t} });\n\t\tthis.#player = player;\n\t\tthis.#creatingPlayer = false;\n\t\tthis.#bindPlayerEvents(player, attachId);\n\t\tthis.#setupTextTracks(player);\n\t}\n\t#isStale(attachId) {\n\t\treturn attachId !== this.#attachId;\n\t}\n\t#afterLoad(fn) {\n\t\tthis.#loadComplete.then(() => {\n\t\t\tconst player = this.#player;\n\t\t\tif (player) tryCall(() => fn(player));\n\t\t}, noop);\n\t}\n\t#snapshotProps() {\n\t\treturn {\n\t\t\tautoplay: this.#autoplay,\n\t\t\tdefaultMuted: this.#defaultMuted,\n\t\t\tloop: this.#loop,\n\t\t\tcontrols: this.#controls,\n\t\t\tplaysInline: this.#playsInline,\n\t\t\tpreload: this.#preload || youtubeMediaDefaultProps.preload,\n\t\t\tsource: this.#source\n\t\t};\n\t}\n\t#resetState() {\n\t\tthis.#currentTime = 0;\n\t\tthis.#duration = NaN;\n\t\tthis.#muted = false;\n\t\tthis.#paused = !this.#autoplay;\n\t\tthis.#ended = false;\n\t\tthis.#playbackRate = 1;\n\t\tthis.#progress = 0;\n\t\tthis.#readyState = READY_STATE_HAVE_NOTHING;\n\t\tthis.#seeking = false;\n\t\tthis.#loaded = false;\n\t\tthis.#playFired = false;\n\t\tthis.#volume = 1;\n\t\tthis.#error = null;\n\t\tthis.#isFullscreen = false;\n\t}\n\t#onPlayerReady() {\n\t\tthis.#playerReady = true;\n\t\tif (this.#pendingLoad) {\n\t\t\tthis.#pendingLoad = false;\n\t\t\tthis.load();\n\t\t\treturn;\n\t\t}\n\t\tthis.#onLoaded();\n\t}\n\t#onLoaded() {\n\t\tif (this.#loaded) return;\n\t\tthis.#loaded = true;\n\t\tthis.#readyState = READY_STATE_HAVE_METADATA;\n\t\tconst player = this.#player;\n\t\tif (player) {\n\t\t\tthis.#duration = player.getDuration() || NaN;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t}\n\t\tfor (const type of [\n\t\t\t\"loadedmetadata\",\n\t\t\t\"durationchange\",\n\t\t\t\"volumechange\",\n\t\t\t\"loadcomplete\"\n\t\t]) this.dispatchEvent(new Event(type));\n\t\tthis.#loadComplete.resolve();\n\t\tthis.#startPolling();\n\t}\n\t#onError(code) {\n\t\tconst error = new MediaError(`YouTube iframe player error #${code}; visit https://developers.google.com/youtube/iframe_api_reference#onError for the full error message.`, youtubeErrorCodeToMediaErrorCode[code] ?? MediaError.MEDIA_ERR_CUSTOM, true);\n\t\terror.data = { youtubeErrorCode: code };\n\t\tthis.#error = error;\n\t\tthis.dispatchEvent(new Event(\"error\"));\n\t\tthis.#loadComplete.resolve();\n\t}\n\t#bindPlayerEvents(player, attachId) {\n\t\tconst emit = (type) => this.dispatchEvent(new Event(type));\n\t\tplayer.addEventListener(\"onStateChange\", ({ data: state }) => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tif (this.#src && !this.#loaded && state !== -1) this.#onLoaded();\n\t\t\tif (state === 1 || state === 3) {\n\t\t\t\tif (!this.#playFired) {\n\t\t\t\t\tthis.#playFired = true;\n\t\t\t\t\tthis.#paused = false;\n\t\t\t\t\tthis.#ended = false;\n\t\t\t\t\temit(\"play\");\n\t\t\t\t}\n\t\t\t\tthis.#syncTextTracks(player);\n\t\t\t}\n\t\t\tif (state === 3) emit(\"waiting\");\n\t\t\telse if (state === 1) {\n\t\t\t\tif (this.#seeking) {\n\t\t\t\t\tthis.#seeking = false;\n\t\t\t\t\temit(\"seeked\");\n\t\t\t\t}\n\t\t\t\tthis.#readyState = READY_STATE_HAVE_FUTURE_DATA;\n\t\t\t\tthis.#paused = false;\n\t\t\t\temit(\"playing\");\n\t\t\t} else if (state === 2) {\n\t\t\t\tconst diff = Math.abs(player.getCurrentTime() - this.#currentTime);\n\t\t\t\tif (!this.#seeking && diff > .1) {\n\t\t\t\t\tthis.#seeking = true;\n\t\t\t\t\temit(\"seeking\");\n\t\t\t\t}\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t} else if (state === 0) {\n\t\t\t\tthis.#playFired = false;\n\t\t\t\tthis.#paused = true;\n\t\t\t\temit(\"pause\");\n\t\t\t\tthis.#ended = true;\n\t\t\t\temit(\"ended\");\n\t\t\t\tif (this.#loop) this.play();\n\t\t\t}\n\t\t});\n\t\tplayer.addEventListener(\"onPlaybackRateChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#playbackRate = player.getPlaybackRate();\n\t\t\temit(\"ratechange\");\n\t\t});\n\t\tplayer.addEventListener(\"onVolumeChange\", () => {\n\t\t\tif (this.#isStale(attachId)) return;\n\t\t\tthis.#volume = player.getVolume() / 100;\n\t\t\tthis.#muted = player.isMuted();\n\t\t\temit(\"volumechange\");\n\t\t});\n\t}\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollInterval = setInterval(() => this.#poll(), 50);\n\t}\n\t#stopPolling() {\n\t\tif (this.#pollInterval !== null) {\n\t\t\tclearInterval(this.#pollInterval);\n\t\t\tthis.#pollInterval = null;\n\t\t}\n\t}\n\t#poll() {\n\t\tconst player = this.#player;\n\t\tif (!player) return;\n\t\tconst time = player.getCurrentTime();\n\t\tconst duration = player.getDuration();\n\t\tconst bufferedEnd = player.getVideoLoadedFraction() * duration;\n\t\tif (this.#seeking && bufferedEnd > .1) {\n\t\t\tthis.#seeking = false;\n\t\t\tthis.dispatchEvent(new Event(\"seeked\"));\n\t\t} else if (!this.#seeking && Math.abs(time - this.#currentTime) > .1) {\n\t\t\tthis.#seeking = true;\n\t\t\tthis.dispatchEvent(new Event(\"seeking\"));\n\t\t}\n\t\tif (time !== this.#currentTime) {\n\t\t\tthis.#currentTime = time;\n\t\t\tthis.dispatchEvent(new Event(\"timeupdate\"));\n\t\t}\n\t\tif (isNumber(duration) && duration > 0 && duration !== this.#duration) {\n\t\t\tthis.#duration = duration;\n\t\t\tthis.dispatchEvent(new Event(\"durationchange\"));\n\t\t}\n\t\tif (bufferedEnd !== this.#progress) {\n\t\t\tthis.#progress = bufferedEnd;\n\t\t\tif (duration > 0 && bufferedEnd >= duration) this.#readyState = READY_STATE_HAVE_ENOUGH_DATA;\n\t\t\tthis.dispatchEvent(new Event(\"progress\"));\n\t\t}\n\t}\n\t#setupTextTracks(player) {\n\t\tconst doc = globalThis.document;\n\t\tif (isUndefined(doc)) return;\n\t\tthis.#teardownTextTracks();\n\t\tconst host = doc.createElement(\"video\");\n\t\tthis.#textTracksHost = host;\n\t\tthis.#textTracksDisconnect = new AbortController();\n\t\thost.textTracks?.addEventListener?.(\"change\", () => {\n\t\t\tconst showing = Array.from(host.textTracks).find((t) => t.mode === \"showing\");\n\t\t\ttryCall(() => player.setOption(\"captions\", \"track\", showing ? { languageCode: showing.language } : {}));\n\t\t}, { signal: this.#textTracksDisconnect.signal });\n\t}\n\t#syncTextTracks(player) {\n\t\tconst host = this.#textTracksHost;\n\t\tif (!host) return;\n\t\tconst trackList = player.getOption(\"captions\", \"tracklist\") ?? [];\n\t\tfor (const track of trackList) {\n\t\t\tif (!track.languageCode) continue;\n\t\t\tif (Array.from(host.textTracks).some((t) => t.language === track.languageCode)) continue;\n\t\t\ttryCall(() => host.addTextTrack?.(\"subtitles\", track.displayName ?? \"\", track.languageCode));\n\t\t}\n\t}\n\t#teardownTextTracks() {\n\t\tthis.#textTracksDisconnect?.abort();\n\t\tthis.#textTracksDisconnect = null;\n\t\tthis.#textTracksHost = null;\n\t}\n};\nconst READY_STATE_HAVE_NOTHING = 0;\nconst READY_STATE_HAVE_METADATA = 1;\nconst READY_STATE_HAVE_FUTURE_DATA = 3;\nconst READY_STATE_HAVE_ENOUGH_DATA = 4;\n//#endregion\nexport { YouTubeMedia };\n\n//# sourceMappingURL=media.js.map","import { CustomMediaElement } from '@videojs/media/dom/custom-media-element';\nimport { buildYouTubeIframeSrc, YouTubeMedia } from '@videojs/media/dom/youtube';\nimport { escapeHtml } from '@videojs/utils/string';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nclass YouTubeCustomMediaElement extends CustomMediaElement('iframe', YouTubeMedia) {\n static override getTemplateHTML = (attrs: Record<string, string>): string => {\n const initialSrc = buildYouTubeIframeSrc(attrs.src ?? '', templateAttrsToEmbedProps(attrs));\n const srcAttr = initialSrc ? ` src=\"${escapeHtml(initialSrc)}\"` : '';\n return /*html*/ `\n <style>\n :host {\n display: inline-block;\n min-width: 300px;\n min-height: 150px;\n position: relative;\n }\n iframe {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n :host(:not([controls])) {\n pointer-events: none;\n }\n </style>\n <iframe\n part=\"iframe\"\n ${srcAttr}\n allow=\"accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture\"\n allowfullscreen\n frameborder=\"0\"\n width=\"100%\"\n height=\"100%\"\n referrerpolicy=\"${escapeHtml(attrs.referrerpolicy ?? '')}\"\n ></iframe>\n `;\n };\n}\n\nfunction templateAttrsToEmbedProps(attrs: Record<string, string>) {\n return {\n autoplay: attrs.autoplay !== undefined,\n defaultMuted: attrs.muted !== undefined,\n loop: attrs.loop !== undefined,\n controls: attrs.controls !== undefined,\n playsInline: attrs.playsinline !== undefined,\n preload: (attrs.preload as 'none' | 'metadata' | 'auto' | undefined) ?? 'metadata',\n };\n}\n\nexport class YouTubeVideo extends MediaAttachMixin(YouTubeCustomMediaElement) {}\n","import { YouTubeVideo } from '../../media/youtube-video';\nimport { safeDefine } from '../safe-define';\n\nexport class YouTubeVideoElement extends YouTubeVideo {\n static readonly tagName = 'youtube-video';\n}\n\nsafeDefine(YouTubeVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [YouTubeVideoElement.tagName]: YouTubeVideoElement;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as updateMediaSourceDuration, G as attachMediaSourceAsSourceElement, H as getResolvedSelectedTrackDuration, K as trackCurrentTime, P as endOfStream, R as collectErrors, T as setupAudioBufferActors, U as parseMultivariantPlaylist, V as calculatePresentationDuration, W as canPlayTrack, bt as effect, c as reportUnsupportedTrackConditions, ct as makeShareSignals, ht as SVTA_NO_SUPPORTED_AUDIO_TRACK, lt as createComposition, n as hasUnsupportedFeatureCause, q as loadAudioSegments, r as withAlternativeMediaSuggestion, s as UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE, t as firstFatal, v as resolveAudioTrack, vt as SVTA_UNSUPPORTED_PLAYBACK_FEATURE, w as setupMediaSource, x as resolvePresentation } from "./error-surface-D0bo71gD.js";
|
|
2
2
|
import { t as HTMLMediaElementHost } from "./media-host-C4WnQ_uQ.js";
|
|
3
|
-
import {
|
|
3
|
+
import { c as setupFailoverMonitor, d as setupAirPlay, f as deriveCdnPriority, g as trackLoadTriggers, i as switchAudioTrack, l as recoverEndStall, m as establishStartMediaTime, n as relocationPipelinesFor, p as deriveSharedMinStartMediaTime, s as syncPreload, u as applyStartPosition } from "./relocation-pipelines-Dh8CcgHw.js";
|
|
4
4
|
|
|
5
5
|
//#region ../spf/dist/dev/playback/engines/hls/engine-audio-only.js
|
|
6
6
|
const shareSignals = makeShareSignals(["userAudioTrackSelection", "disableRemotePlayback"]);
|
|
@@ -260,4 +260,4 @@ var HlsAudioMedia = class extends HlsAudioMediaBase {};
|
|
|
260
260
|
|
|
261
261
|
//#endregion
|
|
262
262
|
export { HlsAudioMedia as t };
|
|
263
|
-
//# sourceMappingURL=media-
|
|
263
|
+
//# sourceMappingURL=media-BI8caj07.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-Uxm0d3Vx.js","names":["#config","#engine","#createEngine","#stopErrorSync","#signals","#setError","#error","#reportedCode","#withSuggestion","#cancelPendingPlay","#preload","#disableRemotePlayback","#loadstartListener"],"sources":["../../spf/dist/dev/playback/engines/hls/engine-audio-only.js","../../spf/dist/dev/playback/adapters/hls-audio/adapter.js","../../media/dist/dev/dom/audio-host/audio-host.js","../../spf/dist/dev/playback/adapters/hls-audio/media.js"],"sourcesContent":["import { createComposition } from \"../../../core/composition/create-composition.js\";\nimport { makeShareSignals } from \"../../../core/composition/share-signals.js\";\nimport { loadAudioSegments } from \"../../behaviors/dom/load-segments.js\";\nimport { trackCurrentTime } from \"../../behaviors/dom/track-current-time.js\";\nimport { trackLoadTriggers } from \"../../behaviors/dom/track-load-triggers.js\";\nimport { deriveSharedMinStartMediaTime, establishStartMediaTime } from \"../../behaviors/establish-start-media-time.js\";\nimport { attachMediaSourceAsSourceElement } from \"../../../media/dom/mse/mediasource-setup.js\";\nimport { canPlayTrack } from \"../../../media/dom/capabilities.js\";\nimport { parseMultivariantPlaylist } from \"../../../media/hls/parse-multivariant.js\";\nimport { getResolvedSelectedTrackDuration } from \"../../../media/utils/track-selection.js\";\nimport { calculatePresentationDuration } from \"../../behaviors/calculate-presentation-duration.js\";\nimport { collectErrors } from \"../../behaviors/collect-errors.js\";\nimport { deriveCdnPriority } from \"../../behaviors/derive-cdn-priority.js\";\nimport { setupAirPlay } from \"../../behaviors/dom/airplay.js\";\nimport { applyStartPosition } from \"../../behaviors/dom/apply-start-position.js\";\nimport { endOfStream } from \"../../behaviors/dom/end-of-stream.js\";\nimport { recoverEndStall } from \"../../behaviors/dom/recover-end-stall.js\";\nimport { setupAudioBufferActors } from \"../../behaviors/dom/setup-buffer-actors.js\";\nimport { setupMediaSource } from \"../../behaviors/dom/setup-mediasource.js\";\nimport { updateMediaSourceDuration } from \"../../behaviors/dom/update-mediasource-duration.js\";\nimport { resolvePresentation } from \"../../behaviors/resolve-presentation.js\";\nimport { resolveAudioTrack } from \"../../behaviors/resolve-track.js\";\nimport { setupFailoverMonitor } from \"../../behaviors/setup-failover-monitor.js\";\nimport { syncPreload } from \"../../behaviors/sync-preload.js\";\nimport { switchAudioTrack } from \"../../behaviors/track-switching.js\";\nimport { relocationPipelinesFor } from \"../../primitives/relocation-pipelines.js\";\nimport { reportUnsupportedTrackConditions } from \"../../primitives/report-track-conditions.js\";\n//#region src/playback/engines/hls/engine-audio-only.ts\nconst shareSignals = makeShareSignals([\"userAudioTrackSelection\", \"disableRemotePlayback\"]);\n/**\n* Create an audio-only HLS playback engine.\n*\n* Subtractive composition variant of `createHlsVideoEngine`: omits\n* video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,\n* `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors\n* (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,\n* `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio\n* pipeline composes unchanged.\n*\n* Handles both truly audio-only HLS sources (no video stream-inf) and\n* mixed-AV HLS sources where the audio rendition is selected and video /\n* subtitle renditions are ignored at composition time. The variant decision\n* is encoded by adapter choice; this engine does not branch on source\n* shape.\n*\n* @example\n* ```ts\n* let signals: HlsAudioEngineSignals;\n* const engine = createHlsAudioEngine({\n* preferredAudioLanguage: 'en',\n* onSignalsReady: (refs) => {\n* signals = refs;\n* },\n* });\n*\n* signals.context.mediaElement.set(audioEl);\n* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n* ```\n*/\nfunction createHlsAudioEngine(config = {}) {\n\tconst deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;\n\tconst finalConfig = {\n\t\t...config,\n\t\tderiveStartMediaTime,\n\t\tattachMediaSource: attachMediaSourceAsSourceElement,\n\t\tcanPlayTrack: config.canPlayTrack ?? canPlayTrack,\n\t\treportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,\n\t\tresolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n\t\tparsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n\t\taudioMessagePipelines: relocationPipelinesFor(\"audio\", deriveStartMediaTime)\n\t};\n\treturn createComposition([\n\t\tsyncPreload,\n\t\ttrackLoadTriggers,\n\t\tresolvePresentation,\n\t\tderiveCdnPriority,\n\t\tsetupFailoverMonitor,\n\t\tcollectErrors,\n\t\tswitchAudioTrack,\n\t\tresolveAudioTrack,\n\t\tcalculatePresentationDuration,\n\t\tsetupMediaSource,\n\t\tupdateMediaSourceDuration,\n\t\testablishStartMediaTime,\n\t\tsetupAudioBufferActors,\n\t\tsetupAirPlay,\n\t\ttrackCurrentTime,\n\t\tapplyStartPosition,\n\t\tloadAudioSegments,\n\t\tendOfStream,\n\t\trecoverEndStall,\n\t\tshareSignals\n\t], { config: finalConfig });\n}\n//#endregion\nexport { createHlsAudioEngine };\n\n//# sourceMappingURL=engine-audio-only.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { SVTA_NO_SUPPORTED_AUDIO_TRACK, SVTA_UNSUPPORTED_PLAYBACK_FEATURE } from \"../../../media/errors.js\";\nimport { createHlsAudioEngine } from \"../../engines/hls/engine-audio-only.js\";\nimport { UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE } from \"../../primitives/error-messages.js\";\nimport { firstFatal, hasUnsupportedFeatureCause, withAlternativeMediaSuggestion } from \"../hls-video/error-surface.js\";\n//#region src/playback/adapters/hls-audio/adapter.ts\nconst hlsAudioMediaDefaultProps = {\n\tsrc: \"\",\n\tpreload: \"\",\n\tdisableRemotePlayback: false\n};\n/**\n* Which reported conditions this composition treats as fatal. Only the audio\n* verdict: an audio-only engine composes no video selection, so\n* `SVTA_NO_SUPPORTED_VIDEO_TRACK` is never reported and surfacing it would\n* describe a track type this media doesn't have.\n*/\nconst FATAL_SVTA_CODES = /* @__PURE__ */ new Set([SVTA_NO_SUPPORTED_AUDIO_TRACK]);\n/**\n* Mixin that adds SPF audio-only HLS playback to any base class.\n*\n* @fires error - Fired when a fatal condition is reported. Read `error` for it.\n*\n* Parallel to `HlsVideoMediaMixin` with one substantive difference: the\n* underlying engine is the audio-only variant (`createHlsAudioEngine`),\n* which omits video and text-track behaviors. The src / preload /\n* disableRemotePlayback / play() contract per the WHATWG HTML spec is identical\n* to the default adapter.\n*\n* Selecting this adapter is the variant decision: instantiating\n* `HlsAudioMediaElement` opts the consumer into audio-only\n* delivery even when the source is a mixed-AV HLS manifest.\n*\n* @example\n* class HlsAudioMedia extends HlsAudioMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new HlsAudioMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction HlsAudioMediaMixin(BaseClass) {\n\tclass HlsAudioMediaImpl extends BaseClass {\n\t\t/**\n\t\t* A complete sentence naming the Media to reach for when this one can't play\n\t\t* a source. Appended to the copy this adapter logs.\n\t\t*\n\t\t* Empty here, and overridden the same way as on the video adapter — see its\n\t\t* note. `hls-audio` has no better-equipped sibling of its own; the\n\t\t* Mux audio Media built on this engine does, and points at the hls.js-backed\n\t\t* one.\n\t\t*/\n\t\tstatic get alternativeMediaSuggestion() {}\n\t\t#engine;\n\t\t#config;\n\t\t#signals;\n\t\t#preload = hlsAudioMediaDefaultProps.preload;\n\t\t#disableRemotePlayback = hlsAudioMediaDefaultProps.disableRemotePlayback;\n\t\t#error = null;\n\t\t/** Reported condition currently surfaced — see the video adapter's note. */\n\t\t#reportedCode = null;\n\t\t#stopErrorSync;\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = this.#createEngine();\n\t\t\tthis.#stopErrorSync = effect(() => {\n\t\t\t\tconst errors = this.#signals.state.errors.get();\n\t\t\t\tthis.#setError(firstFatal(errors, FATAL_SVTA_CODES), errors);\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t* The current fatal error, or `null`. Only *fatal* conditions appear here —\n\t\t* the engine reports non-fatal ones too, which stay in `engine.state.errors`.\n\t\t* Resets per source. Fires `'error'` when set.\n\t\t*/\n\t\tget error() {\n\t\t\treturn this.#error;\n\t\t}\n\t\t#setError(reported, errors) {\n\t\t\tif (!reported) {\n\t\t\t\tthis.#error = null;\n\t\t\t\tthis.#reportedCode = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#reportedCode === reported.code) return;\n\t\t\tthis.#reportedCode = reported.code;\n\t\t\tconst unsupported = hasUnsupportedFeatureCause(errors);\n\t\t\tif (unsupported) console.error(this.#withSuggestion(UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE), { conditions: errors });\n\t\t\tthis.#error = {\n\t\t\t\tcode: unsupported ? SVTA_UNSUPPORTED_PLAYBACK_FEATURE : reported.code,\n\t\t\t\tmessage: reported.message ?? \"\",\n\t\t\t\t...reported.data === void 0 ? {} : { data: reported.data }\n\t\t\t};\n\t\t\tthis.dispatchEvent?.(new Event(\"error\"));\n\t\t}\n\t\t/**\n\t\t* Underlying playback engine — the low-level SPF reactive composition that\n\t\t* drives playback. An advanced escape hatch for direct engine access;\n\t\t* normal playback is driven through this element's own properties and\n\t\t* methods.\n\t\t*/\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tthis.#signals.context.mediaElement.set(mediaElement);\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.context.mediaElement.set(void 0);\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#stopErrorSync();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\t/** Preload type (`'none'` / `'metadata'` / `'auto'`). */\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) this.#signals.state.preload.set(value);\n\t\t}\n\t\tget disableRemotePlayback() {\n\t\t\treturn this.#disableRemotePlayback;\n\t\t}\n\t\tset disableRemotePlayback(value) {\n\t\t\tthis.#disableRemotePlayback = value;\n\t\t\tthis.#signals.state.disableRemotePlayback.set(value);\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#signals.state.presentation.get()?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tif (value === this.src) return;\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.state.presentation.set(value ? { url: value } : void 0);\n\t\t}\n\t\tplay() {\n\t\t\tconst mediaElement = this.#signals.context.mediaElement.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"HlsAudioMediaElement: no media element attached\"));\n\t\t\tthis.#signals.state.loadActivated.set(true);\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t/** `message`, plus the alternative-Media sentence when this class names one. */\n\t\t#withSuggestion(message) {\n\t\t\treturn withAlternativeMediaSuggestion(message, this);\n\t\t}\n\t\t#createEngine() {\n\t\t\treturn createHlsAudioEngine({\n\t\t\t\t...this.#config,\n\t\t\t\tonSignalsReady: (signals) => {\n\t\t\t\t\tthis.#signals = signals;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tthis.#signals.context.mediaElement.get()?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn HlsAudioMediaImpl;\n}\n/** Standalone SPF audio-only media adapter with no base class. */\nvar HlsAudioMediaElement = class extends HlsAudioMediaMixin(class {}) {};\n//#endregion\nexport { HlsAudioMediaElement, HlsAudioMediaMixin, hlsAudioMediaDefaultProps };\n\n//# sourceMappingURL=adapter.js.map","import { HTMLMediaElementHost } from \"../media-host/media-host.js\";\n//#region src/dom/audio-host/audio-host.ts\nvar HTMLAudioElementHost = class extends HTMLMediaElementHost {};\n//#endregion\nexport { HTMLAudioElementHost };\n\n//# sourceMappingURL=audio-host.js.map","import { HlsAudioMediaMixin } from \"./adapter.js\";\nimport { HTMLAudioElementHost } from \"@videojs/media/dom/audio-host\";\n//#region src/playback/adapters/hls-audio/media.ts\nconst HlsAudioMediaBase = HlsAudioMediaMixin(HTMLAudioElementHost);\nvar HlsAudioMedia = class extends HlsAudioMediaBase {};\n//#endregion\nexport { HlsAudioMedia };\n\n//# sourceMappingURL=media.js.map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"media-BI8caj07.js","names":["#config","#engine","#createEngine","#stopErrorSync","#signals","#setError","#error","#reportedCode","#withSuggestion","#cancelPendingPlay","#preload","#disableRemotePlayback","#loadstartListener"],"sources":["../../spf/dist/dev/playback/engines/hls/engine-audio-only.js","../../spf/dist/dev/playback/adapters/hls-audio/adapter.js","../../media/dist/dev/dom/audio-host/audio-host.js","../../spf/dist/dev/playback/adapters/hls-audio/media.js"],"sourcesContent":["import { createComposition } from \"../../../core/composition/create-composition.js\";\nimport { makeShareSignals } from \"../../../core/composition/share-signals.js\";\nimport { loadAudioSegments } from \"../../behaviors/dom/load-segments.js\";\nimport { trackCurrentTime } from \"../../behaviors/dom/track-current-time.js\";\nimport { trackLoadTriggers } from \"../../behaviors/dom/track-load-triggers.js\";\nimport { deriveSharedMinStartMediaTime, establishStartMediaTime } from \"../../behaviors/establish-start-media-time.js\";\nimport { attachMediaSourceAsSourceElement } from \"../../../media/dom/mse/mediasource-setup.js\";\nimport { canPlayTrack } from \"../../../media/dom/capabilities.js\";\nimport { parseMultivariantPlaylist } from \"../../../media/hls/parse-multivariant.js\";\nimport { getResolvedSelectedTrackDuration } from \"../../../media/utils/track-selection.js\";\nimport { calculatePresentationDuration } from \"../../behaviors/calculate-presentation-duration.js\";\nimport { collectErrors } from \"../../behaviors/collect-errors.js\";\nimport { deriveCdnPriority } from \"../../behaviors/derive-cdn-priority.js\";\nimport { setupAirPlay } from \"../../behaviors/dom/airplay.js\";\nimport { applyStartPosition } from \"../../behaviors/dom/apply-start-position.js\";\nimport { endOfStream } from \"../../behaviors/dom/end-of-stream.js\";\nimport { recoverEndStall } from \"../../behaviors/dom/recover-end-stall.js\";\nimport { setupAudioBufferActors } from \"../../behaviors/dom/setup-buffer-actors.js\";\nimport { setupMediaSource } from \"../../behaviors/dom/setup-mediasource.js\";\nimport { updateMediaSourceDuration } from \"../../behaviors/dom/update-mediasource-duration.js\";\nimport { resolvePresentation } from \"../../behaviors/resolve-presentation.js\";\nimport { resolveAudioTrack } from \"../../behaviors/resolve-track.js\";\nimport { setupFailoverMonitor } from \"../../behaviors/setup-failover-monitor.js\";\nimport { syncPreload } from \"../../behaviors/sync-preload.js\";\nimport { switchAudioTrack } from \"../../behaviors/track-switching.js\";\nimport { relocationPipelinesFor } from \"../../primitives/relocation-pipelines.js\";\nimport { reportUnsupportedTrackConditions } from \"../../primitives/report-track-conditions.js\";\n//#region src/playback/engines/hls/engine-audio-only.ts\nconst shareSignals = makeShareSignals([\"userAudioTrackSelection\", \"disableRemotePlayback\"]);\n/**\n* Create an audio-only HLS playback engine.\n*\n* Subtractive composition variant of `createHlsVideoEngine`: omits\n* video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,\n* `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors\n* (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,\n* `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio\n* pipeline composes unchanged.\n*\n* Handles both truly audio-only HLS sources (no video stream-inf) and\n* mixed-AV HLS sources where the audio rendition is selected and video /\n* subtitle renditions are ignored at composition time. The variant decision\n* is encoded by adapter choice; this engine does not branch on source\n* shape.\n*\n* @example\n* ```ts\n* let signals: HlsAudioEngineSignals;\n* const engine = createHlsAudioEngine({\n* preferredAudioLanguage: 'en',\n* onSignalsReady: (refs) => {\n* signals = refs;\n* },\n* });\n*\n* signals.context.mediaElement.set(audioEl);\n* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n* ```\n*/\nfunction createHlsAudioEngine(config = {}) {\n\tconst deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;\n\tconst finalConfig = {\n\t\t...config,\n\t\tderiveStartMediaTime,\n\t\tattachMediaSource: attachMediaSourceAsSourceElement,\n\t\tcanPlayTrack: config.canPlayTrack ?? canPlayTrack,\n\t\treportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,\n\t\tresolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n\t\tparsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n\t\taudioMessagePipelines: relocationPipelinesFor(\"audio\", deriveStartMediaTime)\n\t};\n\treturn createComposition([\n\t\tsyncPreload,\n\t\ttrackLoadTriggers,\n\t\tresolvePresentation,\n\t\tderiveCdnPriority,\n\t\tsetupFailoverMonitor,\n\t\tcollectErrors,\n\t\tswitchAudioTrack,\n\t\tresolveAudioTrack,\n\t\tcalculatePresentationDuration,\n\t\tsetupMediaSource,\n\t\tupdateMediaSourceDuration,\n\t\testablishStartMediaTime,\n\t\tsetupAudioBufferActors,\n\t\tsetupAirPlay,\n\t\ttrackCurrentTime,\n\t\tapplyStartPosition,\n\t\tloadAudioSegments,\n\t\tendOfStream,\n\t\trecoverEndStall,\n\t\tshareSignals\n\t], { config: finalConfig });\n}\n//#endregion\nexport { createHlsAudioEngine };\n\n//# sourceMappingURL=engine-audio-only.js.map","import { effect } from \"../../../core/signals/effect.js\";\nimport { SVTA_NO_SUPPORTED_AUDIO_TRACK, SVTA_UNSUPPORTED_PLAYBACK_FEATURE } from \"../../../media/errors.js\";\nimport { createHlsAudioEngine } from \"../../engines/hls/engine-audio-only.js\";\nimport { UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE } from \"../../primitives/error-messages.js\";\nimport { firstFatal, hasUnsupportedFeatureCause, withAlternativeMediaSuggestion } from \"../hls-video/error-surface.js\";\n//#region src/playback/adapters/hls-audio/adapter.ts\nconst hlsAudioMediaDefaultProps = {\n\tsrc: \"\",\n\tpreload: \"\",\n\tdisableRemotePlayback: false\n};\n/**\n* Which reported conditions this composition treats as fatal. Only the audio\n* verdict: an audio-only engine composes no video selection, so\n* `SVTA_NO_SUPPORTED_VIDEO_TRACK` is never reported and surfacing it would\n* describe a track type this media doesn't have.\n*/\nconst FATAL_SVTA_CODES = /* @__PURE__ */ new Set([SVTA_NO_SUPPORTED_AUDIO_TRACK]);\n/**\n* Mixin that adds SPF audio-only HLS playback to any base class.\n*\n* @fires error - Fired when a fatal condition is reported. Read `error` for it.\n*\n* Parallel to `HlsVideoMediaMixin` with one substantive difference: the\n* underlying engine is the audio-only variant (`createHlsAudioEngine`),\n* which omits video and text-track behaviors. The src / preload /\n* disableRemotePlayback / play() contract per the WHATWG HTML spec is identical\n* to the default adapter.\n*\n* Selecting this adapter is the variant decision: instantiating\n* `HlsAudioMediaElement` opts the consumer into audio-only\n* delivery even when the source is a mixed-AV HLS manifest.\n*\n* @example\n* class HlsAudioMedia extends HlsAudioMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new HlsAudioMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction HlsAudioMediaMixin(BaseClass) {\n\tclass HlsAudioMediaImpl extends BaseClass {\n\t\t/**\n\t\t* A complete sentence naming the Media to reach for when this one can't play\n\t\t* a source. Appended to the copy this adapter logs.\n\t\t*\n\t\t* Empty here, and overridden the same way as on the video adapter — see its\n\t\t* note. `hls-audio` has no better-equipped sibling of its own; the\n\t\t* Mux audio Media built on this engine does, and points at the hls.js-backed\n\t\t* one.\n\t\t*/\n\t\tstatic get alternativeMediaSuggestion() {}\n\t\t#engine;\n\t\t#config;\n\t\t#signals;\n\t\t#preload = hlsAudioMediaDefaultProps.preload;\n\t\t#disableRemotePlayback = hlsAudioMediaDefaultProps.disableRemotePlayback;\n\t\t#error = null;\n\t\t/** Reported condition currently surfaced — see the video adapter's note. */\n\t\t#reportedCode = null;\n\t\t#stopErrorSync;\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = this.#createEngine();\n\t\t\tthis.#stopErrorSync = effect(() => {\n\t\t\t\tconst errors = this.#signals.state.errors.get();\n\t\t\t\tthis.#setError(firstFatal(errors, FATAL_SVTA_CODES), errors);\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t* The current fatal error, or `null`. Only *fatal* conditions appear here —\n\t\t* the engine reports non-fatal ones too, which stay in `engine.state.errors`.\n\t\t* Resets per source. Fires `'error'` when set.\n\t\t*/\n\t\tget error() {\n\t\t\treturn this.#error;\n\t\t}\n\t\t#setError(reported, errors) {\n\t\t\tif (!reported) {\n\t\t\t\tthis.#error = null;\n\t\t\t\tthis.#reportedCode = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.#reportedCode === reported.code) return;\n\t\t\tthis.#reportedCode = reported.code;\n\t\t\tconst unsupported = hasUnsupportedFeatureCause(errors);\n\t\t\tif (unsupported) console.error(this.#withSuggestion(UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE), { conditions: errors });\n\t\t\tthis.#error = {\n\t\t\t\tcode: unsupported ? SVTA_UNSUPPORTED_PLAYBACK_FEATURE : reported.code,\n\t\t\t\tmessage: reported.message ?? \"\",\n\t\t\t\t...reported.data === void 0 ? {} : { data: reported.data }\n\t\t\t};\n\t\t\tthis.dispatchEvent?.(new Event(\"error\"));\n\t\t}\n\t\t/**\n\t\t* Underlying playback engine — the low-level SPF reactive composition that\n\t\t* drives playback. An advanced escape hatch for direct engine access;\n\t\t* normal playback is driven through this element's own properties and\n\t\t* methods.\n\t\t*/\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tthis.#signals.context.mediaElement.set(mediaElement);\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.context.mediaElement.set(void 0);\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#stopErrorSync();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\t/** Preload type (`'none'` / `'metadata'` / `'auto'`). */\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) this.#signals.state.preload.set(value);\n\t\t}\n\t\tget disableRemotePlayback() {\n\t\t\treturn this.#disableRemotePlayback;\n\t\t}\n\t\tset disableRemotePlayback(value) {\n\t\t\tthis.#disableRemotePlayback = value;\n\t\t\tthis.#signals.state.disableRemotePlayback.set(value);\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#signals.state.presentation.get()?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tif (value === this.src) return;\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#signals.state.presentation.set(value ? { url: value } : void 0);\n\t\t}\n\t\tplay() {\n\t\t\tconst mediaElement = this.#signals.context.mediaElement.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"HlsAudioMediaElement: no media element attached\"));\n\t\t\tthis.#signals.state.loadActivated.set(true);\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t/** `message`, plus the alternative-Media sentence when this class names one. */\n\t\t#withSuggestion(message) {\n\t\t\treturn withAlternativeMediaSuggestion(message, this);\n\t\t}\n\t\t#createEngine() {\n\t\t\treturn createHlsAudioEngine({\n\t\t\t\t...this.#config,\n\t\t\t\tonSignalsReady: (signals) => {\n\t\t\t\t\tthis.#signals = signals;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tthis.#signals.context.mediaElement.get()?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn HlsAudioMediaImpl;\n}\n/** Standalone SPF audio-only media adapter with no base class. */\nvar HlsAudioMediaElement = class extends HlsAudioMediaMixin(class {}) {};\n//#endregion\nexport { HlsAudioMediaElement, HlsAudioMediaMixin, hlsAudioMediaDefaultProps };\n\n//# sourceMappingURL=adapter.js.map","import { HTMLMediaElementHost } from \"../media-host/media-host.js\";\n//#region src/dom/audio-host/audio-host.ts\nvar HTMLAudioElementHost = class extends HTMLMediaElementHost {};\n//#endregion\nexport { HTMLAudioElementHost };\n\n//# sourceMappingURL=audio-host.js.map","import { HlsAudioMediaMixin } from \"./adapter.js\";\nimport { HTMLAudioElementHost } from \"@videojs/media/dom/audio-host\";\n//#region src/playback/adapters/hls-audio/media.ts\nconst HlsAudioMediaBase = HlsAudioMediaMixin(HTMLAudioElementHost);\nvar HlsAudioMedia = class extends HlsAudioMediaBase {};\n//#endregion\nexport { HlsAudioMedia };\n\n//# sourceMappingURL=media.js.map"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { t as
|
|
1
|
+
import { t as shallowEqual } from "./shallow-equal-C7S8rj2f.js";
|
|
2
|
+
import { t as HlsJsMedia } from "./media-BavrGKqa.js";
|
|
2
3
|
import { a as createMuxVideoURL, i as createMuxStoryboardURL, n as createMuxPosterURL, o as parseMuxVideoURL, r as createMuxQuery, s as parseJwt, t as MUX_VIDEO_DOMAIN } from "./source-BWMOkdJ6.js";
|
|
3
4
|
|
|
4
5
|
//#region ../media/dist/dev/dom/mux/drm.js
|
|
@@ -43,9 +44,11 @@ const muxMediaDefaultProps = {
|
|
|
43
44
|
};
|
|
44
45
|
/**
|
|
45
46
|
* @fires sourcechange - Fired when `source` changes, either directly or by parsing a new `src`. Read `source` for the new value.
|
|
47
|
+
* @fires contentdatachange - Fired when the derived `contentData` changes. Read `contentData` for the new value.
|
|
46
48
|
*/
|
|
47
49
|
var MuxMedia = class extends HlsJsMedia {
|
|
48
50
|
#source = muxMediaDefaultProps.source;
|
|
51
|
+
#contentData = {};
|
|
49
52
|
/**
|
|
50
53
|
* Media source URL. Setting a Mux stream URL
|
|
51
54
|
* (`https://stream.mux.com/<playback-id>.m3u8?...`) extracts the playback ID
|
|
@@ -60,11 +63,14 @@ var MuxMedia = class extends HlsJsMedia {
|
|
|
60
63
|
}
|
|
61
64
|
set src(value) {
|
|
62
65
|
if (super.src === value) return;
|
|
63
|
-
const { type, preferPlayback, engine } = this.#source ?? {};
|
|
66
|
+
const { type, preferPlayback, engine, maxAutoResolution, capRenditionToPlayerSize, minAutoResolution } = this.#source ?? {};
|
|
64
67
|
const source = {
|
|
65
68
|
...type && { type },
|
|
66
69
|
...preferPlayback && { preferPlayback },
|
|
67
70
|
...engine && { engine },
|
|
71
|
+
...maxAutoResolution && { maxAutoResolution },
|
|
72
|
+
...capRenditionToPlayerSize !== void 0 && { capRenditionToPlayerSize },
|
|
73
|
+
...minAutoResolution && { minAutoResolution },
|
|
68
74
|
...parseMuxVideoURL(value) ?? (value ? { src: value } : null)
|
|
69
75
|
};
|
|
70
76
|
this.source = Object.keys(source).length > 0 ? source : null;
|
|
@@ -79,6 +85,12 @@ var MuxMedia = class extends HlsJsMedia {
|
|
|
79
85
|
* PlayReady license servers for this playback ID, so protected media plays
|
|
80
86
|
* whichever path the browser takes. License servers named alongside the token
|
|
81
87
|
* win, key by key, for content Mux does not license.
|
|
88
|
+
*
|
|
89
|
+
* `playback.maxResolution` and `playback.minResolution` are server-side: they
|
|
90
|
+
* decide which renditions Mux puts in the manifest at all. The inherited
|
|
91
|
+
* `maxAutoResolution` and `minAutoResolution` only look like their pair —
|
|
92
|
+
* those are client-side and bound which of the renditions that *do* arrive
|
|
93
|
+
* adaptive selection reaches for. The two halves are independent.
|
|
82
94
|
*/
|
|
83
95
|
get source() {
|
|
84
96
|
return this.#source;
|
|
@@ -87,11 +99,13 @@ var MuxMedia = class extends HlsJsMedia {
|
|
|
87
99
|
const source = value ?? null;
|
|
88
100
|
if (source === this.#source) return;
|
|
89
101
|
this.#source = source;
|
|
102
|
+
const contentDataChanged = this.#refreshContentData();
|
|
90
103
|
super.source = source && {
|
|
91
104
|
...source,
|
|
92
105
|
src: createMuxVideoURL(source) ?? source.src ?? "",
|
|
93
106
|
...withMuxDrm(source)
|
|
94
107
|
};
|
|
108
|
+
if (contentDataChanged) this.dispatchEvent(new Event("contentdatachange"));
|
|
95
109
|
}
|
|
96
110
|
/**
|
|
97
111
|
* Image URLs `source` describes rather than plays: `poster` from its `poster`
|
|
@@ -99,17 +113,25 @@ var MuxMedia = class extends HlsJsMedia {
|
|
|
99
113
|
* URL can't be built — no playback ID, or signed playback without a matching
|
|
100
114
|
* image token.
|
|
101
115
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
116
|
+
* Derived from `source` and nothing else. The same object is handed back
|
|
117
|
+
* until one of those URLs changes, and `contentdatachange` announces it when
|
|
118
|
+
* it does. Nothing here is applied for you, apart from the thumbnail track
|
|
104
119
|
* `<mux-video>` adds from `storyboard` (and drops for live streams).
|
|
105
120
|
*/
|
|
106
121
|
get contentData() {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
122
|
+
return this.#contentData;
|
|
123
|
+
}
|
|
124
|
+
/** Rebuild the derived bag, reporting whether anything about it changed. */
|
|
125
|
+
#refreshContentData() {
|
|
126
|
+
const poster = createMuxPosterURL(this.#source);
|
|
127
|
+
const storyboard = createMuxStoryboardURL(this.#source);
|
|
128
|
+
const next = {
|
|
110
129
|
...poster && { poster },
|
|
111
130
|
...storyboard && { storyboard }
|
|
112
131
|
};
|
|
132
|
+
if (shallowEqual(this.#contentData, next)) return false;
|
|
133
|
+
this.#contentData = next;
|
|
134
|
+
return true;
|
|
113
135
|
}
|
|
114
136
|
};
|
|
115
137
|
/**
|
|
@@ -132,4 +154,4 @@ function withMuxDrm(source) {
|
|
|
132
154
|
|
|
133
155
|
//#endregion
|
|
134
156
|
export { MuxMedia as t };
|
|
135
|
-
//# sourceMappingURL=media-
|
|
157
|
+
//# sourceMappingURL=media-BNuI0Im7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-BNuI0Im7.js","names":["#source","#refreshContentData","#contentData"],"sources":["../../media/dist/dev/dom/mux/drm.js","../../media/dist/dev/dom/mux/media.js"],"sourcesContent":["import { MUX_VIDEO_DOMAIN, createMuxQuery } from \"./source/source.js\";\nimport { parseJwt } from \"@videojs/utils/jwt\";\n//#region src/dom/mux/drm.ts\n/**\n* Build the license servers a source describes, keyed by EME key system id —\n* `source.drm` as any other source would name it. Mux signs one license token\n* per playback ID and serves every system from a URL derived from it, so\n* `drm.token` is all a caller provides.\n*\n* Returns `undefined` when no license token is present, or when the token is\n* not scoped to DRM — an unsigned license request is always rejected, so there\n* is nothing useful to configure.\n*\n* Separate from `./source` because it is the one part of the Mux source an\n* engine that licenses differently — or, like SPF today, doesn't license at\n* all — has nothing to do with.\n*\n* @internal\n*/\nfunction createMuxDrmSystems(source) {\n\tif (!source?.playbackId) return void 0;\n\tconst { playbackId, customDomain = MUX_VIDEO_DOMAIN, drm } = source;\n\tconst { token } = drm ?? {};\n\tif (!token || parseJwt(token)?.aud !== \"d\") return void 0;\n\tconst query = createMuxQuery({ token });\n\tconst url = (path) => `https://license.${customDomain}/${path}/${playbackId}${query}`;\n\treturn {\n\t\t\"com.apple.fps\": {\n\t\t\tlicenseUrl: url(\"license/fairplay\"),\n\t\t\tserverCertificateUrl: url(\"appcert/fairplay\")\n\t\t},\n\t\t\"com.widevine.alpha\": { licenseUrl: url(\"license/widevine\") },\n\t\t\"com.microsoft.playready\": { licenseUrl: url(\"license/playready\") }\n\t};\n}\n//#endregion\nexport { createMuxDrmSystems };\n\n//# sourceMappingURL=drm.js.map","import { HlsJsMedia } from \"../hls-js/media.js\";\nimport { createMuxPosterURL, createMuxStoryboardURL, createMuxVideoURL, parseMuxVideoURL } from \"./source/source.js\";\nimport { createMuxDrmSystems } from \"./drm.js\";\nimport { shallowEqual } from \"@videojs/utils/object\";\n//#region src/dom/mux/media.ts\nconst muxMediaDefaultProps = {\n\tsrc: \"\",\n\tsource: null\n};\n/**\n* @fires sourcechange - Fired when `source` changes, either directly or by parsing a new `src`. Read `source` for the new value.\n* @fires contentdatachange - Fired when the derived `contentData` changes. Read `contentData` for the new value.\n*/\nvar MuxMedia = class extends HlsJsMedia {\n\t#source = muxMediaDefaultProps.source;\n\t#contentData = {};\n\t/**\n\t* Media source URL. Setting a Mux stream URL\n\t* (`https://stream.mux.com/<playback-id>.m3u8?...`) extracts the playback ID\n\t* and query params into `source`; other URLs are kept as a plain `source.src`.\n\t*\n\t* Only playback options carry over. Mux identity comes from the URL, and the\n\t* signed `poster`, `storyboard`, and `drm` tokens are scoped to a playback ID,\n\t* so carrying them onto a different source would build rejected URLs.\n\t*/\n\tget src() {\n\t\treturn super.src;\n\t}\n\tset src(value) {\n\t\tif (super.src === value) return;\n\t\tconst { type, preferPlayback, engine, maxAutoResolution, capRenditionToPlayerSize, minAutoResolution } = this.#source ?? {};\n\t\tconst source = {\n\t\t\t...type && { type },\n\t\t\t...preferPlayback && { preferPlayback },\n\t\t\t...engine && { engine },\n\t\t\t...maxAutoResolution && { maxAutoResolution },\n\t\t\t...capRenditionToPlayerSize !== void 0 && { capRenditionToPlayerSize },\n\t\t\t...minAutoResolution && { minAutoResolution },\n\t\t\t...parseMuxVideoURL(value) ?? (value ? { src: value } : null)\n\t\t};\n\t\tthis.source = Object.keys(source).length > 0 ? source : null;\n\t}\n\t/**\n\t* Structured Mux source. Setting it derives `src` from the playback ID,\n\t* custom domain, and `playback` params (appended as `snake_case` query\n\t* params). A `playback.token` replaces all other params — signed URLs bake\n\t* them into the token. Engine options live under `engine`.\n\t*\n\t* A `drm.token` fills in `drm` itself: Mux's FairPlay, Widevine, and\n\t* PlayReady license servers for this playback ID, so protected media plays\n\t* whichever path the browser takes. License servers named alongside the token\n\t* win, key by key, for content Mux does not license.\n\t*\n\t* `playback.maxResolution` and `playback.minResolution` are server-side: they\n\t* decide which renditions Mux puts in the manifest at all. The inherited\n\t* `maxAutoResolution` and `minAutoResolution` only look like their pair —\n\t* those are client-side and bound which of the renditions that *do* arrive\n\t* adaptive selection reaches for. The two halves are independent.\n\t*/\n\tget source() {\n\t\treturn this.#source;\n\t}\n\tset source(value) {\n\t\tconst source = value ?? null;\n\t\tif (source === this.#source) return;\n\t\tthis.#source = source;\n\t\tconst contentDataChanged = this.#refreshContentData();\n\t\tsuper.source = source && {\n\t\t\t...source,\n\t\t\tsrc: createMuxVideoURL(source) ?? source.src ?? \"\",\n\t\t\t...withMuxDrm(source)\n\t\t};\n\t\tif (contentDataChanged) this.dispatchEvent(new Event(\"contentdatachange\"));\n\t}\n\t/**\n\t* Image URLs `source` describes rather than plays: `poster` from its `poster`\n\t* params, `storyboard` from its `storyboard` params. A key is absent when the\n\t* URL can't be built — no playback ID, or signed playback without a matching\n\t* image token.\n\t*\n\t* Derived from `source` and nothing else. The same object is handed back\n\t* until one of those URLs changes, and `contentdatachange` announces it when\n\t* it does. Nothing here is applied for you, apart from the thumbnail track\n\t* `<mux-video>` adds from `storyboard` (and drops for live streams).\n\t*/\n\tget contentData() {\n\t\treturn this.#contentData;\n\t}\n\t/** Rebuild the derived bag, reporting whether anything about it changed. */\n\t#refreshContentData() {\n\t\tconst poster = createMuxPosterURL(this.#source);\n\t\tconst storyboard = createMuxStoryboardURL(this.#source);\n\t\tconst next = {\n\t\t\t...poster && { poster },\n\t\t\t...storyboard && { storyboard }\n\t\t};\n\t\tif (shallowEqual(this.#contentData, next)) return false;\n\t\tthis.#contentData = next;\n\t\treturn true;\n\t}\n};\n/**\n* Resolve Mux's DRM authoring input into the license servers the HLS layer\n* licenses from. Which engine ends up playing is decided later, and both read\n* `drm`, so a signed Mux source plays either way.\n*\n* `token` is Mux's own input and stops here — it names no license server, and a\n* key system is what everything downstream expects to find. Servers the caller\n* named win, key by key, so their own licensing replaces the derived URLs.\n*/\nfunction withMuxDrm(source) {\n\tconst { token: _token, ...systems } = source.drm ?? {};\n\tconst drm = {\n\t\t...createMuxDrmSystems(source),\n\t\t...systems\n\t};\n\treturn { drm: Object.keys(drm).length > 0 ? drm : void 0 };\n}\n//#endregion\nexport { MuxMedia, muxMediaDefaultProps };\n\n//# sourceMappingURL=media.js.map"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmBA,SAAS,oBAAoB,QAAQ;CACpC,IAAI,CAAC,QAAQ,YAAY,OAAO,KAAK;CACrC,MAAM,EAAE,YAAY,eAAe,kBAAkB,QAAQ;CAC7D,MAAM,EAAE,UAAU,OAAO,CAAC;CAC1B,IAAI,CAAC,SAAS,SAAS,KAAK,CAAC,EAAE,QAAQ,KAAK,OAAO,KAAK;CACxD,MAAM,QAAQ,eAAe,EAAE,MAAM,CAAC;CACtC,MAAM,OAAO,SAAS,mBAAmB,aAAa,GAAG,KAAK,GAAG,aAAa;CAC9E,OAAO;EACN,iBAAiB;GAChB,YAAY,IAAI,kBAAkB;GAClC,sBAAsB,IAAI,kBAAkB;EAC7C;EACA,sBAAsB,EAAE,YAAY,IAAI,kBAAkB,EAAE;EAC5D,2BAA2B,EAAE,YAAY,IAAI,mBAAmB,EAAE;CACnE;AACD;;;;AC7BA,MAAM,uBAAuB;CAC5B,KAAK;CACL,QAAQ;AACT;;;;;AAKA,IAAI,WAAW,cAAc,WAAW;CACvC,UAAU,qBAAqB;CAC/B,eAAe,CAAC;;;;;;;;;;CAUhB,IAAI,MAAM;EACT,OAAO,MAAM;CACd;CACA,IAAI,IAAI,OAAO;EACd,IAAI,MAAM,QAAQ,OAAO;EACzB,MAAM,EAAE,MAAM,gBAAgB,QAAQ,mBAAmB,0BAA0B,sBAAsB,KAAKA,WAAW,CAAC;EAC1H,MAAM,SAAS;GACd,GAAG,QAAQ,EAAE,KAAK;GAClB,GAAG,kBAAkB,EAAE,eAAe;GACtC,GAAG,UAAU,EAAE,OAAO;GACtB,GAAG,qBAAqB,EAAE,kBAAkB;GAC5C,GAAG,6BAA6B,KAAK,KAAK,EAAE,yBAAyB;GACrE,GAAG,qBAAqB,EAAE,kBAAkB;GAC5C,GAAG,iBAAiB,KAAK,MAAM,QAAQ,EAAE,KAAK,MAAM,IAAI;EACzD;EACA,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,IAAI,SAAS;CACzD;;;;;;;;;;;;;;;;;;CAkBA,IAAI,SAAS;EACZ,OAAO,KAAKA;CACb;CACA,IAAI,OAAO,OAAO;EACjB,MAAM,SAAS,SAAS;EACxB,IAAI,WAAW,KAAKA,SAAS;EAC7B,KAAKA,UAAU;EACf,MAAM,qBAAqB,KAAKC,oBAAoB;EACpD,MAAM,SAAS,UAAU;GACxB,GAAG;GACH,KAAK,kBAAkB,MAAM,KAAK,OAAO,OAAO;GAChD,GAAG,WAAW,MAAM;EACrB;EACA,IAAI,oBAAoB,KAAK,cAAc,IAAI,MAAM,mBAAmB,CAAC;CAC1E;;;;;;;;;;;;CAYA,IAAI,cAAc;EACjB,OAAO,KAAKC;CACb;;CAEA,sBAAsB;EACrB,MAAM,SAAS,mBAAmB,KAAKF,OAAO;EAC9C,MAAM,aAAa,uBAAuB,KAAKA,OAAO;EACtD,MAAM,OAAO;GACZ,GAAG,UAAU,EAAE,OAAO;GACtB,GAAG,cAAc,EAAE,WAAW;EAC/B;EACA,IAAI,aAAa,KAAKE,cAAc,IAAI,GAAG,OAAO;EAClD,KAAKA,eAAe;EACpB,OAAO;CACR;AACD;;;;;;;;;;AAUA,SAAS,WAAW,QAAQ;CAC3B,MAAM,EAAE,OAAO,QAAQ,GAAG,YAAY,OAAO,OAAO,CAAC;CACrD,MAAM,MAAM;EACX,GAAG,oBAAoB,MAAM;EAC7B,GAAG;CACJ;CACA,OAAO,EAAE,KAAK,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,MAAM,KAAK,EAAE;AAC1D"}
|