@mediafox/core 1.0.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.
Files changed (61) hide show
  1. package/README.md +326 -0
  2. package/dist/core/player-core.d.ts +27 -0
  3. package/dist/core/player-core.d.ts.map +1 -0
  4. package/dist/core/state-facade.d.ts +25 -0
  5. package/dist/core/state-facade.d.ts.map +1 -0
  6. package/dist/core/track-switcher.d.ts +29 -0
  7. package/dist/core/track-switcher.d.ts.map +1 -0
  8. package/dist/events/emitter.d.ts +18 -0
  9. package/dist/events/emitter.d.ts.map +1 -0
  10. package/dist/events/types.d.ts +16 -0
  11. package/dist/events/types.d.ts.map +1 -0
  12. package/dist/index.d.ts +22 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +40 -0
  15. package/dist/mediafox.d.ts +72 -0
  16. package/dist/mediafox.d.ts.map +1 -0
  17. package/dist/playback/audio.d.ts +47 -0
  18. package/dist/playback/audio.d.ts.map +1 -0
  19. package/dist/playback/controller.d.ts +70 -0
  20. package/dist/playback/controller.d.ts.map +1 -0
  21. package/dist/playback/renderer.d.ts +53 -0
  22. package/dist/playback/renderer.d.ts.map +1 -0
  23. package/dist/playback/renderers/canvas2d.d.ts +16 -0
  24. package/dist/playback/renderers/canvas2d.d.ts.map +1 -0
  25. package/dist/playback/renderers/factory.d.ts +25 -0
  26. package/dist/playback/renderers/factory.d.ts.map +1 -0
  27. package/dist/playback/renderers/index.d.ts +6 -0
  28. package/dist/playback/renderers/index.d.ts.map +1 -0
  29. package/dist/playback/renderers/types.d.ts +40 -0
  30. package/dist/playback/renderers/types.d.ts.map +1 -0
  31. package/dist/playback/renderers/webgl.d.ts +32 -0
  32. package/dist/playback/renderers/webgl.d.ts.map +1 -0
  33. package/dist/playback/renderers/webgpu.d.ts +32 -0
  34. package/dist/playback/renderers/webgpu.d.ts.map +1 -0
  35. package/dist/sources/manager.d.ts +17 -0
  36. package/dist/sources/manager.d.ts.map +1 -0
  37. package/dist/sources/types.d.ts +14 -0
  38. package/dist/sources/types.d.ts.map +1 -0
  39. package/dist/state/store.d.ts +32 -0
  40. package/dist/state/store.d.ts.map +1 -0
  41. package/dist/state/types.d.ts +10 -0
  42. package/dist/state/types.d.ts.map +1 -0
  43. package/dist/tracks/manager.d.ts +45 -0
  44. package/dist/tracks/manager.d.ts.map +1 -0
  45. package/dist/tracks/types.d.ts +26 -0
  46. package/dist/tracks/types.d.ts.map +1 -0
  47. package/dist/types.d.ts +196 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/utils/async-lock.d.ts +5 -0
  50. package/dist/utils/async-lock.d.ts.map +1 -0
  51. package/dist/utils/dispose.d.ts +11 -0
  52. package/dist/utils/dispose.d.ts.map +1 -0
  53. package/dist/utils/equal.d.ts +2 -0
  54. package/dist/utils/equal.d.ts.map +1 -0
  55. package/dist/utils/errors.d.ts +30 -0
  56. package/dist/utils/errors.d.ts.map +1 -0
  57. package/dist/utils/logger.d.ts +23 -0
  58. package/dist/utils/logger.d.ts.map +1 -0
  59. package/dist/utils/time.d.ts +83 -0
  60. package/dist/utils/time.d.ts.map +1 -0
  61. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,326 @@
