react-helios 2.1.0 → 2.1.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/dist/index.d.mts +13 -1
- package/dist/index.d.ts +13 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +46 -0
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -38,6 +38,7 @@ interface PlayerState {
|
|
|
38
38
|
error: VideoError | null;
|
|
39
39
|
isFullscreen: boolean;
|
|
40
40
|
isPictureInPicture: boolean;
|
|
41
|
+
isTheaterMode: boolean;
|
|
41
42
|
isLive: boolean;
|
|
42
43
|
qualityLevels: HLSQualityLevel[];
|
|
43
44
|
currentQualityLevel: number;
|
|
@@ -54,6 +55,7 @@ interface VideoPlayerRef {
|
|
|
54
55
|
seekToLive: () => void;
|
|
55
56
|
toggleFullscreen: () => Promise<void>;
|
|
56
57
|
togglePictureInPicture: () => Promise<void>;
|
|
58
|
+
toggleTheaterMode: () => void;
|
|
57
59
|
getState: () => PlayerState;
|
|
58
60
|
getVideoElement: () => HTMLVideoElement | null;
|
|
59
61
|
}
|
|
@@ -97,6 +99,7 @@ interface VideoPlayerProps {
|
|
|
97
99
|
onTimeUpdate?: (time: number) => void;
|
|
98
100
|
onDurationChange?: (duration: number) => void;
|
|
99
101
|
onBuffering?: (isBuffering: boolean) => void;
|
|
102
|
+
onTheaterModeChange?: (isTheater: boolean) => void;
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
|
|
@@ -114,6 +117,7 @@ interface ControlsProps {
|
|
|
114
117
|
playbackRate: number;
|
|
115
118
|
isFullscreen: boolean;
|
|
116
119
|
isPictureInPicture: boolean;
|
|
120
|
+
isTheaterMode: boolean;
|
|
117
121
|
isLive: boolean;
|
|
118
122
|
qualityLevels: HLSQualityLevel[];
|
|
119
123
|
currentQualityLevel: number;
|
|
@@ -175,12 +179,18 @@ declare const PlayButton: react.NamedExoticComponent<PlayButtonProps>;
|
|
|
175
179
|
declare const PauseButton: react.NamedExoticComponent<PauseButtonProps>;
|
|
176
180
|
declare const FullscreenButton: react.NamedExoticComponent<FullscreenButtonProps>;
|
|
177
181
|
declare const PiPButton: react.NamedExoticComponent<PiPButtonProps>;
|
|
182
|
+
interface TheaterButtonProps {
|
|
183
|
+
onClick: () => void;
|
|
184
|
+
isTheater?: boolean;
|
|
185
|
+
}
|
|
186
|
+
declare const TheaterButton: react.NamedExoticComponent<TheaterButtonProps>;
|
|
178
187
|
|
|
179
188
|
declare const ControlElements: {
|
|
180
189
|
PlayButton: react.NamedExoticComponent<PlayButtonProps>;
|
|
181
190
|
PauseButton: react.NamedExoticComponent<PauseButtonProps>;
|
|
182
191
|
FullscreenButton: react.NamedExoticComponent<FullscreenButtonProps>;
|
|
183
192
|
PiPButton: react.NamedExoticComponent<PiPButtonProps>;
|
|
193
|
+
TheaterButton: react.NamedExoticComponent<TheaterButtonProps>;
|
|
184
194
|
VolumeControl: react.NamedExoticComponent<VolumeControlProps>;
|
|
185
195
|
ProgressBar: react.FC<ProgressBarProps>;
|
|
186
196
|
SettingsMenu: react.NamedExoticComponent<SettingsMenuProps>;
|
|
@@ -200,12 +210,14 @@ declare const index_ProgressBar: typeof ProgressBar;
|
|
|
200
210
|
type index_ProgressBarProps = ProgressBarProps;
|
|
201
211
|
declare const index_SettingsMenu: typeof SettingsMenu;
|
|
202
212
|
type index_SettingsMenuProps = SettingsMenuProps;
|
|
213
|
+
declare const index_TheaterButton: typeof TheaterButton;
|
|
214
|
+
type index_TheaterButtonProps = TheaterButtonProps;
|
|
203
215
|
declare const index_TimeDisplay: typeof TimeDisplay;
|
|
204
216
|
type index_TimeDisplayProps = TimeDisplayProps;
|
|
205
217
|
declare const index_VolumeControl: typeof VolumeControl;
|
|
206
218
|
type index_VolumeControlProps = VolumeControlProps;
|
|
207
219
|
declare namespace index {
|
|
208
|
-
export { index_ControlElements as ControlElements, index_FullscreenButton as FullscreenButton, type index_FullscreenButtonProps as FullscreenButtonProps, index_PauseButton as PauseButton, type index_PauseButtonProps as PauseButtonProps, index_PiPButton as PiPButton, type index_PiPButtonProps as PiPButtonProps, index_PlayButton as PlayButton, type index_PlayButtonProps as PlayButtonProps, index_ProgressBar as ProgressBar, type index_ProgressBarProps as ProgressBarProps, index_SettingsMenu as SettingsMenu, type index_SettingsMenuProps as SettingsMenuProps, index_TimeDisplay as TimeDisplay, type index_TimeDisplayProps as TimeDisplayProps, index_VolumeControl as VolumeControl, type index_VolumeControlProps as VolumeControlProps };
|
|
220
|
+
export { index_ControlElements as ControlElements, index_FullscreenButton as FullscreenButton, type index_FullscreenButtonProps as FullscreenButtonProps, index_PauseButton as PauseButton, type index_PauseButtonProps as PauseButtonProps, index_PiPButton as PiPButton, type index_PiPButtonProps as PiPButtonProps, index_PlayButton as PlayButton, type index_PlayButtonProps as PlayButtonProps, index_ProgressBar as ProgressBar, type index_ProgressBarProps as ProgressBarProps, index_SettingsMenu as SettingsMenu, type index_SettingsMenuProps as SettingsMenuProps, index_TheaterButton as TheaterButton, type index_TheaterButtonProps as TheaterButtonProps, index_TimeDisplay as TimeDisplay, type index_TimeDisplayProps as TimeDisplayProps, index_VolumeControl as VolumeControl, type index_VolumeControlProps as VolumeControlProps };
|
|
209
221
|
}
|
|
210
222
|
|
|
211
223
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ interface PlayerState {
|
|
|
38
38
|
error: VideoError | null;
|
|
39
39
|
isFullscreen: boolean;
|
|
40
40
|
isPictureInPicture: boolean;
|
|
41
|
+
isTheaterMode: boolean;
|
|
41
42
|
isLive: boolean;
|
|
42
43
|
qualityLevels: HLSQualityLevel[];
|
|
43
44
|
currentQualityLevel: number;
|
|
@@ -54,6 +55,7 @@ interface VideoPlayerRef {
|
|
|
54
55
|
seekToLive: () => void;
|
|
55
56
|
toggleFullscreen: () => Promise<void>;
|
|
56
57
|
togglePictureInPicture: () => Promise<void>;
|
|
58
|
+
toggleTheaterMode: () => void;
|
|
57
59
|
getState: () => PlayerState;
|
|
58
60
|
getVideoElement: () => HTMLVideoElement | null;
|
|
59
61
|
}
|
|
@@ -97,6 +99,7 @@ interface VideoPlayerProps {
|
|
|
97
99
|
onTimeUpdate?: (time: number) => void;
|
|
98
100
|
onDurationChange?: (duration: number) => void;
|
|
99
101
|
onBuffering?: (isBuffering: boolean) => void;
|
|
102
|
+
onTheaterModeChange?: (isTheater: boolean) => void;
|
|
100
103
|
}
|
|
101
104
|
|
|
102
105
|
declare const VideoPlayer: react__default.ForwardRefExoticComponent<VideoPlayerProps & react__default.RefAttributes<VideoPlayerRef>>;
|
|
@@ -114,6 +117,7 @@ interface ControlsProps {
|
|
|
114
117
|
playbackRate: number;
|
|
115
118
|
isFullscreen: boolean;
|
|
116
119
|
isPictureInPicture: boolean;
|
|
120
|
+
isTheaterMode: boolean;
|
|
117
121
|
isLive: boolean;
|
|
118
122
|
qualityLevels: HLSQualityLevel[];
|
|
119
123
|
currentQualityLevel: number;
|
|
@@ -175,12 +179,18 @@ declare const PlayButton: react.NamedExoticComponent<PlayButtonProps>;
|
|
|
175
179
|
declare const PauseButton: react.NamedExoticComponent<PauseButtonProps>;
|
|
176
180
|
declare const FullscreenButton: react.NamedExoticComponent<FullscreenButtonProps>;
|
|
177
181
|
declare const PiPButton: react.NamedExoticComponent<PiPButtonProps>;
|
|
182
|
+
interface TheaterButtonProps {
|
|
183
|
+
onClick: () => void;
|
|
184
|
+
isTheater?: boolean;
|
|
185
|
+
}
|
|
186
|
+
declare const TheaterButton: react.NamedExoticComponent<TheaterButtonProps>;
|
|
178
187
|
|
|
179
188
|
declare const ControlElements: {
|
|
180
189
|
PlayButton: react.NamedExoticComponent<PlayButtonProps>;
|
|
181
190
|
PauseButton: react.NamedExoticComponent<PauseButtonProps>;
|
|
182
191
|
FullscreenButton: react.NamedExoticComponent<FullscreenButtonProps>;
|
|
183
192
|
PiPButton: react.NamedExoticComponent<PiPButtonProps>;
|
|
193
|
+
TheaterButton: react.NamedExoticComponent<TheaterButtonProps>;
|
|
184
194
|
VolumeControl: react.NamedExoticComponent<VolumeControlProps>;
|
|
185
195
|
ProgressBar: react.FC<ProgressBarProps>;
|
|
186
196
|
SettingsMenu: react.NamedExoticComponent<SettingsMenuProps>;
|
|
@@ -200,12 +210,14 @@ declare const index_ProgressBar: typeof ProgressBar;
|
|
|
200
210
|
type index_ProgressBarProps = ProgressBarProps;
|
|
201
211
|
declare const index_SettingsMenu: typeof SettingsMenu;
|
|
202
212
|
type index_SettingsMenuProps = SettingsMenuProps;
|
|
213
|
+
declare const index_TheaterButton: typeof TheaterButton;
|
|
214
|
+
type index_TheaterButtonProps = TheaterButtonProps;
|
|
203
215
|
declare const index_TimeDisplay: typeof TimeDisplay;
|
|
204
216
|
type index_TimeDisplayProps = TimeDisplayProps;
|
|
205
217
|
declare const index_VolumeControl: typeof VolumeControl;
|
|
206
218
|
type index_VolumeControlProps = VolumeControlProps;
|
|
207
219
|
declare namespace index {
|
|
208
|
-
export { index_ControlElements as ControlElements, index_FullscreenButton as FullscreenButton, type index_FullscreenButtonProps as FullscreenButtonProps, index_PauseButton as PauseButton, type index_PauseButtonProps as PauseButtonProps, index_PiPButton as PiPButton, type index_PiPButtonProps as PiPButtonProps, index_PlayButton as PlayButton, type index_PlayButtonProps as PlayButtonProps, index_ProgressBar as ProgressBar, type index_ProgressBarProps as ProgressBarProps, index_SettingsMenu as SettingsMenu, type index_SettingsMenuProps as SettingsMenuProps, index_TimeDisplay as TimeDisplay, type index_TimeDisplayProps as TimeDisplayProps, index_VolumeControl as VolumeControl, type index_VolumeControlProps as VolumeControlProps };
|
|
220
|
+
export { index_ControlElements as ControlElements, index_FullscreenButton as FullscreenButton, type index_FullscreenButtonProps as FullscreenButtonProps, index_PauseButton as PauseButton, type index_PauseButtonProps as PauseButtonProps, index_PiPButton as PiPButton, type index_PiPButtonProps as PiPButtonProps, index_PlayButton as PlayButton, type index_PlayButtonProps as PlayButtonProps, index_ProgressBar as ProgressBar, type index_ProgressBarProps as ProgressBarProps, index_SettingsMenu as SettingsMenu, type index_SettingsMenuProps as SettingsMenuProps, index_TheaterButton as TheaterButton, type index_TheaterButtonProps as TheaterButtonProps, index_TimeDisplay as TimeDisplay, type index_TimeDisplayProps as TimeDisplayProps, index_VolumeControl as VolumeControl, type index_VolumeControlProps as VolumeControlProps };
|
|
209
221
|
}
|
|
210
222
|
|
|
211
223
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var ct=require('react'),ue=require('hls.js'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ct__default=/*#__PURE__*/_interopDefault(ct);var ue__default=/*#__PURE__*/_interopDefault(ue);var $e=Object.defineProperty;var Ue=(r,e)=>{for(var m in e)$e(r,m,{get:e[m],enumerable:true});};function j(r){if(!Number.isFinite(r)||r<0)return "0:00";let e=Math.floor(r),m=Math.floor(e/3600),s=Math.floor(e%3600/60),a=e%60;return m>0?`${m}:${String(s).padStart(2,"0")}:${String(a).padStart(2,"0")}`:`${s}:${String(a).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 We(r){if(le(r))return "application/x-mpegURL";let e=r.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 Te(r){return r.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 qe={isPlaying:false,currentTime:0,duration:0,volume:1,isMuted:false,playbackRate:1,isFullscreen:false,isPictureInPicture:false,isBuffering:false,bufferedRanges:[],error:null,isLive:false,qualityLevels:[],currentQualityLevel:-1};function Me(r,e,m={}){let s=ct.useRef(null),a=ct.useRef(null),h=ct.useRef(1),f=ct.useRef(0),l=ct.useRef(m);l.current=m;let[b,d]=ct.useState({...qe,isMuted:m.muted??false,volume:m.muted?0:1}),P=ct.useRef(b);P.current=b,ct.useEffect(()=>{let t=r.current;if(!t||(s.current&&(s.current.destroy(),s.current=null),f.current=0,d(c=>({...c,currentTime:0,duration:0,error:null,isBuffering:false,isLive:false,qualityLevels:[],currentQualityLevel:-1})),!e))return;let o=l.current;if(o.enableHLS!==false&&le(e)){if(t.canPlayType("application/vnd.apple.mpegurl"))t.src=e,t.load(),o.autoplay&&t.play().catch(()=>{});else if(ue__default.default.isSupported()){let c=new ue__default.default({autoStartLoad:true,startLevel:-1,capLevelToPlayerSize:true,capLevelOnFPSDrop:true,enableWorker:true,maxBufferLength:30,maxMaxBufferLength:600,maxBufferSize:6e7,liveBackBufferLength:30,liveSyncDurationCount:3,...o.hlsConfig});c.attachMedia(t),c.loadSource(e),c.on(ue.Events.MANIFEST_PARSED,(I,g)=>{let u=Te(g.levels);d(R=>({...R,qualityLevels:u,currentQualityLevel:-1})),l.current.autoplay&&t.play().catch(()=>{});}),c.on(ue.Events.LEVEL_SWITCHED,(I,g)=>{d(u=>({...u,currentQualityLevel:g.level}));});let M=3;c.on(ue.Events.ERROR,(I,g)=>{if(!g.fatal){console.warn("[hls] non-fatal:",g.details);return}switch(g.type){case ue__default.default.ErrorTypes.NETWORK_ERROR:if(f.current<M){f.current+=1;let u=1e3*f.current;console.warn(`[hls] network error \u2013 retry ${f.current}/${M} in ${u}ms`),setTimeout(()=>{s.current===c&&c.startLoad();},u);}else {let u={code:"HLS_NETWORK_ERROR",message:"Failed to load stream after multiple retries."};d(R=>({...R,error:u})),l.current.onError?.(u);}break;case ue__default.default.ErrorTypes.MEDIA_ERROR:console.warn("[hls] media error \u2013 recovering"),c.recoverMediaError();break;default:{c.destroy(),s.current=null;let u={code:"HLS_FATAL_ERROR",message:"An unrecoverable HLS error occurred."};d(R=>({...R,error:u})),l.current.onError?.(u);break}}}),s.current=c;}}else t.src=e,t.load(),o.autoplay&&t.play().catch(()=>{});return ()=>{s.current&&(s.current.destroy(),s.current=null);}},[e,r]),ct.useEffect(()=>{let t=r.current;if(!t)return;l.current.muted&&(t.muted=true),l.current.loop&&(t.loop=true);let o=()=>{d(n=>({...n,isPlaying:true})),l.current.onPlay?.();},c=()=>{d(n=>({...n,isPlaying:false})),l.current.onPause?.();},M=()=>{d(n=>({...n,isPlaying:false})),l.current.onEnded?.();},I=()=>{l.current.onTimeUpdate?.(t.currentTime);},g=()=>{let n=t.duration,p=!Number.isFinite(n);d(y=>({...y,duration:p?0:n,isLive:p})),p||l.current.onDurationChange?.(n);},u=()=>{let n=t.volume;n>0&&!t.muted&&(h.current=n),d(p=>({...p,volume:n,isMuted:t.muted||n===0}));},R=()=>{d(n=>({...n,playbackRate:t.playbackRate}));},Y=()=>{let n=t.error;if(!n)return;let y={code:{1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"}[n.code]??"UNKNOWN",message:n.message||"Unknown media error"};d(U=>({...U,error:y})),l.current.onError?.(y);},q=()=>{d(n=>({...n,isBuffering:true})),l.current.onBuffering?.(true);},Z=()=>{d(n=>({...n,isBuffering:false})),l.current.onBuffering?.(false);},X=()=>d(n=>({...n,isBuffering:false})),G=()=>{},Q=()=>{let n=!!(document.fullscreenElement||document.webkitFullscreenElement);d(p=>({...p,isFullscreen:n}));},i=()=>{d(n=>({...n,isPictureInPicture:document.pictureInPictureElement===t}));};return t.addEventListener("play",o),t.addEventListener("pause",c),t.addEventListener("ended",M),t.addEventListener("timeupdate",I),t.addEventListener("durationchange",g),t.addEventListener("volumechange",u),t.addEventListener("ratechange",R),t.addEventListener("error",Y),t.addEventListener("waiting",q),t.addEventListener("canplay",Z),t.addEventListener("playing",X),t.addEventListener("progress",G),document.addEventListener("fullscreenchange",Q),document.addEventListener("webkitfullscreenchange",Q),t.addEventListener("enterpictureinpicture",i),t.addEventListener("leavepictureinpicture",i),()=>{t.removeEventListener("play",o),t.removeEventListener("pause",c),t.removeEventListener("ended",M),t.removeEventListener("timeupdate",I),t.removeEventListener("durationchange",g),t.removeEventListener("volumechange",u),t.removeEventListener("ratechange",R),t.removeEventListener("error",Y),t.removeEventListener("waiting",q),t.removeEventListener("canplay",Z),t.removeEventListener("playing",X),t.removeEventListener("progress",G),document.removeEventListener("fullscreenchange",Q),document.removeEventListener("webkitfullscreenchange",Q),t.removeEventListener("enterpictureinpicture",i),t.removeEventListener("leavepictureinpicture",i);}},[r]);let T=ct.useCallback(async()=>{let t=r.current;if(t)try{await t.play();}catch(o){o instanceof Error&&o.name!=="AbortError"&&console.error("[player] play() failed:",o);}},[r]),C=ct.useCallback(()=>{r.current?.pause();},[r]),E=ct.useCallback(t=>{let o=r.current;o&&(o.currentTime=Math.max(0,Math.min(t,o.duration||t)));},[r]),v=ct.useCallback(t=>{let o=r.current;if(!o)return;let c=Math.max(0,Math.min(t,1));c>0&&(h.current=c),o.volume=c,o.muted=c===0;},[r]),w=ct.useCallback(()=>{let t=r.current;if(t)if(t.muted||t.volume===0){let o=h.current>0?h.current:1;t.volume=o,t.muted=false;}else h.current=t.volume,t.muted=true;},[r]),L=ct.useCallback(t=>{let o=r.current;o&&(o.playbackRate=t);},[r]),D=ct.useCallback(t=>{let o=s.current;o&&(o.currentLevel=t,d(c=>({...c,currentQualityLevel:t})));},[]),x=ct.useCallback(()=>{let t=s.current,o=r.current;if(!t||!o)return;let c=t.liveSyncPosition;c!=null&&Number.isFinite(c)&&(o.currentTime=c);},[r]),V=ct.useCallback(async()=>{let t=r.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(c){console.error("[player] fullscreen toggle failed:",c);}},[r]),O=ct.useCallback(async()=>{let t=r.current;if(t)try{document.pictureInPictureElement?await document.exitPictureInPicture():await t.requestPictureInPicture();}catch(o){console.error("[player] PiP toggle failed:",o);}},[r]),S=ct.useCallback(()=>{let t=r.current,o=t?.currentTime??0,c=[];if(t)for(let M=0;M<t.buffered.length;M++)c.push({start:t.buffered.start(M),end:t.buffered.end(M)});return {...P.current,currentTime:o,bufferedRanges:c}},[r]),$=ct.useCallback(()=>r.current??null,[r]),A=ct.useMemo(()=>({play:T,pause:C,seek:E,setVolume:v,toggleMute:w,setPlaybackRate:L,setQualityLevel:D,seekToLive:x,toggleFullscreen:V,togglePictureInPicture:O,getState:S,getVideoElement:$}),[T,C,E,v,w,L,D,x,V,O,S,$]);return {state:b,ref:A,hlsRef:s,fullscreenContainerRef:a}}var Ve={};Ue(Ve,{ControlElements:()=>z,FullscreenButton:()=>ae,PauseButton:()=>ie,PiPButton:()=>se,PlayButton:()=>oe,ProgressBar:()=>me,SettingsMenu:()=>pe,TimeDisplay:()=>ve,VolumeControl:()=>de});var oe=ct.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"})})}));oe.displayName="PlayButton";var ie=ct.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"})})}));ie.displayName="PauseButton";var ae=ct.memo(({onClick:r,isFullscreen:e=false})=>jsxRuntime.jsx("button",{onClick:r,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"})})}));ae.displayName="FullscreenButton";var se=ct.memo(({onClick:r,isPiP:e=false})=>jsxRuntime.jsx("button",{onClick:r,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"})})}));se.displayName="PiPButton";var Ce=ct.memo(({volume:r,isMuted:e,onVolumeChange:m,onToggleMute:s})=>{let[a,h]=ct.useState(false),f=e?0:r,l=f*100,b=ct.useMemo(()=>`linear-gradient(to right, #60a5fa 0%, #60a5fa ${l}%, rgba(255,255,255,0.3) ${l}%, rgba(255,255,255,0.3) 100%)`,[l]);return jsxRuntime.jsxs("div",{className:"volumeContainer",onMouseEnter:()=>h(true),onMouseLeave:()=>h(false),children:[jsxRuntime.jsx("button",{onClick:s,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: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"})})}),a&&jsxRuntime.jsx("input",{type:"range",min:"0",max:"100",value:l,onChange:d=>m(Number(d.target.value)/100),className:"volumeSlider",style:{background:b},"aria-label":"Volume","aria-valuenow":Math.round(l)})]})});Ce.displayName="VolumeControl";var de=Ce;function we(r){let e=r.trim().split(":");return e.length===3?+e[0]*3600+ +e[1]*60+parseFloat(e[2]):+e[0]*60+parseFloat(e[1])}function Ye(r,e){if(/^https?:\/\//i.test(e))return e;try{return new URL(e,r).href}catch{return e}}function ge(r,e=""){let m=[],s=r.replace(/\r\n/g,`
|
|
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,`
|
|
2
2
|
`).split(`
|
|
3
|
-
`),a=0;for(;a<s.length;){let h=s[a].trim();if(h.includes("-->")){let f=h.indexOf("-->"),l=we(h.slice(0,f)),b=we(h.slice(f+3));for(a++;a<s.length&&!s[a].trim();)a++;if(a<s.length){let d=s[a].trim(),P=d.lastIndexOf("#xywh="),T=d,C=0,E=0,v=160,w=90;if(P!==-1){T=d.slice(0,P);let L=d.slice(P+6).split(",").map(Number);C=L[0]??0,E=L[1]??0,v=L[2]??160,w=L[3]??90;}m.push({start:l,end:b,url:Ye(e,T),x:C,y:E,w:v,h:w});}}a++;}return m}function be(r,e){if(!r.length)return null;let m=0,s=r.length-1;for(;m<=s;){let a=m+s>>1;if(r[a].end<=e)m=a+1;else if(r[a].start>e)s=a-1;else return r[a]}return null}var xe=ct.memo(({videoRef:r,playerRef:e,enablePreview:m=true,thumbnailVtt:s})=>{let a=ct.useRef(null),h=ct.useRef(null),f=ct.useRef(null),l=ct.useRef(null),b=ct.useRef(null),d=ct.useRef(null),P=ct.useRef(null),[T,C]=ct.useState([]),E=ct.useRef(false),v=ct.useRef(0),w=ct.useRef(0),L=ct.useRef(null),D=ct.useRef([]),x=ct.useRef(null);ct.useEffect(()=>{let i=()=>{x.current=null;};return window.addEventListener("resize",i,{passive:true}),()=>window.removeEventListener("resize",i)},[]);let V=ct.useCallback(()=>(!x.current&&a.current&&(x.current=a.current.getBoundingClientRect()),x.current),[]);ct.useEffect(()=>{if(!s){D.current=[];return}let i=false;return fetch(s).then(n=>n.text()).then(n=>{i||(D.current=ge(n,s));}).catch(()=>{i||(D.current=[]);}),()=>{i=true;}},[s]),ct.useEffect(()=>{let i=r.current;if(!i)return;let n=()=>{let p=isFinite(i.duration)?i.duration:0,y=i.currentTime,U=p>0?y/p*100:0;h.current&&(h.current.style.width=`${U}%`),f.current&&(f.current.style.left=`${U}%`),a.current&&(a.current.setAttribute("aria-valuenow",String(Math.round(y))),a.current.setAttribute("aria-valuemax",String(Math.round(p))),a.current.setAttribute("aria-valuetext",j(y)));};return i.addEventListener("timeupdate",n),i.addEventListener("durationchange",n),i.addEventListener("seeked",n),n(),()=>{i.removeEventListener("timeupdate",n),i.removeEventListener("durationchange",n),i.removeEventListener("seeked",n);}},[r]),ct.useEffect(()=>{let i=r.current;if(!i)return;let n=()=>{let p=[];for(let y=0;y<i.buffered.length;y++)p.push({start:i.buffered.start(y),end:i.buffered.end(y)});C(p);};return i.addEventListener("progress",n),()=>i.removeEventListener("progress",n)},[r]);let O=ct.useCallback(()=>{E.current=true,f.current?.classList.add("dragging");},[]),S=ct.useCallback(()=>{E.current=false,f.current?.classList.remove("dragging");},[]),$=ct.useCallback(()=>{m&&(x.current=null,l.current&&(l.current.style.display=""),d.current&&(d.current.style.display=""));},[m]),A=ct.useCallback(()=>{l.current&&(l.current.style.display="none"),d.current&&(d.current.style.display="none");},[]),t=ct.useCallback(i=>{if(!P.current||!D.current.length)return;let n=be(D.current,i);if(L.current=n,!n)return;let p=P.current;p.style.backgroundImage=`url(${n.url})`,p.style.backgroundPosition=`-${n.x}px -${n.y}px`,p.style.width=`${n.w}px`,p.style.height=`${n.h}px`;},[]),o=ct.useCallback(i=>{let n=V(),p=r.current?.duration;return !n||n.width===0||!p||!isFinite(p)?0:Math.max(0,Math.min(i-n.left,n.width))/n.width*p},[V,r]),c=ct.useCallback(i=>{let n=V();return n?Math.max(0,Math.min(i-n.left,n.width)):0},[V]),M=ct.useCallback(i=>{let n=r.current;if(!n)return;let p=n.currentTime,y=isFinite(n.duration)?n.duration:0;switch(i.key){case "ArrowLeft":case "ArrowRight":{i.preventDefault(),i.nativeEvent.stopImmediatePropagation();let U=i.shiftKey?10:5;e.seek(i.key==="ArrowLeft"?Math.max(0,p-U):Math.min(y,p+U));break}case "Home":i.preventDefault(),i.nativeEvent.stopImmediatePropagation(),e.seek(0);break;case "End":y>0&&(i.preventDefault(),i.nativeEvent.stopImmediatePropagation(),e.seek(y));break}},[r,e]),I=ct.useCallback(i=>{let n=o(i.clientX),p=c(i.clientX);v.current=p,w.current=n,l.current&&(l.current.style.left=`${p}px`),d.current&&(d.current.style.left=`${p}px`),b.current&&(b.current.textContent=j(n)),t(n),E.current&&e.seek(n);},[e,t,o,c]),g=ct.useCallback(()=>{$();},[$]),u=ct.useCallback(()=>{A(),S();},[A,S]),R=ct.useCallback(i=>{i.preventDefault(),O(),e.seek(o(i.clientX));},[O,o,e]),Y=ct.useCallback(()=>S(),[S]),q=ct.useCallback(i=>{E.current||e.seek(o(i.clientX));},[o,e]);ct.useEffect(()=>{let i=a.current;if(!i)return;let n=p=>{E.current&&p.preventDefault();};return i.addEventListener("touchmove",n,{passive:false}),()=>i.removeEventListener("touchmove",n)},[]);let Z=ct.useCallback(i=>{x.current=null,O(),e.seek(o(i.touches[0].clientX));},[O,o,e]),X=ct.useCallback(i=>{E.current&&e.seek(o(i.touches[0].clientX));},[o,e]),G=ct.useCallback(()=>S(),[S]);ct.useEffect(()=>{let i=()=>S();return window.addEventListener("mouseup",i),()=>window.removeEventListener("mouseup",i)},[S]);let Q=ct.useMemo(()=>{let i=r.current,n=i&&isFinite(i.duration)?i.duration:0;return n<=0||!T.length?null:T.map((p,y)=>{let U=p.start/n*100,_e=(p.end-p.start)/n*100;return jsxRuntime.jsx("div",{className:"bufferedSegment",style:{left:`${U}%`,width:`${_e}%`}},y)})},[T,r]);return jsxRuntime.jsxs("div",{ref:a,className:"progressContainer",onMouseMove:I,onMouseEnter:g,onMouseLeave:u,onMouseDown:R,onMouseUp:Y,onClick:q,onTouchStart:Z,onTouchMove:X,onTouchEnd:G,onKeyDown:M,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:l,className:"previewTooltip",style:{left:0,display:"none"},"aria-hidden":"true",children:[s&&jsxRuntime.jsx("div",{ref:P,className:"previewThumbnail"}),jsxRuntime.jsx("div",{ref:b,className:"previewTime"})]}),jsxRuntime.jsxs("div",{className:"progressBackground",children:[Q,jsxRuntime.jsx("div",{ref:h,className:"progressFilled",style:{width:"0%"}}),m&&jsxRuntime.jsx("div",{ref:d,className:"hoverIndicator",style:{left:0,display:"none"},"aria-hidden":"true"})]}),jsxRuntime.jsx("div",{ref:f,className:"scrubHandle",style:{left:"0%"},"aria-hidden":"true"})]})});xe.displayName="ProgressBar";var me=xe;var De=ct.memo(({currentRate:r,playbackRates:e,onRateChange:m,qualityLevels:s=[],currentQualityLevel:a=-1,onQualityChange:h})=>{let[f,l]=ct.useState(false),[b,d]=ct.useState("speed"),P=ct.useRef(null),T=s.length>0&&!!h;ct.useEffect(()=>{let v=w=>{P.current&&!P.current.contains(w.target)&&l(false);};return f&&document.addEventListener("mousedown",v),()=>document.removeEventListener("mousedown",v)},[f]);let C=ct.useMemo(()=>[...s].sort((v,w)=>w.bitrate-v.bitrate),[s]),E=ct.useMemo(()=>a===-1?"Auto":s.find(v=>v.id===a)?.name??"Auto",[s,a]);return jsxRuntime.jsxs("div",{ref:P,className:"settingsContainer",children:[jsxRuntime.jsx("button",{onClick:()=>l(v=>!v),className:"controlButton","aria-label":"Settings",title:"Settings","aria-expanded":f,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"})})}),f&&jsxRuntime.jsxs("div",{className:"settingsDropdown",role:"menu",children:[T&&jsxRuntime.jsxs("div",{className:"settingsTabs",children:[jsxRuntime.jsx("button",{className:`settingsTab${b==="speed"?" active":""}`,onClick:()=>d("speed"),children:"Speed"}),jsxRuntime.jsx("button",{className:`settingsTab${b==="quality"?" active":""}`,onClick:()=>d("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),l(false);},className:`settingsOption${r===v?" active":""}`,role:"menuitemradio","aria-checked":r===v,children:v===1?"Normal":`${v}\xD7`},v))]}),T&&b==="quality"&&jsxRuntime.jsxs("div",{children:[jsxRuntime.jsxs("button",{onClick:()=>{h(-1),l(false);},className:`settingsOption${a===-1?" active":""}`,role:"menuitemradio","aria-checked":a===-1,children:["Auto ",a===-1&&E!=="Auto"?`(${E})`:""]}),C.map(v=>jsxRuntime.jsxs("button",{onClick:()=>{h(v.id),l(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))]})]})]})});De.displayName="SettingsMenu";var pe=De;var He=ct.memo(({videoRef:r,isLive:e=false})=>{let m=ct.useRef(null),s=ct.useRef(null);return ct.useEffect(()=>{let a=r.current;if(!a)return;let h=()=>{m.current&&(m.current.textContent=j(a.currentTime));},f=()=>{if(s.current){let l=isFinite(a.duration)?a.duration:0;s.current.textContent=` / ${j(l)}`;}};return a.addEventListener("timeupdate",h),a.addEventListener("durationchange",f),a.addEventListener("seeked",h),h(),f(),()=>{a.removeEventListener("timeupdate",h),a.removeEventListener("durationchange",f),a.removeEventListener("seeked",h);}},[r,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:s,style:{opacity:.6},children:" / 0:00"})]})});He.displayName="TimeDisplay";var ve=He;var z={PlayButton:oe,PauseButton:ie,FullscreenButton:ae,PiPButton:se,VolumeControl:de,ProgressBar:me,SettingsMenu:pe,TimeDisplay:ve};var Le=({videoRef:r,playerRef:e,playerContainerRef:m,playbackRates:s,enablePreview:a,thumbnailVtt:h,isPlaying:f,volume:l,isMuted:b,playbackRate:d,isFullscreen:P,isPictureInPicture:T,isLive:C,qualityLevels:E,currentQualityLevel:v})=>{let w=ct.useRef(null),L=ct.useRef(null),[D,x]=ct.useState(true),V=ct.useRef({isPlaying:f,volume:l,isMuted:b,isLive:C});V.current={isPlaying:f,volume:l,isMuted:b,isLive:C},ct.useEffect(()=>{if(!f){x(true),L.current&&clearTimeout(L.current);return}let g=()=>{x(true),L.current&&clearTimeout(L.current),L.current=setTimeout(()=>x(false),3e3);},u=w.current;return u&&(u.addEventListener("mousemove",g),u.addEventListener("mouseenter",g),u.addEventListener("touchstart",g,{passive:true})),g(),()=>{u&&(u.removeEventListener("mousemove",g),u.removeEventListener("mouseenter",g),u.removeEventListener("touchstart",g)),L.current&&clearTimeout(L.current);}},[f]),ct.useEffect(()=>{let g=u=>{if(!m.current?.contains(document.activeElement))return;let R=u.target;if(R.tagName==="INPUT"||R.tagName==="TEXTAREA"||R.isContentEditable)return;let{isPlaying:Y,volume:q,isLive:Z}=V.current,X=r.current?.currentTime??0,G=r.current?.duration??0;switch(u.code){case "Space":case "KeyK":u.preventDefault(),Y?e.pause():e.play();break;case "ArrowLeft":u.preventDefault(),e.seek(Math.max(0,X-5));break;case "ArrowRight":u.preventDefault(),e.seek(Math.min(G||1/0,X+5));break;case "ArrowUp":u.preventDefault(),e.setVolume(Math.min(1,q+.1));break;case "ArrowDown":u.preventDefault(),e.setVolume(Math.max(0,q-.1));break;case "KeyM":u.preventDefault(),e.toggleMute();break;case "KeyF":u.preventDefault(),e.toggleFullscreen();break;case "KeyP":u.preventDefault(),e.togglePictureInPicture();break;case "KeyL":u.preventDefault(),Z&&e.seekToLive();break;case "Digit0":case "Digit1":case "Digit2":case "Digit3":case "Digit4":case "Digit5":case "Digit6":case "Digit7":case "Digit8":case "Digit9":{u.preventDefault();let Q=Number(u.code.replace("Digit",""))*10;e.seek(G/100*Q);break}}};return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[e,m,r]);let O=ct.useCallback(()=>e.play(),[e]),S=ct.useCallback(()=>e.pause(),[e]),$=ct.useCallback(g=>e.setVolume(g),[e]),A=ct.useCallback(()=>e.toggleMute(),[e]),t=ct.useCallback(g=>e.setPlaybackRate(g),[e]),o=ct.useCallback(g=>e.setQualityLevel(g),[e]),c=ct.useCallback(()=>e.togglePictureInPicture(),[e]),M=ct.useCallback(()=>e.toggleFullscreen(),[e]),I=ct.useCallback(()=>e.seekToLive(),[e]);return jsxRuntime.jsx("div",{ref:w,style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",justifyContent:"flex-end",opacity:D?1:0,transition:"opacity 0.3s",pointerEvents:D?"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(z.ProgressBar,{videoRef:r,playerRef:e,enablePreview:a,thumbnailVtt:h}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginTop:4},children:[f?jsxRuntime.jsx(z.PauseButton,{onClick:S}):jsxRuntime.jsx(z.PlayButton,{onClick:O}),jsxRuntime.jsx(z.VolumeControl,{volume:l,isMuted:b,onVolumeChange:$,onToggleMute:A}),jsxRuntime.jsx(z.TimeDisplay,{videoRef:r,isLive:C}),jsxRuntime.jsx("div",{style:{flex:1}}),C&&jsxRuntime.jsx(Oe,{onClick:I}),jsxRuntime.jsx(z.SettingsMenu,{currentRate:d,playbackRates:s,onRateChange:t,qualityLevels:E,currentQualityLevel:v,onQualityChange:o}),jsxRuntime.jsx(z.PiPButton,{onClick:c,isPiP:T}),jsxRuntime.jsx(z.FullscreenButton,{onClick:M,isFullscreen:P})]})]})})},Oe=ct.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"}));Oe.displayName="GoLiveButton";var ze=ct.forwardRef(({src:r,poster:e,autoplay:m=false,muted:s=false,loop:a=false,controls:h=true,preload:f="metadata",playbackRates:l=[.25,.5,.75,1,1.25,1.5,1.75,2],className:b,enableHLS:d=true,enablePreview:P=true,thumbnailVtt:T,hlsConfig:C,subtitles:E,crossOrigin:v,onPlay:w,onPause:L,onEnded:D,onError:x,onTimeUpdate:V,onDurationChange:O,onBuffering:S},$)=>{let A=ct.useRef(null),t=ct.useRef(null),{state:o,ref:c,fullscreenContainerRef:M}=Me(A,r,{autoplay:m,muted:s,loop:a,playbackRates:l,enableHLS:d,hlsConfig:C,onPlay:w,onPause:L,onEnded:D,onError:x,onTimeUpdate:V,onDurationChange:O,onBuffering:S});ct.useEffect(()=>{M.current=t.current;},[M]),ct__default.default.useImperativeHandle($,()=>c,[c]);let I=ct.useCallback(()=>{t.current?.focus(),o.isPlaying?c.pause():c.play();},[o.isPlaying,c]),g=ct.useCallback(()=>{c.toggleFullscreen();},[c]);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",children:[jsxRuntime.jsx("video",{ref:A,poster:e,preload:f,crossOrigin:v,onClick:I,onDoubleClick:g,playsInline:true,style:{width:"100%",height:"100%",display:"block",cursor:"pointer"},"data-test":"video-element",children:E?.map(u=>jsxRuntime.jsx("track",{kind:"subtitles",src:u.src,label:u.label,srcLang:u.srclang,default:u.default},u.id))}),h&&jsxRuntime.jsx(Le,{videoRef:A,playerRef:c,playerContainerRef:t,playbackRates:l,enablePreview:P,thumbnailVtt:T,isPlaying:o.isPlaying,volume:o.volume,isMuted:o.isMuted,playbackRate:o.playbackRate,isFullscreen:o.isFullscreen,isPictureInPicture:o.isPictureInPicture,isLive:o.isLive,qualityLevels:o.qualityLevels,currentQualityLevel:o.currentQualityLevel}),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})]})})]})});ze.displayName="VideoPlayer";var pt=ze;exports.ControlElements=Ve;exports.Controls=Le;exports.VideoPlayer=pt;exports.findThumbnailCue=be;exports.formatTime=j;exports.getMimeType=We;exports.isHLSUrl=le;exports.parseThumbnailVtt=ge;//# sourceMappingURL=index.js.map
|
|
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
|
|
4
4
|
//# sourceMappingURL=index.js.map
|