@locpd/vidstack 1.12.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/analyze.json.d.ts +8 -0
  4. package/bundle.d.ts +1 -0
  5. package/cdn/chunks/vidstack-2f5gzOW6.js +1 -0
  6. package/cdn/chunks/vidstack-BYgY9wmd.js +1 -0
  7. package/cdn/chunks/vidstack-BfBBPhXV.js +1 -0
  8. package/cdn/chunks/vidstack-Bjo5esRp.js +1 -0
  9. package/cdn/chunks/vidstack-BuL67v3q.js +1 -0
  10. package/cdn/chunks/vidstack-C0msPRTd.js +3 -0
  11. package/cdn/chunks/vidstack-CJNLoJPa.js +1 -0
  12. package/cdn/chunks/vidstack-CQSpZ7X8.js +16 -0
  13. package/cdn/chunks/vidstack-C_AxqLKV.js +1 -0
  14. package/cdn/chunks/vidstack-CioT3Yw2.js +1 -0
  15. package/cdn/chunks/vidstack-CrqkytHl.js +1 -0
  16. package/cdn/chunks/vidstack-D0M8R0ZU.js +1 -0
  17. package/cdn/chunks/vidstack-D40FSa5B.js +3 -0
  18. package/cdn/chunks/vidstack-DD2JwFVU.js +1 -0
  19. package/cdn/chunks/vidstack-DRH_1tFW.js +1 -0
  20. package/cdn/chunks/vidstack-DfDZuHNP.js +1 -0
  21. package/cdn/chunks/vidstack-DiNS2Vx5.js +1 -0
  22. package/cdn/chunks/vidstack-xjJ-ui_l.js +1 -0
  23. package/cdn/providers/vidstack-audio-2Dt_Ivbp.js +1 -0
  24. package/cdn/providers/vidstack-dash-CUtD4e6q.js +1 -0
  25. package/cdn/providers/vidstack-google-cast-BdORATUX.js +1 -0
  26. package/cdn/providers/vidstack-hls-R25Kb6DP.js +1 -0
  27. package/cdn/providers/vidstack-html-DaAUJYsD.js +1 -0
  28. package/cdn/providers/vidstack-video-Csvox7SO.js +1 -0
  29. package/cdn/providers/vidstack-vimeo-D4Z96kg2.js +1 -0
  30. package/cdn/providers/vidstack-youtube-DiND6h3s.js +1 -0
  31. package/cdn/vidstack.js +1 -0
  32. package/cdn/with-layouts/chunks/vidstack-2f5gzOW6.js +1 -0
  33. package/cdn/with-layouts/chunks/vidstack-45yH5los.js +1 -0
  34. package/cdn/with-layouts/chunks/vidstack-BBVMdOnf.js +1 -0
  35. package/cdn/with-layouts/chunks/vidstack-BB_ulI_T.js +1 -0
  36. package/cdn/with-layouts/chunks/vidstack-BcAewM33.js +1 -0
  37. package/cdn/with-layouts/chunks/vidstack-BfBBPhXV.js +1 -0
  38. package/cdn/with-layouts/chunks/vidstack-Bxv1Qnxe.js +1 -0
  39. package/cdn/with-layouts/chunks/vidstack-C2ZbG62f.js +3 -0
  40. package/cdn/with-layouts/chunks/vidstack-CCYIOKgL.js +1 -0
  41. package/cdn/with-layouts/chunks/vidstack-CL6PeIO1.js +1 -0
  42. package/cdn/with-layouts/chunks/vidstack-C_AxqLKV.js +1 -0
  43. package/cdn/with-layouts/chunks/vidstack-CifDkwDH.js +795 -0
  44. package/cdn/with-layouts/chunks/vidstack-Cry7aD59.js +3 -0
  45. package/cdn/with-layouts/chunks/vidstack-D065okCn.js +1 -0
  46. package/cdn/with-layouts/chunks/vidstack-DGuMoXmI.js +1 -0
  47. package/cdn/with-layouts/chunks/vidstack-DRH_1tFW.js +1 -0
  48. package/cdn/with-layouts/chunks/vidstack-DVBs1XoQ.js +1 -0
  49. package/cdn/with-layouts/chunks/vidstack-Dge3KT8k.js +1 -0
  50. package/cdn/with-layouts/chunks/vidstack-DiNS2Vx5.js +1 -0
  51. package/cdn/with-layouts/chunks/vidstack-HvYfJoen.js +1 -0
  52. package/cdn/with-layouts/providers/vidstack-audio-DE5vKIzW.js +1 -0
  53. package/cdn/with-layouts/providers/vidstack-dash-CA2agUuZ.js +1 -0
  54. package/cdn/with-layouts/providers/vidstack-google-cast-CGs-t8HM.js +1 -0
  55. package/cdn/with-layouts/providers/vidstack-hls-BHMbMFFR.js +1 -0
  56. package/cdn/with-layouts/providers/vidstack-html-Dm9gmNk6.js +1 -0
  57. package/cdn/with-layouts/providers/vidstack-video-C5it_Lbl.js +1 -0
  58. package/cdn/with-layouts/providers/vidstack-vimeo-BabLn9sy.js +1 -0
  59. package/cdn/with-layouts/providers/vidstack-youtube-D8UlccUL.js +1 -0
  60. package/cdn/with-layouts/vidstack.js +1 -0
  61. package/dev/chunks/vidstack-B7Zi3v_O.js +104 -0
  62. package/dev/chunks/vidstack-BFg1ZqiG.js +91 -0
  63. package/dev/chunks/vidstack-BGB2pa9s.js +58 -0
  64. package/dev/chunks/vidstack-BaIbHZE3.js +1519 -0
  65. package/dev/chunks/vidstack-Bb2rASIc.js +5188 -0
  66. package/dev/chunks/vidstack-Bcmx8pmK.js +224 -0
  67. package/dev/chunks/vidstack-Bl4b0Nen.js +29 -0
  68. package/dev/chunks/vidstack-Bo5OTJ06.js +58 -0
  69. package/dev/chunks/vidstack-BoAGnlRt.js +58 -0
  70. package/dev/chunks/vidstack-Bpr4fI4n.js +7 -0
  71. package/dev/chunks/vidstack-Bt8MP2DK.js +204 -0
  72. package/dev/chunks/vidstack-Bu2kfzUd.js +1637 -0
  73. package/dev/chunks/vidstack-C-ffXlSV.js +2995 -0
  74. package/dev/chunks/vidstack-C-ztJq-f.js +109 -0
  75. package/dev/chunks/vidstack-CFNlaVTR.js +55 -0
  76. package/dev/chunks/vidstack-C_l97D5j.js +254 -0
  77. package/dev/chunks/vidstack-CjhKISI0.js +114 -0
  78. package/dev/chunks/vidstack-CofXIJAy.js +57 -0
  79. package/dev/chunks/vidstack-CwTj4H1w.js +18 -0
  80. package/dev/chunks/vidstack-DDwbYVHV.js +66 -0
  81. package/dev/chunks/vidstack-DFImIcIL.js +11 -0
  82. package/dev/chunks/vidstack-DGDvUbvO.js +33 -0
  83. package/dev/chunks/vidstack-DO0kqA99.js +107 -0
  84. package/dev/chunks/vidstack-DXxIKXmd.js +50 -0
  85. package/dev/chunks/vidstack-DajrMUR0.js +297 -0
  86. package/dev/chunks/vidstack-DbBJlz7I.js +10 -0
  87. package/dev/chunks/vidstack-Dihypf8P.js +11 -0
  88. package/dev/chunks/vidstack-DlAhl87f.js +1193 -0
  89. package/dev/chunks/vidstack-Dm1xEU9Q.js +34 -0
  90. package/dev/chunks/vidstack-Dv_LIPFu.js +14 -0
  91. package/dev/chunks/vidstack-igYn0Apa.js +254 -0
  92. package/dev/chunks/vidstack-krOAtKMi.js +32 -0
  93. package/dev/chunks/vidstack-qh1N5_f_.js +26 -0
  94. package/dev/chunks/vidstack-rB-wqXw1.js +107 -0
  95. package/dev/chunks/vidstack-zG6PIeGg.js +66 -0
  96. package/dev/define/plyr-layout.js +51 -0
  97. package/dev/define/templates/plyr-layout.js +571 -0
  98. package/dev/define/templates/vidstack-audio-layout.js +167 -0
  99. package/dev/define/templates/vidstack-video-layout.js +390 -0
  100. package/dev/define/vidstack-icons.js +1 -0
  101. package/dev/define/vidstack-player-default-layout.js +21 -0
  102. package/dev/define/vidstack-player-layouts.js +25 -0
  103. package/dev/define/vidstack-player-ui.js +70 -0
  104. package/dev/define/vidstack-player.js +19 -0
  105. package/dev/global/plyr.js +501 -0
  106. package/dev/global/vidstack-player.js +129 -0
  107. package/dev/providers/vidstack-audio.js +35 -0
  108. package/dev/providers/vidstack-dash.js +516 -0
  109. package/dev/providers/vidstack-google-cast.js +474 -0
  110. package/dev/providers/vidstack-hls.js +408 -0
  111. package/dev/providers/vidstack-html.js +567 -0
  112. package/dev/providers/vidstack-video.js +207 -0
  113. package/dev/providers/vidstack-vimeo.js +554 -0
  114. package/dev/providers/vidstack-youtube.js +286 -0
  115. package/dev/vidstack-elements.js +36 -0
  116. package/dev/vidstack.js +91 -0
  117. package/dom.d.ts +91 -0
  118. package/elements.d.ts +1433 -0
  119. package/empty.vtt +1 -0
  120. package/global/player.d.ts +52 -0
  121. package/global/plyr.d.ts +343 -0
  122. package/google-cast.d.ts +1422 -0
  123. package/icons.d.ts +1 -0
  124. package/index.d.ts +402 -0
  125. package/package.json +199 -0
  126. package/player/index.d.ts +3 -0
  127. package/player/layouts/default.d.ts +3 -0
  128. package/player/layouts/index.d.ts +3 -0
  129. package/player/layouts/plyr.d.ts +3 -0
  130. package/player/styles/base.css +153 -0
  131. package/player/styles/default/buffering.css +55 -0
  132. package/player/styles/default/buttons.css +175 -0
  133. package/player/styles/default/captions.css +181 -0
  134. package/player/styles/default/chapter-title.css +26 -0
  135. package/player/styles/default/controls.css +56 -0
  136. package/player/styles/default/gestures.css +19 -0
  137. package/player/styles/default/icons.css +6 -0
  138. package/player/styles/default/keyboard.css +148 -0
  139. package/player/styles/default/layouts/audio.css +417 -0
  140. package/player/styles/default/layouts/video.css +590 -0
  141. package/player/styles/default/menus.css +959 -0
  142. package/player/styles/default/poster.css +52 -0
  143. package/player/styles/default/sliders.css +391 -0
  144. package/player/styles/default/theme.css +2461 -0
  145. package/player/styles/default/thumbnail.css +40 -0
  146. package/player/styles/default/time.css +45 -0
  147. package/player/styles/default/tooltips.css +141 -0
  148. package/player/styles/plyr/theme.css +1237 -0
  149. package/player/ui.d.ts +3 -0
  150. package/plugins.d.ts +19 -0
  151. package/plugins.js +13 -0
  152. package/prod/chunks/vidstack-B01xzxC4.js +7 -0
  153. package/prod/chunks/vidstack-BCeb7ryV.js +201 -0
  154. package/prod/chunks/vidstack-BGSTndAW.js +1590 -0
  155. package/prod/chunks/vidstack-BPitBBjh.js +1519 -0
  156. package/prod/chunks/vidstack-BQlOPwOu.js +45 -0
  157. package/prod/chunks/vidstack-BSDzlwxO.js +4778 -0
  158. package/prod/chunks/vidstack-BT0m6zEi.js +109 -0
  159. package/prod/chunks/vidstack-BTigPj2h.js +55 -0
  160. package/prod/chunks/vidstack-BiyXcJ_M.js +107 -0
  161. package/prod/chunks/vidstack-BoVf5n1M.js +2985 -0
  162. package/prod/chunks/vidstack-Bq6c3Bam.js +58 -0
  163. package/prod/chunks/vidstack-ByLCIBtB.js +297 -0
  164. package/prod/chunks/vidstack-C2US-gSO.js +248 -0
  165. package/prod/chunks/vidstack-C9vIqaYT.js +10 -0
  166. package/prod/chunks/vidstack-CF6fixCQ.js +1193 -0
  167. package/prod/chunks/vidstack-CTojmhKq.js +66 -0
  168. package/prod/chunks/vidstack-ChQTHmIQ.js +77 -0
  169. package/prod/chunks/vidstack-Cm6_unwd.js +246 -0
  170. package/prod/chunks/vidstack-CwTj4H1w.js +18 -0
  171. package/prod/chunks/vidstack-D3ltXc3a.js +33 -0
  172. package/prod/chunks/vidstack-D5EzK014.js +14 -0
  173. package/prod/chunks/vidstack-DDXt6fpN.js +58 -0
  174. package/prod/chunks/vidstack-DJDnh4xT.js +11 -0
  175. package/prod/chunks/vidstack-DXxIKXmd.js +50 -0
  176. package/prod/chunks/vidstack-D_-9AA6_.js +29 -0
  177. package/prod/chunks/vidstack-DbkZGjSn.js +107 -0
  178. package/prod/chunks/vidstack-Dihypf8P.js +11 -0
  179. package/prod/chunks/vidstack-Dm1xEU9Q.js +34 -0
  180. package/prod/chunks/vidstack-Dq5Yu0Vr.js +205 -0
  181. package/prod/chunks/vidstack-DqAw8m9J.js +26 -0
  182. package/prod/chunks/vidstack-DsPOyKtl.js +57 -0
  183. package/prod/chunks/vidstack-krOAtKMi.js +32 -0
  184. package/prod/chunks/vidstack-nLyr4NEP.js +58 -0
  185. package/prod/chunks/vidstack-xMS8dnYq.js +114 -0
  186. package/prod/chunks/vidstack-yEGTpgeA.js +104 -0
  187. package/prod/define/plyr-layout.js +51 -0
  188. package/prod/define/templates/plyr-layout.js +571 -0
  189. package/prod/define/templates/vidstack-audio-layout.js +167 -0
  190. package/prod/define/templates/vidstack-video-layout.js +390 -0
  191. package/prod/define/vidstack-icons.js +1 -0
  192. package/prod/define/vidstack-player-default-layout.js +21 -0
  193. package/prod/define/vidstack-player-layouts.js +25 -0
  194. package/prod/define/vidstack-player-ui.js +70 -0
  195. package/prod/define/vidstack-player.js +19 -0
  196. package/prod/global/plyr.js +493 -0
  197. package/prod/global/vidstack-player.js +129 -0
  198. package/prod/providers/vidstack-audio.js +35 -0
  199. package/prod/providers/vidstack-dash.js +501 -0
  200. package/prod/providers/vidstack-google-cast.js +468 -0
  201. package/prod/providers/vidstack-hls.js +393 -0
  202. package/prod/providers/vidstack-html.js +555 -0
  203. package/prod/providers/vidstack-video.js +204 -0
  204. package/prod/providers/vidstack-vimeo.js +548 -0
  205. package/prod/providers/vidstack-youtube.js +286 -0
  206. package/prod/vidstack-elements.js +36 -0
  207. package/prod/vidstack.js +158 -0
  208. package/server/chunks/vidstack-6juFdkKy.js +29 -0
  209. package/server/chunks/vidstack-B7iHmv7_.js +307 -0
  210. package/server/chunks/vidstack-BmxyML9v.js +1619 -0
  211. package/server/chunks/vidstack-BskfxwD3.js +566 -0
  212. package/server/chunks/vidstack-BvLV0SMz.js +4642 -0
  213. package/server/chunks/vidstack-BvWwluXZ.js +205 -0
  214. package/server/chunks/vidstack-C-413dj2.js +8 -0
  215. package/server/chunks/vidstack-C26K8z_-.js +55 -0
  216. package/server/chunks/vidstack-CJJiksDz.js +107 -0
  217. package/server/chunks/vidstack-CUNv52x1.js +141 -0
  218. package/server/chunks/vidstack-CqyBCODe.js +295 -0
  219. package/server/chunks/vidstack-CwTj4H1w.js +18 -0
  220. package/server/chunks/vidstack-DHAyGSOl.js +1502 -0
  221. package/server/chunks/vidstack-DLU3cjcp.js +381 -0
  222. package/server/chunks/vidstack-DXxIKXmd.js +50 -0
  223. package/server/chunks/vidstack-DbtDXDS2.js +104 -0
  224. package/server/chunks/vidstack-Dm1xEU9Q.js +34 -0
  225. package/server/chunks/vidstack-DzTHw_bw.js +207 -0
  226. package/server/chunks/vidstack-Wn3NH5Sg.js +1566 -0
  227. package/server/chunks/vidstack-krOAtKMi.js +32 -0
  228. package/server/chunks/vidstack-wNViAkr4.js +3045 -0
  229. package/server/define/plyr-layout.js +16 -0
  230. package/server/define/vidstack-icons.js +1 -0
  231. package/server/define/vidstack-player-default-layout.js +13 -0
  232. package/server/define/vidstack-player-layouts.js +16 -0
  233. package/server/define/vidstack-player-ui.js +11 -0
  234. package/server/define/vidstack-player.js +6 -0
  235. package/server/global/plyr.js +322 -0
  236. package/server/global/vidstack-player.js +58 -0
  237. package/server/vidstack-elements.js +46 -0
  238. package/server/vidstack.js +148 -0
  239. package/tailwind.cjs +101 -0
  240. package/tailwind.d.cts +15 -0
  241. package/types/vidstack-BOvzfZjK.d.ts +1269 -0
  242. package/types/vidstack-Cttpg6GU.d.ts +7474 -0
