@banou/media-player 0.8.9 → 0.8.11
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.d.ts +1 -1
- package/dist/engine/index.js +2 -2
- package/dist/engine/playback.d.ts +13 -0
- package/dist/{engine-BwK7ycv0.js → engine-Cownv8gD.js} +134 -98
- package/dist/index.d.ts +1 -1
- package/dist/index.js +652 -453
- package/dist/react/components/errors.d.ts +15 -0
- package/dist/react/player.d.ts +1 -0
- package/dist/react/source-feature.d.ts +36 -0
- package/dist/react/video-player.d.ts +9 -0
- package/package.json +1 -1
- package/src/lib/engine/index.ts +1 -1
- package/src/lib/engine/playback.ts +113 -6
- package/src/lib/index.tsx +1 -1
- package/src/lib/react/components/control-bar.tsx +4 -2
- package/src/lib/react/components/errors.tsx +194 -0
- package/src/lib/react/components/track-menu.tsx +2 -2
- package/src/lib/react/hooks/use-playback.ts +105 -2
- package/src/lib/react/source-feature.ts +29 -0
- package/src/lib/react/video-player.tsx +9 -0
package/dist/engine/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { startPlayback, terminateRemuxer, DEFAULT_BUFFER_SIZE } from './playback';
|
|
1
|
+
export { startPlayback, terminateRemuxer, MediaElementError, isMediaElementError, DEFAULT_BUFFER_SIZE } from './playback';
|
|
2
2
|
export type { PlaybackOptions, PlaybackController, MediaIndex, AudioStream } from './playback';
|
|
3
3
|
export { createSubtitleRenderer, SUBTITLES_OFF } from './subtitles';
|
|
4
4
|
export type { SubtitleRenderer, SubtitleRendererOptions, SubtitleStream } from './subtitles';
|
package/dist/engine/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, c as t,
|
|
2
|
-
export {
|
|
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-Cownv8gD.js";
|
|
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 };
|
|
@@ -37,6 +37,19 @@ export type PlaybackController = {
|
|
|
37
37
|
videoMimeType: string;
|
|
38
38
|
audioMimeType: string;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* A terminal failure of the media element itself, as opposed to anything this pipeline did.
|
|
42
|
+
*
|
|
43
|
+
* It is worth its own type because it is the one error class that says something about the CURE:
|
|
44
|
+
* the element is finished and no append will ever succeed against it again, so reporting it to the
|
|
45
|
+
* viewer is pointless and only a rebuilt element clears it. The flag rather than an `instanceof`
|
|
46
|
+
* is what survives the error crossing a module boundary.
|
|
47
|
+
*/
|
|
48
|
+
export declare class MediaElementError extends Error {
|
|
49
|
+
readonly mediaElement = true;
|
|
50
|
+
constructor(message: string, options?: ErrorOptions);
|
|
51
|
+
}
|
|
52
|
+
export declare const isMediaElementError: (error: unknown) => boolean;
|
|
40
53
|
export declare const DEFAULT_BUFFER_SIZE = 2500000;
|
|
41
54
|
export declare const terminateRemuxer: (remuxer: {
|
|
42
55
|
worker: Worker;
|
|
@@ -162,32 +162,37 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
162
162
|
clearInterval(y), t.removeEventListener("ratechange", b), c?.destroy(), c = void 0;
|
|
163
163
|
}
|
|
164
164
|
};
|
|
165
|
-
}, h =
|
|
165
|
+
}, h = class extends Error {
|
|
166
|
+
mediaElement = !0;
|
|
167
|
+
constructor(e, t) {
|
|
168
|
+
super(e, t), this.name = "MediaElementError";
|
|
169
|
+
}
|
|
170
|
+
}, g = (e) => !!e && typeof e == "object" && e.mediaElement === !0, _ = -20, v = 60, y = 30, b = -5, x = 20, S = 5, C = 15e3, w = 1, T = 200, E = 250, D = 25e5, O = (e) => {
|
|
166
171
|
let { worker: t } = e, n = setTimeout(() => t.terminate(), 2e3);
|
|
167
172
|
e.destroy().catch(() => {}).finally(() => {
|
|
168
173
|
clearTimeout(n), t.terminate();
|
|
169
174
|
});
|
|
170
|
-
},
|
|
171
|
-
let { videoElement: n, canvasElement: r, read: i, length: o, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize:
|
|
175
|
+
}, k = 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 = D, audioStreamIndex: k, onReady: A, onError: j, onRecovered: ee, onSeek: M, onSubtitleStreams: te, onAudioStreams: ne } = t, N = await e({
|
|
172
177
|
publicPath: c,
|
|
173
178
|
workerUrl: l,
|
|
174
179
|
workerOptions: { type: "module" },
|
|
175
|
-
bufferSize:
|
|
180
|
+
bufferSize: g,
|
|
176
181
|
length: o,
|
|
177
|
-
audioStreamIndex:
|
|
182
|
+
audioStreamIndex: k,
|
|
178
183
|
read: i
|
|
179
|
-
}),
|
|
180
|
-
if (!
|
|
181
|
-
|
|
182
|
-
for (let e of [...
|
|
184
|
+
}), P = [], F = !1, I = () => {
|
|
185
|
+
if (!F) {
|
|
186
|
+
F = !0;
|
|
187
|
+
for (let e of [...P].reverse()) try {
|
|
183
188
|
e();
|
|
184
189
|
} catch {}
|
|
185
190
|
}
|
|
186
191
|
};
|
|
187
|
-
|
|
192
|
+
P.push(() => O(N));
|
|
188
193
|
try {
|
|
189
|
-
let e = await
|
|
190
|
-
|
|
194
|
+
let e = await N.init(), t = e.audioStreams ?? [], i = t.some((e) => e.streamIndex === k) ? k : t[0]?.streamIndex ?? -1;
|
|
195
|
+
ne?.(t, i);
|
|
191
196
|
let o = m({
|
|
192
197
|
video: n,
|
|
193
198
|
canvas: r,
|
|
@@ -195,122 +200,153 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
195
200
|
wasmUrl: d,
|
|
196
201
|
legacyWasmUrl: f,
|
|
197
202
|
defaultFontUrl: p,
|
|
198
|
-
onStreams:
|
|
203
|
+
onStreams: te
|
|
199
204
|
});
|
|
200
|
-
if (
|
|
205
|
+
if (P.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");
|
|
201
206
|
let c = [e.info.output.videoMimeType, e.info.output.audioMimeType].filter(Boolean).join(","), l = `video/mp4; codecs="${c}"`;
|
|
202
207
|
if (!MediaSource.isTypeSupported(l)) throw Error(`This browser cannot play the codecs in this file: ${c}`);
|
|
203
|
-
let
|
|
204
|
-
|
|
208
|
+
let g = new MediaSource(), D = URL.createObjectURL(g);
|
|
209
|
+
P.push(() => URL.revokeObjectURL(D)), n.src = D, P.push(() => {
|
|
205
210
|
try {
|
|
206
211
|
n.pause();
|
|
207
212
|
} catch {}
|
|
208
213
|
n.removeAttribute("src"), n.load();
|
|
209
214
|
});
|
|
210
|
-
let
|
|
215
|
+
let O = await new Promise((t, n) => {
|
|
211
216
|
let r = setTimeout(() => {
|
|
212
217
|
i(), n(/* @__PURE__ */ Error("The MediaSource never opened"));
|
|
213
|
-
},
|
|
214
|
-
clearTimeout(r),
|
|
218
|
+
}, C), i = () => {
|
|
219
|
+
clearTimeout(r), g.removeEventListener("sourceopen", a), g.removeEventListener("sourceclose", o), g.removeEventListener("error", o);
|
|
215
220
|
}, a = () => {
|
|
216
221
|
try {
|
|
217
|
-
let n =
|
|
222
|
+
let n = g.addSourceBuffer(l);
|
|
218
223
|
n.mode = "segments";
|
|
219
224
|
let r = e.info.input.duration;
|
|
220
|
-
Number.isFinite(r) && r > 0 && (
|
|
225
|
+
Number.isFinite(r) && r > 0 && (g.duration = r), i(), t(n);
|
|
221
226
|
} catch (e) {
|
|
222
227
|
i(), n(e);
|
|
223
228
|
}
|
|
224
229
|
}, o = () => {
|
|
225
230
|
i(), n(/* @__PURE__ */ Error("The MediaSource closed before a SourceBuffer could be created"));
|
|
226
231
|
};
|
|
227
|
-
|
|
228
|
-
}), { appendBuffer:
|
|
229
|
-
await
|
|
230
|
-
let
|
|
231
|
-
let
|
|
232
|
-
t &&
|
|
233
|
-
},
|
|
234
|
-
let t = n.currentTime, r = e ?
|
|
235
|
-
for (let { start: e, end: n } of a(
|
|
236
|
-
},
|
|
237
|
-
let e = a(
|
|
232
|
+
g.addEventListener("sourceopen", a, { once: !0 }), g.addEventListener("sourceclose", o, { once: !0 }), g.addEventListener("error", o, { once: !0 });
|
|
233
|
+
}), { appendBuffer: L, unbufferRange: re, updateTimestampOffset: ie, endOfStream: ae } = s(O, g);
|
|
234
|
+
await L(e.data), e.subtitles?.length && o.pushFragments(e.subtitles), A?.();
|
|
235
|
+
let R = !1, z = !1, B = !1, V = 0, H = 0, U = null, W = 0, G = 0, K = !1, oe = 0, q = (e, t, n = !1) => {
|
|
236
|
+
let r = e?.message === "Cancelled";
|
|
237
|
+
t && r || (console.error(e), !(K && !n) && (K = !0, j?.(r ? Error("Reading the video file failed", { cause: e }) : e)));
|
|
238
|
+
}, se = async (e = !1) => {
|
|
239
|
+
let t = n.currentTime, r = e ? b : _, i = e ? x : v;
|
|
240
|
+
for (let { start: e, end: n } of a(O)) e < t + r && await re(e, t + r), n > t + i && await re(t + i, n);
|
|
241
|
+
}, ce = () => {
|
|
242
|
+
let e = a(O);
|
|
238
243
|
if (!e.length) return !0;
|
|
239
244
|
let t = n.currentTime;
|
|
240
|
-
if (Math.max(...e.map((e) => e.end)) >= t +
|
|
241
|
-
let r = e.find((e) => e.start <= t +
|
|
242
|
-
return !r || r.end < t +
|
|
243
|
-
},
|
|
245
|
+
if (Math.max(...e.map((e) => e.end)) >= t + v) return !1;
|
|
246
|
+
let r = e.find((e) => e.start <= t + w && t < e.end);
|
|
247
|
+
return !r || r.end < t + y;
|
|
248
|
+
}, J = () => {
|
|
244
249
|
let e = n.currentTime;
|
|
245
|
-
return a(
|
|
246
|
-
},
|
|
247
|
-
let e =
|
|
248
|
-
return !!e && e.end >=
|
|
249
|
-
},
|
|
250
|
-
let e = a(
|
|
251
|
-
e.length && (
|
|
252
|
-
},
|
|
253
|
-
|
|
254
|
-
let t = ++
|
|
250
|
+
return a(O).find((t) => t.start <= e + w && e < t.end);
|
|
251
|
+
}, le = () => {
|
|
252
|
+
let e = J();
|
|
253
|
+
return !!e && e.end >= G - .1;
|
|
254
|
+
}, ue = () => {
|
|
255
|
+
let e = a(O).map((e) => e.end);
|
|
256
|
+
e.length && (G = Math.max(G, ...e));
|
|
257
|
+
}, Y = async (e) => {
|
|
258
|
+
z = !0, U = null, W = 0, oe = e;
|
|
259
|
+
let t = ++H;
|
|
255
260
|
try {
|
|
256
|
-
let { data: n, pts: r, subtitles: i, finished: a } = await
|
|
257
|
-
if (
|
|
258
|
-
n.byteLength && (await
|
|
261
|
+
let { data: n, pts: r, subtitles: i, finished: a } = await N.seek(e);
|
|
262
|
+
if (F || t !== H || (a && (B = !0), i?.length && o.pushFragments(i), await ie(r), F || t !== H)) return;
|
|
263
|
+
n.byteLength && (await L(n), ue());
|
|
259
264
|
} catch (e) {
|
|
260
|
-
|
|
265
|
+
q(e, F || t !== H);
|
|
261
266
|
} finally {
|
|
262
|
-
t ===
|
|
267
|
+
t === H && (z = !1);
|
|
263
268
|
}
|
|
264
|
-
},
|
|
265
|
-
let e =
|
|
269
|
+
}, de = async () => {
|
|
270
|
+
let e = U;
|
|
266
271
|
if (e) try {
|
|
267
|
-
await
|
|
272
|
+
await L(e), ue(), U === e && (U = null, W = 0);
|
|
268
273
|
} catch (t) {
|
|
269
|
-
if (
|
|
274
|
+
if (U !== e) return;
|
|
270
275
|
if (t?.name === "QuotaExceededError") {
|
|
271
|
-
let t = await
|
|
272
|
-
if (
|
|
276
|
+
let t = await se(!0).then(() => !0, () => !1);
|
|
277
|
+
if (U !== e) return;
|
|
273
278
|
if (t) {
|
|
274
|
-
|
|
279
|
+
B = !1, await Y(J()?.end ?? n.currentTime);
|
|
275
280
|
return;
|
|
276
281
|
}
|
|
277
282
|
}
|
|
278
|
-
if (
|
|
279
|
-
throw
|
|
283
|
+
if (W += 1, W < S) return;
|
|
284
|
+
throw U = null, t;
|
|
280
285
|
}
|
|
281
|
-
},
|
|
282
|
-
if (
|
|
283
|
-
let e = ++
|
|
284
|
-
|
|
286
|
+
}, fe = async () => {
|
|
287
|
+
if (R || z || $ !== void 0 || F || !U && (B || !ce())) return;
|
|
288
|
+
let e = ++V, t = H, n = () => F || e !== V || t !== H;
|
|
289
|
+
R = !0;
|
|
285
290
|
try {
|
|
286
|
-
if (!
|
|
287
|
-
let { data: e, subtitles: t, finished: r } = await
|
|
288
|
-
if (n() || (r && (
|
|
289
|
-
|
|
291
|
+
if (!U) {
|
|
292
|
+
let { data: e, subtitles: t, finished: r } = await N.read();
|
|
293
|
+
if (n() || (r && (B = !0), t?.length && o.pushFragments(t), !e.byteLength)) return;
|
|
294
|
+
U = e, W = 0;
|
|
290
295
|
}
|
|
291
|
-
await
|
|
296
|
+
await de(), !n() && K && (K = !1, ee?.());
|
|
292
297
|
} catch (e) {
|
|
293
|
-
|
|
298
|
+
q(e, n());
|
|
294
299
|
} finally {
|
|
295
|
-
e ===
|
|
300
|
+
e === V && (R = !1);
|
|
301
|
+
}
|
|
302
|
+
}, pe = (e) => e >= oe && !!J(), X = 0, Z = null, Q, me = (e) => {
|
|
303
|
+
let t = performance.now(), n = t - X;
|
|
304
|
+
if (n >= T) {
|
|
305
|
+
X = t, Z = null, M?.(e);
|
|
306
|
+
return;
|
|
296
307
|
}
|
|
297
|
-
|
|
308
|
+
Z = e, !Q && (Q = setTimeout(() => {
|
|
309
|
+
Q = void 0;
|
|
310
|
+
let e = Z;
|
|
311
|
+
Z = null, !(e === null || F) && (X = performance.now(), M?.(e));
|
|
312
|
+
}, T - n));
|
|
313
|
+
};
|
|
314
|
+
P.push(() => {
|
|
315
|
+
Q && clearTimeout(Q);
|
|
316
|
+
});
|
|
317
|
+
let he = 0, $;
|
|
318
|
+
P.push(() => {
|
|
319
|
+
$ && clearTimeout($);
|
|
320
|
+
});
|
|
321
|
+
let ge = () => {
|
|
298
322
|
let t = n.currentTime, r = e.info.input.duration || n.duration;
|
|
299
|
-
r > 0 &&
|
|
323
|
+
r > 0 && me(Math.min(Math.max(t / r, 0), 1));
|
|
324
|
+
let i = performance.now(), a = i - he < E;
|
|
325
|
+
if (he = i, !pe(t)) {
|
|
326
|
+
if (B = !1, $ && clearTimeout($), !a) {
|
|
327
|
+
$ = void 0, Y(t);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
$ = setTimeout(() => {
|
|
331
|
+
if ($ = void 0, F) return;
|
|
332
|
+
let e = n.currentTime;
|
|
333
|
+
pe(e) || (B = !1, Y(e));
|
|
334
|
+
}, E);
|
|
335
|
+
}
|
|
300
336
|
};
|
|
301
|
-
n.addEventListener("seeking",
|
|
302
|
-
let
|
|
303
|
-
if (
|
|
304
|
-
|
|
337
|
+
n.addEventListener("seeking", ge), P.push(() => n.removeEventListener("seeking", ge));
|
|
338
|
+
let _e = !1, ve = () => {
|
|
339
|
+
if (_e) return;
|
|
340
|
+
_e = !0;
|
|
305
341
|
let e = n.error;
|
|
306
|
-
|
|
342
|
+
q(new h(`the media element failed: ${e?.message ?? "unknown"}`, { cause: e }), !1, !0);
|
|
307
343
|
};
|
|
308
|
-
n.addEventListener("error",
|
|
309
|
-
let
|
|
310
|
-
|
|
344
|
+
n.addEventListener("error", ve), P.push(() => n.removeEventListener("error", ve));
|
|
345
|
+
let ye = setInterval(() => {
|
|
346
|
+
_e || n.error || (se().catch(() => {}), fe().catch((e) => q(e, !1)), B && !U && le() && g.readyState === "open" && ae().catch(() => {}));
|
|
311
347
|
}, 100);
|
|
312
|
-
return
|
|
313
|
-
destroy:
|
|
348
|
+
return P.push(() => clearInterval(ye)), {
|
|
349
|
+
destroy: I,
|
|
314
350
|
selectSubtitleStream: (e) => o.selectStream(e),
|
|
315
351
|
indexes: e.indexes ?? [],
|
|
316
352
|
duration: e.info.input.duration,
|
|
@@ -318,10 +354,10 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
318
354
|
audioMimeType: e.info.output.audioMimeType
|
|
319
355
|
};
|
|
320
356
|
} catch (e) {
|
|
321
|
-
throw
|
|
357
|
+
throw I(), e;
|
|
322
358
|
}
|
|
323
|
-
},
|
|
324
|
-
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s =
|
|
359
|
+
}, A = 5, j = 500, ee = 320, M = 1e6, te = 3, ne = 1e4, N = async (e) => {
|
|
360
|
+
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s = ee } = e, c = await t({
|
|
325
361
|
publicPath: n,
|
|
326
362
|
workerUrl: r,
|
|
327
363
|
workerOptions: { type: "module" },
|
|
@@ -329,14 +365,14 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
329
365
|
read: a
|
|
330
366
|
});
|
|
331
367
|
try {
|
|
332
|
-
let t = await c.init(), n = t.duration, r = Math.max(e.interval ??
|
|
368
|
+
let t = await c.init(), n = t.duration, r = Math.max(e.interval ?? A, n / j), a = [];
|
|
333
369
|
for (let [e, o] of t.indexes.entries()) {
|
|
334
370
|
let s = a.at(-1);
|
|
335
371
|
s && o.timestamp - s.timestamp < r || a.push({
|
|
336
372
|
timestamp: o.timestamp,
|
|
337
373
|
endTime: n,
|
|
338
374
|
startByte: o.pos,
|
|
339
|
-
endByte: Math.min((t.indexes[e + 1]?.pos ?? i) +
|
|
375
|
+
endByte: Math.min((t.indexes[e + 1]?.pos ?? i) + M, i),
|
|
340
376
|
done: !1,
|
|
341
377
|
attempts: 0
|
|
342
378
|
});
|
|
@@ -367,7 +403,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
367
403
|
}, p = (e) => {
|
|
368
404
|
e.done = !0, d = d.then(async () => {
|
|
369
405
|
if (u) return;
|
|
370
|
-
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")),
|
|
406
|
+
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")), ne))]), n = await createImageBitmap(new Blob([t], { type: "image/png" })), r = new OffscreenCanvas(s, Math.max(1, Math.round(n.height * (s / n.width))));
|
|
371
407
|
r.getContext("2d").drawImage(n, 0, 0, r.width, r.height), n.close();
|
|
372
408
|
let i = await r.convertToBlob({
|
|
373
409
|
type: "image/webp",
|
|
@@ -379,7 +415,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
379
415
|
endTime: e.endTime
|
|
380
416
|
}].sort((e, t) => e.startTime - t.startTime), f());
|
|
381
417
|
}).catch(() => {
|
|
382
|
-
e.attempts += 1, e.done = e.attempts >=
|
|
418
|
+
e.attempts += 1, e.done = e.attempts >= te;
|
|
383
419
|
});
|
|
384
420
|
};
|
|
385
421
|
return f(), {
|
|
@@ -389,14 +425,14 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
389
425
|
destroy: () => {
|
|
390
426
|
u = !0;
|
|
391
427
|
for (let e of l) URL.revokeObjectURL(e.url);
|
|
392
|
-
l = [],
|
|
428
|
+
l = [], O(c);
|
|
393
429
|
}
|
|
394
430
|
};
|
|
395
431
|
} catch (e) {
|
|
396
|
-
throw
|
|
432
|
+
throw O(c), e;
|
|
397
433
|
}
|
|
398
|
-
},
|
|
399
|
-
let { video: t, canvas: n } = e, r = e.mode ??
|
|
434
|
+
}, P = 1280, F = 1920, I = 250, L = 100, re = () => typeof HTMLCanvasElement < "u" && "captureStream" in HTMLCanvasElement.prototype, ie = () => typeof document < "u" && typeof HTMLVideoElement < "u" && typeof HTMLVideoElement.prototype.requestPictureInPicture == "function" && !!document.pictureInPictureEnabled, ae = () => typeof HTMLVideoElement < "u" && "mozCaptureStream" in HTMLVideoElement.prototype, R = () => re() ? ie() ? "window" : ae() ? "burn-in" : null : null, z = (e) => {
|
|
435
|
+
let { video: t, canvas: n } = e, r = e.mode ?? R() ?? "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) => {
|
|
400
436
|
r.drawImage(t, 0, 0, e.width, e.height), n.width > 0 && n.height > 0 && r.drawImage(n, 0, 0, e.width, e.height);
|
|
401
437
|
}, h = () => {
|
|
402
438
|
a && m(a.composite, a.context);
|
|
@@ -423,11 +459,11 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
423
459
|
l = !0;
|
|
424
460
|
let { mirror: e } = a;
|
|
425
461
|
h(), e.play().then(() => new Promise((e) => {
|
|
426
|
-
setTimeout(e,
|
|
462
|
+
setTimeout(e, L);
|
|
427
463
|
})).catch(() => {}).finally(() => {
|
|
428
464
|
e.pause(), setTimeout(() => {
|
|
429
465
|
l = !1;
|
|
430
|
-
},
|
|
466
|
+
}, L);
|
|
431
467
|
});
|
|
432
468
|
}, E = [["play", () => {
|
|
433
469
|
t.play().catch(() => {});
|
|
@@ -464,7 +500,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
464
500
|
};
|
|
465
501
|
if (a = f, u.srcObject = f.stream, (e.container ?? t.parentElement ?? document.body).appendChild(u), v(), s = setInterval(() => {
|
|
466
502
|
t.paused && h();
|
|
467
|
-
},
|
|
503
|
+
}, I), u.play().catch(() => {}), u.readyState === 0 && await new Promise((e) => {
|
|
468
504
|
let t = () => {
|
|
469
505
|
clearTimeout(n), e();
|
|
470
506
|
}, n = setTimeout(t, 1e3);
|
|
@@ -510,4 +546,4 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
510
546
|
};
|
|
511
547
|
};
|
|
512
548
|
//#endregion
|
|
513
|
-
export {
|
|
549
|
+
export { h as a, O as c, a as d, s as f, D as i, c as l, R as n, g as o, N as r, k as s, z as t, m as u };
|
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type { DelegatedSelection, DelegatedTracks, ExternalThumbnails, PlayerMed
|
|
|
5
5
|
export { Player, usePlayer } from './react/player';
|
|
6
6
|
export type { PlayerStore } from './react/player';
|
|
7
7
|
export { sourceFeature } from './react/source-feature';
|
|
8
|
-
export type { DownloadedRange, SourceState } from './react/source-feature';
|
|
8
|
+
export type { DownloadedRange, PlaybackErrorEntry, SourceState } from './react/source-feature';
|
|
9
9
|
export { useSeekThumbnails } from './react/hooks/use-thumbnails';
|
|
10
10
|
export { usePictureInPicture } from './react/hooks/use-picture-in-picture';
|
|
11
11
|
export { inputToRemuxerInput } from './utils/source';
|