react-helios 2.7.5 → 2.9.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # react-helios
2
2
 
3
- Production-grade React video player with HLS streaming, zero-cost audio mode, adaptive quality selection, live stream support, subtitle tracks, VTT sprite sheet thumbnail preview, Picture-in-Picture, and full keyboard control.
3
+ Production-grade React video player with HLS streaming, zero-cost audio mode, adaptive quality selection, manual quality switching, live stream support, subtitle tracks, VTT sprite sheet thumbnail preview, waveform audio progress bar, Picture-in-Picture, and full keyboard control.
4
4
 
5
5
  ## Installation
6
6
 
@@ -69,6 +69,7 @@ Audio mode pauses the video element completely (stopping all video decoding), sh
69
69
  controls
70
70
  options={{
71
71
  audioSrc: "https://example.com/audio-only.m3u8",
72
+ audioPoster: "https://example.com/audio-artwork.jpg",
72
73
  audioModeLabel: "Switch to Audio",
73
74
  videoModeLabel: "Switch to Video",
74
75
  defaultAudioMode: false,
@@ -81,6 +82,40 @@ The audio toggle button only appears in the control bar when `audioSrc` is provi
81
82
 
82
83
  When switching between modes, position, volume, and playback rate are synced automatically — the listener hears no gap.
83
84
 
85
+ ### Audio mode poster
86
+
87
+ Use `audioPoster` to show a different image in audio mode than the video `poster`. If neither `audioPoster` nor `poster` is provided, the `audioModeFallback` content is shown instead:
88
+
89
+ ```tsx
90
+ <VideoPlayer
91
+ src="https://example.com/stream.m3u8"
92
+ poster="https://example.com/video-thumb.jpg"
93
+ options={{
94
+ audioSrc: "https://example.com/audio-only.m3u8",
95
+ // Show a dedicated artwork image in audio mode
96
+ audioPoster: "https://example.com/audio-artwork.jpg",
97
+ }}
98
+ />
99
+ ```
100
+
101
+ Priority order: `audioPoster` → `poster` (if `audioModeFallback` is not set) → `audioModeFallback` → `logo`.
102
+
103
+ Use `audioModeFallback` when you want to render arbitrary React content (e.g. an animated logo or custom component) instead of a static image:
104
+
105
+ ```tsx
106
+ <VideoPlayer
107
+ src="https://example.com/stream.m3u8"
108
+ options={{
109
+ audioSrc: "https://example.com/audio-only.m3u8",
110
+ audioModeFallback: <MyAnimatedArtwork />,
111
+ }}
112
+ />
113
+ ```
114
+
115
+ ### Waveform progress bar
116
+
117
+ In audio mode the normal video progress bar is replaced by a **waveform-style bar graph** — 200 pseudo-random bars that reveal left-to-right as the audio plays. Buffered/preloaded content is shown in a lighter shade behind the played bars. No configuration is needed; the waveform appears automatically whenever audio mode is active.
118
+
84
119
  ### Automatic switching
85
120
 
86
121
  The player uses two independent signals to detect poor conditions and switch to audio mode automatically. Either one firing is enough.
@@ -153,6 +188,18 @@ Hover over the progress bar to see a time tooltip. For rich sprite-sheet thumbna
153
188
  />
154
189
  ```
155
190
 
191
+ If the image paths inside the VTT file are relative, supply `thumbnailVttBaseUrl` so the player can resolve them:
192
+
193
+ ```tsx
194
+ <VideoPlayer
195
+ src="https://example.com/video.mp4"
196
+ options={{
197
+ thumbnailVtt: "/thumbs/storyboard.vtt",
198
+ thumbnailVttBaseUrl: "https://example.com",
199
+ }}
200
+ />
201
+ ```
202
+
156
203
  ### VTT format
157
204
 
158
205
  Each cue in the `.vtt` file maps a time range to a rectangular region inside a sprite image using the `#xywh=x,y,w,h` fragment:
@@ -215,6 +262,7 @@ To disable the preview entirely:
215
262
  |--------|------|---------|-------------|
216
263
  | `enablePreview` | `boolean` | `true` | Show thumbnail / time tooltip on progress bar hover |
217
264
  | `thumbnailVtt` | `string` | — | URL to a WebVTT sprite sheet file for rich thumbnail preview |
265
+ | `thumbnailVttBaseUrl` | `string` | — | Base URL prepended to relative image paths inside the VTT file |
218
266
 
219
267
  ### `options` — UI
220
268
 
@@ -229,12 +277,13 @@ To disable the preview entirely:
229
277
  | `audioSrc` | `string` | — | Audio-only stream URL; the audio toggle button only shows when this is set |
230
278
  | `showAudioButton` | `boolean` | `!!audioSrc` | Force-show or hide the audio toggle button |
231
279
  | `defaultAudioMode` | `boolean` | `false` | Start in audio mode |
280
+ | `audioPoster` | `string` | — | Image shown in audio mode (takes priority over `poster`) |
232
281
  | `audioModeLabel` | `string` | `"Audio"` | Label on the toggle button when in video mode |
233
282
  | `videoModeLabel` | `string` | `"Video"` | Label on the toggle button when in audio mode |
234
283
  | `audioModeIcon` | `ReactNode` | built-in headphones icon | Icon shown when in video mode (click → audio) |
235
284
  | `videoModeIcon` | `ReactNode` | built-in video icon | Icon shown when in audio mode (click → video) |
236
- | `audioModeFallback` | `ReactNode` | — | Custom content shown in audio mode when no `poster` is provided |
237
- | `logo` | `string \| ReactNode` | — | Logo shown in audio mode when no `poster` or `audioModeFallback` is provided |
285
+ | `audioModeFallback` | `ReactNode` | — | Custom React content shown in audio mode when neither `audioPoster` nor `poster` is set |
286
+ | `logo` | `string \| ReactNode` | — | Logo shown in audio mode when no poster or fallback is set |
238
287
  | `audioBandwidthThreshold` | `number` | `300` | Kbps — switch when per-fragment bandwidth average drops below this. `0` = disabled (HLS only) |
239
288
  | `audioModeSwitchLevel` | `number` | — | HLS quality level index — switch when HLS.js drops to this level or below. `0` = lowest. `-1` = disabled |
240
289
  | `audioModeRecoveryInterval` | `number` | `30000` | Ms between recovery probes while in auto-switched audio mode |
@@ -262,10 +311,12 @@ To disable the preview entirely:
262
311
 
263
312
  ## Quality Selection
264
313
 
314
+ ### HLS adaptive quality
315
+
265
316
  For HLS streams (`.m3u8`) the player automatically parses the available quality levels from the manifest. Once levels are available, the **Settings (⚙)** button in the control bar grows a **Speed / Quality** tab bar:
266
317
 
267
318
  - **Speed tab** — always visible, lets you change playback rate.
268
- - **Quality tab** — appears only for HLS streams. Lists all levels sorted by bitrate (e.g. 1080p, 720p, 480p) plus an **Auto** option that enables ABR (adaptive bitrate). The current auto-selected level is shown in parentheses next to "Auto".
319
+ - **Quality tab** — appears for HLS streams. Lists all levels sorted by bitrate (e.g. 1080p, 720p, 480p) plus an **Auto** option that enables ABR (adaptive bitrate). The current auto-selected level is shown in parentheses next to "Auto".
269
320
 
270
321
  You can also switch quality programmatically via the ref:
271
322
 
@@ -274,6 +325,47 @@ playerRef.current?.setQualityLevel(0); // pin to highest level
274
325
  playerRef.current?.setQualityLevel(-1); // back to ABR auto
275
326
  ```
276
327
 
328
+ ### Manual quality selection
329
+
330
+ For non-HLS sources (or when you want to control quality URLs yourself), pass a `manualQualityLevels` array. Each item has a human-readable `label` and the `src` URL to load when the user selects it.
331
+
332
+ ```tsx
333
+ import { VideoPlayer } from "react-helios";
334
+ import type { ManualQualityLevel } from "react-helios";
335
+
336
+ const qualityLevels: ManualQualityLevel[] = [
337
+ { label: "1080p", src: "https://example.com/video-1080p.mp4" },
338
+ { label: "720p", src: "https://example.com/video-720p.mp4" },
339
+ { label: "480p", src: "https://example.com/video-480p.mp4" },
340
+ { label: "360p", src: "https://example.com/video-360p.mp4" },
341
+ ];
342
+
343
+ <VideoPlayer
344
+ src="https://example.com/video-720p.mp4"
345
+ controls
346
+ options={{
347
+ manualQualityLevels: qualityLevels,
348
+ }}
349
+ />
350
+ ```
351
+
352
+ When `manualQualityLevels` is provided, the **Quality tab** appears automatically in the Settings menu. Selecting an option swaps the player `src` and resumes playback at the same position.
353
+
354
+ Use `showQualityMenu: true` to force the Quality tab open even when no quality levels have been detected yet (useful during the initial HLS manifest load):
355
+
356
+ ```tsx
357
+ options={{ showQualityMenu: true }}
358
+ ```
359
+
360
+ Both manual and HLS quality levels can coexist in the same Quality tab — manual levels appear at the top, HLS ABR levels below a divider.
361
+
362
+ ### `options` — Quality
363
+
364
+ | Option | Type | Default | Description |
365
+ |--------|------|---------|-------------|
366
+ | `manualQualityLevels` | `ManualQualityLevel[]` | — | Src-based quality options shown in the Settings → Quality tab |
367
+ | `showQualityMenu` | `boolean` | `false` | Force-show the Quality tab in Settings even before HLS levels are detected |
368
+
277
369
  ## Custom Control Bar Buttons
278
370
 
279
371
  Inject your own icon buttons into the right side of the control bar using `controlBarItems`:
@@ -437,6 +529,7 @@ import type {
437
529
  PlayerState,
438
530
  PlaybackRate,
439
531
  HLSQualityLevel,
532
+ ManualQualityLevel,
440
533
  SubtitleTrack,
441
534
  BufferedRange,
442
535
  VideoError,
@@ -514,6 +607,15 @@ interface ContextMenuItem {
514
607
  }
515
608
  ```
516
609
 
610
+ ### `ManualQualityLevel`
611
+
612
+ ```ts
613
+ interface ManualQualityLevel {
614
+ label: string; // Display name shown in the Settings menu (e.g. "1080p", "HD", "Low")
615
+ src: string; // URL to load when this quality level is selected
616
+ }
617
+ ```
618
+
517
619
  ### `ThumbnailCue`
518
620
 
519
621
  ```ts
package/dist/index.d.mts CHANGED
@@ -117,6 +117,12 @@ interface VideoPlayerRef {
117
117
  getState: () => PlayerState;
118
118
  getVideoElement: () => HTMLVideoElement | null;
119
119
  }
120
+ interface ManualQualityLevel {
121
+ /** Display label shown in the Quality menu, e.g. "360p", "720p", "1080p" */
122
+ label: string;
123
+ /** URL to load when this quality is selected (HLS m3u8 or direct MP4) */
124
+ src: string;
125
+ }
120
126
  interface ContextMenuItem {
121
127
  label: string;
122
128
  onClick: () => void;
@@ -156,6 +162,8 @@ interface VideoPlayerOptions {
156
162
  * The `logo` prop is still rendered on top of this if also provided.
157
163
  */
158
164
  audioModeFallback?: ReactNode;
165
+ /** Poster image shown in the audio mode overlay. Falls back to the video `poster` if not provided. */
166
+ audioPoster?: string;
159
167
  /** Label shown next to the icon when in video mode (click → switches to audio). Default: "Audio" */
160
168
  audioModeLabel?: string;
161
169
  /** Label shown next to the icon when in audio mode (click → switches to video). Default: "Video" */
@@ -188,6 +196,20 @@ interface VideoPlayerOptions {
188
196
  onBuffering?: (isBuffering: boolean) => void;
189
197
  onTheaterModeChange?: (isTheater: boolean) => void;
190
198
  onAudioModeChange?: (isAudio: boolean) => void;
199
+ /** Force-show the Quality tab in the Settings menu (useful with manualQualityLevels). */
200
+ showQualityMenu?: boolean;
201
+ /**
202
+ * Manual quality levels for non-adaptive sources.
203
+ * Each entry has a display label and a src URL to load when selected.
204
+ * Works alongside the automatic HLS quality levels — both can be shown at the same time.
205
+ * @example
206
+ * manualQualityLevels={[
207
+ * { label: "1080p", src: "https://cdn.example.com/video_1080.m3u8" },
208
+ * { label: "720p", src: "https://cdn.example.com/video_720.m3u8" },
209
+ * { label: "360p", src: "https://cdn.example.com/video_360.mp4" },
210
+ * ]}
211
+ */
212
+ manualQualityLevels?: ManualQualityLevel[];
191
213
  contextMenuItems?: ContextMenuItem[];
192
214
  controlBarItems?: ControlBarItem[];
193
215
  }
@@ -225,6 +247,10 @@ interface ControlsProps {
225
247
  isLive: boolean;
226
248
  qualityLevels: HLSQualityLevel[];
227
249
  currentQualityLevel: number;
250
+ showQualityMenu?: boolean;
251
+ manualQualityLevels?: ManualQualityLevel[];
252
+ activeManualSrc?: string;
253
+ onManualQualityChange?: (src: string) => void;
228
254
  controlBarItems?: ControlBarItem[];
229
255
  autoHideControls: boolean;
230
256
  }
@@ -249,6 +275,10 @@ interface SettingsMenuProps {
249
275
  qualityLevels?: HLSQualityLevel[];
250
276
  currentQualityLevel?: number;
251
277
  onQualityChange?: (level: number) => void;
278
+ showQualityMenu?: boolean;
279
+ manualQualityLevels?: ManualQualityLevel[];
280
+ activeManualSrc?: string;
281
+ onManualQualityChange?: (src: string) => void;
252
282
  }
253
283
  declare const SettingsMenu: react.NamedExoticComponent<SettingsMenuProps>;
254
284
 
@@ -373,4 +403,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string, absoluteRootB
373
403
  */
374
404
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
375
405
 
376
- export { AUDIO_BANDWIDTH_THRESHOLDS, AUDIO_SWITCH_LEVELS, type BufferedRange, type ContextMenuItem, type ControlBarItem, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerOptions, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
406
+ export { AUDIO_BANDWIDTH_THRESHOLDS, AUDIO_SWITCH_LEVELS, type BufferedRange, type ContextMenuItem, type ControlBarItem, index as ControlElements, Controls, type HLSQualityLevel, type ManualQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerOptions, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
package/dist/index.d.ts CHANGED
@@ -117,6 +117,12 @@ interface VideoPlayerRef {
117
117
  getState: () => PlayerState;
118
118
  getVideoElement: () => HTMLVideoElement | null;
119
119
  }
120
+ interface ManualQualityLevel {
121
+ /** Display label shown in the Quality menu, e.g. "360p", "720p", "1080p" */
122
+ label: string;
123
+ /** URL to load when this quality is selected (HLS m3u8 or direct MP4) */
124
+ src: string;
125
+ }
120
126
  interface ContextMenuItem {
121
127
  label: string;
122
128
  onClick: () => void;
@@ -156,6 +162,8 @@ interface VideoPlayerOptions {
156
162
  * The `logo` prop is still rendered on top of this if also provided.
157
163
  */
158
164
  audioModeFallback?: ReactNode;
165
+ /** Poster image shown in the audio mode overlay. Falls back to the video `poster` if not provided. */
166
+ audioPoster?: string;
159
167
  /** Label shown next to the icon when in video mode (click → switches to audio). Default: "Audio" */
160
168
  audioModeLabel?: string;
161
169
  /** Label shown next to the icon when in audio mode (click → switches to video). Default: "Video" */
@@ -188,6 +196,20 @@ interface VideoPlayerOptions {
188
196
  onBuffering?: (isBuffering: boolean) => void;
189
197
  onTheaterModeChange?: (isTheater: boolean) => void;
190
198
  onAudioModeChange?: (isAudio: boolean) => void;
199
+ /** Force-show the Quality tab in the Settings menu (useful with manualQualityLevels). */
200
+ showQualityMenu?: boolean;
201
+ /**
202
+ * Manual quality levels for non-adaptive sources.
203
+ * Each entry has a display label and a src URL to load when selected.
204
+ * Works alongside the automatic HLS quality levels — both can be shown at the same time.
205
+ * @example
206
+ * manualQualityLevels={[
207
+ * { label: "1080p", src: "https://cdn.example.com/video_1080.m3u8" },
208
+ * { label: "720p", src: "https://cdn.example.com/video_720.m3u8" },
209
+ * { label: "360p", src: "https://cdn.example.com/video_360.mp4" },
210
+ * ]}
211
+ */
212
+ manualQualityLevels?: ManualQualityLevel[];
191
213
  contextMenuItems?: ContextMenuItem[];
192
214
  controlBarItems?: ControlBarItem[];
193
215
  }
@@ -225,6 +247,10 @@ interface ControlsProps {
225
247
  isLive: boolean;
226
248
  qualityLevels: HLSQualityLevel[];
227
249
  currentQualityLevel: number;
250
+ showQualityMenu?: boolean;
251
+ manualQualityLevels?: ManualQualityLevel[];
252
+ activeManualSrc?: string;
253
+ onManualQualityChange?: (src: string) => void;
228
254
  controlBarItems?: ControlBarItem[];
229
255
  autoHideControls: boolean;
230
256
  }
@@ -249,6 +275,10 @@ interface SettingsMenuProps {
249
275
  qualityLevels?: HLSQualityLevel[];
250
276
  currentQualityLevel?: number;
251
277
  onQualityChange?: (level: number) => void;
278
+ showQualityMenu?: boolean;
279
+ manualQualityLevels?: ManualQualityLevel[];
280
+ activeManualSrc?: string;
281
+ onManualQualityChange?: (src: string) => void;
252
282
  }
253
283
  declare const SettingsMenu: react.NamedExoticComponent<SettingsMenuProps>;
254
284
 
@@ -373,4 +403,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string, absoluteRootB
373
403
  */
374
404
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
375
405
 
376
- export { AUDIO_BANDWIDTH_THRESHOLDS, AUDIO_SWITCH_LEVELS, type BufferedRange, type ContextMenuItem, type ControlBarItem, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerOptions, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
406
+ export { AUDIO_BANDWIDTH_THRESHOLDS, AUDIO_SWITCH_LEVELS, type BufferedRange, type ContextMenuItem, type ControlBarItem, index as ControlElements, Controls, type HLSQualityLevel, type ManualQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerOptions, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var at=require('react'),Ce=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var at__default=/*#__PURE__*/_interopDefault(at);var Ce__default=/*#__PURE__*/_interopDefault(Ce);var ct=Object.defineProperty;var dt=(o,r)=>{for(var i in r)ct(o,i,{get:r[i],enumerable:true});};function me(o){if(!Number.isFinite(o)||o<0)return "0:00";let r=Math.floor(o),i=Math.floor(r/3600),u=Math.floor(r%3600/60),v=r%60;return i>0?`${i}:${String(u).padStart(2,"0")}:${String(v).padStart(2,"0")}`:`${u}:${String(v).padStart(2,"0")}`}function Te(o){try{return new URL(o,"https://x").pathname.toLowerCase().endsWith(".m3u8")||/\/hls\//i.test(o)||/\/stream\.m3u8/i.test(o)}catch{return o.toLowerCase().includes(".m3u8")}}function mt(o){if(Te(o))return "application/x-mpegURL";let r=o.toLowerCase().split("?")[0];return r.endsWith(".mp4")?"video/mp4":r.endsWith(".webm")?"video/webm":r.endsWith(".ogv")||r.endsWith(".ogg")?"video/ogg":r.endsWith(".mov")?"video/quicktime":"video/mp4"}function Ke(o){return o.map((r,i)=>({id:i,height:r.height??0,width:r.width??0,bitrate:r.bitrate??0,name:r.height?`${r.height}p`:`Level ${i+1}`}))}var pt={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isTheaterMode:false,isAudioMode:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function Qe(o,r,i={}){let u=at.useRef(null),v=at.useRef(null),m=at.useRef(1),c=at.useRef(0),g=at.useRef(0),M=at.useRef(r),s=at.useRef(i);s.current=i;let[C,d]=at.useState({...pt,isMuted:i.muted??false,volume:i.muted?0:1,isAudioMode:i.defaultAudioMode??false}),w=at.useRef(C);w.current=C;let D=at.useRef([]),b=at.useRef(0),L=at.useRef(false),F=at.useRef(false),B=at.useRef(null),P=at.useRef(null),x=at.useRef(false),k=at.useCallback(()=>{let e=s.current;return w.current.isAudioMode&&e.audioSrc&&e.audioRef?.current?e.audioRef.current:o.current},[o]);at.useEffect(()=>{let e=o.current;if(!e)return;let t=false;if(u.current&&(u.current.destroy(),u.current=null),c.current=0,g.current=0,D.current=[],b.current=0,L.current=false,F.current=false,B.current&&(clearTimeout(B.current),B.current=null),P.current&&(clearTimeout(P.current),P.current=null),x.current=false,d(a=>({...a,currentTime:0,duration:0,error:null,isPlaying:false,isBuffering:!!r,isLive:false,qualityLevels:[],currentQualityLevel:-1,isAudioMode:s.current.defaultAudioMode??false})),!r)return ()=>{t=true;};let n=s.current;if(n.enableHLS!==false&&Te(r))if(Ce__default.default.isSupported()){let a=new Ce__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...n.hlsConfig});a.attachMedia(e),a.loadSource(r),a.on(Ce.Events.MANIFEST_PARSED,(h,y)=>{if(t)return;let T=Ke(y.levels);d(R=>({...R,qualityLevels:T,currentQualityLevel:-1})),s.current.autoplay&&e.play().catch(()=>{});}),a.on(Ce.Events.LEVEL_SWITCHED,(h,y)=>{if(t)return;d(l=>({...l,currentQualityLevel:y.level}));let T=s.current,R=T.audioModeSwitchLevel;R===void 0||R<0||!T.audioSrc||F.current||b.current<3||d(l=>!l.isAudioMode&&y.level<=R?(L.current=true,s.current.onAudioModeChange?.(true),{...l,isAudioMode:true}):l);}),a.on(Ce.Events.FRAG_LOADED,(h,y)=>{if(t)return;g.current=0;let T=s.current;if(!T.audioSrc)return;b.current+=1;let R=y.stats.loading.end-y.stats.loading.start,l=R>0&&y.stats.total>0?y.stats.total*8/R:0,S=T.audioBandwidthThreshold??300;if(x.current){x.current=false,l>0&&S&&l>S*1.5?(L.current=false,a.startLoad(),s.current.onAudioModeChange?.(false),d(p=>({...p,isAudioMode:false}))):(a.stopLoad(),E());return}if(!S||F.current||l<=0)return;let I=D.current;if(I.push(l),I.length>5&&I.shift(),I.length<2)return;let Q=I.reduce((p,q)=>p+q,0)/I.length;d(p=>!p.isAudioMode&&Q<S?(L.current=true,s.current.onAudioModeChange?.(true),{...p,isAudioMode:true}):p);});let E=()=>{P.current&&clearTimeout(P.current);let h=s.current.audioModeRecoveryInterval??3e4;P.current=setTimeout(()=>{!L.current||!w.current.isAudioMode||(x.current=true,a.startLoad());},h);},f=3;a.on(Ce.Events.ERROR,(h,y)=>{if(!t){if(!y.fatal){console.warn("[hls] non-fatal:",y.details);return}switch(y.type){case Ce__default.default.ErrorTypes.NETWORK_ERROR:if(c.current<f){c.current+=1;let T=1e3*c.current;console.warn(`[hls] network error \u2013 retry ${c.current}/${f} in ${T}ms`),setTimeout(()=>{u.current===a&&a.startLoad();},T);}else {let T={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};d(R=>({...R,error:T})),s.current.onError?.(T);}break;case Ce__default.default.ErrorTypes.MEDIA_ERROR:if(g.current<f)g.current+=1,console.warn(`[hls] media error \u2013 recovery attempt ${g.current}/${f}`),a.recoverMediaError();else {a.destroy(),u.current=null;let T={code:"HLS_FATAL_ERROR",message:"An unrecoverable media error occurred."};d(R=>({...R,error:T})),s.current.onError?.(T);}break;default:{a.destroy(),u.current=null;let T={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};d(R=>({...R,error:T})),s.current.onError?.(T);break}}}}),u.current=a;}else e.canPlayType("application/vnd.apple.mpegurl")&&(e.src=r,e.load(),n.autoplay&&e.play().catch(()=>{}));else e.src=r,e.load(),n.autoplay&&e.play().catch(()=>{});return ()=>{t=true,u.current&&(u.current.destroy(),u.current=null),B.current&&(clearTimeout(B.current),B.current=null),P.current&&(clearTimeout(P.current),P.current=null),x.current=false;let a=s.current.audioRef?.current;a&&(a.pause(),a.removeAttribute("src"),a.load());}},[r,o]),at.useEffect(()=>{let e=o.current;if(!e)return;s.current.muted&&(e.muted=true),s.current.loop&&(e.loop=true);let t=()=>{d(p=>({...p,isPlaying:true})),s.current.onPlay?.();},n=()=>{d(p=>({...p,isPlaying:false})),s.current.onPause?.();},a=()=>{d(p=>({...p,isPlaying:false})),s.current.onEnded?.();},E=()=>{w.current.isAudioMode&&s.current.audioSrc||s.current.onTimeUpdate?.(e.currentTime);},f=()=>{let p=e.duration,q=!Number.isFinite(p);d(de=>({...de,duration:q?0:p,isLive:q})),q||s.current.onDurationChange?.(p);},h=()=>{let p=e.volume;p>0&&!e.muted&&(m.current=p),d(q=>({...q,volume:p,isMuted:e.muted||p===0}));},y=()=>{d(p=>({...p,playbackRate:e.playbackRate}));},T=()=>{let p=e.error;if(!p||u.current)return;let de={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[p.code]??"UNKNOWN",message:p.message||"Unknown media error"};d(He=>({...He,error:de})),s.current.onError?.(de);},R=()=>{d(p=>({...p,isBuffering:true})),s.current.onBuffering?.(true);},l=()=>{d(p=>({...p,isBuffering:false})),s.current.onBuffering?.(false);},S=()=>d(p=>({...p,isBuffering:false})),I=()=>{let p=!!(document.fullscreenElement||document.webkitFullscreenElement);d(q=>({...q,isFullscreen:p}));},Q=()=>{d(p=>({...p,isPictureInPicture:document.pictureInPictureElement===e}));};return e.addEventListener("play",t),e.addEventListener("pause",n),e.addEventListener("ended",a),e.addEventListener("timeupdate",E),e.addEventListener("durationchange",f),e.addEventListener("volumechange",h),e.addEventListener("ratechange",y),e.addEventListener("error",T),e.addEventListener("waiting",R),e.addEventListener("canplay",l),e.addEventListener("playing",S),document.addEventListener("fullscreenchange",I),document.addEventListener("webkitfullscreenchange",I),e.addEventListener("enterpictureinpicture",Q),e.addEventListener("leavepictureinpicture",Q),()=>{e.removeEventListener("play",t),e.removeEventListener("pause",n),e.removeEventListener("ended",a),e.removeEventListener("timeupdate",E),e.removeEventListener("durationchange",f),e.removeEventListener("volumechange",h),e.removeEventListener("ratechange",y),e.removeEventListener("error",T),e.removeEventListener("waiting",R),e.removeEventListener("canplay",l),e.removeEventListener("playing",S),document.removeEventListener("fullscreenchange",I),document.removeEventListener("webkitfullscreenchange",I),e.removeEventListener("enterpictureinpicture",Q),e.removeEventListener("leavepictureinpicture",Q);}},[o]),at.useEffect(()=>{let e=s.current.audioRef?.current;if(!e||!s.current.audioSrc)return;let t=()=>{d(l=>({...l,isPlaying:true})),s.current.onPlay?.();},n=()=>{d(l=>({...l,isPlaying:false})),s.current.onPause?.();},a=()=>{d(l=>({...l,isPlaying:false})),s.current.onEnded?.();},E=()=>{d(l=>({...l,isBuffering:true})),s.current.onBuffering?.(true);},f=()=>{d(l=>({...l,isBuffering:false})),s.current.onBuffering?.(false);},h=()=>d(l=>({...l,isBuffering:false})),y=()=>{w.current.isAudioMode&&s.current.onTimeUpdate?.(e.currentTime);},T=()=>{let l=e.duration;isFinite(l)&&(d(S=>({...S,duration:l})),s.current.onDurationChange?.(l));},R=()=>{let l={code:"MEDIA_ERR_NETWORK",message:"Audio source failed to load."};d(S=>({...S,error:l})),s.current.onError?.(l);};return e.addEventListener("play",t),e.addEventListener("pause",n),e.addEventListener("ended",a),e.addEventListener("waiting",E),e.addEventListener("canplay",f),e.addEventListener("playing",h),e.addEventListener("timeupdate",y),e.addEventListener("durationchange",T),e.addEventListener("error",R),()=>{e.removeEventListener("play",t),e.removeEventListener("pause",n),e.removeEventListener("ended",a),e.removeEventListener("waiting",E),e.removeEventListener("canplay",f),e.removeEventListener("playing",h),e.removeEventListener("timeupdate",y),e.removeEventListener("durationchange",T),e.removeEventListener("error",R);}},[r]),at.useEffect(()=>{let e=s.current,t=o.current,n=e.audioRef?.current;if(!(!t||!n||!e.audioSrc)){if(M.current!==r){M.current=r;return}if(M.current=r,C.isAudioMode){let a=t.currentTime,E=!t.paused;if(t.pause(),u.current?.stopLoad(),n.getAttribute("src")||(n.src=e.audioSrc),n.currentTime=a,n.volume=t.volume,n.muted=t.muted,n.playbackRate=t.playbackRate,E&&n.play().catch(()=>{}),L.current){P.current&&clearTimeout(P.current);let f=e.audioModeRecoveryInterval??3e4;P.current=setTimeout(()=>{!L.current||!w.current.isAudioMode||(x.current=true,u.current?.startLoad());},f);}}else {let a=n.currentTime,E=!n.paused;n.pause(),P.current&&(clearTimeout(P.current),P.current=null),x.current=false,u.current?.startLoad(),t.currentTime=a,t.volume=n.volume,E&&t.play().catch(()=>{});}}},[C.isAudioMode,o,r]);let A=at.useCallback(async()=>{let e=k();if(e)try{await e.play();}catch(t){t instanceof Error&&t.name!=="AbortError"&&console.error("[player] play() failed:",t);}},[k]),_=at.useCallback(()=>{k()?.pause();},[k]),K=at.useCallback(e=>{let t=k();t&&(t.currentTime=Math.max(0,Math.min(e,t.duration||e)));},[k]),re=at.useCallback(e=>{let t=k();if(!t)return;let n=Math.max(0,Math.min(e,1));n>0&&(m.current=n),t.volume=n,t.muted=n===0;},[k]),J=at.useCallback(()=>{let e=k();if(e)if(e.muted||e.volume===0){let t=m.current>0?m.current:1;e.volume=t,e.muted=false;}else m.current=e.volume,e.muted=true;},[k]),N=at.useCallback(e=>{let t=o.current;t&&(t.playbackRate=e);let n=s.current.audioRef?.current;n&&(n.playbackRate=e);},[o]),V=at.useCallback(e=>{let t=u.current;t&&(t.currentLevel=e,d(n=>({...n,currentQualityLevel:e})));},[]),$=at.useCallback(()=>{let e=u.current,t=o.current;if(!e||!t)return;let n=e.liveSyncPosition;n!=null&&Number.isFinite(n)&&(t.currentTime=n);},[o]),ee=at.useCallback(async()=>{let e=o.current;if(!e)return;let t=v.current??e.parentElement;if(t)try{!document.fullscreenElement&&!document.webkitFullscreenElement?t.requestFullscreen?await t.requestFullscreen():t.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(n){console.error("[player] fullscreen toggle failed:",n);}},[o]),ne=at.useCallback(async()=>{let e=o.current;if(e)try{document.pictureInPictureElement?await document.exitPictureInPicture():await e.requestPictureInPicture();}catch(t){console.error("[player] PiP toggle failed:",t);}},[o]),oe=at.useCallback(()=>{let e=!w.current.isTheaterMode;d(t=>({...t,isTheaterMode:e})),s.current.onTheaterModeChange?.(e);},[]),ie=at.useCallback(()=>{B.current&&clearTimeout(B.current),L.current=false,F.current=true,B.current=setTimeout(()=>{F.current=false,D.current=[];},6e4);let e=!w.current.isAudioMode;d(t=>({...t,isAudioMode:e})),s.current.onAudioModeChange?.(e);},[]),ae=at.useCallback(()=>{let e=k(),t=e?.currentTime??0,n=[];if(e)for(let a=0;a<e.buffered.length;a++)n.push({start:e.buffered.start(a),end:e.buffered.end(a)});return {...w.current,currentTime:t,bufferedRanges:n}},[k]),se=at.useCallback(()=>o.current??null,[o]),ce=at.useMemo(()=>({play:A,pause:_,seek:K,setVolume:re,toggleMute:J,setPlaybackRate:N,setQualityLevel:V,seekToLive:$,toggleFullscreen:ee,togglePictureInPicture:ne,toggleTheaterMode:oe,toggleAudioMode:ie,getState:ae,getVideoElement:se}),[A,_,K,re,J,N,V,$,ee,ne,oe,ie,ae,se]);return {state:C,ref:ce,hlsRef:u,fullscreenContainerRef:v}}var tt={};dt(tt,{ControlElements:()=>G,FullscreenButton:()=>Ee,PauseButton:()=>ye,PiPButton:()=>Me,PlayButton:()=>be,ProgressBar:()=>we,SettingsMenu:()=>Se,TheaterButton:()=>Le,TimeDisplay:()=>Ae,VolumeControl:()=>xe});var be=at.memo(({onClick:o})=>jsxRuntime.jsx("button",{onClick:o,className:"controlButton","aria-label":"Play",title:"Play (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M8 5v14l11-7z"})})}));be.displayName="PlayButton";var ye=at.memo(({onClick:o})=>jsxRuntime.jsx("button",{onClick:o,className:"controlButton","aria-label":"Pause",title:"Pause (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}));ye.displayName="PauseButton";var Ee=at.memo(({onClick:o,isFullscreen:r=false})=>jsxRuntime.jsx("button",{onClick:o,className:"controlButton","aria-label":r?"Exit Fullscreen":"Fullscreen",title:r?"Exit Fullscreen (F)":"Fullscreen (F)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:r?jsxRuntime.jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"}):jsxRuntime.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})}));Ee.displayName="FullscreenButton";var Me=at.memo(({onClick:o,isPiP:r=false})=>jsxRuntime.jsx("button",{onClick:o,className:"controlButton","aria-label":r?"Exit Picture-in-Picture":"Picture-in-Picture",title:r?"Exit Picture-in-Picture (P)":"Picture-in-Picture (P)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V5h18v14.02z"})})}));Me.displayName="PiPButton";var Le=at.memo(({onClick:o,isTheater:r=false})=>jsxRuntime.jsx("button",{onClick:o,className:"controlButton","aria-label":r?"Exit Theater Mode":"Theater Mode",title:r?"Exit Theater Mode (T)":"Theater Mode (T)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:r?jsxRuntime.jsx("path",{d:"M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z"}):jsxRuntime.jsx("path",{d:"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z"})})}));Le.displayName="TheaterButton";var qe=at.memo(({volume:o,isMuted:r,onVolumeChange:i,onToggleMute:u})=>{let[v,m]=at.useState(false),c=r?0:o,g=c*100,M=at.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${g}%, rgba(255,255,255,0.3) ${g}%, rgba(255,255,255,0.3) 100%)`,[g]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>m(true),onMouseLeave:()=>m(false),children:[jsxRuntime.jsx("button",{onClick:u,className:"controlButton","aria-label":r?"Unmute":"Mute",title:r?"Unmute (M)":"Mute (M)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:c===0?jsxRuntime.jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C23.16 14.42 24 13.3 24 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"}):c<.5?jsxRuntime.jsx("path",{d:"M7 9v6h4l5 5V4l-5 5H7z"}):jsxRuntime.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})})}),v&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:g,onChange:s=>i(Number(s.target.value)/100),className:"volumeSlider",style:{background:M},"aria-label":"Volume","aria-valuenow":Math.round(g)})]})});qe.displayName="VolumeControl";var xe=qe;function Xe(o){let r=o.trim().split(":");return r.length===3?+r[0]*3600+ +r[1]*60+parseFloat(r[2]):+r[0]*60+parseFloat(r[1])}function Et(o,r,i){if(/^https?:\/\//i.test(r))return r;if(r.startsWith("/")&&i)return i.replace(/\/+$/,"")+r;try{return new URL(r,o).href}catch{return r}}function Ve(o,r="",i){let u=[],v=o.replace(/\r\n/g,`
1
+ 'use strict';var Lt=require('react'),be=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Lt__default=/*#__PURE__*/_interopDefault(Lt);var be__default=/*#__PURE__*/_interopDefault(be);var wt=Object.defineProperty;var kt=(r,n)=>{for(var o in n)wt(r,o,{get:n[o],enumerable:true});};function ge(r){if(!Number.isFinite(r)||r<0)return "0:00";let n=Math.floor(r),o=Math.floor(n/3600),l=Math.floor(n%3600/60),c=n%60;return o>0?`${o}:${String(l).padStart(2,"0")}:${String(c).padStart(2,"0")}`:`${l}:${String(c).padStart(2,"0")}`}function Le(r){try{return new URL(r,"https://x").pathname.toLowerCase().endsWith(".m3u8")||/\/hls\//i.test(r)||/\/stream\.m3u8/i.test(r)}catch{return r.toLowerCase().includes(".m3u8")}}function xt(r){if(Le(r))return "application/x-mpegURL";let n=r.toLowerCase().split("?")[0];return n.endsWith(".mp4")?"video/mp4":n.endsWith(".webm")?"video/webm":n.endsWith(".ogv")||n.endsWith(".ogg")?"video/ogg":n.endsWith(".mov")?"video/quicktime":"video/mp4"}function nt(r){return r.map((n,o)=>({id:o,height:n.height??0,width:n.width??0,bitrate:n.bitrate??0,name:n.height?`${n.height}p`:`Level ${o+1}`}))}var Nt={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isTheaterMode:false,isAudioMode:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function rt(r,n,o={}){let l=Lt.useRef(null),c=Lt.useRef(null),p=Lt.useRef(null),f=Lt.useRef(1),P=Lt.useRef(0),T=Lt.useRef(0),x=Lt.useRef(n),u=Lt.useRef(o);u.current=o;let[N,h]=Lt.useState({...Nt,isMuted:o.muted??false,volume:o.muted?0:1,isAudioMode:o.defaultAudioMode??false}),w=Lt.useRef(N);w.current=N;let V=Lt.useRef([]),A=Lt.useRef(0),H=Lt.useRef(false),D=Lt.useRef(false),B=Lt.useRef(null),k=Lt.useRef(null),F=Lt.useRef(false),C=Lt.useCallback(()=>{let e=u.current;return w.current.isAudioMode&&e.audioSrc&&e.audioRef?.current?e.audioRef.current:r.current},[r]);Lt.useEffect(()=>{let e=r.current;if(!e)return;let s=false;if(l.current&&(l.current.destroy(),l.current=null),P.current=0,T.current=0,V.current=[],A.current=0,H.current=false,D.current=false,B.current&&(clearTimeout(B.current),B.current=null),k.current&&(clearTimeout(k.current),k.current=null),F.current=false,h(t=>({...t,currentTime:0,duration:0,error:null,isPlaying:false,isBuffering:!!n,isLive:false,qualityLevels:[],currentQualityLevel:-1,isAudioMode:u.current.defaultAudioMode??false})),!n)return ()=>{s=true;};let d=u.current;if(d.enableHLS!==false&&Le(n))if(be__default.default.isSupported()){let t=new be__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...d.hlsConfig});t.attachMedia(e),t.loadSource(n),t.on(be.Events.MANIFEST_PARSED,(E,y)=>{if(s)return;let i=nt(y.levels);h(v=>({...v,qualityLevels:i,currentQualityLevel:-1})),u.current.autoplay&&e.play().catch(()=>{});}),t.on(be.Events.LEVEL_SWITCHED,(E,y)=>{if(s)return;h(b=>({...b,currentQualityLevel:y.level}));let i=u.current,v=i.audioModeSwitchLevel;v===void 0||v<0||!i.audioSrc||D.current||A.current<3||h(b=>!b.isAudioMode&&y.level<=v?(H.current=true,u.current.onAudioModeChange?.(true),{...b,isAudioMode:true}):b);}),t.on(be.Events.FRAG_LOADED,(E,y)=>{if(s)return;T.current=0;let i=u.current;if(!i.audioSrc)return;A.current+=1;let v=y.stats.loading.end-y.stats.loading.start,b=v>0&&y.stats.total>0?y.stats.total*8/v:0,z=i.audioBandwidthThreshold??300;if(F.current){F.current=false,b>0&&z&&b>z*1.5?(H.current=false,t.startLoad(),u.current.onAudioModeChange?.(false),h(M=>({...M,isAudioMode:false}))):(t.stopLoad(),a());return}if(!z||D.current||b<=0)return;let $=V.current;if($.push(b),$.length>5&&$.shift(),$.length<2)return;let ne=$.reduce((M,W)=>M+W,0)/$.length;h(M=>!M.isAudioMode&&ne<z?(H.current=true,u.current.onAudioModeChange?.(true),{...M,isAudioMode:true}):M);});let a=()=>{k.current&&clearTimeout(k.current);let E=u.current.audioModeRecoveryInterval??3e4;k.current=setTimeout(()=>{!H.current||!w.current.isAudioMode||(F.current=true,t.startLoad());},E);},m=3;t.on(be.Events.ERROR,(E,y)=>{if(!s){if(!y.fatal){console.warn("[hls] non-fatal:",y.details);return}switch(y.type){case be__default.default.ErrorTypes.NETWORK_ERROR:if(P.current<m){P.current+=1;let i=1e3*P.current;console.warn(`[hls] network error \u2013 retry ${P.current}/${m} in ${i}ms`),setTimeout(()=>{l.current===t&&t.startLoad();},i);}else {let i={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};h(v=>({...v,error:i})),u.current.onError?.(i);}break;case be__default.default.ErrorTypes.MEDIA_ERROR:if(T.current<m)T.current+=1,console.warn(`[hls] media error \u2013 recovery attempt ${T.current}/${m}`),t.recoverMediaError();else {t.destroy(),l.current=null;let i={code:"HLS_FATAL_ERROR",message:"An unrecoverable media error occurred."};h(v=>({...v,error:i})),u.current.onError?.(i);}break;default:{t.destroy(),l.current=null;let i={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};h(v=>({...v,error:i})),u.current.onError?.(i);break}}}}),l.current=t;}else e.canPlayType("application/vnd.apple.mpegurl")&&(e.src=n,e.load(),d.autoplay&&e.play().catch(()=>{}));else e.src=n,e.load(),d.autoplay&&e.play().catch(()=>{});return ()=>{s=true,l.current&&(l.current.destroy(),l.current=null),B.current&&(clearTimeout(B.current),B.current=null),k.current&&(clearTimeout(k.current),k.current=null),F.current=false,c.current&&(c.current.destroy(),c.current=null);let t=u.current.audioRef?.current;t&&(t.pause(),t.removeAttribute("src"),t.load());}},[n,r]),Lt.useEffect(()=>{let e=r.current;if(!e)return;u.current.muted&&(e.muted=true),u.current.loop&&(e.loop=true);let s=()=>{h(M=>({...M,isPlaying:true})),u.current.onPlay?.();},d=()=>{h(M=>({...M,isPlaying:false})),u.current.onPause?.();},t=()=>{h(M=>({...M,isPlaying:false})),u.current.onEnded?.();},a=()=>{w.current.isAudioMode&&u.current.audioSrc||u.current.onTimeUpdate?.(e.currentTime);},m=()=>{let M=e.duration,W=!Number.isFinite(M);h(ve=>({...ve,duration:W?0:M,isLive:W})),W||u.current.onDurationChange?.(M);},E=()=>{let M=e.volume;M>0&&!e.muted&&(f.current=M),h(W=>({...W,volume:M,isMuted:e.muted||M===0}));},y=()=>{h(M=>({...M,playbackRate:e.playbackRate}));},i=()=>{let M=e.error;if(!M||l.current)return;let ve={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[M.code]??"UNKNOWN",message:M.message||"Unknown media error"};h(Qe=>({...Qe,error:ve})),u.current.onError?.(ve);},v=()=>{h(M=>({...M,isBuffering:true})),u.current.onBuffering?.(true);},b=()=>{h(M=>({...M,isBuffering:false})),u.current.onBuffering?.(false);},z=()=>h(M=>({...M,isBuffering:false})),$=()=>{let M=!!(document.fullscreenElement||document.webkitFullscreenElement);h(W=>({...W,isFullscreen:M}));},ne=()=>{h(M=>({...M,isPictureInPicture:document.pictureInPictureElement===e}));};return e.addEventListener("play",s),e.addEventListener("pause",d),e.addEventListener("ended",t),e.addEventListener("timeupdate",a),e.addEventListener("durationchange",m),e.addEventListener("volumechange",E),e.addEventListener("ratechange",y),e.addEventListener("error",i),e.addEventListener("waiting",v),e.addEventListener("canplay",b),e.addEventListener("playing",z),document.addEventListener("fullscreenchange",$),document.addEventListener("webkitfullscreenchange",$),e.addEventListener("enterpictureinpicture",ne),e.addEventListener("leavepictureinpicture",ne),()=>{e.removeEventListener("play",s),e.removeEventListener("pause",d),e.removeEventListener("ended",t),e.removeEventListener("timeupdate",a),e.removeEventListener("durationchange",m),e.removeEventListener("volumechange",E),e.removeEventListener("ratechange",y),e.removeEventListener("error",i),e.removeEventListener("waiting",v),e.removeEventListener("canplay",b),e.removeEventListener("playing",z),document.removeEventListener("fullscreenchange",$),document.removeEventListener("webkitfullscreenchange",$),e.removeEventListener("enterpictureinpicture",ne),e.removeEventListener("leavepictureinpicture",ne);}},[r]),Lt.useEffect(()=>{let e=u.current.audioRef?.current;if(!e||!u.current.audioSrc)return;let s=()=>{h(b=>({...b,isPlaying:true})),u.current.onPlay?.();},d=()=>{h(b=>({...b,isPlaying:false})),u.current.onPause?.();},t=()=>{h(b=>({...b,isPlaying:false})),u.current.onEnded?.();},a=()=>{h(b=>({...b,isBuffering:true})),u.current.onBuffering?.(true);},m=()=>{h(b=>({...b,isBuffering:false})),u.current.onBuffering?.(false);},E=()=>h(b=>({...b,isBuffering:false})),y=()=>{w.current.isAudioMode&&u.current.onTimeUpdate?.(e.currentTime);},i=()=>{let b=e.duration;isFinite(b)&&(h(z=>({...z,duration:b})),u.current.onDurationChange?.(b));},v=()=>{if(c.current)return;let b={code:"MEDIA_ERR_NETWORK",message:"Audio source failed to load."};h(z=>({...z,error:b})),u.current.onError?.(b);};return e.addEventListener("play",s),e.addEventListener("pause",d),e.addEventListener("ended",t),e.addEventListener("waiting",a),e.addEventListener("canplay",m),e.addEventListener("playing",E),e.addEventListener("timeupdate",y),e.addEventListener("durationchange",i),e.addEventListener("error",v),()=>{e.removeEventListener("play",s),e.removeEventListener("pause",d),e.removeEventListener("ended",t),e.removeEventListener("waiting",a),e.removeEventListener("canplay",m),e.removeEventListener("playing",E),e.removeEventListener("timeupdate",y),e.removeEventListener("durationchange",i),e.removeEventListener("error",v);}},[n]),Lt.useEffect(()=>{let e=u.current,s=r.current,d=e.audioRef?.current;if(!(!s||!d||!e.audioSrc)){if(x.current!==n){x.current=n;return}if(x.current=n,N.isAudioMode){let t=s.currentTime,a=!s.paused,m=s.volume,E=s.muted,y=s.playbackRate;if(s.pause(),l.current?.stopLoad(),Le(e.audioSrc)&&be__default.default.isSupported())if(c.current)d.currentTime=t,a&&d.play().catch(()=>{});else {let i=new be__default.default({autoStartLoad:true,startLevel:-1,enableWorker:true,maxBufferLength:30,...e.hlsConfig});i.attachMedia(d),i.loadSource(e.audioSrc),i.once(be.Events.MANIFEST_PARSED,()=>{d.currentTime=t,d.volume=m,d.muted=E,d.playbackRate=y,a&&d.play().catch(()=>{});}),c.current=i;}else d.getAttribute("src")||(d.src=e.audioSrc),d.currentTime=t,d.volume=m,d.muted=E,d.playbackRate=y,a&&d.play().catch(()=>{});if(H.current){k.current&&clearTimeout(k.current);let i=e.audioModeRecoveryInterval??3e4;k.current=setTimeout(()=>{!H.current||!w.current.isAudioMode||(F.current=true,l.current?.startLoad());},i);}}else {let t=d.currentTime,a=!d.paused;d.pause(),c.current&&(c.current.destroy(),c.current=null,d.removeAttribute("src"),d.load()),k.current&&(clearTimeout(k.current),k.current=null),F.current=false,l.current?.startLoad(),s.currentTime=t,s.volume=d.volume,a&&s.play().catch(()=>{});}}},[N.isAudioMode,r,n]);let g=Lt.useCallback(async()=>{let e=C();if(e)try{await e.play();}catch(s){s instanceof Error&&s.name!=="AbortError"&&console.error("[player] play() failed:",s);}},[C]),R=Lt.useCallback(()=>{C()?.pause();},[C]),te=Lt.useCallback(e=>{let s=C();s&&(s.currentTime=Math.max(0,Math.min(e,s.duration||e)));},[C]),G=Lt.useCallback(e=>{let s=C();if(!s)return;let d=Math.max(0,Math.min(e,1));d>0&&(f.current=d),s.volume=d,s.muted=d===0;},[C]),de=Lt.useCallback(()=>{let e=C();if(e)if(e.muted||e.volume===0){let s=f.current>0?f.current:1;e.volume=s,e.muted=false;}else f.current=e.volume,e.muted=true;},[C]),ie=Lt.useCallback(e=>{let s=r.current;s&&(s.playbackRate=e);let d=u.current.audioRef?.current;d&&(d.playbackRate=e);},[r]),se=Lt.useCallback(e=>{let s=l.current;s&&(s.currentLevel=e,h(d=>({...d,currentQualityLevel:e})));},[]),_=Lt.useCallback(()=>{let e=l.current,s=r.current;if(!e||!s)return;let d=e.liveSyncPosition;d!=null&&Number.isFinite(d)&&(s.currentTime=d);},[r]),I=Lt.useCallback(async()=>{let e=r.current;if(!e)return;let s=p.current??e.parentElement;if(s)try{!document.fullscreenElement&&!document.webkitFullscreenElement?s.requestFullscreen?await s.requestFullscreen():s.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(d){console.error("[player] fullscreen toggle failed:",d);}},[r]),le=Lt.useCallback(async()=>{let e=r.current;if(e)try{document.pictureInPictureElement?await document.exitPictureInPicture():await e.requestPictureInPicture();}catch(s){console.error("[player] PiP toggle failed:",s);}},[r]),Y=Lt.useCallback(()=>{let e=!w.current.isTheaterMode;h(s=>({...s,isTheaterMode:e})),u.current.onTheaterModeChange?.(e);},[]),ue=Lt.useCallback(()=>{B.current&&clearTimeout(B.current),H.current=false,D.current=true,B.current=setTimeout(()=>{D.current=false,V.current=[];},6e4);let e=!w.current.isAudioMode;h(s=>({...s,isAudioMode:e})),u.current.onAudioModeChange?.(e);},[]),me=Lt.useCallback(()=>{let e=C(),s=e?.currentTime??0,d=[];if(e)for(let t=0;t<e.buffered.length;t++)d.push({start:e.buffered.start(t),end:e.buffered.end(t)});return {...w.current,currentTime:s,bufferedRanges:d}},[C]),fe=Lt.useCallback(()=>r.current??null,[r]),he=Lt.useMemo(()=>({play:g,pause:R,seek:te,setVolume:G,toggleMute:de,setPlaybackRate:ie,setQualityLevel:se,seekToLive:_,toggleFullscreen:I,togglePictureInPicture:le,toggleTheaterMode:Y,toggleAudioMode:ue,getState:me,getVideoElement:fe}),[g,R,te,G,de,ie,se,_,I,le,Y,ue,me,fe]);return {state:N,ref:he,hlsRef:l,fullscreenContainerRef:p}}var ht={};kt(ht,{ControlElements:()=>re,FullscreenButton:()=>Re,PauseButton:()=>Ce,PiPButton:()=>we,PlayButton:()=>Te,ProgressBar:()=>De,SettingsMenu:()=>Ve,TheaterButton:()=>ke,TimeDisplay:()=>Oe,VolumeControl:()=>Ae});var Te=Lt.memo(({onClick:r})=>jsxRuntime.jsx("button",{onClick:r,className:"controlButton","aria-label":"Play",title:"Play (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M8 5v14l11-7z"})})}));Te.displayName="PlayButton";var Ce=Lt.memo(({onClick:r})=>jsxRuntime.jsx("button",{onClick:r,className:"controlButton","aria-label":"Pause",title:"Pause (Space)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"})})}));Ce.displayName="PauseButton";var Re=Lt.memo(({onClick:r,isFullscreen:n=false})=>jsxRuntime.jsx("button",{onClick:r,className:"controlButton","aria-label":n?"Exit Fullscreen":"Fullscreen",title:n?"Exit Fullscreen (F)":"Fullscreen (F)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:n?jsxRuntime.jsx("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"}):jsxRuntime.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})}));Re.displayName="FullscreenButton";var we=Lt.memo(({onClick:r,isPiP:n=false})=>jsxRuntime.jsx("button",{onClick:r,className:"controlButton","aria-label":n?"Exit Picture-in-Picture":"Picture-in-Picture",title:n?"Exit Picture-in-Picture (P)":"Picture-in-Picture (P)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19 11h-8v6h8v-6zm4 8V4.98C23 3.88 22.1 3 21 3H3c-1.1 0-2 .88-2 1.98V19c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zm-2 .02H3V5h18v14.02z"})})}));we.displayName="PiPButton";var ke=Lt.memo(({onClick:r,isTheater:n=false})=>jsxRuntime.jsx("button",{onClick:r,className:"controlButton","aria-label":n?"Exit Theater Mode":"Theater Mode",title:n?"Exit Theater Mode (T)":"Theater Mode (T)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:n?jsxRuntime.jsx("path",{d:"M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z"}):jsxRuntime.jsx("path",{d:"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14z"})})}));ke.displayName="TheaterButton";var ot=Lt.memo(({volume:r,isMuted:n,onVolumeChange:o,onToggleMute:l})=>{let[c,p]=Lt.useState(false),f=n?0:r,P=f*100,T=Lt.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${P}%, rgba(255,255,255,0.3) ${P}%, rgba(255,255,255,0.3) 100%)`,[P]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>p(true),onMouseLeave:()=>p(false),children:[jsxRuntime.jsx("button",{onClick:l,className:"controlButton","aria-label":n?"Unmute":"Mute",title:n?"Unmute (M)":"Mute (M)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:f===0?jsxRuntime.jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C23.16 14.42 24 13.3 24 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z"}):f<.5?jsxRuntime.jsx("path",{d:"M7 9v6h4l5 5V4l-5 5H7z"}):jsxRuntime.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"})})}),c&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:P,onChange:x=>o(Number(x.target.value)/100),className:"volumeSlider",style:{background:T},"aria-label":"Volume","aria-valuenow":Math.round(P)})]})});ot.displayName="VolumeControl";var Ae=ot;function at(r){let n=r.trim().split(":");return n.length===3?+n[0]*3600+ +n[1]*60+parseFloat(n[2]):+n[0]*60+parseFloat(n[1])}function It(r,n,o){if(/^https?:\/\//i.test(n))return n;if(n.startsWith("/")&&o)return o.replace(/\/+$/,"")+n;try{return new URL(n,r).href}catch{return n}}function $e(r,n="",o){let l=[],c=r.replace(/\r\n/g,`
2
2
  `).split(`
3
- `),m=0;for(;m<v.length;){let c=v[m].trim();if(c.includes("-->")){let g=c.indexOf("-->"),M=Xe(c.slice(0,g)),s=Xe(c.slice(g+3));for(m++;m<v.length&&!v[m].trim();)m++;if(m<v.length){let C=v[m].trim(),d=C.lastIndexOf("#xywh="),w=C,D=0,b=0,L=160,F=90;if(d!==-1){w=C.slice(0,d);let B=C.slice(d+6).split(",").map(Number);D=B[0]??0,b=B[1]??0,L=B[2]??160,F=B[3]??90;}u.push({start:M,end:s,url:Et(r,w,i),x:D,y:b,w:L,h:F});}}m++;}return u}function Ie(o,r){if(!o.length)return null;let i=0,u=o.length-1;for(;i<=u;){let v=i+u>>1;if(o[v].end<=r)i=v+1;else if(o[v].start>r)u=v-1;else return o[v]}return null}var je=at.memo(({videoRef:o,playerRef:r,enablePreview:i=true,thumbnailVtt:u,thumbnailVttBaseUrl:v,isAudioMode:m=false})=>{let c=at.useRef(null),g=at.useRef(null),M=at.useRef(null),s=at.useRef(null),C=at.useRef(null),d=at.useRef(null),w=at.useRef(null),[D,b]=at.useState([]),L=at.useRef(false),F=at.useRef(0),B=at.useRef(0),P=at.useRef(null),x=at.useRef([]),k=at.useRef(null);at.useEffect(()=>{let t=()=>{k.current=null;};return window.addEventListener("resize",t,{passive:true}),()=>window.removeEventListener("resize",t)},[]);let A=at.useCallback(()=>(!k.current&&c.current&&(k.current=c.current.getBoundingClientRect()),k.current),[]);at.useEffect(()=>{if(!u){x.current=[];return}let t=false;return fetch(u).then(n=>n.text()).then(n=>{t||(x.current=Ve(n,u,v));}).catch(()=>{t||(x.current=[]);}),()=>{t=true;}},[u]),at.useEffect(()=>{let t=o.current;if(!t)return;let n=()=>{let a=isFinite(t.duration)?t.duration:0,E=t.currentTime,f=a>0?E/a*100:0;g.current&&(g.current.style.width=`${f}%`),M.current&&(M.current.style.left=`${f}%`),c.current&&(c.current.setAttribute("aria-valuenow",String(Math.round(E))),c.current.setAttribute("aria-valuemax",String(Math.round(a))),c.current.setAttribute("aria-valuetext",me(E)));};return t.addEventListener("timeupdate",n),t.addEventListener("durationchange",n),t.addEventListener("seeked",n),n(),()=>{t.removeEventListener("timeupdate",n),t.removeEventListener("durationchange",n),t.removeEventListener("seeked",n);}},[o,m]),at.useEffect(()=>{let t=o.current;if(!t)return;let n=()=>{let a=[];for(let E=0;E<t.buffered.length;E++)a.push({start:t.buffered.start(E),end:t.buffered.end(E)});b(a);};return t.addEventListener("progress",n),()=>t.removeEventListener("progress",n)},[o,m]);let _=at.useCallback(()=>{L.current=true,M.current?.classList.add("dragging");},[]),K=at.useCallback(()=>{L.current=false,M.current?.classList.remove("dragging");},[]),re=at.useCallback(()=>{i&&(k.current=null,s.current&&(s.current.style.display="block"),d.current&&(d.current.style.display="block"));},[i]),J=at.useCallback(()=>{s.current&&(s.current.style.display="none"),d.current&&(d.current.style.display="none");},[]),N=at.useCallback(t=>{if(!w.current||!x.current.length)return;let n=Ie(x.current,t);if(P.current=n,!n)return;let a=w.current;a.style.backgroundImage=`url(${n.url})`,a.style.backgroundPosition=`-${n.x}px -${n.y}px`,a.style.width=`${n.w}px`,a.style.height=`${n.h}px`;},[]),V=at.useCallback(t=>{let n=A(),a=o.current?.duration;return !n||n.width===0||!a||!isFinite(a)?0:Math.max(0,Math.min(t-n.left,n.width))/n.width*a},[A,o]),$=at.useCallback(t=>{let n=A();return n?Math.max(0,Math.min(t-n.left,n.width)):0},[A]),ee=at.useCallback(t=>{let n=o.current;if(!n)return;let a=n.currentTime,E=isFinite(n.duration)?n.duration:0;switch(t.key){case "ArrowLeft":case "ArrowRight":{t.preventDefault(),t.nativeEvent.stopImmediatePropagation();let f=t.shiftKey?10:5;r.seek(t.key==="ArrowLeft"?Math.max(0,a-f):Math.min(E,a+f));break}case "Home":t.preventDefault(),t.nativeEvent.stopImmediatePropagation(),r.seek(0);break;case "End":E>0&&(t.preventDefault(),t.nativeEvent.stopImmediatePropagation(),r.seek(E));break}},[o,r]),ne=at.useCallback(t=>{let n=V(t.clientX),a=$(t.clientX);if(F.current=a,B.current=n,d.current&&(d.current.style.left=`${a}px`),C.current&&(C.current.textContent=me(n)),N(n),s.current){let E=s.current.offsetWidth,f=A()?.width??0,h=E/2,y=Math.max(h,Math.min(a,f-h));s.current.style.left=`${y}px`;}L.current&&r.seek(n);},[r,N,V,$,A]),oe=at.useCallback(()=>{J(),K();},[J,K]),ie=at.useCallback(t=>{t.preventDefault(),_(),r.seek(V(t.clientX));},[_,V,r]),ae=at.useCallback(t=>{L.current||r.seek(V(t.clientX));},[V,r]);at.useEffect(()=>{let t=c.current;if(!t)return;let n=a=>{L.current&&a.preventDefault();};return t.addEventListener("touchmove",n,{passive:false}),()=>t.removeEventListener("touchmove",n)},[]);let se=at.useCallback(t=>{k.current=null,_(),r.seek(V(t.touches[0].clientX));},[_,V,r]),ce=at.useCallback(t=>{L.current&&r.seek(V(t.touches[0].clientX));},[V,r]);at.useEffect(()=>{let t=()=>K();return window.addEventListener("mouseup",t),()=>window.removeEventListener("mouseup",t)},[K]);let e=at.useMemo(()=>{let t=o.current,n=t&&isFinite(t.duration)?t.duration:0;return n<=0||!D.length?null:D.map((a,E)=>{let f=a.start/n*100,h=(a.end-a.start)/n*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${f}%`,width:`${h}%`}},E)})},[D,o]);return jsxRuntime.jsxs("div",{ref:c,className:"progressContainer",onMouseMove:ne,onMouseEnter:re,onMouseLeave:oe,onMouseDown:ie,onMouseUp:K,onClick:ae,onTouchStart:se,onTouchMove:ce,onTouchEnd:K,onKeyDown:ee,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[i&&jsxRuntime.jsxs("div",{ref:s,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[u&&jsxRuntime.jsx("div",{ref:w,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:C,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[e,jsxRuntime.jsx("div",{ref:g,className:"progressFilled",style:{width:"0%"}}),i&&jsxRuntime.jsx("div",{ref:d,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:M,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});je.displayName="ProgressBar";var we=je;var Je=at.memo(({currentRate:o,playbackRates:r,onRateChange:i,qualityLevels:u=[],currentQualityLevel:v=-1,onQualityChange:m})=>{let[c,g]=at.useState(false),[M,s]=at.useState("speed"),C=at.useRef(null),d=u.length>0&&!!m;at.useEffect(()=>{let b=L=>{C.current&&!C.current.contains(L.target)&&g(false);};return c&&document.addEventListener("mousedown",b),()=>document.removeEventListener("mousedown",b)},[c]);let w=at.useMemo(()=>[...u].sort((b,L)=>L.bitrate-b.bitrate),[u]),D=at.useMemo(()=>v===-1?"Auto":u.find(b=>b.id===v)?.name??"Auto",[u,v]);return jsxRuntime.jsxs("div",{ref:C,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>g(b=>!b),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":c,children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94s-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96a7.02 7.02 0 0 0-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54a6.88 6.88 0 0 0-1.61.94l-2.39-.96a.488.488 0 0 0-.59.22L2.74 8.87a.48.48 0 0 0 .12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54a6.88 6.88 0 0 0 1.61-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32a.47.47 0 0 0-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 0 1 8.4 12 3.6 3.6 0 0 1 12 8.4a3.6 3.6 0 0 1 3.6 3.6 3.6 3.6 0 0 1-3.6 3.6z"})})}),c&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[d&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${M==="speed"?" active":""}`,onClick:()=>s("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${M==="quality"?" active":""}`,onClick:()=>s("quality"),children:"Quality"})]}),(!d||M==="speed")&&jsxRuntime.jsxs("div",{children:[!d&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),r.map(b=>jsxRuntime.jsx("button",{onClick:()=>{i(b),g(false);},className:`settingsOption${o===b?" active":""}`,role:"menuitemradio","aria-checked":o===b,children:b===1?"Normal":`${b}\xD7`},b))]}),d&&M==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{m(-1),g(false);},className:`settingsOption${v===-1?" active":""}`,role:"menuitemradio","aria-checked":v===-1,children:["Auto ",v===-1&&D!=="Auto"?`(${D})`:""]}),w.map(b=>jsxRuntime.jsxs("button",{onClick:()=>{m(b.id),g(false);},className:`settingsOption${v===b.id?" active":""}`,role:"menuitemradio","aria-checked":v===b.id,children:[b.name,b.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(b.bitrate/1e3)," kbps"]})]},b.id))]})]})]})});Je.displayName="SettingsMenu";var Se=Je;var et=at.memo(({videoRef:o,isLive:r=false,isAudioMode:i=false})=>{let u=at.useRef(null),v=at.useRef(null);return at.useEffect(()=>{let m=o.current;if(!m)return;let c=()=>{u.current&&(u.current.textContent=me(m.currentTime));},g=()=>{if(v.current){let M=isFinite(m.duration)?m.duration:0;v.current.textContent=` / ${me(M)}`;}};return m.addEventListener("timeupdate",c),m.addEventListener("durationchange",g),m.addEventListener("seeked",c),c(),g(),()=>{m.removeEventListener("timeupdate",c),m.removeEventListener("durationchange",g),m.removeEventListener("seeked",c);}},[o,r,i]),r?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:u,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:u,children:"0:00"}),jsxRuntime.jsx("span",{ref:v,style:{opacity:.6},children:" / 0:00"})]})});et.displayName="TimeDisplay";var Ae=et;var G={PlayButton:be,PauseButton:ye,FullscreenButton:Ee,PiPButton:Me,TheaterButton:Le,VolumeControl:xe,ProgressBar:we,SettingsMenu:Se,TimeDisplay:Ae};var De=at.memo(function({videoRef:r,playerRef:i,playerContainerRef:u,playbackRates:v,enablePreview:m,thumbnailVtt:c,thumbnailVttBaseUrl:g,isPlaying:M,volume:s,isMuted:C,playbackRate:d,isFullscreen:w,isPictureInPicture:D,isTheaterMode:b,isAudioMode:L,showAudioButton:F,audioModeIcon:B,videoModeIcon:P,audioModeLabel:x,videoModeLabel:k,isLive:A,qualityLevels:_,currentQualityLevel:K,controlBarItems:re,autoHideControls:J}){let N=at.useRef(null),[V,$]=at.useState(true),ee=at.useRef({isPlaying:M,volume:s,isMuted:C,isLive:A});ee.current={isPlaying:M,volume:s,isMuted:C,isLive:A},at.useEffect(()=>{if(L||!J){$(true),N.current&&clearTimeout(N.current);return}if(!M){$(true),N.current&&clearTimeout(N.current);return}let f=u.current;if(!f)return;let h=()=>{$(true),N.current&&clearTimeout(N.current),N.current=setTimeout(()=>$(false),3e3);},y=()=>{N.current&&clearTimeout(N.current),$(false);};return f.addEventListener("mousemove",h),f.addEventListener("mouseenter",h),f.addEventListener("mouseleave",y),f.addEventListener("touchstart",h,{passive:true}),$(false),()=>{f.removeEventListener("mousemove",h),f.removeEventListener("mouseenter",h),f.removeEventListener("mouseleave",y),f.removeEventListener("touchstart",h),N.current&&clearTimeout(N.current);}},[M,L,J,u]),at.useEffect(()=>{let f=h=>{if(!u.current?.contains(document.activeElement))return;let y=h.target;if(y.tagName==="INPUT"||y.tagName==="TEXTAREA"||y.isContentEditable)return;let{isPlaying:T,volume:R,isLive:l}=ee.current,S=r.current?.currentTime??0,I=r.current?.duration??0;switch(h.code){case "Space":case "KeyK":h.preventDefault(),T?i.pause():i.play();break;case "ArrowLeft":h.preventDefault(),i.seek(Math.max(0,S-5));break;case "ArrowRight":h.preventDefault(),i.seek(Math.min(I||1/0,S+5));break;case "ArrowUp":h.preventDefault(),i.setVolume(Math.min(1,R+.1));break;case "ArrowDown":h.preventDefault(),i.setVolume(Math.max(0,R-.1));break;case "KeyM":h.preventDefault(),i.toggleMute();break;case "KeyF":h.preventDefault(),i.toggleFullscreen();break;case "KeyP":h.preventDefault(),i.togglePictureInPicture();break;case "KeyT":h.preventDefault(),i.toggleTheaterMode();break;case "KeyL":h.preventDefault(),l&&i.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{h.preventDefault();let Q=Number(h.code.replace("Digit",""))*10;i.seek(I/100*Q);break}}};return window.addEventListener("keydown",f),()=>window.removeEventListener("keydown",f)},[i,u,r]);let ne=at.useCallback(()=>i.play(),[i]),oe=at.useCallback(()=>i.pause(),[i]),ie=at.useCallback(f=>i.setVolume(f),[i]),ae=at.useCallback(()=>i.toggleMute(),[i]),se=at.useCallback(f=>i.setPlaybackRate(f),[i]),ce=at.useCallback(f=>i.setQualityLevel(f),[i]),e=at.useCallback(()=>i.togglePictureInPicture(),[i]),t=at.useCallback(()=>i.toggleTheaterMode(),[i]),n=at.useCallback(()=>i.toggleAudioMode(),[i]),a=at.useCallback(()=>i.toggleFullscreen(),[i]),E=at.useCallback(()=>i.seekToLive(),[i]);return jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:V?1:0,transition:"opacity 0.3s",pointerEvents:"none",zIndex:2},children:jsxRuntime.jsxs("div",{style:{background:"linear-gradient(to top, rgba(0,0,0,0.75) 0%, rgba(0,0,0,0.2) 60%, transparent 100%)",padding:"48px 12px 12px",pointerEvents:V?"auto":"none"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx(G.ProgressBar,{videoRef:r,playerRef:i,enablePreview:m,thumbnailVtt:c,thumbnailVttBaseUrl:g,isAudioMode:L}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[M?jsxRuntime.jsx(G.PauseButton,{onClick:oe}):jsxRuntime.jsx(G.PlayButton,{onClick:ne}),jsxRuntime.jsx(G.VolumeControl,{volume:s,isMuted:C,onVolumeChange:ie,onToggleMute:ae}),jsxRuntime.jsx(G.TimeDisplay,{videoRef:r,isLive:A,isAudioMode:L}),jsxRuntime.jsx("div",{style:{flex:1}}),A&&jsxRuntime.jsx(it,{onClick:E}),F&&jsxRuntime.jsx(ot,{onClick:n,isAudioMode:L,audioModeIcon:B,videoModeIcon:P,audioModeLabel:x,videoModeLabel:k}),jsxRuntime.jsx(G.SettingsMenu,{currentRate:d,playbackRates:v,onRateChange:se,qualityLevels:_,currentQualityLevel:K,onQualityChange:ce}),re?.map(f=>jsxRuntime.jsx("button",{className:"controlButton","aria-label":f.label,title:f.title??f.label,onClick:f.onClick,children:f.icon},f.key)),jsxRuntime.jsx(G.PiPButton,{onClick:e,isPiP:D}),jsxRuntime.jsx(G.TheaterButton,{onClick:t,isTheater:b}),jsxRuntime.jsx(G.FullscreenButton,{onClick:a,isFullscreen:w})]})]})})});De.displayName="Controls";var ot=at.memo(({onClick:o,isAudioMode:r,audioModeIcon:i,videoModeIcon:u,audioModeLabel:v,videoModeLabel:m})=>{let c=r?m??"Video":v??"Audio";return jsxRuntime.jsxs("button",{onClick:o,className:"rvp-audio-toggle-btn","aria-label":c,title:c,"aria-pressed":r,children:[r?u??jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"})}):i??jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M12 3a9 9 0 0 0-9 9v7c0 1.1.9 2 2 2h1a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H4v-1a8 8 0 0 1 16 0v1h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h1a3 3 0 0 0 3-3v-4c0-4.97-4.03-9-9-9z"})}),c]})});ot.displayName="AudioModeButton";var it=at.memo(({onClick:o})=>jsxRuntime.jsx("button",{onClick:o,style:{background:"none",border:"1px solid rgba(255,255,255,0.6)",color:"#fff",borderRadius:3,padding:"2px 8px",fontSize:11,fontWeight:700,cursor:"pointer",letterSpacing:"0.06em"},title:"Go to live (L)",children:"GO LIVE"}));it.displayName="GoLiveButton";var Ue=at.memo(({x:o,y:r,isPlaying:i,src:u,videoRef:v,playerRef:m,onClose:c,contextMenuItems:g})=>{let M=at.useRef(null),[s,C]=at.useState(()=>v.current?.loop??false),d=Math.min(o,window.innerWidth-220),w=Math.min(r,window.innerHeight-290);at.useEffect(()=>{let P=A=>{M.current&&!M.current.contains(A.target)&&c();},x=A=>{A.key==="Escape"&&c();},k=()=>c();return document.addEventListener("mousedown",P),document.addEventListener("keydown",x),window.addEventListener("scroll",k,true),()=>{document.removeEventListener("mousedown",P),document.removeEventListener("keydown",x),window.removeEventListener("scroll",k,true);}},[c]);let D=at.useCallback(()=>{i?m.pause():m.play(),c();},[i,m,c]),b=at.useCallback(()=>{let P=v.current;if(!P)return;let x=!s;P.loop=x,C(x);},[v,s]),L=at.useCallback(async()=>{try{await navigator.clipboard.writeText(u);}catch{}c();},[u,c]),F=at.useCallback(async()=>{let P=Math.floor(v.current?.currentTime??0);try{await navigator.clipboard.writeText(`${u}?t=${P}`);}catch{}c();},[u,v,c]),B=at.useCallback(()=>{m.togglePictureInPicture(),c();},[m,c]);return jsxRuntime.jsxs("div",{ref:M,className:"contextMenu",style:{left:d,top:w},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:D,children:i?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:b,children:[jsxRuntime.jsx("span",{children:"Loop"}),s&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:L,children:"Copy video URL"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:F,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:B,children:"Picture-in-Picture"}),g&&g.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),g.map((P,x)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{P.onClick(),c();},children:P.label},x))]})]})});Ue.displayName="ContextMenu";var We=at.memo(function({poster:r,logo:i,audioModeFallback:u,isBuffering:v=false,onOverlayClick:m}){return jsxRuntime.jsxs("div",{className:"rvp-audio-overlay",onClick:m,"data-test":"audio-mode-overlay",children:[r?jsxRuntime.jsx("div",{className:"rvp-audio-artwork-container",children:jsxRuntime.jsx("img",{src:r,alt:"Artwork",className:"rvp-audio-artwork",draggable:false})}):u?jsxRuntime.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center"},children:u}):i?typeof i=="string"?jsxRuntime.jsx("img",{src:i,alt:"Logo",className:"rvp-audio-logo",draggable:false}):jsxRuntime.jsx("div",{className:"rvp-audio-logo-node",children:i}):null,jsxRuntime.jsx("span",{className:"rvp-audio-label",children:"Audio Mode"}),v?jsxRuntime.jsx("div",{className:"rvp-audio-buffering-overlay","aria-label":"Buffering",children:jsxRuntime.jsx("div",{className:"rvp-audio-spinner"})}):null]})});We.displayName="AudioModeOverlay";var ut=at.forwardRef((o,r)=>{let{src:i,poster:u,className:v,controls:m=true,options:c={}}=o,{autoplay:g=false,muted:M=false,loop:s=false,preload:C="metadata",playbackRates:d=[.25,.5,.75,1,1.25,1.5,1.75,2],enableHLS:w=true,enablePreview:D=true,thumbnailVtt:b,thumbnailVttBaseUrl:L,hlsConfig:F,autoHideControls:B=true,subtitles:P,crossOrigin:x,logo:k,audioModeFallback:A,audioSrc:_,showAudioButton:K,audioModeIcon:re,videoModeIcon:J,audioModeLabel:N,videoModeLabel:V,defaultAudioMode:$,audioBandwidthThreshold:ee,audioModeSwitchLevel:ne,audioModeRecoveryInterval:oe,onPlay:ie,onPause:ae,onEnded:se,onError:ce,onTimeUpdate:e,onDurationChange:t,onBuffering:n,onTheaterModeChange:a,onAudioModeChange:E,contextMenuItems:f,controlBarItems:h}=c,y=at.useRef(null),T=at.useRef(null),R=at.useRef(null),{state:l,ref:S,fullscreenContainerRef:I}=Qe(y,i,{autoplay:g,muted:M,loop:s,playbackRates:d,enableHLS:w,hlsConfig:F,defaultAudioMode:$,audioBandwidthThreshold:ee,audioModeSwitchLevel:ne,audioModeRecoveryInterval:oe,onPlay:ie,onPause:ae,onEnded:se,onError:ce,onTimeUpdate:e,onDurationChange:t,onBuffering:n,onTheaterModeChange:a,onAudioModeChange:E,audioRef:T,audioSrc:_}),Q=at.useRef(null);at__default.default.useLayoutEffect(()=>{Q.current=l.isAudioMode&&_&&T.current?T.current:y.current;},[l.isAudioMode,_]),Q.current===null&&(Q.current=y.current);let[p,q]=at.useState(null);at.useEffect(()=>{I.current=R.current;},[I]),at__default.default.useImperativeHandle(r,()=>S,[S]);let de=at.useCallback(()=>{R.current?.focus(),l.isPlaying?S.pause():S.play();},[l.isPlaying,S]),He=at.useCallback(()=>{S.toggleFullscreen();},[S]),lt=at.useCallback(te=>{te.preventDefault(),q({x:te.clientX,y:te.clientY});},[]);return jsxRuntime.jsxs("div",{ref:R,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:v,"data-test":"video-player-container","data-theater":l.isTheaterMode?"true":void 0,onContextMenu:lt,children:[jsxRuntime.jsx("video",{ref:y,poster:u,preload:C,crossOrigin:x,onClick:de,onDoubleClick:He,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer",visibility:l.isAudioMode?"hidden":"visible"},"data-test":"video-element",children:P?.map(te=>jsxRuntime.jsx("track",{kind:"subtitles",src:te.src,label:te.label,srcLang:te.srclang,default:te.default},te.id))}),_&&jsxRuntime.jsx("audio",{ref:T,preload:"none",style:{display:"none"},"aria-hidden":"true"}),l.isAudioMode&&jsxRuntime.jsx(We,{poster:u,logo:k,audioModeFallback:A,isBuffering:l.isBuffering,onOverlayClick:de}),m&&jsxRuntime.jsx(De,{videoRef:Q,playerRef:S,playerContainerRef:R,playbackRates:d,enablePreview:D,thumbnailVtt:l.isAudioMode?void 0:b,thumbnailVttBaseUrl:L,isPlaying:l.isPlaying,volume:l.volume,isMuted:l.isMuted,playbackRate:l.playbackRate,isFullscreen:l.isFullscreen,isPictureInPicture:l.isPictureInPicture,isTheaterMode:l.isTheaterMode,isAudioMode:l.isAudioMode,showAudioButton:K??!!_,audioModeIcon:re,videoModeIcon:J,audioModeLabel:N,videoModeLabel:V,isLive:l.isLive,qualityLevels:l.qualityLevels,currentQualityLevel:l.currentQualityLevel,controlBarItems:h,autoHideControls:B}),p&&jsxRuntime.jsx(Ue,{x:p.x,y:p.y,isPlaying:l.isPlaying,src:i,videoRef:y,playerRef:S,onClose:()=>q(null),contextMenuItems:f}),l.isLive&&jsxRuntime.jsx("div",{style:{position:"absolute",top:12,left:12,backgroundColor:"#e53935",color:"#fff",fontSize:11,fontWeight:700,letterSpacing:"0.08em",padding:"2px 8px",borderRadius:3,pointerEvents:"none"},children:"LIVE"}),l.isBuffering&&!l.error&&!l.isAudioMode&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,color:"#fff",pointerEvents:"none"},"data-test":"buffering-indicator",children:jsxRuntime.jsx("div",{style:{width:48,height:48,border:"4px solid rgba(255,255,255,0.25)",borderTop:"4px solid #fff",borderRadius:"50%",animation:"rvp-spin 0.8s linear infinite"}})}),l.error&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0,0,0,0.85)",color:"#fff",padding:24},"data-test":"error-overlay",children:jsxRuntime.jsxs("div",{style:{textAlign:"center",maxWidth:400},children:[jsxRuntime.jsx("div",{style:{fontSize:36,marginBottom:12},children:"\u26A0"}),jsxRuntime.jsx("h3",{style:{margin:"0 0 8px",fontSize:18},children:l.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":l.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:l.error.message})]})})]})});ut.displayName="VideoPlayer";var zt=ut;var Ut={EXTREME:100,POOR:300,FAIR:800,GOOD:1500},Wt={LOWEST:0,SECOND_LOWEST:1,DISABLED:-1};exports.AUDIO_BANDWIDTH_THRESHOLDS=Ut;exports.AUDIO_SWITCH_LEVELS=Wt;exports.ControlElements=tt;exports.Controls=De;exports.VideoPlayer=zt;exports.findThumbnailCue=Ie;exports.formatTime=me;exports.getMimeType=mt;exports.isHLSUrl=Te;exports.parseThumbnailVtt=Ve;//# sourceMappingURL=index.js.map
3
+ `),p=0;for(;p<c.length;){let f=c[p].trim();if(f.includes("-->")){let P=f.indexOf("-->"),T=at(f.slice(0,P)),x=at(f.slice(P+3));for(p++;p<c.length&&!c[p].trim();)p++;if(p<c.length){let u=c[p].trim(),N=u.lastIndexOf("#xywh="),h=u,w=0,V=0,A=160,H=90;if(N!==-1){h=u.slice(0,N);let D=u.slice(N+6).split(",").map(Number);w=D[0]??0,V=D[1]??0,A=D[2]??160,H=D[3]??90;}l.push({start:T,end:x,url:It(n,h,o),x:w,y:V,w:A,h:H});}}p++;}return l}function We(r,n){if(!r.length)return null;let o=0,l=r.length-1;for(;o<=l;){let c=o+l>>1;if(r[c].end<=n)o=c+1;else if(r[c].start>n)l=c-1;else return r[c]}return null}var st=Lt.memo(({videoRef:r,playerRef:n,enablePreview:o=true,thumbnailVtt:l,thumbnailVttBaseUrl:c,isAudioMode:p=false})=>{let f=Lt.useRef(null),P=Lt.useRef(null),T=Lt.useRef(null),x=Lt.useRef(null),u=Lt.useRef(null),N=Lt.useRef(null),h=Lt.useRef(null),w=Lt.useRef(null),V=Lt.useRef(null),[A,H]=Lt.useState([]),D=Lt.useRef(false),B=Lt.useRef(0),k=Lt.useRef(0),F=Lt.useRef(null),C=Lt.useRef([]),g=Lt.useRef(null);Lt.useEffect(()=>{let t=()=>{g.current=null;};return window.addEventListener("resize",t,{passive:true}),()=>window.removeEventListener("resize",t)},[]);let R=Lt.useCallback(()=>(!g.current&&f.current&&(g.current=f.current.getBoundingClientRect()),g.current),[]);Lt.useEffect(()=>{if(!l){C.current=[];return}let t=false;return fetch(l).then(a=>a.text()).then(a=>{t||(C.current=$e(a,l,c));}).catch(()=>{t||(C.current=[]);}),()=>{t=true;}},[l]),Lt.useEffect(()=>{let t=r.current;if(!t)return;let a=()=>{let m=isFinite(t.duration)?t.duration:0,E=t.currentTime,y=m>0?E/m*100:0;P.current&&(P.current.style.width=`${y}%`),T.current&&(T.current.style.left=`${y}%`),w.current&&(w.current.style.clipPath=`inset(0 ${(100-y).toFixed(2)}% 0 0)`),f.current&&(f.current.setAttribute("aria-valuenow",String(Math.round(E))),f.current.setAttribute("aria-valuemax",String(Math.round(m))),f.current.setAttribute("aria-valuetext",ge(E)));};return t.addEventListener("timeupdate",a),t.addEventListener("durationchange",a),t.addEventListener("seeked",a),a(),()=>{t.removeEventListener("timeupdate",a),t.removeEventListener("durationchange",a),t.removeEventListener("seeked",a);}},[r,p]),Lt.useEffect(()=>{let t=r.current;if(!t)return;let a=()=>{let m=[];for(let E=0;E<t.buffered.length;E++)m.push({start:t.buffered.start(E),end:t.buffered.end(E)});if(p||H(m),V.current&&isFinite(t.duration)&&t.duration>0){let y=m.reduce((i,v)=>Math.max(i,v.end),0)/t.duration*100;V.current.style.clipPath=`inset(0 ${(100-y).toFixed(2)}% 0 0)`;}};return t.addEventListener("progress",a),()=>t.removeEventListener("progress",a)},[r,p]);let te=Lt.useCallback(()=>{D.current=true,T.current?.classList.add("dragging");},[]),G=Lt.useCallback(()=>{D.current=false,T.current?.classList.remove("dragging");},[]),de=Lt.useCallback(()=>{!o||p||(g.current=null,x.current&&(x.current.style.display="block"),N.current&&(N.current.style.display="block"));},[o,p]),ie=Lt.useCallback(()=>{x.current&&(x.current.style.display="none"),N.current&&(N.current.style.display="none");},[]),se=Lt.useCallback(t=>{if(!h.current||!C.current.length)return;let a=We(C.current,t);if(F.current=a,!a)return;let m=h.current;m.style.backgroundImage=`url(${a.url})`,m.style.backgroundPosition=`-${a.x}px -${a.y}px`,m.style.width=`${a.w}px`,m.style.height=`${a.h}px`;},[]),_=Lt.useCallback(t=>{let a=R(),m=r.current?.duration;return !a||a.width===0||!m||!isFinite(m)?0:Math.max(0,Math.min(t-a.left,a.width))/a.width*m},[R,r]),I=Lt.useCallback(t=>{let a=R();return a?Math.max(0,Math.min(t-a.left,a.width)):0},[R]),le=Lt.useCallback(t=>{let a=r.current;if(!a)return;let m=a.currentTime,E=isFinite(a.duration)?a.duration:0;switch(t.key){case "ArrowLeft":case "ArrowRight":{t.preventDefault(),t.nativeEvent.stopImmediatePropagation();let y=t.shiftKey?10:5;n.seek(t.key==="ArrowLeft"?Math.max(0,m-y):Math.min(E,m+y));break}case "Home":t.preventDefault(),t.nativeEvent.stopImmediatePropagation(),n.seek(0);break;case "End":E>0&&(t.preventDefault(),t.nativeEvent.stopImmediatePropagation(),n.seek(E));break}},[r,n]),Y=Lt.useCallback(t=>{let a=_(t.clientX),m=I(t.clientX);if(B.current=m,k.current=a,N.current&&(N.current.style.left=`${m}px`),u.current&&(u.current.textContent=ge(a)),se(a),x.current){let E=x.current.offsetWidth,y=R()?.width??0,i=E/2,v=Math.max(i,Math.min(m,y-i));x.current.style.left=`${v}px`;}D.current&&n.seek(a);},[n,se,_,I,R]),ue=Lt.useCallback(()=>{ie(),G();},[ie,G]),me=Lt.useCallback(t=>{t.preventDefault(),te(),n.seek(_(t.clientX));},[te,_,n]),fe=Lt.useCallback(t=>{D.current||n.seek(_(t.clientX));},[_,n]);Lt.useEffect(()=>{let t=f.current;if(!t)return;let a=m=>{D.current&&m.preventDefault();};return t.addEventListener("touchmove",a,{passive:false}),()=>t.removeEventListener("touchmove",a)},[]);let he=Lt.useCallback(t=>{g.current=null,te(),n.seek(_(t.touches[0].clientX));},[te,_,n]),e=Lt.useCallback(t=>{D.current&&n.seek(_(t.touches[0].clientX));},[_,n]);Lt.useEffect(()=>{let t=()=>G();return window.addEventListener("mouseup",t),()=>window.removeEventListener("mouseup",t)},[G]);let s=Lt.useMemo(()=>{let a=[],m=3735928559,E=()=>(m^=m<<13,m^=m>>17,m^=m<<5,(m>>>0)/4294967295);for(let y=0;y<200;y++){let i=y/200*Math.PI*5,v=.15+.55*Math.abs(Math.sin(i))+.3*E();a.push(Math.max(.1,Math.min(1,v)));}return a},[]),d=Lt.useMemo(()=>{let t=r.current,a=t&&isFinite(t.duration)?t.duration:0;return a<=0||!A.length?null:A.map((m,E)=>{let y=m.start/a*100,i=(m.end-m.start)/a*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${y}%`,width:`${i}%`}},E)})},[A,r]);return jsxRuntime.jsxs("div",{ref:f,className:"progressContainer",onMouseMove:Y,onMouseEnter:de,onMouseLeave:ue,onMouseDown:me,onMouseUp:G,onClick:fe,onTouchStart:he,onTouchMove:e,onTouchEnd:G,onKeyDown:le,role:"slider","aria-label":p?"Audio progress":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[o&&jsxRuntime.jsxs("div",{ref:x,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[l&&jsxRuntime.jsx("div",{ref:h,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:u,className:"previewTime"})]}),p?jsxRuntime.jsxs("div",{className:"rvp-waveform","aria-hidden":"true",children:[jsxRuntime.jsx("div",{className:"rvp-waveform-base",children:s.map((t,a)=>jsxRuntime.jsx("div",{className:"rvp-waveform-dot"},a))}),jsxRuntime.jsx("div",{ref:V,className:"rvp-waveform-buffered",style:{clipPath:"inset(0 100% 0 0)"},children:s.map((t,a)=>jsxRuntime.jsx("div",{className:"rvp-waveform-buffered-bar",style:{height:`${Math.round(t*100)}%`}},a))}),jsxRuntime.jsx("div",{ref:w,className:"rvp-waveform-filled",children:s.map((t,a)=>jsxRuntime.jsx("div",{className:"rvp-waveform-bar",style:{height:`${Math.round(t*100)}%`}},a))})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"progressBackground",children:[d,jsxRuntime.jsx("div",{ref:P,className:"progressFilled",style:{width:"0%"}}),o&&jsxRuntime.jsx("div",{ref:N,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:T,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})]})});st.displayName="ProgressBar";var De=st;var Ut=()=>jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M20.38 8.57l-1.23 1.85a8 8 0 0 1-.22 7.58H5.07A8 8 0 0 1 15.58 6.85l1.85-1.23A10 10 0 0 0 3.35 19a2 2 0 0 0 1.72 1h13.85a2 2 0 0 0 1.74-1 10 10 0 0 0-.27-10.44zm-9.79 6.84a2 2 0 0 0 2.83 0l5.66-8.49-8.49 5.66a2 2 0 0 0 0 2.83z"})}),$t=()=>jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z"})}),ct=()=>jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})}),dt=()=>jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})}),He=()=>jsxRuntime.jsx("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"})}),ft=Lt.memo(({currentRate:r,playbackRates:n,onRateChange:o,qualityLevels:l=[],currentQualityLevel:c=-1,onQualityChange:p,showQualityMenu:f=false,manualQualityLevels:P,activeManualSrc:T,onManualQualityChange:x})=>{let[u,N]=Lt.useState(false),[h,w]=Lt.useState(null),V=Lt.useRef(null),A=l.length>0&&!!p,H=!!P?.length&&!!x,D=A||H||f;Lt.useEffect(()=>{u||w(null);},[u]),Lt.useEffect(()=>{let g=R=>{V.current&&!V.current.contains(R.target)&&N(false);};return u&&document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[u]);let B=Lt.useMemo(()=>[...l].sort((g,R)=>R.bitrate-g.bitrate),[l]),k=r===1?"Normal":`${r}\xD7`,F=Lt.useMemo(()=>H&&T?P.find(g=>g.src===T)?.label??"Auto":A?c===-1?"Auto":l.find(g=>g.id===c)?.name??"Auto":"Auto",[H,A,T,P,l,c]),C=Lt.useMemo(()=>c===-1?null:l.find(g=>g.id===c)?.name??null,[l,c]);return jsxRuntime.jsxs("div",{ref:V,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>N(g=>!g),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":u,children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94s-.02-.64-.07-.94l2.03-1.58a.49.49 0 0 0 .12-.61l-1.92-3.32a.49.49 0 0 0-.59-.22l-2.39.96a7.02 7.02 0 0 0-1.62-.94l-.36-2.54a.484.484 0 0 0-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54a6.88 6.88 0 0 0-1.61.94l-2.39-.96a.488.488 0 0 0-.59.22L2.74 8.87a.48.48 0 0 0 .12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 0 0-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54a6.88 6.88 0 0 0 1.61-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32a.47.47 0 0 0-.12-.61l-2.01-1.58zM12 15.6A3.6 3.6 0 0 1 8.4 12 3.6 3.6 0 0 1 12 8.4a3.6 3.6 0 0 1 3.6 3.6 3.6 3.6 0 0 1-3.6 3.6z"})})}),u&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[h===null&&jsxRuntime.jsxs("div",{className:"settingsMainPanel",children:[jsxRuntime.jsxs("button",{className:"settingsRow",onClick:()=>w("speed"),children:[jsxRuntime.jsx("span",{className:"settingsRowIcon",children:jsxRuntime.jsx(Ut,{})}),jsxRuntime.jsx("span",{className:"settingsRowLabel",children:"Playback speed"}),jsxRuntime.jsx("span",{className:"settingsRowValue",children:k}),jsxRuntime.jsx("span",{className:"settingsRowChevron",children:jsxRuntime.jsx(ct,{})})]}),D&&jsxRuntime.jsxs("button",{className:"settingsRow",onClick:()=>w("quality"),children:[jsxRuntime.jsx("span",{className:"settingsRowIcon",children:jsxRuntime.jsx($t,{})}),jsxRuntime.jsx("span",{className:"settingsRowLabel",children:"Quality"}),jsxRuntime.jsx("span",{className:"settingsRowValue",children:F}),jsxRuntime.jsx("span",{className:"settingsRowChevron",children:jsxRuntime.jsx(ct,{})})]})]}),h==="speed"&&jsxRuntime.jsxs("div",{className:"settingsSubPanel",children:[jsxRuntime.jsxs("button",{className:"settingsBackRow",onClick:()=>w(null),children:[jsxRuntime.jsx(dt,{}),jsxRuntime.jsx("span",{children:"Playback speed"})]}),jsxRuntime.jsx("div",{className:"settingsDivider"}),n.map(g=>{let R=r===g;return jsxRuntime.jsxs("button",{onClick:()=>{o(g),w(null);},className:`settingsOption${R?" active":""}`,role:"menuitemradio","aria-checked":R,children:[jsxRuntime.jsx("span",{className:"settingsOptionCheck",children:R&&jsxRuntime.jsx(He,{})}),g===1?"Normal":`${g}\xD7`]},g)})]}),h==="quality"&&jsxRuntime.jsxs("div",{className:"settingsSubPanel",children:[jsxRuntime.jsxs("button",{className:"settingsBackRow",onClick:()=>w(null),children:[jsxRuntime.jsx(dt,{}),jsxRuntime.jsx("span",{children:"Quality"})]}),jsxRuntime.jsx("div",{className:"settingsDivider"}),H&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[P.map(g=>{let R=T===g.src;return jsxRuntime.jsxs("button",{onClick:()=>{x(g.src),w(null);},className:`settingsOption${R?" active":""}`,role:"menuitemradio","aria-checked":R,children:[jsxRuntime.jsx("span",{className:"settingsOptionCheck",children:R&&jsxRuntime.jsx(He,{})}),g.label]},g.src)}),A&&jsxRuntime.jsx("div",{className:"settingsDivider"})]}),A&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("button",{onClick:()=>{p(-1),w(null);},className:`settingsOption${c===-1?" active":""}`,role:"menuitemradio","aria-checked":c===-1,children:[jsxRuntime.jsx("span",{className:"settingsOptionCheck",children:c===-1&&jsxRuntime.jsx(He,{})}),jsxRuntime.jsxs("span",{children:["Auto",C&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[" (",C,")"]})]})]}),B.map(g=>{let R=c===g.id;return jsxRuntime.jsxs("button",{onClick:()=>{p(g.id),w(null);},className:`settingsOption${R?" active":""}`,role:"menuitemradio","aria-checked":R,children:[jsxRuntime.jsx("span",{className:"settingsOptionCheck",children:R&&jsxRuntime.jsx(He,{})}),jsxRuntime.jsx("span",{style:{flex:1},children:g.name}),g.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(g.bitrate/1e3)," kbps"]})]},g.id)})]})]})]})]})});ft.displayName="SettingsMenu";var Ve=ft;var pt=Lt.memo(({videoRef:r,isLive:n=false,isAudioMode:o=false})=>{let l=Lt.useRef(null),c=Lt.useRef(null);return Lt.useEffect(()=>{let p=r.current;if(!p)return;let f=()=>{l.current&&(l.current.textContent=ge(p.currentTime));},P=()=>{if(c.current){let T=isFinite(p.duration)?p.duration:0;c.current.textContent=` / ${ge(T)}`;}};return p.addEventListener("timeupdate",f),p.addEventListener("durationchange",P),p.addEventListener("seeked",f),f(),P(),()=>{p.removeEventListener("timeupdate",f),p.removeEventListener("durationchange",P),p.removeEventListener("seeked",f);}},[r,n,o]),n?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:l,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:l,children:"0:00"}),jsxRuntime.jsx("span",{ref:c,style:{opacity:.6},children:" / 0:00"})]})});pt.displayName="TimeDisplay";var Oe=pt;var re={PlayButton:Te,PauseButton:Ce,FullscreenButton:Re,PiPButton:we,TheaterButton:ke,VolumeControl:Ae,ProgressBar:De,SettingsMenu:Ve,TimeDisplay:Oe};var Fe=Lt.memo(function({videoRef:n,playerRef:o,playerContainerRef:l,playbackRates:c,enablePreview:p,thumbnailVtt:f,thumbnailVttBaseUrl:P,isPlaying:T,volume:x,isMuted:u,playbackRate:N,isFullscreen:h,isPictureInPicture:w,isTheaterMode:V,isAudioMode:A,showAudioButton:H,audioModeIcon:D,videoModeIcon:B,audioModeLabel:k,videoModeLabel:F,isLive:C,qualityLevels:g,currentQualityLevel:R,showQualityMenu:te,manualQualityLevels:G,activeManualSrc:de,onManualQualityChange:ie,controlBarItems:se,autoHideControls:_}){let I=Lt.useRef(null),[le,Y]=Lt.useState(true),ue=Lt.useRef({isPlaying:T,volume:x,isMuted:u,isLive:C});ue.current={isPlaying:T,volume:x,isMuted:u,isLive:C},Lt.useEffect(()=>{if(A||!_){Y(true),I.current&&clearTimeout(I.current);return}if(!T){Y(true),I.current&&clearTimeout(I.current);return}let i=l.current;if(!i)return;let v=()=>{Y(true),I.current&&clearTimeout(I.current),I.current=setTimeout(()=>Y(false),3e3);},b=()=>{I.current&&clearTimeout(I.current),Y(false);};return i.addEventListener("mousemove",v),i.addEventListener("mouseenter",v),i.addEventListener("mouseleave",b),i.addEventListener("touchstart",v,{passive:true}),Y(false),()=>{i.removeEventListener("mousemove",v),i.removeEventListener("mouseenter",v),i.removeEventListener("mouseleave",b),i.removeEventListener("touchstart",v),I.current&&clearTimeout(I.current);}},[T,A,_,l]),Lt.useEffect(()=>{let i=v=>{if(!l.current?.contains(document.activeElement))return;let b=v.target;if(b.tagName==="INPUT"||b.tagName==="TEXTAREA"||b.isContentEditable)return;let{isPlaying:z,volume:$,isLive:ne}=ue.current,M=n.current?.currentTime??0,W=n.current?.duration??0;switch(v.code){case "Space":case "KeyK":v.preventDefault(),z?o.pause():o.play();break;case "ArrowLeft":v.preventDefault(),o.seek(Math.max(0,M-5));break;case "ArrowRight":v.preventDefault(),o.seek(Math.min(W||1/0,M+5));break;case "ArrowUp":v.preventDefault(),o.setVolume(Math.min(1,$+.1));break;case "ArrowDown":v.preventDefault(),o.setVolume(Math.max(0,$-.1));break;case "KeyM":v.preventDefault(),o.toggleMute();break;case "KeyF":v.preventDefault(),o.toggleFullscreen();break;case "KeyP":v.preventDefault(),o.togglePictureInPicture();break;case "KeyT":v.preventDefault(),o.toggleTheaterMode();break;case "KeyL":v.preventDefault(),ne&&o.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{v.preventDefault();let ve=Number(v.code.replace("Digit",""))*10;o.seek(W/100*ve);break}}};return window.addEventListener("keydown",i),()=>window.removeEventListener("keydown",i)},[o,l,n]);let me=Lt.useCallback(()=>o.play(),[o]),fe=Lt.useCallback(()=>o.pause(),[o]),he=Lt.useCallback(i=>o.setVolume(i),[o]),e=Lt.useCallback(()=>o.toggleMute(),[o]),s=Lt.useCallback(i=>o.setPlaybackRate(i),[o]),d=Lt.useCallback(i=>o.setQualityLevel(i),[o]),t=Lt.useCallback(()=>o.togglePictureInPicture(),[o]),a=Lt.useCallback(()=>o.toggleTheaterMode(),[o]),m=Lt.useCallback(()=>o.toggleAudioMode(),[o]),E=Lt.useCallback(()=>o.toggleFullscreen(),[o]),y=Lt.useCallback(()=>o.seekToLive(),[o]);return jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:le?1:0,transition:"opacity 0.3s",pointerEvents:"none",zIndex:2},children:jsxRuntime.jsxs("div",{style:{background:"linear-gradient(to top, rgba(0,0,0,0.75) 0%, rgba(0,0,0,0.2) 60%, transparent 100%)",padding:"48px 12px 12px",pointerEvents:le?"auto":"none"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx(re.ProgressBar,{videoRef:n,playerRef:o,enablePreview:p,thumbnailVtt:f,thumbnailVttBaseUrl:P,isAudioMode:A}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[T?jsxRuntime.jsx(re.PauseButton,{onClick:fe}):jsxRuntime.jsx(re.PlayButton,{onClick:me}),jsxRuntime.jsx(re.VolumeControl,{volume:x,isMuted:u,onVolumeChange:he,onToggleMute:e}),jsxRuntime.jsx(re.TimeDisplay,{videoRef:n,isLive:C,isAudioMode:A}),jsxRuntime.jsx("div",{style:{flex:1}}),C&&jsxRuntime.jsx(Mt,{onClick:y}),H&&jsxRuntime.jsx(yt,{onClick:m,isAudioMode:A,audioModeIcon:D,videoModeIcon:B,audioModeLabel:k,videoModeLabel:F}),jsxRuntime.jsx(re.SettingsMenu,{currentRate:N,playbackRates:c,onRateChange:s,qualityLevels:g,currentQualityLevel:R,onQualityChange:d,showQualityMenu:te,manualQualityLevels:G,activeManualSrc:de,onManualQualityChange:ie}),se?.map(i=>jsxRuntime.jsx("button",{className:"controlButton","aria-label":i.label,title:i.title??i.label,onClick:i.onClick,children:i.icon},i.key)),jsxRuntime.jsx(re.PiPButton,{onClick:t,isPiP:w}),jsxRuntime.jsx(re.TheaterButton,{onClick:a,isTheater:V}),jsxRuntime.jsx(re.FullscreenButton,{onClick:E,isFullscreen:h})]})]})})});Fe.displayName="Controls";var yt=Lt.memo(({onClick:r,isAudioMode:n,audioModeIcon:o,videoModeIcon:l,audioModeLabel:c,videoModeLabel:p})=>{let f=n?p??"Video":c??"Audio";return jsxRuntime.jsxs("button",{onClick:r,className:"rvp-audio-toggle-btn","aria-label":f,title:f,"aria-pressed":n,children:[n?l??jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"})}):o??jsxRuntime.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"currentColor",children:jsxRuntime.jsx("path",{d:"M12 3a9 9 0 0 0-9 9v7c0 1.1.9 2 2 2h1a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1H4v-1a8 8 0 0 1 16 0v1h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h1a3 3 0 0 0 3-3v-4c0-4.97-4.03-9-9-9z"})}),f]})});yt.displayName="AudioModeButton";var Mt=Lt.memo(({onClick:r})=>jsxRuntime.jsx("button",{onClick:r,style:{background:"none",border:"1px solid rgba(255,255,255,0.6)",color:"#fff",borderRadius:3,padding:"2px 8px",fontSize:11,fontWeight:700,cursor:"pointer",letterSpacing:"0.06em"},title:"Go to live (L)",children:"GO LIVE"}));Mt.displayName="GoLiveButton";var Ge=Lt.memo(({x:r,y:n,isPlaying:o,src:l,videoRef:c,playerRef:p,onClose:f,contextMenuItems:P})=>{let T=Lt.useRef(null),[x,u]=Lt.useState(()=>c.current?.loop??false),N=Math.min(r,window.innerWidth-220),h=Math.min(n,window.innerHeight-290);Lt.useEffect(()=>{let B=C=>{T.current&&!T.current.contains(C.target)&&f();},k=C=>{C.key==="Escape"&&f();},F=()=>f();return document.addEventListener("mousedown",B),document.addEventListener("keydown",k),window.addEventListener("scroll",F,true),()=>{document.removeEventListener("mousedown",B),document.removeEventListener("keydown",k),window.removeEventListener("scroll",F,true);}},[f]);let w=Lt.useCallback(()=>{o?p.pause():p.play(),f();},[o,p,f]),V=Lt.useCallback(()=>{let B=c.current;if(!B)return;let k=!x;B.loop=k,u(k);},[c,x]),A=Lt.useCallback(async()=>{try{await navigator.clipboard.writeText(l);}catch{}f();},[l,f]),H=Lt.useCallback(async()=>{let B=Math.floor(c.current?.currentTime??0);try{await navigator.clipboard.writeText(`${l}?t=${B}`);}catch{}f();},[l,c,f]),D=Lt.useCallback(()=>{p.togglePictureInPicture(),f();},[p,f]);return jsxRuntime.jsxs("div",{ref:T,className:"contextMenu",style:{left:N,top:h},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:w,children:o?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:V,children:[jsxRuntime.jsx("span",{children:"Loop"}),x&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:A,children:"Copy video URL"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:H,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:D,children:"Picture-in-Picture"}),P&&P.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),P.map((B,k)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{B.onClick(),f();},children:B.label},k))]})]})});Ge.displayName="ContextMenu";var Ye=Lt.memo(function({poster:n,logo:o,audioModeFallback:l,isBuffering:c=false,onOverlayClick:p}){return jsxRuntime.jsxs("div",{className:"rvp-audio-overlay",onClick:p,"data-test":"audio-mode-overlay",children:[n?jsxRuntime.jsx("div",{className:"rvp-audio-artwork-container",children:jsxRuntime.jsx("img",{src:n,alt:"Artwork",className:"rvp-audio-artwork",draggable:false})}):l?jsxRuntime.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center"},children:l}):o?typeof o=="string"?jsxRuntime.jsx("img",{src:o,alt:"Logo",className:"rvp-audio-logo",draggable:false}):jsxRuntime.jsx("div",{className:"rvp-audio-logo-node",children:o}):null,jsxRuntime.jsx("span",{className:"rvp-audio-label",children:"Audio Mode"}),c?jsxRuntime.jsx("div",{className:"rvp-audio-buffering-overlay","aria-label":"Buffering",children:jsxRuntime.jsx("div",{className:"rvp-audio-spinner"})}):null]})});Ye.displayName="AudioModeOverlay";var Tt=Lt.forwardRef((r,n)=>{let{src:o,poster:l,className:c,controls:p=true,options:f={}}=r,{autoplay:P=false,muted:T=false,loop:x=false,preload:u="metadata",playbackRates:N=[.25,.5,.75,1,1.25,1.5,1.75,2],enableHLS:h=true,enablePreview:w=true,thumbnailVtt:V,thumbnailVttBaseUrl:A,hlsConfig:H,autoHideControls:D=true,subtitles:B,crossOrigin:k,logo:F,audioModeFallback:C,audioPoster:g,audioSrc:R,showAudioButton:te,audioModeIcon:G,videoModeIcon:de,audioModeLabel:ie,videoModeLabel:se,defaultAudioMode:_,showQualityMenu:I,manualQualityLevels:le,audioBandwidthThreshold:Y,audioModeSwitchLevel:ue,audioModeRecoveryInterval:me,onPlay:fe,onPause:he,onEnded:e,onError:s,onTimeUpdate:d,onDurationChange:t,onBuffering:a,onTheaterModeChange:m,onAudioModeChange:E,contextMenuItems:y,controlBarItems:i}=f,v=Lt.useRef(null),b=Lt.useRef(null),z=Lt.useRef(null),[$,ne]=Lt.useState(void 0),[M,W]=Lt.useState(void 0);Lt.useEffect(()=>{ne(void 0),W(void 0);},[o]);let ve=Lt.useCallback(Z=>{ne(Z),W(Z);},[]),Qe=$??o,{state:S,ref:ce,fullscreenContainerRef:Ze}=rt(v,Qe,{autoplay:P,muted:T,loop:x,playbackRates:N,enableHLS:h,hlsConfig:H,defaultAudioMode:_,audioBandwidthThreshold:Y,audioModeSwitchLevel:ue,audioModeRecoveryInterval:me,onPlay:fe,onPause:he,onEnded:e,onError:s,onTimeUpdate:d,onDurationChange:t,onBuffering:a,onTheaterModeChange:m,onAudioModeChange:E,audioRef:b,audioSrc:R}),Be=Lt.useRef(null);Lt__default.default.useLayoutEffect(()=>{Be.current=S.isAudioMode&&R&&b.current?b.current:v.current;},[S.isAudioMode,R]),Be.current===null&&(Be.current=v.current);let[Ue,et]=Lt.useState(null);Lt.useEffect(()=>{Ze.current=z.current;},[Ze]),Lt__default.default.useImperativeHandle(n,()=>ce,[ce]);let tt=Lt.useCallback(()=>{z.current?.focus(),S.isPlaying?ce.pause():ce.play();},[S.isPlaying,ce]),Ct=Lt.useCallback(()=>{ce.toggleFullscreen();},[ce]),Rt=Lt.useCallback(Z=>{Z.preventDefault(),et({x:Z.clientX,y:Z.clientY});},[]);return jsxRuntime.jsxs("div",{ref:z,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:c,"data-test":"video-player-container","data-theater":S.isTheaterMode?"true":void 0,onContextMenu:Rt,children:[jsxRuntime.jsx("video",{ref:v,poster:l,preload:u,crossOrigin:k,onClick:tt,onDoubleClick:Ct,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer",visibility:S.isAudioMode?"hidden":"visible"},"data-test":"video-element",children:B?.map(Z=>jsxRuntime.jsx("track",{kind:"subtitles",src:Z.src,label:Z.label,srcLang:Z.srclang,default:Z.default},Z.id))}),R&&jsxRuntime.jsx("audio",{ref:b,preload:"none",style:{display:"none"},"aria-hidden":"true"}),S.isAudioMode&&jsxRuntime.jsx(Ye,{poster:g??(C?void 0:l),logo:F,audioModeFallback:C,isBuffering:S.isBuffering,onOverlayClick:tt}),p&&jsxRuntime.jsx(Fe,{videoRef:Be,playerRef:ce,playerContainerRef:z,playbackRates:N,enablePreview:w,thumbnailVtt:S.isAudioMode?void 0:V,thumbnailVttBaseUrl:A,isPlaying:S.isPlaying,volume:S.volume,isMuted:S.isMuted,playbackRate:S.playbackRate,isFullscreen:S.isFullscreen,isPictureInPicture:S.isPictureInPicture,isTheaterMode:S.isTheaterMode,isAudioMode:S.isAudioMode,showAudioButton:te??!!R,audioModeIcon:G,videoModeIcon:de,audioModeLabel:ie,videoModeLabel:se,isLive:S.isLive,qualityLevels:S.qualityLevels,currentQualityLevel:S.currentQualityLevel,showQualityMenu:I,manualQualityLevels:le,activeManualSrc:M,onManualQualityChange:ve,controlBarItems:i,autoHideControls:D}),Ue&&jsxRuntime.jsx(Ge,{x:Ue.x,y:Ue.y,isPlaying:S.isPlaying,src:o,videoRef:v,playerRef:ce,onClose:()=>et(null),contextMenuItems:y}),S.isLive&&jsxRuntime.jsx("div",{style:{position:"absolute",top:12,left:12,backgroundColor:"#e53935",color:"#fff",fontSize:11,fontWeight:700,letterSpacing:"0.08em",padding:"2px 8px",borderRadius:3,pointerEvents:"none"},children:"LIVE"}),S.isBuffering&&!S.error&&!S.isAudioMode&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,color:"#fff",pointerEvents:"none"},"data-test":"buffering-indicator",children:jsxRuntime.jsx("div",{style:{width:48,height:48,border:"4px solid rgba(255,255,255,0.25)",borderTop:"4px solid #fff",borderRadius:"50%",animation:"rvp-spin 0.8s linear infinite"}})}),S.error&&jsxRuntime.jsx("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0,0,0,0.85)",color:"#fff",padding:24},"data-test":"error-overlay",children:jsxRuntime.jsxs("div",{style:{textAlign:"center",maxWidth:400},children:[jsxRuntime.jsx("div",{style:{fontSize:36,marginBottom:12},children:"\u26A0"}),jsxRuntime.jsx("h3",{style:{margin:"0 0 8px",fontSize:18},children:S.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":S.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:S.error.message})]})})]})});Tt.displayName="VideoPlayer";var rn=Tt;var on={EXTREME:100,POOR:300,FAIR:800,GOOD:1500},an={LOWEST:0,SECOND_LOWEST:1,DISABLED:-1};exports.AUDIO_BANDWIDTH_THRESHOLDS=on;exports.AUDIO_SWITCH_LEVELS=an;exports.ControlElements=ht;exports.Controls=Fe;exports.VideoPlayer=rn;exports.findThumbnailCue=We;exports.formatTime=ge;exports.getMimeType=xt;exports.isHLSUrl=Le;exports.parseThumbnailVtt=$e;//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map