@@ -0,0 +1,408 @@
1
+ import { loadScript, preconnect } from '../chunks/vidstack-zG6PIeGg.js';
2
+ import { IS_CHROME, isHLSSupported } from '../chunks/vidstack-CjhKISI0.js';
3
+ import { VideoProvider } from './vidstack-video.js';
4
+ import { peek, listenEvent, effect, DOMEvent, isString, camelToKebabCase, isUndefined, isFunction } from '../chunks/vidstack-Bu2kfzUd.js';
5
+ import { QualitySymbol } from '../chunks/vidstack-Bpr4fI4n.js';
6
+ import { TextTrack, TextTrackSymbol } from '../chunks/vidstack-igYn0Apa.js';
7
+ import { ListSymbol } from '../chunks/vidstack-Dv_LIPFu.js';
8
+ import { RAFLoop } from '../chunks/vidstack-qh1N5_f_.js';
9
+ import { coerceToError } from '../chunks/vidstack-DbBJlz7I.js';
10
+ import './vidstack-html.js';
11
+ import '../chunks/vidstack-Dihypf8P.js';
12
+ import '../chunks/vidstack-Bo5OTJ06.js';
13
+ import '../chunks/vidstack-BGB2pa9s.js';
14
+
15
+ const toDOMEventType = (type) => camelToKebabCase(type);
16
+ class HLSController {
17
+ #video;
18
+ #ctx;
19
+ #instance = null;
20
+ #stopLiveSync = null;
21
+ config = {};
22
+ #callbacks = /* @__PURE__ */ new Set();
23
+ get instance() {
24
+ return this.#instance;
25
+ }
26
+ constructor(video, ctx) {
27
+ this.#video = video;
28
+ this.#ctx = ctx;
29
+ }
30
+ setup(ctor) {
31
+ const { streamType } = this.#ctx.$state;
32
+ const isLive = peek(streamType).includes("live"), isLiveLowLatency = peek(streamType).includes("ll-");
33
+ this.#instance = new ctor({
34
+ lowLatencyMode: isLiveLowLatency,
35
+ backBufferLength: isLiveLowLatency ? 4 : isLive ? 8 : void 0,
36
+ renderTextTracksNatively: false,
37
+ ...this.config
38
+ });
39
+ const dispatcher = this.#dispatchHLSEvent.bind(this);
40
+ for (const event of Object.values(ctor.Events)) this.#instance.on(event, dispatcher);
41
+ this.#instance.on(ctor.Events.ERROR, this.#onError.bind(this));
42
+ for (const callback of this.#callbacks) callback(this.#instance);
43
+ this.#ctx.player.dispatch("hls-instance", {
44
+ detail: this.#instance
45
+ });
46
+ this.#instance.attachMedia(this.#video);
47
+ this.#instance.on(ctor.Events.AUDIO_TRACK_SWITCHED, this.#onAudioSwitch.bind(this));
48
+ this.#instance.on(ctor.Events.LEVEL_SWITCHED, this.#onLevelSwitched.bind(this));
49
+ this.#instance.on(ctor.Events.LEVEL_LOADED, this.#onLevelLoaded.bind(this));
50
+ this.#instance.on(ctor.Events.LEVEL_UPDATED, this.#onLevelUpdated.bind(this));
51
+ this.#instance.on(ctor.Events.NON_NATIVE_TEXT_TRACKS_FOUND, this.#onTracksFound.bind(this));
52
+ this.#instance.on(ctor.Events.CUES_PARSED, this.#onCuesParsed.bind(this));
53
+ this.#ctx.qualities[QualitySymbol.enableAuto] = this.#enableAutoQuality.bind(this);
54
+ listenEvent(this.#ctx.qualities, "change", this.#onUserQualityChange.bind(this));
55
+ listenEvent(this.#ctx.audioTracks, "change", this.#onUserAudioChange.bind(this));
56
+ this.#stopLiveSync = effect(this.#liveSync.bind(this));
57
+ }
58
+ #createDOMEvent(type, data) {
59
+ return new DOMEvent(toDOMEventType(type), { detail: data });
60
+ }
61
+ #liveSync() {
62
+ if (!this.#ctx.$state.live()) return;
63
+ const raf = new RAFLoop(this.#liveSyncPosition.bind(this));
64
+ raf.start();
65
+ return raf.stop.bind(raf);
66
+ }
67
+ #liveSyncPosition() {
68
+ this.#ctx.$state.liveSyncPosition.set(this.#instance?.liveSyncPosition ?? Infinity);
69
+ }
70
+ #dispatchHLSEvent(type, data) {
71
+ this.#ctx.player?.dispatch(this.#createDOMEvent(type, data));
72
+ }
73
+ #onTracksFound(eventType, data) {
74
+ const event = this.#createDOMEvent(eventType, data);
75
+ let currentTrack = -1;
76
+ for (let i = 0; i < data.tracks.length; i++) {
77
+ const nonNativeTrack = data.tracks[i], init = nonNativeTrack.subtitleTrack ?? nonNativeTrack.closedCaptions, track = new TextTrack({
78
+ id: `hls-${nonNativeTrack.kind}-${i}`,
79
+ src: init?.url,
80
+ label: nonNativeTrack.label,
81
+ language: init?.lang,
82
+ kind: nonNativeTrack.kind,
83
+ default: nonNativeTrack.default
84
+ });
85
+ track[TextTrackSymbol.readyState] = 2;
86
+ track[TextTrackSymbol.onModeChange] = () => {
87
+ if (track.mode === "showing") {
88
+ this.#instance.subtitleTrack = i;
89
+ currentTrack = i;
90
+ } else if (currentTrack === i) {
91
+ this.#instance.subtitleTrack = -1;
92
+ currentTrack = -1;
93
+ }
94
+ };
95
+ this.#ctx.textTracks.add(track, event);
96
+ }
97
+ }
98
+ #onCuesParsed(eventType, data) {
99
+ const index = this.#instance?.subtitleTrack, track = this.#ctx.textTracks.getById(`hls-${data.type}-${index}`);
100
+ if (!track) return;
101
+ const event = this.#createDOMEvent(eventType, data);
102
+ for (const cue of data.cues) {
103
+ cue.positionAlign = "auto";
104
+ track.addCue(cue, event);
105
+ }
106
+ }
107
+ #onAudioSwitch(eventType, data) {
108
+ const track = this.#ctx.audioTracks[data.id];
109
+ if (track) {
110
+ const trigger = this.#createDOMEvent(eventType, data);
111
+ this.#ctx.audioTracks[ListSymbol.select](track, true, trigger);
112
+ }
113
+ }
114
+ #onLevelSwitched(eventType, data) {
115
+ const quality = this.#ctx.qualities[data.level];
116
+ if (quality) {
117
+ const trigger = this.#createDOMEvent(eventType, data);
118
+ this.#ctx.qualities[ListSymbol.select](quality, true, trigger);
119
+ }
120
+ }
121
+ #onLevelUpdated(eventType, data) {
122
+ if (data.details.totalduration > 0) {
123
+ this.#ctx.$state.inferredLiveDVRWindow.set(data.details.totalduration);
124
+ }
125
+ }
126
+ #onLevelLoaded(eventType, data) {
127
+ if (this.#ctx.$state.canPlay()) return;
128
+ const { type, live, totalduration: duration, targetduration } = data.details, trigger = this.#createDOMEvent(eventType, data);
129
+ this.#ctx.notify(
130
+ "stream-type-change",
131
+ live ? type === "EVENT" && Number.isFinite(duration) && targetduration >= 10 ? "live:dvr" : "live" : "on-demand",
132
+ trigger
133
+ );
134
+ this.#ctx.notify("duration-change", duration, trigger);
135
+ const media = this.#instance.media;
136
+ if (this.#instance.currentLevel === -1) {
137
+ this.#ctx.qualities[QualitySymbol.setAuto](true, trigger);
138
+ }
139
+ for (const remoteTrack of this.#instance.audioTracks) {
140
+ const localTrack = {
141
+ id: remoteTrack.id.toString(),
142
+ label: remoteTrack.name,
143
+ language: remoteTrack.lang || "",
144
+ kind: "main"
145
+ };
146
+ this.#ctx.audioTracks[ListSymbol.add](localTrack, trigger);
147
+ }
148
+ for (const level of this.#instance.levels) {
149
+ const videoQuality = {
150
+ id: level.id?.toString() ?? level.height + "p",
151
+ width: level.width,
152
+ height: level.height,
153
+ codec: level.codecSet,
154
+ bitrate: level.bitrate
155
+ };
156
+ this.#ctx.qualities[ListSymbol.add](videoQuality, trigger);
157
+ }
158
+ media.dispatchEvent(new DOMEvent("canplay", { trigger }));
159
+ }
160
+ #onError(eventType, data) {
161
+ {
162
+ this.#ctx.logger?.errorGroup(`[vidstack] HLS error \`${eventType}\``).labelledLog("Media Element", this.#instance?.media).labelledLog("HLS Instance", this.#instance).labelledLog("Event Type", eventType).labelledLog("Data", data).labelledLog("Src", peek(this.#ctx.$state.source)).labelledLog("Media Store", { ...this.#ctx.$state }).dispatch();
163
+ }
164
+ if (data.fatal) {
165
+ switch (data.type) {
166
+ case "mediaError":
167
+ this.#instance?.recoverMediaError();
168
+ break;
169
+ default:
170
+ this.#onFatalError(data.error);
171
+ break;
172
+ }
173
+ }
174
+ }
175
+ #onFatalError(error) {
176
+ this.#ctx.notify("error", {
177
+ message: error.message,
178
+ code: 1,
179
+ error
180
+ });
181
+ }
182
+ #enableAutoQuality() {
183
+ if (this.#instance) this.#instance.currentLevel = -1;
184
+ }
185
+ #onUserQualityChange() {
186
+ const { qualities } = this.#ctx;
187
+ if (!this.#instance || qualities.auto) return;
188
+ this.#instance[qualities.switch + "Level"] = qualities.selectedIndex;
189
+ if (IS_CHROME) {
190
+ this.#video.currentTime = this.#video.currentTime;
191
+ }
192
+ }
193
+ #onUserAudioChange() {
194
+ const { audioTracks } = this.#ctx;
195
+ if (this.#instance && this.#instance.audioTrack !== audioTracks.selectedIndex) {
196
+ this.#instance.audioTrack = audioTracks.selectedIndex;
197
+ }
198
+ }
199
+ onInstance(callback) {
200
+ this.#callbacks.add(callback);
201
+ return () => this.#callbacks.delete(callback);
202
+ }
203
+ loadSource(src) {
204
+ if (!isString(src.src)) return;
205
+ this.#instance?.loadSource(src.src);
206
+ }
207
+ destroy() {
208
+ this.#instance?.destroy();
209
+ this.#instance = null;
210
+ this.#stopLiveSync?.();
211
+ this.#stopLiveSync = null;
212
+ this.#ctx?.logger?.info("\u{1F3D7}\uFE0F Destroyed HLS instance");
213
+ }
214
+ }
215
+
216
+ class HLSLibLoader {
217
+ #lib;
218
+ #ctx;
219
+ #callback;
220
+ constructor(lib, ctx, callback) {
221
+ this.#lib = lib;
222
+ this.#ctx = ctx;
223
+ this.#callback = callback;
224
+ this.#startLoading();
225
+ }
226
+ async #startLoading() {
227
+ this.#ctx.logger?.info("\u{1F3D7}\uFE0F Loading HLS Library");
228
+ const callbacks = {
229
+ onLoadStart: this.#onLoadStart.bind(this),
230
+ onLoaded: this.#onLoaded.bind(this),
231
+ onLoadError: this.#onLoadError.bind(this)
232
+ };
233
+ let ctor = await loadHLSScript(this.#lib, callbacks);
234
+ if (isUndefined(ctor) && !isString(this.#lib)) ctor = await importHLS(this.#lib, callbacks);
235
+ if (!ctor) return null;
236
+ if (!ctor.isSupported()) {
237
+ const message = "[vidstack] `hls.js` is not supported in this environment";
238
+ this.#ctx.logger?.error(message);
239
+ this.#ctx.player.dispatch(new DOMEvent("hls-unsupported"));
240
+ this.#ctx.notify("error", { message, code: 4 });
241
+ return null;
242
+ }
243
+ return ctor;
244
+ }
245
+ #onLoadStart() {
246
+ {
247
+ this.#ctx.logger?.infoGroup("Starting to load `hls.js`").labelledLog("URL", this.#lib).dispatch();
248
+ }
249
+ this.#ctx.player.dispatch(new DOMEvent("hls-lib-load-start"));
250
+ }
251
+ #onLoaded(ctor) {
252
+ {
253
+ this.#ctx.logger?.infoGroup("Loaded `hls.js`").labelledLog("Library", this.#lib).labelledLog("Constructor", ctor).dispatch();
254
+ }
255
+ this.#ctx.player.dispatch(
256
+ new DOMEvent("hls-lib-loaded", {
257
+ detail: ctor
258
+ })
259
+ );
260
+ this.#callback(ctor);
261
+ }
262
+ #onLoadError(e) {
263
+ const error = coerceToError(e);
264
+ {
265
+ this.#ctx.logger?.errorGroup("[vidstack] Failed to load `hls.js`").labelledLog("Library", this.#lib).labelledLog("Error", e).dispatch();
266
+ }
267
+ this.#ctx.player.dispatch(
268
+ new DOMEvent("hls-lib-load-error", {
269
+ detail: error
270
+ })
271
+ );
272
+ this.#ctx.notify("error", {
273
+ message: error.message,
274
+ code: 4,
275
+ error
276
+ });
277
+ }
278
+ }
279
+ async function importHLS(loader, callbacks = {}) {
280
+ if (isUndefined(loader)) return void 0;
281
+ callbacks.onLoadStart?.();
282
+ if (loader.prototype && loader.prototype !== Function) {
283
+ callbacks.onLoaded?.(loader);
284
+ return loader;
285
+ }
286
+ try {
287
+ const ctor = (await loader())?.default;
288
+ if (ctor && !!ctor.isSupported) {
289
+ callbacks.onLoaded?.(ctor);
290
+ } else {
291
+ throw Error(
292
+ true ? "[vidstack] failed importing `hls.js`. Dynamic import returned invalid constructor." : ""
293
+ );
294
+ }
295
+ return ctor;
296
+ } catch (err) {
297
+ callbacks.onLoadError?.(err);
298
+ }
299
+ return void 0;
300
+ }
301
+ async function loadHLSScript(src, callbacks = {}) {
302
+ if (!isString(src)) return void 0;
303
+ callbacks.onLoadStart?.();
304
+ try {
305
+ await loadScript(src);
306
+ if (!isFunction(window.Hls)) {
307
+ throw Error(
308
+ true ? "[vidstack] failed loading `hls.js`. Could not find a valid `Hls` constructor on window" : ""
309
+ );
310
+ }
311
+ const ctor = window.Hls;
312
+ callbacks.onLoaded?.(ctor);
313
+ return ctor;
314
+ } catch (err) {
315
+ callbacks.onLoadError?.(err);
316
+ }
317
+ return void 0;
318
+ }
319
+
320
+ const JS_DELIVR_CDN = "https://cdn.jsdelivr.net";
321
+ class HLSProvider extends VideoProvider {
322
+ $$PROVIDER_TYPE = "HLS";
323
+ #ctor = null;
324
+ #controller = new HLSController(this.video, this.ctx);
325
+ /**
326
+ * The `hls.js` constructor.
327
+ */
328
+ get ctor() {
329
+ return this.#ctor;
330
+ }
331
+ /**
332
+ * The current `hls.js` instance.
333
+ */
334
+ get instance() {
335
+ return this.#controller.instance;
336
+ }
337
+ /**
338
+ * Whether `hls.js` is supported in this environment.
339
+ */
340
+ static supported = isHLSSupported();
341
+ get type() {
342
+ return "hls";
343
+ }
344
+ get canLiveSync() {
345
+ return true;
346
+ }
347
+ #library = `${JS_DELIVR_CDN}/npm/hls.js@^1.5.0/dist/hls${".js" }`;
348
+ /**
349
+ * The `hls.js` configuration object.
350
+ *
351
+ * @see {@link https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning}
352
+ */
353
+ get config() {
354
+ return this.#controller.config;
355
+ }
356
+ set config(config) {
357
+ this.#controller.config = config;
358
+ }
359
+ /**
360
+ * The `hls.js` constructor (supports dynamic imports) or a URL of where it can be found.
361
+ *
362
+ * @defaultValue `https://cdn.jsdelivr.net/npm/hls.js@^1.0.0/dist/hls.min.js`
363
+ */
364
+ get library() {
365
+ return this.#library;
366
+ }
367
+ set library(library) {
368
+ this.#library = library;
369
+ }
370
+ preconnect() {
371
+ if (!isString(this.#library)) return;
372
+ preconnect(this.#library);
373
+ }
374
+ setup() {
375
+ super.setup();
376
+ new HLSLibLoader(this.#library, this.ctx, (ctor) => {
377
+ this.#ctor = ctor;
378
+ this.#controller.setup(ctor);
379
+ this.ctx.notify("provider-setup", this);
380
+ const src = peek(this.ctx.$state.source);
381
+ if (src) this.loadSource(src);
382
+ });
383
+ }
384
+ async loadSource(src, preload) {
385
+ if (!isString(src.src)) {
386
+ this.removeSource();
387
+ return;
388
+ }
389
+ this.media.preload = preload || "";
390
+ this.appendSource(src, "application/x-mpegurl");
391
+ this.#controller.loadSource(src);
392
+ this.currentSrc = src;
393
+ }
394
+ /**
395
+ * The given callback is invoked when a new `hls.js` instance is created and right before it's
396
+ * attached to media.
397
+ */
398
+ onInstance(callback) {
399
+ const instance = this.#controller.instance;
400
+ if (instance) callback(instance);
401
+ return this.#controller.onInstance(callback);
402
+ }
403
+ destroy() {
404
+ this.#controller.destroy();
405
+ }
406
+ }
407
+
408
+ export { HLSProvider };