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
package/dist/dash.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dash.es.js","sources":["../plugins/DashPlugin.ts"],"sourcesContent":["import { StrataCore, IPlugin } from '
|
|
1
|
+
{"version":3,"file":"dash.es.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":"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"}
|
package/dist/hls.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hls.cjs.js","sources":["../plugins/HlsPlugin.ts"],"sourcesContent":["\nimport { StrataCore, IPlugin } from '
|
|
1
|
+
{"version":3,"file":"hls.cjs.js","sources":["../plugins/HlsPlugin.ts"],"sourcesContent":["\r\nimport { StrataCore, IPlugin } from 'strataplayer';\r\nimport * as HlsModule from 'hls.js';\r\n\r\n// Handle environment differences where Hls might be a default export or module export\r\nconst Hls = (HlsModule as any).default || HlsModule;\r\n\r\nexport class HlsPlugin implements IPlugin {\r\n name = 'HlsPlugin';\r\n private hls: 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 // Only proceed if type matches HLS\r\n if (data.type === 'hls' || data.url.includes('.m3u8')) {\r\n if (Hls.isSupported()) {\r\n this.loadHls(data.url);\r\n } else if (this.core!.video.canPlayType('application/vnd.apple.mpegurl')) {\r\n // Native HLS fallback (Safari) - Core sets src, we do nothing\r\n // Core already handles setting video.src if standard\r\n this.core!.video.src = data.url;\r\n }\r\n } else {\r\n // If we had an active HLS instance but switched to MP4, destroy it\r\n if (this.hls) {\r\n this.hls.destroy();\r\n this.hls = null;\r\n }\r\n }\r\n });\r\n\r\n // Listen for quality changes from UI\r\n this.core.events.on('quality-request', (index: number) => {\r\n if (this.hls) {\r\n this.hls.currentLevel = index;\r\n }\r\n });\r\n\r\n // Listen for audio track changes from UI\r\n this.core.events.on('audio-track-request', (index: number) => {\r\n if (this.hls) {\r\n this.hls.audioTrack = index;\r\n }\r\n });\r\n }\r\n\r\n private loadHls(url: string) {\r\n if (this.hls) {\r\n this.hls.destroy();\r\n }\r\n\r\n this.hls = new Hls({\r\n autoStartLoad: true,\r\n startLevel: -1, // Auto\r\n capLevelToPlayerSize: true, // Performance opt\r\n });\r\n\r\n this.hls.loadSource(url);\r\n this.hls.attachMedia(this.core!.video);\r\n\r\n this.hls.on(Hls.Events.MANIFEST_PARSED, (event: any, data: any) => {\r\n const levels = data.levels.map((lvl: any, idx: number) => ({\r\n height: lvl.height,\r\n bitrate: lvl.bitrate,\r\n index: idx\r\n }));\r\n this.core!.store.setState({ qualityLevels: levels });\r\n });\r\n\r\n // Handle Audio Tracks\r\n this.hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event: any, data: any) => {\r\n const tracks = data.audioTracks.map((track: any, idx: number) => ({\r\n label: track.name || track.lang || `Audio ${idx + 1}`,\r\n language: track.lang || '',\r\n index: idx\r\n }));\r\n this.core!.store.setState({\r\n audioTracks: tracks,\r\n currentAudioTrack: this.hls!.audioTrack\r\n });\r\n });\r\n\r\n this.hls.on(Hls.Events.LEVEL_SWITCHED, (event: any, data: any) => {\r\n // Update current quality only if in auto mode to show what's playing\r\n // If manual, state is already set\r\n });\r\n\r\n this.hls.on(Hls.Events.ERROR, (event: any, data: any) => {\r\n if (data.fatal) {\r\n // Pass fatal errors to Core to handle the retry loop visibly\r\n const msg = data.details || 'Unknown HLS Error';\r\n this.core!.triggerError(msg, true);\r\n\r\n // Cleanup if needed, but core.load() will eventually destroy and re-init this plugin\r\n }\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.hls) {\r\n this.hls.destroy();\r\n this.hls = null;\r\n }\r\n }\r\n}\r\n"],"names":["Hls","HlsModule","HlsPlugin","__publicField","core","data","index","url","event","levels","lvl","idx","tracks","track","msg"],"mappings":"wiBAKMA,EAAOC,EAAkB,SAAWA,EAEnC,MAAMC,CAA6B,CAAnC,cACLC,EAAA,YAAO,aACCA,EAAA,WAAW,MACXA,EAAA,YAA0B,MAElC,KAAKC,EAAkB,CACrB,KAAK,KAAOA,EAGZ,KAAK,KAAK,OAAO,GAAG,OAASC,GAAwC,CAE/DA,EAAK,OAAS,OAASA,EAAK,IAAI,SAAS,OAAO,EAC9CL,EAAI,cACN,KAAK,QAAQK,EAAK,GAAG,EACZ,KAAK,KAAM,MAAM,YAAY,+BAA+B,IAGrE,KAAK,KAAM,MAAM,IAAMA,EAAK,KAI1B,KAAK,MACP,KAAK,IAAI,QAAA,EACT,KAAK,IAAM,KAGjB,CAAC,EAGD,KAAK,KAAK,OAAO,GAAG,kBAAoBC,GAAkB,CACpD,KAAK,MACP,KAAK,IAAI,aAAeA,EAE5B,CAAC,EAGD,KAAK,KAAK,OAAO,GAAG,sBAAwBA,GAAkB,CACxD,KAAK,MACP,KAAK,IAAI,WAAaA,EAE1B,CAAC,CACH,CAEQ,QAAQC,EAAa,CACvB,KAAK,KACP,KAAK,IAAI,QAAA,EAGX,KAAK,IAAM,IAAIP,EAAI,CACjB,cAAe,GACf,WAAY,GACZ,qBAAsB,EAAA,CACvB,EAED,KAAK,IAAI,WAAWO,CAAG,EACvB,KAAK,IAAI,YAAY,KAAK,KAAM,KAAK,EAErC,KAAK,IAAI,GAAGP,EAAI,OAAO,gBAAiB,CAACQ,EAAYH,IAAc,CACjE,MAAMI,EAASJ,EAAK,OAAO,IAAI,CAACK,EAAUC,KAAiB,CACzD,OAAQD,EAAI,OACZ,QAASA,EAAI,QACb,MAAOC,CAAA,EACP,EACF,KAAK,KAAM,MAAM,SAAS,CAAE,cAAeF,EAAQ,CACrD,CAAC,EAGD,KAAK,IAAI,GAAGT,EAAI,OAAO,qBAAsB,CAACQ,EAAYH,IAAc,CACtE,MAAMO,EAASP,EAAK,YAAY,IAAI,CAACQ,EAAYF,KAAiB,CAChE,MAAOE,EAAM,MAAQA,EAAM,MAAQ,SAASF,EAAM,CAAC,GACnD,SAAUE,EAAM,MAAQ,GACxB,MAAOF,CAAA,EACP,EACF,KAAK,KAAM,MAAM,SAAS,CACxB,YAAaC,EACb,kBAAmB,KAAK,IAAK,UAAA,CAC9B,CACH,CAAC,EAED,KAAK,IAAI,GAAGZ,EAAI,OAAO,eAAgB,CAACQ,EAAYH,IAAc,CAGlE,CAAC,EAED,KAAK,IAAI,GAAGL,EAAI,OAAO,MAAO,CAACQ,EAAYH,IAAc,CACvD,GAAIA,EAAK,MAAO,CAEd,MAAMS,EAAMT,EAAK,SAAW,oBAC5B,KAAK,KAAM,aAAaS,EAAK,EAAI,CAGnC,CACF,CAAC,CACH,CAEA,SAAU,CACJ,KAAK,MACP,KAAK,IAAI,QAAA,EACT,KAAK,IAAM,KAEf,CACF"}
|
package/dist/hls.d.ts
CHANGED
|
@@ -1,330 +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
|
-
declare class EventBus {
|
|
30
|
-
private events;
|
|
31
|
-
constructor();
|
|
32
|
-
on<T>(event: string, callback: EventCallback<T>): () => void;
|
|
33
|
-
off<T>(event: string, callback: EventCallback<T>): void;
|
|
34
|
-
emit<T>(event: string, data?: T): void;
|
|
35
|
-
destroy(): void;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
declare type EventCallback<T = any> = (data: T) => void;
|
|
39
|
-
|
|
40
|
-
declare interface Highlight_2 {
|
|
41
|
-
time: number;
|
|
42
|
-
text: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export declare class HlsPlugin implements IPlugin {
|
|
46
|
-
name: string;
|
|
47
|
-
private hls;
|
|
48
|
-
private core;
|
|
49
|
-
init(core: StrataCore): void;
|
|
50
|
-
private loadHls;
|
|
51
|
-
destroy(): void;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
declare interface IPlugin {
|
|
55
|
-
name: string;
|
|
56
|
-
init(core: StrataCore): void;
|
|
57
|
-
destroy?(): void;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
declare interface LayerConfig {
|
|
61
|
-
name?: string;
|
|
62
|
-
html: string | default_2.ReactNode;
|
|
63
|
-
style?: default_2.CSSProperties;
|
|
64
|
-
className?: string;
|
|
65
|
-
click?: () => void;
|
|
66
|
-
mounted?: (element: HTMLElement) => void;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
declare type Listener<T> = (state: T, prevState: T) => void;
|
|
70
|
-
|
|
71
|
-
declare class NanoStore<T> {
|
|
72
|
-
private state;
|
|
73
|
-
private listeners;
|
|
74
|
-
constructor(initialState: T);
|
|
75
|
-
get(): T;
|
|
76
|
-
setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;
|
|
77
|
-
subscribe(listener: Listener<T>): () => void;
|
|
78
|
-
destroy(): void;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
declare interface Notification_2 {
|
|
82
|
-
id: string;
|
|
83
|
-
message: string;
|
|
84
|
-
type: 'info' | 'success' | 'warning' | 'error' | 'loading';
|
|
85
|
-
duration?: number;
|
|
86
|
-
progress?: number;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
declare interface PlayerSource {
|
|
90
|
-
url: string;
|
|
91
|
-
type?: 'hls' | 'mp4' | 'webm' | 'dash' | 'mpegts' | 'webtorrent' | string;
|
|
92
|
-
name?: string;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
declare interface PlayerState {
|
|
96
|
-
isPlaying: boolean;
|
|
97
|
-
isBuffering: boolean;
|
|
98
|
-
isLive: boolean;
|
|
99
|
-
currentTime: number;
|
|
100
|
-
duration: number;
|
|
101
|
-
buffered: {
|
|
102
|
-
start: number;
|
|
103
|
-
end: number;
|
|
104
|
-
}[];
|
|
105
|
-
volume: number;
|
|
106
|
-
isMuted: boolean;
|
|
107
|
-
audioGain: number;
|
|
108
|
-
playbackRate: number;
|
|
109
|
-
qualityLevels: {
|
|
110
|
-
height: number;
|
|
111
|
-
bitrate: number;
|
|
112
|
-
index: number;
|
|
113
|
-
}[];
|
|
114
|
-
currentQuality: number;
|
|
115
|
-
audioTracks: {
|
|
116
|
-
label: string;
|
|
117
|
-
language: string;
|
|
118
|
-
index: number;
|
|
119
|
-
}[];
|
|
120
|
-
currentAudioTrack: number;
|
|
121
|
-
error: string | null;
|
|
122
|
-
isFullscreen: boolean;
|
|
123
|
-
isPip: boolean;
|
|
124
|
-
subtitleTracks: {
|
|
125
|
-
label: string;
|
|
126
|
-
language: string;
|
|
127
|
-
index: number;
|
|
128
|
-
}[];
|
|
129
|
-
currentSubtitle: number;
|
|
130
|
-
subtitleOffset: number;
|
|
131
|
-
subtitleSettings: SubtitleSettings;
|
|
132
|
-
activeCues: string[];
|
|
133
|
-
viewMode: 'normal' | 'theater' | 'pip';
|
|
134
|
-
notifications: Notification_2[];
|
|
135
|
-
iconSize: 'small' | 'medium' | 'large';
|
|
136
|
-
themeColor: string;
|
|
137
|
-
theme: PlayerTheme;
|
|
138
|
-
sources: PlayerSource[];
|
|
139
|
-
currentSourceIndex: number;
|
|
140
|
-
isLocked: boolean;
|
|
141
|
-
flipState: {
|
|
142
|
-
horizontal: boolean;
|
|
143
|
-
vertical: boolean;
|
|
144
|
-
};
|
|
145
|
-
aspectRatio: string;
|
|
146
|
-
isAutoSized: boolean;
|
|
147
|
-
isLooping: boolean;
|
|
148
|
-
controlsVisible: boolean;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
declare type PlayerTheme = 'default' | 'pixel' | 'game' | 'hacker';
|
|
152
|
-
|
|
153
|
-
declare interface SettingItem {
|
|
154
|
-
id?: string;
|
|
155
|
-
html: string | default_2.ReactNode;
|
|
156
|
-
icon?: string | default_2.ReactNode;
|
|
157
|
-
tooltip?: string;
|
|
158
|
-
switch?: boolean;
|
|
159
|
-
onSwitch?: (item: SettingItem) => boolean | void;
|
|
160
|
-
onClick?: () => void;
|
|
161
|
-
click?: () => void;
|
|
162
|
-
isDefault?: boolean;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
declare interface StrataConfig {
|
|
166
|
-
container?: string;
|
|
167
|
-
id?: string;
|
|
168
|
-
volume?: number;
|
|
169
|
-
muted?: boolean;
|
|
170
|
-
playbackRate?: number;
|
|
171
|
-
audioGain?: number;
|
|
172
|
-
loop?: boolean;
|
|
173
|
-
playsInline?: boolean;
|
|
174
|
-
isLive?: boolean;
|
|
175
|
-
poster?: string;
|
|
176
|
-
fetchTimeout?: number;
|
|
177
|
-
theme?: PlayerTheme;
|
|
178
|
-
themeColor?: string;
|
|
179
|
-
iconSize?: 'small' | 'medium' | 'large';
|
|
180
|
-
backdrop?: boolean;
|
|
181
|
-
autoSize?: boolean;
|
|
182
|
-
subtitleSettings?: Partial<SubtitleSettings>;
|
|
183
|
-
screenshot?: boolean;
|
|
184
|
-
setting?: boolean;
|
|
185
|
-
pip?: boolean;
|
|
186
|
-
fullscreen?: boolean;
|
|
187
|
-
fullscreenWeb?: boolean;
|
|
188
|
-
flip?: boolean;
|
|
189
|
-
aspectRatio?: boolean;
|
|
190
|
-
highlight?: Highlight_2[];
|
|
191
|
-
centerControls?: boolean;
|
|
192
|
-
hotKey?: boolean;
|
|
193
|
-
lock?: boolean;
|
|
194
|
-
gesture?: boolean;
|
|
195
|
-
gestureSeek?: boolean;
|
|
196
|
-
fastForward?: boolean;
|
|
197
|
-
autoOrientation?: boolean;
|
|
198
|
-
layers?: LayerConfig[];
|
|
199
|
-
contextmenu?: ContextMenuItem[];
|
|
200
|
-
controls?: ControlItem[];
|
|
201
|
-
settings?: SettingItem[];
|
|
202
|
-
useSSR?: boolean;
|
|
203
|
-
disablePersistence?: boolean;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
declare class StrataCore {
|
|
207
|
-
video: HTMLVideoElement;
|
|
208
|
-
container: HTMLElement | null;
|
|
209
|
-
events: EventBus;
|
|
210
|
-
store: NanoStore<PlayerState>;
|
|
211
|
-
private plugins;
|
|
212
|
-
private audioEngine;
|
|
213
|
-
config: StrataConfig;
|
|
214
|
-
private resizeObserver;
|
|
215
|
-
private retryCount;
|
|
216
|
-
private maxRetries;
|
|
217
|
-
private retryTimer;
|
|
218
|
-
private currentSource;
|
|
219
|
-
private currentSrc;
|
|
220
|
-
private currentTracks;
|
|
221
|
-
private castInitialized;
|
|
222
|
-
private boundCueChange;
|
|
223
|
-
private boundFullscreenChange;
|
|
224
|
-
constructor(config?: StrataConfig, videoElement?: HTMLVideoElement);
|
|
225
|
-
get playing(): boolean;
|
|
226
|
-
get currentTime(): number;
|
|
227
|
-
set currentTime(val: number);
|
|
228
|
-
get duration(): number;
|
|
229
|
-
get paused(): boolean;
|
|
230
|
-
get volume(): number;
|
|
231
|
-
set volume(val: number);
|
|
232
|
-
get muted(): boolean;
|
|
233
|
-
set muted(val: boolean);
|
|
234
|
-
get playbackRate(): number;
|
|
235
|
-
set playbackRate(val: number);
|
|
236
|
-
get loop(): boolean;
|
|
237
|
-
set loop(val: boolean);
|
|
238
|
-
forward(seconds?: number): void;
|
|
239
|
-
backward(seconds?: number): void;
|
|
240
|
-
on(event: string, callback: EventCallback): () => void;
|
|
241
|
-
off(event: string, callback: EventCallback): void;
|
|
242
|
-
emit(event: string, data?: any): void;
|
|
243
|
-
private initVideoListeners;
|
|
244
|
-
private initMediaSession;
|
|
245
|
-
private updateMediaSessionMetadata;
|
|
246
|
-
private updateMediaSessionPosition;
|
|
247
|
-
triggerError(message: string, isFatal?: boolean): void;
|
|
248
|
-
private handleError;
|
|
249
|
-
private updateBuffer;
|
|
250
|
-
private updateSubtitles;
|
|
251
|
-
fetchWithRetry(url: string, retries?: number, timeout?: number): Promise<Response>;
|
|
252
|
-
attach(container: HTMLElement): void;
|
|
253
|
-
use(plugin: IPlugin): void;
|
|
254
|
-
setSources(sources: PlayerSource[], tracks?: TextTrackConfig[]): void;
|
|
255
|
-
switchSource(index: number): void;
|
|
256
|
-
load(source: PlayerSource | string, tracks?: TextTrackConfig[], isRetry?: boolean): void;
|
|
257
|
-
loadSubtitle(url: string, label?: string): void;
|
|
258
|
-
addTextTrack(file: File, label: string): void;
|
|
259
|
-
private addTextTrackInternal;
|
|
260
|
-
play(): Promise<void>;
|
|
261
|
-
pause(): void;
|
|
262
|
-
togglePlay(): void;
|
|
263
|
-
seek(time: number): void;
|
|
264
|
-
skip(seconds: number): void;
|
|
265
|
-
setVolume(vol: number): void;
|
|
266
|
-
toggleMute(): void;
|
|
267
|
-
setAudioGain(gain: number): void;
|
|
268
|
-
setQuality(index: number): void;
|
|
269
|
-
setAudioTrack(index: number): void;
|
|
270
|
-
setControlsVisible(visible: boolean): void;
|
|
271
|
-
toggleFullscreen(): Promise<void>;
|
|
272
|
-
togglePip(): void;
|
|
273
|
-
screenshot(): void;
|
|
274
|
-
toggleLock(): void;
|
|
275
|
-
toggleLoop(): void;
|
|
276
|
-
setFlip(direction: 'horizontal' | 'vertical'): void;
|
|
277
|
-
setAspectRatio(ratio: string): void;
|
|
278
|
-
private initCast;
|
|
279
|
-
requestCast(): void;
|
|
280
|
-
private loadMediaToCast;
|
|
281
|
-
private handleCueChange;
|
|
282
|
-
setSubtitle(index: number): void;
|
|
283
|
-
updateSubtitleSettings(settings: Partial<SubtitleSettings>): void;
|
|
284
|
-
resetSubtitleSettings(): void;
|
|
285
|
-
setSubtitleOffset(offset: number): void;
|
|
286
|
-
download(): Promise<void>;
|
|
287
|
-
notify(n: Omit<Notification_2, 'id'> & {
|
|
288
|
-
id?: string;
|
|
289
|
-
}): string;
|
|
290
|
-
removeNotification(id: string): void;
|
|
291
|
-
setAppearance(settings: {
|
|
292
|
-
iconSize?: 'small' | 'medium' | 'large';
|
|
293
|
-
themeColor?: string;
|
|
294
|
-
theme?: PlayerTheme;
|
|
295
|
-
}): void;
|
|
296
|
-
destroy(): void;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
declare interface SubtitleSettings {
|
|
300
|
-
useNative: boolean;
|
|
301
|
-
fixCapitalization: boolean;
|
|
302
|
-
backgroundOpacity: number;
|
|
303
|
-
backgroundBlur: boolean;
|
|
304
|
-
backgroundBlurAmount: number;
|
|
305
|
-
textSize: number;
|
|
306
|
-
textStyle: 'none' | 'outline' | 'raised' | 'depressed' | 'shadow';
|
|
307
|
-
isBold: boolean;
|
|
308
|
-
textColor: string;
|
|
309
|
-
verticalOffset: number;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
declare interface TextTrackConfig {
|
|
313
|
-
src: string;
|
|
314
|
-
label: string;
|
|
315
|
-
srcLang?: string;
|
|
316
|
-
default?: boolean;
|
|
317
|
-
kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
export { }
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
declare module 'react' {
|
|
324
|
-
namespace JSX {
|
|
325
|
-
interface IntrinsicElements {
|
|
326
|
-
'google-cast-launcher': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
1
|
+
export * from './plugins/HlsPlugin'
|
package/dist/hls.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hls.es.js","sources":["../plugins/HlsPlugin.ts"],"sourcesContent":["\nimport { StrataCore, IPlugin } from '
|
|
1
|
+
{"version":3,"file":"hls.es.js","sources":["../plugins/HlsPlugin.ts"],"sourcesContent":["\r\nimport { StrataCore, IPlugin } from 'strataplayer';\r\nimport * as HlsModule from 'hls.js';\r\n\r\n// Handle environment differences where Hls might be a default export or module export\r\nconst Hls = (HlsModule as any).default || HlsModule;\r\n\r\nexport class HlsPlugin implements IPlugin {\r\n name = 'HlsPlugin';\r\n private hls: 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 // Only proceed if type matches HLS\r\n if (data.type === 'hls' || data.url.includes('.m3u8')) {\r\n if (Hls.isSupported()) {\r\n this.loadHls(data.url);\r\n } else if (this.core!.video.canPlayType('application/vnd.apple.mpegurl')) {\r\n // Native HLS fallback (Safari) - Core sets src, we do nothing\r\n // Core already handles setting video.src if standard\r\n this.core!.video.src = data.url;\r\n }\r\n } else {\r\n // If we had an active HLS instance but switched to MP4, destroy it\r\n if (this.hls) {\r\n this.hls.destroy();\r\n this.hls = null;\r\n }\r\n }\r\n });\r\n\r\n // Listen for quality changes from UI\r\n this.core.events.on('quality-request', (index: number) => {\r\n if (this.hls) {\r\n this.hls.currentLevel = index;\r\n }\r\n });\r\n\r\n // Listen for audio track changes from UI\r\n this.core.events.on('audio-track-request', (index: number) => {\r\n if (this.hls) {\r\n this.hls.audioTrack = index;\r\n }\r\n });\r\n }\r\n\r\n private loadHls(url: string) {\r\n if (this.hls) {\r\n this.hls.destroy();\r\n }\r\n\r\n this.hls = new Hls({\r\n autoStartLoad: true,\r\n startLevel: -1, // Auto\r\n capLevelToPlayerSize: true, // Performance opt\r\n });\r\n\r\n this.hls.loadSource(url);\r\n this.hls.attachMedia(this.core!.video);\r\n\r\n this.hls.on(Hls.Events.MANIFEST_PARSED, (event: any, data: any) => {\r\n const levels = data.levels.map((lvl: any, idx: number) => ({\r\n height: lvl.height,\r\n bitrate: lvl.bitrate,\r\n index: idx\r\n }));\r\n this.core!.store.setState({ qualityLevels: levels });\r\n });\r\n\r\n // Handle Audio Tracks\r\n this.hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event: any, data: any) => {\r\n const tracks = data.audioTracks.map((track: any, idx: number) => ({\r\n label: track.name || track.lang || `Audio ${idx + 1}`,\r\n language: track.lang || '',\r\n index: idx\r\n }));\r\n this.core!.store.setState({\r\n audioTracks: tracks,\r\n currentAudioTrack: this.hls!.audioTrack\r\n });\r\n });\r\n\r\n this.hls.on(Hls.Events.LEVEL_SWITCHED, (event: any, data: any) => {\r\n // Update current quality only if in auto mode to show what's playing\r\n // If manual, state is already set\r\n });\r\n\r\n this.hls.on(Hls.Events.ERROR, (event: any, data: any) => {\r\n if (data.fatal) {\r\n // Pass fatal errors to Core to handle the retry loop visibly\r\n const msg = data.details || 'Unknown HLS Error';\r\n this.core!.triggerError(msg, true);\r\n\r\n // Cleanup if needed, but core.load() will eventually destroy and re-init this plugin\r\n }\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.hls) {\r\n this.hls.destroy();\r\n this.hls = null;\r\n }\r\n }\r\n}\r\n"],"names":["Hls","HlsModule","HlsPlugin","__publicField","core","data","index","url","event","levels","lvl","idx","tracks","track","msg"],"mappings":";;;;AAKA,MAAMA,IAAOC,EAAkB,WAAWA;AAEnC,MAAMC,EAA6B;AAAA,EAAnC;AACL,IAAAC,EAAA,cAAO;AACC,IAAAA,EAAA,aAAW;AACX,IAAAA,EAAA,cAA0B;AAAA;AAAA,EAElC,KAAKC,GAAkB;AACrB,SAAK,OAAOA,GAGZ,KAAK,KAAK,OAAO,GAAG,QAAQ,CAACC,MAAwC;AAEnE,MAAIA,EAAK,SAAS,SAASA,EAAK,IAAI,SAAS,OAAO,IAC9CL,EAAI,gBACN,KAAK,QAAQK,EAAK,GAAG,IACZ,KAAK,KAAM,MAAM,YAAY,+BAA+B,MAGrE,KAAK,KAAM,MAAM,MAAMA,EAAK,OAI1B,KAAK,QACP,KAAK,IAAI,QAAA,GACT,KAAK,MAAM;AAAA,IAGjB,CAAC,GAGD,KAAK,KAAK,OAAO,GAAG,mBAAmB,CAACC,MAAkB;AACxD,MAAI,KAAK,QACP,KAAK,IAAI,eAAeA;AAAA,IAE5B,CAAC,GAGD,KAAK,KAAK,OAAO,GAAG,uBAAuB,CAACA,MAAkB;AAC5D,MAAI,KAAK,QACP,KAAK,IAAI,aAAaA;AAAA,IAE1B,CAAC;AAAA,EACH;AAAA,EAEQ,QAAQC,GAAa;AAC3B,IAAI,KAAK,OACP,KAAK,IAAI,QAAA,GAGX,KAAK,MAAM,IAAIP,EAAI;AAAA,MACjB,eAAe;AAAA,MACf,YAAY;AAAA;AAAA,MACZ,sBAAsB;AAAA;AAAA,IAAA,CACvB,GAED,KAAK,IAAI,WAAWO,CAAG,GACvB,KAAK,IAAI,YAAY,KAAK,KAAM,KAAK,GAErC,KAAK,IAAI,GAAGP,EAAI,OAAO,iBAAiB,CAACQ,GAAYH,MAAc;AACjE,YAAMI,IAASJ,EAAK,OAAO,IAAI,CAACK,GAAUC,OAAiB;AAAA,QACzD,QAAQD,EAAI;AAAA,QACZ,SAASA,EAAI;AAAA,QACb,OAAOC;AAAA,MAAA,EACP;AACF,WAAK,KAAM,MAAM,SAAS,EAAE,eAAeF,GAAQ;AAAA,IACrD,CAAC,GAGD,KAAK,IAAI,GAAGT,EAAI,OAAO,sBAAsB,CAACQ,GAAYH,MAAc;AACtE,YAAMO,IAASP,EAAK,YAAY,IAAI,CAACQ,GAAYF,OAAiB;AAAA,QAChE,OAAOE,EAAM,QAAQA,EAAM,QAAQ,SAASF,IAAM,CAAC;AAAA,QACnD,UAAUE,EAAM,QAAQ;AAAA,QACxB,OAAOF;AAAA,MAAA,EACP;AACF,WAAK,KAAM,MAAM,SAAS;AAAA,QACxB,aAAaC;AAAA,QACb,mBAAmB,KAAK,IAAK;AAAA,MAAA,CAC9B;AAAA,IACH,CAAC,GAED,KAAK,IAAI,GAAGZ,EAAI,OAAO,gBAAgB,CAACQ,GAAYH,MAAc;AAAA,IAGlE,CAAC,GAED,KAAK,IAAI,GAAGL,EAAI,OAAO,OAAO,CAACQ,GAAYH,MAAc;AACvD,UAAIA,EAAK,OAAO;AAEd,cAAMS,IAAMT,EAAK,WAAW;AAC5B,aAAK,KAAM,aAAaS,GAAK,EAAI;AAAA,MAGnC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAU;AACR,IAAI,KAAK,QACP,KAAK,IAAI,QAAA,GACT,KAAK,MAAM;AAAA,EAEf;AACF;"}
|