@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,393 @@
1
+ import { loadScript, preconnect } from '../chunks/vidstack-CTojmhKq.js';
2
+ import { IS_CHROME, isHLSSupported } from '../chunks/vidstack-xMS8dnYq.js';
3
+ import { VideoProvider } from './vidstack-video.js';
4
+ import { peek, listenEvent, effect, DOMEvent, isString, camelToKebabCase, isUndefined, isFunction } from '../chunks/vidstack-BGSTndAW.js';
5
+ import { QualitySymbol } from '../chunks/vidstack-B01xzxC4.js';
6
+ import { TextTrack, TextTrackSymbol } from '../chunks/vidstack-Cm6_unwd.js';
7
+ import { ListSymbol } from '../chunks/vidstack-D5EzK014.js';
8
+ import { RAFLoop } from '../chunks/vidstack-DqAw8m9J.js';
9
+ import { coerceToError } from '../chunks/vidstack-C9vIqaYT.js';
10
+ import './vidstack-html.js';
11
+ import '../chunks/vidstack-Dihypf8P.js';
12
+ import '../chunks/vidstack-Bq6c3Bam.js';
13
+ import '../chunks/vidstack-nLyr4NEP.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
+ if (data.fatal) {
162
+ switch (data.type) {
163
+ case "mediaError":
164
+ this.#instance?.recoverMediaError();
165
+ break;
166
+ default:
167
+ this.#onFatalError(data.error);
168
+ break;
169
+ }
170
+ }
171
+ }
172
+ #onFatalError(error) {
173
+ this.#ctx.notify("error", {
174
+ message: error.message,
175
+ code: 1,
176
+ error
177
+ });
178
+ }
179
+ #enableAutoQuality() {
180
+ if (this.#instance) this.#instance.currentLevel = -1;
181
+ }
182
+ #onUserQualityChange() {
183
+ const { qualities } = this.#ctx;
184
+ if (!this.#instance || qualities.auto) return;
185
+ this.#instance[qualities.switch + "Level"] = qualities.selectedIndex;
186
+ if (IS_CHROME) {
187
+ this.#video.currentTime = this.#video.currentTime;
188
+ }
189
+ }
190
+ #onUserAudioChange() {
191
+ const { audioTracks } = this.#ctx;
192
+ if (this.#instance && this.#instance.audioTrack !== audioTracks.selectedIndex) {
193
+ this.#instance.audioTrack = audioTracks.selectedIndex;
194
+ }
195
+ }
196
+ onInstance(callback) {
197
+ this.#callbacks.add(callback);
198
+ return () => this.#callbacks.delete(callback);
199
+ }
200
+ loadSource(src) {
201
+ if (!isString(src.src)) return;
202
+ this.#instance?.loadSource(src.src);
203
+ }
204
+ destroy() {
205
+ this.#instance?.destroy();
206
+ this.#instance = null;
207
+ this.#stopLiveSync?.();
208
+ this.#stopLiveSync = null;
209
+ }
210
+ }
211
+
212
+ class HLSLibLoader {
213
+ #lib;
214
+ #ctx;
215
+ #callback;
216
+ constructor(lib, ctx, callback) {
217
+ this.#lib = lib;
218
+ this.#ctx = ctx;
219
+ this.#callback = callback;
220
+ this.#startLoading();
221
+ }
222
+ async #startLoading() {
223
+ const callbacks = {
224
+ onLoadStart: this.#onLoadStart.bind(this),
225
+ onLoaded: this.#onLoaded.bind(this),
226
+ onLoadError: this.#onLoadError.bind(this)
227
+ };
228
+ let ctor = await loadHLSScript(this.#lib, callbacks);
229
+ if (isUndefined(ctor) && !isString(this.#lib)) ctor = await importHLS(this.#lib, callbacks);
230
+ if (!ctor) return null;
231
+ if (!ctor.isSupported()) {
232
+ const message = "[vidstack] `hls.js` is not supported in this environment";
233
+ this.#ctx.player.dispatch(new DOMEvent("hls-unsupported"));
234
+ this.#ctx.notify("error", { message, code: 4 });
235
+ return null;
236
+ }
237
+ return ctor;
238
+ }
239
+ #onLoadStart() {
240
+ this.#ctx.player.dispatch(new DOMEvent("hls-lib-load-start"));
241
+ }
242
+ #onLoaded(ctor) {
243
+ this.#ctx.player.dispatch(
244
+ new DOMEvent("hls-lib-loaded", {
245
+ detail: ctor
246
+ })
247
+ );
248
+ this.#callback(ctor);
249
+ }
250
+ #onLoadError(e) {
251
+ const error = coerceToError(e);
252
+ this.#ctx.player.dispatch(
253
+ new DOMEvent("hls-lib-load-error", {
254
+ detail: error
255
+ })
256
+ );
257
+ this.#ctx.notify("error", {
258
+ message: error.message,
259
+ code: 4,
260
+ error
261
+ });
262
+ }
263
+ }
264
+ async function importHLS(loader, callbacks = {}) {
265
+ if (isUndefined(loader)) return void 0;
266
+ callbacks.onLoadStart?.();
267
+ if (loader.prototype && loader.prototype !== Function) {
268
+ callbacks.onLoaded?.(loader);
269
+ return loader;
270
+ }
271
+ try {
272
+ const ctor = (await loader())?.default;
273
+ if (ctor && !!ctor.isSupported) {
274
+ callbacks.onLoaded?.(ctor);
275
+ } else {
276
+ throw Error(
277
+ false ? "[vidstack] failed importing `hls.js`. Dynamic import returned invalid constructor." : ""
278
+ );
279
+ }
280
+ return ctor;
281
+ } catch (err) {
282
+ callbacks.onLoadError?.(err);
283
+ }
284
+ return void 0;
285
+ }
286
+ async function loadHLSScript(src, callbacks = {}) {
287
+ if (!isString(src)) return void 0;
288
+ callbacks.onLoadStart?.();
289
+ try {
290
+ await loadScript(src);
291
+ if (!isFunction(window.Hls)) {
292
+ throw Error(
293
+ false ? "[vidstack] failed loading `hls.js`. Could not find a valid `Hls` constructor on window" : ""
294
+ );
295
+ }
296
+ const ctor = window.Hls;
297
+ callbacks.onLoaded?.(ctor);
298
+ return ctor;
299
+ } catch (err) {
300
+ callbacks.onLoadError?.(err);
301
+ }
302
+ return void 0;
303
+ }
304
+
305
+ const JS_DELIVR_CDN = "https://cdn.jsdelivr.net";
306
+ class HLSProvider extends VideoProvider {
307
+ $$PROVIDER_TYPE = "HLS";
308
+ #ctor = null;
309
+ #controller = new HLSController(this.video, this.ctx);
310
+ /**
311
+ * The `hls.js` constructor.
312
+ */
313
+ get ctor() {
314
+ return this.#ctor;
315
+ }
316
+ /**
317
+ * The current `hls.js` instance.
318
+ */
319
+ get instance() {
320
+ return this.#controller.instance;
321
+ }
322
+ /**
323
+ * Whether `hls.js` is supported in this environment.
324
+ */
325
+ static supported = isHLSSupported();
326
+ get type() {
327
+ return "hls";
328
+ }
329
+ get canLiveSync() {
330
+ return true;
331
+ }
332
+ #library = `${JS_DELIVR_CDN}/npm/hls.js@^1.5.0/dist/hls${".min.js"}`;
333
+ /**
334
+ * The `hls.js` configuration object.
335
+ *
336
+ * @see {@link https://github.com/video-dev/hls.js/blob/master/docs/API.md#fine-tuning}
337
+ */
338
+ get config() {
339
+ return this.#controller.config;
340
+ }
341
+ set config(config) {
342
+ this.#controller.config = config;
343
+ }
344
+ /**
345
+ * The `hls.js` constructor (supports dynamic imports) or a URL of where it can be found.
346
+ *
347
+ * @defaultValue `https://cdn.jsdelivr.net/npm/hls.js@^1.0.0/dist/hls.min.js`
348
+ */
349
+ get library() {
350
+ return this.#library;
351
+ }
352
+ set library(library) {
353
+ this.#library = library;
354
+ }
355
+ preconnect() {
356
+ if (!isString(this.#library)) return;
357
+ preconnect(this.#library);
358
+ }
359
+ setup() {
360
+ super.setup();
361
+ new HLSLibLoader(this.#library, this.ctx, (ctor) => {
362
+ this.#ctor = ctor;
363
+ this.#controller.setup(ctor);
364
+ this.ctx.notify("provider-setup", this);
365
+ const src = peek(this.ctx.$state.source);
366
+ if (src) this.loadSource(src);
367
+ });
368
+ }
369
+ async loadSource(src, preload) {
370
+ if (!isString(src.src)) {
371
+ this.removeSource();
372
+ return;
373
+ }
374
+ this.media.preload = preload || "";
375
+ this.appendSource(src, "application/x-mpegurl");
376
+ this.#controller.loadSource(src);
377
+ this.currentSrc = src;
378
+ }
379
+ /**
380
+ * The given callback is invoked when a new `hls.js` instance is created and right before it's
381
+ * attached to media.
382
+ */
383
+ onInstance(callback) {
384
+ const instance = this.#controller.instance;
385
+ if (instance) callback(instance);
386
+ return this.#controller.onInstance(callback);
387
+ }
388
+ destroy() {
389
+ this.#controller.destroy();
390
+ }
391
+ }
392
+
393
+ export { HLSProvider };