avbridge 2.3.0 → 2.6.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/CHANGELOG.md +114 -0
- package/dist/{chunk-6UUT4BEA.cjs → chunk-2IJ66NTD.cjs} +13 -20
- package/dist/chunk-2IJ66NTD.cjs.map +1 -0
- package/dist/{chunk-XKPSTC34.cjs → chunk-2XW2O3YI.cjs} +5 -20
- package/dist/chunk-2XW2O3YI.cjs.map +1 -0
- package/dist/chunk-5KVLE6YI.js +167 -0
- package/dist/chunk-5KVLE6YI.js.map +1 -0
- package/dist/{chunk-7RGG6ME7.cjs → chunk-6SOFJV44.cjs} +422 -688
- package/dist/chunk-6SOFJV44.cjs.map +1 -0
- package/dist/{chunk-2PGRFCWB.js → chunk-CPJLFFCC.js} +8 -18
- package/dist/chunk-CPJLFFCC.js.map +1 -0
- package/dist/chunk-CPZ7PXAM.cjs +240 -0
- package/dist/chunk-CPZ7PXAM.cjs.map +1 -0
- package/dist/{chunk-QQXBPW72.js → chunk-E76AMWI4.js} +4 -18
- package/dist/chunk-E76AMWI4.js.map +1 -0
- package/dist/chunk-LUFA47FP.js +19 -0
- package/dist/chunk-LUFA47FP.js.map +1 -0
- package/dist/{chunk-NV7ILLWH.js → chunk-OGYHFY6K.js} +404 -665
- package/dist/chunk-OGYHFY6K.js.map +1 -0
- package/dist/chunk-Q2VUO52Z.cjs +374 -0
- package/dist/chunk-Q2VUO52Z.cjs.map +1 -0
- package/dist/chunk-QDJLQR53.cjs +22 -0
- package/dist/chunk-QDJLQR53.cjs.map +1 -0
- package/dist/chunk-S4WAZC2T.cjs +173 -0
- package/dist/chunk-S4WAZC2T.cjs.map +1 -0
- package/dist/chunk-SMH6IOP2.js +368 -0
- package/dist/chunk-SMH6IOP2.js.map +1 -0
- package/dist/chunk-SR3MPV4D.js +237 -0
- package/dist/chunk-SR3MPV4D.js.map +1 -0
- package/dist/chunk-X2K3GIWE.js +235 -0
- package/dist/chunk-X2K3GIWE.js.map +1 -0
- package/dist/chunk-ZCUXHW55.cjs +242 -0
- package/dist/chunk-ZCUXHW55.cjs.map +1 -0
- package/dist/element-browser.js +883 -492
- package/dist/element-browser.js.map +1 -1
- package/dist/element.cjs +88 -6
- package/dist/element.cjs.map +1 -1
- package/dist/element.d.cts +51 -1
- package/dist/element.d.ts +51 -1
- package/dist/element.js +87 -5
- package/dist/element.js.map +1 -1
- package/dist/index.cjs +523 -393
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +494 -366
- package/dist/index.js.map +1 -1
- package/dist/libav-demux-H2GS46GH.cjs +27 -0
- package/dist/libav-demux-H2GS46GH.cjs.map +1 -0
- package/dist/libav-demux-OWZ4T2YW.js +6 -0
- package/dist/libav-demux-OWZ4T2YW.js.map +1 -0
- package/dist/{libav-import-GST2AMPL.cjs → libav-import-2ZVKV2E7.cjs} +2 -2
- package/dist/{libav-import-GST2AMPL.cjs.map → libav-import-2ZVKV2E7.cjs.map} +1 -1
- package/dist/{libav-import-2JURFHEW.js → libav-import-6MGLCXVQ.js} +2 -2
- package/dist/{libav-import-2JURFHEW.js.map → libav-import-6MGLCXVQ.js.map} +1 -1
- package/dist/{player-B6WB74RD.d.ts → player-DGXeCNfD.d.cts} +41 -1
- package/dist/{player-B6WB74RD.d.cts → player-DGXeCNfD.d.ts} +41 -1
- package/dist/player.cjs +731 -472
- package/dist/player.cjs.map +1 -1
- package/dist/player.d.cts +229 -120
- package/dist/player.d.ts +229 -120
- package/dist/player.js +710 -451
- package/dist/player.js.map +1 -1
- package/dist/remux-OBSMIENG.cjs +35 -0
- package/dist/remux-OBSMIENG.cjs.map +1 -0
- package/dist/remux-WBYIZBBX.js +10 -0
- package/dist/remux-WBYIZBBX.js.map +1 -0
- package/dist/source-4TZ6KMNV.js +4 -0
- package/dist/{source-F656KYYV.js.map → source-4TZ6KMNV.js.map} +1 -1
- package/dist/source-7YLO6E7X.cjs +29 -0
- package/dist/{source-73CAH6HW.cjs.map → source-7YLO6E7X.cjs.map} +1 -1
- package/dist/source-MTX5ELUZ.js +4 -0
- package/dist/{source-QJR3OHTW.js.map → source-MTX5ELUZ.js.map} +1 -1
- package/dist/source-VFLXLOCN.cjs +29 -0
- package/dist/{source-VB74JQ7Z.cjs.map → source-VFLXLOCN.cjs.map} +1 -1
- package/dist/subtitles-4T74JRGT.js +4 -0
- package/dist/subtitles-4T74JRGT.js.map +1 -0
- package/dist/subtitles-QUH4LPI4.cjs +29 -0
- package/dist/subtitles-QUH4LPI4.cjs.map +1 -0
- package/package.json +1 -1
- package/src/convert/remux.ts +1 -35
- package/src/convert/transcode-libav.ts +691 -0
- package/src/convert/transcode.ts +12 -4
- package/src/element/avbridge-player.ts +100 -0
- package/src/element/avbridge-video.ts +140 -3
- package/src/element/player-styles.ts +12 -0
- package/src/errors.ts +6 -0
- package/src/player.ts +15 -16
- package/src/strategies/fallback/decoder.ts +96 -173
- package/src/strategies/fallback/index.ts +46 -2
- package/src/strategies/fallback/libav-import.ts +9 -1
- package/src/strategies/fallback/video-renderer.ts +107 -0
- package/src/strategies/hybrid/decoder.ts +88 -180
- package/src/strategies/hybrid/index.ts +35 -2
- package/src/strategies/native.ts +6 -3
- package/src/strategies/remux/index.ts +14 -2
- package/src/strategies/remux/pipeline.ts +72 -12
- package/src/subtitles/render.ts +8 -0
- package/src/types.ts +32 -0
- package/src/util/libav-demux.ts +405 -0
- package/src/util/time-ranges.ts +40 -0
- package/dist/chunk-2PGRFCWB.js.map +0 -1
- package/dist/chunk-6UUT4BEA.cjs.map +0 -1
- package/dist/chunk-7RGG6ME7.cjs.map +0 -1
- package/dist/chunk-NV7ILLWH.js.map +0 -1
- package/dist/chunk-QQXBPW72.js.map +0 -1
- package/dist/chunk-XKPSTC34.cjs.map +0 -1
- package/dist/source-73CAH6HW.cjs +0 -28
- package/dist/source-F656KYYV.js +0 -3
- package/dist/source-QJR3OHTW.js +0 -3
- package/dist/source-VB74JQ7Z.cjs +0 -28
package/dist/player.d.ts
CHANGED
|
@@ -1,123 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `<avbridge-player>` — YouTube-style controls element.
|
|
3
|
-
*
|
|
4
|
-
* Wraps `<avbridge-video>` with a full player UI: play/pause, seek bar,
|
|
5
|
-
* volume, settings menu (speed, subtitles, audio tracks), fullscreen,
|
|
6
|
-
* keyboard shortcuts, touch gestures, and auto-hiding controls.
|
|
7
|
-
*
|
|
8
|
-
* All properties, methods, and events from `<avbridge-video>` are proxied
|
|
9
|
-
* through. Consumers interact with `<avbridge-player>` exclusively.
|
|
10
|
-
*/
|
|
11
|
-
declare class AvbridgePlayerElement extends HTMLElement {
|
|
12
|
-
static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy")[];
|
|
13
|
-
private _video;
|
|
14
|
-
private _playBtn;
|
|
15
|
-
private _overlayBtn;
|
|
16
|
-
private _seekInput;
|
|
17
|
-
private _seekProgress;
|
|
18
|
-
private _seekBuffered;
|
|
19
|
-
private _seekThumb;
|
|
20
|
-
private _seekTooltip;
|
|
21
|
-
private _timeDisplay;
|
|
22
|
-
private _volumeBtn;
|
|
23
|
-
private _volumeInput;
|
|
24
|
-
private _settingsBtn;
|
|
25
|
-
private _settingsMenu;
|
|
26
|
-
private _fullscreenBtn;
|
|
27
|
-
private _speedIndicator;
|
|
28
|
-
private _rippleLeft;
|
|
29
|
-
private _rippleRight;
|
|
30
|
-
private _state;
|
|
31
|
-
private _controlsTimer;
|
|
32
|
-
private _settingsOpen;
|
|
33
|
-
private _userSeeking;
|
|
34
|
-
private _holdTimer;
|
|
35
|
-
private _holdSpeedActive;
|
|
36
|
-
private _savedPlaybackRate;
|
|
37
|
-
private _lastTapTime;
|
|
38
|
-
private _tapTimer;
|
|
39
|
-
private _statsOpen;
|
|
40
|
-
private _statsEl;
|
|
41
|
-
private _statsInterval;
|
|
42
|
-
private _eventCleanup;
|
|
43
|
-
constructor();
|
|
44
|
-
private _template;
|
|
45
|
-
private _bindEvents;
|
|
46
|
-
connectedCallback(): void;
|
|
47
|
-
disconnectedCallback(): void;
|
|
48
|
-
attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
|
|
49
|
-
private _setState;
|
|
50
|
-
private _togglePlay;
|
|
51
|
-
private _onSeekInput;
|
|
52
|
-
private _onSeekCommit;
|
|
53
|
-
/** Linear click-to-time mapping across the full track width (no edge clamping). */
|
|
54
|
-
private _timeFromSeekPointer;
|
|
55
|
-
private _onSeekPointerDown;
|
|
56
|
-
private _onSeekHover;
|
|
57
|
-
private _updateSeekVisuals;
|
|
58
|
-
private _updateTime;
|
|
59
|
-
private _toggleMute;
|
|
60
|
-
private _updateVolume;
|
|
61
|
-
private _toggleSettings;
|
|
62
|
-
private _closeSettings;
|
|
63
|
-
private _buildSettingsMenu;
|
|
64
|
-
private _toggleStats;
|
|
65
|
-
private _updateStats;
|
|
66
|
-
private _toggleFullscreen;
|
|
67
|
-
private _updateFullscreenIcon;
|
|
68
|
-
private _showControls;
|
|
69
|
-
private _scheduleHide;
|
|
70
|
-
/** Track whether the last interaction was touch so click handler can skip. */
|
|
71
|
-
private _lastPointerTypeWasTouch;
|
|
72
|
-
private _onContainerClick;
|
|
73
|
-
private _onContainerDblClick;
|
|
74
|
-
private _onPointerDown;
|
|
75
|
-
private _onPointerUp;
|
|
76
|
-
private _cancelHold;
|
|
77
|
-
private _doDoubleTap;
|
|
78
|
-
private _onKeydown;
|
|
79
|
-
private _clearTimers;
|
|
80
|
-
get src(): string;
|
|
81
|
-
set src(v: string);
|
|
82
|
-
get source(): unknown;
|
|
83
|
-
set source(v: unknown);
|
|
84
|
-
get currentTime(): number;
|
|
85
|
-
set currentTime(v: number);
|
|
86
|
-
get duration(): number;
|
|
87
|
-
get paused(): boolean;
|
|
88
|
-
get ended(): boolean;
|
|
89
|
-
get readyState(): number;
|
|
90
|
-
get volume(): number;
|
|
91
|
-
set volume(v: number);
|
|
92
|
-
get muted(): boolean;
|
|
93
|
-
set muted(v: boolean);
|
|
94
|
-
get playbackRate(): number;
|
|
95
|
-
set playbackRate(v: number);
|
|
96
|
-
get autoplay(): boolean;
|
|
97
|
-
set autoplay(v: boolean);
|
|
98
|
-
get loop(): boolean;
|
|
99
|
-
set loop(v: boolean);
|
|
100
|
-
get videoWidth(): number;
|
|
101
|
-
get videoHeight(): number;
|
|
102
|
-
get buffered(): TimeRanges;
|
|
103
|
-
get played(): TimeRanges;
|
|
104
|
-
get seekable(): TimeRanges;
|
|
105
|
-
get strategy(): string | undefined;
|
|
106
|
-
get strategyClass(): string | undefined;
|
|
107
|
-
get audioTracks(): unknown[];
|
|
108
|
-
get subtitleTracks(): unknown[];
|
|
109
|
-
get player(): unknown;
|
|
110
|
-
get videoElement(): HTMLVideoElement;
|
|
111
|
-
play(): Promise<void>;
|
|
112
|
-
pause(): void;
|
|
113
|
-
load(): Promise<void>;
|
|
114
|
-
destroy(): Promise<void>;
|
|
115
|
-
setAudioTrack(id: number): Promise<void>;
|
|
116
|
-
setSubtitleTrack(id: number | null): Promise<void>;
|
|
117
|
-
getDiagnostics(): unknown;
|
|
118
|
-
canPlayType(mime: string): string;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
1
|
/**
|
|
122
2
|
* Core types shared across avbridge modules.
|
|
123
3
|
*
|
|
@@ -364,6 +244,185 @@ interface PlayerEventMap {
|
|
|
364
244
|
type PlayerEventName = keyof PlayerEventMap;
|
|
365
245
|
/** Generic listener type re-exported for player.on overloads. */
|
|
366
246
|
type Listener<T> = (payload: T) => void;
|
|
247
|
+
/**
|
|
248
|
+
* CustomEvents dispatched by `<avbridge-video>` and `<avbridge-player>`.
|
|
249
|
+
* Map each event name to the full `CustomEvent<Detail>` so addEventListener
|
|
250
|
+
* overloads can type the listener parameter correctly.
|
|
251
|
+
*
|
|
252
|
+
* Standard HTMLMediaElement events (play, pause, seeking, volumechange,
|
|
253
|
+
* etc.) are forwarded from the inner `<video>` as plain `Event`s and remain
|
|
254
|
+
* typed via the built-in `HTMLElementEventMap`. They are NOT in this map —
|
|
255
|
+
* TypeScript will pick up their native types automatically.
|
|
256
|
+
*/
|
|
257
|
+
interface AvbridgeVideoElementEventMap {
|
|
258
|
+
strategychange: CustomEvent<{
|
|
259
|
+
strategy: StrategyName;
|
|
260
|
+
strategyClass: string | null;
|
|
261
|
+
reason: string;
|
|
262
|
+
from?: StrategyName;
|
|
263
|
+
currentTime?: number;
|
|
264
|
+
diagnostics: DiagnosticsSnapshot;
|
|
265
|
+
}>;
|
|
266
|
+
trackschange: CustomEvent<{
|
|
267
|
+
audioTracks: AudioTrackInfo[];
|
|
268
|
+
subtitleTracks: SubtitleTrackInfo[];
|
|
269
|
+
}>;
|
|
270
|
+
timeupdate: CustomEvent<{
|
|
271
|
+
currentTime: number;
|
|
272
|
+
}>;
|
|
273
|
+
ended: CustomEvent<Record<string, never>>;
|
|
274
|
+
ready: CustomEvent<{
|
|
275
|
+
diagnostics: DiagnosticsSnapshot;
|
|
276
|
+
}>;
|
|
277
|
+
destroy: CustomEvent<Record<string, never>>;
|
|
278
|
+
error: CustomEvent<{
|
|
279
|
+
error: Error;
|
|
280
|
+
diagnostics: DiagnosticsSnapshot | null;
|
|
281
|
+
}>;
|
|
282
|
+
progress: CustomEvent<{
|
|
283
|
+
buffered: TimeRanges;
|
|
284
|
+
}>;
|
|
285
|
+
loadstart: CustomEvent<Record<string, never>>;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* `<avbridge-player>` — YouTube-style controls element.
|
|
290
|
+
*
|
|
291
|
+
* Wraps `<avbridge-video>` with a full player UI: play/pause, seek bar,
|
|
292
|
+
* volume, settings menu (speed, subtitles, audio tracks), fullscreen,
|
|
293
|
+
* keyboard shortcuts, touch gestures, and auto-hiding controls.
|
|
294
|
+
*
|
|
295
|
+
* All properties, methods, and events from `<avbridge-video>` are proxied
|
|
296
|
+
* through. Consumers interact with `<avbridge-player>` exclusively.
|
|
297
|
+
*/
|
|
298
|
+
|
|
299
|
+
declare class AvbridgePlayerElement extends HTMLElement {
|
|
300
|
+
static readonly observedAttributes: ("src" | "muted" | "autoplay" | "loop" | "preload" | "poster" | "playsinline" | "crossorigin" | "disableremoteplayback" | "preferstrategy")[];
|
|
301
|
+
private _video;
|
|
302
|
+
private _playBtn;
|
|
303
|
+
private _overlayBtn;
|
|
304
|
+
private _seekInput;
|
|
305
|
+
private _seekProgress;
|
|
306
|
+
private _seekBuffered;
|
|
307
|
+
private _seekThumb;
|
|
308
|
+
private _seekTooltip;
|
|
309
|
+
private _timeDisplay;
|
|
310
|
+
private _volumeBtn;
|
|
311
|
+
private _volumeInput;
|
|
312
|
+
private _settingsBtn;
|
|
313
|
+
private _settingsMenu;
|
|
314
|
+
private _fullscreenBtn;
|
|
315
|
+
private _speedIndicator;
|
|
316
|
+
private _rippleLeft;
|
|
317
|
+
private _rippleRight;
|
|
318
|
+
private _state;
|
|
319
|
+
private _controlsTimer;
|
|
320
|
+
private _settingsOpen;
|
|
321
|
+
private _userSeeking;
|
|
322
|
+
private _holdTimer;
|
|
323
|
+
private _holdSpeedActive;
|
|
324
|
+
private _savedPlaybackRate;
|
|
325
|
+
private _lastTapTime;
|
|
326
|
+
private _tapTimer;
|
|
327
|
+
private _statsOpen;
|
|
328
|
+
private _statsEl;
|
|
329
|
+
private _statsInterval;
|
|
330
|
+
private _eventCleanup;
|
|
331
|
+
constructor();
|
|
332
|
+
private _template;
|
|
333
|
+
private _bindEvents;
|
|
334
|
+
connectedCallback(): void;
|
|
335
|
+
disconnectedCallback(): void;
|
|
336
|
+
attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
|
|
337
|
+
private _setState;
|
|
338
|
+
private _togglePlay;
|
|
339
|
+
private _onSeekInput;
|
|
340
|
+
private _onSeekCommit;
|
|
341
|
+
/** Linear click-to-time mapping across the full track width (no edge clamping). */
|
|
342
|
+
private _timeFromSeekPointer;
|
|
343
|
+
private _onSeekPointerDown;
|
|
344
|
+
private _onSeekHover;
|
|
345
|
+
private _updateSeekVisuals;
|
|
346
|
+
private _updateTime;
|
|
347
|
+
private _toggleMute;
|
|
348
|
+
private _updateVolume;
|
|
349
|
+
private _toggleSettings;
|
|
350
|
+
private _closeSettings;
|
|
351
|
+
private _buildSettingsMenu;
|
|
352
|
+
private _toggleStats;
|
|
353
|
+
private _updateStats;
|
|
354
|
+
private _toggleFullscreen;
|
|
355
|
+
private _updateFullscreenIcon;
|
|
356
|
+
private _showControls;
|
|
357
|
+
private _scheduleHide;
|
|
358
|
+
/** Track whether the last interaction was touch so click handler can skip. */
|
|
359
|
+
private _lastPointerTypeWasTouch;
|
|
360
|
+
private _onContainerClick;
|
|
361
|
+
private _onContainerDblClick;
|
|
362
|
+
private _onPointerDown;
|
|
363
|
+
private _onPointerUp;
|
|
364
|
+
private _cancelHold;
|
|
365
|
+
private _doDoubleTap;
|
|
366
|
+
private _onKeydown;
|
|
367
|
+
private _clearTimers;
|
|
368
|
+
get src(): string;
|
|
369
|
+
set src(v: string);
|
|
370
|
+
get source(): unknown;
|
|
371
|
+
set source(v: unknown);
|
|
372
|
+
get currentTime(): number;
|
|
373
|
+
set currentTime(v: number);
|
|
374
|
+
get duration(): number;
|
|
375
|
+
get paused(): boolean;
|
|
376
|
+
get ended(): boolean;
|
|
377
|
+
get readyState(): number;
|
|
378
|
+
get volume(): number;
|
|
379
|
+
set volume(v: number);
|
|
380
|
+
get muted(): boolean;
|
|
381
|
+
set muted(v: boolean);
|
|
382
|
+
get playbackRate(): number;
|
|
383
|
+
set playbackRate(v: number);
|
|
384
|
+
get autoplay(): boolean;
|
|
385
|
+
set autoplay(v: boolean);
|
|
386
|
+
get loop(): boolean;
|
|
387
|
+
set loop(v: boolean);
|
|
388
|
+
get videoWidth(): number;
|
|
389
|
+
get videoHeight(): number;
|
|
390
|
+
get buffered(): TimeRanges;
|
|
391
|
+
get played(): TimeRanges;
|
|
392
|
+
get seekable(): TimeRanges;
|
|
393
|
+
get strategy(): string | undefined;
|
|
394
|
+
get strategyClass(): string | undefined;
|
|
395
|
+
get audioTracks(): unknown[];
|
|
396
|
+
get subtitleTracks(): unknown[];
|
|
397
|
+
/**
|
|
398
|
+
* External subtitle files to attach when the source loads. Forwarded
|
|
399
|
+
* to the inner <avbridge-video>. Takes effect on next bootstrap.
|
|
400
|
+
*/
|
|
401
|
+
get subtitles(): unknown;
|
|
402
|
+
set subtitles(value: unknown);
|
|
403
|
+
/** Attach a subtitle track to the current playback without a reload. */
|
|
404
|
+
addSubtitle(subtitle: {
|
|
405
|
+
url: string;
|
|
406
|
+
language?: string;
|
|
407
|
+
format?: "vtt" | "srt";
|
|
408
|
+
}): Promise<void>;
|
|
409
|
+
get player(): unknown;
|
|
410
|
+
get videoElement(): HTMLVideoElement;
|
|
411
|
+
play(): Promise<void>;
|
|
412
|
+
pause(): void;
|
|
413
|
+
load(): Promise<void>;
|
|
414
|
+
destroy(): Promise<void>;
|
|
415
|
+
setAudioTrack(id: number): Promise<void>;
|
|
416
|
+
setSubtitleTrack(id: number | null): Promise<void>;
|
|
417
|
+
getDiagnostics(): unknown;
|
|
418
|
+
canPlayType(mime: string): string;
|
|
419
|
+
addEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
420
|
+
addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
421
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
|
|
422
|
+
removeEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
|
|
423
|
+
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgePlayerElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
|
|
424
|
+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
|
|
425
|
+
}
|
|
367
426
|
|
|
368
427
|
declare class UnifiedPlayer {
|
|
369
428
|
private readonly options;
|
|
@@ -504,7 +563,20 @@ declare class AvbridgeVideoElement extends HTMLElementCtor {
|
|
|
504
563
|
private _strategy;
|
|
505
564
|
private _strategyClass;
|
|
506
565
|
private _audioTracks;
|
|
566
|
+
/** Subtitle tracks reported by the active UnifiedPlayer (options.subtitles
|
|
567
|
+
* + embedded container tracks + programmatic addSubtitle calls). */
|
|
507
568
|
private _subtitleTracks;
|
|
569
|
+
/** Subtitle tracks derived from light-DOM `<track>` children. Maintained
|
|
570
|
+
* by _syncTextTracks on every mutation. Merged into the public
|
|
571
|
+
* `subtitleTracks` getter so the player's settings menu sees them. */
|
|
572
|
+
private _htmlTrackInfo;
|
|
573
|
+
/**
|
|
574
|
+
* External subtitle list forwarded to `createPlayer()` on the next
|
|
575
|
+
* bootstrap. Setting this after bootstrap queues it for the next
|
|
576
|
+
* source change; consumers that need to swap subtitles mid-playback
|
|
577
|
+
* should set `source` to reload.
|
|
578
|
+
*/
|
|
579
|
+
private _subtitles;
|
|
508
580
|
/**
|
|
509
581
|
* Initial strategy preference. `"auto"` means "let the classifier decide";
|
|
510
582
|
* any other value is passed to `createPlayer({ initialStrategy })` and
|
|
@@ -621,6 +693,37 @@ declare class AvbridgeVideoElement extends HTMLElementCtor {
|
|
|
621
693
|
get player(): UnifiedPlayer | null;
|
|
622
694
|
get audioTracks(): AudioTrackInfo[];
|
|
623
695
|
get subtitleTracks(): SubtitleTrackInfo[];
|
|
696
|
+
/**
|
|
697
|
+
* External subtitle files to attach when the source loads. Takes effect
|
|
698
|
+
* on the next bootstrap — set before assigning `source`, or reload via
|
|
699
|
+
* `load()` after changing. For dynamic post-bootstrap addition, use
|
|
700
|
+
* `addSubtitle()` instead.
|
|
701
|
+
*
|
|
702
|
+
* @example
|
|
703
|
+
* el.subtitles = [{ url: "/en.srt", format: "srt", language: "en" }];
|
|
704
|
+
* el.src = "/movie.mp4";
|
|
705
|
+
*/
|
|
706
|
+
get subtitles(): Array<{
|
|
707
|
+
url: string;
|
|
708
|
+
language?: string;
|
|
709
|
+
format?: "vtt" | "srt";
|
|
710
|
+
}> | null;
|
|
711
|
+
set subtitles(value: Array<{
|
|
712
|
+
url: string;
|
|
713
|
+
language?: string;
|
|
714
|
+
format?: "vtt" | "srt";
|
|
715
|
+
}> | null);
|
|
716
|
+
/**
|
|
717
|
+
* Attach a subtitle track to the current playback without rebuilding
|
|
718
|
+
* the player. Works while the element is playing — converts SRT to
|
|
719
|
+
* VTT if needed, adds a `<track>` to the inner `<video>`. Canvas
|
|
720
|
+
* strategies pick up the new track via their textTracks watcher.
|
|
721
|
+
*/
|
|
722
|
+
addSubtitle(subtitle: {
|
|
723
|
+
url: string;
|
|
724
|
+
language?: string;
|
|
725
|
+
format?: "vtt" | "srt";
|
|
726
|
+
}): Promise<void>;
|
|
624
727
|
/** Force a (re-)bootstrap if a source is currently set. */
|
|
625
728
|
load(): Promise<void>;
|
|
626
729
|
/**
|
|
@@ -637,6 +740,12 @@ declare class AvbridgeVideoElement extends HTMLElementCtor {
|
|
|
637
740
|
setAudioTrack(id: number): Promise<void>;
|
|
638
741
|
setSubtitleTrack(id: number | null): Promise<void>;
|
|
639
742
|
getDiagnostics(): DiagnosticsSnapshot | null;
|
|
743
|
+
addEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
744
|
+
addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
745
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
|
|
746
|
+
removeEventListener<K extends keyof AvbridgeVideoElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: AvbridgeVideoElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
|
|
747
|
+
removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: AvbridgeVideoElement, ev: HTMLElementEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
|
|
748
|
+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
|
|
640
749
|
private _dispatch;
|
|
641
750
|
private _dispatchError;
|
|
642
751
|
}
|