@scarlett-player/core 0.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.
Files changed (59) hide show
  1. package/dist/error-handler.d.ts.map +1 -0
  2. package/dist/error-handler.js +300 -0
  3. package/dist/error-handler.js.map +1 -0
  4. package/dist/events/event-bus.d.ts.map +1 -0
  5. package/dist/events/event-bus.js +407 -0
  6. package/dist/events/event-bus.js.map +1 -0
  7. package/dist/index.cjs +2 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.ts +16 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +2271 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/logger.d.ts.map +1 -0
  14. package/dist/logger.js +272 -0
  15. package/dist/logger.js.map +1 -0
  16. package/dist/plugin-api.d.ts +147 -0
  17. package/dist/plugin-api.d.ts.map +1 -0
  18. package/dist/plugin-api.js +160 -0
  19. package/dist/plugin-api.js.map +1 -0
  20. package/dist/plugin-manager.d.ts +52 -0
  21. package/dist/plugin-manager.d.ts.map +1 -0
  22. package/dist/plugin-manager.js +224 -0
  23. package/dist/plugin-manager.js.map +1 -0
  24. package/dist/scarlett-player.d.ts +404 -0
  25. package/dist/scarlett-player.d.ts.map +1 -0
  26. package/dist/scarlett-player.js +769 -0
  27. package/dist/scarlett-player.js.map +1 -0
  28. package/dist/state/computed.d.ts.map +1 -0
  29. package/dist/state/computed.js +134 -0
  30. package/dist/state/computed.js.map +1 -0
  31. package/dist/state/effect.d.ts.map +1 -0
  32. package/dist/state/effect.js +77 -0
  33. package/dist/state/effect.js.map +1 -0
  34. package/dist/state/index.d.ts.map +1 -0
  35. package/dist/state/index.js +9 -0
  36. package/dist/state/index.js.map +1 -0
  37. package/dist/state/signal.d.ts.map +1 -0
  38. package/dist/state/signal.js +126 -0
  39. package/dist/state/signal.js.map +1 -0
  40. package/dist/state/state-manager.d.ts.map +1 -0
  41. package/dist/state/state-manager.js +334 -0
  42. package/dist/state/state-manager.js.map +1 -0
  43. package/dist/types/events.d.ts +323 -0
  44. package/dist/types/events.d.ts.map +1 -0
  45. package/dist/types/events.js +7 -0
  46. package/dist/types/events.js.map +1 -0
  47. package/dist/types/index.d.ts +9 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +7 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/types/plugin.d.ts +141 -0
  52. package/dist/types/plugin.d.ts.map +1 -0
  53. package/dist/types/plugin.js +8 -0
  54. package/dist/types/plugin.js.map +1 -0
  55. package/dist/types/state.d.ts +232 -0
  56. package/dist/types/state.d.ts.map +1 -0
  57. package/dist/types/state.js +8 -0
  58. package/dist/types/state.js.map +1 -0
  59. package/package.json +64 -0
