@banou/media-player 0.8.12 → 0.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/engine/index.js +1 -1
- package/dist/engine/playback.d.ts +7 -0
- package/dist/{engine-Cownv8gD.js → engine-BUcS6UrE.js} +127 -116
- package/dist/index.js +282 -258
- package/dist/react/player.d.ts +1 -0
- package/dist/react/source-feature.d.ts +24 -0
- package/dist/react/video-player.d.ts +8 -0
- package/package.json +1 -1
- package/src/lib/engine/playback.ts +63 -0
- package/src/lib/react/components/control-bar.tsx +7 -3
- package/src/lib/react/components/progress-bar.tsx +7 -2
- package/src/lib/react/hooks/use-playback.ts +68 -2
- package/src/lib/react/source-feature.ts +13 -0
- package/src/lib/react/video-player.tsx +8 -0
package/dist/engine/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, r as c, s as l, t as u, u as d } from "../engine-
|
|
1
|
+
import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, r as c, s as l, t as u, u as d } from "../engine-BUcS6UrE.js";
|
|
2
2
|
export { i as DEFAULT_BUFFER_SIZE, e as MediaElementError, a as SUBTITLES_OFF, u as createPictureInPicture, d as createSubtitleRenderer, c as createThumbnailGenerator, n as getTimeRanges, s as isMediaElementError, o as pictureInPictureMode, l as startPlayback, t as terminateRemuxer, r as updateSourceBuffer };
|
|
@@ -30,6 +30,13 @@ export type PlaybackOptions = {
|
|
|
30
30
|
};
|
|
31
31
|
export type PlaybackController = {
|
|
32
32
|
destroy: () => void;
|
|
33
|
+
/**
|
|
34
|
+
* Get the data for a position in place BEFORE the playhead moves there.
|
|
35
|
+
*
|
|
36
|
+
* Resolves at once when that position already has data. The caller decides how long to wait,
|
|
37
|
+
* because this can take as long as a read, which over a torrent has no ceiling.
|
|
38
|
+
*/
|
|
39
|
+
prepareSeek: (time: number) => Promise<void>;
|
|
33
40
|
selectSubtitleStream: (streamIndex: number | undefined) => void;
|
|
34
41
|
/** Keyframe index of the input, which is what maps a downloaded byte range onto the timeline. */
|
|
35
42
|
indexes: MediaIndex[];
|
|
@@ -167,32 +167,32 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
167
167
|
constructor(e, t) {
|
|
168
168
|
super(e, t), this.name = "MediaElementError";
|
|
169
169
|
}
|
|
170
|
-
}, g = (e) => !!e && typeof e == "object" && e.mediaElement === !0, _ = -20, v = 60, y = 30, b = -5, x = 20,
|
|
170
|
+
}, g = (e) => !!e && typeof e == "object" && e.mediaElement === !0, _ = -20, v = 60, y = 30, b = -5, x = 20, ee = 5, te = 15e3, S = 1, C = 200, w = 250, T = 25e5, E = (e) => {
|
|
171
171
|
let { worker: t } = e, n = setTimeout(() => t.terminate(), 2e3);
|
|
172
172
|
e.destroy().catch(() => {}).finally(() => {
|
|
173
173
|
clearTimeout(n), t.terminate();
|
|
174
174
|
});
|
|
175
|
-
},
|
|
176
|
-
let { videoElement: n, canvasElement: r, read: i, length: o, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize: g =
|
|
175
|
+
}, D = async (t) => {
|
|
176
|
+
let { videoElement: n, canvasElement: r, read: i, length: o, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize: g = T, audioStreamIndex: D, onReady: O, onError: ne, onRecovered: re, onSeek: k, onSubtitleStreams: ie, onAudioStreams: ae } = t, A = await e({
|
|
177
177
|
publicPath: c,
|
|
178
178
|
workerUrl: l,
|
|
179
179
|
workerOptions: { type: "module" },
|
|
180
180
|
bufferSize: g,
|
|
181
181
|
length: o,
|
|
182
|
-
audioStreamIndex:
|
|
182
|
+
audioStreamIndex: D,
|
|
183
183
|
read: i
|
|
184
|
-
}),
|
|
185
|
-
if (!
|
|
186
|
-
|
|
187
|
-
for (let e of [...
|
|
184
|
+
}), j = [], M = !1, N = () => {
|
|
185
|
+
if (!M) {
|
|
186
|
+
M = !0;
|
|
187
|
+
for (let e of [...j].reverse()) try {
|
|
188
188
|
e();
|
|
189
189
|
} catch {}
|
|
190
190
|
}
|
|
191
191
|
};
|
|
192
|
-
|
|
192
|
+
j.push(() => E(A));
|
|
193
193
|
try {
|
|
194
|
-
let e = await
|
|
195
|
-
|
|
194
|
+
let e = await A.init(), t = e.audioStreams ?? [], i = t.some((e) => e.streamIndex === D) ? D : t[0]?.streamIndex ?? -1;
|
|
195
|
+
ae?.(t, i);
|
|
196
196
|
let o = m({
|
|
197
197
|
video: n,
|
|
198
198
|
canvas: r,
|
|
@@ -200,22 +200,22 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
200
200
|
wasmUrl: d,
|
|
201
201
|
legacyWasmUrl: f,
|
|
202
202
|
defaultFontUrl: p,
|
|
203
|
-
onStreams:
|
|
203
|
+
onStreams: ie
|
|
204
204
|
});
|
|
205
|
-
if (
|
|
205
|
+
if (j.push(() => o.destroy()), e.attachments?.length && o.pushAttachments(e.attachments), !e.info.output.videoMimeType) throw Error("The video codec in this file could not be identified");
|
|
206
206
|
let c = [e.info.output.videoMimeType, e.info.output.audioMimeType].filter(Boolean).join(","), l = `video/mp4; codecs="${c}"`;
|
|
207
207
|
if (!MediaSource.isTypeSupported(l)) throw Error(`This browser cannot play the codecs in this file: ${c}`);
|
|
208
|
-
let g = new MediaSource(),
|
|
209
|
-
|
|
208
|
+
let g = new MediaSource(), T = URL.createObjectURL(g);
|
|
209
|
+
j.push(() => URL.revokeObjectURL(T)), n.src = T, j.push(() => {
|
|
210
210
|
try {
|
|
211
211
|
n.pause();
|
|
212
212
|
} catch {}
|
|
213
213
|
n.removeAttribute("src"), n.load();
|
|
214
214
|
});
|
|
215
|
-
let
|
|
215
|
+
let E = await new Promise((t, n) => {
|
|
216
216
|
let r = setTimeout(() => {
|
|
217
217
|
i(), n(/* @__PURE__ */ Error("The MediaSource never opened"));
|
|
218
|
-
},
|
|
218
|
+
}, te), i = () => {
|
|
219
219
|
clearTimeout(r), g.removeEventListener("sourceopen", a), g.removeEventListener("sourceclose", o), g.removeEventListener("error", o);
|
|
220
220
|
}, a = () => {
|
|
221
221
|
try {
|
|
@@ -230,123 +230,134 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
230
230
|
i(), n(/* @__PURE__ */ Error("The MediaSource closed before a SourceBuffer could be created"));
|
|
231
231
|
};
|
|
232
232
|
g.addEventListener("sourceopen", a, { once: !0 }), g.addEventListener("sourceclose", o, { once: !0 }), g.addEventListener("error", o, { once: !0 });
|
|
233
|
-
}), { appendBuffer:
|
|
234
|
-
await
|
|
235
|
-
let
|
|
233
|
+
}), { appendBuffer: P, unbufferRange: F, updateTimestampOffset: oe, endOfStream: se } = s(E, g);
|
|
234
|
+
await P(e.data), e.subtitles?.length && o.pushFragments(e.subtitles), O?.();
|
|
235
|
+
let I = !1, L = !1, R = 0, z = !1, B = 0, V = 0, H = null, U = 0, W = 0, G = !1, K = 0, q = (e, t, n = !1) => {
|
|
236
236
|
let r = e?.message === "Cancelled";
|
|
237
|
-
t && r || (console.error(e), !(
|
|
238
|
-
},
|
|
237
|
+
t && r || (console.error(e), !(G && !n) && (G = !0, ne?.(r ? Error("Reading the video file failed", { cause: e }) : e)));
|
|
238
|
+
}, ce = async (e = !1) => {
|
|
239
|
+
if (R > 0 && !e) return;
|
|
239
240
|
let t = n.currentTime, r = e ? b : _, i = e ? x : v;
|
|
240
|
-
for (let { start: e, end: n } of a(
|
|
241
|
-
},
|
|
242
|
-
let e = a(
|
|
241
|
+
for (let { start: e, end: n } of a(E)) e < t + r && await F(e, t + r), n > t + i && await F(t + i, n);
|
|
242
|
+
}, le = () => {
|
|
243
|
+
let e = a(E);
|
|
243
244
|
if (!e.length) return !0;
|
|
244
245
|
let t = n.currentTime;
|
|
245
246
|
if (Math.max(...e.map((e) => e.end)) >= t + v) return !1;
|
|
246
|
-
let r = e.find((e) => e.start <= t +
|
|
247
|
+
let r = e.find((e) => e.start <= t + S && t < e.end);
|
|
247
248
|
return !r || r.end < t + y;
|
|
248
249
|
}, J = () => {
|
|
249
250
|
let e = n.currentTime;
|
|
250
|
-
return a(
|
|
251
|
-
}, le = () => {
|
|
252
|
-
let e = J();
|
|
253
|
-
return !!e && e.end >= G - .1;
|
|
251
|
+
return a(E).find((t) => t.start <= e + S && e < t.end);
|
|
254
252
|
}, ue = () => {
|
|
255
|
-
let e =
|
|
256
|
-
e
|
|
253
|
+
let e = J();
|
|
254
|
+
return !!e && e.end >= W - .1;
|
|
255
|
+
}, de = () => {
|
|
256
|
+
let e = a(E).map((e) => e.end);
|
|
257
|
+
e.length && (W = Math.max(W, ...e));
|
|
257
258
|
}, Y = async (e) => {
|
|
258
|
-
|
|
259
|
-
let t = ++
|
|
259
|
+
L = !0, H = null, U = 0, K = e;
|
|
260
|
+
let t = ++V;
|
|
260
261
|
try {
|
|
261
|
-
let { data: n, pts: r, subtitles: i, finished: a } = await
|
|
262
|
-
if (
|
|
263
|
-
n.byteLength && (await
|
|
262
|
+
let { data: n, pts: r, subtitles: i, finished: a } = await A.seek(e);
|
|
263
|
+
if (M || t !== V || (a && (z = !0), i?.length && o.pushFragments(i), await oe(r), M || t !== V)) return;
|
|
264
|
+
n.byteLength && (await P(n), de());
|
|
264
265
|
} catch (e) {
|
|
265
|
-
q(e,
|
|
266
|
+
q(e, M || t !== V);
|
|
266
267
|
} finally {
|
|
267
|
-
t ===
|
|
268
|
+
t === V && (L = !1);
|
|
268
269
|
}
|
|
269
|
-
},
|
|
270
|
-
let e =
|
|
270
|
+
}, fe = async () => {
|
|
271
|
+
let e = H;
|
|
271
272
|
if (e) try {
|
|
272
|
-
await
|
|
273
|
+
await P(e), de(), H === e && (H = null, U = 0);
|
|
273
274
|
} catch (t) {
|
|
274
|
-
if (
|
|
275
|
+
if (H !== e) return;
|
|
275
276
|
if (t?.name === "QuotaExceededError") {
|
|
276
|
-
let t = await
|
|
277
|
-
if (
|
|
277
|
+
let t = await ce(!0).then(() => !0, () => !1);
|
|
278
|
+
if (H !== e) return;
|
|
278
279
|
if (t) {
|
|
279
|
-
|
|
280
|
+
z = !1, await Y(J()?.end ?? n.currentTime);
|
|
280
281
|
return;
|
|
281
282
|
}
|
|
282
283
|
}
|
|
283
|
-
if (
|
|
284
|
-
throw
|
|
284
|
+
if (U += 1, U < ee) return;
|
|
285
|
+
throw H = null, t;
|
|
285
286
|
}
|
|
286
|
-
},
|
|
287
|
-
if (
|
|
288
|
-
let e = ++
|
|
289
|
-
|
|
287
|
+
}, pe = async () => {
|
|
288
|
+
if (I || L || $ !== void 0 || M || !H && (z || !le())) return;
|
|
289
|
+
let e = ++B, t = V, n = () => M || e !== B || t !== V;
|
|
290
|
+
I = !0;
|
|
290
291
|
try {
|
|
291
|
-
if (!
|
|
292
|
-
let { data: e, subtitles: t, finished: r } = await
|
|
293
|
-
if (n() || (r && (
|
|
294
|
-
|
|
292
|
+
if (!H) {
|
|
293
|
+
let { data: e, subtitles: t, finished: r } = await A.read();
|
|
294
|
+
if (n() || (r && (z = !0), t?.length && o.pushFragments(t), !e.byteLength)) return;
|
|
295
|
+
H = e, U = 0;
|
|
295
296
|
}
|
|
296
|
-
await
|
|
297
|
+
await fe(), !n() && G && (G = !1, re?.());
|
|
297
298
|
} catch (e) {
|
|
298
299
|
q(e, n());
|
|
299
300
|
} finally {
|
|
300
|
-
e ===
|
|
301
|
+
e === B && (I = !1);
|
|
302
|
+
}
|
|
303
|
+
}, me = (e) => e >= K && !!J(), he = (e) => a(E).some((t) => t.start <= e + S && e < t.end), ge = async (e) => {
|
|
304
|
+
if (!(M || he(e))) {
|
|
305
|
+
z = !1, R++;
|
|
306
|
+
try {
|
|
307
|
+
await Y(e);
|
|
308
|
+
} finally {
|
|
309
|
+
R--;
|
|
310
|
+
}
|
|
301
311
|
}
|
|
302
|
-
},
|
|
312
|
+
}, X = 0, Z = null, Q, _e = (e) => {
|
|
303
313
|
let t = performance.now(), n = t - X;
|
|
304
|
-
if (n >=
|
|
305
|
-
X = t, Z = null,
|
|
314
|
+
if (n >= C) {
|
|
315
|
+
X = t, Z = null, k?.(e);
|
|
306
316
|
return;
|
|
307
317
|
}
|
|
308
318
|
Z = e, !Q && (Q = setTimeout(() => {
|
|
309
319
|
Q = void 0;
|
|
310
320
|
let e = Z;
|
|
311
|
-
Z = null, !(e === null ||
|
|
312
|
-
},
|
|
321
|
+
Z = null, !(e === null || M) && (X = performance.now(), k?.(e));
|
|
322
|
+
}, C - n));
|
|
313
323
|
};
|
|
314
|
-
|
|
324
|
+
j.push(() => {
|
|
315
325
|
Q && clearTimeout(Q);
|
|
316
326
|
});
|
|
317
|
-
let
|
|
318
|
-
|
|
327
|
+
let ve = 0, $;
|
|
328
|
+
j.push(() => {
|
|
319
329
|
$ && clearTimeout($);
|
|
320
330
|
});
|
|
321
|
-
let
|
|
331
|
+
let ye = () => {
|
|
322
332
|
let t = n.currentTime, r = e.info.input.duration || n.duration;
|
|
323
|
-
r > 0 &&
|
|
324
|
-
let i = performance.now(), a = i -
|
|
325
|
-
if (
|
|
326
|
-
if (
|
|
333
|
+
r > 0 && _e(Math.min(Math.max(t / r, 0), 1));
|
|
334
|
+
let i = performance.now(), a = i - ve < w;
|
|
335
|
+
if (ve = i, !me(t) && !(L && Math.abs(t - K) < .001)) {
|
|
336
|
+
if (z = !1, $ && clearTimeout($), !a) {
|
|
327
337
|
$ = void 0, Y(t);
|
|
328
338
|
return;
|
|
329
339
|
}
|
|
330
340
|
$ = setTimeout(() => {
|
|
331
|
-
if ($ = void 0,
|
|
341
|
+
if ($ = void 0, M) return;
|
|
332
342
|
let e = n.currentTime;
|
|
333
|
-
|
|
334
|
-
},
|
|
343
|
+
me(e) || (z = !1, Y(e));
|
|
344
|
+
}, w);
|
|
335
345
|
}
|
|
336
346
|
};
|
|
337
|
-
n.addEventListener("seeking",
|
|
338
|
-
let
|
|
339
|
-
if (
|
|
340
|
-
|
|
347
|
+
n.addEventListener("seeking", ye), j.push(() => n.removeEventListener("seeking", ye));
|
|
348
|
+
let be = !1, xe = () => {
|
|
349
|
+
if (be) return;
|
|
350
|
+
be = !0;
|
|
341
351
|
let e = n.error;
|
|
342
352
|
q(new h(`the media element failed: ${e?.message ?? "unknown"}`, { cause: e }), !1, !0);
|
|
343
353
|
};
|
|
344
|
-
n.addEventListener("error",
|
|
345
|
-
let
|
|
346
|
-
|
|
354
|
+
n.addEventListener("error", xe), j.push(() => n.removeEventListener("error", xe));
|
|
355
|
+
let Se = setInterval(() => {
|
|
356
|
+
be || n.error || (ce().catch(() => {}), pe().catch((e) => q(e, !1)), z && !H && ue() && g.readyState === "open" && se().catch(() => {}));
|
|
347
357
|
}, 100);
|
|
348
|
-
return
|
|
349
|
-
destroy:
|
|
358
|
+
return j.push(() => clearInterval(Se)), {
|
|
359
|
+
destroy: N,
|
|
360
|
+
prepareSeek: ge,
|
|
350
361
|
selectSubtitleStream: (e) => o.selectStream(e),
|
|
351
362
|
indexes: e.indexes ?? [],
|
|
352
363
|
duration: e.info.input.duration,
|
|
@@ -354,10 +365,10 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
354
365
|
audioMimeType: e.info.output.audioMimeType
|
|
355
366
|
};
|
|
356
367
|
} catch (e) {
|
|
357
|
-
throw
|
|
368
|
+
throw N(), e;
|
|
358
369
|
}
|
|
359
|
-
},
|
|
360
|
-
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s =
|
|
370
|
+
}, O = 5, ne = 500, re = 320, k = 1e6, ie = 3, ae = 1e4, A = async (e) => {
|
|
371
|
+
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s = re } = e, c = await t({
|
|
361
372
|
publicPath: n,
|
|
362
373
|
workerUrl: r,
|
|
363
374
|
workerOptions: { type: "module" },
|
|
@@ -365,14 +376,14 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
365
376
|
read: a
|
|
366
377
|
});
|
|
367
378
|
try {
|
|
368
|
-
let t = await c.init(), n = t.duration, r = Math.max(e.interval ??
|
|
379
|
+
let t = await c.init(), n = t.duration, r = Math.max(e.interval ?? O, n / ne), a = [];
|
|
369
380
|
for (let [e, o] of t.indexes.entries()) {
|
|
370
381
|
let s = a.at(-1);
|
|
371
382
|
s && o.timestamp - s.timestamp < r || a.push({
|
|
372
383
|
timestamp: o.timestamp,
|
|
373
384
|
endTime: n,
|
|
374
385
|
startByte: o.pos,
|
|
375
|
-
endByte: Math.min((t.indexes[e + 1]?.pos ?? i) +
|
|
386
|
+
endByte: Math.min((t.indexes[e + 1]?.pos ?? i) + k, i),
|
|
376
387
|
done: !1,
|
|
377
388
|
attempts: 0
|
|
378
389
|
});
|
|
@@ -403,7 +414,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
403
414
|
}, p = (e) => {
|
|
404
415
|
e.done = !0, d = d.then(async () => {
|
|
405
416
|
if (u) return;
|
|
406
|
-
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")),
|
|
417
|
+
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")), ae))]), n = await createImageBitmap(new Blob([t], { type: "image/png" })), r = new OffscreenCanvas(s, Math.max(1, Math.round(n.height * (s / n.width))));
|
|
407
418
|
r.getContext("2d").drawImage(n, 0, 0, r.width, r.height), n.close();
|
|
408
419
|
let i = await r.convertToBlob({
|
|
409
420
|
type: "image/webp",
|
|
@@ -415,7 +426,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
415
426
|
endTime: e.endTime
|
|
416
427
|
}].sort((e, t) => e.startTime - t.startTime), f());
|
|
417
428
|
}).catch(() => {
|
|
418
|
-
e.attempts += 1, e.done = e.attempts >=
|
|
429
|
+
e.attempts += 1, e.done = e.attempts >= ie;
|
|
419
430
|
});
|
|
420
431
|
};
|
|
421
432
|
return f(), {
|
|
@@ -425,14 +436,14 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
425
436
|
destroy: () => {
|
|
426
437
|
u = !0;
|
|
427
438
|
for (let e of l) URL.revokeObjectURL(e.url);
|
|
428
|
-
l = [],
|
|
439
|
+
l = [], E(c);
|
|
429
440
|
}
|
|
430
441
|
};
|
|
431
442
|
} catch (e) {
|
|
432
|
-
throw
|
|
443
|
+
throw E(c), e;
|
|
433
444
|
}
|
|
434
|
-
},
|
|
435
|
-
let { video: t, canvas: n } = e, r = e.mode ??
|
|
445
|
+
}, j = 1280, M = 1920, N = 250, P = 100, F = () => typeof HTMLCanvasElement < "u" && "captureStream" in HTMLCanvasElement.prototype, oe = () => typeof document < "u" && typeof HTMLVideoElement < "u" && typeof HTMLVideoElement.prototype.requestPictureInPicture == "function" && !!document.pictureInPictureEnabled, se = () => typeof HTMLVideoElement < "u" && "mozCaptureStream" in HTMLVideoElement.prototype, I = () => F() ? oe() ? "window" : se() ? "burn-in" : null : null, L = (e) => {
|
|
446
|
+
let { video: t, canvas: n } = e, r = e.mode ?? I() ?? "window", i = e.maxWidth ?? (r === "burn-in" ? M : j), 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) => {
|
|
436
447
|
r.drawImage(t, 0, 0, e.width, e.height), n.width > 0 && n.height > 0 && r.drawImage(n, 0, 0, e.width, e.height);
|
|
437
448
|
}, h = () => {
|
|
438
449
|
a && m(a.composite, a.context);
|
|
@@ -446,52 +457,52 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
446
457
|
"mediaSession" in navigator && (navigator.mediaSession.playbackState = t.paused ? "paused" : "playing");
|
|
447
458
|
}, x = () => {
|
|
448
459
|
c || l || !t.paused || t.play().catch(() => {});
|
|
449
|
-
},
|
|
460
|
+
}, ee = () => {
|
|
450
461
|
c || l || (t.paused || t.pause(), r !== "burn-in" && (c = !0, a?.mirror.play().catch(() => {}).finally(() => {
|
|
451
462
|
c = !1;
|
|
452
463
|
})));
|
|
453
|
-
},
|
|
464
|
+
}, te = () => {
|
|
454
465
|
b(), a?.mirror.play().catch(() => {});
|
|
455
|
-
},
|
|
466
|
+
}, S = () => {
|
|
456
467
|
b(), r === "burn-in" && a?.mirror.pause();
|
|
457
|
-
},
|
|
468
|
+
}, C = () => {
|
|
458
469
|
if (r !== "burn-in" || !a || !t.paused || l) return;
|
|
459
470
|
l = !0;
|
|
460
471
|
let { mirror: e } = a;
|
|
461
472
|
h(), e.play().then(() => new Promise((e) => {
|
|
462
|
-
setTimeout(e,
|
|
473
|
+
setTimeout(e, P);
|
|
463
474
|
})).catch(() => {}).finally(() => {
|
|
464
475
|
e.pause(), setTimeout(() => {
|
|
465
476
|
l = !1;
|
|
466
|
-
},
|
|
477
|
+
}, P);
|
|
467
478
|
});
|
|
468
|
-
},
|
|
479
|
+
}, w = [["play", () => {
|
|
469
480
|
t.play().catch(() => {});
|
|
470
|
-
}], ["pause", () => t.pause()]],
|
|
471
|
-
if ("mediaSession" in navigator) for (let [t, n] of
|
|
481
|
+
}], ["pause", () => t.pause()]], T = (e) => {
|
|
482
|
+
if ("mediaSession" in navigator) for (let [t, n] of w) try {
|
|
472
483
|
navigator.mediaSession.setActionHandler(t, e ? n : null);
|
|
473
484
|
} catch {}
|
|
474
|
-
},
|
|
475
|
-
if (y(),
|
|
485
|
+
}, E = () => {
|
|
486
|
+
if (y(), T(!1), t.removeEventListener("play", te), t.removeEventListener("pause", S), t.removeEventListener("seeked", C), !a) {
|
|
476
487
|
f?.();
|
|
477
488
|
return;
|
|
478
489
|
}
|
|
479
490
|
let { stream: e, mirror: n } = a;
|
|
480
|
-
n.removeEventListener("play", x), n.removeEventListener("pause",
|
|
491
|
+
n.removeEventListener("play", x), n.removeEventListener("pause", ee), n.removeEventListener("leavepictureinpicture", D);
|
|
481
492
|
for (let t of e.getTracks()) t.stop();
|
|
482
493
|
n.remove(), a = void 0, f?.();
|
|
483
|
-
},
|
|
494
|
+
}, D = () => E(), O = (e) => {
|
|
484
495
|
let r = t.style.opacity, i = n.style.display;
|
|
485
496
|
e.style.cssText = "position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#000;z-index:1", t.style.opacity = "0", n.style.display = "none", f = () => {
|
|
486
497
|
f = void 0, t.style.opacity = r, n.style.display = i;
|
|
487
498
|
};
|
|
488
|
-
},
|
|
499
|
+
}, ne = async () => {
|
|
489
500
|
let n = Math.min(t.videoWidth || i, i), o = Math.round(n * ((t.videoHeight || 9) / (t.videoWidth || 16))), c = document.createElement("canvas");
|
|
490
501
|
c.width = n, c.height = o;
|
|
491
502
|
let l = c.getContext("2d");
|
|
492
503
|
if (!l) throw Error("the picture in picture composite has no 2d context");
|
|
493
504
|
let u = document.createElement("video");
|
|
494
|
-
u.muted = !0, u.playsInline = !0, r === "burn-in" ?
|
|
505
|
+
u.muted = !0, u.playsInline = !0, r === "burn-in" ? O(u) : u.style.cssText = "position:fixed;width:1px;height:1px;opacity:0;pointer-events:none;left:-1px;top:-1px", m(c, l);
|
|
495
506
|
let f = {
|
|
496
507
|
composite: c,
|
|
497
508
|
context: l,
|
|
@@ -500,7 +511,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
500
511
|
};
|
|
501
512
|
if (a = f, u.srcObject = f.stream, (e.container ?? t.parentElement ?? document.body).appendChild(u), v(), s = setInterval(() => {
|
|
502
513
|
t.paused && h();
|
|
503
|
-
},
|
|
514
|
+
}, N), u.play().catch(() => {}), u.readyState === 0 && await new Promise((e) => {
|
|
504
515
|
let t = () => {
|
|
505
516
|
clearTimeout(n), e();
|
|
506
517
|
}, n = setTimeout(t, 1e3);
|
|
@@ -509,7 +520,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
509
520
|
u.remove();
|
|
510
521
|
return;
|
|
511
522
|
}
|
|
512
|
-
if (u.addEventListener("play", x), u.addEventListener("pause",
|
|
523
|
+
if (u.addEventListener("play", x), u.addEventListener("pause", ee), u.addEventListener("leavepictureinpicture", D), t.addEventListener("play", te), t.addEventListener("pause", S), t.addEventListener("seeked", C), T(!0), b(), r === "burn-in") {
|
|
513
524
|
t.paused && u.pause(), e.onBurnedInChange?.(!0);
|
|
514
525
|
return;
|
|
515
526
|
}
|
|
@@ -522,7 +533,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
522
533
|
try {
|
|
523
534
|
if (p()) {
|
|
524
535
|
if (r === "burn-in") {
|
|
525
|
-
|
|
536
|
+
E(), e.onBurnedInChange?.(!1);
|
|
526
537
|
return;
|
|
527
538
|
}
|
|
528
539
|
await document.exitPictureInPicture().catch(() => {});
|
|
@@ -530,9 +541,9 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
530
541
|
}
|
|
531
542
|
r !== "burn-in" && document.pictureInPictureElement && await document.exitPictureInPicture().catch(() => {});
|
|
532
543
|
try {
|
|
533
|
-
await
|
|
544
|
+
await ne();
|
|
534
545
|
} catch (t) {
|
|
535
|
-
console.warn("subtitle compositing for picture in picture failed", t),
|
|
546
|
+
console.warn("subtitle compositing for picture in picture failed", t), E(), r === "burn-in" && e.onBurnedInChange?.(!1);
|
|
536
547
|
}
|
|
537
548
|
} finally {
|
|
538
549
|
u = !1;
|
|
@@ -541,9 +552,9 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
541
552
|
},
|
|
542
553
|
mode: r,
|
|
543
554
|
destroy: () => {
|
|
544
|
-
d = !0, r !== "burn-in" && p() && document.exitPictureInPicture().catch(() => {}),
|
|
555
|
+
d = !0, r !== "burn-in" && p() && document.exitPictureInPicture().catch(() => {}), E(), r === "burn-in" && e.onBurnedInChange?.(!1);
|
|
545
556
|
}
|
|
546
557
|
};
|
|
547
558
|
};
|
|
548
559
|
//#endregion
|
|
549
|
-
export { h as a,
|
|
560
|
+
export { h as a, E as c, a as d, s as f, T as i, c as l, I as n, g as o, A as r, D as s, L as t, m as u };
|