@banou/media-player 0.8.21 → 0.10.0

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.
@@ -32,151 +32,194 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
32
32
  } catch {}
33
33
  })
34
34
  };
35
- }, s = -1, c = (e, t) => e.createEvent(t), l = (e) => e === void 0 ? void 0 : new URL(e, document.baseURI).toString(), u = (e) => new Date(e).toISOString().slice(11, 22), d = 1, f = (e) => new Map(r(e).styles.style.map((e, t) => [e.Name, t + d])), p = (e, t) => {
35
+ }, s = -1, c = (e) => e === void 0 ? void 0 : new URL(e, document.baseURI).toString(), l = (e) => new Date(e).toISOString().slice(11, 22), u = 1, d = (e) => new Map(r(e).styles.style.map((e, t) => [e.Name, t + u])), f = (e, t) => {
36
36
  let n = t.replace(/^\*+/, ""), r = n.toLowerCase() === "default" ? "Default" : n;
37
37
  return e.styles.get(r) ?? e.styles.get("Default") ?? 0;
38
- }, m = (e) => {
38
+ }, p = (e) => {
39
39
  let t = e.content.match(/\r?\n\[Events\]\r?\nFormat: (.*)/)?.[0];
40
40
  return t ? {
41
41
  type: "header",
42
42
  streamIndex: e.streamIndex,
43
43
  content: e.content,
44
44
  eventsContent: t,
45
- styles: f(e.content)
45
+ styles: d(e.content)
46
46
  } : (console.warn(`subtitle stream ${e.streamIndex} has no Events format, ignoring the track`), null);
47
- }, h = (e, t) => {
48
- let [n, i] = t.content.split(","), a = Number(n), o = `Dialogue: ${i},${u(t.start)},${u(t.end)},${t.content.replace(`${a},${i},`, "")}`, s = r(`${e.eventsContent}\r\n${o}`).events.dialogue[0];
47
+ }, m = (e, t) => {
48
+ let [n, i] = t.content.split(","), a = Number(n), o = `Dialogue: ${i},${l(t.start)},${l(t.end)},${t.content.replace(`${a},${i},`, "")}`, s = r(`${e.eventsContent}\r\n${o}`).events.dialogue[0];
49
49
  if (!s) throw Error("dialogue event is undefined");
50
50
  return {
51
51
  type: "dialogue",
52
52
  streamIndex: t.streamIndex,
53
53
  index: a,
54
54
  assEvent: {
55
- ...s,
56
- Style: p(e, s.Style),
57
- Effect: s.Effect ?? "",
55
+ Name: s.Name ?? "",
56
+ Effect: s.Effect?.name ?? "",
57
+ Layer: s.Layer,
58
+ MarginL: s.MarginL,
59
+ MarginR: s.MarginR,
60
+ MarginV: s.MarginV,
61
+ Style: f(e, s.Style),
58
62
  Text: s.Text.raw,
59
- Duration: (s.End - s.Start) * 1e3,
60
63
  Start: s.Start * 1e3,
61
- End: s.End * 1e3,
62
- ReadOrder: a,
63
- _index: a
64
+ Duration: (s.End - s.Start) * 1e3,
65
+ ReadOrder: a
64
66
  }
65
67
  };
66
- }, g = (e) => {
67
- let { video: t, canvas: r, workerUrl: i } = e, a = l(e.wasmUrl), o = l(e.legacyWasmUrl), s = l(e.defaultFontUrl), u, d = [], f = /* @__PURE__ */ new Map(), p = [], g = /* @__PURE__ */ new Map(), _, v = e.onStreams, ee = setInterval(() => {
68
- u?.setCurrentTime(t.paused, t.currentTime, t.playbackRate);
69
- }, 100), y = () => u?.setRate(t.playbackRate), b = (e) => {
70
- u = new n({
71
- onDemandRender: !1,
72
- video: t,
73
- canvas: r,
74
- subContent: e.content,
75
- workerUrl: i,
76
- modernWasmUrl: a,
77
- ...o ? { wasmUrl: o } : {},
78
- fonts: d.map(([, e]) => e),
79
- availableFonts: {
80
- ...Object.fromEntries(d),
81
- ...s ? { "liberation sans": s } : {}
82
- }
83
- }), t.removeEventListener("ratechange", u._boundSetRate), t.addEventListener("ratechange", y);
68
+ }, h = (e) => {
69
+ let { video: t, container: r, workerUrl: i } = e, a = c(e.wasmUrl), o = c(e.legacyWasmUrl), s = c(e.defaultFontUrl), l, u = [], d = /* @__PURE__ */ new Map(), f = [], h = /* @__PURE__ */ new Map(), g, _ = e.onStreams, v = !1, y = (e) => {
70
+ console.warn("the subtitle renderer failed; the file plays without subtitles", e);
71
+ }, b = (e) => {
72
+ let t = l;
73
+ t && t.ready.then(() => l === t ? e(t.renderer) : void 0).catch(y);
74
+ }, x = !1, S = () => {
75
+ x || (x = !0, queueMicrotask(() => {
76
+ x = !1;
77
+ let e = l;
78
+ !e || !t.videoWidth || e.ready.then(() => {
79
+ if (l === e) return e.manualRender({
80
+ expectedDisplayTime: performance.now(),
81
+ width: t.videoWidth,
82
+ height: t.videoHeight,
83
+ mediaTime: t.currentTime
84
+ }, !0);
85
+ }).catch(y);
86
+ }));
87
+ }, C = [
88
+ "loadedmetadata",
89
+ "seeked",
90
+ "pause"
91
+ ], w = () => S(), T = (e) => {
92
+ let c = document.createElement("canvas");
93
+ r.append(c);
94
+ try {
95
+ l = new n({
96
+ video: t,
97
+ canvas: c,
98
+ subContent: e.content,
99
+ workerUrl: i,
100
+ modernWasmUrl: a,
101
+ ...o ? { wasmUrl: o } : {},
102
+ fonts: u.map(([, e]) => e),
103
+ availableFonts: {
104
+ ...Object.fromEntries(u),
105
+ ...s ? { "liberation sans": s } : {}
106
+ },
107
+ queryFonts: !1
108
+ });
109
+ } catch (e) {
110
+ c.remove(), y(e);
111
+ return;
112
+ }
113
+ l.ready.catch(y);
114
+ for (let e of C) t.addEventListener(e, w);
115
+ s && b((e) => {
116
+ Promise.resolve(e.addFonts([s])).then(S, y);
117
+ }), S();
84
118
  };
85
119
  return {
86
120
  pushAttachments: (e) => {
87
- d = [...d, ...e.map((e) => [e.filename, new Uint8Array(e.data)])];
121
+ u = [...u, ...e.map((e) => [e.filename, new Uint8Array(e.data)])];
88
122
  },
89
123
  pushFragments: (e) => {
90
- for (let t of e) if (t.type === "header") {
91
- if (f.has(t.streamIndex)) continue;
92
- let e = m(t);
124
+ let t = [];
125
+ for (let n of e) if (n.type === "header") {
126
+ if (d.has(n.streamIndex)) continue;
127
+ let e = p(n);
93
128
  if (!e) continue;
94
- f.set(t.streamIndex, e), p.push({
95
- streamIndex: t.streamIndex,
96
- title: t.title,
97
- language: t.language
98
- }), v?.([...p]), _ === void 0 && (_ = t.streamIndex), u || b(e);
129
+ d.set(n.streamIndex, e), f.push({
130
+ streamIndex: n.streamIndex,
131
+ title: n.title,
132
+ language: n.language
133
+ }), _?.([...f]), g === void 0 && (g = n.streamIndex), !l && !v && T(e);
99
134
  } else {
100
- let e = f.get(t.streamIndex);
135
+ let e = d.get(n.streamIndex);
101
136
  if (!e) continue;
102
- let n = g.get(t.streamIndex);
103
- n || (n = /* @__PURE__ */ new Map(), g.set(t.streamIndex, n));
104
- let r = h(e, t);
105
- if (n.has(r.index)) continue;
106
- n.set(r.index, r), _ === t.streamIndex && u && c(u, r.assEvent);
137
+ let r = h.get(n.streamIndex);
138
+ r || (r = /* @__PURE__ */ new Map(), h.set(n.streamIndex, r));
139
+ let i = m(e, n);
140
+ if (r.has(i.index)) continue;
141
+ r.set(i.index, i), g === n.streamIndex && t.push(i.assEvent);
107
142
  }
143
+ t.length && (b((e) => Promise.all(t.map((t) => e.createEvent(t)))), S());
108
144
  },
109
145
  selectStream: (e) => {
110
- let n = e ?? -1;
111
- if (n === _ || !u) return;
112
- _ = n, u.freeTrack();
113
- let r = f.get(n);
114
- if (r) {
115
- u.setTrack(r.content);
116
- for (let e of g.get(n)?.values() ?? []) c(u, e.assEvent);
117
- u.setCurrentTime(t.paused, t.currentTime, t.playbackRate);
118
- }
146
+ let t = e ?? -1;
147
+ if (t === g || !l) return;
148
+ g = t;
149
+ let n = d.get(t), r = [...h.get(t)?.values() ?? []].map((e) => e.assEvent);
150
+ b((e) => {
151
+ let t = [e.freeTrack()];
152
+ if (n) {
153
+ t.push(e.setTrack(n.content));
154
+ for (let n of r) t.push(e.createEvent(n));
155
+ }
156
+ return Promise.all(t);
157
+ }), S();
119
158
  },
120
- getStreams: () => [...p],
121
- getSelectedStream: () => _,
159
+ getStreams: () => [...f],
160
+ getSelectedStream: () => g,
122
161
  setOnStreams: (e) => {
123
- v = e;
162
+ _ = e;
124
163
  },
125
164
  destroy: () => {
126
- clearInterval(ee), t.removeEventListener("ratechange", y), u?.destroy(), u = void 0;
165
+ v = !0;
166
+ let e = l;
167
+ l = void 0;
168
+ for (let e of C) t.removeEventListener(e, w);
169
+ e?.destroy().catch(() => {});
127
170
  }
128
171
  };
129
- }, _ = class extends Error {
172
+ }, g = class extends Error {
130
173
  mediaElement = !0;
131
174
  constructor(e, t) {
132
175
  super(e, t), this.name = "MediaElementError";
133
176
  }
134
- }, v = (e) => !!e && typeof e == "object" && e.mediaElement === !0, ee = -20, y = 60, b = 30, x = -5, S = 20, C = 5, w = 15e3, T = 1, E = 3, D = 12, O = 200, k = 250, A = 25e5, j = (e) => {
177
+ }, _ = (e) => !!e && typeof e == "object" && e.mediaElement === !0, v = -20, y = 60, b = 30, x = -5, S = 20, C = 5, w = 15e3, T = 1, E = 3, ee = 12, D = 200, O = 250, k = 25e5, A = (e) => {
135
178
  let { worker: t } = e, n = setTimeout(() => t.terminate(), 2e3);
136
179
  e.destroy().catch(() => {}).finally(() => {
137
180
  clearTimeout(n), t.terminate();
138
181
  });
139
182
  }, te = async (t) => {
140
- let { videoElement: n, canvasElement: r, read: a, length: s, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize: m = A, audioStreamIndex: h, onReady: v, onError: te, onRecovered: ne, onSeek: M, onSubtitleStreams: re, onAudioStreams: ie } = t, N = await e({
183
+ let { videoElement: n, subtitleContainer: r, read: a, length: s, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize: m = k, audioStreamIndex: _, onReady: te, onError: ne, onRecovered: re, onSeek: j, onSubtitleStreams: ie, onAudioStreams: ae } = t, M = await e({
141
184
  publicPath: c,
142
185
  workerUrl: l,
143
186
  workerOptions: { type: "module" },
144
187
  bufferSize: m,
145
188
  length: s,
146
- audioStreamIndex: h,
189
+ audioStreamIndex: _,
147
190
  read: a
148
- }), P = [], F = !1, ae = () => {
149
- if (!F) {
150
- F = !0;
151
- for (let e of [...P].reverse()) try {
191
+ }), N = [], P = !1, F = () => {
192
+ if (!P) {
193
+ P = !0;
194
+ for (let e of [...N].reverse()) try {
152
195
  e();
153
196
  } catch {}
154
197
  }
155
198
  };
156
- P.push(() => j(N));
199
+ N.push(() => A(M));
157
200
  try {
158
- let e = await N.init(), t = e.audioStreams ?? [], a = t.some((e) => e.streamIndex === h) ? h : t[0]?.streamIndex ?? -1;
159
- ie?.(t, a);
160
- let s = g({
201
+ let e = await M.init(), t = e.audioStreams ?? [], a = t.some((e) => e.streamIndex === _) ? _ : t[0]?.streamIndex ?? -1;
202
+ ae?.(t, a);
203
+ let s = h({
161
204
  video: n,
162
- canvas: r,
205
+ container: r,
163
206
  workerUrl: u,
164
207
  wasmUrl: d,
165
208
  legacyWasmUrl: f,
166
209
  defaultFontUrl: p,
167
- onStreams: re
210
+ onStreams: ie
168
211
  });
169
- if (P.push(() => s.destroy()), e.attachments?.length && s.pushAttachments(e.attachments), !e.info.output.videoMimeType) throw Error("The video codec in this file could not be identified");
212
+ if (N.push(() => s.destroy()), e.attachments?.length && s.pushAttachments(e.attachments), !e.info.output.videoMimeType) throw Error("The video codec in this file could not be identified");
170
213
  let c = [e.info.output.videoMimeType, e.info.output.audioMimeType].filter(Boolean).join(","), l = `video/mp4; codecs="${c}"`;
171
214
  if (!MediaSource.isTypeSupported(l)) throw Error(`This browser cannot play the codecs in this file: ${c}`);
172
- let m = new MediaSource(), A = URL.createObjectURL(m);
173
- P.push(() => URL.revokeObjectURL(A)), n.src = A, P.push(() => {
215
+ let m = new MediaSource(), k = URL.createObjectURL(m);
216
+ N.push(() => URL.revokeObjectURL(k)), n.src = k, N.push(() => {
174
217
  try {
175
218
  n.pause();
176
219
  } catch {}
177
220
  n.removeAttribute("src"), n.load();
178
221
  });
179
- let j = await new Promise((t, n) => {
222
+ let A = await new Promise((t, n) => {
180
223
  let r = setTimeout(() => {
181
224
  i(), n(/* @__PURE__ */ Error("The MediaSource never opened"));
182
225
  }, w), i = () => {
@@ -194,139 +237,139 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
194
237
  i(), n(/* @__PURE__ */ Error("The MediaSource closed before a SourceBuffer could be created"));
195
238
  };
196
239
  m.addEventListener("sourceopen", a, { once: !0 }), m.addEventListener("sourceclose", o, { once: !0 }), m.addEventListener("error", o, { once: !0 });
197
- }), { appendBuffer: I, unbufferRange: oe, updateTimestampOffset: se, endOfStream: ce } = o(j, m);
198
- await I(e.data), e.subtitles?.length && s.pushFragments(e.subtitles), v?.();
199
- let L = !1, R = !1, z = 0, B, le = () => B ?? n.currentTime, V = !1, H = 0, U = 0, W = null, G = 0, K = 0, q = !1, ue = 0, J = (e, t, n = !1) => {
240
+ }), { appendBuffer: I, unbufferRange: L, updateTimestampOffset: oe, endOfStream: se } = o(A, m);
241
+ await I(e.data), e.subtitles?.length && s.pushFragments(e.subtitles), te?.();
242
+ let R = !1, z = !1, B = 0, V, ce = () => V ?? n.currentTime, H = !1, U = 0, W = 0, G = null, K = 0, le = 0, q = !1, ue = 0, J = (e, t, n = !1) => {
200
243
  let r = e?.message === "Cancelled";
201
- t && r || (console.error(e), !(q && !n) && (q = !0, te?.(r ? Error("Reading the video file failed", { cause: e }) : e)));
244
+ t && r || (console.error(e), !(q && !n) && (q = !0, ne?.(r ? Error("Reading the video file failed", { cause: e }) : e)));
202
245
  }, de = async (e = !1) => {
203
- if (z > 0 && !e) return;
204
- let t = n.currentTime, r = e ? x : ee, a = e ? S : y;
205
- for (let { start: e, end: n } of i(j)) e < t + r && await oe(e, t + r), n > t + a && await oe(t + a, n);
246
+ if (B > 0 && !e) return;
247
+ let t = n.currentTime, r = e ? x : v, a = e ? S : y;
248
+ for (let { start: e, end: n } of i(A)) e < t + r && await L(e, t + r), n > t + a && await L(t + a, n);
206
249
  }, fe = () => {
207
- let e = i(j);
250
+ let e = i(A);
208
251
  if (!e.length) return !0;
209
- let t = le(), n = e.find((e) => e.start <= t + T && t < e.end);
252
+ let t = ce(), n = e.find((e) => e.start <= t + T && t < e.end);
210
253
  return n && n.end >= t + y ? !1 : !n || n.end < t + b;
211
254
  }, pe = () => {
212
255
  let e = n.currentTime;
213
- return i(j).find((t) => t.start <= e + T && e < t.end);
256
+ return i(A).find((t) => t.start <= e + T && e < t.end);
214
257
  }, me = () => {
215
258
  let e = pe();
216
- return !!e && e.end >= K - .1;
259
+ return !!e && e.end >= le - .1;
217
260
  }, he = () => {
218
- let e = i(j).map((e) => e.end);
219
- e.length && (K = Math.max(K, ...e));
261
+ let e = i(A).map((e) => e.end);
262
+ e.length && (le = Math.max(le, ...e));
220
263
  }, Y = async (e) => {
221
- R = !0, W = null, G = 0, ue = e;
222
- let t = ++U;
264
+ z = !0, G = null, K = 0, ue = e;
265
+ let t = ++W;
223
266
  try {
224
- let { data: n, pts: r, subtitles: i, finished: a } = await N.seek(e);
225
- if (F || t !== U || (a && (V = !0), i?.length && s.pushFragments(i), await se(r), F || t !== U)) return;
267
+ let { data: n, pts: r, subtitles: i, finished: a } = await M.seek(e);
268
+ if (P || t !== W || (a && (H = !0), i?.length && s.pushFragments(i), await oe(r), P || t !== W)) return;
226
269
  n.byteLength && (await I(n), he());
227
270
  } catch (e) {
228
- J(e, F || t !== U);
271
+ J(e, P || t !== W);
229
272
  } finally {
230
- t === U && (R = !1);
273
+ t === W && (z = !1);
231
274
  }
232
275
  }, ge = async () => {
233
- let e = W;
276
+ let e = G;
234
277
  if (e) try {
235
- await I(e), he(), W === e && (W = null, G = 0);
278
+ await I(e), he(), G === e && (G = null, K = 0);
236
279
  } catch (t) {
237
- if (W !== e) return;
280
+ if (G !== e) return;
238
281
  if (t?.name === "QuotaExceededError") {
239
282
  let t = await de(!0).then(() => !0, () => !1);
240
- if (W !== e) return;
283
+ if (G !== e) return;
241
284
  if (t) {
242
- V = !1, await Y(pe()?.end ?? n.currentTime);
285
+ H = !1, await Y(pe()?.end ?? n.currentTime);
243
286
  return;
244
287
  }
245
288
  }
246
- if (G += 1, G < C) return;
247
- throw W = null, t;
289
+ if (K += 1, K < C) return;
290
+ throw G = null, t;
248
291
  }
249
292
  }, _e = async () => {
250
- if (L || R || $ !== void 0 || F || !W && (V || !fe())) return;
251
- let e = ++H, t = U, n = () => F || e !== H || t !== U;
252
- L = !0;
293
+ if (R || z || $ !== void 0 || P || !G && (H || !fe())) return;
294
+ let e = ++U, t = W, n = () => P || e !== U || t !== W;
295
+ R = !0;
253
296
  try {
254
- if (!W) {
255
- let { data: e, subtitles: t, finished: r } = await N.read();
256
- if (n() || (r && (V = !0), t?.length && s.pushFragments(t), !e.byteLength)) return;
257
- W = e, G = 0;
297
+ if (!G) {
298
+ let { data: e, subtitles: t, finished: r } = await M.read();
299
+ if (n() || (r && (H = !0), t?.length && s.pushFragments(t), !e.byteLength)) return;
300
+ G = e, K = 0;
258
301
  }
259
- await ge(), !n() && q && (q = !1, ne?.());
302
+ await ge(), !n() && q && (q = !1, re?.());
260
303
  } catch (e) {
261
304
  J(e, n());
262
305
  } finally {
263
- e === H && (L = !1);
306
+ e === U && (R = !1);
264
307
  }
265
- }, ve = (e) => e >= ue && !!pe(), ye = (e) => i(j).some((t) => t.start <= e + T && e < t.end), X = (e) => {
266
- let t = i(j).find((t) => t.start <= e + T && e < t.end);
308
+ }, ve = (e) => e >= ue && !!pe(), ye = (e) => i(A).some((t) => t.start <= e + T && e < t.end), X = (e) => {
309
+ let t = i(A).find((t) => t.start <= e + T && e < t.end);
267
310
  return t ? t.end - e : 0;
268
311
  }, be = async (e) => {
269
- if (!F && !(X(e) >= E)) {
270
- V = !1, z++, B = e;
312
+ if (!P && !(X(e) >= E)) {
313
+ H = !1, B++, V = e;
271
314
  try {
272
315
  ye(e) || await Y(e);
273
- let t = U;
274
- for (let n = 0; n < D && !(F || t !== U || V || X(e) >= E); n++) {
316
+ let t = W;
317
+ for (let n = 0; n < ee && !(P || t !== W || H || X(e) >= E); n++) {
275
318
  let t = X(e);
276
319
  if (await _e(), X(e) <= t) break;
277
320
  }
278
321
  } finally {
279
- z--, B === e && (B = void 0);
322
+ B--, V === e && (V = void 0);
280
323
  }
281
324
  }
282
325
  }, xe = 0, Z = null, Q, Se = (e) => {
283
326
  let t = performance.now(), n = t - xe;
284
- if (n >= O) {
285
- xe = t, Z = null, M?.(e);
327
+ if (n >= D) {
328
+ xe = t, Z = null, j?.(e);
286
329
  return;
287
330
  }
288
331
  Z = e, !Q && (Q = setTimeout(() => {
289
332
  Q = void 0;
290
333
  let e = Z;
291
- Z = null, !(e === null || F) && (xe = performance.now(), M?.(e));
292
- }, O - n));
334
+ Z = null, !(e === null || P) && (xe = performance.now(), j?.(e));
335
+ }, D - n));
293
336
  };
294
- P.push(() => {
337
+ N.push(() => {
295
338
  Q && clearTimeout(Q);
296
339
  });
297
340
  let Ce = 0, $;
298
- P.push(() => {
341
+ N.push(() => {
299
342
  $ && clearTimeout($);
300
343
  });
301
344
  let we = () => {
302
345
  let t = n.currentTime, r = e.info.input.duration || n.duration;
303
346
  r > 0 && Se(Math.min(Math.max(t / r, 0), 1));
304
- let i = performance.now(), a = i - Ce < k;
305
- if (Ce = i, !ve(t) && !(R && Math.abs(t - ue) < .001)) {
306
- if (V = !1, $ && clearTimeout($), !a) {
347
+ let i = performance.now(), a = i - Ce < O;
348
+ if (Ce = i, !ve(t) && !(z && Math.abs(t - ue) < .001)) {
349
+ if (H = !1, $ && clearTimeout($), !a) {
307
350
  $ = void 0, Y(t);
308
351
  return;
309
352
  }
310
353
  $ = setTimeout(() => {
311
- if ($ = void 0, F) return;
354
+ if ($ = void 0, P) return;
312
355
  let e = n.currentTime;
313
- ve(e) || (V = !1, Y(e));
314
- }, k);
356
+ ve(e) || (H = !1, Y(e));
357
+ }, O);
315
358
  }
316
359
  };
317
- n.addEventListener("seeking", we), P.push(() => n.removeEventListener("seeking", we));
360
+ n.addEventListener("seeking", we), N.push(() => n.removeEventListener("seeking", we));
318
361
  let Te = !1, Ee = () => {
319
362
  if (Te) return;
320
363
  Te = !0;
321
364
  let e = n.error;
322
- J(new _(`the media element failed: ${e?.message ?? "unknown"}`, { cause: e }), !1, !0);
365
+ J(new g(`the media element failed: ${e?.message ?? "unknown"}`, { cause: e }), !1, !0);
323
366
  };
324
- n.addEventListener("error", Ee), P.push(() => n.removeEventListener("error", Ee));
367
+ n.addEventListener("error", Ee), N.push(() => n.removeEventListener("error", Ee));
325
368
  let De = setInterval(() => {
326
- Te || n.error || (de().catch(() => {}), _e().catch((e) => J(e, !1)), V && !W && me() && m.readyState === "open" && ce().catch(() => {}));
369
+ Te || n.error || (de().catch(() => {}), _e().catch((e) => J(e, !1)), H && !G && me() && m.readyState === "open" && se().catch(() => {}));
327
370
  }, 100);
328
- return P.push(() => clearInterval(De)), {
329
- destroy: ae,
371
+ return N.push(() => clearInterval(De)), {
372
+ destroy: F,
330
373
  prepareSeek: be,
331
374
  videoElement: n,
332
375
  selectSubtitleStream: (e) => s.selectStream(e),
@@ -336,10 +379,10 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
336
379
  audioMimeType: e.info.output.audioMimeType
337
380
  };
338
381
  } catch (e) {
339
- throw ae(), e;
382
+ throw F(), e;
340
383
  }
341
- }, ne = 5, M = 500, re = 320, ie = 1e6, N = 3, P = 1e4, F = async (e) => {
342
- let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s = re } = e, c = await t({
384
+ }, ne = 5, re = 500, j = 320, ie = 1e6, ae = 3, M = 1e4, N = async (e) => {
385
+ let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s = j } = e, c = await t({
343
386
  publicPath: n,
344
387
  workerUrl: r,
345
388
  workerOptions: { type: "module" },
@@ -347,7 +390,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
347
390
  read: a
348
391
  });
349
392
  try {
350
- let t = await c.init(), n = t.duration, r = Math.max(e.interval ?? ne, n / M), a = [];
393
+ let t = await c.init(), n = t.duration, r = Math.max(e.interval ?? ne, n / re), a = [];
351
394
  for (let [e, o] of t.indexes.entries()) {
352
395
  let s = a.at(-1);
353
396
  s && o.timestamp - s.timestamp < r || a.push({
@@ -361,7 +404,14 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
361
404
  }
362
405
  for (let [e, t] of a.entries()) t.endTime = a[e + 1]?.timestamp ?? n;
363
406
  a.length > 1 && a.at(-1).timestamp > n - r * 2 && a.pop();
364
- let l = [], u = !1, d = Promise.resolve(), f = () => {
407
+ let l = [], u = !1, d = [], f = !1, p, m = () => {
408
+ let e = p;
409
+ if (e !== void 0) {
410
+ let t = d.findIndex(({ timestamp: t, endTime: n }) => t <= e && e < n);
411
+ if (t >= 0) return t;
412
+ }
413
+ return 0;
414
+ }, h = () => {
365
415
  let e = [];
366
416
  for (let [t, n] of l.entries()) {
367
417
  n.startTime - (e.at(-1)?.endTime ?? 0) > .01 && e.push({
@@ -382,84 +432,95 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
382
432
  startTime: t,
383
433
  endTime: n
384
434
  }), o(e);
385
- }, p = (e) => {
386
- e.done = !0, d = d.then(async () => {
387
- if (u) return;
388
- let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")), P))]), n = await createImageBitmap(new Blob([t], { type: "image/png" })), r = new OffscreenCanvas(s, Math.max(1, Math.round(n.height * (s / n.width))));
389
- r.getContext("2d").drawImage(n, 0, 0, r.width, r.height), n.close();
390
- let i = await r.convertToBlob({
391
- type: "image/webp",
392
- quality: .7
393
- });
394
- u || (l = [...l, {
395
- url: URL.createObjectURL(i),
396
- startTime: e.timestamp,
397
- endTime: e.endTime
398
- }].sort((e, t) => e.startTime - t.startTime), f());
399
- }).catch(() => {
400
- e.attempts += 1, e.done = e.attempts >= N;
435
+ }, g = async (e) => {
436
+ if (u) return;
437
+ let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")), M))]), n = await createImageBitmap(new Blob([t], { type: "image/png" })), r = new OffscreenCanvas(s, Math.max(1, Math.round(n.height * (s / n.width))));
438
+ r.getContext("2d").drawImage(n, 0, 0, r.width, r.height), n.close();
439
+ let i = await r.convertToBlob({
440
+ type: "image/webp",
441
+ quality: .7
442
+ });
443
+ u || (l = [...l, {
444
+ url: URL.createObjectURL(i),
445
+ startTime: e.timestamp,
446
+ endTime: e.endTime
447
+ }].sort((e, t) => e.startTime - t.startTime), h());
448
+ }, _ = () => {
449
+ if (f || u || !d.length) return;
450
+ let e = d.splice(m(), 1)[0];
451
+ f = !0, g(e).catch(() => {
452
+ e.attempts += 1, e.done = e.attempts >= ae;
453
+ }).finally(() => {
454
+ f = !1, _();
401
455
  });
456
+ }, v = (e) => {
457
+ e.done = !0, d.push(e), _();
402
458
  };
403
- return f(), {
459
+ return h(), {
404
460
  update: (e) => {
405
- if (!u) for (let t of a) t.done || (!e || e.some(([e, n]) => e <= t.startByte && t.endByte <= n)) && p(t);
461
+ if (!u) for (let t of a) t.done || (!e || e.some(([e, n]) => e <= t.startByte && t.endByte <= n)) && v(t);
462
+ },
463
+ prioritize: (e) => {
464
+ u || (p = e);
406
465
  },
407
466
  destroy: () => {
408
- u = !0;
467
+ u = !0, d.length = 0;
409
468
  for (let e of l) URL.revokeObjectURL(e.url);
410
- l = [], j(c);
469
+ l = [], A(c);
411
470
  }
412
471
  };
413
472
  } catch (e) {
414
- throw j(c), e;
473
+ throw A(c), e;
415
474
  }
416
- }, ae = 1280, I = 1920, oe = 250, se = 100, ce = () => typeof HTMLCanvasElement < "u" && "captureStream" in HTMLCanvasElement.prototype, L = () => typeof document < "u" && typeof HTMLVideoElement < "u" && typeof HTMLVideoElement.prototype.requestPictureInPicture == "function" && !!document.pictureInPictureEnabled, R = () => typeof HTMLVideoElement < "u" && "mozCaptureStream" in HTMLVideoElement.prototype, z = () => ce() ? L() ? "window" : R() ? "burn-in" : null : null, B = (e) => {
417
- let { video: t, canvas: n } = e, r = e.mode ?? z() ?? "window", i = e.maxWidth ?? (r === "burn-in" ? I : ae), a, o, s, c = !1, l = !1, u = !1, d = !1, f, p = () => r === "burn-in" ? !!a : !!a && document.pictureInPictureElement === a.mirror, m = (e, r) => {
418
- r.drawImage(t, 0, 0, e.width, e.height), n.width > 0 && n.height > 0 && r.drawImage(n, 0, 0, e.width, e.height);
475
+ }, P = 1280, F = 1920, I = 250, L = 100, oe = () => typeof HTMLCanvasElement < "u" && "captureStream" in HTMLCanvasElement.prototype, se = () => typeof document < "u" && typeof HTMLVideoElement < "u" && typeof HTMLVideoElement.prototype.requestPictureInPicture == "function" && !!document.pictureInPictureEnabled, R = () => typeof HTMLVideoElement < "u" && "mozCaptureStream" in HTMLVideoElement.prototype, z = () => oe() ? se() ? "window" : R() ? "burn-in" : null : null, B = (e) => {
476
+ let { video: t, subtitles: n } = e, r = e.mode ?? z() ?? "window", i = e.maxWidth ?? (r === "burn-in" ? F : P), a, o, s, c = !1, l = !1, u = !1, d = !1, f, p = () => r === "burn-in" ? !!a : !!a && document.pictureInPictureElement === a.mirror, m = (e, r) => {
477
+ r.drawImage(t, 0, 0, e.width, e.height);
478
+ let i = n.querySelector("canvas");
479
+ i && i.width > 0 && i.height > 0 && r.drawImage(i, 0, 0, e.width, e.height);
419
480
  }, h = () => {
420
481
  a && m(a.composite, a.context);
421
482
  }, g = "requestVideoFrameCallback" in t, _ = () => {
422
483
  h(), v();
423
484
  }, v = () => {
424
485
  d || !a || (o = g ? t.requestVideoFrameCallback(_) : requestAnimationFrame(_));
425
- }, ee = () => {
426
- o !== void 0 && (g ? t.cancelVideoFrameCallback(o) : cancelAnimationFrame(o)), s !== void 0 && clearInterval(s), o = void 0, s = void 0;
427
486
  }, y = () => {
428
- "mediaSession" in navigator && (navigator.mediaSession.playbackState = t.paused ? "paused" : "playing");
487
+ o !== void 0 && (g ? t.cancelVideoFrameCallback(o) : cancelAnimationFrame(o)), s !== void 0 && clearInterval(s), o = void 0, s = void 0;
429
488
  }, b = () => {
430
- c || l || !t.paused || t.play().catch(() => {});
489
+ "mediaSession" in navigator && (navigator.mediaSession.playbackState = t.paused ? "paused" : "playing");
431
490
  }, x = () => {
491
+ c || l || !t.paused || t.play().catch(() => {});
492
+ }, S = () => {
432
493
  c || l || (t.paused || t.pause(), r !== "burn-in" && (c = !0, a?.mirror.play().catch(() => {}).finally(() => {
433
494
  c = !1;
434
495
  })));
435
- }, S = () => {
436
- y(), a?.mirror.play().catch(() => {});
437
496
  }, C = () => {
438
- y(), r === "burn-in" && a?.mirror.pause();
497
+ b(), a?.mirror.play().catch(() => {});
439
498
  }, w = () => {
499
+ b(), r === "burn-in" && a?.mirror.pause();
500
+ }, T = () => {
440
501
  if (r !== "burn-in" || !a || !t.paused || l) return;
441
502
  l = !0;
442
503
  let { mirror: e } = a;
443
504
  h(), e.play().then(() => new Promise((e) => {
444
- setTimeout(e, se);
505
+ setTimeout(e, L);
445
506
  })).catch(() => {}).finally(() => {
446
507
  e.pause(), setTimeout(() => {
447
508
  l = !1;
448
- }, se);
509
+ }, L);
449
510
  });
450
- }, T = [["play", () => {
511
+ }, E = [["play", () => {
451
512
  t.play().catch(() => {});
452
- }], ["pause", () => t.pause()]], E = (e) => {
453
- if ("mediaSession" in navigator) for (let [t, n] of T) try {
513
+ }], ["pause", () => t.pause()]], ee = (e) => {
514
+ if ("mediaSession" in navigator) for (let [t, n] of E) try {
454
515
  navigator.mediaSession.setActionHandler(t, e ? n : null);
455
516
  } catch {}
456
517
  }, D = () => {
457
- if (ee(), E(!1), t.removeEventListener("play", S), t.removeEventListener("pause", C), t.removeEventListener("seeked", w), !a) {
518
+ if (y(), ee(!1), t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("seeked", T), !a) {
458
519
  f?.();
459
520
  return;
460
521
  }
461
522
  let { stream: e, mirror: n } = a;
462
- n.removeEventListener("play", b), n.removeEventListener("pause", x), n.removeEventListener("leavepictureinpicture", O);
523
+ n.removeEventListener("play", x), n.removeEventListener("pause", S), n.removeEventListener("leavepictureinpicture", O);
463
524
  for (let t of e.getTracks()) t.stop();
464
525
  n.remove(), a = void 0, f?.();
465
526
  }, O = () => D(), k = (e) => {
@@ -482,7 +543,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
482
543
  };
483
544
  if (a = f, u.srcObject = f.stream, (e.container ?? t.parentElement ?? document.body).appendChild(u), v(), s = setInterval(() => {
484
545
  t.paused && h();
485
- }, oe), u.play().catch(() => {}), u.readyState === 0 && await new Promise((e) => {
546
+ }, I), u.play().catch(() => {}), u.readyState === 0 && await new Promise((e) => {
486
547
  let t = () => {
487
548
  clearTimeout(n), e();
488
549
  }, n = setTimeout(t, 1e3);
@@ -491,7 +552,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
491
552
  u.remove();
492
553
  return;
493
554
  }
494
- if (u.addEventListener("play", b), u.addEventListener("pause", x), u.addEventListener("leavepictureinpicture", O), t.addEventListener("play", S), t.addEventListener("pause", C), t.addEventListener("seeked", w), E(!0), y(), r === "burn-in") {
555
+ if (u.addEventListener("play", x), u.addEventListener("pause", S), u.addEventListener("leavepictureinpicture", O), t.addEventListener("play", C), t.addEventListener("pause", w), t.addEventListener("seeked", T), ee(!0), b(), r === "burn-in") {
495
556
  t.paused && u.pause(), e.onBurnedInChange?.(!0);
496
557
  return;
497
558
  }
@@ -528,4 +589,4 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
528
589
  };
529
590
  };
530
591
  //#endregion
531
- export { _ as a, j as c, i as d, o as f, A as i, s as l, z as n, v as o, F as r, te as s, B as t, g as u };
592
+ export { g as a, A as c, i as d, o as f, k as i, s as l, z as n, _ as o, N as r, te as s, B as t, h as u };