@@ -0,0 +1,404 @@
1
+ /**
2
+ * ScarlettPlayer - Main player class integrating all core systems.
3
+ *
4
+ * Provides the public API for video playback, plugin management,
5
+ * state access, and event handling.
6
+ *
7
+ * Target size: ~1-1.5KB
8
+ */
9
+ import type { Plugin } from './types/plugin';
10
+ import type { EventName, EventHandler as EventHandlerFn } from './types/events';
11
+ import type { StateStore } from './types/state';
12
+ /**
13
+ * Player configuration options.
14
+ */
15
+ export interface PlayerOptions {
16
+ /** HTML container element or CSS selector */
17
+ container: HTMLElement | string;
18
+ /** Initial source URL */
19
+ src?: string;
20
+ /** Poster image URL */
21
+ poster?: string;
22
+ /** Initial log level (default: 'warn') */
23
+ logLevel?: 'debug' | 'info' | 'warn' | 'error';
24
+ /** Autoplay (default: false) */
25
+ autoplay?: boolean;
26
+ /** Loop playback (default: false) */
27
+ loop?: boolean;
28
+ /** Initial volume 0-1 (default: 1.0) */
29
+ volume?: number;
30
+ /** Start muted (default: false) */
31
+ muted?: boolean;
32
+ /** Plugins to register on initialization */
33
+ plugins?: Plugin[];
34
+ }
35
+ /**
36
+ * Quality level interface for proxy methods.
37
+ */
38
+ export interface QualityLevel {
39
+ index: number;
40
+ width: number;
41
+ height: number;
42
+ bitrate: number;
43
+ label: string;
44
+ }
45
+ /**
46
+ * ScarlettPlayer - Lightweight, plugin-based video player.
47
+ *
48
+ * Features:
49
+ * - Plugin-based architecture
50
+ * - Reactive state management
51
+ * - Type-safe event system
52
+ * - Automatic provider selection
53
+ * - Live/DVR support (TSP)
54
+ * - Chapter/marker support (TSP)
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * const player = new ScarlettPlayer({
59
+ * container: document.getElementById('player'),
60
+ * plugins: [hlsPlugin, controlsPlugin],
61
+ * });
62
+ *
63
+ * // Load and play
64
+ * await player.load('video.m3u8');
65
+ * player.play();
66
+ *
67
+ * // Listen to events
68
+ * player.on('playback:play', () => {
69
+ * console.log('Playing!');
70
+ * });
71
+ *
72
+ * // Access state
73
+ * console.log(player.playing, player.currentTime);
74
+ *
75
+ * // Cleanup
76
+ * player.destroy();
77
+ * ```
78
+ */
79
+ export declare class ScarlettPlayer {
80
+ /** Player container element */
81
+ readonly container: HTMLElement;
82
+ /** Event bus */
83
+ private eventBus;
84
+ /** State manager */
85
+ private stateManager;
86
+ /** Logger */
87
+ private logger;
88
+ /** Error handler */
89
+ private errorHandler;
90
+ /** Plugin manager */
91
+ private pluginManager;
92
+ /** Current media provider plugin */
93
+ private _currentProvider;
94
+ /** Player destroyed flag */
95
+ private destroyed;
96
+ /** Seeking while playing flag */
97
+ private seekingWhilePlaying;
98
+ /** Seek resume timeout */
99
+ private seekResumeTimeout;
100
+ /** Initial source URL */
101
+ private initialSrc?;
102
+ /**
103
+ * Create a new ScarlettPlayer.
104
+ *
105
+ * @param options - Player configuration
106
+ */
107
+ constructor(options: PlayerOptions);
108
+ /**
109
+ * Initialize the player asynchronously.
110
+ * Initializes non-provider plugins and loads initial source if provided.
111
+ */
112
+ init(): Promise<void>;
113
+ /**
114
+ * Load a media source.
115
+ *
116
+ * Selects appropriate provider plugin and loads the source.
117
+ *
118
+ * @param source - Media source URL
119
+ * @returns Promise that resolves when source is loaded
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * await player.load('video.m3u8');
124
+ * ```
125
+ */
126
+ load(source: string): Promise<void>;
127
+ /**
128
+ * Start playback.
129
+ *
130
+ * @returns Promise that resolves when playback starts
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * await player.play();
135
+ * ```
136
+ */
137
+ play(): Promise<void>;
138
+ /**
139
+ * Pause playback.
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * player.pause();
144
+ * ```
145
+ */
146
+ pause(): void;
147
+ /**
148
+ * Seek to a specific time.
149
+ *
150
+ * @param time - Time in seconds
151
+ *
152
+ * @example
153
+ * ```ts
154
+ * player.seek(30); // Seek to 30 seconds
155
+ * ```
156
+ */
157
+ seek(time: number): void;
158
+ /**
159
+ * Set volume.
160
+ *
161
+ * @param volume - Volume 0-1
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * player.setVolume(0.5); // 50% volume
166
+ * ```
167
+ */
168
+ setVolume(volume: number): void;
169
+ /**
170
+ * Set muted state.
171
+ *
172
+ * @param muted - Mute flag
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * player.setMuted(true);
177
+ * ```
178
+ */
179
+ setMuted(muted: boolean): void;
180
+ /**
181
+ * Set playback rate.
182
+ *
183
+ * @param rate - Playback rate (e.g., 1.0 = normal, 2.0 = 2x speed)
184
+ *
185
+ * @example
186
+ * ```ts
187
+ * player.setPlaybackRate(1.5); // 1.5x speed
188
+ * ```
189
+ */
190
+ setPlaybackRate(rate: number): void;
191
+ /**
192
+ * Set autoplay state.
193
+ *
194
+ * When enabled, videos will automatically play after loading.
195
+ *
196
+ * @param autoplay - Autoplay flag
197
+ *
198
+ * @example
199
+ * ```ts
200
+ * player.setAutoplay(true);
201
+ * await player.load('video.mp4'); // Will auto-play
202
+ * ```
203
+ */
204
+ setAutoplay(autoplay: boolean): void;
205
+ /**
206
+ * Subscribe to an event.
207
+ *
208
+ * @param event - Event name
209
+ * @param handler - Event handler
210
+ * @returns Unsubscribe function
211
+ *
212
+ * @example
213
+ * ```ts
214
+ * const unsub = player.on('playback:play', () => {
215
+ * console.log('Playing!');
216
+ * });
217
+ *
218
+ * // Later: unsubscribe
219
+ * unsub();
220
+ * ```
221
+ */
222
+ on<T extends EventName>(event: T, handler: EventHandlerFn<T>): () => void;
223
+ /**
224
+ * Subscribe to an event once.
225
+ *
226
+ * @param event - Event name
227
+ * @param handler - Event handler
228
+ * @returns Unsubscribe function
229
+ *
230
+ * @example
231
+ * ```ts
232
+ * player.once('player:ready', () => {
233
+ * console.log('Player ready!');
234
+ * });
235
+ * ```
236
+ */
237
+ once<T extends EventName>(event: T, handler: EventHandlerFn<T>): () => void;
238
+ /**
239
+ * Get a plugin by name.
240
+ *
241
+ * @param name - Plugin name
242
+ * @returns Plugin instance or null
243
+ *
244
+ * @example
245
+ * ```ts
246
+ * const hls = player.getPlugin('hls-plugin');
247
+ * ```
248
+ */
249
+ getPlugin<T extends Plugin>(name: string): T | null;
250
+ /**
251
+ * Register a plugin.
252
+ *
253
+ * @param plugin - Plugin to register
254
+ *
255
+ * @example
256
+ * ```ts
257
+ * player.registerPlugin(myPlugin);
258
+ * ```
259
+ */
260
+ registerPlugin(plugin: Plugin): void;
261
+ /**
262
+ * Get current state snapshot.
263
+ *
264
+ * @returns Readonly state snapshot
265
+ *
266
+ * @example
267
+ * ```ts
268
+ * const state = player.getState();
269
+ * console.log(state.playing, state.currentTime);
270
+ * ```
271
+ */
272
+ getState(): Readonly<StateStore>;
273
+ /**
274
+ * Get available quality levels from the current provider.
275
+ * @returns Array of quality levels or empty array if not available
276
+ */
277
+ getQualities(): QualityLevel[];
278
+ /**
279
+ * Set quality level (-1 for auto).
280
+ * @param index - Quality level index
281
+ */
282
+ setQuality(index: number): void;
283
+ /**
284
+ * Get current quality level index (-1 = auto).
285
+ */
286
+ getCurrentQuality(): number;
287
+ /**
288
+ * Request fullscreen mode.
289
+ */
290
+ requestFullscreen(): Promise<void>;
291
+ /**
292
+ * Exit fullscreen mode.
293
+ */
294
+ exitFullscreen(): Promise<void>;
295
+ /**
296
+ * Toggle fullscreen mode.
297
+ */
298
+ toggleFullscreen(): Promise<void>;
299
+ /**
300
+ * Request AirPlay (proxied to airplay plugin).
301
+ */
302
+ requestAirPlay(): void;
303
+ /**
304
+ * Request Chromecast session (proxied to chromecast plugin).
305
+ */
306
+ requestChromecast(): Promise<void>;
307
+ /**
308
+ * Stop casting (AirPlay or Chromecast).
309
+ */
310
+ stopCasting(): void;
311
+ /**
312
+ * Seek to live edge (for live streams).
313
+ */
314
+ seekToLive(): void;
315
+ /**
316
+ * Destroy the player and cleanup all resources.
317
+ *
318
+ * @example
319
+ * ```ts
320
+ * player.destroy();
321
+ * ```
322
+ */
323
+ destroy(): void;
324
+ /**
325
+ * Get playing state.
326
+ */
327
+ get playing(): boolean;
328
+ /**
329
+ * Get paused state.
330
+ */
331
+ get paused(): boolean;
332
+ /**
333
+ * Get current time in seconds.
334
+ */
335
+ get currentTime(): number;
336
+ /**
337
+ * Get duration in seconds.
338
+ */
339
+ get duration(): number;
340
+ /**
341
+ * Get volume (0-1).
342
+ */
343
+ get volume(): number;
344
+ /**
345
+ * Get muted state.
346
+ */
347
+ get muted(): boolean;
348
+ /**
349
+ * Get playback rate.
350
+ */
351
+ get playbackRate(): number;
352
+ /**
353
+ * Get buffered amount (0-1).
354
+ */
355
+ get bufferedAmount(): number;
356
+ /**
357
+ * Get current provider plugin.
358
+ */
359
+ get currentProvider(): Plugin | null;
360
+ /**
361
+ * Get fullscreen state.
362
+ */
363
+ get fullscreen(): boolean;
364
+ /**
365
+ * Get live stream state.
366
+ */
367
+ get live(): boolean;
368
+ /**
369
+ * Get autoplay state.
370
+ */
371
+ get autoplay(): boolean;
372
+ /**
373
+ * Check if player is destroyed.
374
+ * @private
375
+ */
376
+ private checkDestroyed;
377
+ /**
378
+ * Detect MIME type from source URL.
379
+ * @private
380
+ */
381
+ private detectMimeType;
382
+ }
383
+ /**
384
+ * Create a ScarlettPlayer instance and initialize it.
385
+ *
386
+ * Convenience factory function that creates and initializes
387
+ * the player in a single async call.
388
+ *
389
+ * @param options - Player configuration
390
+ * @returns Promise resolving to initialized player
391
+ *
392
+ * @example
393
+ * ```ts
394
+ * const player = await createPlayer({
395
+ * container: '#player',
396
+ * src: 'video.m3u8',
397
+ * plugins: [hlsPlugin()],
398
+ * });
399
+ *
400
+ * player.play();
401
+ * ```
402
+ */
403
+ export declare function createPlayer(options: PlayerOptions): Promise<ScarlettPlayer>;
404
+ //# sourceMappingURL=scarlett-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scarlett-player.d.ts","sourceRoot":"","sources":["../src/scarlett-player.ts"],"names":[],"mappings":"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"}