1
+ # MediaFox
2
+
3
+ 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
+
5
+ ## Features
6
+
7
+ - **Framework Agnostic** - Works with React, Vue, Angular, or vanilla JavaScript
8
+ - **Complete Media Support** - Video, audio, and subtitle tracks
9
+ - **Performance First** - Efficient frame buffering and audio scheduling
10
+ - **Small & Tree-shakable** - Only include what you use
11
+ - **UI Flexibility** - You control the interface completely
12
+ - **TypeScript Native** - Full type safety and excellent IDE support
13
+ - **Advanced Features** - Screenshot, frame extraction, quality switching
14
+ - **Plugin System** - Extend functionality easily
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ bun add @mediafox/core mediabunny
20
+ # or
21
+ npm install @mediafox/core mediabunny
22
+ # or
23
+ yarn add @mediafox/core mediabunny
24
+ ```
25
+
26
+ > **Note:** Mediabunny is a peer dependency. You need to install it alongside @mediafox/core.
27
+
28
+ ## Quick Start
29
+
30
+ ```typescript
31
+ import { MediaFox } from '@mediafox/core';
32
+
33
+ // Create player instance
34
+ const player = new MediaFox({
35
+ renderTarget: document.querySelector('canvas'),
36
+ volume: 0.8
37
+ });
38
+
39
+ // Load media
40
+ await player.load(videoFile); // File, Blob, URL, or ArrayBuffer
41
+
42
+ // Control playback
43
+ await player.play();
44
+ player.pause();
45
+ player.currentTime = 30; // Seek to 30 seconds
46
+ player.volume = 0.5;
47
+
48
+ // Subscribe to state changes
49
+ player.subscribe(state => {
50
+ console.log(`Time: ${state.currentTime}/${state.duration}`);
51
+ console.log(`State: ${state.state}`);
52
+ });
53
+
54
+ // Handle events
55
+ player.on('play', () => console.log('Playing'));
56
+ player.on('pause', () => console.log('Paused'));
57
+ player.on('timeupdate', ({ currentTime }) => {
58
+ updateProgressBar(currentTime);
59
+ });
60
+ ```
61
+
62
+ ## Framework Packages
63
+
64
+ For React applications, use the dedicated React package:
65
+
66
+ ```bash
67
+ npm install @mediafox/react @mediafox/core mediabunny
68
+ ```
69
+
70
+ ```tsx
71
+ import { useMediaFox } from '@mediafox/react';
72
+
73
+ function VideoPlayer({ src }: { src: File | string }) {
74
+ const canvasRef = useRef<HTMLCanvasElement>(null);
75
+ const { player, state, play, pause } = useMediaFox({
76
+ renderTarget: canvasRef.current,
77
+ onError: (error) => console.error(error)
78
+ });
79
+
80
+ // ...
81
+ }
82
+ ```
83
+
84
+ ## Framework Integration Examples
85
+
86
+ ### React (using core package)
87
+
88
+ ```tsx
89
+ import { useEffect, useRef, useState } from 'react';
90
+ import { MediaFox, type PlayerStateData } from '@mediafox/core';
91
+
92
+ function VideoPlayer({ src }: { src: File | string }) {
93
+ const canvasRef = useRef<HTMLCanvasElement>(null);
94
+ const playerRef = useRef<MediaFox>();
95
+ const [state, setState] = useState<PlayerStateData>();
96
+
97
+ useEffect(() => {
98
+ const player = new MediaFox({
99
+ renderTarget: canvasRef.current!
100
+ });
101
+
102
+ playerRef.current = player;
103
+
104
+ // Subscribe to state changes
105
+ const subscription = player.subscribe(setState);
106
+
107
+ // Load media
108
+ player.load(src);
109
+
110
+ return () => {
111
+ subscription.unsubscribe();
112
+ player.dispose();
113
+ };
114
+ }, [src]);
115
+
116
+ return (
117
+ <div>
118
+ <canvas ref={canvasRef} />
119
+ <div>
120
+ <button onClick={() => playerRef.current?.play()}>Play</button>
121
+ <button onClick={() => playerRef.current?.pause()}>Pause</button>
122
+ <div>{state?.currentTime} / {state?.duration}</div>
123
+ </div>
124
+ </div>
125
+ );
126
+ }
127
+ ```
128
+
129
+ ### Vue 3
130
+
131
+ ```vue
132
+ <template>
133
+ <div>
134
+ <canvas ref="canvasRef" />
135
+ <div>
136
+ <button @click="play">Play</button>
137
+ <button @click="pause">Pause</button>
138
+ <div>{{ currentTime }} / {{ duration }}</div>
139
+ </div>
140
+ </div>
141
+ </template>
142
+
143
+ <script setup lang="ts">
144
+ import { ref, onMounted, onUnmounted } from 'vue';
145
+ import { MediaFox } from '@mediafox/core';
146
+
147
+ const props = defineProps<{ src: File | string }>();
148
+
149
+ const canvasRef = ref<HTMLCanvasElement>();
150
+ const player = ref<MediaFox>();
151
+ const currentTime = ref(0);
152
+ const duration = ref(0);
153
+
154
+ onMounted(async () => {
155
+ player.value = new MediaFox({
156
+ renderTarget: canvasRef.value
157
+ });
158
+
159
+ player.value.subscribe(state => {
160
+ currentTime.value = state.currentTime;
161
+ duration.value = state.duration;
162
+ });
163
+
164
+ await player.value.load(props.src);
165
+ });
166
+
167
+ onUnmounted(() => {
168
+ player.value?.dispose();
169
+ });
170
+
171
+ const play = () => player.value?.play();
172
+ const pause = () => player.value?.pause();
173
+ </script>
174
+ ```
175
+
176
+ ## Advanced Usage
177
+
178
+ ### Track Management
179
+
180
+ ```typescript
181
+ // Get available tracks
182
+ const videoTracks = player.getVideoTracks();
183
+ const audioTracks = player.getAudioTracks();
184
+
185
+ // Switch tracks
186
+ await player.selectVideoTrack(videoTracks[0].id);
187
+ await player.selectAudioTrack(audioTracks[1].id);
188
+
189
+ // Track info
190
+ videoTracks.forEach(track => {
191
+ console.log(`${track.codec} ${track.width}x${track.height} @${track.frameRate}fps`);
192
+ });
193
+ ```
194
+
195
+ ### Screenshot & Frame Extraction
196
+
197
+ ```typescript
198
+ // Take screenshot at current time
199
+ const blob = await player.screenshot({
200
+ format: 'png',
201
+ quality: 0.9
202
+ });
203
+
204
+ // Extract specific frame
205
+ player.currentTime = 10.5;
206
+ const frameBlob = await player.screenshot();
207
+ ```
208
+
209
+ ### Event Handling
210
+
211
+ ```typescript
212
+ // All events are strongly typed
213
+ player.on('loadedmetadata', (info) => {
214
+ console.log(`Duration: ${info.duration}`);
215
+ console.log(`Format: ${info.format}`);
216
+ console.log(`Has video: ${info.hasVideo}`);
217
+ console.log(`Has audio: ${info.hasAudio}`);
218
+ });
219
+
220
+ player.on('error', (error) => {
221
+ console.error('Playback error:', error);
222
+ });
223
+
224
+ player.on('trackchange', ({ type, trackId }) => {
225
+ console.log(`${type} track changed to ${trackId}`);
226
+ });
227
+ ```
228
+
229
+ ### Custom Rendering
230
+
231
+ ```typescript
232
+ // Use your own canvas
233
+ const canvas = document.createElement('canvas');
234
+ player.setRenderTarget(canvas);
235
+
236
+ // Or use OffscreenCanvas for worker rendering
237
+ const offscreen = canvas.transferControlToOffscreen();
238
+ player.setRenderTarget(offscreen);
239
+ ```
240
+
241
+ ## API Reference
242
+
243
+ ### Constructor Options
244
+
245
+ ```typescript
246
+ interface PlayerOptions {
247
+ renderTarget?: HTMLCanvasElement | OffscreenCanvas;
248
+ audioContext?: AudioContext;
249
+ volume?: number;
250
+ muted?: boolean;
251
+ playbackRate?: number;
252
+ autoplay?: boolean;
253
+ preload?: 'none' | 'metadata' | 'auto';
254
+ crossOrigin?: string;
255
+ maxCacheSize?: number;
256
+ }
257
+ ```
258
+
259
+ ### Main Methods
260
+
261
+ - `load(source: MediaSource, options?: LoadOptions): Promise<void>` - Load media file
262
+ - `play(): Promise<void>` - Start playback
263
+ - `pause(): void` - Pause playback
264
+ - `seek(time: number): Promise<void>` - Seek to time
265
+ - `stop(): void` - Stop playback and reset
266
+ - `screenshot(options?: ScreenshotOptions): Promise<Blob>` - Take screenshot
267
+ - `dispose(): void` - Clean up resources
268
+ - `destroy(): void` - Destroy player completely
269
+
270
+ ### Properties
271
+
272
+ - `currentTime: number` - Current playback position
273
+ - `duration: number` - Total duration (readonly)
274
+ - `volume: number` - Volume level (0-1)
275
+ - `muted: boolean` - Mute state
276
+ - `playbackRate: number` - Playback speed
277
+ - `paused: boolean` - Pause state (readonly)
278
+ - `ended: boolean` - Ended state (readonly)
279
+ - `seeking: boolean` - Seeking state (readonly)
280
+
281
+ ### State Management
282
+
283
+ ```typescript
284
+ // Subscribe to all state changes
285
+ const subscription = player.subscribe(state => {
286
+ // state contains all player state
287
+ });
288
+
289
+ // Get current state
290
+ const state = player.getState();
291
+
292
+ // Unsubscribe
293
+ subscription.unsubscribe();
294
+ ```
295
+
296
+ ### Events
297
+
298
+ All events follow the pattern:
299
+ ```typescript
300
+ player.on(eventName, callback);
301
+ player.once(eventName, callback);
302
+ player.off(eventName, callback);
303
+ ```
304
+
305
+ Available events:
306
+ - `loadstart`, `loadedmetadata`, `loadeddata`, `canplay`, `canplaythrough`
307
+ - `play`, `pause`, `playing`, `ended`
308
+ - `timeupdate`, `durationchange`, `volumechange`, `ratechange`
309
+ - `seeking`, `seeked`, `waiting`, `progress`
310
+ - `error`, `trackchange`, `qualitychange`, `resize`
311
+
312
+ ## Browser Support
313
+
314
+ MediaFox requires a modern browser with support for:
315
+ - WebCodecs API
316
+ - Web Audio API
317
+ - Canvas API
318
+ - ES2022+
319
+
320
+ ## License
321
+
322
+ MIT
323
+
324
+ ## Credits
325
+
326
+ Powered by [Mediabunny](https://github.com/Vanilagy/mediabunny) - the powerful media processing library for the web.
@@ -0,0 +1,27 @@
1
+ import type { PlaybackController } from '../playback/controller';
2
+ import type { SourceManager } from '../sources/manager';
3
+ import type { TrackManager } from '../tracks/manager';
4
+ import type { LoadOptions, MediaSource, PlayerEventMap } from '../types';
5
+ import type { StateFacade } from './state-facade';
6
+ import type { TrackSwitcher } from './track-switcher';
7
+ type EmitFn = <K extends keyof PlayerEventMap>(event: K, data: PlayerEventMap[K]) => void;
8
+ export interface PlayerCoreDeps {
9
+ state: StateFacade;
10
+ sourceManager: SourceManager;
11
+ trackManager: TrackManager;
12
+ playbackController: PlaybackController;
13
+ trackSwitcher: TrackSwitcher;
14
+ emit: EmitFn;
15
+ }
16
+ export declare class PlayerCore {
17
+ private readonly deps;
18
+ constructor(deps: PlayerCoreDeps);
19
+ load(source: MediaSource, options?: LoadOptions): Promise<void>;
20
+ play(): Promise<void>;
21
+ pause(): void;
22
+ seek(time: number): Promise<void>;
23
+ stop(): Promise<void>;
24
+ private handleError;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=player-core.d.ts.map
@@ -0,0 +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;IAmFnE,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"}
@@ -0,0 +1,25 @@
1
+ import type { Store } from '../state/store';
2
+ import type { AudioTrackInfo, MediaInfo, PlayerStateData, SubtitleTrackInfo, VideoTrackInfo } from '../types';
3
+ export declare class StateFacade {
4
+ private readonly store;
5
+ constructor(store: Store);
6
+ getState(): Readonly<PlayerStateData>;
7
+ subscribe(listener: (state: PlayerStateData) => void): () => void;
8
+ reset(): void;
9
+ applyInitial(volume: number, muted: boolean, playbackRate: number): void;
10
+ updateLoadingState(): void;
11
+ updateReadyState(canPlay: boolean, canPlayThrough: boolean): void;
12
+ updatePlaybackState(playing: boolean): void;
13
+ updateSeekingState(seeking: boolean): void;
14
+ updateEndedState(ended: boolean): void;
15
+ updateTime(currentTime: number): void;
16
+ updateDuration(duration: number): void;
17
+ updateVolume(volume: number, muted: boolean): void;
18
+ updatePlaybackRate(playbackRate: number): void;
19
+ updateMediaInfo(mediaInfo: MediaInfo | null): void;
20
+ updateTracks(videoTracks?: VideoTrackInfo[], audioTracks?: AudioTrackInfo[], subtitleTracks?: SubtitleTrackInfo[]): void;
21
+ updateSelectedTracks(type: 'video' | 'audio' | 'subtitle', trackId: string | null): void;
22
+ updateError(error: Error | null): void;
23
+ updateRendererType(rendererType: import('../types').RendererType): void;
24
+ }
25
+ //# sourceMappingURL=state-facade.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,29 @@
1
+ import type { InputAudioTrack, InputVideoTrack } from 'mediabunny';
2
+ import type { PlaybackController } from '../playback/controller';
3
+ import type { SourceManager } from '../sources/manager';
4
+ import type { Store } from '../state/store';
5
+ import type { TrackManager } from '../tracks/manager';
6
+ import type { PlayerEventMap } from '../types';
7
+ type EmitFn = <K extends keyof PlayerEventMap>(event: K, data: PlayerEventMap[K]) => void;
8
+ export interface TrackSwitcherDeps {
9
+ sourceManager: SourceManager;
10
+ trackManager: TrackManager;
11
+ playbackController: PlaybackController;
12
+ emit: EmitFn;
13
+ store: Store;
14
+ getCurrentInput: () => import('mediabunny').Input | null;
15
+ }
16
+ export declare class TrackSwitcher {
17
+ private deps;
18
+ private locks;
19
+ constructor(deps: TrackSwitcherDeps);
20
+ setupInitialTracks(videoTrack: InputVideoTrack | null, audioTrack: InputAudioTrack | null): Promise<{
21
+ videoSupported: boolean;
22
+ audioSupported: boolean;
23
+ warningMessage: string;
24
+ }>;
25
+ selectVideoTrack(trackManager: TrackManager, trackId: string | null): Promise<void>;
26
+ selectAudioTrack(trackManager: TrackManager, trackId: string | null): Promise<void>;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=track-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-switcher.d.ts","sourceRoot":"","sources":["../../src/core/track-switcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C,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,iBAAiB;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,MAAM,OAAO,YAAY,EAAE,KAAK,GAAG,IAAI,CAAC;CAC1D;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,KAAK,CAAmB;gBAEpB,IAAI,EAAE,iBAAiB;IAI7B,kBAAkB,CACtB,UAAU,EAAE,eAAe,GAAG,IAAI,EAClC,UAAU,EAAE,eAAe,GAAG,IAAI,GACjC,OAAO,CAAC;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IA0ClF,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnF,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B1F"}
@@ -0,0 +1,18 @@
1
+ import type { EventEmitterOptions, TypedEventEmitter, UnsubscribeFn } from './types';
2
+ export declare class EventEmitter<EventMap extends Record<string, unknown>> implements TypedEventEmitter<EventMap> {
3
+ private events;
4
+ private maxListeners;
5
+ private captureRejections;
6
+ constructor(options?: EventEmitterOptions);
7
+ on<K extends keyof EventMap>(event: K, listener: (data: EventMap[K]) => void): UnsubscribeFn;
8
+ once<K extends keyof EventMap>(event: K, listener: (data: EventMap[K]) => void): UnsubscribeFn;
9
+ off<K extends keyof EventMap>(event: K, listener?: (data: EventMap[K]) => void): void;
10
+ emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void;
11
+ removeAllListeners<K extends keyof EventMap>(event?: K): void;
12
+ setMaxListeners(n: number): void;
13
+ getMaxListeners(): number;
14
+ listeners<K extends keyof EventMap>(event: K): Array<(data: EventMap[K]) => void>;
15
+ listenerCount<K extends keyof EventMap>(event: K): number;
16
+ eventNames(): Array<keyof EventMap>;
17
+ }
18
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErF,qBAAa,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,iBAAiB,CAAC,QAAQ,CAAC;IACxG,OAAO,CAAC,MAAM,CAAiF;IAC/F,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAU;gBAEvB,OAAO,GAAE,mBAAwB;IAK7C,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa;IAwB5F,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa;IAS9F,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAYrF,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IA2BjE,kBAAkB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAQ7D,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIhC,eAAe,IAAI,MAAM;IAIzB,SAAS,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAKjF,aAAa,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM;IAKzD,UAAU,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC;CAGpC"}
@@ -0,0 +1,16 @@
1
+ export type EventHandler<T = unknown> = (event: T) => void;
2
+ export interface EventEmitterOptions {
3
+ maxListeners?: number;
4
+ captureRejections?: boolean;
5
+ }
6
+ export type UnsubscribeFn = () => void;
7
+ export interface TypedEventEmitter<EventMap> {
8
+ on<K extends keyof EventMap>(event: K, listener: (data: EventMap[K]) => void): UnsubscribeFn;
9
+ once<K extends keyof EventMap>(event: K, listener: (data: EventMap[K]) => void): UnsubscribeFn;
10
+ off<K extends keyof EventMap>(event: K, listener?: (data: EventMap[K]) => void): void;
11
+ emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void;
12
+ removeAllListeners(event?: keyof EventMap): void;
13
+ listenerCount(event: keyof EventMap): number;
14
+ listeners<K extends keyof EventMap>(event: K): Array<(data: EventMap[K]) => void>;
15
+ }
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC;AAEvC,MAAM,WAAW,iBAAiB,CAAC,QAAQ;IACzC,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa,CAAC;IAE7F,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,aAAa,CAAC;IAE/F,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAEtF,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAElE,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,QAAQ,GAAG,IAAI,CAAC;IAEjD,aAAa,CAAC,KAAK,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC;IAE7C,SAAS,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;CACnF"}
@@ -0,0 +1,22 @@
1
+ export type { AttachedImage, AudioCodec, AudioSample, EncodedPacket, InputFormat, MetadataTags, OutputFormat, Quality, SubtitleCodec, VideoCodec, VideoSample, } from 'mediabunny';
2
+ export { EventEmitter } from './events/emitter';
3
+ export type { TypedEventEmitter, UnsubscribeFn } from './events/types';
4
+ export { MediaFox } from './mediafox';
5
+ export { AudioManager } from './playback/audio';
6
+ export { PlaybackController } from './playback/controller';
7
+ export { VideoRenderer } from './playback/renderer';
8
+ export type { IRenderer, RendererCreationResult } from './playback/renderers';
9
+ export { RendererFactory } from './playback/renderers';
10
+ export { SourceManager } from './sources/manager';
11
+ export type { SourceInfo, SourceManagerOptions } from './sources/types';
12
+ export { Store } from './state/store';
13
+ export type { StateListener, StateStore, StateUnsubscribe } from './state/types';
14
+ export { TrackManager } from './tracks/manager';
15
+ 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';
17
+ export { ErrorCode, MediaFoxError, wrapError, } from './utils/errors';
18
+ export { clamp, findBufferedRange, formatTime, frameToTime, mergeTimeRanges, parseTime, timeRangesOverlap, timeToFrame, totalBufferedDuration, } from './utils/time';
19
+ export declare const VERSION = "0.1.0";
20
+ import { MediaFox } from './mediafox';
21
+ export default MediaFox;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}