@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.
- package/README.md +326 -0
- package/dist/core/player-core.d.ts +27 -0
- package/dist/core/player-core.d.ts.map +1 -0
- package/dist/core/state-facade.d.ts +25 -0
- package/dist/core/state-facade.d.ts.map +1 -0
- package/dist/core/track-switcher.d.ts +29 -0
- package/dist/core/track-switcher.d.ts.map +1 -0
- package/dist/events/emitter.d.ts +18 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/types.d.ts +16 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/mediafox.d.ts +72 -0
- package/dist/mediafox.d.ts.map +1 -0
- package/dist/playback/audio.d.ts +47 -0
- package/dist/playback/audio.d.ts.map +1 -0
- package/dist/playback/controller.d.ts +70 -0
- package/dist/playback/controller.d.ts.map +1 -0
- package/dist/playback/renderer.d.ts +53 -0
- package/dist/playback/renderer.d.ts.map +1 -0
- package/dist/playback/renderers/canvas2d.d.ts +16 -0
- package/dist/playback/renderers/canvas2d.d.ts.map +1 -0
- package/dist/playback/renderers/factory.d.ts +25 -0
- package/dist/playback/renderers/factory.d.ts.map +1 -0
- package/dist/playback/renderers/index.d.ts +6 -0
- package/dist/playback/renderers/index.d.ts.map +1 -0
- package/dist/playback/renderers/types.d.ts +40 -0
- package/dist/playback/renderers/types.d.ts.map +1 -0
- package/dist/playback/renderers/webgl.d.ts +32 -0
- package/dist/playback/renderers/webgl.d.ts.map +1 -0
- package/dist/playback/renderers/webgpu.d.ts +32 -0
- package/dist/playback/renderers/webgpu.d.ts.map +1 -0
- package/dist/sources/manager.d.ts +17 -0
- package/dist/sources/manager.d.ts.map +1 -0
- package/dist/sources/types.d.ts +14 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/state/store.d.ts +32 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/types.d.ts +10 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/tracks/manager.d.ts +45 -0
- package/dist/tracks/manager.d.ts.map +1 -0
- package/dist/tracks/types.d.ts +26 -0
- package/dist/tracks/types.d.ts.map +1 -0
- package/dist/types.d.ts +196 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/async-lock.d.ts +5 -0
- package/dist/utils/async-lock.d.ts.map +1 -0
- package/dist/utils/dispose.d.ts +11 -0
- package/dist/utils/dispose.d.ts.map +1 -0
- package/dist/utils/equal.d.ts +2 -0
- package/dist/utils/equal.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +30 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/time.d.ts +83 -0
- package/dist/utils/time.d.ts.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|