strataplayer 1.2.8 → 1.2.10
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/dist/core/AudioEngine.d.ts +14 -0
- package/dist/core/EventBus.d.ts +9 -0
- package/dist/core/NanoStore.d.ts +10 -0
- package/dist/core/StrataCore.d.ts +278 -0
- package/dist/dash.cjs.js.map +1 -1
- package/dist/dash.d.ts +1 -332
- package/dist/dash.es.js.map +1 -1
- package/dist/hls.cjs.js.map +1 -1
- package/dist/hls.d.ts +1 -330
- package/dist/hls.es.js.map +1 -1
- package/dist/index.d.ts +1 -345
- package/dist/lib.d.ts +11 -0
- package/dist/mpegts.cjs.js.map +1 -1
- package/dist/mpegts.d.ts +1 -331
- package/dist/mpegts.es.js.map +1 -1
- package/dist/plugins/DashPlugin.d.ts +12 -0
- package/dist/plugins/HlsPlugin.d.ts +10 -0
- package/dist/plugins/MpegtsPlugin.d.ts +11 -0
- package/dist/plugins/WebTorrentPlugin.d.ts +17 -0
- package/dist/ui/Icons.d.ts +50 -0
- package/dist/ui/StrataPlayer.d.ts +23 -0
- package/dist/ui/components/ContextMenu.d.ts +12 -0
- package/dist/ui/components/Menu.d.ts +16 -0
- package/dist/ui/components/NotificationContainer.d.ts +5 -0
- package/dist/ui/components/SettingsPrimitives.d.ts +4 -0
- package/dist/ui/components/SubtitleMenu.d.ts +1 -0
- package/dist/ui/components/SubtitleOverlay.d.ts +6 -0
- package/dist/ui/components/VideoInfo.d.ts +6 -0
- package/dist/ui/hooks/useTransition.d.ts +4 -0
- package/dist/utils/playerUtils.d.ts +11 -0
- package/dist/webtorrent.cjs.js.map +1 -1
- package/dist/webtorrent.d.ts +1 -337
- package/dist/webtorrent.es.js.map +1 -1
- package/package.json +20 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class AudioEngine {
|
|
2
|
+
private context;
|
|
3
|
+
private source;
|
|
4
|
+
private gainNode;
|
|
5
|
+
private video;
|
|
6
|
+
private isInitialized;
|
|
7
|
+
constructor(video: HTMLVideoElement);
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the AudioContext. Must be called after user interaction.
|
|
10
|
+
*/
|
|
11
|
+
init(): void;
|
|
12
|
+
setGain(value: number): void;
|
|
13
|
+
destroy(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type EventCallback<T = any> = (data: T) => void;
|
|
2
|
+
export declare class EventBus {
|
|
3
|
+
private events;
|
|
4
|
+
constructor();
|
|
5
|
+
on<T>(event: string, callback: EventCallback<T>): () => void;
|
|
6
|
+
off<T>(event: string, callback: EventCallback<T>): void;
|
|
7
|
+
emit<T>(event: string, data?: T): void;
|
|
8
|
+
destroy(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type Listener<T> = (state: T, prevState: T) => void;
|
|
2
|
+
export declare class NanoStore<T> {
|
|
3
|
+
private state;
|
|
4
|
+
private listeners;
|
|
5
|
+
constructor(initialState: T);
|
|
6
|
+
get(): T;
|
|
7
|
+
setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;
|
|
8
|
+
subscribe(listener: Listener<T>): () => void;
|
|
9
|
+
destroy(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { EventBus, EventCallback } from './EventBus';
|
|
2
|
+
import { NanoStore } from './NanoStore';
|
|
3
|
+
import { default as React } from 'react';
|
|
4
|
+
|
|
5
|
+
export interface Notification {
|
|
6
|
+
id: string;
|
|
7
|
+
message: string;
|
|
8
|
+
type: 'info' | 'success' | 'warning' | 'error' | 'loading';
|
|
9
|
+
duration?: number;
|
|
10
|
+
progress?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface TextTrackConfig {
|
|
13
|
+
src: string;
|
|
14
|
+
label: string;
|
|
15
|
+
srcLang?: string;
|
|
16
|
+
default?: boolean;
|
|
17
|
+
kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
|
|
18
|
+
}
|
|
19
|
+
export interface SubtitleSettings {
|
|
20
|
+
useNative: boolean;
|
|
21
|
+
fixCapitalization: boolean;
|
|
22
|
+
backgroundOpacity: number;
|
|
23
|
+
backgroundBlur: boolean;
|
|
24
|
+
backgroundBlurAmount: number;
|
|
25
|
+
textSize: number;
|
|
26
|
+
textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';
|
|
27
|
+
isBold: boolean;
|
|
28
|
+
textColor: string;
|
|
29
|
+
verticalOffset: number;
|
|
30
|
+
}
|
|
31
|
+
export declare const DEFAULT_SUBTITLE_SETTINGS: SubtitleSettings;
|
|
32
|
+
export type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';
|
|
33
|
+
export interface PlayerSource {
|
|
34
|
+
url: string;
|
|
35
|
+
type?: 'hls' | 'mp4' | 'webm' | 'dash' | 'mpegts' | 'webtorrent' | string;
|
|
36
|
+
name?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface Highlight {
|
|
39
|
+
time: number;
|
|
40
|
+
text: string;
|
|
41
|
+
}
|
|
42
|
+
export interface LayerConfig {
|
|
43
|
+
name?: string;
|
|
44
|
+
html: string | React.ReactNode;
|
|
45
|
+
style?: React.CSSProperties;
|
|
46
|
+
className?: string;
|
|
47
|
+
click?: () => void;
|
|
48
|
+
mounted?: (element: HTMLElement) => void;
|
|
49
|
+
}
|
|
50
|
+
export interface ContextMenuItem {
|
|
51
|
+
html?: string | React.ReactNode;
|
|
52
|
+
disabled?: boolean;
|
|
53
|
+
icon?: string | React.ReactNode;
|
|
54
|
+
onClick?: (close: () => void) => void;
|
|
55
|
+
click?: (close: () => void) => void;
|
|
56
|
+
checked?: boolean;
|
|
57
|
+
showBorder?: boolean;
|
|
58
|
+
separator?: boolean;
|
|
59
|
+
isLabel?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface ControlItem {
|
|
62
|
+
id?: string;
|
|
63
|
+
position: 'left' | 'right' | 'center';
|
|
64
|
+
index: number;
|
|
65
|
+
html?: string | React.ReactNode;
|
|
66
|
+
tooltip?: string;
|
|
67
|
+
onClick?: (core: StrataCore) => void;
|
|
68
|
+
click?: (core: StrataCore) => void;
|
|
69
|
+
className?: string;
|
|
70
|
+
style?: React.CSSProperties;
|
|
71
|
+
isBuiltIn?: boolean;
|
|
72
|
+
builtInId?: string;
|
|
73
|
+
}
|
|
74
|
+
export interface SettingItem {
|
|
75
|
+
id?: string;
|
|
76
|
+
html: string | React.ReactNode;
|
|
77
|
+
icon?: string | React.ReactNode;
|
|
78
|
+
tooltip?: string;
|
|
79
|
+
switch?: boolean;
|
|
80
|
+
onSwitch?: (item: SettingItem) => boolean | void;
|
|
81
|
+
onClick?: () => void;
|
|
82
|
+
click?: () => void;
|
|
83
|
+
isDefault?: boolean;
|
|
84
|
+
}
|
|
85
|
+
export interface PlayerState {
|
|
86
|
+
isPlaying: boolean;
|
|
87
|
+
isBuffering: boolean;
|
|
88
|
+
isLive: boolean;
|
|
89
|
+
currentTime: number;
|
|
90
|
+
duration: number;
|
|
91
|
+
buffered: {
|
|
92
|
+
start: number;
|
|
93
|
+
end: number;
|
|
94
|
+
}[];
|
|
95
|
+
volume: number;
|
|
96
|
+
isMuted: boolean;
|
|
97
|
+
audioGain: number;
|
|
98
|
+
playbackRate: number;
|
|
99
|
+
qualityLevels: {
|
|
100
|
+
height: number;
|
|
101
|
+
bitrate: number;
|
|
102
|
+
index: number;
|
|
103
|
+
}[];
|
|
104
|
+
currentQuality: number;
|
|
105
|
+
audioTracks: {
|
|
106
|
+
label: string;
|
|
107
|
+
language: string;
|
|
108
|
+
index: number;
|
|
109
|
+
}[];
|
|
110
|
+
currentAudioTrack: number;
|
|
111
|
+
error: string | null;
|
|
112
|
+
isFullscreen: boolean;
|
|
113
|
+
isPip: boolean;
|
|
114
|
+
subtitleTracks: {
|
|
115
|
+
label: string;
|
|
116
|
+
language: string;
|
|
117
|
+
index: number;
|
|
118
|
+
}[];
|
|
119
|
+
currentSubtitle: number;
|
|
120
|
+
subtitleOffset: number;
|
|
121
|
+
subtitleSettings: SubtitleSettings;
|
|
122
|
+
activeCues: string[];
|
|
123
|
+
viewMode: 'normal' | 'theater' | 'pip';
|
|
124
|
+
notifications: Notification[];
|
|
125
|
+
iconSize: 'small' | 'medium' | 'large';
|
|
126
|
+
themeColor: string;
|
|
127
|
+
theme: PlayerTheme;
|
|
128
|
+
sources: PlayerSource[];
|
|
129
|
+
currentSourceIndex: number;
|
|
130
|
+
isLocked: boolean;
|
|
131
|
+
flipState: {
|
|
132
|
+
horizontal: boolean;
|
|
133
|
+
vertical: boolean;
|
|
134
|
+
};
|
|
135
|
+
aspectRatio: string;
|
|
136
|
+
isAutoSized: boolean;
|
|
137
|
+
isLooping: boolean;
|
|
138
|
+
controlsVisible: boolean;
|
|
139
|
+
}
|
|
140
|
+
export interface StrataConfig {
|
|
141
|
+
container?: string;
|
|
142
|
+
id?: string;
|
|
143
|
+
volume?: number;
|
|
144
|
+
muted?: boolean;
|
|
145
|
+
playbackRate?: number;
|
|
146
|
+
audioGain?: number;
|
|
147
|
+
loop?: boolean;
|
|
148
|
+
playsInline?: boolean;
|
|
149
|
+
isLive?: boolean;
|
|
150
|
+
poster?: string;
|
|
151
|
+
fetchTimeout?: number;
|
|
152
|
+
theme?: PlayerTheme;
|
|
153
|
+
themeColor?: string;
|
|
154
|
+
iconSize?: 'small' | 'medium' | 'large';
|
|
155
|
+
backdrop?: boolean;
|
|
156
|
+
autoSize?: boolean;
|
|
157
|
+
subtitleSettings?: Partial<SubtitleSettings>;
|
|
158
|
+
screenshot?: boolean;
|
|
159
|
+
setting?: boolean;
|
|
160
|
+
pip?: boolean;
|
|
161
|
+
fullscreen?: boolean;
|
|
162
|
+
fullscreenWeb?: boolean;
|
|
163
|
+
flip?: boolean;
|
|
164
|
+
aspectRatio?: boolean;
|
|
165
|
+
highlight?: Highlight[];
|
|
166
|
+
centerControls?: boolean;
|
|
167
|
+
hotKey?: boolean;
|
|
168
|
+
lock?: boolean;
|
|
169
|
+
gesture?: boolean;
|
|
170
|
+
gestureSeek?: boolean;
|
|
171
|
+
fastForward?: boolean;
|
|
172
|
+
autoOrientation?: boolean;
|
|
173
|
+
layers?: LayerConfig[];
|
|
174
|
+
contextmenu?: ContextMenuItem[];
|
|
175
|
+
controls?: ControlItem[];
|
|
176
|
+
settings?: SettingItem[];
|
|
177
|
+
useSSR?: boolean;
|
|
178
|
+
disablePersistence?: boolean;
|
|
179
|
+
}
|
|
180
|
+
export declare const DEFAULT_STATE: PlayerState;
|
|
181
|
+
export declare const getResolvedState: (config?: StrataConfig) => PlayerState;
|
|
182
|
+
export interface IPlugin {
|
|
183
|
+
name: string;
|
|
184
|
+
init(core: StrataCore): void;
|
|
185
|
+
destroy?(): void;
|
|
186
|
+
}
|
|
187
|
+
export declare class StrataCore {
|
|
188
|
+
video: HTMLVideoElement;
|
|
189
|
+
container: HTMLElement | null;
|
|
190
|
+
events: EventBus;
|
|
191
|
+
store: NanoStore<PlayerState>;
|
|
192
|
+
private plugins;
|
|
193
|
+
private audioEngine;
|
|
194
|
+
config: StrataConfig;
|
|
195
|
+
private resizeObserver;
|
|
196
|
+
private retryCount;
|
|
197
|
+
private maxRetries;
|
|
198
|
+
private retryTimer;
|
|
199
|
+
private currentSource;
|
|
200
|
+
private currentSrc;
|
|
201
|
+
private currentTracks;
|
|
202
|
+
private castInitialized;
|
|
203
|
+
private boundCueChange;
|
|
204
|
+
private boundFullscreenChange;
|
|
205
|
+
constructor(config?: StrataConfig, videoElement?: HTMLVideoElement);
|
|
206
|
+
get playing(): boolean;
|
|
207
|
+
get currentTime(): number;
|
|
208
|
+
set currentTime(val: number);
|
|
209
|
+
get duration(): number;
|
|
210
|
+
get paused(): boolean;
|
|
211
|
+
get volume(): number;
|
|
212
|
+
set volume(val: number);
|
|
213
|
+
get muted(): boolean;
|
|
214
|
+
set muted(val: boolean);
|
|
215
|
+
get playbackRate(): number;
|
|
216
|
+
set playbackRate(val: number);
|
|
217
|
+
get loop(): boolean;
|
|
218
|
+
set loop(val: boolean);
|
|
219
|
+
forward(seconds?: number): void;
|
|
220
|
+
backward(seconds?: number): void;
|
|
221
|
+
on(event: string, callback: EventCallback): () => void;
|
|
222
|
+
off(event: string, callback: EventCallback): void;
|
|
223
|
+
emit(event: string, data?: any): void;
|
|
224
|
+
private initVideoListeners;
|
|
225
|
+
private initMediaSession;
|
|
226
|
+
private updateMediaSessionMetadata;
|
|
227
|
+
private updateMediaSessionPosition;
|
|
228
|
+
triggerError(message: string, isFatal?: boolean): void;
|
|
229
|
+
private handleError;
|
|
230
|
+
private updateBuffer;
|
|
231
|
+
private updateSubtitles;
|
|
232
|
+
fetchWithRetry(url: string, retries?: number, timeout?: number): Promise<Response>;
|
|
233
|
+
attach(container: HTMLElement): void;
|
|
234
|
+
use(plugin: IPlugin): void;
|
|
235
|
+
setSources(sources: PlayerSource[], tracks?: TextTrackConfig[]): void;
|
|
236
|
+
switchSource(index: number): void;
|
|
237
|
+
load(source: PlayerSource | string, tracks?: TextTrackConfig[], isRetry?: boolean): void;
|
|
238
|
+
loadSubtitle(url: string, label?: string): void;
|
|
239
|
+
addTextTrack(file: File, label: string): void;
|
|
240
|
+
private addTextTrackInternal;
|
|
241
|
+
play(): Promise<void>;
|
|
242
|
+
pause(): void;
|
|
243
|
+
togglePlay(): void;
|
|
244
|
+
seek(time: number): void;
|
|
245
|
+
skip(seconds: number): void;
|
|
246
|
+
setVolume(vol: number): void;
|
|
247
|
+
toggleMute(): void;
|
|
248
|
+
setAudioGain(gain: number): void;
|
|
249
|
+
setQuality(index: number): void;
|
|
250
|
+
setAudioTrack(index: number): void;
|
|
251
|
+
setControlsVisible(visible: boolean): void;
|
|
252
|
+
toggleFullscreen(): Promise<void>;
|
|
253
|
+
togglePip(): void;
|
|
254
|
+
screenshot(): void;
|
|
255
|
+
toggleLock(): void;
|
|
256
|
+
toggleLoop(): void;
|
|
257
|
+
setFlip(direction: 'horizontal' | 'vertical'): void;
|
|
258
|
+
setAspectRatio(ratio: string): void;
|
|
259
|
+
private initCast;
|
|
260
|
+
requestCast(): void;
|
|
261
|
+
private loadMediaToCast;
|
|
262
|
+
private handleCueChange;
|
|
263
|
+
setSubtitle(index: number): void;
|
|
264
|
+
updateSubtitleSettings(settings: Partial<SubtitleSettings>): void;
|
|
265
|
+
resetSubtitleSettings(): void;
|
|
266
|
+
setSubtitleOffset(offset: number): void;
|
|
267
|
+
download(): Promise<void>;
|
|
268
|
+
notify(n: Omit<Notification, 'id'> & {
|
|
269
|
+
id?: string;
|
|
270
|
+
}): string;
|
|
271
|
+
removeNotification(id: string): void;
|
|
272
|
+
setAppearance(settings: {
|
|
273
|
+
iconSize?: 'small' | 'medium' | 'large';
|
|
274
|
+
themeColor?: string;
|
|
275
|
+
theme?: PlayerTheme;
|
|
276
|
+
}): void;
|
|
277
|
+
destroy(): void;
|
|
278
|
+
}
|
package/dist/dash.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dash.cjs.js","sources":["../plugins/DashPlugin.ts"],"sourcesContent":["import { StrataCore, IPlugin } from '
|
|
1
|
+
{"version":3,"file":"dash.cjs.js","sources":["../plugins/DashPlugin.ts"],"sourcesContent":["import { StrataCore, IPlugin } from 'strataplayer';\r\nimport * as DashModule from 'dashjs';\r\n\r\n// Handle environment differences where dashjs might be a default export or module export\r\nconst dashjs = (DashModule as any).default || DashModule;\r\n\r\nexport class DashPlugin implements IPlugin {\r\n name = 'DashPlugin';\r\n private player: any = null;\r\n private core: StrataCore | null = null;\r\n\r\n init(core: StrataCore) {\r\n this.core = core;\r\n\r\n // Listen for load requests\r\n this.core.events.on('load', (data: { url: string, type: string }) => {\r\n if (data.type === 'dash' || data.url.includes('.mpd')) {\r\n this.loadDash(data.url);\r\n } else {\r\n // Cleanup if we switch away from DASH\r\n if (this.player) {\r\n this.player.destroy();\r\n this.player = null;\r\n }\r\n }\r\n });\r\n\r\n // Quality Handling\r\n this.core.events.on('quality-request', (index: number) => {\r\n if (this.player) {\r\n // -1 means Auto (ABR enabled), otherwise specific index\r\n if (index === -1) {\r\n this.player.updateSettings({ streaming: { abr: { autoSwitchBitrate: { video: true } } } });\r\n } else {\r\n this.player.updateSettings({ streaming: { abr: { autoSwitchBitrate: { video: false } } } });\r\n this.player.setQualityFor('video', index);\r\n }\r\n }\r\n });\r\n\r\n // Audio Track Handling\r\n this.core.events.on('audio-track-request', (index: number) => {\r\n if (this.player) {\r\n const tracks = this.player.getTracksFor('audio');\r\n if (tracks[index]) {\r\n this.player.setCurrentTrack(tracks[index]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private loadDash(url: string) {\r\n if (this.player) {\r\n this.player.destroy();\r\n this.player = null;\r\n }\r\n\r\n try {\r\n this.player = dashjs.MediaPlayer().create();\r\n this.player.initialize(this.core!.video, url, this.core!.store.get().isPlaying);\r\n\r\n // Event Listeners\r\n this.player.on(dashjs.MediaPlayer.events.STREAM_INITIALIZED, () => {\r\n this.updateQualityLevels();\r\n this.updateAudioTracks();\r\n });\r\n\r\n this.player.on(dashjs.MediaPlayer.events.ERROR, (e: any) => {\r\n // Pass error to core with retry logic enabled (fatal=true)\r\n this.core!.triggerError(`Dash Error: ${e.error?.message || 'Unknown'}`, true);\r\n });\r\n\r\n } catch (e: any) {\r\n this.core!.triggerError(`Dash Init Failed: ${e.message}`, true);\r\n }\r\n }\r\n\r\n private updateQualityLevels() {\r\n if (!this.player) return;\r\n const bitrates = this.player.getBitrateInfoListFor('video');\r\n if (bitrates && bitrates.length) {\r\n const levels = bitrates.map((b: any, i: number) => ({\r\n height: b.height,\r\n bitrate: b.bitrate,\r\n index: i\r\n }));\r\n this.core!.store.setState({ qualityLevels: levels });\r\n }\r\n }\r\n\r\n private updateAudioTracks() {\r\n if (!this.player) return;\r\n const tracks = this.player.getTracksFor('audio');\r\n if (tracks && tracks.length) {\r\n const list = tracks.map((t: any, i: number) => ({\r\n label: t.lang || t.roles?.[0] || `Audio ${i + 1}`,\r\n language: t.lang || '',\r\n index: i\r\n }));\r\n this.core!.store.setState({ audioTracks: list });\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.player) {\r\n this.player.destroy();\r\n this.player = null;\r\n }\r\n }\r\n}"],"names":["dashjs","DashModule","DashPlugin","__publicField","core","data","index","tracks","url","_a","bitrates","levels","b","list","t"],"mappings":"wiBAIMA,EAAUC,EAAmB,SAAWA,EAEvC,MAAMC,CAA8B,CAApC,cACLC,EAAA,YAAO,cACCA,EAAA,cAAc,MACdA,EAAA,YAA0B,MAElC,KAAKC,EAAkB,CACrB,KAAK,KAAOA,EAGZ,KAAK,KAAK,OAAO,GAAG,OAASC,GAAwC,CAC/DA,EAAK,OAAS,QAAUA,EAAK,IAAI,SAAS,MAAM,EAClD,KAAK,SAASA,EAAK,GAAG,EAGlB,KAAK,SACP,KAAK,OAAO,QAAA,EACZ,KAAK,OAAS,KAGpB,CAAC,EAGD,KAAK,KAAK,OAAO,GAAG,kBAAoBC,GAAkB,CACpD,KAAK,SAEHA,IAAU,GACZ,KAAK,OAAO,eAAe,CAAE,UAAW,CAAE,IAAK,CAAE,kBAAmB,CAAE,MAAO,EAAA,CAAK,CAAE,EAAK,GAEzF,KAAK,OAAO,eAAe,CAAE,UAAW,CAAE,IAAK,CAAE,kBAAmB,CAAE,MAAO,EAAA,CAAM,CAAE,EAAK,EAC1F,KAAK,OAAO,cAAc,QAASA,CAAK,GAG9C,CAAC,EAGD,KAAK,KAAK,OAAO,GAAG,sBAAwBA,GAAkB,CAC5D,GAAI,KAAK,OAAQ,CACf,MAAMC,EAAS,KAAK,OAAO,aAAa,OAAO,EAC3CA,EAAOD,CAAK,GACd,KAAK,OAAO,gBAAgBC,EAAOD,CAAK,CAAC,CAE7C,CACF,CAAC,CACH,CAEQ,SAASE,EAAa,CACxB,KAAK,SACP,KAAK,OAAO,QAAA,EACZ,KAAK,OAAS,MAGhB,GAAI,CACF,KAAK,OAASR,EAAO,YAAA,EAAc,OAAA,EACnC,KAAK,OAAO,WAAW,KAAK,KAAM,MAAOQ,EAAK,KAAK,KAAM,MAAM,IAAA,EAAM,SAAS,EAG9E,KAAK,OAAO,GAAGR,EAAO,YAAY,OAAO,mBAAoB,IAAM,CACjE,KAAK,oBAAA,EACL,KAAK,kBAAA,CACP,CAAC,EAED,KAAK,OAAO,GAAGA,EAAO,YAAY,OAAO,MAAQ,GAAW,OAE1D,KAAK,KAAM,aAAa,iBAAeS,EAAA,EAAE,QAAF,YAAAA,EAAS,UAAW,SAAS,GAAI,EAAI,CAC9E,CAAC,CAEH,OAAS,EAAQ,CACf,KAAK,KAAM,aAAa,qBAAqB,EAAE,OAAO,GAAI,EAAI,CAChE,CACF,CAEQ,qBAAsB,CAC5B,GAAI,CAAC,KAAK,OAAQ,OAClB,MAAMC,EAAW,KAAK,OAAO,sBAAsB,OAAO,EAC1D,GAAIA,GAAYA,EAAS,OAAQ,CAC/B,MAAMC,EAASD,EAAS,IAAI,CAACE,EAAQ,KAAe,CAClD,OAAQA,EAAE,OACV,QAASA,EAAE,QACX,MAAO,CAAA,EACP,EACF,KAAK,KAAM,MAAM,SAAS,CAAE,cAAeD,EAAQ,CACrD,CACF,CAEQ,mBAAoB,CAC1B,GAAI,CAAC,KAAK,OAAQ,OAClB,MAAMJ,EAAS,KAAK,OAAO,aAAa,OAAO,EAC/C,GAAIA,GAAUA,EAAO,OAAQ,CAC3B,MAAMM,EAAON,EAAO,IAAI,CAACO,EAAQ,IAAA,OAAe,OAC9C,MAAOA,EAAE,QAAQL,EAAAK,EAAE,QAAF,YAAAL,EAAU,KAAM,SAAS,EAAI,CAAC,GAC/C,SAAUK,EAAE,MAAQ,GACpB,MAAO,CAAA,EACP,EACF,KAAK,KAAM,MAAM,SAAS,CAAE,YAAaD,EAAM,CACjD,CACF,CAEA,SAAU,CACJ,KAAK,SACP,KAAK,OAAO,QAAA,EACZ,KAAK,OAAS,KAElB,CACF"}
|
package/dist/dash.d.ts
CHANGED
|
@@ -1,332 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare interface ContextMenuItem {
|
|
4
|
-
html?: string | default_2.ReactNode;
|
|
5
|
-
disabled?: boolean;
|
|
6
|
-
icon?: string | default_2.ReactNode;
|
|
7
|
-
onClick?: (close: () => void) => void;
|
|
8
|
-
click?: (close: () => void) => void;
|
|
9
|
-
checked?: boolean;
|
|
10
|
-
showBorder?: boolean;
|
|
11
|
-
separator?: boolean;
|
|
12
|
-
isLabel?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
declare interface ControlItem {
|
|
16
|
-
id?: string;
|
|
17
|
-
position: 'left' | 'right' | 'center';
|
|
18
|
-
index: number;
|
|
19
|
-
html?: string | default_2.ReactNode;
|
|
20
|
-
tooltip?: string;
|
|
21
|
-
onClick?: (core: StrataCore) => void;
|
|
22
|
-
click?: (core: StrataCore) => void;
|
|
23
|
-
className?: string;
|
|
24
|
-
style?: default_2.CSSProperties;
|
|
25
|
-
isBuiltIn?: boolean;
|
|
26
|
-
builtInId?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export declare class DashPlugin implements IPlugin {
|
|
30
|
-
name: string;
|
|
31
|
-
private player;
|
|
32
|
-
private core;
|
|
33
|
-
init(core: StrataCore): void;
|
|
34
|
-
private loadDash;
|
|
35
|
-
private updateQualityLevels;
|
|
36
|
-
private updateAudioTracks;
|
|
37
|
-
destroy(): void;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
declare class EventBus {
|
|
41
|
-
private events;
|
|
42
|
-
constructor();
|
|
43
|
-
on<T>(event: string, callback: EventCallback<T>): () => void;
|
|
44
|
-
off<T>(event: string, callback: EventCallback<T>): void;
|
|
45
|
-
emit<T>(event: string, data?: T): void;
|
|
46
|
-
destroy(): void;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
declare type EventCallback<T = any> = (data: T) => void;
|
|
50
|
-
|
|
51
|
-
declare interface Highlight_2 {
|
|
52
|
-
time: number;
|
|
53
|
-
text: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
declare interface IPlugin {
|
|
57
|
-
name: string;
|
|
58
|
-
init(core: StrataCore): void;
|
|
59
|
-
destroy?(): void;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
declare interface LayerConfig {
|
|
63
|
-
name?: string;
|
|
64
|
-
html: string | default_2.ReactNode;
|
|
65
|
-
style?: default_2.CSSProperties;
|
|
66
|
-
className?: string;
|
|
67
|
-
click?: () => void;
|
|
68
|
-
mounted?: (element: HTMLElement) => void;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
declare type Listener<T> = (state: T, prevState: T) => void;
|
|
72
|
-
|
|
73
|
-
declare class NanoStore<T> {
|
|
74
|
-
private state;
|
|
75
|
-
private listeners;
|
|
76
|
-
constructor(initialState: T);
|
|
77
|
-
get(): T;
|
|
78
|
-
setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;
|
|
79
|
-
subscribe(listener: Listener<T>): () => void;
|
|
80
|
-
destroy(): void;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
declare interface Notification_2 {
|
|
84
|
-
id: string;
|
|
85
|
-
message: string;
|
|
86
|
-
type: 'info' | 'success' | 'warning' | 'error' | 'loading';
|
|
87
|
-
duration?: number;
|
|
88
|
-
progress?: number;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
declare interface PlayerSource {
|
|
92
|
-
url: string;
|
|
93
|
-
type?: 'hls' | 'mp4' | 'webm' | 'dash' | 'mpegts' | 'webtorrent' | string;
|
|
94
|
-
name?: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
declare interface PlayerState {
|
|
98
|
-
isPlaying: boolean;
|
|
99
|
-
isBuffering: boolean;
|
|
100
|
-
isLive: boolean;
|
|
101
|
-
currentTime: number;
|
|
102
|
-
duration: number;
|
|
103
|
-
buffered: {
|
|
104
|
-
start: number;
|
|
105
|
-
end: number;
|
|
106
|
-
}[];
|
|
107
|
-
volume: number;
|
|
108
|
-
isMuted: boolean;
|
|
109
|
-
audioGain: number;
|
|
110
|
-
playbackRate: number;
|
|
111
|
-
qualityLevels: {
|
|
112
|
-
height: number;
|
|
113
|
-
bitrate: number;
|
|
114
|
-
index: number;
|
|
115
|
-
}[];
|
|
116
|
-
currentQuality: number;
|
|
117
|
-
audioTracks: {
|
|
118
|
-
label: string;
|
|
119
|
-
language: string;
|
|
120
|
-
index: number;
|
|
121
|
-
}[];
|
|
122
|
-
currentAudioTrack: number;
|
|
123
|
-
error: string | null;
|
|
124
|
-
isFullscreen: boolean;
|
|
125
|
-
isPip: boolean;
|
|
126
|
-
subtitleTracks: {
|
|
127
|
-
label: string;
|
|
128
|
-
language: string;
|
|
129
|
-
index: number;
|
|
130
|
-
}[];
|
|
131
|
-
currentSubtitle: number;
|
|
132
|
-
subtitleOffset: number;
|
|
133
|
-
subtitleSettings: SubtitleSettings;
|
|
134
|
-
activeCues: string[];
|
|
135
|
-
viewMode: 'normal' | 'theater' | 'pip';
|
|
136
|
-
notifications: Notification_2[];
|
|
137
|
-
iconSize: 'small' | 'medium' | 'large';
|
|
138
|
-
themeColor: string;
|
|
139
|
-
theme: PlayerTheme;
|
|
140
|
-
sources: PlayerSource[];
|
|
141
|
-
currentSourceIndex: number;
|
|
142
|
-
isLocked: boolean;
|
|
143
|
-
flipState: {
|
|
144
|
-
horizontal: boolean;
|
|
145
|
-
vertical: boolean;
|
|
146
|
-
};
|
|
147
|
-
aspectRatio: string;
|
|
148
|
-
isAutoSized: boolean;
|
|
149
|
-
isLooping: boolean;
|
|
150
|
-
controlsVisible: boolean;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
declare type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';
|
|
154
|
-
|
|
155
|
-
declare interface SettingItem {
|
|
156
|
-
id?: string;
|
|
157
|
-
html: string | default_2.ReactNode;
|
|
158
|
-
icon?: string | default_2.ReactNode;
|
|
159
|
-
tooltip?: string;
|
|
160
|
-
switch?: boolean;
|
|
161
|
-
onSwitch?: (item: SettingItem) => boolean | void;
|
|
162
|
-
onClick?: () => void;
|
|
163
|
-
click?: () => void;
|
|
164
|
-
isDefault?: boolean;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
declare interface StrataConfig {
|
|
168
|
-
container?: string;
|
|
169
|
-
id?: string;
|
|
170
|
-
volume?: number;
|
|
171
|
-
muted?: boolean;
|
|
172
|
-
playbackRate?: number;
|
|
173
|
-
audioGain?: number;
|
|
174
|
-
loop?: boolean;
|
|
175
|
-
playsInline?: boolean;
|
|
176
|
-
isLive?: boolean;
|
|
177
|
-
poster?: string;
|
|
178
|
-
fetchTimeout?: number;
|
|
179
|
-
theme?: PlayerTheme;
|
|
180
|
-
themeColor?: string;
|
|
181
|
-
iconSize?: 'small' | 'medium' | 'large';
|
|
182
|
-
backdrop?: boolean;
|
|
183
|
-
autoSize?: boolean;
|
|
184
|
-
subtitleSettings?: Partial<SubtitleSettings>;
|
|
185
|
-
screenshot?: boolean;
|
|
186
|
-
setting?: boolean;
|
|
187
|
-
pip?: boolean;
|
|
188
|
-
fullscreen?: boolean;
|
|
189
|
-
fullscreenWeb?: boolean;
|
|
190
|
-
flip?: boolean;
|
|
191
|
-
aspectRatio?: boolean;
|
|
192
|
-
highlight?: Highlight_2[];
|
|
193
|
-
centerControls?: boolean;
|
|
194
|
-
hotKey?: boolean;
|
|
195
|
-
lock?: boolean;
|
|
196
|
-
gesture?: boolean;
|
|
197
|
-
gestureSeek?: boolean;
|
|
198
|
-
fastForward?: boolean;
|
|
199
|
-
autoOrientation?: boolean;
|
|
200
|
-
layers?: LayerConfig[];
|
|
201
|
-
contextmenu?: ContextMenuItem[];
|
|
202
|
-
controls?: ControlItem[];
|
|
203
|
-
settings?: SettingItem[];
|
|
204
|
-
useSSR?: boolean;
|
|
205
|
-
disablePersistence?: boolean;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
declare class StrataCore {
|
|
209
|
-
video: HTMLVideoElement;
|
|
210
|
-
container: HTMLElement | null;
|
|
211
|
-
events: EventBus;
|
|
212
|
-
store: NanoStore<PlayerState>;
|
|
213
|
-
private plugins;
|
|
214
|
-
private audioEngine;
|
|
215
|
-
config: StrataConfig;
|
|
216
|
-
private resizeObserver;
|
|
217
|
-
private retryCount;
|
|
218
|
-
private maxRetries;
|
|
219
|
-
private retryTimer;
|
|
220
|
-
private currentSource;
|
|
221
|
-
private currentSrc;
|
|
222
|
-
private currentTracks;
|
|
223
|
-
private castInitialized;
|
|
224
|
-
private boundCueChange;
|
|
225
|
-
private boundFullscreenChange;
|
|
226
|
-
constructor(config?: StrataConfig, videoElement?: HTMLVideoElement);
|
|
227
|
-
get playing(): boolean;
|
|
228
|
-
get currentTime(): number;
|
|
229
|
-
set currentTime(val: number);
|
|
230
|
-
get duration(): number;
|
|
231
|
-
get paused(): boolean;
|
|
232
|
-
get volume(): number;
|
|
233
|
-
set volume(val: number);
|
|
234
|
-
get muted(): boolean;
|
|
235
|
-
set muted(val: boolean);
|
|
236
|
-
get playbackRate(): number;
|
|
237
|
-
set playbackRate(val: number);
|
|
238
|
-
get loop(): boolean;
|
|
239
|
-
set loop(val: boolean);
|
|
240
|
-
forward(seconds?: number): void;
|
|
241
|
-
backward(seconds?: number): void;
|
|
242
|
-
on(event: string, callback: EventCallback): () => void;
|
|
243
|
-
off(event: string, callback: EventCallback): void;
|
|
244
|
-
emit(event: string, data?: any): void;
|
|
245
|
-
private initVideoListeners;
|
|
246
|
-
private initMediaSession;
|
|
247
|
-
private updateMediaSessionMetadata;
|
|
248
|
-
private updateMediaSessionPosition;
|
|
249
|
-
triggerError(message: string, isFatal?: boolean): void;
|
|
250
|
-
private handleError;
|
|
251
|
-
private updateBuffer;
|
|
252
|
-
private updateSubtitles;
|
|
253
|
-
fetchWithRetry(url: string, retries?: number, timeout?: number): Promise<Response>;
|
|
254
|
-
attach(container: HTMLElement): void;
|
|
255
|
-
use(plugin: IPlugin): void;
|
|
256
|
-
setSources(sources: PlayerSource[], tracks?: TextTrackConfig[]): void;
|
|
257
|
-
switchSource(index: number): void;
|
|
258
|
-
load(source: PlayerSource | string, tracks?: TextTrackConfig[], isRetry?: boolean): void;
|
|
259
|
-
loadSubtitle(url: string, label?: string): void;
|
|
260
|
-
addTextTrack(file: File, label: string): void;
|
|
261
|
-
private addTextTrackInternal;
|
|
262
|
-
play(): Promise<void>;
|
|
263
|
-
pause(): void;
|
|
264
|
-
togglePlay(): void;
|
|
265
|
-
seek(time: number): void;
|
|
266
|
-
skip(seconds: number): void;
|
|
267
|
-
setVolume(vol: number): void;
|
|
268
|
-
toggleMute(): void;
|
|
269
|
-
setAudioGain(gain: number): void;
|
|
270
|
-
setQuality(index: number): void;
|
|
271
|
-
setAudioTrack(index: number): void;
|
|
272
|
-
setControlsVisible(visible: boolean): void;
|
|
273
|
-
toggleFullscreen(): Promise<void>;
|
|
274
|
-
togglePip(): void;
|
|
275
|
-
screenshot(): void;
|
|
276
|
-
toggleLock(): void;
|
|
277
|
-
toggleLoop(): void;
|
|
278
|
-
setFlip(direction: 'horizontal' | 'vertical'): void;
|
|
279
|
-
setAspectRatio(ratio: string): void;
|
|
280
|
-
private initCast;
|
|
281
|
-
requestCast(): void;
|
|
282
|
-
private loadMediaToCast;
|
|
283
|
-
private handleCueChange;
|
|
284
|
-
setSubtitle(index: number): void;
|
|
285
|
-
updateSubtitleSettings(settings: Partial<SubtitleSettings>): void;
|
|
286
|
-
resetSubtitleSettings(): void;
|
|
287
|
-
setSubtitleOffset(offset: number): void;
|
|
288
|
-
download(): Promise<void>;
|
|
289
|
-
notify(n: Omit<Notification_2, 'id'> & {
|
|
290
|
-
id?: string;
|
|
291
|
-
}): string;
|
|
292
|
-
removeNotification(id: string): void;
|
|
293
|
-
setAppearance(settings: {
|
|
294
|
-
iconSize?: 'small' | 'medium' | 'large';
|
|
295
|
-
themeColor?: string;
|
|
296
|
-
theme?: PlayerTheme;
|
|
297
|
-
}): void;
|
|
298
|
-
destroy(): void;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
declare interface SubtitleSettings {
|
|
302
|
-
useNative: boolean;
|
|
303
|
-
fixCapitalization: boolean;
|
|
304
|
-
backgroundOpacity: number;
|
|
305
|
-
backgroundBlur: boolean;
|
|
306
|
-
backgroundBlurAmount: number;
|
|
307
|
-
textSize: number;
|
|
308
|
-
textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';
|
|
309
|
-
isBold: boolean;
|
|
310
|
-
textColor: string;
|
|
311
|
-
verticalOffset: number;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
declare interface TextTrackConfig {
|
|
315
|
-
src: string;
|
|
316
|
-
label: string;
|
|
317
|
-
srcLang?: string;
|
|
318
|
-
default?: boolean;
|
|
319
|
-
kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
export { }
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
declare module 'react' {
|
|
326
|
-
namespace JSX {
|
|
327
|
-
interface IntrinsicElements {
|
|
328
|
-
'google-cast-launcher': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
1
|
+
export * from './plugins/DashPlugin'
|