@banou/media-player 0.8.20 → 0.9.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.
- package/README.md +62 -19
- package/dist/engine/index.js +1 -1
- package/dist/engine/picture-in-picture.d.ts +9 -2
- package/dist/engine/playback.d.ts +8 -1
- package/dist/engine/subtitles.d.ts +16 -5
- package/dist/{engine-B8CKGIng.js → engine-DZrYu66u.js} +209 -164
- package/dist/index.js +34 -14
- package/dist/react/components/chrome.d.ts +2 -2
- package/dist/react/components/overlay.d.ts +2 -2
- package/dist/react/hooks/use-picture-in-picture.d.ts +6 -1
- package/dist/react/hooks/use-playback.d.ts +1 -1
- package/dist/remote/index.d.ts +18 -0
- package/dist/remote/index.js +109 -75
- package/package.json +3 -4
- package/src/lib/engine/picture-in-picture.ts +24 -9
- package/src/lib/engine/playback.ts +10 -3
- package/src/lib/engine/subtitles.ts +213 -61
- package/src/lib/react/components/chrome.tsx +16 -3
- package/src/lib/react/components/overlay.tsx +27 -8
- package/src/lib/react/hooks/use-picture-in-picture.ts +10 -6
- package/src/lib/react/hooks/use-playback.ts +4 -4
- package/src/lib/react/video-player.tsx +4 -4
- package/src/lib/remote/index.ts +83 -3
|
@@ -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
|
|
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
|
-
},
|
|
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:
|
|
45
|
+
styles: d(e.content)
|
|
46
46
|
} : (console.warn(`subtitle stream ${e.streamIndex} has no Events format, ignoring the track`), null);
|
|
47
|
-
},
|
|
48
|
-
let [n, i] = t.content.split(","), a = Number(n), o = `Dialogue: ${i},${
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
ReadOrder: a
|
|
63
|
-
_index: a
|
|
64
|
+
Duration: (s.End - s.Start) * 1e3,
|
|
65
|
+
ReadOrder: a
|
|
64
66
|
}
|
|
65
67
|
};
|
|
66
|
-
},
|
|
67
|
-
let { video: t,
|
|
68
|
-
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
121
|
+
u = [...u, ...e.map((e) => [e.filename, new Uint8Array(e.data)])];
|
|
88
122
|
},
|
|
89
123
|
pushFragments: (e) => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
95
|
-
streamIndex:
|
|
96
|
-
title:
|
|
97
|
-
language:
|
|
98
|
-
}),
|
|
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 =
|
|
135
|
+
let e = d.get(n.streamIndex);
|
|
101
136
|
if (!e) continue;
|
|
102
|
-
let
|
|
103
|
-
|
|
104
|
-
let
|
|
105
|
-
if (
|
|
106
|
-
|
|
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
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
let r =
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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: () => [...
|
|
121
|
-
getSelectedStream: () =>
|
|
159
|
+
getStreams: () => [...f],
|
|
160
|
+
getSelectedStream: () => g,
|
|
122
161
|
setOnStreams: (e) => {
|
|
123
|
-
|
|
162
|
+
_ = e;
|
|
124
163
|
},
|
|
125
164
|
destroy: () => {
|
|
126
|
-
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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,
|
|
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:
|
|
189
|
+
audioStreamIndex: _,
|
|
147
190
|
read: a
|
|
148
|
-
}),
|
|
149
|
-
if (!
|
|
150
|
-
|
|
151
|
-
for (let e of [...
|
|
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
|
-
|
|
199
|
+
N.push(() => A(M));
|
|
157
200
|
try {
|
|
158
|
-
let e = await
|
|
159
|
-
|
|
160
|
-
let s =
|
|
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
|
-
|
|
205
|
+
container: r,
|
|
163
206
|
workerUrl: u,
|
|
164
207
|
wasmUrl: d,
|
|
165
208
|
legacyWasmUrl: f,
|
|
166
209
|
defaultFontUrl: p,
|
|
167
|
-
onStreams:
|
|
210
|
+
onStreams: ie
|
|
168
211
|
});
|
|
169
|
-
if (
|
|
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(),
|
|
173
|
-
|
|
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
|
|
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:
|
|
198
|
-
await I(e.data), e.subtitles?.length && s.pushFragments(e.subtitles),
|
|
199
|
-
let
|
|
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,
|
|
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 (
|
|
204
|
-
let t = n.currentTime, r = e ? x :
|
|
205
|
-
for (let { start: e, end: n } of i(
|
|
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(
|
|
250
|
+
let e = i(A);
|
|
208
251
|
if (!e.length) return !0;
|
|
209
|
-
let t =
|
|
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(
|
|
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 >=
|
|
259
|
+
return !!e && e.end >= le - .1;
|
|
217
260
|
}, he = () => {
|
|
218
|
-
let e = i(
|
|
219
|
-
e.length && (
|
|
261
|
+
let e = i(A).map((e) => e.end);
|
|
262
|
+
e.length && (le = Math.max(le, ...e));
|
|
220
263
|
}, Y = async (e) => {
|
|
221
|
-
|
|
222
|
-
let t = ++
|
|
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
|
|
225
|
-
if (
|
|
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,
|
|
271
|
+
J(e, P || t !== W);
|
|
229
272
|
} finally {
|
|
230
|
-
t ===
|
|
273
|
+
t === W && (z = !1);
|
|
231
274
|
}
|
|
232
275
|
}, ge = async () => {
|
|
233
|
-
let e =
|
|
276
|
+
let e = G;
|
|
234
277
|
if (e) try {
|
|
235
|
-
await I(e), he(),
|
|
278
|
+
await I(e), he(), G === e && (G = null, K = 0);
|
|
236
279
|
} catch (t) {
|
|
237
|
-
if (
|
|
280
|
+
if (G !== e) return;
|
|
238
281
|
if (t?.name === "QuotaExceededError") {
|
|
239
282
|
let t = await de(!0).then(() => !0, () => !1);
|
|
240
|
-
if (
|
|
283
|
+
if (G !== e) return;
|
|
241
284
|
if (t) {
|
|
242
|
-
|
|
285
|
+
H = !1, await Y(pe()?.end ?? n.currentTime);
|
|
243
286
|
return;
|
|
244
287
|
}
|
|
245
288
|
}
|
|
246
|
-
if (
|
|
247
|
-
throw
|
|
289
|
+
if (K += 1, K < C) return;
|
|
290
|
+
throw G = null, t;
|
|
248
291
|
}
|
|
249
292
|
}, _e = async () => {
|
|
250
|
-
if (
|
|
251
|
-
let e = ++
|
|
252
|
-
|
|
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 (!
|
|
255
|
-
let { data: e, subtitles: t, finished: r } = await
|
|
256
|
-
if (n() || (r && (
|
|
257
|
-
|
|
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,
|
|
302
|
+
await ge(), !n() && q && (q = !1, re?.());
|
|
260
303
|
} catch (e) {
|
|
261
304
|
J(e, n());
|
|
262
305
|
} finally {
|
|
263
|
-
e ===
|
|
306
|
+
e === U && (R = !1);
|
|
264
307
|
}
|
|
265
|
-
}, ve = (e) => e >= ue && !!pe(), ye = (e) => i(
|
|
266
|
-
let t = i(
|
|
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 (!
|
|
270
|
-
|
|
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 =
|
|
274
|
-
for (let n = 0; 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
|
-
|
|
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 >=
|
|
285
|
-
xe = t, Z = null,
|
|
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 ||
|
|
292
|
-
},
|
|
334
|
+
Z = null, !(e === null || P) && (xe = performance.now(), j?.(e));
|
|
335
|
+
}, D - n));
|
|
293
336
|
};
|
|
294
|
-
|
|
337
|
+
N.push(() => {
|
|
295
338
|
Q && clearTimeout(Q);
|
|
296
339
|
});
|
|
297
340
|
let Ce = 0, $;
|
|
298
|
-
|
|
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 <
|
|
305
|
-
if (Ce = i, !ve(t) && !(
|
|
306
|
-
if (
|
|
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,
|
|
354
|
+
if ($ = void 0, P) return;
|
|
312
355
|
let e = n.currentTime;
|
|
313
|
-
ve(e) || (
|
|
314
|
-
},
|
|
356
|
+
ve(e) || (H = !1, Y(e));
|
|
357
|
+
}, O);
|
|
315
358
|
}
|
|
316
359
|
};
|
|
317
|
-
n.addEventListener("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
|
|
365
|
+
J(new g(`the media element failed: ${e?.message ?? "unknown"}`, { cause: e }), !1, !0);
|
|
323
366
|
};
|
|
324
|
-
n.addEventListener("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)),
|
|
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
|
|
329
|
-
destroy:
|
|
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
|
|
382
|
+
throw F(), e;
|
|
340
383
|
}
|
|
341
|
-
}, ne = 5,
|
|
342
|
-
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s =
|
|
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 /
|
|
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({
|
|
@@ -385,7 +428,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
385
428
|
}, p = (e) => {
|
|
386
429
|
e.done = !0, d = d.then(async () => {
|
|
387
430
|
if (u) return;
|
|
388
|
-
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")),
|
|
431
|
+
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))));
|
|
389
432
|
r.getContext("2d").drawImage(n, 0, 0, r.width, r.height), n.close();
|
|
390
433
|
let i = await r.convertToBlob({
|
|
391
434
|
type: "image/webp",
|
|
@@ -397,7 +440,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
397
440
|
endTime: e.endTime
|
|
398
441
|
}].sort((e, t) => e.startTime - t.startTime), f());
|
|
399
442
|
}).catch(() => {
|
|
400
|
-
e.attempts += 1, e.done = e.attempts >=
|
|
443
|
+
e.attempts += 1, e.done = e.attempts >= ae;
|
|
401
444
|
});
|
|
402
445
|
};
|
|
403
446
|
return f(), {
|
|
@@ -407,59 +450,61 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
407
450
|
destroy: () => {
|
|
408
451
|
u = !0;
|
|
409
452
|
for (let e of l) URL.revokeObjectURL(e.url);
|
|
410
|
-
l = [],
|
|
453
|
+
l = [], A(c);
|
|
411
454
|
}
|
|
412
455
|
};
|
|
413
456
|
} catch (e) {
|
|
414
|
-
throw
|
|
457
|
+
throw A(c), e;
|
|
415
458
|
}
|
|
416
|
-
},
|
|
417
|
-
let { video: t,
|
|
418
|
-
r.drawImage(t, 0, 0, e.width, e.height)
|
|
459
|
+
}, 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) => {
|
|
460
|
+
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) => {
|
|
461
|
+
r.drawImage(t, 0, 0, e.width, e.height);
|
|
462
|
+
let i = n.querySelector("canvas");
|
|
463
|
+
i && i.width > 0 && i.height > 0 && r.drawImage(i, 0, 0, e.width, e.height);
|
|
419
464
|
}, h = () => {
|
|
420
465
|
a && m(a.composite, a.context);
|
|
421
466
|
}, g = "requestVideoFrameCallback" in t, _ = () => {
|
|
422
467
|
h(), v();
|
|
423
468
|
}, v = () => {
|
|
424
469
|
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
470
|
}, y = () => {
|
|
428
|
-
|
|
471
|
+
o !== void 0 && (g ? t.cancelVideoFrameCallback(o) : cancelAnimationFrame(o)), s !== void 0 && clearInterval(s), o = void 0, s = void 0;
|
|
429
472
|
}, b = () => {
|
|
430
|
-
|
|
473
|
+
"mediaSession" in navigator && (navigator.mediaSession.playbackState = t.paused ? "paused" : "playing");
|
|
431
474
|
}, x = () => {
|
|
475
|
+
c || l || !t.paused || t.play().catch(() => {});
|
|
476
|
+
}, S = () => {
|
|
432
477
|
c || l || (t.paused || t.pause(), r !== "burn-in" && (c = !0, a?.mirror.play().catch(() => {}).finally(() => {
|
|
433
478
|
c = !1;
|
|
434
479
|
})));
|
|
435
|
-
}, S = () => {
|
|
436
|
-
y(), a?.mirror.play().catch(() => {});
|
|
437
480
|
}, C = () => {
|
|
438
|
-
|
|
481
|
+
b(), a?.mirror.play().catch(() => {});
|
|
439
482
|
}, w = () => {
|
|
483
|
+
b(), r === "burn-in" && a?.mirror.pause();
|
|
484
|
+
}, T = () => {
|
|
440
485
|
if (r !== "burn-in" || !a || !t.paused || l) return;
|
|
441
486
|
l = !0;
|
|
442
487
|
let { mirror: e } = a;
|
|
443
488
|
h(), e.play().then(() => new Promise((e) => {
|
|
444
|
-
setTimeout(e,
|
|
489
|
+
setTimeout(e, L);
|
|
445
490
|
})).catch(() => {}).finally(() => {
|
|
446
491
|
e.pause(), setTimeout(() => {
|
|
447
492
|
l = !1;
|
|
448
|
-
},
|
|
493
|
+
}, L);
|
|
449
494
|
});
|
|
450
|
-
},
|
|
495
|
+
}, E = [["play", () => {
|
|
451
496
|
t.play().catch(() => {});
|
|
452
|
-
}], ["pause", () => t.pause()]],
|
|
453
|
-
if ("mediaSession" in navigator) for (let [t, n] of
|
|
497
|
+
}], ["pause", () => t.pause()]], ee = (e) => {
|
|
498
|
+
if ("mediaSession" in navigator) for (let [t, n] of E) try {
|
|
454
499
|
navigator.mediaSession.setActionHandler(t, e ? n : null);
|
|
455
500
|
} catch {}
|
|
456
501
|
}, D = () => {
|
|
457
|
-
if (
|
|
502
|
+
if (y(), ee(!1), t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("seeked", T), !a) {
|
|
458
503
|
f?.();
|
|
459
504
|
return;
|
|
460
505
|
}
|
|
461
506
|
let { stream: e, mirror: n } = a;
|
|
462
|
-
n.removeEventListener("play",
|
|
507
|
+
n.removeEventListener("play", x), n.removeEventListener("pause", S), n.removeEventListener("leavepictureinpicture", O);
|
|
463
508
|
for (let t of e.getTracks()) t.stop();
|
|
464
509
|
n.remove(), a = void 0, f?.();
|
|
465
510
|
}, O = () => D(), k = (e) => {
|
|
@@ -482,7 +527,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
482
527
|
};
|
|
483
528
|
if (a = f, u.srcObject = f.stream, (e.container ?? t.parentElement ?? document.body).appendChild(u), v(), s = setInterval(() => {
|
|
484
529
|
t.paused && h();
|
|
485
|
-
},
|
|
530
|
+
}, I), u.play().catch(() => {}), u.readyState === 0 && await new Promise((e) => {
|
|
486
531
|
let t = () => {
|
|
487
532
|
clearTimeout(n), e();
|
|
488
533
|
}, n = setTimeout(t, 1e3);
|
|
@@ -491,7 +536,7 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
491
536
|
u.remove();
|
|
492
537
|
return;
|
|
493
538
|
}
|
|
494
|
-
if (u.addEventListener("play",
|
|
539
|
+
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
540
|
t.paused && u.pause(), e.onBurnedInChange?.(!0);
|
|
496
541
|
return;
|
|
497
542
|
}
|
|
@@ -528,4 +573,4 @@ var i = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
528
573
|
};
|
|
529
574
|
};
|
|
530
575
|
//#endregion
|
|
531
|
-
export {
|
|
576
|
+
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 };
|