@mediafox/core 1.0.4 → 1.1.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 CHANGED
@@ -1,5 +1,36 @@
1
1
  # MediaFox
2
2
 
3
+ Framework-agnostic media player library with full control over playback. Supports playlists, tracks, custom rendering, and more.
4
+
5
+ ## Features
6
+
7
+ - Canvas-based video rendering (WebGPU/WebGL/Canvas2D)
8
+ - Web Audio API integration
9
+ - Multi-track support (video/audio/subtitles)
10
+ - **Playlist support**: Sequential/manual play, position preservation
11
+ - Reactive state and type-safe events
12
+ - Framework-agnostic (React, Vue, Svelte, Angular, vanilla)
13
+
14
+ ## Quick Start
15
+
16
+ ```ts
17
+ import { MediaFox } from 'mediafox';
18
+
19
+ const player = new MediaFox({ renderTarget: canvas });
20
+ await player.load('video.mp4');
21
+ player.play();
22
+ ```
23
+
24
+ ### With Playlist
25
+
26
+ ```ts
27
+ await player.loadPlaylist(['video1.mp4', 'audio1.mp3']);
28
+ player.playlistMode = 'sequential';
29
+ player.play(); // Auto-switches on end
30
+ ```
31
+
32
+ See [docs/guide/getting-started.md](docs/guide/getting-started.md) for full setup.
33
+
3
34
  A framework-agnostic, TypeScript-first Media Player library powered by [Mediabunny](https://github.com/Vanilagy/mediabunny). MediaFox provides an ergonomic API for media playback with complete control over rendering and UI.
4
35
 
5
36
  ## Features
@@ -22,6 +22,7 @@ export declare class PlayerCore {
22
22
  seek(time: number): Promise<void>;
23
23
  stop(): Promise<void>;
24
24
  private handleError;
25
+ private updateCurrentPlaylistItemDuration;
25
26
  }
26
27
  export {};
27
28
  //# sourceMappingURL=player-core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"player-core.d.ts","sourceRoot":"","sources":["../../src/core/player-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAa,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,KAAK,MAAM,GAAG,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAE3C,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuFnE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,KAAK,IAAI,IAAI;IAMP,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,WAAW;CAKpB"}
1
+ {"version":3,"file":"player-core.d.ts","sourceRoot":"","sources":["../../src/core/player-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAa,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,KAAK,MAAM,GAAG,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAE1F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,aAAa,EAAE,aAAa,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAE3C,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwInE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,KAAK,IAAI,IAAI;IAMP,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,iCAAiC;CAY1C"}
@@ -1,16 +1,18 @@
1
1
  import type { Store } from '../state/store';
2
- import type { AudioTrackInfo, MediaInfo, PlayerStateData, SubtitleTrackInfo, VideoTrackInfo } from '../types';
2
+ import type { AudioTrackInfo, MediaInfo, PlayerStateData, Playlist, SubtitleTrackInfo, VideoTrackInfo } from '../types';
3
3
  export declare class StateFacade {
4
4
  private readonly store;
5
5
  constructor(store: Store);
6
6
  getState(): Readonly<PlayerStateData>;
7
7
  subscribe(listener: (state: PlayerStateData) => void): () => void;
8
+ setState(updates: Partial<PlayerStateData>): void;
8
9
  reset(): void;
9
10
  applyInitial(volume: number, muted: boolean, playbackRate: number): void;
10
11
  updateLoadingState(): void;
11
12
  updateReadyState(canPlay: boolean, canPlayThrough: boolean): void;
12
13
  updatePlaybackState(playing: boolean): void;
13
14
  updateSeekingState(seeking: boolean): void;
15
+ updateWaitingState(waiting: boolean): void;
14
16
  updateEndedState(ended: boolean): void;
15
17
  updateTime(currentTime: number): void;
16
18
  updateDuration(duration: number): void;
@@ -21,5 +23,6 @@ export declare class StateFacade {
21
23
  updateSelectedTracks(type: 'video' | 'audio' | 'subtitle', trackId: string | null): void;
22
24
  updateError(error: Error | null): void;
23
25
  updateRendererType(rendererType: import('../types').RendererType): void;
26
+ updatePlaylist(playlist: Playlist, currentIndex?: number | null): void;
24
27
  }
25
28
  //# sourceMappingURL=state-facade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"state-facade.d.ts","sourceRoot":"","sources":["../../src/core/state-facade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9G,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAGzC,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC;IAIrC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAKjE,KAAK,IAAI,IAAI;IAIb,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAKxE,kBAAkB,IAAI,IAAI;IAI1B,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAIjE,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3C,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAItC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIlD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9C,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIlD,YAAY,CACV,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,cAAc,CAAC,EAAE,iBAAiB,EAAE,GACnC,IAAI;IAIP,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIxF,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAItC,kBAAkB,CAAC,YAAY,EAAE,OAAO,UAAU,EAAE,YAAY,GAAG,IAAI;CAGxE"}
1
+ {"version":3,"file":"state-facade.d.ts","sourceRoot":"","sources":["../../src/core/state-facade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAExH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAGzC,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC;IAIrC,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAKjE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAKjD,KAAK,IAAI,IAAI;IAIb,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAKxE,kBAAkB,IAAI,IAAI;IAI1B,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAIjE,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI3C,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAItC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIlD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9C,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIlD,YAAY,CACV,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,cAAc,CAAC,EAAE,iBAAiB,EAAE,GACnC,IAAI;IAIP,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIxF,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAItC,kBAAkB,CAAC,YAAY,EAAE,OAAO,UAAU,EAAE,YAAY,GAAG,IAAI;IAIvE,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;CAG7E"}
package/dist/index.d.ts CHANGED
@@ -8,12 +8,14 @@ export { VideoRenderer } from './playback/renderer';
8
8
  export type { IRenderer, RendererCreationResult } from './playback/renderers';
9
9
  export { RendererFactory } from './playback/renderers';
10
10
  export { SourceManager } from './sources/manager';
11
+ export type { SourceItem, SourceOptions } from './sources/source';
12
+ export { Source } from './sources/source';
11
13
  export type { SourceInfo, SourceManagerOptions } from './sources/types';
12
14
  export { Store } from './state/store';
13
15
  export type { StateListener, StateStore, StateUnsubscribe } from './state/types';
14
16
  export { TrackManager } from './tracks/manager';
15
17
  export type { TrackManagerState, TrackSelectionEvent } from './tracks/types';
16
- export type { AudioTrackInfo, ChapterInfo, CuePoint, LoadOptions, MediaInfo, MediaSource, PerformanceMetrics, PlaybackMode, PlayerEventListener, PlayerEventMap, PlayerOptions, PlayerState, PlayerStateData, QualityLevel, RendererType, ScreenshotOptions, SeekOptions, Subscription, SubtitleTrackInfo, TimeRange, VideoTrackInfo, } from './types';
18
+ export type { AudioTrackInfo, ChapterInfo, CuePoint, LoadOptions, MediaInfo, MediaSource, PerformanceMetrics, PlaybackMode, PlayerEventListener, PlayerEventMap, PlayerOptions, PlayerState, PlayerStateData, Playlist, PlaylistItem, PlaylistMode, QualityLevel, RendererType, ScreenshotOptions, SeekOptions, Subscription, SubtitleTrackInfo, TimeRange, VideoTrackInfo, } from './types';
17
19
  export { ErrorCode, MediaFoxError, wrapError, } from './utils/errors';
18
20
  export { clamp, findBufferedRange, formatTime, frameToTime, mergeTimeRanges, parseTime, timeRangesOverlap, timeToFrame, totalBufferedDuration, } from './utils/time';
19
21
  export declare const VERSION = "0.1.0";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,YAAY,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACR,WAAW,EACX,SAAS,EAET,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,SAAS,EACT,aAAa,EACb,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,aAAa,EACb,UAAU,EACV,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,YAAY,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACR,WAAW,EACX,SAAS,EAET,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,WAAW,EACX,eAAe,EAEf,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,SAAS,EACT,aAAa,EACb,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAGtB,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,eAAe,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- class _{events=new Map;maxListeners;captureRejections;constructor(S={}){this.maxListeners=S.maxListeners??10,this.captureRejections=S.captureRejections??!1}on(S,A){if(!this.events.has(S))this.events.set(S,new Set);let O=this.events.get(S);if(!O)return()=>{};if(O.size>=this.maxListeners)console.warn(`MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ${O.size} ${String(S)} listeners added. Use emitter.setMaxListeners() to increase limit`);let V=A;return O.add(V),()=>{O.delete(V)}}once(S,A){let O=(V)=>{this.off(S,O),A(V)};return this.on(S,O)}off(S,A){let O=this.events.get(S);if(!O)return;if(A){let V=A;O.delete(V)}else O.clear()}emit(S,A){let O=this.events.get(S);if(!O||O.size===0)return;for(let V of O)try{let $=V(A);if(this.captureRejections&&l($))$.catch((j)=>{if(this.events.has("error"))this.emit("error",j);else throw j})}catch($){if(this.captureRejections&&this.events.has("error"))this.emit("error",$);else throw $}}removeAllListeners(S){if(S)this.events.delete(S);else this.events.clear()}setMaxListeners(S){this.maxListeners=S}getMaxListeners(){return this.maxListeners}listeners(S){let A=this.events.get(S);return A?Array.from(A):[]}listenerCount(S){let A=this.events.get(S);return A?A.size:0}eventNames(){return Array.from(this.events.keys())}}function l(S){if(!S||typeof S!=="object"&&typeof S!=="function")return!1;let A=S;return typeof A.then==="function"&&typeof A.catch==="function"}var q=2,M="[MediaFox]";function d(S){q=S}function c(S,...A){if(q<=0)console.debug(`${M} ${S}`,...A)}function n(S,...A){if(q<=1)console.info(`${M} ${S}`,...A)}function i(S,...A){if(q<=2)console.warn(`${M} ${S}`,...A)}function s(S,...A){if(q<=3)console.error(`${M} ${S}`,...A)}var B={setLevel:d,debug:c,info:n,warn:i,error:s};class H{deps;constructor(S){this.deps=S}async load(S,A={}){try{await this.deps.playbackController.reset(),this.deps.state.reset(),this.deps.state.updateLoadingState(),this.deps.emit("loadstart",void 0);let V=(await this.deps.sourceManager.createSource(S)).input;if(!V)throw Error("Failed to create input from source");await this.deps.trackManager.initialize(V);let[$,j,P,D]=await Promise.all([V.computeDuration(),V.getFormat(),V.getMimeType(),V.getMetadataTags()]),J={duration:$,format:j.name,mimeType:P,metadata:D,hasVideo:this.deps.trackManager.hasVideo(),hasAudio:this.deps.trackManager.hasAudio(),hasSubtitles:this.deps.trackManager.hasSubtitles()};this.deps.state.updateDuration($),this.deps.state.updateMediaInfo(J),this.deps.state.updateTracks(this.deps.trackManager.getVideoTracks(),this.deps.trackManager.getAudioTracks(),this.deps.trackManager.getSubtitleTracks()),this.deps.playbackController.setDuration($);let K=this.deps.trackManager.getPrimaryVideoTrack(),Y=this.deps.trackManager.getPrimaryAudioTrack(),Q="",z=!1,X=!1;if(K||Y){let Z=await this.deps.trackSwitcher.setupInitialTracks(K,Y);Q+=Z.warningMessage,z=Z.videoSupported,X=Z.audioSupported}if(!z&&!X){if(!Q)Q="No audio or video track found.";throw Error(Q)}if(Q&&(z||X))this.deps.emit("warning",{type:"codec-warning",message:Q.trim(),error:void 0});if(this.deps.state.updateReadyState(!0,!0),this.deps.emit("loadedmetadata",J),this.deps.emit("loadeddata",void 0),this.deps.emit("canplay",void 0),this.deps.emit("canplaythrough",void 0),A.autoplay)await this.play();if(A.startTime!==void 0)await this.seek(A.startTime)}catch(O){throw this.handleError(O),O}}async play(){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");await this.deps.playbackController.play(),this.deps.state.updatePlaybackState(!0),this.deps.emit("play",void 0),this.deps.emit("playing",void 0)}catch(S){throw this.handleError(S),S}}pause(){this.deps.playbackController.pause(),this.deps.state.updatePlaybackState(!1),this.deps.emit("pause",void 0)}async seek(S){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");this.deps.state.updateSeekingState(!0),this.deps.emit("seeking",{currentTime:S}),await this.deps.playbackController.seek(S),this.deps.state.updateSeekingState(!1),this.deps.state.updateTime(this.deps.playbackController.getCurrentTime()),this.deps.emit("seeked",{currentTime:this.deps.playbackController.getCurrentTime()})}catch(A){throw this.deps.state.updateSeekingState(!1),this.handleError(A),A}}async stop(){try{this.pause(),await this.seek(0)}catch(S){throw this.handleError(S),S}}handleError(S){this.deps.state.updateError(S),this.deps.emit("error",S),B.error("Player error:",S)}}class W{store;constructor(S){this.store=S}getState(){return this.store.getState()}subscribe(S){return this.store.subscribe(S)}reset(){this.store.reset()}applyInitial(S,A,O){this.store.setState({volume:S,muted:A,playbackRate:O})}updateLoadingState(){this.store.updateLoadingState()}updateReadyState(S,A){this.store.updateReadyState(S,A)}updatePlaybackState(S){this.store.updatePlaybackState(S)}updateSeekingState(S){this.store.updateSeekingState(S)}updateEndedState(S){this.store.updateEndedState(S)}updateTime(S){this.store.updateTime(S)}updateDuration(S){this.store.updateDuration(S)}updateVolume(S,A){this.store.updateVolume(S,A)}updatePlaybackRate(S){this.store.updatePlaybackRate(S)}updateMediaInfo(S){this.store.updateMediaInfo(S)}updateTracks(S,A,O){this.store.updateTracks(S,A,O)}updateSelectedTracks(S,A){this.store.updateSelectedTracks(S,A)}updateError(S){this.store.updateError(S)}updateRendererType(S){this.store.updateRendererType(S)}}class w{chains=new Map;async run(S,A){let O=this.chains.get(S)??Promise.resolve(),V,$=new Promise((j)=>{V=j});this.chains.set(S,O.then(()=>$));try{return await O,await A()}finally{V?.()}}}class y{deps;locks=new w;constructor(S){this.deps=S}async setupInitialTracks(S,A){let O=!1,V=!1,$="";if(S)try{if(O=await this.locks.run("video",async()=>{if(S.codec!==null&&await S.canDecode())return await this.deps.playbackController.trySetVideoTrack(S);return!1}),!O)$+="Unsupported video codec. "}catch(j){$+="Failed to set up video track. ",B.warn("Video track error:",j)}if(A)try{if(V=await this.locks.run("audio",async()=>{if(A.codec!==null&&await A.canDecode())return await this.deps.playbackController.trySetAudioTrack(A);return!1}),!V)$+="Unsupported audio codec. "}catch(j){$+="Failed to set up audio track. ",B.warn("Audio track error:",j)}if(!O&&!V&&!$)$="No audio or video track found.";return{videoSupported:O,audioSupported:V,warningMessage:$}}async selectVideoTrack(S,A){if(!S.selectVideoTrack(A))throw Error(`Invalid video track ID: ${A}`);let O=S.getSelectedVideoTrack();if(!O){await this.deps.playbackController.setVideoTrack(null);return}if(!await this.locks.run("video",async()=>{if(O.codec!==null&&await O.canDecode())return await this.deps.playbackController.trySetVideoTrack(O);return!1}))this.deps.emit("warning",{type:"video-codec-unsupported",message:"Video codec not supported.",error:void 0}),await this.deps.playbackController.setVideoTrack(null)}async selectAudioTrack(S,A){if(!S.selectAudioTrack(A))throw Error(`Invalid audio track ID: ${A}`);let O=S.getSelectedAudioTrack();if(!O){await this.deps.playbackController.setAudioTrack(null);return}if(!await this.locks.run("audio",async()=>{if(O.codec!==null&&await O.canDecode())return await this.deps.playbackController.trySetAudioTrack(O);return!1}))this.deps.emit("warning",{type:"audio-codec-unsupported",message:"Audio codec not supported. Continuing without audio.",error:void 0}),await this.deps.playbackController.setAudioTrack(null)}}import{AudioBufferSink as t,AudioSampleSink as a}from"mediabunny";class f{audioContext;gainNode=null;bufferSink=null;sampleSink=null;bufferIterator=null;queuedNodes=new Set;startContextTime=0;startMediaTime=0;pauseTime=0;playing=!1;volume=1;muted=!1;disposed=!1;playbackId=0;playbackRate=1;constructor(S={}){if(S.audioContext)this.audioContext=S.audioContext;else{let A=window,O=A.AudioContext||A.webkitAudioContext;this.audioContext=new O}this.volume=S.volume??1,this.muted=S.muted??!1,this.setupAudioGraph()}setupAudioGraph(){this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination),this.updateGain()}async setAudioTrack(S){if(this.dispose(),S.codec===null)throw Error("Unsupported audio codec");if(!await S.canDecode())throw Error(`Cannot decode audio track with codec: ${S.codec}`);this.bufferSink=new t(S),this.sampleSink=new a(S),this.disposed=!1}async play(S=this.pauseTime){if(this.playing||!this.bufferSink)return;if(this.audioContext.state==="suspended")await this.audioContext.resume();this.playbackId++;let A=this.playbackId;this.playing=!0,this.startContextTime=this.audioContext.currentTime,this.startMediaTime=S,this.pauseTime=S,this.bufferIterator=this.bufferSink.buffers(S),this.scheduleAudioBuffers(A)}async scheduleAudioBuffers(S){if(!this.bufferIterator||!this.gainNode)return;try{for await(let{buffer:A,timestamp:O}of this.bufferIterator){if(S!==this.playbackId||this.disposed||!this.playing)break;let V=this.audioContext.createBufferSource();V.buffer=A,V.connect(this.gainNode),V.playbackRate.value=this.playbackRate,V.playbackRate.setValueAtTime(this.playbackRate,this.audioContext.currentTime);let $=this.startContextTime+(O-this.startMediaTime)/this.playbackRate;if($>=this.audioContext.currentTime)V.start($);else{let j=Math.max(0,(this.audioContext.currentTime-$)*this.playbackRate);if(j<A.duration)V.start(this.audioContext.currentTime,j);else continue}if(this.queuedNodes.add(V),V.onended=()=>{this.queuedNodes.delete(V)},O-this.getCurrentTime()>=1)await this.waitForCatchup(O)}}catch(A){console.error("Error scheduling audio buffers:",A)}}async waitForCatchup(S){return new Promise((A)=>{let O=setInterval(()=>{if(S-this.getCurrentTime()<1||!this.playing)clearInterval(O),A()},100)})}pause(){if(!this.playing)return;let S=this.getCurrentTime();if(this.playing=!1,this.pauseTime=S,this.stopQueuedNodes(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null}stop(){this.pause(),this.pauseTime=0,this.startContextTime=0,this.startMediaTime=0}async seek(S){let A=this.playing;if(A)this.pause();if(this.pauseTime=S,A)await this.play(S)}getCurrentTime(){if(this.playing){let S=this.audioContext.currentTime-this.startContextTime;return this.startMediaTime+S*this.playbackRate}return this.pauseTime}setVolume(S){this.volume=Math.max(0,Math.min(1,S)),this.updateGain()}setMuted(S){this.muted=S,this.updateGain()}updateGain(){if(!this.gainNode)return;let S=this.muted?0:this.volume;this.gainNode.gain.value=S*S}getVolume(){return this.volume}isMuted(){return this.muted}isPlaying(){return this.playing}setPlaybackRate(S){let A=Math.max(0.25,Math.min(4,S));if(this.playbackRate===A)return;let O=this.playing,V=this.getCurrentTime();if(this.playbackRate=A,O)this.pause(),this.pauseTime=V,this.play(V)}getAudioContext(){return this.audioContext}async getBufferAt(S){if(!this.bufferSink)return null;return this.bufferSink.getBuffer(S)}async getSampleAt(S){if(!this.sampleSink)return null;return this.sampleSink.getSample(S)}stopQueuedNodes(){for(let S of this.queuedNodes)try{S.stop()}catch{}this.queuedNodes.clear()}dispose(){if(this.disposed=!0,this.playbackId++,this.stop(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null;this.bufferSink=null,this.sampleSink=null}destroy(){if(this.dispose(),this.gainNode)this.gainNode.disconnect(),this.gainNode=null;if(this.audioContext.state!=="closed")this.audioContext.close()}}import{CanvasSink as r,VideoSampleSink as e}from"mediabunny";class G{canvas;ctx=null;isInitialized=!1;constructor(S){this.canvas=S.canvas,this.initialize()}initialize(){try{if(this.ctx=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),!this.ctx)return!1;return this.ctx.imageSmoothingEnabled=!0,this.ctx.imageSmoothingQuality="high",this.isInitialized=!0,!0}catch{return!1}}isReady(){return this.isInitialized&&this.ctx!==null}render(S){if(!this.isReady()||!this.ctx)return!1;try{let{width:A,height:O}=S;if(A===0||O===0)return!1;let V=this.canvas.width,$=this.canvas.height;if(V===0||$===0)return!1;let j=Math.min(V/A,$/O),P=Math.round(A*j),D=Math.round(O*j),J=Math.round((V-P)/2),K=Math.round(($-D)/2);return this.ctx.fillStyle="black",this.ctx.fillRect(0,0,V,$),this.ctx.drawImage(S,0,0,A,O,J,K,P,D),!0}catch{return!1}}clear(){if(!this.isReady()||!this.ctx)return;this.ctx.fillStyle="black",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height)}dispose(){this.ctx=null,this.isInitialized=!1}}class I{resources;isInitialized=!1;canvas;textureWidth=0;textureHeight=0;options;boundHandleContextLost=null;boundHandleContextRestored=null;vertexShaderSource=`
1
+ class M{events=new Map;maxListeners;captureRejections;constructor(A={}){this.maxListeners=A.maxListeners??10,this.captureRejections=A.captureRejections??!1}on(A,O){if(!this.events.has(A))this.events.set(A,new Set);let S=this.events.get(A);if(!S)return()=>{};if(S.size>=this.maxListeners)console.warn(`MaxListenersExceededWarning: Possible EventEmitter memory leak detected. ${S.size} ${String(A)} listeners added. Use emitter.setMaxListeners() to increase limit`);let $=O;return S.add($),()=>{S.delete($)}}once(A,O){let S=($)=>{this.off(A,S),O($)};return this.on(A,S)}off(A,O){let S=this.events.get(A);if(!S)return;if(O){let $=O;S.delete($)}else S.clear()}emit(A,O){let S=this.events.get(A);if(!S||S.size===0)return;for(let $ of S)try{let j=$(O);if(this.captureRejections&&n(j))j.catch((V)=>{if(this.events.has("error"))this.emit("error",V);else throw V})}catch(j){if(this.captureRejections&&this.events.has("error"))this.emit("error",j);else throw j}}removeAllListeners(A){if(A)this.events.delete(A);else this.events.clear()}setMaxListeners(A){this.maxListeners=A}getMaxListeners(){return this.maxListeners}listeners(A){let O=this.events.get(A);return O?Array.from(O):[]}listenerCount(A){let O=this.events.get(A);return O?O.size:0}eventNames(){return Array.from(this.events.keys())}}function n(A){if(!A||typeof A!=="object"&&typeof A!=="function")return!1;let O=A;return typeof O.then==="function"&&typeof O.catch==="function"}import{CanvasSink as t,VideoSampleSink as a}from"mediabunny";class _{canvas;ctx=null;isInitialized=!1;constructor(A){this.canvas=A.canvas,this.initialize()}initialize(){try{if(this.ctx=this.canvas.getContext("2d",{alpha:!1,desynchronized:!0}),!this.ctx)return!1;return this.ctx.imageSmoothingEnabled=!0,this.ctx.imageSmoothingQuality="high",this.isInitialized=!0,!0}catch{return!1}}isReady(){return this.isInitialized&&this.ctx!==null}render(A){if(!this.isReady()||!this.ctx)return!1;try{let{width:O,height:S}=A;if(O===0||S===0)return!1;let $=this.canvas.width,j=this.canvas.height;if($===0||j===0)return!1;let V=Math.min($/O,j/S),K=Math.round(O*V),N=Math.round(S*V),U=Math.round(($-K)/2),Q=Math.round((j-N)/2);return this.ctx.fillStyle="black",this.ctx.fillRect(0,0,$,j),this.ctx.drawImage(A,0,0,O,S,U,Q,K,N),!0}catch{return!1}}clear(){if(!this.isReady()||!this.ctx)return;this.ctx.fillStyle="black",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height)}dispose(){this.ctx=null,this.isInitialized=!1}}class w{resources;isInitialized=!1;canvas;textureWidth=0;textureHeight=0;options;boundHandleContextLost=null;boundHandleContextRestored=null;vertexShaderSource=`
2
2
  attribute vec2 a_position;
3
3
  attribute vec2 a_texCoord;
4
4
  varying vec2 v_texCoord;
@@ -16,7 +16,7 @@ class _{events=new Map;maxListeners;captureRejections;constructor(S={}){this.max
16
16
  vec4 color = texture2D(u_texture, v_texCoord);
17
17
  gl_FragColor = color;
18
18
  }
19
- `;constructor(S){this.canvas=S.canvas,this.options=S,this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.initialize()}initialize(){try{let S={alpha:this.options.alpha??!1,antialias:this.options.antialias??!1,depth:!1,stencil:!1,preserveDrawingBuffer:this.options.preserveDrawingBuffer??!1,powerPreference:this.options.powerPreference??"high-performance"},A=this.canvas.getContext("webgl",S);if(!A&&"getContext"in this.canvas)A=this.canvas.getContext("experimental-webgl",S);if(!A)return!1;this.resources.gl=A;let O=this.createShader(A,A.VERTEX_SHADER,this.vertexShaderSource),V=this.createShader(A,A.FRAGMENT_SHADER,this.fragmentShaderSource);if(!O||!V)throw Error("Failed to create shaders");let $=A.createProgram();if(!$)throw Error("Failed to create program");if(A.attachShader($,O),A.attachShader($,V),A.linkProgram($),!A.getProgramParameter($,A.LINK_STATUS)){let P=A.getProgramInfoLog($);throw Error(`Failed to link program: ${P}`)}this.resources.program=$,this.resources.positionLocation=A.getAttribLocation($,"a_position"),this.resources.texCoordLocation=A.getAttribLocation($,"a_texCoord"),this.resources.textureLocation=A.getUniformLocation($,"u_texture"),this.setupQuadBuffers(A);let j=A.createTexture();if(!j)throw Error("Failed to create texture");if(A.bindTexture(A.TEXTURE_2D,j),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,A.CLAMP_TO_EDGE),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,A.LINEAR),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,A.LINEAR),this.resources.texture=j,A.disable(A.DEPTH_TEST),A.disable(A.CULL_FACE),A.disable(A.BLEND),"addEventListener"in this.canvas)this.boundHandleContextLost=this.handleContextLost.bind(this),this.boundHandleContextRestored=this.handleContextRestored.bind(this),this.canvas.addEventListener("webglcontextlost",this.boundHandleContextLost,!1),this.canvas.addEventListener("webglcontextrestored",this.boundHandleContextRestored,!1);return this.isInitialized=!0,!0}catch{return this.cleanup(),!1}}createShader(S,A,O){let V=S.createShader(A);if(!V)return null;if(S.shaderSource(V,O),S.compileShader(V),!S.getShaderParameter(V,S.COMPILE_STATUS))return S.deleteShader(V),null;return V}setupQuadBuffers(S){let A=new Float32Array([-1,-1,1,-1,-1,1,1,1]),O=new Float32Array([0,1,1,1,0,0,1,0]),V=S.createBuffer();S.bindBuffer(S.ARRAY_BUFFER,V),S.bufferData(S.ARRAY_BUFFER,A,S.STATIC_DRAW),this.resources.vertexBuffer=V;let $=S.createBuffer();S.bindBuffer(S.ARRAY_BUFFER,$),S.bufferData(S.ARRAY_BUFFER,O,S.STATIC_DRAW),this.resources.texCoordBuffer=$}isReady(){return this.isInitialized&&this.resources.gl!==null}render(S){if(!this.isInitialized||!this.resources.gl)return!1;let A=this.resources.gl;try{let{width:O,height:V}=S;if(O===0||V===0)return!1;let $=this.canvas.width,j=this.canvas.height;if($===0||j===0)return!1;if(A.viewport(0,0,$,j),A.bindTexture(A.TEXTURE_2D,this.resources.texture),O!==this.textureWidth||V!==this.textureHeight)A.texImage2D(A.TEXTURE_2D,0,A.RGBA,A.RGBA,A.UNSIGNED_BYTE,S),this.textureWidth=O,this.textureHeight=V;else A.texSubImage2D(A.TEXTURE_2D,0,0,0,A.RGBA,A.UNSIGNED_BYTE,S);A.clearColor(0,0,0,1),A.clear(A.COLOR_BUFFER_BIT);let P=Math.min($/this.textureWidth,j/this.textureHeight),D=Math.round(this.textureWidth*P),J=Math.round(this.textureHeight*P),K=Math.round(($-D)/2),Y=Math.round((j-J)/2),Q=K/$*2-1,z=(K+D)/$*2-1,X=1-Y/j*2,Z=1-(Y+J)/j*2,L=new Float32Array([Q,Z,z,Z,Q,X,z,X]);return A.bindBuffer(A.ARRAY_BUFFER,this.resources.vertexBuffer),A.bufferData(A.ARRAY_BUFFER,L,A.DYNAMIC_DRAW),A.useProgram(this.resources.program),A.bindBuffer(A.ARRAY_BUFFER,this.resources.vertexBuffer),A.enableVertexAttribArray(this.resources.positionLocation),A.vertexAttribPointer(this.resources.positionLocation,2,A.FLOAT,!1,0,0),A.bindBuffer(A.ARRAY_BUFFER,this.resources.texCoordBuffer),A.enableVertexAttribArray(this.resources.texCoordLocation),A.vertexAttribPointer(this.resources.texCoordLocation,2,A.FLOAT,!1,0,0),A.uniform1i(this.resources.textureLocation,0),A.drawArrays(A.TRIANGLE_STRIP,0,4),!0}catch{return!1}}clear(){if(!this.resources.gl)return;let S=this.resources.gl;S.clearColor(0,0,0,1),S.clear(S.COLOR_BUFFER_BIT)}handleContextLost(S){S.preventDefault(),this.isInitialized=!1}handleContextRestored(){this.initialize()}cleanup(){let S=this.resources.gl;if(!S)return;if(this.resources.texture)S.deleteTexture(this.resources.texture);if(this.resources.vertexBuffer)S.deleteBuffer(this.resources.vertexBuffer);if(this.resources.texCoordBuffer)S.deleteBuffer(this.resources.texCoordBuffer);if(this.resources.program)S.deleteProgram(this.resources.program);this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.isInitialized=!1}dispose(){if(this.resources.gl){let S=this.resources.gl.getExtension("WEBGL_lose_context");if(S)try{S.loseContext()}catch{}}if(this.cleanup(),"removeEventListener"in this.canvas){if(this.boundHandleContextLost)this.canvas.removeEventListener("webglcontextlost",this.boundHandleContextLost),this.boundHandleContextLost=null;if(this.boundHandleContextRestored)this.canvas.removeEventListener("webglcontextrestored",this.boundHandleContextRestored),this.boundHandleContextRestored=null}}}class u{canvas;device=null;context=null;pipeline=null;texture=null;sampler=null;bindGroup=null;vertexBuffer=null;isInitialized=!1;textureWidth=0;textureHeight=0;powerPreference;vertexShaderSource=`
19
+ `;constructor(A){this.canvas=A.canvas,this.options=A,this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.initialize()}initialize(){try{let A={alpha:this.options.alpha??!1,antialias:this.options.antialias??!1,depth:!1,stencil:!1,preserveDrawingBuffer:this.options.preserveDrawingBuffer??!1,powerPreference:this.options.powerPreference??"high-performance"},O=this.canvas.getContext("webgl",A);if(!O&&"getContext"in this.canvas)O=this.canvas.getContext("experimental-webgl",A);if(!O)return!1;this.resources.gl=O;let S=this.createShader(O,O.VERTEX_SHADER,this.vertexShaderSource),$=this.createShader(O,O.FRAGMENT_SHADER,this.fragmentShaderSource);if(!S||!$)throw Error("Failed to create shaders");let j=O.createProgram();if(!j)throw Error("Failed to create program");if(O.attachShader(j,S),O.attachShader(j,$),O.linkProgram(j),!O.getProgramParameter(j,O.LINK_STATUS)){let K=O.getProgramInfoLog(j);throw Error(`Failed to link program: ${K}`)}this.resources.program=j,this.resources.positionLocation=O.getAttribLocation(j,"a_position"),this.resources.texCoordLocation=O.getAttribLocation(j,"a_texCoord"),this.resources.textureLocation=O.getUniformLocation(j,"u_texture"),this.setupQuadBuffers(O);let V=O.createTexture();if(!V)throw Error("Failed to create texture");if(O.bindTexture(O.TEXTURE_2D,V),O.texParameteri(O.TEXTURE_2D,O.TEXTURE_WRAP_S,O.CLAMP_TO_EDGE),O.texParameteri(O.TEXTURE_2D,O.TEXTURE_WRAP_T,O.CLAMP_TO_EDGE),O.texParameteri(O.TEXTURE_2D,O.TEXTURE_MIN_FILTER,O.LINEAR),O.texParameteri(O.TEXTURE_2D,O.TEXTURE_MAG_FILTER,O.LINEAR),this.resources.texture=V,O.disable(O.DEPTH_TEST),O.disable(O.CULL_FACE),O.disable(O.BLEND),"addEventListener"in this.canvas)this.boundHandleContextLost=this.handleContextLost.bind(this),this.boundHandleContextRestored=this.handleContextRestored.bind(this),this.canvas.addEventListener("webglcontextlost",this.boundHandleContextLost,!1),this.canvas.addEventListener("webglcontextrestored",this.boundHandleContextRestored,!1);return this.isInitialized=!0,!0}catch{return this.cleanup(),!1}}createShader(A,O,S){let $=A.createShader(O);if(!$)return null;if(A.shaderSource($,S),A.compileShader($),!A.getShaderParameter($,A.COMPILE_STATUS))return A.deleteShader($),null;return $}setupQuadBuffers(A){let O=new Float32Array([-1,-1,1,-1,-1,1,1,1]),S=new Float32Array([0,1,1,1,0,0,1,0]),$=A.createBuffer();A.bindBuffer(A.ARRAY_BUFFER,$),A.bufferData(A.ARRAY_BUFFER,O,A.STATIC_DRAW),this.resources.vertexBuffer=$;let j=A.createBuffer();A.bindBuffer(A.ARRAY_BUFFER,j),A.bufferData(A.ARRAY_BUFFER,S,A.STATIC_DRAW),this.resources.texCoordBuffer=j}isReady(){return this.isInitialized&&this.resources.gl!==null}render(A){if(!this.isInitialized||!this.resources.gl)return!1;let O=this.resources.gl;try{let{width:S,height:$}=A;if(S===0||$===0)return!1;let j=this.canvas.width,V=this.canvas.height;if(j===0||V===0)return!1;if(O.viewport(0,0,j,V),O.bindTexture(O.TEXTURE_2D,this.resources.texture),S!==this.textureWidth||$!==this.textureHeight)O.texImage2D(O.TEXTURE_2D,0,O.RGBA,O.RGBA,O.UNSIGNED_BYTE,A),this.textureWidth=S,this.textureHeight=$;else O.texSubImage2D(O.TEXTURE_2D,0,0,0,O.RGBA,O.UNSIGNED_BYTE,A);O.clearColor(0,0,0,1),O.clear(O.COLOR_BUFFER_BIT);let K=Math.min(j/this.textureWidth,V/this.textureHeight),N=Math.round(this.textureWidth*K),U=Math.round(this.textureHeight*K),Q=Math.round((j-N)/2),J=Math.round((V-U)/2),Y=Q/j*2-1,B=(Q+N)/j*2-1,X=1-J/V*2,G=1-(J+U)/V*2,L=new Float32Array([Y,G,B,G,Y,X,B,X]);return O.bindBuffer(O.ARRAY_BUFFER,this.resources.vertexBuffer),O.bufferData(O.ARRAY_BUFFER,L,O.DYNAMIC_DRAW),O.useProgram(this.resources.program),O.bindBuffer(O.ARRAY_BUFFER,this.resources.vertexBuffer),O.enableVertexAttribArray(this.resources.positionLocation),O.vertexAttribPointer(this.resources.positionLocation,2,O.FLOAT,!1,0,0),O.bindBuffer(O.ARRAY_BUFFER,this.resources.texCoordBuffer),O.enableVertexAttribArray(this.resources.texCoordLocation),O.vertexAttribPointer(this.resources.texCoordLocation,2,O.FLOAT,!1,0,0),O.uniform1i(this.resources.textureLocation,0),O.drawArrays(O.TRIANGLE_STRIP,0,4),!0}catch{return!1}}clear(){if(!this.resources.gl)return;let A=this.resources.gl;A.clearColor(0,0,0,1),A.clear(A.COLOR_BUFFER_BIT)}handleContextLost(A){A.preventDefault(),this.isInitialized=!1}handleContextRestored(){this.initialize()}cleanup(){let A=this.resources.gl;if(!A)return;if(this.resources.texture)A.deleteTexture(this.resources.texture);if(this.resources.vertexBuffer)A.deleteBuffer(this.resources.vertexBuffer);if(this.resources.texCoordBuffer)A.deleteBuffer(this.resources.texCoordBuffer);if(this.resources.program)A.deleteProgram(this.resources.program);this.resources={gl:null,program:null,texture:null,vertexBuffer:null,texCoordBuffer:null,positionLocation:-1,texCoordLocation:-1,textureLocation:null},this.isInitialized=!1}dispose(){if(this.resources.gl){let A=this.resources.gl.getExtension("WEBGL_lose_context");if(A)try{A.loseContext()}catch{}}if(this.cleanup(),"removeEventListener"in this.canvas){if(this.boundHandleContextLost)this.canvas.removeEventListener("webglcontextlost",this.boundHandleContextLost),this.boundHandleContextLost=null;if(this.boundHandleContextRestored)this.canvas.removeEventListener("webglcontextrestored",this.boundHandleContextRestored),this.boundHandleContextRestored=null}}}class x{canvas;device=null;context=null;pipeline=null;texture=null;sampler=null;bindGroup=null;vertexBuffer=null;isInitialized=!1;textureWidth=0;textureHeight=0;powerPreference;vertexShaderSource=`
20
20
  struct VSOut {
21
21
  @builtin(position) pos : vec4f,
22
22
  @location(0) uv : vec2f,
@@ -37,4 +37,4 @@ class _{events=new Map;maxListeners;captureRejections;constructor(S={}){this.max
37
37
  fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {
38
38
  return textureSample(texture_view, texture_sampler, uv);
39
39
  }
40
- `;constructor(S){this.canvas=S.canvas,this.powerPreference=S.powerPreference||"high-performance",this.initialize().catch((A)=>{console.error("WebGPU initialization failed:",A)})}async initialize(){try{let S=navigator;if(!S.gpu)return console.log("WebGPU not available in navigator"),!1;let A=await S.gpu.requestAdapter({powerPreference:this.powerPreference});if(!A)return console.log("WebGPU adapter not available"),!1;if(this.device=await A.requestDevice(),!this.device)return console.log("WebGPU device not available"),!1;if("getContext"in this.canvas)this.context=this.canvas.getContext("webgpu");if(!this.context)return console.log("WebGPU context not available on canvas"),!1;let O=S.gpu.getPreferredCanvasFormat();return this.context.configure({device:this.device,format:O,usage:GPUTextureUsage.RENDER_ATTACHMENT,alphaMode:"opaque"}),await this.createRenderPipeline(),this.createVertexBuffer(),this.isInitialized=!0,console.log("WebGPU renderer initialized successfully"),!0}catch(S){return console.error("WebGPU initialization error:",S),!1}}async createRenderPipeline(){if(!this.device)return;let S=navigator;if(!S.gpu)return;let A=this.device.createShaderModule({code:this.vertexShaderSource}),O=this.device.createShaderModule({code:this.fragmentShaderSource});this.pipeline=this.device.createRenderPipeline({layout:"auto",vertex:{module:A,entryPoint:"vs_main",buffers:[{arrayStride:16,attributes:[{shaderLocation:0,offset:0,format:"float32x2"},{shaderLocation:1,offset:8,format:"float32x2"}]}]},fragment:{module:O,entryPoint:"fs_main",targets:[{format:S.gpu.getPreferredCanvasFormat()}]},primitive:{topology:"triangle-strip"}})}createVertexBuffer(){if(!this.device)return;this.vertexBuffer=this.device.createBuffer({size:64,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}createTexture(S,A){if(!this.device)return;if(this.texture)this.texture.destroy();if(this.texture=this.device.createTexture({size:{width:S,height:A},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),!this.sampler)this.sampler=this.device.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"});this.createBindGroup()}createBindGroup(){if(!this.device||!this.texture||!this.sampler||!this.pipeline)return;this.bindGroup=this.device.createBindGroup({layout:this.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:this.sampler},{binding:1,resource:this.texture.createView()}]})}isReady(){return this.isInitialized&&this.device!==null&&this.context!==null&&this.pipeline!==null}render(S){if(!this.isReady()||!this.device||!this.context||!this.pipeline)return!1;try{let{width:A,height:O}=S;if(A===0||O===0)return console.warn(`WebGPU: Source canvas has zero dimensions (${A}x${O})`),!1;let V=this.canvas.width,$=this.canvas.height;if(V===0||$===0)return console.warn(`WebGPU: Output canvas has zero dimensions (${V}x${$})`),!1;if(A!==this.textureWidth||O!==this.textureHeight)this.createTexture(A,O),this.textureWidth=A,this.textureHeight=O;if(!this.texture)return!1;try{this.device.queue.copyExternalImageToTexture({source:S},{texture:this.texture},{width:A,height:O})}catch{let p=S.getContext("2d");if(!p)return!1;let m=p.getImageData(0,0,A,O),o=new Uint8Array(m.data.buffer);this.device.queue.writeTexture({texture:this.texture,origin:{x:0,y:0,z:0}},o,{bytesPerRow:A*4,rowsPerImage:O},{width:A,height:O,depthOrArrayLayers:1})}let j=this.device.createCommandEncoder(),P=this.context.getCurrentTexture().createView(),D=j.beginRenderPass({colorAttachments:[{view:P,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});if(D.setPipeline(this.pipeline),this.bindGroup)D.setBindGroup(0,this.bindGroup);let J=Math.min(V/this.textureWidth,$/this.textureHeight),K=Math.round(this.textureWidth*J),Y=Math.round(this.textureHeight*J),Q=Math.round((V-K)/2),z=Math.round(($-Y)/2),X=Q/V*2-1,Z=(Q+K)/V*2-1,L=1-z/$*2,h=1-(z+Y)/$*2,g=new Float32Array([X,h,0,1,Z,h,1,1,X,L,0,0,Z,L,1,0]);if(this.vertexBuffer)this.device.queue.writeBuffer(this.vertexBuffer,0,g),D.setVertexBuffer(0,this.vertexBuffer);return D.draw(4,1,0,0),D.end(),this.device.queue.submit([j.finish()]),!0}catch{return!1}}clear(){if(!this.isReady()||!this.device||!this.context)return;try{let S=this.device.createCommandEncoder(),A=this.context.getCurrentTexture().createView();S.beginRenderPass({colorAttachments:[{view:A,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([S.finish()])}catch{}}dispose(){try{if(this.texture)this.texture.destroy(),this.texture=null;if(this.vertexBuffer)this.vertexBuffer.destroy(),this.vertexBuffer=null;this.device=null,this.context=null,this.pipeline=null,this.sampler=null,this.bindGroup=null,this.isInitialized=!1}catch{}}}class U{canvas;powerPreference;constructor(S){this.canvas=S.canvas,this.powerPreference=S.powerPreference||"high-performance"}async createRenderer(S){try{switch(S){case"webgpu":return await this.createWebGPURenderer();case"webgl":return this.createWebGLRenderer();case"canvas2d":return this.createCanvas2DRenderer();default:return null}}catch{return null}}async createRendererWithFallback(S){let A=[S];if(S!=="webgl")A.push("webgl");if(S!=="canvas2d")A.push("canvas2d");for(let V of A){let $=await this.createRenderer(V);if($?.isReady())return{renderer:$,actualType:V};if($)$.dispose()}return{renderer:this.createCanvas2DRenderer(),actualType:"canvas2d"}}async createWebGPURenderer(){if(!navigator.gpu)return null;if(!("getContext"in this.canvas))return console.log("WebGPU requires HTMLCanvasElement, not OffscreenCanvas"),null;let A=new u({canvas:this.canvas,powerPreference:this.powerPreference}),O=1000,V=performance.now();if(await(async()=>{while(!A.isReady()){if(performance.now()-V>O)return console.log("WebGPU renderer initialization timed out"),!1;if("requestIdleCallback"in window)await new Promise((P)=>requestIdleCallback(()=>P(void 0)));else await new Promise((P)=>requestAnimationFrame(()=>P(void 0)))}return!0})())return console.log("WebGPU renderer initialized successfully"),A;return A.isReady()?A:null}createWebGLRenderer(){try{let S=new I({canvas:this.canvas,powerPreference:this.powerPreference,preserveDrawingBuffer:!1,antialias:!1,alpha:!1});return S.isReady()?S:null}catch{return null}}createCanvas2DRenderer(){return new G({canvas:this.canvas})}static getSupportedRenderers(){let S=[];if(navigator.gpu)S.push("webgpu");try{let O=document.createElement("canvas");if(O.getContext("webgl")||O.getContext("experimental-webgl"))S.push("webgl")}catch{}return S.push("canvas2d"),S}static getRendererDisplayName(S){switch(S){case"canvas2d":return"Canvas 2D";case"webgl":return"WebGL";case"webgpu":return"WebGPU";default:return"Unknown"}}static isRendererSupported(S){if(S==="canvas2d")return!0;return U.getSupportedRenderers().includes(S)}}class R{canvas=null;canvasSink=null;sampleSink=null;options;frameIterator=null;currentFrame=null;nextFrame=null;disposed=!1;renderingId=0;renderer=null;rendererType="canvas2d";onRendererChange;onRendererFallback;initPromise=null;resizeObserver=null;lastObservedWidth=0;lastObservedHeight=0;videoAspectRatio=null;debug=!1;constructor(S={}){if(this.options={poolSize:S.poolSize??2,rendererType:S.rendererType??"webgpu",...S},this.rendererType=this.options.rendererType??"webgpu",this.debug=S.debug??!1,this.initPromise=null,S.canvas){if(this.canvas=S.canvas,this.options.width!==void 0)S.canvas.width=this.options.width;if(this.options.height!==void 0)S.canvas.height=this.options.height;this.initPromise=this.initializeRenderer(S.canvas,this.rendererType).catch((A)=>{if(this.debug)console.error("Failed to initialize renderer:",A)}),this.setupResizeObserver(S.canvas)}}setupResizeObserver(S){if(!("getBoundingClientRect"in S)||typeof ResizeObserver>"u")return;if(this.options.width!==void 0||this.options.height!==void 0)return;this.cleanupResizeObserver();let A=S;this.resizeObserver=new ResizeObserver((O)=>{if(this.disposed||!this.resizeObserver)return;for(let V of O){let{width:$,height:j}=this.getCanvasDimensionsFromEntry(V,A);if($!==this.lastObservedWidth||j!==this.lastObservedHeight){if(this.lastObservedWidth=$,this.lastObservedHeight=j,A.width!==$||A.height!==j){if(A.width=$,A.height=j,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}}}});try{this.resizeObserver.observe(A,{box:"device-pixel-content-box"})}catch{try{this.resizeObserver.observe(A,{box:"content-box"})}catch{this.resizeObserver.observe(A)}}requestAnimationFrame(()=>{if(this.disposed||!this.resizeObserver)return;let{width:O,height:V}=this.getCanvasDimensionsFromCanvas(A);if(this.lastObservedWidth=O,this.lastObservedHeight=V,A.width!==O||A.height!==V){if(A.width=O,A.height=V,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}})}getCanvasDimensionsFromEntry(S,A){let O=0,V=0,$=window.devicePixelRatio||1;if(S.devicePixelContentBoxSize?.length)O=S.devicePixelContentBoxSize[0].inlineSize,V=S.devicePixelContentBoxSize[0].blockSize;else if(S.contentBoxSize?.length)O=Math.round(S.contentBoxSize[0].inlineSize*$),V=Math.round(S.contentBoxSize[0].blockSize*$);else if(S.contentRect)O=Math.round(S.contentRect.width*$),V=Math.round(S.contentRect.height*$);if(O===0||V===0)return this.getCanvasDimensionsFromCanvas(A);return{width:Math.max(1,O),height:Math.max(1,V)}}getCanvasDimensionsFromCanvas(S){let A=0,O=0,V=window.devicePixelRatio||1,$=S.getBoundingClientRect();if(A=Math.round($.width*V),O=Math.round($.height*V),A===0||O===0)A=Math.round(S.clientWidth*V)||A,O=Math.round(S.clientHeight*V)||O;if(A===0||O===0)console.warn("Canvas has zero dimensions after all fallbacks, using 1x1");return{width:Math.max(1,A),height:Math.max(1,O)}}cleanupResizeObserver(){if(this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null,this.lastObservedWidth=0,this.lastObservedHeight=0}retryUntilCanvasReady(S,A,O=60){let V=0,$=()=>{if(V++,S.canvas.width>0&&S.canvas.height>0)A();else if(V<O)requestAnimationFrame($);else{if(this.debug)console.warn("Canvas dimensions timeout, forcing action");A()}};requestAnimationFrame($)}updateCanvasAspectRatio(){if(!this.canvas||!this.videoAspectRatio||!("style"in this.canvas))return;this.canvas.style.aspectRatio=this.videoAspectRatio}updateCanvasBackingBuffer(S){let{width:A,height:O}=this.getCanvasDimensionsFromCanvas(S);if(S.width!==A||S.height!==O)return S.width=A,S.height=O,!0;return!1}async initializeRenderer(S,A){if(this.debug)console.log(`Initializing renderer: ${A}`);let V=await new U({canvas:S}).createRendererWithFallback(A);if(this.debug)console.log(`Renderer factory result: ${V.actualType}`);if(!V.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${V.actualType}) not ready`);throw V.renderer.dispose(),Error(`Failed to initialize renderer: ${V.actualType}`)}if(this.renderer=V.renderer,this.rendererType=V.actualType,this.debug)console.log(`Initialized renderer: ${this.rendererType}`);if(V.actualType!==A){if(this.onRendererFallback)this.onRendererFallback(A,V.actualType)}if(this.onRendererChange){if(this.debug)console.log(`Emitting renderer change: ${this.rendererType}`);this.onRendererChange(this.rendererType)}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Rendering initial frame with ${this.rendererType}`);if(this.currentFrame.canvas.width===0||this.currentFrame.canvas.height===0){if(this.debug)console.log("Initial frame has zero dimensions, scheduling render when ready...");this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame&&this.debug)console.log(`Canvas ready (${this.currentFrame.canvas.width}x${this.currentFrame.canvas.height}), rendering initial frame`);if(this.currentFrame)this.renderFrame(this.currentFrame)})}else this.renderFrame(this.currentFrame)}}async setCanvas(S){if(this.canvas=S,this.renderer)this.renderer.dispose(),this.renderer=null;if(this.options.width!==void 0)S.width=this.options.width;if(this.options.height!==void 0)S.height=this.options.height;this.setupResizeObserver(S);try{await this.initializeRenderer(S,this.rendererType)}catch(A){if(this.debug)console.error("Failed to initialize renderer:",A);if(!this.renderer){if(this.renderer=new G({canvas:S}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}async setVideoTrack(S){if(this.disposeVideoResources(),S.codec===null)throw Error("Unsupported video codec");if(!await S.canDecode())throw Error(`Cannot decode video track with codec: ${S.codec}`);if(!this.videoAspectRatio&&S.displayWidth&&S.displayHeight){let O=(P,D)=>D===0?P:O(D,P%D),V=O(S.displayWidth,S.displayHeight),$=S.displayWidth/V,j=S.displayHeight/V;this.videoAspectRatio=`${$}/${j}`,this.updateCanvasAspectRatio()}if(this.initPromise)try{await this.initPromise}catch(O){if(this.debug)console.error("Renderer initialization failed:",O)}if(!this.renderer){if(this.debug)console.warn("Renderer not ready, creating Canvas2D fallback");if(this.canvas){if(this.renderer=new G({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}if(this.canvas){if(this.options.width!==void 0||this.options.height!==void 0){let O=this.options.width??S.displayWidth,V=this.options.height??S.displayHeight;if(this.canvas.width!==O||this.canvas.height!==V)this.canvas.width=O,this.canvas.height=V,this.updateCanvasAspectRatio()}else if(!this.resizeObserver){if(this.canvas.width===0||this.canvas.height===0)this.canvas.width=S.displayWidth,this.canvas.height=S.displayHeight,this.updateCanvasAspectRatio()}}this.canvasSink=new r(S,{rotation:this.options.rotation,poolSize:this.options.poolSize}),this.sampleSink=new e(S),this.disposed=!1;try{await this.seek(0)}catch(O){if(this.debug)console.error("Initial seek failed:",O)}requestAnimationFrame(()=>{if(this.resizeObserver&&this.canvas&&"getBoundingClientRect"in this.canvas)this.updateCanvasBackingBuffer(this.canvas);if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}async seek(S){if(!this.canvasSink)return;this.renderingId++;let A=this.renderingId;if(this.frameIterator)await this.frameIterator.return(),this.frameIterator=null;this.frameIterator=this.canvasSink.canvases(S);let O=await this.frameIterator.next(),V=await this.frameIterator.next();if(A===this.renderingId){let $=O.value??null,j=V.value??null;if($)if(this.currentFrame=$,await new Promise((P)=>queueMicrotask(()=>P(void 0))),$.canvas.width===0||$.canvas.height===0)this.retryUntilCanvasReady($,()=>{this.renderFrame($)},30);else this.renderFrame($);if(this.nextFrame=j,!this.nextFrame)this.fetchNextFrame()}}updateFrame(S){if(this.disposed)return!1;if(!this.nextFrame&&this.frameIterator)return this.fetchNextFrame(),!1;if(!this.nextFrame)return!1;if(this.nextFrame.timestamp<=S)return this.currentFrame=this.nextFrame,this.nextFrame=null,this.renderFrame(this.currentFrame),this.fetchNextFrame(),!0;return!1}async fetchNextFrame(){if(!this.frameIterator||this.disposed)return;let S=this.renderingId,O=(await this.frameIterator.next()).value??null;if(!O||S!==this.renderingId||this.disposed)return;this.nextFrame=O}renderFrame(S){if(this.currentFrame=S,!this.renderer||!this.canvas){if(this.initPromise)this.initPromise.then(()=>{if(this.currentFrame===S&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log("Rendering frame after renderer initialization");this.renderer.render(S.canvas)}});return}if(!this.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${this.rendererType}) not ready, skipping frame`);return}if(!this.renderer.render(S.canvas)){if(this.debug)console.warn(`Failed to render frame with ${this.rendererType} (canvas: ${S.canvas.width}x${S.canvas.height})`);if(S.canvas.width===0||S.canvas.height===0)this.retryUntilCanvasReady(S,()=>{if(this.currentFrame===S&&this.renderer&&this.renderer.isReady()){if(!this.renderer.render(S.canvas)&&this.debug)console.warn("Retry render also failed")}},1)}}async getFrameAt(S){if(!this.canvasSink)return null;return this.canvasSink.getCanvas(S)}async getSampleAt(S){if(!this.sampleSink)return null;return this.sampleSink.getSample(S)}async extractFrames(S,A,O=1){if(!this.canvasSink)return[];let V=[],$=[];for(let j=S;j<=A;j+=O)$.push(j);for await(let j of this.canvasSink.canvasesAtTimestamps($))if(j)V.push(j);return V}async screenshot(S,A={}){if(!this.canvas)return null;if(S!==void 0&&this.canvasSink){let O=await this.canvasSink.getCanvas(S);if(O)this.renderFrame(O)}if("toBlob"in this.canvas)return new Promise((O)=>{this.canvas.toBlob((V)=>O(V),`image/${A.format??"png"}`,A.quality)});else return this.canvas.convertToBlob({type:`image/${A.format??"png"}`,quality:A.quality})}getCurrentFrame(){return this.currentFrame}getNextFrame(){return this.nextFrame}getRendererType(){return this.rendererType}getCanvas(){return this.canvas}updateCanvasDimensions(){if(!this.canvas||!("getBoundingClientRect"in this.canvas))return;let S=this.canvas;if(this.updateCanvasBackingBuffer(S)&&this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}async switchRenderer(S){if(!this.canvas)throw Error("Cannot switch renderer: No canvas set");let A=this.rendererType;if(S===A)return;if(this.debug)console.warn(`Switching renderer from ${A} to ${S}. This will recreate the canvas element.`);if(this.canvas instanceof HTMLCanvasElement){let O=this.canvas,V=O.parentElement;if(!V)throw Error("Cannot switch renderer: Canvas has no parent element");let $=document.createElement("canvas");if($.width=O.width,$.height=O.height,$.className=O.className,$.id=O.id,$.style.cssText=O.style.cssText,Array.from(O.attributes).forEach((j)=>{if(j.name!=="id"&&j.name!=="class"&&j.name!=="style")$.setAttribute(j.name,j.value)}),this.renderer)this.renderer.dispose(),this.renderer=null;V.replaceChild($,O),this.canvas=$;try{await this.initializeRenderer($,S)}catch(j){if(this.debug)console.error(`Failed to switch to ${S}:`,j);if(!this.renderer){if(this.renderer=new G({canvas:$}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}else{if(this.debug)console.warn("Runtime switching for OffscreenCanvas may not work if context is already set");if(this.renderer)this.renderer.dispose(),this.renderer=null;try{await this.initializeRenderer(this.canvas,S)}catch(O){if(this.debug)console.error(`Failed to switch to ${S}:`,O);if(!this.renderer){if(this.renderer=new G({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Re-rendering after switch to ${this.rendererType}`);queueMicrotask(()=>{if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}}setRendererChangeCallback(S){if(this.onRendererChange=S,this.renderer&&this.rendererType){if(this.debug)console.log(`Renderer already initialized as ${this.rendererType}, emitting change event`);S(this.rendererType)}}setRendererFallbackCallback(S){this.onRendererFallback=S}static getSupportedRenderers(){return U.getSupportedRenderers()}disposeVideoResources(){if(this.disposed=!0,this.renderingId++,this.frameIterator)this.frameIterator.return(),this.frameIterator=null;this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.videoAspectRatio=null}dispose(){if(this.disposed=!0,this.renderingId++,this.frameIterator)this.frameIterator.return(),this.frameIterator=null;if(this.renderer)this.renderer.dispose(),this.renderer=null;this.cleanupResizeObserver(),this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.onRendererChange=void 0,this.onRendererFallback=void 0}}var SS=100,AS=250;class E{videoRenderer;audioManager;playing=!1;currentTime=0;duration=0;playbackRate=1;animationFrameId=null;lastFrameTime=0;syncIntervalId=null;renderIntervalId=null;onTimeUpdate;onEnded;constructor(S={}){this.videoRenderer=new R({canvas:S.canvas,rendererType:S.rendererType}),this.audioManager=new f({audioContext:S.audioContext,volume:S.volume,muted:S.muted}),this.playbackRate=S.playbackRate??1}async setVideoTrack(S){if(!S){this.videoRenderer.dispose();return}await this.videoRenderer.setVideoTrack(S);let A=await S.computeDuration();this.duration=Math.max(this.duration,A)}async trySetVideoTrack(S){try{return await this.setVideoTrack(S),!0}catch{return!1}}async setAudioTrack(S){let A=this.playing,O=this.getCurrentTime();if(!S){this.audioManager.dispose();return}let V=await S.computeDuration(),$=Math.max(0,Math.min(O,V));if(await this.audioManager.setAudioTrack(S),await this.audioManager.seek($),A)await this.audioManager.play($);this.currentTime=$,this.duration=Math.max(this.duration,V)}async trySetAudioTrack(S){try{return await this.setAudioTrack(S),!0}catch{return!1}}async setCanvas(S){await this.videoRenderer.setCanvas(S)}async play(){if(this.playing)return;if(this.playing=!0,this.lastFrameTime=performance.now(),this.currentTime>=this.duration)this.currentTime=0,await this.videoRenderer.seek(0);await this.audioManager.play(this.currentTime),this.startRenderLoop(),this.startSyncInterval()}pause(){if(!this.playing)return;if(this.playing=!1,this.audioManager.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime()}async seek(S){let A=Math.max(0,Math.min(S,this.duration));if(this.currentTime=A,await this.videoRenderer.seek(A),await this.audioManager.seek(A),this.onTimeUpdate)this.onTimeUpdate(this.currentTime)}startRenderLoop(){if(this.animationFrameId!==null||this.renderIntervalId!==null)return;let S=(A=!0)=>{if(!this.playing)return;if(this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime();else{let O=performance.now(),V=(O-this.lastFrameTime)/1000;this.lastFrameTime=O,this.currentTime+=V*this.playbackRate}if(this.currentTime>=this.duration){this.handleEnded();return}if(this.videoRenderer.updateFrame(this.currentTime),A)this.animationFrameId=requestAnimationFrame(()=>S())};if(this.animationFrameId=requestAnimationFrame(()=>S()),this.renderIntervalId===null)this.renderIntervalId=window.setInterval(()=>S(!1),SS)}stopRenderLoop(){if(this.animationFrameId!==null)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null;if(this.renderIntervalId!==null)clearInterval(this.renderIntervalId),this.renderIntervalId=null}startSyncInterval(){if(this.syncIntervalId!==null)return;this.syncIntervalId=window.setInterval(()=>{if(this.playing&&this.onTimeUpdate)this.onTimeUpdate(this.currentTime)},AS)}stopSyncInterval(){if(this.syncIntervalId!==null)clearInterval(this.syncIntervalId),this.syncIntervalId=null}handleEnded(){if(this.pause(),this.currentTime=this.duration,this.onEnded)this.onEnded()}getCurrentTime(){if(this.playing&&this.audioManager.isPlaying())return this.audioManager.getCurrentTime();return this.currentTime}getDuration(){return this.duration}setDuration(S){this.duration=S}isPlaying(){return this.playing}setVolume(S){this.audioManager.setVolume(S)}getVolume(){return this.audioManager.getVolume()}setMuted(S){this.audioManager.setMuted(S)}isMuted(){return this.audioManager.isMuted()}setPlaybackRate(S){let A=Math.max(0.25,Math.min(4,S));if(this.playbackRate===A)return;this.playbackRate=A,this.audioManager.setPlaybackRate(A),this.lastFrameTime=performance.now()}getPlaybackRate(){return this.playbackRate}setTimeUpdateCallback(S){this.onTimeUpdate=S}setEndedCallback(S){this.onEnded=S}async screenshot(S){return this.videoRenderer.screenshot(this.currentTime,S)}getVideoRenderer(){return this.videoRenderer}getAudioManager(){return this.audioManager}async switchRenderer(S){await this.videoRenderer.switchRenderer(S)}getRendererType(){return this.videoRenderer.getRendererType()}updateCanvasDimensions(){this.videoRenderer.updateCanvasDimensions()}setRendererChangeCallback(S){this.videoRenderer.setRendererChangeCallback(S)}setRendererFallbackCallback(S){this.videoRenderer.setRendererFallbackCallback(S)}async reset(){if(this.pause(),this.currentTime=0,this.duration=0,this.videoRenderer)await this.videoRenderer.seek(0);this.playbackRate=1,this.lastFrameTime=0,this.stopRenderLoop(),this.stopSyncInterval()}dispose(){this.pause(),this.videoRenderer.dispose(),this.audioManager.dispose(),this.onTimeUpdate=void 0,this.onEnded=void 0}destroy(){this.dispose(),this.audioManager.destroy()}}import{ALL_FORMATS as OS,BlobSource as VS,BufferSource as $S,FilePathSource as jS,Input as PS,ReadableStreamSource as DS,UrlSource as KS}from"mediabunny";class F{currentSource=null;options;constructor(S={}){this.options={maxCacheSize:S.maxCacheSize??16777216,crossOrigin:S.crossOrigin,requestInit:S.requestInit}}async createSource(S){this.dispose();let A,O;if(S instanceof File||S instanceof Blob)A=new VS(S,{maxCacheSize:this.options.maxCacheSize}),O="blob";else if(S instanceof ArrayBuffer||S instanceof Uint8Array)A=new $S(S),O="buffer";else if(typeof S==="string"||S instanceof URL){let $=S instanceof URL?S.href:S;if(typeof window>"u"&&!$.startsWith("http"))A=new jS($,{maxCacheSize:this.options.maxCacheSize}),O="file";else A=new KS($,{maxCacheSize:this.options.maxCacheSize,requestInit:this.options.requestInit}),O="url"}else if(typeof ReadableStream<"u"&&S instanceof ReadableStream)A=new DS(S,{maxCacheSize:this.options.maxCacheSize}),O="stream";else throw TypeError("Unsupported media source type");let V=new PS({source:A,formats:OS});return this.currentSource={source:A,input:V,type:O,originalSource:S},this.currentSource}getCurrentSource(){return this.currentSource}getOriginalSource(){return this.currentSource?.originalSource??null}dispose(){this.currentSource=null}static isStreamingSource(S){return S instanceof ReadableStream||typeof S==="string"&&S.startsWith("http")}static isLocalSource(S){return S instanceof File||S instanceof Blob||S instanceof ArrayBuffer||S instanceof Uint8Array||typeof S==="string"&&!S.startsWith("http")}static getSourceType(S){if(S instanceof File)return"file";if(S instanceof Blob)return"blob";if(S instanceof ArrayBuffer||S instanceof Uint8Array)return"buffer";if(S instanceof ReadableStream)return"stream";if(typeof S==="string"||S instanceof URL)return(S instanceof URL?S.href:S).startsWith("http")?"url":"file";return"unknown"}static async fromFetch(S,A){let O=await fetch(S,A);if(!O.ok)throw Error(`Failed to fetch: ${O.status} ${O.statusText}`);return O.blob()}static fromStreamingFetch(S,A){return new ReadableStream({async start(O){let V=await fetch(S,A);if(!V.ok){O.error(Error(`Failed to fetch: ${V.status} ${V.statusText}`));return}let $=V.body?.getReader();if(!$){O.error(Error("Response body is not readable"));return}try{while(!0){let{done:j,value:P}=await $.read();if(j)break;O.enqueue(P)}O.close()}catch(j){O.error(j)}}})}}function x(S,A){if(Object.is(S,A))return!0;if(typeof S!==typeof A)return!1;if(S===null||A===null)return S===A;if(Array.isArray(S)&&Array.isArray(A)){if(S.length!==A.length)return!1;for(let O=0;O<S.length;O++)if(!x(S[O],A[O]))return!1;return!0}if(k(S)&&k(A)){let O=Object.keys(S),V=Object.keys(A);if(O.length!==V.length)return!1;for(let $ of O){if(!Object.hasOwn(A,$))return!1;if(!x(S[$],A[$]))return!1}return!0}return!1}function k(S){return typeof S==="object"&&S!==null&&S.constructor===Object}class b{state;listeners=new Set;updateScheduled=!1;pendingUpdates={};constructor(){this.state=this.getInitialState()}getInitialState(){let A=U.getSupportedRenderers()[0]||"canvas2d";return{state:"idle",currentTime:0,duration:0,buffered:[],volume:1,muted:!1,playbackRate:1,playing:!1,paused:!0,ended:!1,seeking:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,canPlay:!1,canPlayThrough:!1,isLive:!1,rendererType:A}}getState(){return Object.freeze({...this.state})}setState(S){if(Object.assign(this.pendingUpdates,S),!this.updateScheduled)this.updateScheduled=!0,queueMicrotask(()=>this.flushUpdates())}flushUpdates(){if(Object.keys(this.pendingUpdates).length===0){this.updateScheduled=!1;return}let S={...this.state};this.state={...this.state,...this.pendingUpdates},this.pendingUpdates={},this.updateScheduled=!1;let A=Object.keys(this.pendingUpdates);if((A.length?A:Object.keys(this.state)).some(($)=>!x(this.state[$],S[$])))this.notifyListeners()}subscribe(S){return this.listeners.add(S),S(this.getState()),()=>{this.listeners.delete(S)}}reset(){this.state=this.getInitialState(),this.pendingUpdates={},this.updateScheduled=!1,this.notifyListeners()}notifyListeners(){let S=this.getState();this.listeners.forEach((A)=>{try{A(S)}catch(O){console.error("Error in state listener:",O)}})}updatePlaybackState(S){let A=S?"playing":"paused";this.setState({state:A,playing:S,paused:!S,ended:!1})}updateTime(S){this.setState({currentTime:S})}updateDuration(S){this.setState({duration:S})}updateBuffered(S){this.setState({buffered:S})}updateVolume(S,A){this.setState({volume:S,muted:A})}updatePlaybackRate(S){this.setState({playbackRate:S})}updateMediaInfo(S){this.setState({mediaInfo:S})}updateTracks(S,A,O){let V={};if(S)V.videoTracks=S;if(A)V.audioTracks=A;if(O)V.subtitleTracks=O;this.setState(V)}updateSelectedTracks(S,A){switch(S){case"video":this.setState({selectedVideoTrack:A});break;case"audio":this.setState({selectedAudioTrack:A});break;case"subtitle":this.setState({selectedSubtitleTrack:A});break}}updateError(S){this.setState({error:S,state:S?"error":this.state.state})}updateSeekingState(S){this.setState({seeking:S})}updateReadyState(S,A){this.setState({canPlay:S,canPlayThrough:A,state:S?"ready":this.state.state})}updateEndedState(S){this.setState({ended:S,playing:!1,paused:!0,state:S?"ended":this.state.state})}updateLoadingState(){this.setState({state:"loading",playing:!1,paused:!0,ended:!1,error:null})}updateRendererType(S){this.setState({rendererType:S})}}class C{input=null;videoTracks=new Map;audioTracks=new Map;videoTrackInfos=[];audioTrackInfos=[];subtitleTrackInfos=[];subtitleProviders=new Map;subtitleTrackResolvers=new Map;selectedVideoTrack=null;selectedAudioTrack=null;selectedSubtitleTrack=null;onTrackChange;async initialize(S){this.input=S,await this.loadTracks()}async loadTracks(){if(!this.input)return;let S=await this.input.getVideoTracks();this.videoTrackInfos=await Promise.all(S.map(async(O)=>{let V=`video-${O.id}`;this.videoTracks.set(V,O);let $=0,j=0;try{let D=await O.computePacketStats(100);$=D.averagePacketRate,j=D.averageBitrate}catch{}return{id:V,codec:O.codec,language:O.languageCode,name:O.name,width:O.codedWidth,height:O.codedHeight,frameRate:$,bitrate:j,rotation:O.rotation,selected:!1,decodable:await O.canDecode()}}));let A=await this.input.getAudioTracks();if(this.audioTrackInfos=await Promise.all(A.map(async(O)=>{let V=`audio-${O.id}`;this.audioTracks.set(V,O);let $=0;try{$=(await O.computePacketStats(100)).averageBitrate}catch{}return{id:V,codec:O.codec,language:O.languageCode,name:O.name,channels:O.numberOfChannels,sampleRate:O.sampleRate,bitrate:$,selected:!1,decodable:await O.canDecode()}})),this.videoTrackInfos.length>0){let O=this.videoTrackInfos.find((V)=>V.decodable);if(O)this.selectVideoTrack(O.id)}if(this.audioTrackInfos.length>0){let O=this.audioTrackInfos.find((V)=>V.decodable);if(O)this.selectAudioTrack(O.id)}}getVideoTracks(){return[...this.videoTrackInfos]}getAudioTracks(){return[...this.audioTrackInfos]}getSubtitleTracks(){return[...this.subtitleTrackInfos]}getSelectedVideoTrack(){if(!this.selectedVideoTrack)return null;return this.videoTracks.get(this.selectedVideoTrack)??null}getSelectedAudioTrack(){if(!this.selectedAudioTrack)return null;return this.audioTracks.get(this.selectedAudioTrack)??null}getSelectedVideoTrackInfo(){if(!this.selectedVideoTrack)return null;return this.videoTrackInfos.find((S)=>S.id===this.selectedVideoTrack)??null}getSelectedAudioTrackInfo(){if(!this.selectedAudioTrack)return null;return this.audioTrackInfos.find((S)=>S.id===this.selectedAudioTrack)??null}getSelectedSubtitleTrackInfo(){if(!this.selectedSubtitleTrack)return null;return this.subtitleTrackInfos.find((S)=>S.id===this.selectedSubtitleTrack)??null}selectVideoTrack(S){if(S===this.selectedVideoTrack)return!0;if(S&&!this.videoTracks.has(S))return!1;let A=this.selectedVideoTrack;if(this.videoTrackInfos.forEach((O)=>{O.selected=O.id===S}),this.selectedVideoTrack=S,this.onTrackChange)this.onTrackChange({type:"video",previousTrackId:A,newTrackId:S});return!0}selectAudioTrack(S){if(S===this.selectedAudioTrack)return!0;if(S&&!this.audioTracks.has(S))return!1;let A=this.selectedAudioTrack;if(this.audioTrackInfos.forEach((O)=>{O.selected=O.id===S}),this.selectedAudioTrack=S,this.onTrackChange)this.onTrackChange({type:"audio",previousTrackId:A,newTrackId:S});return!0}selectSubtitleTrack(S){if(S===this.selectedSubtitleTrack)return!0;if(S&&!this.subtitleTrackResolvers.has(S))return!1;let A=this.selectedSubtitleTrack;if(this.subtitleTrackInfos.forEach((O)=>{O.selected=O.id===S}),this.selectedSubtitleTrack=S,this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:A,newTrackId:S});return!0}registerSubtitleTracks(S,A){this.subtitleProviders.set(S,A),this.rebuildSubtitleTracks()}unregisterSubtitleTracks(S){if(!this.subtitleProviders.delete(S))return;this.rebuildSubtitleTracks()}async getSubtitleTrackResource(S){if(!S)return null;let A=this.subtitleTrackResolvers.get(S);if(!A)return null;return A()}rebuildSubtitleTracks(){let S=this.selectedSubtitleTrack;this.subtitleTrackInfos=[],this.subtitleTrackResolvers.clear();for(let O of this.subtitleProviders.values())for(let V of O){let $={...V.info,selected:!1};this.subtitleTrackInfos.push($),this.subtitleTrackResolvers.set($.id,V.resolver)}let A=S;if(!A||!this.subtitleTrackResolvers.has(A))A=this.subtitleTrackInfos[0]?.id??null;if(this.selectedSubtitleTrack=A,this.subtitleTrackInfos.forEach((O)=>{O.selected=O.id===this.selectedSubtitleTrack}),S!==this.selectedSubtitleTrack&&this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:S,newTrackId:this.selectedSubtitleTrack})}setTrackChangeListener(S){this.onTrackChange=S}getState(){return{videoTracks:this.getVideoTracks(),audioTracks:this.getAudioTracks(),subtitleTracks:this.getSubtitleTracks(),selectedVideoTrack:this.selectedVideoTrack,selectedAudioTrack:this.selectedAudioTrack,selectedSubtitleTrack:this.selectedSubtitleTrack}}getPrimaryVideoTrack(){if(this.videoTracks.size===0)return null;return this.selectedVideoTrack?this.videoTracks.get(this.selectedVideoTrack)??null:this.videoTracks.values().next().value??null}getPrimaryAudioTrack(){if(this.audioTracks.size===0)return null;return this.selectedAudioTrack?this.audioTracks.get(this.selectedAudioTrack)??null:this.audioTracks.values().next().value??null}hasVideo(){return this.videoTrackInfos.length>0}hasAudio(){return this.audioTrackInfos.length>0}hasSubtitles(){return this.subtitleTrackInfos.length>0}dispose(){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.subtitleTrackInfos=[],this.subtitleProviders.clear(),this.subtitleTrackResolvers.clear(),this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.selectedSubtitleTrack=null,this.input=null,this.onTrackChange=void 0}async replaceAudioTrackByInputId(S,A){let O=null;for(let[$,j]of this.audioTracks.entries())if(j.id===S){O=$;break}if(!O)return;this.audioTracks.set(O,A);let V=this.audioTrackInfos.findIndex(($)=>$.id===O);if(V!==-1){let $=0;try{$=(await A.computePacketStats(100)).averageBitrate}catch{}this.audioTrackInfos[V]={...this.audioTrackInfos[V],codec:A.codec,channels:A.numberOfChannels,sampleRate:A.sampleRate,bitrate:$,decodable:await A.canDecode()}}}async replaceVideoTrackByInputId(S,A){let O=null;for(let[$,j]of this.videoTracks.entries())if(j.id===S){O=$;break}if(!O)return;this.videoTracks.set(O,A);let V=this.videoTrackInfos.findIndex(($)=>$.id===O);if(V!==-1){let $=0,j=0;try{let P=await A.computePacketStats(100);$=P.averagePacketRate,j=P.averageBitrate}catch{}this.videoTrackInfos[V]={...this.videoTrackInfos[V],codec:A.codec,width:A.codedWidth,height:A.codedHeight,rotation:A.rotation,frameRate:$,bitrate:j,decodable:await A.canDecode()}}}}class T{emitter;store;state;sourceManager;playbackController;trackManager;options;disposed=!1;getCurrentInput=()=>this.sourceManager.getCurrentSource()?.input??null;trackSwitcher;core;constructor(S={}){this.options={volume:1,muted:!1,playbackRate:1,autoplay:!1,preload:"metadata",...S},this.emitter=new _({maxListeners:100}),this.store=new b,this.state=new W(this.store),this.sourceManager=new F({maxCacheSize:S.maxCacheSize,crossOrigin:S.crossOrigin}),this.playbackController=new E({canvas:S.renderTarget,audioContext:S.audioContext,volume:this.options.volume,muted:this.options.muted,playbackRate:this.options.playbackRate,rendererType:this.options.renderer}),this.trackManager=new C,this.trackSwitcher=new y({sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,emit:this.emit.bind(this),store:this.store,getCurrentInput:this.getCurrentInput}),this.core=new H({state:this.state,sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,trackSwitcher:this.trackSwitcher,emit:this.emit.bind(this)}),this.setupInternalListeners(),this.state.applyInitial(this.options.volume??1,this.options.muted??!1,this.options.playbackRate??1),this.state.updateRendererType(this.options.renderer||"webgpu")}setupInternalListeners(){this.playbackController.setTimeUpdateCallback((S)=>{this.state.updateTime(S),this.emit("timeupdate",{currentTime:S})}),this.playbackController.setEndedCallback(()=>{this.state.updateEndedState(!0),this.emit("ended",void 0)}),this.trackManager.setTrackChangeListener((S)=>{this.state.updateSelectedTracks(S.type,S.newTrackId),this.emit("trackchange",{type:S.type,trackId:S.newTrackId})}),this.playbackController.setRendererChangeCallback((S)=>{this.state.updateRendererType(S),this.emit("rendererchange",S)}),this.playbackController.setRendererFallbackCallback((S,A)=>{this.emit("rendererfallback",{from:S,to:A})}),this.state.subscribe((S)=>{this.emit("statechange",S)})}async load(S,A={}){return this.checkDisposed(),this.core.load(S,{autoplay:A.autoplay??this.options.autoplay,startTime:A.startTime})}async play(){return this.checkDisposed(),this.core.play()}pause(){this.checkDisposed(),this.core.pause()}async seek(S,A={}){return this.checkDisposed(),this.core.seek(S)}async stop(){return this.checkDisposed(),this.core.stop()}get currentTime(){return this.playbackController.getCurrentTime()}set currentTime(S){this.seek(S)}get duration(){return this.state.getState().duration}get volume(){return this.playbackController.getVolume()}set volume(S){this.checkDisposed();let A=Math.max(0,Math.min(1,S));this.playbackController.setVolume(A),this.state.updateVolume(A,this.muted),this.emit("volumechange",{volume:A,muted:this.muted})}get muted(){return this.playbackController.isMuted()}set muted(S){this.checkDisposed(),this.playbackController.setMuted(S),this.state.updateVolume(this.volume,S),this.emit("volumechange",{volume:this.volume,muted:S})}get playbackRate(){return this.playbackController.getPlaybackRate()}set playbackRate(S){this.checkDisposed();let A=Math.max(0.25,Math.min(4,S));this.playbackController.setPlaybackRate(A),this.state.updatePlaybackRate(A),this.emit("ratechange",{playbackRate:A})}get paused(){return!this.playbackController.isPlaying()}get ended(){return this.state.getState().ended}get seeking(){return this.state.getState().seeking}getVideoTracks(){return this.trackManager.getVideoTracks()}getAudioTracks(){return this.trackManager.getAudioTracks()}getSubtitleTracks(){return this.trackManager.getSubtitleTracks()}async selectVideoTrack(S){this.checkDisposed(),await this.trackSwitcher.selectVideoTrack(this.trackManager,S)}async selectAudioTrack(S){this.checkDisposed(),await this.trackSwitcher.selectAudioTrack(this.trackManager,S)}selectSubtitleTrack(S){if(this.checkDisposed(),!this.trackManager.selectSubtitleTrack(S))throw Error(`Invalid subtitle track ID: ${S}`)}registerSubtitleTracks(S,A){this.trackManager.registerSubtitleTracks(S,A),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let O=this.state.getState().mediaInfo;if(O)this.state.updateMediaInfo({...O,hasSubtitles:this.trackManager.hasSubtitles()})}unregisterSubtitleTracks(S){this.trackManager.unregisterSubtitleTracks(S),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let A=this.state.getState().mediaInfo;if(A)this.state.updateMediaInfo({...A,hasSubtitles:this.trackManager.hasSubtitles()})}async getSubtitleTrackResource(S){return this.trackManager.getSubtitleTrackResource(S)}async screenshot(S={}){return this.checkDisposed(),this.playbackController.screenshot(S)}async setRenderTarget(S){this.checkDisposed(),await this.playbackController.setCanvas(S)}getRendererType(){return this.playbackController.getRendererType()}async switchRenderer(S){this.checkDisposed(),await this.playbackController.switchRenderer(S)}updateCanvasDimensions(){this.checkDisposed(),this.playbackController.updateCanvasDimensions()}static getSupportedRenderers(){return U.getSupportedRenderers()}getState(){return this.state.getState()}subscribe(S){return{unsubscribe:this.state.subscribe(S)}}on(S,A){return this.emitter.on(S,A)}once(S,A){return this.emitter.once(S,A)}off(S,A){this.emitter.off(S,A)}emit(S,A){this.emitter.emit(S,A)}checkDisposed(){if(this.disposed)throw Error("Player has been disposed")}dispose(){if(this.disposed)return;this.disposed=!0,this.playbackController.dispose(),this.trackManager.dispose(),this.sourceManager.dispose(),this.state.reset(),this.emitter.removeAllListeners()}destroy(){this.dispose(),this.playbackController.destroy()}}var v;((K)=>{K.MEDIA_NOT_SUPPORTED="MEDIA_NOT_SUPPORTED";K.MEDIA_LOAD_FAILED="MEDIA_LOAD_FAILED";K.DECODE_ERROR="DECODE_ERROR";K.NETWORK_ERROR="NETWORK_ERROR";K.PERMISSION_DENIED="PERMISSION_DENIED";K.PLAYBACK_ERROR="PLAYBACK_ERROR";K.TRACK_NOT_FOUND="TRACK_NOT_FOUND";K.INVALID_STATE="INVALID_STATE";K.UNKNOWN_ERROR="UNKNOWN_ERROR"})(v||={});class N extends Error{code;details;constructor(S,A,O){super(A);this.name="MediaFoxError",this.code=S,this.details=O}static mediaNotSupported(S="Media format not supported",A){return new N("MEDIA_NOT_SUPPORTED",S,A)}static mediaLoadFailed(S="Failed to load media",A){return new N("MEDIA_LOAD_FAILED",S,A)}static decodeError(S="Failed to decode media",A){return new N("DECODE_ERROR",S,A)}static networkError(S="Network error occurred",A){return new N("NETWORK_ERROR",S,A)}static permissionDenied(S="Permission denied",A){return new N("PERMISSION_DENIED",S,A)}static playbackError(S="Playback error occurred",A){return new N("PLAYBACK_ERROR",S,A)}static trackNotFound(S="Track not found",A){return new N("TRACK_NOT_FOUND",S,A)}static invalidState(S="Invalid player state",A){return new N("INVALID_STATE",S,A)}static unknownError(S="Unknown error occurred",A){return new N("UNKNOWN_ERROR",S,A)}}function NS(S,A){if(S instanceof N)return S;if(S instanceof Error)return new N("UNKNOWN_ERROR",`${A}: ${S.message}`,{originalError:S});return new N("UNKNOWN_ERROR",`${A}: ${String(S)}`,{originalError:S})}function QS(S,A=!1){let O=Math.abs(S),V=Math.floor(O/3600),$=Math.floor(O%3600/60),j=Math.floor(O%60),P=Math.floor(O%1*1000),D="";if(S<0)D="-";if(V>0)D+=`${V}:${$.toString().padStart(2,"0")}:${j.toString().padStart(2,"0")}`;else D+=`${$}:${j.toString().padStart(2,"0")}`;if(A)D+=`.${P.toString().padStart(3,"0")}`;return D}function US(S){let A=S.trim().split(":").map(Number);if(A.some(Number.isNaN))throw Error("Invalid time string");let O=0;if(A.length===3)O=A[0]*3600+A[1]*60+A[2];else if(A.length===2)O=A[0]*60+A[1];else if(A.length===1)O=A[0];else throw Error("Invalid time format");return O}function JS(S,A){return Math.floor(S*A)}function zS(S,A){return S/A}function XS(S,A,O){return Math.max(A,Math.min(O,S))}function ZS(S,A){return S.start<A.end&&A.start<S.end}function YS(S){if(S.length===0)return[];let A=[...S].sort((V,$)=>V.start-$.start),O=[A[0]];for(let V=1;V<A.length;V++){let $=O[O.length-1],j=A[V];if(j.start<=$.end)$.end=Math.max($.end,j.end);else O.push(j)}return O}function GS(S){return S.reduce((A,O)=>A+(O.end-O.start),0)}function qS(S,A){for(let O of S)if(A>=O.start&&A<O.end)return O;return null}var XA="0.1.0",bA=T;export{NS as wrapError,GS as totalBufferedDuration,JS as timeToFrame,ZS as timeRangesOverlap,US as parseTime,YS as mergeTimeRanges,zS as frameToTime,QS as formatTime,qS as findBufferedRange,bA as default,XS as clamp,R as VideoRenderer,XA as VERSION,C as TrackManager,b as Store,F as SourceManager,U as RendererFactory,E as PlaybackController,N as MediaFoxError,T as MediaFox,_ as EventEmitter,v as ErrorCode,f as AudioManager};
40
+ `;constructor(A){this.canvas=A.canvas,this.powerPreference=A.powerPreference||"high-performance",this.initialize().catch((O)=>{console.error("WebGPU initialization failed:",O)})}async initialize(){try{let A=navigator;if(!A.gpu)return console.log("WebGPU not available in navigator"),!1;let O=await A.gpu.requestAdapter({powerPreference:this.powerPreference});if(!O)return console.log("WebGPU adapter not available"),!1;if(this.device=await O.requestDevice(),!this.device)return console.log("WebGPU device not available"),!1;if("getContext"in this.canvas)this.context=this.canvas.getContext("webgpu");if(!this.context)return console.log("WebGPU context not available on canvas"),!1;let S=A.gpu.getPreferredCanvasFormat();return this.context.configure({device:this.device,format:S,usage:GPUTextureUsage.RENDER_ATTACHMENT,alphaMode:"opaque"}),await this.createRenderPipeline(),this.createVertexBuffer(),this.isInitialized=!0,console.log("WebGPU renderer initialized successfully"),!0}catch(A){return console.error("WebGPU initialization error:",A),!1}}async createRenderPipeline(){if(!this.device)return;let A=navigator;if(!A.gpu)return;let O=this.device.createShaderModule({code:this.vertexShaderSource}),S=this.device.createShaderModule({code:this.fragmentShaderSource});this.pipeline=this.device.createRenderPipeline({layout:"auto",vertex:{module:O,entryPoint:"vs_main",buffers:[{arrayStride:16,attributes:[{shaderLocation:0,offset:0,format:"float32x2"},{shaderLocation:1,offset:8,format:"float32x2"}]}]},fragment:{module:S,entryPoint:"fs_main",targets:[{format:A.gpu.getPreferredCanvasFormat()}]},primitive:{topology:"triangle-strip"}})}createVertexBuffer(){if(!this.device)return;this.vertexBuffer=this.device.createBuffer({size:64,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}createTexture(A,O){if(!this.device)return;if(this.texture)this.texture.destroy();if(this.texture=this.device.createTexture({size:{width:A,height:O},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),!this.sampler)this.sampler=this.device.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"});this.createBindGroup()}createBindGroup(){if(!this.device||!this.texture||!this.sampler||!this.pipeline)return;this.bindGroup=this.device.createBindGroup({layout:this.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:this.sampler},{binding:1,resource:this.texture.createView()}]})}isReady(){return this.isInitialized&&this.device!==null&&this.context!==null&&this.pipeline!==null}render(A){if(!this.isReady()||!this.device||!this.context||!this.pipeline)return!1;try{let{width:O,height:S}=A;if(O===0||S===0)return console.warn(`WebGPU: Source canvas has zero dimensions (${O}x${S})`),!1;let $=this.canvas.width,j=this.canvas.height;if($===0||j===0)return console.warn(`WebGPU: Output canvas has zero dimensions (${$}x${j})`),!1;if(O!==this.textureWidth||S!==this.textureHeight)this.createTexture(O,S),this.textureWidth=O,this.textureHeight=S;if(!this.texture)return!1;try{this.device.queue.copyExternalImageToTexture({source:A},{texture:this.texture},{width:O,height:S})}catch{let g=A.getContext("2d");if(!g)return!1;let s=g.getImageData(0,0,O,S),i=new Uint8Array(s.data.buffer);this.device.queue.writeTexture({texture:this.texture,origin:{x:0,y:0,z:0}},i,{bytesPerRow:O*4,rowsPerImage:S},{width:O,height:S,depthOrArrayLayers:1})}let V=this.device.createCommandEncoder(),K=this.context.getCurrentTexture().createView(),N=V.beginRenderPass({colorAttachments:[{view:K,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});if(N.setPipeline(this.pipeline),this.bindGroup)N.setBindGroup(0,this.bindGroup);let U=Math.min($/this.textureWidth,j/this.textureHeight),Q=Math.round(this.textureWidth*U),J=Math.round(this.textureHeight*U),Y=Math.round(($-Q)/2),B=Math.round((j-J)/2),X=Y/$*2-1,G=(Y+Q)/$*2-1,L=1-B/j*2,q=1-(B+J)/j*2,d=new Float32Array([X,q,0,1,G,q,1,1,X,L,0,0,G,L,1,0]);if(this.vertexBuffer)this.device.queue.writeBuffer(this.vertexBuffer,0,d),N.setVertexBuffer(0,this.vertexBuffer);return N.draw(4,1,0,0),N.end(),this.device.queue.submit([V.finish()]),!0}catch{return!1}}clear(){if(!this.isReady()||!this.device||!this.context)return;try{let A=this.device.createCommandEncoder(),O=this.context.getCurrentTexture().createView();A.beginRenderPass({colorAttachments:[{view:O,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([A.finish()])}catch{}}dispose(){try{if(this.texture)this.texture.destroy(),this.texture=null;if(this.vertexBuffer)this.vertexBuffer.destroy(),this.vertexBuffer=null;this.device=null,this.context=null,this.pipeline=null,this.sampler=null,this.bindGroup=null,this.isInitialized=!1}catch{}}}class Z{canvas;powerPreference;constructor(A){this.canvas=A.canvas,this.powerPreference=A.powerPreference||"high-performance"}async createRenderer(A){try{switch(A){case"webgpu":return await this.createWebGPURenderer();case"webgl":return this.createWebGLRenderer();case"canvas2d":return this.createCanvas2DRenderer();default:return null}}catch{return null}}async createRendererWithFallback(A){let O=[A];if(A!=="webgl")O.push("webgl");if(A!=="canvas2d")O.push("canvas2d");for(let $ of O){let j=await this.createRenderer($);if(j?.isReady())return{renderer:j,actualType:$};if(j)j.dispose()}return{renderer:this.createCanvas2DRenderer(),actualType:"canvas2d"}}async createWebGPURenderer(){if(!navigator.gpu)return null;if(!("getContext"in this.canvas))return console.log("WebGPU requires HTMLCanvasElement, not OffscreenCanvas"),null;let O=new x({canvas:this.canvas,powerPreference:this.powerPreference}),S=1000,$=performance.now();if(await(async()=>{while(!O.isReady()){if(performance.now()-$>S)return console.log("WebGPU renderer initialization timed out"),!1;if("requestIdleCallback"in window)await new Promise((K)=>requestIdleCallback(()=>K(void 0)));else await new Promise((K)=>requestAnimationFrame(()=>K(void 0)))}return!0})())return console.log("WebGPU renderer initialized successfully"),O;return O.isReady()?O:null}createWebGLRenderer(){try{let A=new w({canvas:this.canvas,powerPreference:this.powerPreference,preserveDrawingBuffer:!1,antialias:!1,alpha:!1});return A.isReady()?A:null}catch{return null}}createCanvas2DRenderer(){return new _({canvas:this.canvas})}static getSupportedRenderers(){let A=[];if(navigator.gpu)A.push("webgpu");try{let S=document.createElement("canvas");if(S.getContext("webgl")||S.getContext("experimental-webgl"))A.push("webgl")}catch{}return A.push("canvas2d"),A}static getRendererDisplayName(A){switch(A){case"canvas2d":return"Canvas 2D";case"webgl":return"WebGL";case"webgpu":return"WebGPU";default:return"Unknown"}}static isRendererSupported(A){if(A==="canvas2d")return!0;return Z.getSupportedRenderers().includes(A)}}var I=new WeakMap;function m(A,O){I.set(A,O)}function r(A){let O=I.get(A);if(O)I.delete(A);return O}class R{canvas=null;canvasSink=null;sampleSink=null;options;frameIterator=null;currentFrame=null;nextFrame=null;disposed=!1;renderingId=0;renderer=null;rendererType="canvas2d";onRendererChange;onRendererFallback;initPromise=null;resizeObserver=null;lastObservedWidth=0;lastObservedHeight=0;videoAspectRatio=null;debug=!1;constructor(A={}){if(this.options={poolSize:A.poolSize??2,rendererType:A.rendererType??"webgpu",...A},this.rendererType=this.options.rendererType??"webgpu",this.debug=A.debug??!1,this.initPromise=null,A.canvas){if(this.canvas=A.canvas,this.options.width!==void 0)A.canvas.width=this.options.width;if(this.options.height!==void 0)A.canvas.height=this.options.height;this.initPromise=this.initializeRenderer(A.canvas,this.rendererType).catch((O)=>{if(this.debug)console.error("Failed to initialize renderer:",O)}),this.setupResizeObserver(A.canvas)}}setupResizeObserver(A){if(!("getBoundingClientRect"in A)||typeof ResizeObserver>"u")return;if(this.options.width!==void 0||this.options.height!==void 0)return;this.cleanupResizeObserver();let O=A;this.resizeObserver=new ResizeObserver((S)=>{if(this.disposed||!this.resizeObserver)return;for(let $ of S){let{width:j,height:V}=this.getCanvasDimensionsFromEntry($,O);if(j!==this.lastObservedWidth||V!==this.lastObservedHeight){if(this.lastObservedWidth=j,this.lastObservedHeight=V,O.width!==j||O.height!==V){if(O.width=j,O.height=V,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}}}});try{this.resizeObserver.observe(O,{box:"device-pixel-content-box"})}catch{try{this.resizeObserver.observe(O,{box:"content-box"})}catch{this.resizeObserver.observe(O)}}requestAnimationFrame(()=>{if(this.disposed||!this.resizeObserver)return;let{width:S,height:$}=this.getCanvasDimensionsFromCanvas(O);if(this.lastObservedWidth=S,this.lastObservedHeight=$,O.width!==S||O.height!==$){if(O.width=S,O.height=$,this.updateCanvasAspectRatio(),this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}})}getCanvasDimensionsFromEntry(A,O){let S=0,$=0,j=window.devicePixelRatio||1;if(A.devicePixelContentBoxSize?.length)S=A.devicePixelContentBoxSize[0].inlineSize,$=A.devicePixelContentBoxSize[0].blockSize;else if(A.contentBoxSize?.length)S=Math.round(A.contentBoxSize[0].inlineSize*j),$=Math.round(A.contentBoxSize[0].blockSize*j);else if(A.contentRect)S=Math.round(A.contentRect.width*j),$=Math.round(A.contentRect.height*j);if(S===0||$===0)return this.getCanvasDimensionsFromCanvas(O);return{width:Math.max(1,S),height:Math.max(1,$)}}getCanvasDimensionsFromCanvas(A){let O=0,S=0,$=window.devicePixelRatio||1,j=A.getBoundingClientRect();if(O=Math.round(j.width*$),S=Math.round(j.height*$),O===0||S===0)O=Math.round(A.clientWidth*$)||O,S=Math.round(A.clientHeight*$)||S;if(O===0||S===0)console.warn("Canvas has zero dimensions after all fallbacks, using 1x1");return{width:Math.max(1,O),height:Math.max(1,S)}}cleanupResizeObserver(){if(this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null,this.lastObservedWidth=0,this.lastObservedHeight=0}retryUntilCanvasReady(A,O,S=60){let $=0,j=()=>{if($++,A.canvas.width>0&&A.canvas.height>0)O();else if($<S)requestAnimationFrame(j);else{if(this.debug)console.warn("Canvas dimensions timeout, forcing action");O()}};requestAnimationFrame(j)}updateCanvasAspectRatio(){if(!this.canvas||!this.videoAspectRatio||!("style"in this.canvas))return;this.canvas.style.aspectRatio=this.videoAspectRatio}updateCanvasBackingBuffer(A){let{width:O,height:S}=this.getCanvasDimensionsFromCanvas(A);if(A.width!==O||A.height!==S)return A.width=O,A.height=S,!0;return!1}async initializeRenderer(A,O){if(this.debug)console.log(`Initializing renderer: ${O}`);let $=await new Z({canvas:A}).createRendererWithFallback(O);if(this.debug)console.log(`Renderer factory result: ${$.actualType}`);if(!$.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${$.actualType}) not ready`);throw $.renderer.dispose(),Error(`Failed to initialize renderer: ${$.actualType}`)}if(this.renderer=$.renderer,this.rendererType=$.actualType,this.debug)console.log(`Initialized renderer: ${this.rendererType}`);if($.actualType!==O){if(this.onRendererFallback)this.onRendererFallback(O,$.actualType)}if(this.onRendererChange){if(this.debug)console.log(`Emitting renderer change: ${this.rendererType}`);this.onRendererChange(this.rendererType)}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Rendering initial frame with ${this.rendererType}`);if(this.currentFrame.canvas.width===0||this.currentFrame.canvas.height===0){if(this.debug)console.log("Initial frame has zero dimensions, scheduling render when ready...");this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame&&this.debug)console.log(`Canvas ready (${this.currentFrame.canvas.width}x${this.currentFrame.canvas.height}), rendering initial frame`);if(this.currentFrame)this.renderFrame(this.currentFrame)})}else this.renderFrame(this.currentFrame)}}async setCanvas(A){if(this.canvas=A,this.renderer)this.renderer.dispose(),this.renderer=null;if(this.options.width!==void 0)A.width=this.options.width;if(this.options.height!==void 0)A.height=this.options.height;this.setupResizeObserver(A);try{await this.initializeRenderer(A,this.rendererType)}catch(O){if(this.debug)console.error("Failed to initialize renderer:",O);if(!this.renderer){if(this.renderer=new _({canvas:A}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}async setVideoTrack(A){if(await this.disposeVideoResources(),A.codec===null)throw Error("Unsupported video codec");if(!await A.canDecode())throw Error(`Cannot decode video track with codec: ${A.codec}`);let S=r(A);if(!this.videoAspectRatio&&A.displayWidth&&A.displayHeight){let $=(N,U)=>U===0?N:$(U,N%U),j=$(A.displayWidth,A.displayHeight),V=A.displayWidth/j,K=A.displayHeight/j;this.videoAspectRatio=`${V}/${K}`,this.updateCanvasAspectRatio()}if(this.initPromise)try{await this.initPromise}catch($){if(this.debug)console.error("Renderer initialization failed:",$)}if(!this.renderer){if(this.debug)console.warn("Renderer not ready, creating Canvas2D fallback");if(this.canvas){if(this.renderer=new _({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}if(this.canvas){if(this.options.width!==void 0||this.options.height!==void 0){let $=this.options.width??A.displayWidth,j=this.options.height??A.displayHeight;if(this.canvas.width!==$||this.canvas.height!==j)this.canvas.width=$,this.canvas.height=j,this.updateCanvasAspectRatio()}else if(!this.resizeObserver){if(this.canvas.width===0||this.canvas.height===0)this.canvas.width=A.displayWidth,this.canvas.height=A.displayHeight,this.updateCanvasAspectRatio()}}if(S?.canvasSink)this.canvasSink=S.canvasSink;else this.canvasSink=new t(A,{rotation:this.options.rotation,poolSize:this.options.poolSize});if(this.sampleSink=new a(A),this.disposed=!1,S?.firstFrame){if(this.currentFrame=S.firstFrame,this.currentFrame.canvas.width>0&&this.currentFrame.canvas.height>0)this.renderFrame(this.currentFrame);else this.retryUntilCanvasReady(this.currentFrame,()=>{if(this.currentFrame)this.renderFrame(this.currentFrame)},30);this.frameIterator=this.canvasSink.canvases(0),this.frameIterator.next().then(()=>{this.fetchNextFrame()})}else try{await this.seek(0)}catch($){if(this.debug)console.error("Initial seek failed:",$)}requestAnimationFrame(()=>{if(this.resizeObserver&&this.canvas&&"getBoundingClientRect"in this.canvas)this.updateCanvasBackingBuffer(this.canvas);if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}async seek(A){if(!this.canvasSink)return;this.renderingId++;let O=this.renderingId;if(this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}let S=this.canvasSink.canvases(A);this.frameIterator=S;try{let $=await S.next(),j=await S.next();if(O!==this.renderingId)return;let V=$.value??null,K=j.value??null;if(V)if(this.currentFrame=V,V.canvas.width>0&&V.canvas.height>0)this.renderFrame(V);else this.retryUntilCanvasReady(V,()=>this.renderFrame(V),30);if(this.nextFrame=K,!this.nextFrame)this.fetchNextFrame()}catch{}}updateFrame(A){if(this.disposed)return{frameUpdated:!1,isStarving:!1};if(!this.nextFrame){if(this.frameIterator)this.fetchNextFrame();return{frameUpdated:!1,isStarving:!0}}if(this.nextFrame.timestamp<=A){if(this.currentFrame=this.nextFrame,this.nextFrame=null,this.renderFrame(this.currentFrame),this.frameIterator)this.fetchNextFrame();return{frameUpdated:!0,isStarving:!1}}return{frameUpdated:!1,isStarving:!1}}async fetchNextFrame(){let A=this.frameIterator;if(!A||this.disposed)return;let O=this.renderingId;try{let $=(await A.next()).value??null;if(!$||O!==this.renderingId||this.disposed)return;this.nextFrame=$}catch{}}renderFrame(A){if(this.currentFrame=A,!this.renderer||!this.canvas){if(this.initPromise)this.initPromise.then(()=>{if(this.currentFrame===A&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log("Rendering frame after renderer initialization");this.renderer.render(A.canvas)}});return}if(!this.renderer.isReady()){if(this.debug)console.warn(`VideoRenderer: Renderer (${this.rendererType}) not ready, skipping frame`);return}if(!this.renderer.render(A.canvas)){if(this.debug)console.warn(`Failed to render frame with ${this.rendererType} (canvas: ${A.canvas.width}x${A.canvas.height})`);if(A.canvas.width===0||A.canvas.height===0)this.retryUntilCanvasReady(A,()=>{if(this.currentFrame===A&&this.renderer&&this.renderer.isReady()){if(!this.renderer.render(A.canvas)&&this.debug)console.warn("Retry render also failed")}},1)}}async getFrameAt(A){if(!this.canvasSink)return null;return this.canvasSink.getCanvas(A)}async getSampleAt(A){if(!this.sampleSink)return null;return this.sampleSink.getSample(A)}async extractFrames(A,O,S=1){if(!this.canvasSink)return[];let $=[],j=[];for(let V=A;V<=O;V+=S)j.push(V);for await(let V of this.canvasSink.canvasesAtTimestamps(j))if(V)$.push(V);return $}async screenshot(A,O={}){if(!this.canvas)return null;if(A!==void 0&&this.canvasSink){let S=await this.canvasSink.getCanvas(A);if(S)this.renderFrame(S)}if("toBlob"in this.canvas)return new Promise((S)=>{this.canvas.toBlob(($)=>S($),`image/${O.format??"png"}`,O.quality)});else return this.canvas.convertToBlob({type:`image/${O.format??"png"}`,quality:O.quality})}getCurrentFrame(){return this.currentFrame}getNextFrame(){return this.nextFrame}getRendererType(){return this.rendererType}getCanvas(){return this.canvas}updateCanvasDimensions(){if(!this.canvas||!("getBoundingClientRect"in this.canvas))return;let A=this.canvas;if(this.updateCanvasBackingBuffer(A)&&this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)}async switchRenderer(A){if(!this.canvas)throw Error("Cannot switch renderer: No canvas set");let O=this.rendererType;if(A===O)return;if(this.debug)console.warn(`Switching renderer from ${O} to ${A}. This will recreate the canvas element.`);if(this.canvas instanceof HTMLCanvasElement){let S=this.canvas,$=S.parentElement;if(!$)throw Error("Cannot switch renderer: Canvas has no parent element");let j=document.createElement("canvas");if(j.width=S.width,j.height=S.height,j.className=S.className,j.id=S.id,j.style.cssText=S.style.cssText,Array.from(S.attributes).forEach((V)=>{if(V.name!=="id"&&V.name!=="class"&&V.name!=="style")j.setAttribute(V.name,V.value)}),this.renderer)this.renderer.dispose(),this.renderer=null;$.replaceChild(j,S),this.canvas=j;try{await this.initializeRenderer(j,A)}catch(V){if(this.debug)console.error(`Failed to switch to ${A}:`,V);if(!this.renderer){if(this.renderer=new _({canvas:j}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}else{if(this.debug)console.warn("Runtime switching for OffscreenCanvas may not work if context is already set");if(this.renderer)this.renderer.dispose(),this.renderer=null;try{await this.initializeRenderer(this.canvas,A)}catch(S){if(this.debug)console.error(`Failed to switch to ${A}:`,S);if(!this.renderer){if(this.renderer=new _({canvas:this.canvas}),this.rendererType="canvas2d",this.onRendererChange)this.onRendererChange("canvas2d")}}}if(this.currentFrame&&this.renderer&&this.renderer.isReady()){if(this.debug)console.log(`Re-rendering after switch to ${this.rendererType}`);queueMicrotask(()=>{if(this.currentFrame&&this.renderer&&this.renderer.isReady())this.renderFrame(this.currentFrame)})}}setRendererChangeCallback(A){if(this.onRendererChange=A,this.renderer&&this.rendererType){if(this.debug)console.log(`Renderer already initialized as ${this.rendererType}, emitting change event`);A(this.rendererType)}}setRendererFallbackCallback(A){this.onRendererFallback=A}static getSupportedRenderers(){return Z.getSupportedRenderers()}async clearIterators(){if(this.renderingId++,this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}this.currentFrame=null,this.nextFrame=null}async disposeVideoResources(){if(this.disposed=!0,this.renderingId++,this.frameIterator){try{await this.frameIterator.return()}catch{}this.frameIterator=null}this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.videoAspectRatio=null}dispose(){if(this.disposed=!0,this.renderingId++,this.frameIterator)this.frameIterator.return(),this.frameIterator=null;if(this.renderer)this.renderer.dispose(),this.renderer=null;this.cleanupResizeObserver(),this.currentFrame=null,this.nextFrame=null,this.canvasSink=null,this.sampleSink=null,this.onRendererChange=void 0,this.onRendererFallback=void 0}}var D=2,E="[MediaFox]";function e(A){D=A}function AA(A,...O){if(D<=0)console.debug(`${E} ${A}`,...O)}function OA(A,...O){if(D<=1)console.info(`${E} ${A}`,...O)}function SA(A,...O){if(D<=2)console.warn(`${E} ${A}`,...O)}function $A(A,...O){if(D<=3)console.error(`${E} ${A}`,...O)}var P={setLevel:e,debug:AA,info:OA,warn:SA,error:$A};class h{deps;constructor(A){this.deps=A}async load(A,O={}){try{await this.deps.playbackController.reset(),this.deps.sourceManager.disposeCurrent();let S=this.deps.state.getState();if(!O.replacePlaylist)this.deps.state.setState({...S,state:"loading",currentTime:O.startTime??0,playing:!1,paused:!0,ended:!1,seeking:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,buffered:[],canPlay:!1,canPlayThrough:!1});else this.deps.state.reset(),this.deps.state.updateLoadingState();this.deps.emit("loadstart",void 0);let $=O.playlistItemId?this.deps.sourceManager.promoteQueuedSource(O.playlistItemId):null;if(!$)$=await this.deps.sourceManager.createSource(A);let j=$.input;if(!j)throw Error("Failed to create input from source");await this.deps.trackManager.initialize(j);let[V,K,N,U]=await Promise.all([j.computeDuration(),j.getFormat(),j.getMimeType(),j.getMetadataTags()]),Q={duration:V,format:K.name,mimeType:N,metadata:U,hasVideo:this.deps.trackManager.hasVideo(),hasAudio:this.deps.trackManager.hasAudio(),hasSubtitles:this.deps.trackManager.hasSubtitles()};this.deps.state.updateDuration(V),this.deps.state.updateMediaInfo(Q),this.deps.state.updateTracks(this.deps.trackManager.getVideoTracks(),this.deps.trackManager.getAudioTracks(),this.deps.trackManager.getSubtitleTracks()),this.deps.playbackController.setDuration(V);let J=$.prefetchedData,Y=J?.videoTrack??this.deps.trackManager.getPrimaryVideoTrack(),B=J?.audioTrack??this.deps.trackManager.getPrimaryAudioTrack();if(Y&&J?.canvasSink&&J?.firstFrame)m(Y,{canvasSink:J.canvasSink,firstFrame:J.firstFrame});let X="",G=!1,L=!1;if(Y||B){let q=await this.deps.trackSwitcher.setupInitialTracks(Y,B);X+=q.warningMessage,G=q.videoSupported,L=q.audioSupported}if(!G&&!L){if(!X)X="No audio or video track found.";throw Error(X)}if(X&&(G||L))this.deps.emit("warning",{type:"codec-warning",message:X.trim(),error:void 0});if(this.deps.state.updateReadyState(!0,!0),this.deps.emit("loadedmetadata",Q),this.deps.emit("loadeddata",void 0),this.deps.emit("canplay",void 0),this.deps.emit("canplaythrough",void 0),this.updateCurrentPlaylistItemDuration(V),O.autoplay)await this.play();if(O.startTime!==void 0)await this.seek(O.startTime)}catch(S){throw this.handleError(S),S}}async play(){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");await this.deps.playbackController.play(),this.deps.state.updatePlaybackState(!0),this.deps.emit("play",void 0),this.deps.emit("playing",void 0)}catch(A){throw this.handleError(A),A}}pause(){this.deps.playbackController.pause(),this.deps.state.updatePlaybackState(!1),this.deps.emit("pause",void 0)}async seek(A){try{if(this.deps.state.getState().state==="idle")throw Error("No media loaded");this.deps.state.updateSeekingState(!0),this.deps.emit("seeking",{currentTime:A}),await this.deps.playbackController.seek(A),this.deps.state.updateSeekingState(!1),this.deps.state.updateTime(this.deps.playbackController.getCurrentTime()),this.deps.emit("seeked",{currentTime:this.deps.playbackController.getCurrentTime()})}catch(O){throw this.deps.state.updateSeekingState(!1),this.handleError(O),O}}async stop(){try{this.pause(),await this.seek(0)}catch(A){throw this.handleError(A),A}}handleError(A){this.deps.state.updateError(A),this.deps.emit("error",A),P.error("Player error:",A)}updateCurrentPlaylistItemDuration(A){let O=this.deps.state.getState(),S=O.currentPlaylistIndex;if(S!==null&&O.playlist.length>0){let $=[...O.playlist],j=$[S];if(j)$[S]={...j,duration:A},this.deps.state.updatePlaylist($,S)}}}class u{store;constructor(A){this.store=A}getState(){return this.store.getState()}subscribe(A){return this.store.subscribe(A)}setState(A){this.store.setState(A)}reset(){this.store.reset()}applyInitial(A,O,S){this.store.setState({volume:A,muted:O,playbackRate:S})}updateLoadingState(){this.store.updateLoadingState()}updateReadyState(A,O){this.store.updateReadyState(A,O)}updatePlaybackState(A){this.store.updatePlaybackState(A)}updateSeekingState(A){this.store.updateSeekingState(A)}updateWaitingState(A){this.store.updateWaitingState(A)}updateEndedState(A){this.store.updateEndedState(A)}updateTime(A){this.store.updateTime(A)}updateDuration(A){this.store.updateDuration(A)}updateVolume(A,O){this.store.updateVolume(A,O)}updatePlaybackRate(A){this.store.updatePlaybackRate(A)}updateMediaInfo(A){this.store.updateMediaInfo(A)}updateTracks(A,O,S){this.store.updateTracks(A,O,S)}updateSelectedTracks(A,O){this.store.updateSelectedTracks(A,O)}updateError(A){this.store.updateError(A)}updateRendererType(A){this.store.updateRendererType(A)}updatePlaylist(A,O=null){this.store.updatePlaylist(A,O)}}class k{chains=new Map;async run(A,O){let S=this.chains.get(A)??Promise.resolve(),$,j=new Promise((V)=>{$=V});this.chains.set(A,S.then(()=>j));try{return await S,await O()}finally{$?.()}}}class v{deps;locks=new k;constructor(A){this.deps=A}async setupInitialTracks(A,O){let S=!1,$=!1,j="";if(A)try{if(S=await this.locks.run("video",async()=>{if(A.codec!==null&&await A.canDecode())return await this.deps.playbackController.trySetVideoTrack(A);return!1}),!S)j+="Unsupported video codec. "}catch(V){j+="Failed to set up video track. ",P.warn("Video track error:",V)}if(O)try{if($=await this.locks.run("audio",async()=>{if(O.codec!==null&&await O.canDecode())return await this.deps.playbackController.trySetAudioTrack(O);return!1}),!$)j+="Unsupported audio codec. "}catch(V){j+="Failed to set up audio track. ",P.warn("Audio track error:",V)}if(!S&&!$&&!j)j="No audio or video track found.";return{videoSupported:S,audioSupported:$,warningMessage:j}}async selectVideoTrack(A,O){if(!A.selectVideoTrack(O))throw Error(`Invalid video track ID: ${O}`);let S=A.getSelectedVideoTrack();if(!S){await this.deps.playbackController.setVideoTrack(null);return}if(!await this.locks.run("video",async()=>{if(S.codec!==null&&await S.canDecode())return await this.deps.playbackController.trySetVideoTrack(S);return!1}))this.deps.emit("warning",{type:"video-codec-unsupported",message:"Video codec not supported.",error:void 0}),await this.deps.playbackController.setVideoTrack(null)}async selectAudioTrack(A,O){if(!A.selectAudioTrack(O))throw Error(`Invalid audio track ID: ${O}`);let S=A.getSelectedAudioTrack();if(!S){await this.deps.playbackController.setAudioTrack(null);return}if(!await this.locks.run("audio",async()=>{if(S.codec!==null&&await S.canDecode())return await this.deps.playbackController.trySetAudioTrack(S);return!1}))this.deps.emit("warning",{type:"audio-codec-unsupported",message:"Audio codec not supported. Continuing without audio.",error:void 0}),await this.deps.playbackController.setAudioTrack(null)}}import{AudioBufferSink as jA,AudioSampleSink as VA}from"mediabunny";class F{audioContext;gainNode=null;bufferSink=null;sampleSink=null;bufferIterator=null;queuedNodes=new Set;startContextTime=0;startMediaTime=0;pauseTime=0;playing=!1;volume=1;muted=!1;disposed=!1;playbackId=0;playbackRate=1;constructor(A={}){if(A.audioContext)this.audioContext=A.audioContext;else{let O=window,S=O.AudioContext||O.webkitAudioContext;this.audioContext=new S}this.volume=A.volume??1,this.muted=A.muted??!1,this.setupAudioGraph()}setupAudioGraph(){this.gainNode=this.audioContext.createGain(),this.gainNode.connect(this.audioContext.destination),this.updateGain()}async setAudioTrack(A){if(this.dispose(),A.codec===null)throw Error("Unsupported audio codec");if(!await A.canDecode())throw Error(`Cannot decode audio track with codec: ${A.codec}`);this.bufferSink=new jA(A),this.sampleSink=new VA(A),this.disposed=!1}async play(A=this.pauseTime){if(this.playing||!this.bufferSink)return;if(this.audioContext.state==="suspended")await this.audioContext.resume();this.playbackId++;let O=this.playbackId;this.playing=!0,this.startContextTime=this.audioContext.currentTime,this.startMediaTime=A,this.pauseTime=A,this.bufferIterator=this.bufferSink.buffers(A),this.scheduleAudioBuffers(O)}async scheduleAudioBuffers(A){let O=this.bufferIterator;if(!O||!this.gainNode)return;try{for await(let{buffer:S,timestamp:$}of O){if(A!==this.playbackId||this.disposed||!this.playing)break;let j=this.audioContext.createBufferSource();j.buffer=S,j.connect(this.gainNode),j.playbackRate.value=this.playbackRate,j.playbackRate.setValueAtTime(this.playbackRate,this.audioContext.currentTime);let V=this.startContextTime+($-this.startMediaTime)/this.playbackRate;if(V>=this.audioContext.currentTime)j.start(V);else{let K=Math.max(0,(this.audioContext.currentTime-V)*this.playbackRate);if(K<S.duration)j.start(this.audioContext.currentTime,K);else continue}if(this.queuedNodes.add(j),j.onended=()=>{this.queuedNodes.delete(j)},$-this.getCurrentTime()>=1)await this.waitForCatchup($)}}catch{}}async waitForCatchup(A){return new Promise((O)=>{let S=setInterval(()=>{if(A-this.getCurrentTime()<1||!this.playing)clearInterval(S),O()},100)})}pause(){if(!this.playing)return;let A=this.getCurrentTime();if(this.playing=!1,this.pauseTime=A,this.stopQueuedNodes(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null}stop(){this.pause(),this.pauseTime=0,this.startContextTime=0,this.startMediaTime=0}async seek(A){let O=this.playing;if(O)this.pause();if(this.pauseTime=A,O)await this.play(A)}getCurrentTime(){if(this.playing){let A=this.audioContext.currentTime-this.startContextTime;return this.startMediaTime+A*this.playbackRate}return this.pauseTime}setVolume(A){this.volume=Math.max(0,Math.min(1,A)),this.updateGain()}setMuted(A){this.muted=A,this.updateGain()}updateGain(){if(!this.gainNode)return;let A=this.muted?0:this.volume;this.gainNode.gain.value=A*A}getVolume(){return this.volume}isMuted(){return this.muted}isPlaying(){return this.playing}setPlaybackRate(A){let O=Math.max(0.25,Math.min(4,A));if(this.playbackRate===O)return;let S=this.playing,$=this.getCurrentTime();if(this.playbackRate=O,S)this.pause(),this.pauseTime=$,this.play($)}getAudioContext(){return this.audioContext}async getBufferAt(A){if(!this.bufferSink)return null;return this.bufferSink.getBuffer(A)}async getSampleAt(A){if(!this.sampleSink)return null;return this.sampleSink.getSample(A)}stopQueuedNodes(){for(let A of this.queuedNodes)try{A.stop()}catch{}this.queuedNodes.clear()}async clearIterators(){if(this.playbackId++,this.stop(),this.bufferIterator){try{await this.bufferIterator.return()}catch{}this.bufferIterator=null}}dispose(){if(this.disposed=!0,this.playbackId++,this.stop(),this.bufferIterator)this.bufferIterator.return(),this.bufferIterator=null;this.bufferSink=null,this.sampleSink=null}destroy(){if(this.dispose(),this.gainNode)this.gainNode.disconnect(),this.gainNode=null;if(this.audioContext.state!=="closed")this.audioContext.close()}}var KA=100,NA=250;class W{videoRenderer;audioManager;playing=!1;currentTime=0;duration=0;playbackRate=1;animationFrameId=null;lastFrameTime=0;syncIntervalId=null;renderIntervalId=null;isWaiting=!1;onTimeUpdate;onEnded;onWaiting;onPlaying;constructor(A={}){this.videoRenderer=new R({canvas:A.canvas,rendererType:A.rendererType}),this.audioManager=new F({audioContext:A.audioContext,volume:A.volume,muted:A.muted}),this.playbackRate=A.playbackRate??1}async setVideoTrack(A){if(!A){this.videoRenderer.dispose();return}await this.videoRenderer.setVideoTrack(A);let O=await A.computeDuration();this.duration=Math.max(this.duration,O)}async trySetVideoTrack(A){try{return await this.setVideoTrack(A),!0}catch{return!1}}async setAudioTrack(A){let O=this.playing,S=this.getCurrentTime();if(!A){this.audioManager.dispose();return}let $=await A.computeDuration(),j=Math.max(0,Math.min(S,$));if(await this.audioManager.setAudioTrack(A),await this.audioManager.seek(j),O)await this.audioManager.play(j);this.currentTime=j,this.duration=Math.max(this.duration,$)}async trySetAudioTrack(A){try{return await this.setAudioTrack(A),!0}catch{return!1}}async setCanvas(A){await this.videoRenderer.setCanvas(A)}async play(){if(this.playing)return;if(this.playing=!0,this.lastFrameTime=performance.now(),this.currentTime>=this.duration)this.currentTime=0,await this.videoRenderer.seek(0);await this.audioManager.play(this.currentTime),this.startRenderLoop(),this.startSyncInterval()}pause(){if(!this.playing)return;if(this.playing=!1,this.isWaiting=!1,this.audioManager.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime()}async seek(A){let O=Math.max(0,Math.min(A,this.duration));if(this.currentTime=O,await this.videoRenderer.seek(O),await this.audioManager.seek(O),this.onTimeUpdate)this.onTimeUpdate(this.currentTime)}startRenderLoop(){if(this.animationFrameId!==null||this.renderIntervalId!==null)return;let A=(O=!0)=>{if(!this.playing)return;if(this.audioManager.isPlaying())this.currentTime=this.audioManager.getCurrentTime();else{let $=performance.now(),j=($-this.lastFrameTime)/1000;this.lastFrameTime=$,this.currentTime+=j*this.playbackRate}if(this.currentTime>=this.duration){this.handleEnded();return}let{isStarving:S}=this.videoRenderer.updateFrame(this.currentTime);if(S&&!this.isWaiting){if(this.isWaiting=!0,this.onWaiting)this.onWaiting()}else if(!S&&this.isWaiting){if(this.isWaiting=!1,this.onPlaying)this.onPlaying()}if(O)this.animationFrameId=requestAnimationFrame(()=>A())};if(this.animationFrameId=requestAnimationFrame(()=>A()),this.renderIntervalId===null)this.renderIntervalId=window.setInterval(()=>A(!1),KA)}stopRenderLoop(){if(this.animationFrameId!==null)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null;if(this.renderIntervalId!==null)clearInterval(this.renderIntervalId),this.renderIntervalId=null}startSyncInterval(){if(this.syncIntervalId!==null)return;this.syncIntervalId=window.setInterval(()=>{if(this.playing&&this.onTimeUpdate)this.onTimeUpdate(this.currentTime)},NA)}stopSyncInterval(){if(this.syncIntervalId!==null)clearInterval(this.syncIntervalId),this.syncIntervalId=null}handleEnded(){if(this.pause(),this.currentTime=this.duration,this.onEnded)this.onEnded()}getCurrentTime(){if(this.playing&&this.audioManager.isPlaying())return this.audioManager.getCurrentTime();return this.currentTime}getDuration(){return this.duration}setDuration(A){this.duration=A}isPlaying(){return this.playing}setVolume(A){this.audioManager.setVolume(A)}getVolume(){return this.audioManager.getVolume()}setMuted(A){this.audioManager.setMuted(A)}isMuted(){return this.audioManager.isMuted()}setPlaybackRate(A){let O=Math.max(0.25,Math.min(4,A));if(this.playbackRate===O)return;this.playbackRate=O,this.audioManager.setPlaybackRate(O),this.lastFrameTime=performance.now()}getPlaybackRate(){return this.playbackRate}setTimeUpdateCallback(A){this.onTimeUpdate=A}setEndedCallback(A){this.onEnded=A}setWaitingCallback(A){this.onWaiting=A}setPlayingCallback(A){this.onPlaying=A}isBuffering(){return this.isWaiting}async screenshot(A){return this.videoRenderer.screenshot(this.currentTime,A)}getVideoRenderer(){return this.videoRenderer}getAudioManager(){return this.audioManager}async switchRenderer(A){await this.videoRenderer.switchRenderer(A)}getRendererType(){return this.videoRenderer.getRendererType()}updateCanvasDimensions(){this.videoRenderer.updateCanvasDimensions()}setRendererChangeCallback(A){this.videoRenderer.setRendererChangeCallback(A)}setRendererFallbackCallback(A){this.videoRenderer.setRendererFallbackCallback(A)}async reset(){this.pause(),this.stopRenderLoop(),this.stopSyncInterval(),this.currentTime=0,this.duration=0,await Promise.all([this.videoRenderer.clearIterators(),this.audioManager.clearIterators()]),this.playbackRate=1,this.lastFrameTime=0}dispose(){this.pause(),this.videoRenderer.dispose(),this.audioManager.dispose(),this.onTimeUpdate=void 0,this.onEnded=void 0,this.onWaiting=void 0,this.onPlaying=void 0}destroy(){this.dispose(),this.audioManager.destroy()}}function H(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():Date.now().toString(36)+Math.random().toString(36).substr(2)}class p{store;emitter;switchSource;sourceManager;constructor(A,O,S,$){this.store=A,this.emitter=O,this.switchSource=S,this.sourceManager=$}async loadPlaylist(A,O={}){let S=A.map(($)=>{if($&&typeof $==="object"&&"mediaSource"in $)return{id:H(),mediaSource:$.mediaSource,title:$.title,poster:$.poster,savedPosition:null,duration:null};else return{id:H(),mediaSource:$,savedPosition:null,duration:null}});if(this.store.updatePlaylist(S,S.length>0?0:null),this.emitter.emit("playlistchange",{playlist:S}),S.length>0&&this.switchSource){let $=S[0];if(O.startTime!==void 0)$.savedPosition=O.startTime;await this.switchSource($,O.autoplay??!1)}}addToPlaylist(A,O){let S=this.createPlaylistItem(A);this.store.addToPlaylist(S,O),this.emitter.emit("playlistadd",{item:S,index:O??this.store.getState().playlist.length-1})}async removeFromPlaylist(A){let O=this.store.getState(),S=O.currentPlaylistIndex,$=O.playing;this.store.removeFromPlaylist(A),this.emitter.emit("playlistremove",{index:A}),this.sourceManager?.disposeQueued(O.playlist[A]?.id||"");let j=this.store.getState(),V=j.currentPlaylistIndex;if(j.playlist.length===0)this.sourceManager?.disposeAll(),this.emitter.emit("playlistchange",{playlist:j.playlist}),this.emitter.emit("playlistend",void 0);if(S===A&&V!==null&&V!==S&&this.switchSource){let K=j.playlist[V];try{await this.switchSource(K,$)}catch(N){this.emitter.emit("playlistitemerror",{index:V,error:N})}}}clearPlaylist(){this.store.clearPlaylist(),this.emitter.emit("playlistchange",{playlist:[]}),this.emitter.emit("playlistend",void 0),this.sourceManager?.disposeAll()}async next(){let A=this.store.getState(),O=A.currentPlaylistIndex??0,S=A.playlist,$=A.playlistMode,j=null;if($==="repeat-one")j=O;else if($==="sequential"||$==="repeat")if(O<S.length-1)j=O+1;else if($==="repeat")j=0;else{this.emitter.emit("playlistend",void 0);return}else if(O<S.length-1)j=O+1;if(j!==null)await this.switchTo(j)}async prev(){let O=this.store.getState().currentPlaylistIndex??0;if(O>0)await this.switchTo(O-1)}async jumpTo(A){let S=this.store.getState().playlist;if(A>=0&&A<S.length)await this.switchTo(A);else if(A>=S.length)this.emitter.emit("playlistend",void 0)}setMode(A){let O=["sequential","manual","repeat","repeat-one",null];if(!O.includes(A))throw Error(`Invalid playlist mode: ${A}. Valid modes: ${O.filter((S)=>S!==null).join(", ")}, null`);this.store.updatePlaylistMode(A)}async switchTo(A){let O=this.store.getState(),S=O.currentPlaylistIndex,$=O.playing,j=[...O.playlist];if(S!==null&&S!==A){let N=j[S];j[S]={...N,savedPosition:O.currentTime}}this.store.updatePlaylist(j,A);let V=j[A];if(this.emitter.emit("playlistitemchange",{index:A,item:V,previousIndex:S??void 0}),this.switchSource)await this.switchSource(V,$);if(O.playlistMode==="sequential"&&A<j.length-1){let N=j[A+1];this.sourceManager?.preloadSource(N.mediaSource,N.id)}}createPlaylistItem(A){if(A&&typeof A==="object"&&"mediaSource"in A)return{id:H(),mediaSource:A.mediaSource,title:A.title,poster:A.poster,savedPosition:null,duration:null};else return{id:H(),mediaSource:A,savedPosition:null,duration:null}}get playlist(){return this.store.getState().playlist}get currentIndex(){return this.store.getState().currentPlaylistIndex}get currentItem(){let A=this.currentIndex;return A!==null?this.playlist[A]:null}get mode(){return this.store.getState().playlistMode}dispose(){if(this.sourceManager)this.sourceManager=void 0;this.switchSource=void 0}}import{ALL_FORMATS as QA,BlobSource as UA,BufferSource as zA,CanvasSink as JA,FilePathSource as XA,Input as ZA,ReadableStreamSource as YA,UrlSource as GA}from"mediabunny";class b{currentSource=null;queuedSources=new Map;options;constructor(A={}){this.options={maxCacheSize:A.maxCacheSize??16777216,crossOrigin:A.crossOrigin,requestInit:A.requestInit}}async createSource(A,O){if(this.currentSource&&!O)this.disposeCurrent();let S,$;if(A instanceof File||A instanceof Blob)S=new UA(A,{maxCacheSize:this.options.maxCacheSize}),$="blob";else if(A instanceof ArrayBuffer||A instanceof Uint8Array)S=new zA(A),$="buffer";else if(typeof A==="string"||A instanceof URL){let K=A instanceof URL?A.href:A;if(typeof window>"u"&&!K.startsWith("http"))S=new XA(K,{maxCacheSize:this.options.maxCacheSize}),$="file";else S=new GA(K,{maxCacheSize:this.options.maxCacheSize,requestInit:this.options.requestInit}),$="url"}else if(typeof ReadableStream<"u"&&A instanceof ReadableStream)S=new YA(A,{maxCacheSize:this.options.maxCacheSize}),$="stream";else throw TypeError("Unsupported media source type");let j=new ZA({source:S,formats:QA}),V={source:S,input:j,type:$,originalSource:A};if(O)this.queuedSources.set(O,V);else this.currentSource=V;return V}getCurrentSource(){return this.currentSource}getQueuedSource(A){return this.queuedSources.get(A)||null}async preloadSource(A,O){if(this.queuedSources.has(O))return;let S=await this.createSource(A,O);if(S.input)try{let $=await this.prefetchTrackData(S.input);S.prefetchedData=$}catch{}}async prefetchTrackData(A){let O=await A.getVideoTracks(),S=await A.getAudioTracks(),$=O.length>0?O[0]:null,j=S.length>0?S[0]:null,V=null,K=null,N=0;if($){if($.codec!==null&&await $.canDecode()){V=new JA($,{poolSize:2});let U=V.canvases(0);K=(await U.next()).value??null,await U.return(),N=await $.computeDuration()}}if(!N&&j)N=await j.computeDuration();return{videoTrack:$,audioTrack:j,canvasSink:V,firstFrame:K,duration:N}}promoteQueuedSource(A){let O=this.queuedSources.get(A);if(!O)return null;if(this.queuedSources.delete(A),this.currentSource)this.currentSource.input?.dispose();return this.currentSource=O,O}getOriginalSource(){return this.currentSource?.originalSource??null}disposeCurrent(){if(this.currentSource)this.currentSource.input?.dispose(),this.currentSource=null}disposeQueued(A){let O=this.queuedSources.get(A);if(O)O.input?.dispose(),this.queuedSources.delete(A)}disposeAll(){this.disposeCurrent(),this.queuedSources.forEach((A,O)=>{this.disposeQueued(O)}),this.queuedSources.clear()}dispose(){this.disposeAll()}static isStreamingSource(A){return A instanceof ReadableStream||typeof A==="string"&&A.startsWith("http")}static isLocalSource(A){return A instanceof File||A instanceof Blob||A instanceof ArrayBuffer||A instanceof Uint8Array||typeof A==="string"&&!A.startsWith("http")}static getSourceType(A){if(A instanceof File)return"file";if(A instanceof Blob)return"blob";if(A instanceof ArrayBuffer||A instanceof Uint8Array)return"buffer";if(A instanceof ReadableStream)return"stream";if(typeof A==="string"||A instanceof URL)return(A instanceof URL?A.href:A).startsWith("http")?"url":"file";return"unknown"}static async fromFetch(A,O){let S=await fetch(A,O);if(!S.ok)throw Error(`Failed to fetch: ${S.status} ${S.statusText}`);return S.blob()}static fromStreamingFetch(A,O){return new ReadableStream({async start(S){let $=await fetch(A,O);if(!$.ok){S.error(Error(`Failed to fetch: ${$.status} ${$.statusText}`));return}let j=$.body?.getReader();if(!j){S.error(Error("Response body is not readable"));return}try{while(!0){let{done:V,value:K}=await j.read();if(V)break;S.enqueue(K)}S.close()}catch(V){S.error(V)}}})}}function f(A,O){if(Object.is(A,O))return!0;if(typeof A!==typeof O)return!1;if(A===null||O===null)return A===O;if(Array.isArray(A)&&Array.isArray(O)){if(A.length!==O.length)return!1;for(let S=0;S<A.length;S++)if(!f(A[S],O[S]))return!1;return!0}if(l(A)&&l(O)){let S=Object.keys(A),$=Object.keys(O);if(S.length!==$.length)return!1;for(let j of S){if(!Object.hasOwn(O,j))return!1;if(!f(A[j],O[j]))return!1}return!0}return!1}function l(A){return typeof A==="object"&&A!==null&&A.constructor===Object}class C{state;listeners=new Set;updateScheduled=!1;pendingUpdates={};constructor(){this.state=this.getInitialState()}getInitialState(){let O=Z.getSupportedRenderers()[0]||"canvas2d";return{state:"idle",currentTime:0,duration:0,buffered:[],volume:1,muted:!1,playbackRate:1,playing:!1,paused:!0,ended:!1,seeking:!1,waiting:!1,error:null,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null,canPlay:!1,canPlayThrough:!1,isLive:!1,rendererType:O,playlist:[],currentPlaylistIndex:null,playlistMode:null}}getState(){return Object.freeze({...this.state})}setState(A){if(Object.assign(this.pendingUpdates,A),!this.updateScheduled)this.updateScheduled=!0,queueMicrotask(()=>this.flushUpdates())}flushUpdates(){if(Object.keys(this.pendingUpdates).length===0){this.updateScheduled=!1;return}let A={...this.state};this.state={...this.state,...this.pendingUpdates},this.pendingUpdates={},this.updateScheduled=!1;let O=Object.keys(this.pendingUpdates);if((O.length?O:Object.keys(this.state)).some((j)=>!f(this.state[j],A[j])))this.notifyListeners()}subscribe(A){return this.listeners.add(A),A(this.getState()),()=>{this.listeners.delete(A)}}reset(){this.state=this.getInitialState(),this.pendingUpdates={},this.updateScheduled=!1,this.notifyListeners()}notifyListeners(){let A=this.getState();this.listeners.forEach((O)=>{try{O(A)}catch(S){console.error("Error in state listener:",S)}})}updatePlaybackState(A){let O=A?"playing":"paused";this.setState({state:O,playing:A,paused:!A,ended:!1})}updateTime(A){this.setState({currentTime:A})}updateDuration(A){this.setState({duration:A})}updateBuffered(A){this.setState({buffered:A})}updateVolume(A,O){this.setState({volume:A,muted:O})}updatePlaybackRate(A){this.setState({playbackRate:A})}updateMediaInfo(A){this.setState({mediaInfo:A})}updateTracks(A,O,S){let $={};if(A)$.videoTracks=A;if(O)$.audioTracks=O;if(S)$.subtitleTracks=S;this.setState($)}updateSelectedTracks(A,O){switch(A){case"video":this.setState({selectedVideoTrack:O});break;case"audio":this.setState({selectedAudioTrack:O});break;case"subtitle":this.setState({selectedSubtitleTrack:O});break}}updateError(A){this.setState({error:A,state:A?"error":this.state.state})}updateSeekingState(A){this.setState({seeking:A})}updateWaitingState(A){this.setState({waiting:A})}updateReadyState(A,O){this.setState({canPlay:A,canPlayThrough:O,state:A?"ready":this.state.state})}updateEndedState(A){this.setState({ended:A,playing:!1,paused:!0,state:A?"ended":this.state.state})}updateLoadingState(){this.setState({state:"loading",playing:!1,paused:!0,ended:!1,error:null})}updateRendererType(A){this.setState({rendererType:A})}updatePlaylist(A,O=null){this.setState({playlist:A,currentPlaylistIndex:O})}updateCurrentPlaylistIndex(A){this.setState({currentPlaylistIndex:A})}updatePlaylistMode(A){this.setState({playlistMode:A})}addToPlaylist(A,O){let S=this.state.playlist,$,j=this.state.currentPlaylistIndex;if(O!==void 0&&O>=0&&O<=S.length){if($=[...S.slice(0,O),A,...S.slice(O)],j!==null&&j>=O)j+=1}else $=[...S,A];this.setState({playlist:$,currentPlaylistIndex:j})}removeFromPlaylist(A){let O=this.state.playlist;if(A<0||A>=O.length)return;let S=O.filter((j,V)=>V!==A),$=this.state.currentPlaylistIndex;if($===A)$=S.length>0?0:null;else if($!==null&&$>A)$-=1;if(S.length===0)this.setState({playlist:S,currentPlaylistIndex:null,state:"idle",currentTime:0,duration:0,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null});else this.setState({playlist:S,currentPlaylistIndex:$})}clearPlaylist(){this.setState({playlist:[],currentPlaylistIndex:null,state:"idle",currentTime:0,duration:0,mediaInfo:null,videoTracks:[],audioTracks:[],subtitleTracks:[],selectedVideoTrack:null,selectedAudioTrack:null,selectedSubtitleTrack:null})}}class T{input=null;videoTracks=new Map;audioTracks=new Map;videoTrackInfos=[];audioTrackInfos=[];subtitleTrackInfos=[];subtitleProviders=new Map;subtitleTrackResolvers=new Map;selectedVideoTrack=null;selectedAudioTrack=null;selectedSubtitleTrack=null;onTrackChange;async initialize(A){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.input=A,await this.loadTracks()}async loadTracks(){if(!this.input)return;let A=await this.input.getVideoTracks();this.videoTrackInfos=await Promise.all(A.map(async(S)=>{let $=`video-${S.id}`;this.videoTracks.set($,S);let j=0,V=0;try{let N=await S.computePacketStats(100);j=N.averagePacketRate,V=N.averageBitrate}catch{}return{id:$,codec:S.codec,language:S.languageCode,name:S.name,width:S.codedWidth,height:S.codedHeight,frameRate:j,bitrate:V,rotation:S.rotation,selected:!1,decodable:await S.canDecode()}}));let O=await this.input.getAudioTracks();if(this.audioTrackInfos=await Promise.all(O.map(async(S)=>{let $=`audio-${S.id}`;this.audioTracks.set($,S);let j=0;try{j=(await S.computePacketStats(100)).averageBitrate}catch{}return{id:$,codec:S.codec,language:S.languageCode,name:S.name,channels:S.numberOfChannels,sampleRate:S.sampleRate,bitrate:j,selected:!1,decodable:await S.canDecode()}})),this.videoTrackInfos.length>0){let S=this.videoTrackInfos.find(($)=>$.decodable);if(S)this.selectVideoTrack(S.id)}if(this.audioTrackInfos.length>0){let S=this.audioTrackInfos.find(($)=>$.decodable);if(S)this.selectAudioTrack(S.id)}}getVideoTracks(){return[...this.videoTrackInfos]}getAudioTracks(){return[...this.audioTrackInfos]}getSubtitleTracks(){return[...this.subtitleTrackInfos]}getSelectedVideoTrack(){if(!this.selectedVideoTrack)return null;return this.videoTracks.get(this.selectedVideoTrack)??null}getSelectedAudioTrack(){if(!this.selectedAudioTrack)return null;return this.audioTracks.get(this.selectedAudioTrack)??null}getSelectedVideoTrackInfo(){if(!this.selectedVideoTrack)return null;return this.videoTrackInfos.find((A)=>A.id===this.selectedVideoTrack)??null}getSelectedAudioTrackInfo(){if(!this.selectedAudioTrack)return null;return this.audioTrackInfos.find((A)=>A.id===this.selectedAudioTrack)??null}getSelectedSubtitleTrackInfo(){if(!this.selectedSubtitleTrack)return null;return this.subtitleTrackInfos.find((A)=>A.id===this.selectedSubtitleTrack)??null}selectVideoTrack(A){if(A===this.selectedVideoTrack)return!0;if(A&&!this.videoTracks.has(A))return!1;let O=this.selectedVideoTrack;if(this.videoTrackInfos.forEach((S)=>{S.selected=S.id===A}),this.selectedVideoTrack=A,this.onTrackChange)this.onTrackChange({type:"video",previousTrackId:O,newTrackId:A});return!0}selectAudioTrack(A){if(A===this.selectedAudioTrack)return!0;if(A&&!this.audioTracks.has(A))return!1;let O=this.selectedAudioTrack;if(this.audioTrackInfos.forEach((S)=>{S.selected=S.id===A}),this.selectedAudioTrack=A,this.onTrackChange)this.onTrackChange({type:"audio",previousTrackId:O,newTrackId:A});return!0}selectSubtitleTrack(A){if(A===this.selectedSubtitleTrack)return!0;if(A&&!this.subtitleTrackResolvers.has(A))return!1;let O=this.selectedSubtitleTrack;if(this.subtitleTrackInfos.forEach((S)=>{S.selected=S.id===A}),this.selectedSubtitleTrack=A,this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:O,newTrackId:A});return!0}registerSubtitleTracks(A,O){this.subtitleProviders.set(A,O),this.rebuildSubtitleTracks()}unregisterSubtitleTracks(A){if(!this.subtitleProviders.delete(A))return;this.rebuildSubtitleTracks()}async getSubtitleTrackResource(A){if(!A)return null;let O=this.subtitleTrackResolvers.get(A);if(!O)return null;return O()}rebuildSubtitleTracks(){let A=this.selectedSubtitleTrack;this.subtitleTrackInfos=[],this.subtitleTrackResolvers.clear();for(let S of this.subtitleProviders.values())for(let $ of S){let j={...$.info,selected:!1};this.subtitleTrackInfos.push(j),this.subtitleTrackResolvers.set(j.id,$.resolver)}let O=A;if(!O||!this.subtitleTrackResolvers.has(O))O=this.subtitleTrackInfos[0]?.id??null;if(this.selectedSubtitleTrack=O,this.subtitleTrackInfos.forEach((S)=>{S.selected=S.id===this.selectedSubtitleTrack}),A!==this.selectedSubtitleTrack&&this.onTrackChange)this.onTrackChange({type:"subtitle",previousTrackId:A,newTrackId:this.selectedSubtitleTrack})}setTrackChangeListener(A){this.onTrackChange=A}getState(){return{videoTracks:this.getVideoTracks(),audioTracks:this.getAudioTracks(),subtitleTracks:this.getSubtitleTracks(),selectedVideoTrack:this.selectedVideoTrack,selectedAudioTrack:this.selectedAudioTrack,selectedSubtitleTrack:this.selectedSubtitleTrack}}getPrimaryVideoTrack(){if(this.videoTracks.size===0)return null;return this.selectedVideoTrack?this.videoTracks.get(this.selectedVideoTrack)??null:this.videoTracks.values().next().value??null}getPrimaryAudioTrack(){if(this.audioTracks.size===0)return null;return this.selectedAudioTrack?this.audioTracks.get(this.selectedAudioTrack)??null:this.audioTracks.values().next().value??null}hasVideo(){return this.videoTrackInfos.length>0}hasAudio(){return this.audioTrackInfos.length>0}hasSubtitles(){return this.subtitleTrackInfos.length>0}dispose(){this.videoTracks.clear(),this.audioTracks.clear(),this.videoTrackInfos=[],this.audioTrackInfos=[],this.subtitleTrackInfos=[],this.subtitleProviders.clear(),this.subtitleTrackResolvers.clear(),this.selectedVideoTrack=null,this.selectedAudioTrack=null,this.selectedSubtitleTrack=null,this.input=null,this.onTrackChange=void 0}async replaceAudioTrackByInputId(A,O){let S=null;for(let[j,V]of this.audioTracks.entries())if(V.id===A){S=j;break}if(!S)return;this.audioTracks.set(S,O);let $=this.audioTrackInfos.findIndex((j)=>j.id===S);if($!==-1){let j=0;try{j=(await O.computePacketStats(100)).averageBitrate}catch{}this.audioTrackInfos[$]={...this.audioTrackInfos[$],codec:O.codec,channels:O.numberOfChannels,sampleRate:O.sampleRate,bitrate:j,decodable:await O.canDecode()}}}async replaceVideoTrackByInputId(A,O){let S=null;for(let[j,V]of this.videoTracks.entries())if(V.id===A){S=j;break}if(!S)return;this.videoTracks.set(S,O);let $=this.videoTrackInfos.findIndex((j)=>j.id===S);if($!==-1){let j=0,V=0;try{let K=await O.computePacketStats(100);j=K.averagePacketRate,V=K.averageBitrate}catch{}this.videoTrackInfos[$]={...this.videoTrackInfos[$],codec:O.codec,width:O.codedWidth,height:O.codedHeight,rotation:O.rotation,frameRate:j,bitrate:V,decodable:await O.canDecode()}}}}class y{emitter;store;state;sourceManager;playbackController;trackManager;playlistManager;options;disposed=!1;getCurrentInput=()=>this.sourceManager.getCurrentSource()?.input??null;trackSwitcher;core;constructor(A={}){this.options={volume:1,muted:!1,playbackRate:1,autoplay:!1,preload:"metadata",...A},this.emitter=new M({maxListeners:100}),this.store=new C,this.state=new u(this.store),this.sourceManager=new b({maxCacheSize:A.maxCacheSize,crossOrigin:A.crossOrigin}),this.playbackController=new W({canvas:A.renderTarget,audioContext:A.audioContext,volume:this.options.volume,muted:this.options.muted,playbackRate:this.options.playbackRate,rendererType:this.options.renderer}),this.trackManager=new T,this.playlistManager=new p(this.store,this.emitter,async(O,S)=>{await this.core.load(O.mediaSource,{startTime:O.savedPosition??0,autoplay:S,playlistItemId:O.id})},this.sourceManager),this.trackSwitcher=new v({sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,emit:this.emit.bind(this),store:this.store,getCurrentInput:this.getCurrentInput}),this.core=new h({state:this.state,sourceManager:this.sourceManager,trackManager:this.trackManager,playbackController:this.playbackController,trackSwitcher:this.trackSwitcher,emit:this.emit.bind(this)}),this.setupInternalListeners(),this.state.applyInitial(this.options.volume??1,this.options.muted??!1,this.options.playbackRate??1),this.state.updateRendererType(this.options.renderer||"webgpu")}setupInternalListeners(){this.playbackController.setTimeUpdateCallback((A)=>{this.state.updateTime(A),this.emit("timeupdate",{currentTime:A})}),this.playbackController.setEndedCallback(()=>{this.state.updateEndedState(!0),this.emit("ended",void 0);let A=this.getState();if(A.playlist.length>0&&A.currentPlaylistIndex!==null){let{playlistMode:O,currentPlaylistIndex:S}=A;if(O==="repeat-one"){let $=S;queueMicrotask(async()=>{try{await this.seek(0),await this.play()}catch(j){this.emitter.emit("playlistitemerror",{index:$,error:j})}})}else if(O==="repeat"){let $=S<A.playlist.length-1?S+1:0;queueMicrotask(async()=>{try{await this.playlistManager.next()}catch(j){this.emitter.emit("playlistitemerror",{index:$,error:j})}})}else if(O==="sequential"&&S<A.playlist.length-1){let $=S+1;queueMicrotask(async()=>{try{await this.playlistManager.next()}catch(j){this.emitter.emit("playlistitemerror",{index:$,error:j})}})}}}),this.trackManager.setTrackChangeListener((A)=>{this.state.updateSelectedTracks(A.type,A.newTrackId),this.emit("trackchange",{type:A.type,trackId:A.newTrackId})}),this.playbackController.setWaitingCallback(()=>{this.state.updateWaitingState(!0),this.emit("waiting",void 0)}),this.playbackController.setPlayingCallback(()=>{if(this.getState().waiting)this.state.updateWaitingState(!1),this.emit("playing",void 0)}),this.playbackController.setRendererChangeCallback((A)=>{this.state.updateRendererType(A),this.emit("rendererchange",A)}),this.playbackController.setRendererFallbackCallback((A,O)=>{this.emit("rendererfallback",{from:A,to:O})}),this.state.subscribe((A)=>{this.emit("statechange",A)})}async load(A,O={}){this.checkDisposed();let S=this.getState();if(S.playlist.length===0||O.replacePlaylist){await this.playlistManager.loadPlaylist([{mediaSource:A}],{autoplay:O.autoplay??this.options.autoplay,startTime:O.startTime});return}else if(S.currentPlaylistIndex!==null&&S.playlist.length>0){let $=S.currentPlaylistIndex,V={...S.playlist[$],mediaSource:A,savedPosition:0,duration:null},K=[...S.playlist];K[$]=V,this.store.updatePlaylist(K,$),this.emitter.emit("playlistchange",{playlist:K}),await this.core.load(A,{startTime:O.startTime??0,autoplay:O.autoplay??this.options.autoplay});return}await this.core.load(A,{autoplay:O.autoplay??this.options.autoplay,startTime:O.startTime})}async play(){return this.checkDisposed(),this.core.play()}pause(){this.checkDisposed(),this.core.pause()}async seek(A,O={}){return this.checkDisposed(),this.core.seek(A)}async stop(){return this.checkDisposed(),this.core.stop()}get currentTime(){return this.playbackController.getCurrentTime()}set currentTime(A){this.seek(A)}get duration(){return this.state.getState().duration}get volume(){return this.playbackController.getVolume()}set volume(A){this.checkDisposed();let O=Math.max(0,Math.min(1,A));this.playbackController.setVolume(O),this.state.updateVolume(O,this.muted),this.emit("volumechange",{volume:O,muted:this.muted})}get muted(){return this.playbackController.isMuted()}set muted(A){this.checkDisposed(),this.playbackController.setMuted(A),this.state.updateVolume(this.volume,A),this.emit("volumechange",{volume:this.volume,muted:A})}get playbackRate(){return this.playbackController.getPlaybackRate()}set playbackRate(A){this.checkDisposed();let O=Math.max(0.25,Math.min(4,A));this.playbackController.setPlaybackRate(O),this.state.updatePlaybackRate(O),this.emit("ratechange",{playbackRate:O})}get paused(){return!this.playbackController.isPlaying()}get ended(){return this.state.getState().ended}get seeking(){return this.state.getState().seeking}get waiting(){return this.state.getState().waiting}getVideoTracks(){return this.trackManager.getVideoTracks()}getAudioTracks(){return this.trackManager.getAudioTracks()}getSubtitleTracks(){return this.trackManager.getSubtitleTracks()}async selectVideoTrack(A){this.checkDisposed(),await this.trackSwitcher.selectVideoTrack(this.trackManager,A)}async selectAudioTrack(A){this.checkDisposed(),await this.trackSwitcher.selectAudioTrack(this.trackManager,A)}selectSubtitleTrack(A){if(this.checkDisposed(),!this.trackManager.selectSubtitleTrack(A))throw Error(`Invalid subtitle track ID: ${A}`)}registerSubtitleTracks(A,O){this.trackManager.registerSubtitleTracks(A,O),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let S=this.state.getState().mediaInfo;if(S)this.state.updateMediaInfo({...S,hasSubtitles:this.trackManager.hasSubtitles()})}unregisterSubtitleTracks(A){this.trackManager.unregisterSubtitleTracks(A),this.state.updateTracks(void 0,void 0,this.trackManager.getSubtitleTracks());let O=this.state.getState().mediaInfo;if(O)this.state.updateMediaInfo({...O,hasSubtitles:this.trackManager.hasSubtitles()})}async getSubtitleTrackResource(A){return this.trackManager.getSubtitleTrackResource(A)}async screenshot(A={}){return this.checkDisposed(),this.playbackController.screenshot(A)}async setRenderTarget(A){this.checkDisposed(),await this.playbackController.setCanvas(A)}async loadPlaylist(A,O){this.checkDisposed(),await this.playlistManager.loadPlaylist(A,O)}addToPlaylist(A,O){this.checkDisposed(),this.playlistManager.addToPlaylist(A,O)}async removeFromPlaylist(A){this.checkDisposed(),await this.playlistManager.removeFromPlaylist(A)}clearPlaylist(){this.checkDisposed(),this.playlistManager.clearPlaylist()}async next(){this.checkDisposed(),await this.playlistManager.next()}async prev(){this.checkDisposed(),await this.playlistManager.prev()}async jumpTo(A){this.checkDisposed(),await this.playlistManager.jumpTo(A)}get playlist(){return this.playlistManager.playlist}get playlistIndex(){return this.playlistManager.currentIndex}get nowPlaying(){return this.playlistManager.currentItem}get playlistMode(){return this.playlistManager.mode}set playlistMode(A){this.checkDisposed(),this.playlistManager.setMode(A)}getRendererType(){return this.playbackController.getRendererType()}async switchRenderer(A){this.checkDisposed(),await this.playbackController.switchRenderer(A)}updateCanvasDimensions(){this.checkDisposed(),this.playbackController.updateCanvasDimensions()}static getSupportedRenderers(){return Z.getSupportedRenderers()}getState(){return this.state.getState()}subscribe(A){return{unsubscribe:this.state.subscribe(A)}}on(A,O){return this.emitter.on(A,O)}once(A,O){return this.emitter.once(A,O)}off(A,O){this.emitter.off(A,O)}emit(A,O){this.emitter.emit(A,O)}checkDisposed(){if(this.disposed)throw Error("Player has been disposed")}dispose(){if(this.disposed)return;this.disposed=!0,this.playbackController.dispose(),this.trackManager.dispose(),this.playlistManager?.dispose(),this.sourceManager.dispose(),this.state.reset(),this.emitter.removeAllListeners()}destroy(){this.dispose(),this.playbackController.destroy()}}class o{static fromUrl(A,O={}){return{mediaSource:A,title:O.title,poster:O.poster}}static fromFile(A,O={}){return{mediaSource:A,title:O.title||A.name,poster:O.poster}}static fromBlob(A,O={}){return{mediaSource:A,title:O.title,poster:O.poster}}static fromBuffer(A,O={}){return{mediaSource:A,title:O.title,poster:O.poster}}static fromUint8Array(A,O={}){return{mediaSource:A,title:O.title,poster:O.poster}}static fromStream(A,O={}){return{mediaSource:A,title:O.title,poster:O.poster}}}var c;((Q)=>{Q.MEDIA_NOT_SUPPORTED="MEDIA_NOT_SUPPORTED";Q.MEDIA_LOAD_FAILED="MEDIA_LOAD_FAILED";Q.DECODE_ERROR="DECODE_ERROR";Q.NETWORK_ERROR="NETWORK_ERROR";Q.PERMISSION_DENIED="PERMISSION_DENIED";Q.PLAYBACK_ERROR="PLAYBACK_ERROR";Q.TRACK_NOT_FOUND="TRACK_NOT_FOUND";Q.INVALID_STATE="INVALID_STATE";Q.UNKNOWN_ERROR="UNKNOWN_ERROR"})(c||={});class z extends Error{code;details;constructor(A,O,S){super(O);this.name="MediaFoxError",this.code=A,this.details=S}static mediaNotSupported(A="Media format not supported",O){return new z("MEDIA_NOT_SUPPORTED",A,O)}static mediaLoadFailed(A="Failed to load media",O){return new z("MEDIA_LOAD_FAILED",A,O)}static decodeError(A="Failed to decode media",O){return new z("DECODE_ERROR",A,O)}static networkError(A="Network error occurred",O){return new z("NETWORK_ERROR",A,O)}static permissionDenied(A="Permission denied",O){return new z("PERMISSION_DENIED",A,O)}static playbackError(A="Playback error occurred",O){return new z("PLAYBACK_ERROR",A,O)}static trackNotFound(A="Track not found",O){return new z("TRACK_NOT_FOUND",A,O)}static invalidState(A="Invalid player state",O){return new z("INVALID_STATE",A,O)}static unknownError(A="Unknown error occurred",O){return new z("UNKNOWN_ERROR",A,O)}}function BA(A,O){if(A instanceof z)return A;if(A instanceof Error)return new z("UNKNOWN_ERROR",`${O}: ${A.message}`,{originalError:A});return new z("UNKNOWN_ERROR",`${O}: ${String(A)}`,{originalError:A})}function LA(A,O=!1){let S=Math.abs(A),$=Math.floor(S/3600),j=Math.floor(S%3600/60),V=Math.floor(S%60),K=Math.floor(S%1*1000),N="";if(A<0)N="-";if($>0)N+=`${$}:${j.toString().padStart(2,"0")}:${V.toString().padStart(2,"0")}`;else N+=`${j}:${V.toString().padStart(2,"0")}`;if(O)N+=`.${K.toString().padStart(3,"0")}`;return N}function _A(A){let O=A.trim().split(":").map(Number);if(O.some(Number.isNaN))throw Error("Invalid time string");let S=0;if(O.length===3)S=O[0]*3600+O[1]*60+O[2];else if(O.length===2)S=O[0]*60+O[1];else if(O.length===1)S=O[0];else throw Error("Invalid time format");return S}function qA(A,O){return Math.floor(A*O)}function DA(A,O){return A/O}function PA(A,O,S){return Math.max(O,Math.min(S,A))}function MA(A,O){return A.start<O.end&&O.start<A.end}function RA(A){if(A.length===0)return[];let O=[...A].sort(($,j)=>$.start-j.start),S=[O[0]];for(let $=1;$<O.length;$++){let j=S[S.length-1],V=O[$];if(V.start<=j.end)j.end=Math.max(j.end,V.end);else S.push(V)}return S}function EA(A){return A.reduce((O,S)=>O+(S.end-S.start),0)}function FA(A,O){for(let S of A)if(O>=S.start&&O<S.end)return S;return null}var FO="0.1.0",pO=y;export{BA as wrapError,EA as totalBufferedDuration,qA as timeToFrame,MA as timeRangesOverlap,_A as parseTime,RA as mergeTimeRanges,DA as frameToTime,LA as formatTime,FA as findBufferedRange,pO as default,PA as clamp,R as VideoRenderer,FO as VERSION,T as TrackManager,C as Store,b as SourceManager,o as Source,Z as RendererFactory,W as PlaybackController,z as MediaFoxError,y as MediaFox,M as EventEmitter,c as ErrorCode,F as AudioManager};
@@ -1,6 +1,6 @@
1
1
  import type { UnsubscribeFn } from './events/types';
2
2
  import type { SubtitleTrackRegistration, SubtitleTrackResource } from './tracks/types';
3
- import type { AudioTrackInfo, LoadOptions, MediaSource, PlayerEventListener, PlayerEventMap, PlayerOptions, PlayerStateData, RendererType, ScreenshotOptions, SeekOptions, Subscription, SubtitleTrackInfo, VideoTrackInfo } from './types';
3
+ import type { AudioTrackInfo, LoadOptions, MediaSource, PlayerEventListener, PlayerEventMap, PlayerOptions, PlayerStateData, PlaylistItem, PlaylistMode, RendererType, ScreenshotOptions, SeekOptions, Subscription, SubtitleTrackInfo, VideoTrackInfo } from './types';
4
4
  export declare class MediaFox {
5
5
  private emitter;
6
6
  private store;
@@ -8,6 +8,7 @@ export declare class MediaFox {
8
8
  private sourceManager;
9
9
  private playbackController;
10
10
  private trackManager;
11
+ private playlistManager;
11
12
  private options;
12
13
  private disposed;
13
14
  private getCurrentInput;
@@ -19,7 +20,9 @@ export declare class MediaFox {
19
20
  * Load a media source and prepare playback.
20
21
  * Emits: loadstart, loadedmetadata, loadeddata, canplay, canplaythrough (or error)
21
22
  */
22
- load(source: MediaSource, options?: LoadOptions): Promise<void>;
23
+ load(source: MediaSource, options?: LoadOptions & {
24
+ replacePlaylist?: boolean;
25
+ }): Promise<void>;
23
26
  /** Start playback. */
24
27
  play(): Promise<void>;
25
28
  pause(): void;
@@ -43,6 +46,7 @@ export declare class MediaFox {
43
46
  get paused(): boolean;
44
47
  get ended(): boolean;
45
48
  get seeking(): boolean;
49
+ get waiting(): boolean;
46
50
  getVideoTracks(): VideoTrackInfo[];
47
51
  getAudioTracks(): AudioTrackInfo[];
48
52
  getSubtitleTracks(): SubtitleTrackInfo[];
@@ -55,6 +59,29 @@ export declare class MediaFox {
55
59
  /** Capture a screenshot of the current frame. */
56
60
  screenshot(options?: ScreenshotOptions): Promise<Blob | null>;
57
61
  setRenderTarget(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void>;
62
+ loadPlaylist(items: Array<MediaSource | {
63
+ mediaSource: MediaSource;
64
+ title?: string;
65
+ poster?: string;
66
+ }>, options?: {
67
+ autoplay?: boolean;
68
+ startTime?: number;
69
+ }): Promise<void>;
70
+ addToPlaylist(item: MediaSource | {
71
+ mediaSource: MediaSource;
72
+ title?: string;
73
+ poster?: string;
74
+ }, index?: number): void;
75
+ removeFromPlaylist(index: number): Promise<void>;
76
+ clearPlaylist(): void;
77
+ next(): Promise<void>;
78
+ prev(): Promise<void>;
79
+ jumpTo(index: number): Promise<void>;
80
+ get playlist(): import("./types").Playlist;
81
+ get playlistIndex(): number | null;
82
+ get nowPlaying(): PlaylistItem | null;
83
+ get playlistMode(): PlaylistMode;
84
+ set playlistMode(mode: PlaylistMode);
58
85
  getRendererType(): RendererType;
59
86
  switchRenderer(type: RendererType): Promise<void>;
60
87
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mediafox.d.ts","sourceRoot":"","sources":["../src/mediafox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mediafox.d.ts","sourceRoot":"","sources":["../src/mediafox.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,11 @@ export declare class AudioManager {
41
41
  getBufferAt(timestamp: number): Promise<WrappedAudioBuffer | null>;
42
42
  getSampleAt(timestamp: number): Promise<AudioSample | null>;
43
43
  private stopQueuedNodes;
44
+ /**
45
+ * Clears iterators to stop any in-flight async operations.
46
+ * Called before disposing the input to prevent accessing disposed resources.
47
+ */
48
+ clearIterators(): Promise<void>;
44
49
  dispose(): void;
45
50
  destroy(): void;
46
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/playback/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,cAAc,CAAkE;IACxF,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;gBAEb,OAAO,GAAE,mBAAwB;IAmB7C,OAAO,CAAC,eAAe;IAMjB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpD,IAAI,CAAC,QAAQ,GAAE,MAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;YAuB9C,oBAAoB;YA2CpB,cAAc;IAW5B,KAAK,IAAI,IAAI;IAkBb,IAAI,IAAI,IAAI;IAON,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5C,cAAc,IAAI,MAAM;IAQxB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9B,OAAO,CAAC,UAAU;IAQlB,SAAS,IAAI,MAAM;IAInB,OAAO,IAAI,OAAO;IAIlB,SAAS,IAAI,OAAO;IAIpB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkBnC,eAAe,IAAI,YAAY;IAIzB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKlE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKjE,OAAO,CAAC,eAAe;IAWvB,OAAO,IAAI,IAAI;IAef,OAAO,IAAI,IAAI;CAYhB"}
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/playback/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,cAAc,CAAkE;IACxF,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;gBAEb,OAAO,GAAE,mBAAwB;IAmB7C,OAAO,CAAC,eAAe;IAMjB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpD,IAAI,CAAC,QAAQ,GAAE,MAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;YAuB9C,oBAAoB;YA4CpB,cAAc;IAW5B,KAAK,IAAI,IAAI;IAkBb,IAAI,IAAI,IAAI;IAON,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5C,cAAc,IAAI,MAAM;IAQxB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9B,OAAO,CAAC,UAAU;IAQlB,SAAS,IAAI,MAAM;IAInB,OAAO,IAAI,OAAO;IAIlB,SAAS,IAAI,OAAO;IAIpB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkBnC,eAAe,IAAI,YAAY;IAIzB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAKlE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAKjE,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAcrC,OAAO,IAAI,IAAI;IAef,OAAO,IAAI,IAAI;CAYhB"}
@@ -20,8 +20,11 @@ export declare class PlaybackController {
20
20
  private lastFrameTime;
21
21
  private syncIntervalId;
22
22
  private renderIntervalId;
23
+ private isWaiting;
23
24
  private onTimeUpdate?;
24
25
  private onEnded?;
26
+ private onWaiting?;
27
+ private onPlaying?;
25
28
  constructor(options?: PlaybackControllerOptions);
26
29
  setVideoTrack(track: InputVideoTrack | null): Promise<void>;
27
30
  /**
@@ -54,6 +57,9 @@ export declare class PlaybackController {
54
57
  getPlaybackRate(): number;
55
58
  setTimeUpdateCallback(callback: (time: number) => void): void;
56
59
  setEndedCallback(callback: () => void): void;
60
+ setWaitingCallback(callback: () => void): void;
61
+ setPlayingCallback(callback: () => void): void;
62
+ isBuffering(): boolean;
57
63
  screenshot(options?: {
58
64
  format?: 'png' | 'jpeg' | 'webp';
59
65
  quality?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/playback/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/playback/controller.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,14 @@
1
- import { type InputVideoTrack, type VideoSample, type WrappedCanvas } from 'mediabunny';
1
+ import { CanvasSink, type InputVideoTrack, type VideoSample, type WrappedCanvas } from 'mediabunny';
2
2
  import type { RendererType } from './renderers';
3
+ /** @internal */
4
+ interface PrefetchedVideoData {
5
+ canvasSink: CanvasSink;
6
+ firstFrame: WrappedCanvas | null;
7
+ }
8
+ /** @internal */
9
+ export declare function registerPrefetchedVideoData(track: InputVideoTrack, data: PrefetchedVideoData): void;
10
+ /** @internal */
11
+ export declare function consumePrefetchedVideoData(track: InputVideoTrack): PrefetchedVideoData | undefined;
3
12
  export interface VideoRendererOptions {
4
13
  canvas?: HTMLCanvasElement | OffscreenCanvas;
5
14
  width?: number;
@@ -43,7 +52,10 @@ export declare class VideoRenderer {
43
52
  setCanvas(canvas: HTMLCanvasElement | OffscreenCanvas): Promise<void>;
44
53
  setVideoTrack(track: InputVideoTrack): Promise<void>;
45
54
  seek(timestamp: number): Promise<void>;
46
- updateFrame(currentTime: number): boolean;
55
+ updateFrame(currentTime: number): {
56
+ frameUpdated: boolean;
57
+ isStarving: boolean;
58
+ };
47
59
  private fetchNextFrame;
48
60
  private renderFrame;
49
61
  getFrameAt(timestamp: number): Promise<WrappedCanvas | null>;
@@ -67,7 +79,13 @@ export declare class VideoRenderer {
67
79
  setRendererChangeCallback(callback: (type: RendererType) => void): void;
68
80
  setRendererFallbackCallback(callback: (from: RendererType, to: RendererType) => void): void;
69
81
  static getSupportedRenderers(): RendererType[];
82
+ /**
83
+ * Clears iterators to stop any in-flight async operations.
84
+ * Called before disposing the input to prevent accessing disposed resources.
85
+ */
86
+ clearIterators(): Promise<void>;
70
87
  private disposeVideoResources;
71
88
  dispose(): void;
72
89
  }
90
+ export {};
73
91
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/playback/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/playback/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACrH,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3D,gBAAgB;AAChB,UAAU,mBAAmB;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;CAClC;AAKD,gBAAgB;AAChB,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAEnG;AAED,gBAAgB;AAChB,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,GAAG,SAAS,CAMlG;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,aAAa,CAA6D;IAClF,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,gBAAgB,CAAC,CAA+B;IACxD,OAAO,CAAC,kBAAkB,CAAC,CAAiD;IAC5E,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,GAAE,oBAAyB;IAkC9C,OAAO,CAAC,mBAAmB;IA0F3B,OAAO,CAAC,4BAA4B;IAoCpC,OAAO,CAAC,6BAA6B;IA0BrC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,yBAAyB;YAWnB,kBAAkB;IAwD1B,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCrE,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgJpD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0D5C,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE;YA+BlE,cAAc;IAsB5B,OAAO,CAAC,WAAW;IAkDb,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAK5D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK3D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAiBjG,UAAU,CACd,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IA8BvB,eAAe,IAAI,aAAa,GAAG,IAAI;IAIvC,YAAY,IAAI,aAAa,GAAG,IAAI;IAIpC,eAAe,IAAI,YAAY;IAI/B,SAAS,IAAI,iBAAiB,GAAG,eAAe,GAAG,IAAI;IAIvD;;;;OAIG;IACH,sBAAsB,IAAI,IAAI;IAaxB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqGvD,yBAAyB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAUvE,2BAA2B,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAI3F,MAAM,CAAC,qBAAqB,IAAI,YAAY,EAAE;IAI9C;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBvB,qBAAqB;IAoBnC,OAAO,IAAI,IAAI;CA0BhB"}
@@ -0,0 +1,36 @@
1
+ import type { TypedEventEmitter } from '../events/types';
2
+ import type { SourceManager } from '../sources/manager';
3
+ import type { StateStore } from '../state/types';
4
+ import type { MediaSource, PlayerEventMap, Playlist, PlaylistItem, PlaylistMode } from '../types';
5
+ interface PlaylistItemConfig {
6
+ mediaSource: MediaSource;
7
+ title?: string;
8
+ poster?: string;
9
+ }
10
+ export declare class PlaylistManager {
11
+ private store;
12
+ private emitter;
13
+ private switchSource?;
14
+ private sourceManager?;
15
+ constructor(store: StateStore, emitter: TypedEventEmitter<PlayerEventMap>, switchSource?: (item: PlaylistItem, autoplay: boolean) => Promise<void>, sourceManager?: SourceManager);
16
+ loadPlaylist(items: Array<MediaSource | PlaylistItemConfig>, options?: {
17
+ autoplay?: boolean;
18
+ startTime?: number;
19
+ }): Promise<void>;
20
+ addToPlaylist(itemInput: MediaSource | PlaylistItemConfig, index?: number): void;
21
+ removeFromPlaylist(index: number): Promise<void>;
22
+ clearPlaylist(): void;
23
+ next(): Promise<void>;
24
+ prev(): Promise<void>;
25
+ jumpTo(index: number): Promise<void>;
26
+ setMode(mode: PlaylistMode): void;
27
+ private switchTo;
28
+ private createPlaylistItem;
29
+ get playlist(): Playlist;
30
+ get currentIndex(): number | null;
31
+ get currentItem(): PlaylistItem | null;
32
+ get mode(): PlaylistMode;
33
+ dispose(): void;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/playlist/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AASlG,UAAU,kBAAkB;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,YAAY,CAAC,CAA2D;IAChF,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAGpC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAC1C,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EACvE,aAAa,CAAC,EAAE,aAAa;IAQzB,YAAY,CAChB,KAAK,EAAE,KAAK,CAAC,WAAW,GAAG,kBAAkB,CAAC,EAC9C,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACvD,OAAO,CAAC,IAAI,CAAC;IAqChB,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,kBAAkB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAO1E,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BtD,aAAa,IAAI,IAAI;IAQf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1C,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;YAUnB,QAAQ;IAoCtB,OAAO,CAAC,kBAAkB;IAwB1B,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAED,IAAI,WAAW,IAAI,YAAY,GAAG,IAAI,CAGrC;IAED,IAAI,IAAI,IAAI,YAAY,CAEvB;IAED,OAAO,IAAI,IAAI;CAShB"}
@@ -1,12 +1,33 @@
1
+ import { CanvasSink, type InputAudioTrack, type InputVideoTrack, type WrappedCanvas } from 'mediabunny';
1
2
  import type { MediaSource } from '../types';
2
3
  import type { SourceInfo, SourceManagerOptions } from './types';
4
+ /** @internal */
5
+ export interface PrefetchedTrackData {
6
+ videoTrack: InputVideoTrack | null;
7
+ audioTrack: InputAudioTrack | null;
8
+ canvasSink: CanvasSink | null;
9
+ firstFrame: WrappedCanvas | null;
10
+ duration: number;
11
+ }
3
12
  export declare class SourceManager {
4
13
  private currentSource;
14
+ private queuedSources;
5
15
  private options;
6
16
  constructor(options?: SourceManagerOptions);
7
- createSource(media: MediaSource): Promise<SourceInfo>;
17
+ createSource(media: MediaSource, id?: string): Promise<SourceInfo>;
8
18
  getCurrentSource(): SourceInfo | null;
19
+ getQueuedSource(id: string): SourceInfo | null;
20
+ preloadSource(media: MediaSource, id: string): Promise<void>;
21
+ private prefetchTrackData;
22
+ /**
23
+ * Gets a prefetched source by id, promotes it to current, and returns it.
24
+ * Returns null if no prefetched source exists for the id.
25
+ */
26
+ promoteQueuedSource(id: string): SourceInfo | null;
9
27
  getOriginalSource(): MediaSource | null;
28
+ disposeCurrent(): void;
29
+ disposeQueued(id: string): void;
30
+ disposeAll(): void;
10
31
  dispose(): void;
11
32
  static isStreamingSource(media: MediaSource): boolean;
12
33
  static isLocalSource(media: MediaSource): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/sources/manager.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEhE,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,OAAO,CAAuB;gBAE1B,OAAO,GAAE,oBAAyB;IAQxC,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAsD3D,gBAAgB,IAAI,UAAU,GAAG,IAAI;IAIrC,iBAAiB,IAAI,WAAW,GAAG,IAAI;IAIvC,OAAO,IAAI,IAAI;IAKf,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAIrD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAUjD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;WAanC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5E,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC;CA4B7F"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/sources/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,UAAU,EAGV,KAAK,eAAe,EACpB,KAAK,eAAe,EAIpB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEhE,gBAAgB;AAChB,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,OAAO,CAAuB;gBAE1B,OAAO,GAAE,oBAAyB;IAOxC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA8DxE,gBAAgB,IAAI,UAAU,GAAG,IAAI;IAIrC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAIxC,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAkBpD,iBAAiB;IAwC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiBlD,iBAAiB,IAAI,WAAW,GAAG,IAAI;IAIvC,cAAc,IAAI,IAAI;IAOtB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ/B,UAAU,IAAI,IAAI;IAQlB,OAAO,IAAI,IAAI;IAKf,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAIrD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAUjD,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;WAanC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5E,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC;CA4B7F"}
@@ -0,0 +1,41 @@
1
+ import type { MediaSource } from '../types';
2
+ export interface SourceOptions {
3
+ title?: string;
4
+ poster?: string;
5
+ }
6
+ export interface SourceItem {
7
+ mediaSource: MediaSource;
8
+ title?: string;
9
+ poster?: string;
10
+ }
11
+ /**
12
+ * Utility class for creating media sources with metadata
13
+ * Matches the documentation examples and provides a fluent API
14
+ */
15
+ export declare class Source {
16
+ /**
17
+ * Create a source from a URL string or URL object
18
+ */
19
+ static fromUrl(url: string | URL, options?: SourceOptions): SourceItem;
20
+ /**
21
+ * Create a source from a File object
22
+ */
23
+ static fromFile(file: File, options?: SourceOptions): SourceItem;
24
+ /**
25
+ * Create a source from a Blob
26
+ */
27
+ static fromBlob(blob: Blob, options?: SourceOptions): SourceItem;
28
+ /**
29
+ * Create a source from an ArrayBuffer
30
+ */
31
+ static fromBuffer(buffer: ArrayBuffer, options?: SourceOptions): SourceItem;
32
+ /**
33
+ * Create a source from a Uint8Array
34
+ */
35
+ static fromUint8Array(array: Uint8Array, options?: SourceOptions): SourceItem;
36
+ /**
37
+ * Create a source from a ReadableStream
38
+ */
39
+ static fromStream(stream: ReadableStream<Uint8Array>, options?: SourceOptions): SourceItem;
40
+ }
41
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/sources/source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,aAAkB,GAAG,UAAU;IAQ1E;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,aAAkB,GAAG,UAAU;IAQpE;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,aAAkB,GAAG,UAAU;IAQpE;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB,GAAG,UAAU;IAQ/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,UAAU;IAQjF;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,OAAO,GAAE,aAAkB,GAAG,UAAU;CAO/F"}
@@ -10,5 +10,7 @@ export interface SourceInfo {
10
10
  input: Input | null;
11
11
  type: 'blob' | 'buffer' | 'url' | 'file' | 'stream';
12
12
  originalSource: MediaSource;
13
+ /** @internal */
14
+ prefetchedData?: unknown;
13
15
  }
14
16
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpD,cAAc,EAAE,WAAW,CAAC;CAC7B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpD,cAAc,EAAE,WAAW,CAAC;IAC5B,gBAAgB;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B"}
@@ -1,4 +1,4 @@
1
- import type { AudioTrackInfo, MediaInfo, PlayerStateData, SubtitleTrackInfo, TimeRange, VideoTrackInfo } from '../types';
1
+ import type { AudioTrackInfo, MediaInfo, PlayerStateData, Playlist, PlaylistItem, PlaylistMode, SubtitleTrackInfo, TimeRange, VideoTrackInfo } from '../types';
2
2
  import type { StateListener, StateStore, StateUnsubscribe } from './types';
3
3
  export declare class Store implements StateStore {
4
4
  private state;
@@ -24,9 +24,16 @@ export declare class Store implements StateStore {
24
24
  updateSelectedTracks(type: 'video' | 'audio' | 'subtitle', trackId: string | null): void;
25
25
  updateError(error: Error | null): void;
26
26
  updateSeekingState(seeking: boolean): void;
27
+ updateWaitingState(waiting: boolean): void;
27
28
  updateReadyState(canPlay: boolean, canPlayThrough: boolean): void;
28
29
  updateEndedState(ended: boolean): void;
29
30
  updateLoadingState(): void;
30
31
  updateRendererType(rendererType: import('../types').RendererType): void;
32
+ updatePlaylist(playlist: Playlist, currentIndex?: number | null): void;
33
+ updateCurrentPlaylistIndex(index: number): void;
34
+ updatePlaylistMode(mode: PlaylistMode): void;
35
+ addToPlaylist(item: PlaylistItem, insertIndex?: number): void;
36
+ removeFromPlaylist(removeIndex: number): void;
37
+ clearPlaylist(): void;
31
38
  }
32
39
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAET,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3E,qBAAa,KAAM,YAAW,UAAU;IACtC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAgC;;IAMtD,OAAO,CAAC,eAAe;IAgCvB,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC;IAIrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASjD,OAAO,CAAC,YAAY;IAqBpB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB;IAWpD,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,eAAe;IAYvB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAU3C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI;IAI3C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIlD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9C,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIlD,YAAY,CACV,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,cAAc,CAAC,EAAE,iBAAiB,EAAE,GACnC,IAAI;IAQP,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAcxF,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAOtC,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAQjE,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAStC,kBAAkB,IAAI,IAAI;IAU1B,kBAAkB,CAAC,YAAY,EAAE,OAAO,UAAU,EAAE,YAAY,GAAG,IAAI;CAGxE"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAET,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,cAAc,EACf,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3E,qBAAa,KAAM,YAAW,UAAU;IACtC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAgC;;IAMtD,OAAO,CAAC,eAAe;IAoCvB,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC;IAIrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IASjD,OAAO,CAAC,YAAY;IAqBpB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB;IAWpD,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,eAAe;IAYvB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAU3C,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAItC,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI;IAI3C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIlD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI9C,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAIlD,YAAY,CACV,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,cAAc,CAAC,EAAE,iBAAiB,EAAE,GACnC,IAAI;IAQP,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAcxF,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAOtC,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAQjE,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAStC,kBAAkB,IAAI,IAAI;IAU1B,kBAAkB,CAAC,YAAY,EAAE,OAAO,UAAU,EAAE,YAAY,GAAG,IAAI;IAIvE,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAI5E,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/C,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI5C,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAiB7D,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAmC7C,aAAa,IAAI,IAAI;CAgBtB"}
@@ -1,4 +1,4 @@
1
- import type { PlayerStateData } from '../types';
1
+ import type { PlayerStateData, Playlist, PlaylistItem, PlaylistMode } from '../types';
2
2
  export type StateListener = (state: PlayerStateData) => void;
3
3
  export type StateUnsubscribe = () => void;
4
4
  export interface StateStore {
@@ -6,5 +6,11 @@ export interface StateStore {
6
6
  setState(updates: Partial<PlayerStateData>): void;
7
7
  subscribe(listener: StateListener): StateUnsubscribe;
8
8
  reset(): void;
9
+ updatePlaylist(playlist: Playlist, currentIndex?: number | null): void;
10
+ updateCurrentPlaylistIndex(index: number): void;
11
+ updatePlaylistMode(mode: PlaylistMode): void;
12
+ addToPlaylist(item: PlaylistItem, insertIndex?: number): void;
13
+ removeFromPlaylist(removeIndex: number): void;
14
+ clearPlaylist(): void;
9
15
  }
10
16
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAAC;IACrD,KAAK,IAAI,IAAI,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEtF,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAC7D,MAAM,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,QAAQ,IAAI,QAAQ,CAAC,eAAe,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,gBAAgB,CAAC;IACrD,KAAK,IAAI,IAAI,CAAC;IAEd,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACvE,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7C,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,aAAa,IAAI,IAAI,CAAC;CACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tracks/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAElF,OAAO,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAExH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,iBAAiB,CAAuD;IAChF,OAAO,CAAC,sBAAsB,CAAgE;IAC9F,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,aAAa,CAAC,CAAuC;IAEvD,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;YAK/B,UAAU;IAuFxB,cAAc,IAAI,cAAc,EAAE;IAIlC,cAAc,IAAI,cAAc,EAAE;IAIlC,iBAAiB,IAAI,iBAAiB,EAAE;IAIxC,qBAAqB,IAAI,eAAe,GAAG,IAAI;IAK/C,qBAAqB,IAAI,eAAe,GAAG,IAAI;IAK/C,yBAAyB,IAAI,cAAc,GAAG,IAAI;IAKlD,yBAAyB,IAAI,cAAc,GAAG,IAAI;IAKlD,4BAA4B,IAAI,iBAAiB,GAAG,IAAI;IAKxD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BjD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BjD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BpD,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,IAAI;IAKpF,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO1C,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAO7F,OAAO,CAAC,qBAAqB;IAoC7B,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAI5E,QAAQ,IAAI,iBAAiB;IAW7B,oBAAoB,IAAI,eAAe,GAAG,IAAI;IAO9C,oBAAoB,IAAI,eAAe,GAAG,IAAI;IAO9C,QAAQ,IAAI,OAAO;IAInB,QAAQ,IAAI,OAAO;IAInB,YAAY,IAAI,OAAO;IAIvB,OAAO,IAAI,IAAI;IAgBT,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC7F,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAiCpG"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/tracks/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAElF,OAAO,KAAK,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAExH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,iBAAiB,CAAuD;IAChF,OAAO,CAAC,sBAAsB,CAAgE;IAC9F,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,aAAa,CAAC,CAAuC;IAEvD,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;YAa/B,UAAU;IAuFxB,cAAc,IAAI,cAAc,EAAE;IAIlC,cAAc,IAAI,cAAc,EAAE;IAIlC,iBAAiB,IAAI,iBAAiB,EAAE;IAIxC,qBAAqB,IAAI,eAAe,GAAG,IAAI;IAK/C,qBAAqB,IAAI,eAAe,GAAG,IAAI;IAK/C,yBAAyB,IAAI,cAAc,GAAG,IAAI;IAKlD,yBAAyB,IAAI,cAAc,GAAG,IAAI;IAKlD,4BAA4B,IAAI,iBAAiB,GAAG,IAAI;IAKxD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BjD,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BjD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IA4BpD,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,IAAI;IAKpF,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO1C,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAO7F,OAAO,CAAC,qBAAqB;IAoC7B,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAI5E,QAAQ,IAAI,iBAAiB;IAW7B,oBAAoB,IAAI,eAAe,GAAG,IAAI;IAO9C,oBAAoB,IAAI,eAAe,GAAG,IAAI;IAO9C,QAAQ,IAAI,OAAO;IAInB,QAAQ,IAAI,OAAO;IAInB,YAAY,IAAI,OAAO;IAIvB,OAAO,IAAI,IAAI;IAgBT,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC7F,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAiCpG"}
package/dist/types.d.ts CHANGED
@@ -67,6 +67,7 @@ export interface PlayerStateData {
67
67
  paused: boolean;
68
68
  ended: boolean;
69
69
  seeking: boolean;
70
+ waiting: boolean;
70
71
  error: Error | null;
71
72
  mediaInfo: MediaInfo | null;
72
73
  videoTracks: VideoTrackInfo[];
@@ -79,6 +80,9 @@ export interface PlayerStateData {
79
80
  canPlayThrough: boolean;
80
81
  isLive: boolean;
81
82
  rendererType: RendererType;
83
+ playlist: Playlist;
84
+ currentPlaylistIndex: number | null;
85
+ playlistMode: PlaylistMode;
82
86
  }
83
87
  export interface TimeRange {
84
88
  start: number;
@@ -91,6 +95,9 @@ export interface SeekOptions {
91
95
  export interface LoadOptions {
92
96
  autoplay?: boolean;
93
97
  startTime?: number;
98
+ replacePlaylist?: boolean;
99
+ /** Playlist item id for prefetch optimization */
100
+ playlistItemId?: string;
94
101
  }
95
102
  export interface ScreenshotOptions {
96
103
  format?: 'png' | 'jpeg' | 'webp';
@@ -165,6 +172,26 @@ export type PlayerEventMap = {
165
172
  from: RendererType;
166
173
  to: RendererType;
167
174
  };
175
+ playlistchange: {
176
+ playlist: Playlist;
177
+ };
178
+ playlistitemchange: {
179
+ index: number;
180
+ item: PlaylistItem;
181
+ previousIndex?: number;
182
+ };
183
+ playlistend: undefined;
184
+ playlistadd: {
185
+ item: PlaylistItem;
186
+ index: number;
187
+ };
188
+ playlistremove: {
189
+ index: number;
190
+ };
191
+ playlistitemerror: {
192
+ index: number;
193
+ error: Error;
194
+ };
168
195
  };
169
196
  export type PlayerEventListener<K extends keyof PlayerEventMap> = (event: PlayerEventMap[K]) => void;
170
197
  export interface Subscription {
@@ -193,4 +220,14 @@ export interface CuePoint {
193
220
  type: string;
194
221
  data?: unknown;
195
222
  }
223
+ export type PlaylistMode = 'sequential' | 'manual' | 'repeat' | 'repeat-one' | null;
224
+ export interface PlaylistItem {
225
+ id: string;
226
+ mediaSource: MediaSource;
227
+ title?: string;
228
+ poster?: string;
229
+ savedPosition: number | null;
230
+ duration: number | null;
231
+ }
232
+ export type Playlist = PlaylistItem[];
196
233
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mediafox/core",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "description": "Framework-agnostic media player library powered by MediaBunny",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -35,7 +35,7 @@
35
35
  "@webgpu/types": "^0.1.65"
36
36
  },
37
37
  "peerDependencies": {
38
- "mediabunny": "^1.23.0",
38
+ "mediabunny": "^1.25.3",
39
39
  "typescript": ">=5.0.0"
40
40
  },
41
41
  "keywords": [