react-helios 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -109,6 +109,24 @@ To disable the preview entirely:
109
109
  | `onTimeUpdate` | `(time: number) => void` | — | Fired every ~250 ms during playback |
110
110
  | `onDurationChange` | `(duration: number) => void` | — | Fired when video duration becomes known |
111
111
  | `onBuffering` | `(isBuffering: boolean) => void` | — | Fired when buffering starts / stops |
112
+ | `contextMenuItems` | `ContextMenuItem[]` | — | Extra items appended to the right-click context menu |
113
+
114
+ ## Context Menu
115
+
116
+ Right-clicking the player shows a built-in menu (Play/Pause, Loop, Copy URL, Picture-in-Picture). You can append your own items by passing `contextMenuItems`:
117
+
118
+ ```tsx
119
+ import { VideoPlayer, ContextMenuItem } from "react-helios";
120
+
121
+ const items: ContextMenuItem[] = [
122
+ { label: "Add to Watchlist", onClick: () => addToWatchlist() },
123
+ { label: "Share", onClick: () => openShareDialog() },
124
+ ];
125
+
126
+ <VideoPlayer src="..." contextMenuItems={items} />
127
+ ```
128
+
129
+ Each item closes the menu automatically after its `onClick` is called.
112
130
 
113
131
  ## Imperative API (Ref)
114
132
 
@@ -203,6 +221,7 @@ import type {
203
221
  VideoError,
204
222
  VideoErrorCode,
205
223
  ThumbnailCue,
224
+ ContextMenuItem,
206
225
  } from "react-helios";
207
226
 
208
227
  // VTT utilities (useful for server-side pre-parsing or custom UIs)
package/dist/index.d.mts CHANGED
@@ -59,6 +59,10 @@ interface VideoPlayerRef {
59
59
  getState: () => PlayerState;
60
60
  getVideoElement: () => HTMLVideoElement | null;
61
61
  }
