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