62
+ interface ContextMenuItem {
63
+ label: string;
64
+ onClick: () => void;
65
+ }
62
66
  interface VideoPlayerProps {
63
67
  src: string;
64
68
  poster?: string;
@@ -100,6 +104,7 @@ interface VideoPlayerProps {
100
104
  onDurationChange?: (duration: number) => void;
101
105
  onBuffering?: (isBuffering: boolean) => void;
102
106
  onTheaterModeChange?: (isTheater: boolean) => void;
107
+ contextMenuItems?: ContextMenuItem[];
103
108
  }
104
109
 
105
110
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
@@ -264,4 +269,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
264
269
  */
265
270
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
266
271
 
267
- export { type BufferedRange, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
272
+ export { type BufferedRange, type ContextMenuItem, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
package/dist/index.d.ts CHANGED
@@ -59,6 +59,10 @@ interface VideoPlayerRef {
59
59
  getState: () => PlayerState;
60
60
  getVideoElement: () => HTMLVideoElement | null;
61
61
  }
62
+ interface ContextMenuItem {
63
+ label: string;
64
+ onClick: () => void;
65
+ }
62
66
  interface VideoPlayerProps {
63
67
  src: string;
64
68
  poster?: string;
@@ -100,6 +104,7 @@ interface VideoPlayerProps {
100
104
  onDurationChange?: (duration: number) => void;
101
105
  onBuffering?: (isBuffering: boolean) => void;
102
106
  onTheaterModeChange?: (isTheater: boolean) => void;
107
+ contextMenuItems?: ContextMenuItem[];
103
108
  }
104
109
 
105
110
  declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
@@ -264,4 +269,4 @@ declare function parseThumbnailVtt(text: string, baseUrl?: string): ThumbnailCue
264
269
  */
265
270
  declare function findThumbnailCue(cues: ThumbnailCue[], time: number): ThumbnailCue | null;
266
271
 
267
- export { type BufferedRange, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
272
+ export { type BufferedRange, type ContextMenuItem, index as ControlElements, Controls, type HLSQualityLevel, type PlaybackRate, type PlayerState, type SubtitleTrack, type ThumbnailCue, type VideoError, type VideoErrorCode, VideoPlayer, type VideoPlayerProps, type VideoPlayerRef, findThumbnailCue, formatTime, getMimeType, isHLSUrl, parseThumbnailVtt };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var yt=require('react'),pe=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var yt__default=/*#__PURE__*/_interopDefault(yt);var pe__default=/*#__PURE__*/_interopDefault(pe);var qe=Object.defineProperty;var Xe=(n,e)=>{for(var m in e)qe(n,m,{get:e[m],enumerable:true});};function J(n){if(!Number.isFinite(n)||n<0)return "0:00";let e=Math.floor(n),m=Math.floor(e/3600),l=Math.floor(e%3600/60),a=e%60;return m>0?`${m}:${String(l).padStart(2,"0")}:${String(a).padStart(2,"0")}`:`${l}:${String(a).padStart(2,"0")}`}function me(n){try{return new URL(n,"https://x").pathname.toLowerCase().endsWith(".m3u8")||/\/hls\//i.test(n)||/\/stream\.m3u8/i.test(n)}catch{return n.toLowerCase().includes(".m3u8")}}function je(n){if(me(n))return "application/x-mpegURL";let e=n.toLowerCase().split("?")[0];return e.endsWith(".mp4")?"video/mp4":e.endsWith(".webm")?"video/webm":e.endsWith(".ogv")||e.endsWith(".ogg")?"video/ogg":e.endsWith(".mov")?"video/quicktime":"video/mp4"}function Se(n){return n.map((e,m)=>({id:m,height:e.height??0,width:e.width??0,bitrate:e.bitrate??0,name:e.height?`${e.height}p`:`Level ${m+1}`}))}var Je={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isTheaterMode:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function De(n,e,m={}){let l=yt.useRef(null),a=yt.useRef(null),f=yt.useRef(1),c=yt.useRef(0),u=yt.useRef(m);u.current=m;let[b,p]=yt.useState({...Je,isMuted:m.muted??false,volume:m.muted?0:1}),P=yt.useRef(b);P.current=b,yt.useEffect(()=>{let t=n.current;if(!t||(l.current&&(l.current.destroy(),l.current=null),c.current=0,p(d=>({...d,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1})),!e))return;let o=u.current;if(o.enableHLS!==false&&me(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),o.autoplay&&t.play().catch(()=>{});else if(pe__default.default.isSupported()){let d=new pe__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...o.hlsConfig});d.attachMedia(t),d.loadSource(e),d.on(pe.Events.MANIFEST_PARSED,(F,R)=>{let h=Se(R.levels);p(g=>({...g,qualityLevels:h,currentQualityLevel:-1})),u.current.autoplay&&t.play().catch(()=>{});}),d.on(pe.Events.LEVEL_SWITCHED,(F,R)=>{p(h=>({...h,currentQualityLevel:R.level}));});let S=3;d.on(pe.Events.ERROR,(F,R)=>{if(!R.fatal){console.warn("[hls] non-fatal:",R.details);return}switch(R.type){case pe__default.default.ErrorTypes.NETWORK_ERROR:if(c.current<S){c.current+=1;let h=1e3*c.current;console.warn(`[hls] network error \u2013 retry ${c.current}/${S} in ${h}ms`),setTimeout(()=>{l.current===d&&d.startLoad();},h);}else {let h={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};p(g=>({...g,error:h})),u.current.onError?.(h);}break;case pe__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),d.recoverMediaError();break;default:{d.destroy(),l.current=null;let h={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};p(g=>({...g,error:h})),u.current.onError?.(h);break}}}),l.current=d;}}else t.src=e,t.load(),o.autoplay&&t.play().catch(()=>{});return ()=>{l.current&&(l.current.destroy(),l.current=null);}},[e,n]),yt.useEffect(()=>{let t=n.current;if(!t)return;u.current.muted&&(t.muted=true),u.current.loop&&(t.loop=true);let o=()=>{p(i=>({...i,isPlaying:true})),u.current.onPlay?.();},d=()=>{p(i=>({...i,isPlaying:false})),u.current.onPause?.();},S=()=>{p(i=>({...i,isPlaying:false})),u.current.onEnded?.();},F=()=>{u.current.onTimeUpdate?.(t.currentTime);},R=()=>{let i=t.duration,E=!Number.isFinite(i);p(A=>({...A,duration:E?0:i,isLive:E})),E||u.current.onDurationChange?.(i);},h=()=>{let i=t.volume;i>0&&!t.muted&&(f.current=i),p(E=>({...E,volume:i,isMuted:t.muted||i===0}));},g=()=>{p(i=>({...i,playbackRate:t.playbackRate}));},W=()=>{let i=t.error;if(!i)return;let A={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[i.code]??"UNKNOWN",message:i.message||"Unknown media error"};p(ye=>({...ye,error:A})),u.current.onError?.(A);},H=()=>{p(i=>({...i,isBuffering:true})),u.current.onBuffering?.(true);},G=()=>{p(i=>({...i,isBuffering:false})),u.current.onBuffering?.(false);},ee=()=>p(i=>({...i,isBuffering:false})),Y=()=>{},r=()=>{let i=!!(document.fullscreenElement||document.webkitFullscreenElement);p(E=>({...E,isFullscreen:i}));},s=()=>{p(i=>({...i,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",o),t.addEventListener("pause",d),t.addEventListener("ended",S),t.addEventListener("timeupdate",F),t.addEventListener("durationchange",R),t.addEventListener("volumechange",h),t.addEventListener("ratechange",g),t.addEventListener("error",W),t.addEventListener("waiting",H),t.addEventListener("canplay",G),t.addEventListener("playing",ee),t.addEventListener("progress",Y),document.addEventListener("fullscreenchange",r),document.addEventListener("webkitfullscreenchange",r),t.addEventListener("enterpictureinpicture",s),t.addEventListener("leavepictureinpicture",s),()=>{t.removeEventListener("play",o),t.removeEventListener("pause",d),t.removeEventListener("ended",S),t.removeEventListener("timeupdate",F),t.removeEventListener("durationchange",R),t.removeEventListener("volumechange",h),t.removeEventListener("ratechange",g),t.removeEventListener("error",W),t.removeEventListener("waiting",H),t.removeEventListener("canplay",G),t.removeEventListener("playing",ee),t.removeEventListener("progress",Y),document.removeEventListener("fullscreenchange",r),document.removeEventListener("webkitfullscreenchange",r),t.removeEventListener("enterpictureinpicture",s),t.removeEventListener("leavepictureinpicture",s);}},[n]);let T=yt.useCallback(async()=>{let t=n.current;if(t)try{await t.play();}catch(o){o instanceof Error&&o.name!=="AbortError"&&console.error("[player] play() failed:",o);}},[n]),V=yt.useCallback(()=>{n.current?.pause();},[n]),y=yt.useCallback(t=>{let o=n.current;o&&(o.currentTime=Math.max(0,Math.min(t,o.duration||t)));},[n]),v=yt.useCallback(t=>{let o=n.current;if(!o)return;let d=Math.max(0,Math.min(t,1));d>0&&(f.current=d),o.volume=d,o.muted=d===0;},[n]),w=yt.useCallback(()=>{let t=n.current;if(t)if(t.muted||t.volume===0){let o=f.current>0?f.current:1;t.volume=o,t.muted=false;}else f.current=t.volume,t.muted=true;},[n]),B=yt.useCallback(t=>{let o=n.current;o&&(o.playbackRate=t);},[n]),M=yt.useCallback(t=>{let o=l.current;o&&(o.currentLevel=t,p(d=>({...d,currentQualityLevel:t})));},[]),L=yt.useCallback(()=>{let t=l.current,o=n.current;if(!t||!o)return;let d=t.liveSyncPosition;d!=null&&Number.isFinite(d)&&(o.currentTime=d);},[n]),x=yt.useCallback(async()=>{let t=n.current;if(!t)return;let o=a.current??t.parentElement;if(o)try{!document.fullscreenElement&&!document.webkitFullscreenElement?o.requestFullscreen?await o.requestFullscreen():o.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(d){console.error("[player] fullscreen toggle failed:",d);}},[n]),N=yt.useCallback(async()=>{let t=n.current;if(t)try{document.pictureInPictureElement?await document.exitPictureInPicture():await t.requestPictureInPicture();}catch(o){console.error("[player] PiP toggle failed:",o);}},[n]),k=yt.useCallback(()=>{p(t=>{let o=!t.isTheaterMode;return u.current.onTheaterModeChange?.(o),{...t,isTheaterMode:o}});},[]),Q=yt.useCallback(()=>{let t=n.current,o=t?.currentTime??0,d=[];if(t)for(let S=0;S<t.buffered.length;S++)d.push({start:t.buffered.start(S),end:t.buffered.end(S)});return {...P.current,currentTime:o,bufferedRanges:d}},[n]),q=yt.useCallback(()=>n.current??null,[n]),_=yt.useMemo(()=>({play:T,pause:V,seek:y,setVolume:v,toggleMute:w,setPlaybackRate:B,setQualityLevel:M,seekToLive:L,toggleFullscreen:x,togglePictureInPicture:N,toggleTheaterMode:k,getState:Q,getVideoElement:q}),[T,V,y,v,w,B,M,L,x,N,k,Q,q]);return {state:b,ref:_,hlsRef:l,fullscreenContainerRef:a}}var Ae={};Xe(Ae,{ControlElements:()=>$,FullscreenButton:()=>ue,PauseButton:()=>le,PiPButton:()=>ce,PlayButton:()=>se,ProgressBar:()=>ve,SettingsMenu:()=>he,TheaterButton:()=>de,TimeDisplay:()=>be,VolumeControl:()=>fe});var se=yt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,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"})})}));se.displayName="PlayButton";var le=yt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,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"})})}));le.displayName="PauseButton";var ue=yt.memo(({onClick:n,isFullscreen:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Fullscreen":"Fullscreen",title:e?"Exit Fullscreen (F)":"Fullscreen (F)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:e?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"})})}));ue.displayName="FullscreenButton";var ce=yt.memo(({onClick:n,isPiP:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Picture-in-Picture":"Picture-in-Picture",title:e?"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"})})}));ce.displayName="PiPButton";var de=yt.memo(({onClick:n,isTheater:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Theater Mode":"Theater Mode",title:e?"Exit Theater Mode (T)":"Theater Mode (T)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:e?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"})})}));de.displayName="TheaterButton";var Be=yt.memo(({volume:n,isMuted:e,onVolumeChange:m,onToggleMute:l})=>{let[a,f]=yt.useState(false),c=e?0:n,u=c*100,b=yt.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${u}%, rgba(255,255,255,0.3) ${u}%, rgba(255,255,255,0.3) 100%)`,[u]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),children:[jsxRuntime.jsx("button",{onClick:l,className:"controlButton","aria-label":e?"Unmute":"Mute",title:e?"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"})})}),a&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:u,onChange:p=>m(Number(p.target.value)/100),className:"volumeSlider",style:{background:b},"aria-label":"Volume","aria-valuenow":Math.round(u)})]})});Be.displayName="VolumeControl";var fe=Be;function He(n){let e=n.trim().split(":");return e.length===3?+e[0]*3600+ +e[1]*60+parseFloat(e[2]):+e[0]*60+parseFloat(e[1])}function rt(n,e){if(/^https?:\/\//i.test(e))return e;try{return new URL(e,n).href}catch{return e}}function Le(n,e=""){let m=[],l=n.replace(/\r\n/g,`
1
+ 'use strict';var Et=require('react'),pe=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Et__default=/*#__PURE__*/_interopDefault(Et);var pe__default=/*#__PURE__*/_interopDefault(pe);var qe=Object.defineProperty;var Xe=(n,e)=>{for(var p in e)qe(n,p,{get:e[p],enumerable:true});};function J(n){if(!Number.isFinite(n)||n<0)return "0:00";let e=Math.floor(n),p=Math.floor(e/3600),l=Math.floor(e%3600/60),o=e%60;return p>0?`${p}:${String(l).padStart(2,"0")}:${String(o).padStart(2,"0")}`:`${l}:${String(o).padStart(2,"0")}`}function me(n){try{return new URL(n,"https://x").pathname.toLowerCase().endsWith(".m3u8")||/\/hls\//i.test(n)||/\/stream\.m3u8/i.test(n)}catch{return n.toLowerCase().includes(".m3u8")}}function je(n){if(me(n))return "application/x-mpegURL";let e=n.toLowerCase().split("?")[0];return e.endsWith(".mp4")?"video/mp4":e.endsWith(".webm")?"video/webm":e.endsWith(".ogv")||e.endsWith(".ogg")?"video/ogg":e.endsWith(".mov")?"video/quicktime":"video/mp4"}function Re(n){return n.map((e,p)=>({id:p,height:e.height??0,width:e.width??0,bitrate:e.bitrate??0,name:e.height?`${e.height}p`:`Level ${p+1}`}))}var Je={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isTheaterMode:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function Be(n,e,p={}){let l=Et.useRef(null),o=Et.useRef(null),f=Et.useRef(1),d=Et.useRef(0),c=Et.useRef(p);c.current=p;let[b,m]=Et.useState({...Je,isMuted:p.muted??false,volume:p.muted?0:1}),M=Et.useRef(b);M.current=b,Et.useEffect(()=>{let t=n.current;if(!t||(l.current&&(l.current.destroy(),l.current=null),d.current=0,m(i=>({...i,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1})),!e))return;let u=c.current;if(u.enableHLS!==false&&me(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),u.autoplay&&t.play().catch(()=>{});else if(pe__default.default.isSupported()){let i=new pe__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...u.hlsConfig});i.attachMedia(t),i.loadSource(e),i.on(pe.Events.MANIFEST_PARSED,(z,w)=>{let h=Re(w.levels);m(g=>({...g,qualityLevels:h,currentQualityLevel:-1})),c.current.autoplay&&t.play().catch(()=>{});}),i.on(pe.Events.LEVEL_SWITCHED,(z,w)=>{m(h=>({...h,currentQualityLevel:w.level}));});let L=3;i.on(pe.Events.ERROR,(z,w)=>{if(!w.fatal){console.warn("[hls] non-fatal:",w.details);return}switch(w.type){case pe__default.default.ErrorTypes.NETWORK_ERROR:if(d.current<L){d.current+=1;let h=1e3*d.current;console.warn(`[hls] network error \u2013 retry ${d.current}/${L} in ${h}ms`),setTimeout(()=>{l.current===i&&i.startLoad();},h);}else {let h={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};m(g=>({...g,error:h})),c.current.onError?.(h);}break;case pe__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),i.recoverMediaError();break;default:{i.destroy(),l.current=null;let h={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};m(g=>({...g,error:h})),c.current.onError?.(h);break}}}),l.current=i;}}else t.src=e,t.load(),u.autoplay&&t.play().catch(()=>{});return ()=>{l.current&&(l.current.destroy(),l.current=null);}},[e,n]),Et.useEffect(()=>{let t=n.current;if(!t)return;c.current.muted&&(t.muted=true),c.current.loop&&(t.loop=true);let u=()=>{m(a=>({...a,isPlaying:true})),c.current.onPlay?.();},i=()=>{m(a=>({...a,isPlaying:false})),c.current.onPause?.();},L=()=>{m(a=>({...a,isPlaying:false})),c.current.onEnded?.();},z=()=>{c.current.onTimeUpdate?.(t.currentTime);},w=()=>{let a=t.duration,P=!Number.isFinite(a);m(A=>({...A,duration:P?0:a,isLive:P})),P||c.current.onDurationChange?.(a);},h=()=>{let a=t.volume;a>0&&!t.muted&&(f.current=a),m(P=>({...P,volume:a,isMuted:t.muted||a===0}));},g=()=>{m(a=>({...a,playbackRate:t.playbackRate}));},U=()=>{let a=t.error;if(!a)return;let A={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[a.code]??"UNKNOWN",message:a.message||"Unknown media error"};m(ye=>({...ye,error:A})),c.current.onError?.(A);},j=()=>{m(a=>({...a,isBuffering:true})),c.current.onBuffering?.(true);},D=()=>{m(a=>({...a,isBuffering:false})),c.current.onBuffering?.(false);},ee=()=>m(a=>({...a,isBuffering:false})),Y=()=>{},r=()=>{let a=!!(document.fullscreenElement||document.webkitFullscreenElement);m(P=>({...P,isFullscreen:a}));},s=()=>{m(a=>({...a,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",u),t.addEventListener("pause",i),t.addEventListener("ended",L),t.addEventListener("timeupdate",z),t.addEventListener("durationchange",w),t.addEventListener("volumechange",h),t.addEventListener("ratechange",g),t.addEventListener("error",U),t.addEventListener("waiting",j),t.addEventListener("canplay",D),t.addEventListener("playing",ee),t.addEventListener("progress",Y),document.addEventListener("fullscreenchange",r),document.addEventListener("webkitfullscreenchange",r),t.addEventListener("enterpictureinpicture",s),t.addEventListener("leavepictureinpicture",s),()=>{t.removeEventListener("play",u),t.removeEventListener("pause",i),t.removeEventListener("ended",L),t.removeEventListener("timeupdate",z),t.removeEventListener("durationchange",w),t.removeEventListener("volumechange",h),t.removeEventListener("ratechange",g),t.removeEventListener("error",U),t.removeEventListener("waiting",j),t.removeEventListener("canplay",D),t.removeEventListener("playing",ee),t.removeEventListener("progress",Y),document.removeEventListener("fullscreenchange",r),document.removeEventListener("webkitfullscreenchange",r),t.removeEventListener("enterpictureinpicture",s),t.removeEventListener("leavepictureinpicture",s);}},[n]);let x=Et.useCallback(async()=>{let t=n.current;if(t)try{await t.play();}catch(u){u instanceof Error&&u.name!=="AbortError"&&console.error("[player] play() failed:",u);}},[n]),V=Et.useCallback(()=>{n.current?.pause();},[n]),E=Et.useCallback(t=>{let u=n.current;u&&(u.currentTime=Math.max(0,Math.min(t,u.duration||t)));},[n]),v=Et.useCallback(t=>{let u=n.current;if(!u)return;let i=Math.max(0,Math.min(t,1));i>0&&(f.current=i),u.volume=i,u.muted=i===0;},[n]),R=Et.useCallback(()=>{let t=n.current;if(t)if(t.muted||t.volume===0){let u=f.current>0?f.current:1;t.volume=u,t.muted=false;}else f.current=t.volume,t.muted=true;},[n]),H=Et.useCallback(t=>{let u=n.current;u&&(u.playbackRate=t);},[n]),k=Et.useCallback(t=>{let u=l.current;u&&(u.currentLevel=t,m(i=>({...i,currentQualityLevel:t})));},[]),y=Et.useCallback(()=>{let t=l.current,u=n.current;if(!t||!u)return;let i=t.liveSyncPosition;i!=null&&Number.isFinite(i)&&(u.currentTime=i);},[n]),T=Et.useCallback(async()=>{let t=n.current;if(!t)return;let u=o.current??t.parentElement;if(u)try{!document.fullscreenElement&&!document.webkitFullscreenElement?u.requestFullscreen?await u.requestFullscreen():u.webkitRequestFullscreen?.():document.exitFullscreen?await document.exitFullscreen():document.webkitExitFullscreen?.();}catch(i){console.error("[player] fullscreen toggle failed:",i);}},[n]),N=Et.useCallback(async()=>{let t=n.current;if(t)try{document.pictureInPictureElement?await document.exitPictureInPicture():await t.requestPictureInPicture();}catch(u){console.error("[player] PiP toggle failed:",u);}},[n]),C=Et.useCallback(()=>{m(t=>{let u=!t.isTheaterMode;return c.current.onTheaterModeChange?.(u),{...t,isTheaterMode:u}});},[]),Q=Et.useCallback(()=>{let t=n.current,u=t?.currentTime??0,i=[];if(t)for(let L=0;L<t.buffered.length;L++)i.push({start:t.buffered.start(L),end:t.buffered.end(L)});return {...M.current,currentTime:u,bufferedRanges:i}},[n]),q=Et.useCallback(()=>n.current??null,[n]),X=Et.useMemo(()=>({play:x,pause:V,seek:E,setVolume:v,toggleMute:R,setPlaybackRate:H,setQualityLevel:k,seekToLive:y,toggleFullscreen:T,togglePictureInPicture:N,toggleTheaterMode:C,getState:Q,getVideoElement:q}),[x,V,E,v,R,H,k,y,T,N,C,Q,q]);return {state:b,ref:X,hlsRef:l,fullscreenContainerRef:o}}var _e={};Xe(_e,{ControlElements:()=>_,FullscreenButton:()=>le,PauseButton:()=>se,PiPButton:()=>ue,PlayButton:()=>ie,ProgressBar:()=>ve,SettingsMenu:()=>he,TheaterButton:()=>ce,TimeDisplay:()=>be,VolumeControl:()=>fe});var ie=Et.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,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"})})}));ie.displayName="PlayButton";var se=Et.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,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"})})}));se.displayName="PauseButton";var le=Et.memo(({onClick:n,isFullscreen:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Fullscreen":"Fullscreen",title:e?"Exit Fullscreen (F)":"Fullscreen (F)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:e?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"})})}));le.displayName="FullscreenButton";var ue=Et.memo(({onClick:n,isPiP:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Picture-in-Picture":"Picture-in-Picture",title:e?"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"})})}));ue.displayName="PiPButton";var ce=Et.memo(({onClick:n,isTheater:e=false})=>jsxRuntime.jsx("button",{onClick:n,className:"controlButton","aria-label":e?"Exit Theater Mode":"Theater Mode",title:e?"Exit Theater Mode (T)":"Theater Mode (T)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:e?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"})})}));ce.displayName="TheaterButton";var He=Et.memo(({volume:n,isMuted:e,onVolumeChange:p,onToggleMute:l})=>{let[o,f]=Et.useState(false),d=e?0:n,c=d*100,b=Et.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${c}%, rgba(255,255,255,0.3) ${c}%, rgba(255,255,255,0.3) 100%)`,[c]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>f(true),onMouseLeave:()=>f(false),children:[jsxRuntime.jsx("button",{onClick:l,className:"controlButton","aria-label":e?"Unmute":"Mute",title:e?"Unmute (M)":"Mute (M)",children:jsxRuntime.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"currentColor",children:d===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"}):d<.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"})})}),o&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:c,onChange:m=>p(Number(m.target.value)/100),className:"volumeSlider",style:{background:b},"aria-label":"Volume","aria-valuenow":Math.round(c)})]})});He.displayName="VolumeControl";var fe=He;function Ve(n){let e=n.trim().split(":");return e.length===3?+e[0]*3600+ +e[1]*60+parseFloat(e[2]):+e[0]*60+parseFloat(e[1])}function rt(n,e){if(/^https?:\/\//i.test(e))return e;try{return new URL(e,n).href}catch{return e}}function Le(n,e=""){let p=[],l=n.replace(/\r\n/g,`
2
2
  `).split(`
3
- `),a=0;for(;a<l.length;){let f=l[a].trim();if(f.includes("-->")){let c=f.indexOf("-->"),u=He(f.slice(0,c)),b=He(f.slice(c+3));for(a++;a<l.length&&!l[a].trim();)a++;if(a<l.length){let p=l[a].trim(),P=p.lastIndexOf("#xywh="),T=p,V=0,y=0,v=160,w=90;if(P!==-1){T=p.slice(0,P);let B=p.slice(P+6).split(",").map(Number);V=B[0]??0,y=B[1]??0,v=B[2]??160,w=B[3]??90;}m.push({start:u,end:b,url:rt(e,T),x:V,y,w:v,h:w});}}a++;}return m}function Pe(n,e){if(!n.length)return null;let m=0,l=n.length-1;for(;m<=l;){let a=m+l>>1;if(n[a].end<=e)m=a+1;else if(n[a].start>e)l=a-1;else return n[a]}return null}var Ve=yt.memo(({videoRef:n,playerRef:e,enablePreview:m=true,thumbnailVtt:l})=>{let a=yt.useRef(null),f=yt.useRef(null),c=yt.useRef(null),u=yt.useRef(null),b=yt.useRef(null),p=yt.useRef(null),P=yt.useRef(null),[T,V]=yt.useState([]),y=yt.useRef(false),v=yt.useRef(0),w=yt.useRef(0),B=yt.useRef(null),M=yt.useRef([]),L=yt.useRef(null);yt.useEffect(()=>{let r=()=>{L.current=null;};return window.addEventListener("resize",r,{passive:true}),()=>window.removeEventListener("resize",r)},[]);let x=yt.useCallback(()=>(!L.current&&a.current&&(L.current=a.current.getBoundingClientRect()),L.current),[]);yt.useEffect(()=>{if(!l){M.current=[];return}let r=false;return fetch(l).then(s=>s.text()).then(s=>{r||(M.current=Le(s,l));}).catch(()=>{r||(M.current=[]);}),()=>{r=true;}},[l]),yt.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let i=isFinite(r.duration)?r.duration:0,E=r.currentTime,A=i>0?E/i*100:0;f.current&&(f.current.style.width=`${A}%`),c.current&&(c.current.style.left=`${A}%`),a.current&&(a.current.setAttribute("aria-valuenow",String(Math.round(E))),a.current.setAttribute("aria-valuemax",String(Math.round(i))),a.current.setAttribute("aria-valuetext",J(E)));};return r.addEventListener("timeupdate",s),r.addEventListener("durationchange",s),r.addEventListener("seeked",s),s(),()=>{r.removeEventListener("timeupdate",s),r.removeEventListener("durationchange",s),r.removeEventListener("seeked",s);}},[n]),yt.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let i=[];for(let E=0;E<r.buffered.length;E++)i.push({start:r.buffered.start(E),end:r.buffered.end(E)});V(i);};return r.addEventListener("progress",s),()=>r.removeEventListener("progress",s)},[n]);let N=yt.useCallback(()=>{y.current=true,c.current?.classList.add("dragging");},[]),k=yt.useCallback(()=>{y.current=false,c.current?.classList.remove("dragging");},[]),Q=yt.useCallback(()=>{m&&(L.current=null,u.current&&(u.current.style.display=""),p.current&&(p.current.style.display=""));},[m]),q=yt.useCallback(()=>{u.current&&(u.current.style.display="none"),p.current&&(p.current.style.display="none");},[]),_=yt.useCallback(r=>{if(!P.current||!M.current.length)return;let s=Pe(M.current,r);if(B.current=s,!s)return;let i=P.current;i.style.backgroundImage=`url(${s.url})`,i.style.backgroundPosition=`-${s.x}px -${s.y}px`,i.style.width=`${s.w}px`,i.style.height=`${s.h}px`;},[]),t=yt.useCallback(r=>{let s=x(),i=n.current?.duration;return !s||s.width===0||!i||!isFinite(i)?0:Math.max(0,Math.min(r-s.left,s.width))/s.width*i},[x,n]),o=yt.useCallback(r=>{let s=x();return s?Math.max(0,Math.min(r-s.left,s.width)):0},[x]),d=yt.useCallback(r=>{let s=n.current;if(!s)return;let i=s.currentTime,E=isFinite(s.duration)?s.duration:0;switch(r.key){case "ArrowLeft":case "ArrowRight":{r.preventDefault(),r.nativeEvent.stopImmediatePropagation();let A=r.shiftKey?10:5;e.seek(r.key==="ArrowLeft"?Math.max(0,i-A):Math.min(E,i+A));break}case "Home":r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(0);break;case "End":E>0&&(r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(E));break}},[n,e]),S=yt.useCallback(r=>{let s=t(r.clientX),i=o(r.clientX);v.current=i,w.current=s,u.current&&(u.current.style.left=`${i}px`),p.current&&(p.current.style.left=`${i}px`),b.current&&(b.current.textContent=J(s)),_(s),y.current&&e.seek(s);},[e,_,t,o]),F=yt.useCallback(()=>{Q();},[Q]),R=yt.useCallback(()=>{q(),k();},[q,k]),h=yt.useCallback(r=>{r.preventDefault(),N(),e.seek(t(r.clientX));},[N,t,e]),g=yt.useCallback(()=>k(),[k]),W=yt.useCallback(r=>{y.current||e.seek(t(r.clientX));},[t,e]);yt.useEffect(()=>{let r=a.current;if(!r)return;let s=i=>{y.current&&i.preventDefault();};return r.addEventListener("touchmove",s,{passive:false}),()=>r.removeEventListener("touchmove",s)},[]);let H=yt.useCallback(r=>{L.current=null,N(),e.seek(t(r.touches[0].clientX));},[N,t,e]),G=yt.useCallback(r=>{y.current&&e.seek(t(r.touches[0].clientX));},[t,e]),ee=yt.useCallback(()=>k(),[k]);yt.useEffect(()=>{let r=()=>k();return window.addEventListener("mouseup",r),()=>window.removeEventListener("mouseup",r)},[k]);let Y=yt.useMemo(()=>{let r=n.current,s=r&&isFinite(r.duration)?r.duration:0;return s<=0||!T.length?null:T.map((i,E)=>{let A=i.start/s*100,ye=(i.end-i.start)/s*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${A}%`,width:`${ye}%`}},E)})},[T,n]);return jsxRuntime.jsxs("div",{ref:a,className:"progressContainer",onMouseMove:S,onMouseEnter:F,onMouseLeave:R,onMouseDown:h,onMouseUp:g,onClick:W,onTouchStart:H,onTouchMove:G,onTouchEnd:ee,onKeyDown:d,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[m&&jsxRuntime.jsxs("div",{ref:u,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[l&&jsxRuntime.jsx("div",{ref:P,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:b,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[Y,jsxRuntime.jsx("div",{ref:f,className:"progressFilled",style:{width:"0%"}}),m&&jsxRuntime.jsx("div",{ref:p,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:c,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});Ve.displayName="ProgressBar";var ve=Ve;var Ie=yt.memo(({currentRate:n,playbackRates:e,onRateChange:m,qualityLevels:l=[],currentQualityLevel:a=-1,onQualityChange:f})=>{let[c,u]=yt.useState(false),[b,p]=yt.useState("speed"),P=yt.useRef(null),T=l.length>0&&!!f;yt.useEffect(()=>{let v=w=>{P.current&&!P.current.contains(w.target)&&u(false);};return c&&document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[c]);let V=yt.useMemo(()=>[...l].sort((v,w)=>w.bitrate-v.bitrate),[l]),y=yt.useMemo(()=>a===-1?"Auto":l.find(v=>v.id===a)?.name??"Auto",[l,a]);return jsxRuntime.jsxs("div",{ref:P,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>u(v=>!v),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:[T&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${b==="speed"?" active":""}`,onClick:()=>p("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${b==="quality"?" active":""}`,onClick:()=>p("quality"),children:"Quality"})]}),(!T||b==="speed")&&jsxRuntime.jsxs("div",{children:[!T&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),e.map(v=>jsxRuntime.jsx("button",{onClick:()=>{m(v),u(false);},className:`settingsOption${n===v?" active":""}`,role:"menuitemradio","aria-checked":n===v,children:v===1?"Normal":`${v}\xD7`},v))]}),T&&b==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{f(-1),u(false);},className:`settingsOption${a===-1?" active":""}`,role:"menuitemradio","aria-checked":a===-1,children:["Auto ",a===-1&&y!=="Auto"?`(${y})`:""]}),V.map(v=>jsxRuntime.jsxs("button",{onClick:()=>{f(v.id),u(false);},className:`settingsOption${a===v.id?" active":""}`,role:"menuitemradio","aria-checked":a===v.id,children:[v.name,v.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(v.bitrate/1e3)," kbps"]})]},v.id))]})]})]})});Ie.displayName="SettingsMenu";var he=Ie;var ze=yt.memo(({videoRef:n,isLive:e=false})=>{let m=yt.useRef(null),l=yt.useRef(null);return yt.useEffect(()=>{let a=n.current;if(!a)return;let f=()=>{m.current&&(m.current.textContent=J(a.currentTime));},c=()=>{if(l.current){let u=isFinite(a.duration)?a.duration:0;l.current.textContent=` / ${J(u)}`;}};return a.addEventListener("timeupdate",f),a.addEventListener("durationchange",c),a.addEventListener("seeked",f),f(),c(),()=>{a.removeEventListener("timeupdate",f),a.removeEventListener("durationchange",c),a.removeEventListener("seeked",f);}},[n,e]),e?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:m,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:m,children:"0:00"}),jsxRuntime.jsx("span",{ref:l,style:{opacity:.6},children:" / 0:00"})]})});ze.displayName="TimeDisplay";var be=ze;var $={PlayButton:se,PauseButton:le,FullscreenButton:ue,PiPButton:ce,TheaterButton:de,VolumeControl:fe,ProgressBar:ve,SettingsMenu:he,TimeDisplay:be};var xe=({videoRef:n,playerRef:e,playerContainerRef:m,playbackRates:l,enablePreview:a,thumbnailVtt:f,isPlaying:c,volume:u,isMuted:b,playbackRate:p,isFullscreen:P,isPictureInPicture:T,isTheaterMode:V,isLive:y,qualityLevels:v,currentQualityLevel:w})=>{let B=yt.useRef(null),M=yt.useRef(null),[L,x]=yt.useState(true),N=yt.useRef({isPlaying:c,volume:u,isMuted:b,isLive:y});N.current={isPlaying:c,volume:u,isMuted:b,isLive:y},yt.useEffect(()=>{if(!c){x(true),M.current&&clearTimeout(M.current);return}let h=()=>{x(true),M.current&&clearTimeout(M.current),M.current=setTimeout(()=>x(false),3e3);},g=B.current;return g&&(g.addEventListener("mousemove",h),g.addEventListener("mouseenter",h),g.addEventListener("touchstart",h,{passive:true})),h(),()=>{g&&(g.removeEventListener("mousemove",h),g.removeEventListener("mouseenter",h),g.removeEventListener("touchstart",h)),M.current&&clearTimeout(M.current);}},[c]),yt.useEffect(()=>{let h=g=>{if(!m.current?.contains(document.activeElement))return;let W=g.target;if(W.tagName==="INPUT"||W.tagName==="TEXTAREA"||W.isContentEditable)return;let{isPlaying:H,volume:G,isLive:ee}=N.current,Y=n.current?.currentTime??0,r=n.current?.duration??0;switch(g.code){case "Space":case "KeyK":g.preventDefault(),H?e.pause():e.play();break;case "ArrowLeft":g.preventDefault(),e.seek(Math.max(0,Y-5));break;case "ArrowRight":g.preventDefault(),e.seek(Math.min(r||1/0,Y+5));break;case "ArrowUp":g.preventDefault(),e.setVolume(Math.min(1,G+.1));break;case "ArrowDown":g.preventDefault(),e.setVolume(Math.max(0,G-.1));break;case "KeyM":g.preventDefault(),e.toggleMute();break;case "KeyF":g.preventDefault(),e.toggleFullscreen();break;case "KeyP":g.preventDefault(),e.togglePictureInPicture();break;case "KeyT":g.preventDefault(),e.toggleTheaterMode();break;case "KeyL":g.preventDefault(),ee&&e.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{g.preventDefault();let s=Number(g.code.replace("Digit",""))*10;e.seek(r/100*s);break}}};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[e,m,n]);let k=yt.useCallback(()=>e.play(),[e]),Q=yt.useCallback(()=>e.pause(),[e]),q=yt.useCallback(h=>e.setVolume(h),[e]),_=yt.useCallback(()=>e.toggleMute(),[e]),t=yt.useCallback(h=>e.setPlaybackRate(h),[e]),o=yt.useCallback(h=>e.setQualityLevel(h),[e]),d=yt.useCallback(()=>e.togglePictureInPicture(),[e]),S=yt.useCallback(()=>e.toggleTheaterMode(),[e]),F=yt.useCallback(()=>e.toggleFullscreen(),[e]),R=yt.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{ref:B,style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:L?1:0,transition:"opacity 0.3s",pointerEvents:L?"auto":"none"},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"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx($.ProgressBar,{videoRef:n,playerRef:e,enablePreview:a,thumbnailVtt:f}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[c?jsxRuntime.jsx($.PauseButton,{onClick:Q}):jsxRuntime.jsx($.PlayButton,{onClick:k}),jsxRuntime.jsx($.VolumeControl,{volume:u,isMuted:b,onVolumeChange:q,onToggleMute:_}),jsxRuntime.jsx($.TimeDisplay,{videoRef:n,isLive:y}),jsxRuntime.jsx("div",{style:{flex:1}}),y&&jsxRuntime.jsx(Ue,{onClick:R}),jsxRuntime.jsx($.SettingsMenu,{currentRate:p,playbackRates:l,onRateChange:t,qualityLevels:v,currentQualityLevel:w,onQualityChange:o}),jsxRuntime.jsx($.PiPButton,{onClick:d,isPiP:T}),jsxRuntime.jsx($.TheaterButton,{onClick:S,isTheater:V}),jsxRuntime.jsx($.FullscreenButton,{onClick:F,isFullscreen:P})]})]})})},Ue=yt.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,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"}));Ue.displayName="GoLiveButton";var ke=yt.memo(({x:n,y:e,isPlaying:m,src:l,videoRef:a,playerRef:f,onClose:c})=>{let u=yt.useRef(null),[b,p]=yt.useState(()=>a.current?.loop??false),P=Math.min(n,window.innerWidth-220),T=Math.min(e,window.innerHeight-290);yt.useEffect(()=>{let L=k=>{u.current&&!u.current.contains(k.target)&&c();},x=k=>{k.key==="Escape"&&c();},N=()=>c();return document.addEventListener("mousedown",L),document.addEventListener("keydown",x),window.addEventListener("scroll",N,true),()=>{document.removeEventListener("mousedown",L),document.removeEventListener("keydown",x),window.removeEventListener("scroll",N,true);}},[c]);let V=yt.useCallback(()=>{m?f.pause():f.play(),c();},[m,f,c]),y=yt.useCallback(()=>{let L=a.current;if(!L)return;let x=!b;L.loop=x,p(x);},[a,b]),v=yt.useCallback(async()=>{try{await navigator.clipboard.writeText(l);}catch{}c();},[l,c]),w=yt.useCallback(async()=>{let L=Math.floor(a.current?.currentTime??0);try{await navigator.clipboard.writeText(`${l}?t=${L}`);}catch{}c();},[l,a,c]),B=yt.useCallback(()=>{f.togglePictureInPicture(),c();},[f,c]),M=yt.useCallback(()=>{f.toggleFullscreen(),c();},[f,c]);return jsxRuntime.jsxs("div",{ref:u,className:"contextMenu",style:{left:P,top:T},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:V,children:m?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:y,children:[jsxRuntime.jsx("span",{children:"Loop"}),b&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:v,children:"Copy video URL"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:w,children:"Copy video URL at current time"}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:B,children:"Picture-in-Picture"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:M,children:"Fullscreen"})]})});ke.displayName="ContextMenu";var Qe=yt.forwardRef(({src:n,poster:e,autoplay:m=false,muted:l=false,loop:a=false,controls:f=true,preload:c="metadata",playbackRates:u=[.25,.5,.75,1,1.25,1.5,1.75,2],className:b,enableHLS:p=true,enablePreview:P=true,thumbnailVtt:T,hlsConfig:V,subtitles:y,crossOrigin:v,onPlay:w,onPause:B,onEnded:M,onError:L,onTimeUpdate:x,onDurationChange:N,onBuffering:k,onTheaterModeChange:Q},q)=>{let _=yt.useRef(null),t=yt.useRef(null),{state:o,ref:d,fullscreenContainerRef:S}=De(_,n,{autoplay:m,muted:l,loop:a,playbackRates:u,enableHLS:p,hlsConfig:V,onPlay:w,onPause:B,onEnded:M,onError:L,onTimeUpdate:x,onDurationChange:N,onBuffering:k,onTheaterModeChange:Q}),[F,R]=yt.useState(null);yt.useEffect(()=>{S.current=t.current;},[S]),yt__default.default.useImperativeHandle(q,()=>d,[d]);let h=yt.useCallback(()=>{t.current?.focus(),o.isPlaying?d.pause():d.play();},[o.isPlaying,d]),g=yt.useCallback(()=>{d.toggleFullscreen();},[d]),W=yt.useCallback(H=>{H.preventDefault(),R({x:H.clientX,y:H.clientY});},[]);return jsxRuntime.jsxs("div",{ref:t,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:b,"data-test":"video-player-container","data-theater":o.isTheaterMode?"true":void 0,onContextMenu:W,children:[jsxRuntime.jsx("video",{ref:_,poster:e,preload:c,crossOrigin:v,onClick:h,onDoubleClick:g,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer"},"data-test":"video-element",children:y?.map(H=>jsxRuntime.jsx("track",{kind:"subtitles",src:H.src,label:H.label,srcLang:H.srclang,default:H.default},H.id))}),f&&jsxRuntime.jsx(xe,{videoRef:_,playerRef:d,playerContainerRef:t,playbackRates:u,enablePreview:P,thumbnailVtt:T,isPlaying:o.isPlaying,volume:o.volume,isMuted:o.isMuted,playbackRate:o.playbackRate,isFullscreen:o.isFullscreen,isPictureInPicture:o.isPictureInPicture,isTheaterMode:o.isTheaterMode,isLive:o.isLive,qualityLevels:o.qualityLevels,currentQualityLevel:o.currentQualityLevel}),F&&jsxRuntime.jsx(ke,{x:F.x,y:F.y,isPlaying:o.isPlaying,src:n,videoRef:_,playerRef:d,onClose:()=>R(null)}),o.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"}),o.isBuffering&&!o.error&&jsxRuntime.jsxs("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"}}),jsxRuntime.jsx("style",{children:"@keyframes rvp-spin { to { transform: rotate(360deg); } }"})]}),o.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:o.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":o.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:o.error.message})]})})]})});Qe.displayName="VideoPlayer";var Tt=Qe;exports.ControlElements=Ae;exports.Controls=xe;exports.VideoPlayer=Tt;exports.findThumbnailCue=Pe;exports.formatTime=J;exports.getMimeType=je;exports.isHLSUrl=me;exports.parseThumbnailVtt=Le;//# sourceMappingURL=index.js.map
3
+ `),o=0;for(;o<l.length;){let f=l[o].trim();if(f.includes("-->")){let d=f.indexOf("-->"),c=Ve(f.slice(0,d)),b=Ve(f.slice(d+3));for(o++;o<l.length&&!l[o].trim();)o++;if(o<l.length){let m=l[o].trim(),M=m.lastIndexOf("#xywh="),x=m,V=0,E=0,v=160,R=90;if(M!==-1){x=m.slice(0,M);let H=m.slice(M+6).split(",").map(Number);V=H[0]??0,E=H[1]??0,v=H[2]??160,R=H[3]??90;}p.push({start:c,end:b,url:rt(e,x),x:V,y:E,w:v,h:R});}}o++;}return p}function Pe(n,e){if(!n.length)return null;let p=0,l=n.length-1;for(;p<=l;){let o=p+l>>1;if(n[o].end<=e)p=o+1;else if(n[o].start>e)l=o-1;else return n[o]}return null}var Ne=Et.memo(({videoRef:n,playerRef:e,enablePreview:p=true,thumbnailVtt:l})=>{let o=Et.useRef(null),f=Et.useRef(null),d=Et.useRef(null),c=Et.useRef(null),b=Et.useRef(null),m=Et.useRef(null),M=Et.useRef(null),[x,V]=Et.useState([]),E=Et.useRef(false),v=Et.useRef(0),R=Et.useRef(0),H=Et.useRef(null),k=Et.useRef([]),y=Et.useRef(null);Et.useEffect(()=>{let r=()=>{y.current=null;};return window.addEventListener("resize",r,{passive:true}),()=>window.removeEventListener("resize",r)},[]);let T=Et.useCallback(()=>(!y.current&&o.current&&(y.current=o.current.getBoundingClientRect()),y.current),[]);Et.useEffect(()=>{if(!l){k.current=[];return}let r=false;return fetch(l).then(s=>s.text()).then(s=>{r||(k.current=Le(s,l));}).catch(()=>{r||(k.current=[]);}),()=>{r=true;}},[l]),Et.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let a=isFinite(r.duration)?r.duration:0,P=r.currentTime,A=a>0?P/a*100:0;f.current&&(f.current.style.width=`${A}%`),d.current&&(d.current.style.left=`${A}%`),o.current&&(o.current.setAttribute("aria-valuenow",String(Math.round(P))),o.current.setAttribute("aria-valuemax",String(Math.round(a))),o.current.setAttribute("aria-valuetext",J(P)));};return r.addEventListener("timeupdate",s),r.addEventListener("durationchange",s),r.addEventListener("seeked",s),s(),()=>{r.removeEventListener("timeupdate",s),r.removeEventListener("durationchange",s),r.removeEventListener("seeked",s);}},[n]),Et.useEffect(()=>{let r=n.current;if(!r)return;let s=()=>{let a=[];for(let P=0;P<r.buffered.length;P++)a.push({start:r.buffered.start(P),end:r.buffered.end(P)});V(a);};return r.addEventListener("progress",s),()=>r.removeEventListener("progress",s)},[n]);let N=Et.useCallback(()=>{E.current=true,d.current?.classList.add("dragging");},[]),C=Et.useCallback(()=>{E.current=false,d.current?.classList.remove("dragging");},[]),Q=Et.useCallback(()=>{p&&(y.current=null,c.current&&(c.current.style.display=""),m.current&&(m.current.style.display=""));},[p]),q=Et.useCallback(()=>{c.current&&(c.current.style.display="none"),m.current&&(m.current.style.display="none");},[]),X=Et.useCallback(r=>{if(!M.current||!k.current.length)return;let s=Pe(k.current,r);if(H.current=s,!s)return;let a=M.current;a.style.backgroundImage=`url(${s.url})`,a.style.backgroundPosition=`-${s.x}px -${s.y}px`,a.style.width=`${s.w}px`,a.style.height=`${s.h}px`;},[]),t=Et.useCallback(r=>{let s=T(),a=n.current?.duration;return !s||s.width===0||!a||!isFinite(a)?0:Math.max(0,Math.min(r-s.left,s.width))/s.width*a},[T,n]),u=Et.useCallback(r=>{let s=T();return s?Math.max(0,Math.min(r-s.left,s.width)):0},[T]),i=Et.useCallback(r=>{let s=n.current;if(!s)return;let a=s.currentTime,P=isFinite(s.duration)?s.duration:0;switch(r.key){case "ArrowLeft":case "ArrowRight":{r.preventDefault(),r.nativeEvent.stopImmediatePropagation();let A=r.shiftKey?10:5;e.seek(r.key==="ArrowLeft"?Math.max(0,a-A):Math.min(P,a+A));break}case "Home":r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(0);break;case "End":P>0&&(r.preventDefault(),r.nativeEvent.stopImmediatePropagation(),e.seek(P));break}},[n,e]),L=Et.useCallback(r=>{let s=t(r.clientX),a=u(r.clientX);v.current=a,R.current=s,c.current&&(c.current.style.left=`${a}px`),m.current&&(m.current.style.left=`${a}px`),b.current&&(b.current.textContent=J(s)),X(s),E.current&&e.seek(s);},[e,X,t,u]),z=Et.useCallback(()=>{Q();},[Q]),w=Et.useCallback(()=>{q(),C();},[q,C]),h=Et.useCallback(r=>{r.preventDefault(),N(),e.seek(t(r.clientX));},[N,t,e]),g=Et.useCallback(()=>C(),[C]),U=Et.useCallback(r=>{E.current||e.seek(t(r.clientX));},[t,e]);Et.useEffect(()=>{let r=o.current;if(!r)return;let s=a=>{E.current&&a.preventDefault();};return r.addEventListener("touchmove",s,{passive:false}),()=>r.removeEventListener("touchmove",s)},[]);let j=Et.useCallback(r=>{y.current=null,N(),e.seek(t(r.touches[0].clientX));},[N,t,e]),D=Et.useCallback(r=>{E.current&&e.seek(t(r.touches[0].clientX));},[t,e]),ee=Et.useCallback(()=>C(),[C]);Et.useEffect(()=>{let r=()=>C();return window.addEventListener("mouseup",r),()=>window.removeEventListener("mouseup",r)},[C]);let Y=Et.useMemo(()=>{let r=n.current,s=r&&isFinite(r.duration)?r.duration:0;return s<=0||!x.length?null:x.map((a,P)=>{let A=a.start/s*100,ye=(a.end-a.start)/s*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${A}%`,width:`${ye}%`}},P)})},[x,n]);return jsxRuntime.jsxs("div",{ref:o,className:"progressContainer",onMouseMove:L,onMouseEnter:z,onMouseLeave:w,onMouseDown:h,onMouseUp:g,onClick:U,onTouchStart:j,onTouchMove:D,onTouchEnd:ee,onKeyDown:i,role:"slider","aria-label":"Video progress","aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":"0:00",tabIndex:0,children:[p&&jsxRuntime.jsxs("div",{ref:c,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[l&&jsxRuntime.jsx("div",{ref:M,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:b,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[Y,jsxRuntime.jsx("div",{ref:f,className:"progressFilled",style:{width:"0%"}}),p&&jsxRuntime.jsx("div",{ref:m,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:d,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});Ne.displayName="ProgressBar";var ve=Ne;var Oe=Et.memo(({currentRate:n,playbackRates:e,onRateChange:p,qualityLevels:l=[],currentQualityLevel:o=-1,onQualityChange:f})=>{let[d,c]=Et.useState(false),[b,m]=Et.useState("speed"),M=Et.useRef(null),x=l.length>0&&!!f;Et.useEffect(()=>{let v=R=>{M.current&&!M.current.contains(R.target)&&c(false);};return d&&document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[d]);let V=Et.useMemo(()=>[...l].sort((v,R)=>R.bitrate-v.bitrate),[l]),E=Et.useMemo(()=>o===-1?"Auto":l.find(v=>v.id===o)?.name??"Auto",[l,o]);return jsxRuntime.jsxs("div",{ref:M,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>c(v=>!v),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":d,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"})})}),d&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[x&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${b==="speed"?" active":""}`,onClick:()=>m("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${b==="quality"?" active":""}`,onClick:()=>m("quality"),children:"Quality"})]}),(!x||b==="speed")&&jsxRuntime.jsxs("div",{children:[!x&&jsxRuntime.jsx("div",{className:"settingsPanelLabel",children:"Playback Speed"}),e.map(v=>jsxRuntime.jsx("button",{onClick:()=>{p(v),c(false);},className:`settingsOption${n===v?" active":""}`,role:"menuitemradio","aria-checked":n===v,children:v===1?"Normal":`${v}\xD7`},v))]}),x&&b==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{f(-1),c(false);},className:`settingsOption${o===-1?" active":""}`,role:"menuitemradio","aria-checked":o===-1,children:["Auto ",o===-1&&E!=="Auto"?`(${E})`:""]}),V.map(v=>jsxRuntime.jsxs("button",{onClick:()=>{f(v.id),c(false);},className:`settingsOption${o===v.id?" active":""}`,role:"menuitemradio","aria-checked":o===v.id,children:[v.name,v.bitrate>0&&jsxRuntime.jsxs("span",{className:"settingsOptionBadge",children:[Math.round(v.bitrate/1e3)," kbps"]})]},v.id))]})]})]})});Oe.displayName="SettingsMenu";var he=Oe;var Ae=Et.memo(({videoRef:n,isLive:e=false})=>{let p=Et.useRef(null),l=Et.useRef(null);return Et.useEffect(()=>{let o=n.current;if(!o)return;let f=()=>{p.current&&(p.current.textContent=J(o.currentTime));},d=()=>{if(l.current){let c=isFinite(o.duration)?o.duration:0;l.current.textContent=` / ${J(c)}`;}};return o.addEventListener("timeupdate",f),o.addEventListener("durationchange",d),o.addEventListener("seeked",f),f(),d(),()=>{o.removeEventListener("timeupdate",f),o.removeEventListener("durationchange",d),o.removeEventListener("seeked",f);}},[n,e]),e?jsxRuntime.jsx("span",{className:"timeDisplay",style:{opacity:.7},children:jsxRuntime.jsx("span",{ref:p,children:"0:00"})}):jsxRuntime.jsxs("span",{className:"timeDisplay",children:[jsxRuntime.jsx("span",{ref:p,children:"0:00"}),jsxRuntime.jsx("span",{ref:l,style:{opacity:.6},children:" / 0:00"})]})});Ae.displayName="TimeDisplay";var be=Ae;var _={PlayButton:ie,PauseButton:se,FullscreenButton:le,PiPButton:ue,TheaterButton:ce,VolumeControl:fe,ProgressBar:ve,SettingsMenu:he,TimeDisplay:be};var xe=({videoRef:n,playerRef:e,playerContainerRef:p,playbackRates:l,enablePreview:o,thumbnailVtt:f,isPlaying:d,volume:c,isMuted:b,playbackRate:m,isFullscreen:M,isPictureInPicture:x,isTheaterMode:V,isLive:E,qualityLevels:v,currentQualityLevel:R})=>{let H=Et.useRef(null),k=Et.useRef(null),[y,T]=Et.useState(true),N=Et.useRef({isPlaying:d,volume:c,isMuted:b,isLive:E});N.current={isPlaying:d,volume:c,isMuted:b,isLive:E},Et.useEffect(()=>{if(!d){T(true),k.current&&clearTimeout(k.current);return}let h=()=>{T(true),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>T(false),3e3);},g=H.current;return g&&(g.addEventListener("mousemove",h),g.addEventListener("mouseenter",h),g.addEventListener("touchstart",h,{passive:true})),h(),()=>{g&&(g.removeEventListener("mousemove",h),g.removeEventListener("mouseenter",h),g.removeEventListener("touchstart",h)),k.current&&clearTimeout(k.current);}},[d]),Et.useEffect(()=>{let h=g=>{if(!p.current?.contains(document.activeElement))return;let U=g.target;if(U.tagName==="INPUT"||U.tagName==="TEXTAREA"||U.isContentEditable)return;let{isPlaying:j,volume:D,isLive:ee}=N.current,Y=n.current?.currentTime??0,r=n.current?.duration??0;switch(g.code){case "Space":case "KeyK":g.preventDefault(),j?e.pause():e.play();break;case "ArrowLeft":g.preventDefault(),e.seek(Math.max(0,Y-5));break;case "ArrowRight":g.preventDefault(),e.seek(Math.min(r||1/0,Y+5));break;case "ArrowUp":g.preventDefault(),e.setVolume(Math.min(1,D+.1));break;case "ArrowDown":g.preventDefault(),e.setVolume(Math.max(0,D-.1));break;case "KeyM":g.preventDefault(),e.toggleMute();break;case "KeyF":g.preventDefault(),e.toggleFullscreen();break;case "KeyP":g.preventDefault(),e.togglePictureInPicture();break;case "KeyT":g.preventDefault(),e.toggleTheaterMode();break;case "KeyL":g.preventDefault(),ee&&e.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{g.preventDefault();let s=Number(g.code.replace("Digit",""))*10;e.seek(r/100*s);break}}};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[e,p,n]);let C=Et.useCallback(()=>e.play(),[e]),Q=Et.useCallback(()=>e.pause(),[e]),q=Et.useCallback(h=>e.setVolume(h),[e]),X=Et.useCallback(()=>e.toggleMute(),[e]),t=Et.useCallback(h=>e.setPlaybackRate(h),[e]),u=Et.useCallback(h=>e.setQualityLevel(h),[e]),i=Et.useCallback(()=>e.togglePictureInPicture(),[e]),L=Et.useCallback(()=>e.toggleTheaterMode(),[e]),z=Et.useCallback(()=>e.toggleFullscreen(),[e]),w=Et.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{ref:H,style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:y?1:0,transition:"opacity 0.3s",pointerEvents:"none"},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:y?"auto":"none"},role:"region","aria-label":"Video player controls",children:[jsxRuntime.jsx(_.ProgressBar,{videoRef:n,playerRef:e,enablePreview:o,thumbnailVtt:f}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[d?jsxRuntime.jsx(_.PauseButton,{onClick:Q}):jsxRuntime.jsx(_.PlayButton,{onClick:C}),jsxRuntime.jsx(_.VolumeControl,{volume:c,isMuted:b,onVolumeChange:q,onToggleMute:X}),jsxRuntime.jsx(_.TimeDisplay,{videoRef:n,isLive:E}),jsxRuntime.jsx("div",{style:{flex:1}}),E&&jsxRuntime.jsx(We,{onClick:w}),jsxRuntime.jsx(_.SettingsMenu,{currentRate:m,playbackRates:l,onRateChange:t,qualityLevels:v,currentQualityLevel:R,onQualityChange:u}),jsxRuntime.jsx(_.PiPButton,{onClick:i,isPiP:x}),jsxRuntime.jsx(_.TheaterButton,{onClick:L,isTheater:V}),jsxRuntime.jsx(_.FullscreenButton,{onClick:z,isFullscreen:M})]})]})})},We=Et.memo(({onClick:n})=>jsxRuntime.jsx("button",{onClick:n,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"}));We.displayName="GoLiveButton";var Ce=Et.memo(({x:n,y:e,isPlaying:p,src:l,videoRef:o,playerRef:f,onClose:d,contextMenuItems:c})=>{let b=Et.useRef(null),[m,M]=Et.useState(()=>o.current?.loop??false),x=Math.min(n,window.innerWidth-220),V=Math.min(e,window.innerHeight-290);Et.useEffect(()=>{let y=C=>{b.current&&!b.current.contains(C.target)&&d();},T=C=>{C.key==="Escape"&&d();},N=()=>d();return document.addEventListener("mousedown",y),document.addEventListener("keydown",T),window.addEventListener("scroll",N,true),()=>{document.removeEventListener("mousedown",y),document.removeEventListener("keydown",T),window.removeEventListener("scroll",N,true);}},[d]);let E=Et.useCallback(()=>{p?f.pause():f.play(),d();},[p,f,d]),v=Et.useCallback(()=>{let y=o.current;if(!y)return;let T=!m;y.loop=T,M(T);},[o,m]),R=Et.useCallback(async()=>{try{await navigator.clipboard.writeText(l);}catch{}d();},[l,d]),H=Et.useCallback(async()=>{let y=Math.floor(o.current?.currentTime??0);try{await navigator.clipboard.writeText(`${l}?t=${y}`);}catch{}d();},[l,o,d]),k=Et.useCallback(()=>{f.togglePictureInPicture(),d();},[f,d]);return jsxRuntime.jsxs("div",{ref:b,className:"contextMenu",style:{left:x,top:V},children:[jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:E,children:p?"Pause":"Play"}),jsxRuntime.jsxs("button",{className:"contextMenuItem",onClick:v,children:[jsxRuntime.jsx("span",{children:"Loop"}),m&&jsxRuntime.jsx("span",{className:"contextMenuCheck",children:"\u2713"})]}),jsxRuntime.jsx("div",{className:"contextMenuDivider"}),jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:R,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:k,children:"Picture-in-Picture"}),c&&c.length>0&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:"contextMenuDivider"}),c.map((y,T)=>jsxRuntime.jsx("button",{className:"contextMenuItem",onClick:()=>{y.onClick(),d();},children:y.label},T))]})]})});Ce.displayName="ContextMenu";var Qe=Et.forwardRef(({src:n,poster:e,autoplay:p=false,muted:l=false,loop:o=false,controls:f=true,preload:d="metadata",playbackRates:c=[.25,.5,.75,1,1.25,1.5,1.75,2],className:b,enableHLS:m=true,enablePreview:M=true,thumbnailVtt:x,hlsConfig:V,subtitles:E,crossOrigin:v,onPlay:R,onPause:H,onEnded:k,onError:y,onTimeUpdate:T,onDurationChange:N,onBuffering:C,onTheaterModeChange:Q,contextMenuItems:q},X)=>{let t=Et.useRef(null),u=Et.useRef(null),{state:i,ref:L,fullscreenContainerRef:z}=Be(t,n,{autoplay:p,muted:l,loop:o,playbackRates:c,enableHLS:m,hlsConfig:V,onPlay:R,onPause:H,onEnded:k,onError:y,onTimeUpdate:T,onDurationChange:N,onBuffering:C,onTheaterModeChange:Q}),[w,h]=Et.useState(null);Et.useEffect(()=>{z.current=u.current;},[z]),Et__default.default.useImperativeHandle(X,()=>L,[L]);let g=Et.useCallback(()=>{u.current?.focus(),i.isPlaying?L.pause():L.play();},[i.isPlaying,L]),U=Et.useCallback(()=>{L.toggleFullscreen();},[L]),j=Et.useCallback(D=>{D.preventDefault(),h({x:D.clientX,y:D.clientY});},[]);return jsxRuntime.jsxs("div",{ref:u,tabIndex:0,style:{position:"relative",width:"100%",backgroundColor:"#000",aspectRatio:"16 / 9",userSelect:"none",outline:"none"},className:b,"data-test":"video-player-container","data-theater":i.isTheaterMode?"true":void 0,onContextMenu:j,children:[jsxRuntime.jsx("video",{ref:t,poster:e,preload:d,crossOrigin:v,onClick:g,onDoubleClick:U,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer"},"data-test":"video-element",children:E?.map(D=>jsxRuntime.jsx("track",{kind:"subtitles",src:D.src,label:D.label,srcLang:D.srclang,default:D.default},D.id))}),f&&jsxRuntime.jsx(xe,{videoRef:t,playerRef:L,playerContainerRef:u,playbackRates:c,enablePreview:M,thumbnailVtt:x,isPlaying:i.isPlaying,volume:i.volume,isMuted:i.isMuted,playbackRate:i.playbackRate,isFullscreen:i.isFullscreen,isPictureInPicture:i.isPictureInPicture,isTheaterMode:i.isTheaterMode,isLive:i.isLive,qualityLevels:i.qualityLevels,currentQualityLevel:i.currentQualityLevel}),w&&jsxRuntime.jsx(Ce,{x:w.x,y:w.y,isPlaying:i.isPlaying,src:n,videoRef:t,playerRef:L,onClose:()=>h(null),contextMenuItems:q}),i.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"}),i.isBuffering&&!i.error&&jsxRuntime.jsxs("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"}}),jsxRuntime.jsx("style",{children:"@keyframes rvp-spin { to { transform: rotate(360deg); } }"})]}),i.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:i.error.code==="MEDIA_ERR_SRC_NOT_SUPPORTED"?"Unsupported Format":i.error.code.startsWith("HLS")?"Stream Error":"Playback Error"}),jsxRuntime.jsx("p",{style:{margin:0,fontSize:13,opacity:.75},children:i.error.message})]})})]})});Qe.displayName="VideoPlayer";var Mt=Qe;exports.ControlElements=_e;exports.Controls=xe;exports.VideoPlayer=Mt;exports.findThumbnailCue=Pe;exports.formatTime=J;exports.getMimeType=je;exports.isHLSUrl=me;exports.parseThumbnailVtt=Le;//# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map