playron 1.0.37 → 1.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/PlayerCore.d.ts.map +1 -1
- package/dist/playron.cjs.js +1 -1
- package/dist/playron.es.js +316 -312
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlayerCore.d.ts","sourceRoot":"","sources":["../../src/core/PlayerCore.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PlayerCore.d.ts","sourceRoot":"","sources":["../../src/core/PlayerCore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAI1D,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAiC;IACrD,OAAO,CAAC,SAAS,CAA4B;IAGtC,MAAM,EAAE,mBAAmB,CAAC;IAGnC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAG7C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAG7C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,4BAA4B,CAAqC;IACzE,OAAO,CAAC,sBAAsB,CAA6B;IAG3D,OAAO,CAAC,aAAa,CAA8B;IAGnD,OAAO,CAAC,gBAAgB,CAA+C;IACvE,qEAAqE;IACrE,OAAO,CAAC,mBAAmB,CAAM;IAGjC,OAAO,CAAC,SAAS,CAAoC;IAErD,OAAO,CAAC,UAAU,CAA2B;IAG7C,OAAO,CAAC,YAAY,CAA6B;IAGjD,OAAO,CAAC,WAAW,CAAkC;IAErD;;;;OAIG;IACH,MAAM,CAAC,cAAc,IAAI,IAAI;gBAKjB,YAAY,EAAE,gBAAgB;IAM1C;;OAEG;IACH,OAAO,CAAC,UAAU;IA6BlB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkH3B;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,UAAU;IAkChE;;;OAGG;IACI,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI;IAIlD,2EAA2E;IACpE,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAI5C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,iBAAiB,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAU1D;;OAEG;IACH,cAAc,IAAI;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB;IAiCD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMnC;;;;;OAKG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsN3C;;OAEG;YACW,uBAAuB;IAiBrC;;OAEG;YACW,gBAAgB;IA8B9B,aAAa,IAAI,UAAU;IAI3B,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC,MAAM,IAAI,OAAO;IAMjB,eAAe,IAAI,MAAM;IAIzB,iBAAiB,IAAI,MAAM;IAO3B,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO;IAKzC,cAAc,IAAI,IAAI;IAMtB,WAAW,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIpD,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,kBAAkB;IA2B1B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKpE,QAAQ,IAAI,WAAW,GAAG,IAAI;IAK9B,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC,eAAe,IAAI,gBAAgB,GAAG,IAAI;IAM1C,gBAAgB,IAAI,IAAI;IASlB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAehC,YAAY,CAAC,OAAO,GAAE,MAAW,GAAG,IAAI;IAMxC,WAAW,CAAC,OAAO,GAAE,MAAW,GAAG,IAAI;IASvC,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAK5B,OAAO,IAAI,OAAO;IAMlB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUnC,UAAU,IAAI,YAAY,GAAG,IAAI;IAIjC,qBAAqB,IAAI,YAAY,EAAE;IAMvC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpC,aAAa,IAAI,MAAM;IAIvB,uBAAuB,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAMjF,iBAAiB,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAItE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9D,yBAAyB,IAAI,MAAM,GAAG,IAAI;IAM1C,OAAO,CAAC,YAAY;IAoCpB,iBAAiB,IAAI,IAAI;IAWzB,kBAAkB,IAAI,OAAO;IAI7B,eAAe,IAAI,OAAO;IAI1B,OAAO,CAAC,cAAc;IAoBtB;;;;;OAKG;IACH,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAYrC,yCAAyC;IACnC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrC,wCAAwC;IACxC,WAAW,IAAI,IAAI;IAInB,4DAA4D;IAC5D,eAAe,IAAI,OAAO;IAI1B,4DAA4D;IAC5D,YAAY,IAAI,OAAO;IAIvB,OAAO,CAAC,iBAAiB;IAOzB,iBAAiB,IAAI,IAAI;IAazB,aAAa,IAAI,OAAO;IAOxB;;OAEG;IACH,OAAO,IAAI,IAAI;CA0BhB"}
|
package/dist/playron.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react/jsx-runtime"),c=require("react");class Ye{listeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){const r=this.listeners.get(e);r&&(r.delete(t),r.size===0&&this.listeners.delete(e))}emit(e){const t=this.listeners.get(e.type);t&&t.forEach(r=>{try{r(e)}catch(n){console.error(`Error in event listener for ${e.type}:`,n)}})}clear(){this.listeners.clear()}listenerCount(e){return this.listeners.get(e)?.size||0}}const ie=new Ye,E={PLAY:"play",PAUSE:"pause",PLAYING:"playing",ENDED:"ended",SEEKING:"seeking",SEEKED:"seeked",WAITING:"waiting",VOLUME_CHANGE:"volumechange",TIME_UPDATE:"timeupdate",DURATION_CHANGE:"durationchange",LOADED_METADATA:"loadedmetadata",LOADED_DATA:"loadeddata",CAN_PLAY:"canplay",CAN_PLAY_THROUGH:"canplaythrough",RATE_CHANGE:"ratechange",LOAD_START:"loadstart",PROGRESS:"progress",SUSPEND:"suspend",ABORT:"abort",STALLED:"stalled",ERROR:"error",EMPTIED:"emptied",RESIZE:"resize"},he={MEDIA_ERR_ABORTED:1,MEDIA_ERR_NETWORK:2,MEDIA_ERR_DECODE:3,MEDIA_ERR_SRC_NOT_SUPPORTED:4};function Ft(a){return Object.values(E).includes(a)}class Ut{videoElement=null;isPlaying=!1;isMuted=!1;volume=1;playbackRate=1;currentTime=0;duration=0;constructor(e){this.videoElement=e,this.setupEventListeners(),this.initializeVideo()}setupEventListeners(){this.videoElement&&(this.videoElement.addEventListener(E.PLAY,()=>{this.isPlaying=!0,this.emitPlayEvent()}),this.videoElement.addEventListener(E.PAUSE,()=>{this.isPlaying=!1,this.emitPauseEvent()}),this.videoElement.addEventListener(E.VOLUME_CHANGE,()=>{this.videoElement&&(this.volume=this.videoElement.volume,this.isMuted=this.videoElement.muted,this.emitVolumeChangeEvent())}),this.videoElement.addEventListener(E.TIME_UPDATE,()=>{this.videoElement&&(this.currentTime=this.videoElement.currentTime)}),this.videoElement.addEventListener(E.LOADED_METADATA,()=>{this.videoElement&&(this.duration=this.videoElement.duration)}),this.videoElement.addEventListener(E.RATE_CHANGE,()=>{this.videoElement&&(this.playbackRate=this.videoElement.playbackRate)}),this.videoElement.addEventListener(E.ERROR,e=>{console.error("Video error:",e),this.videoElement?.error&&console.error("Video error details:",{code:this.videoElement.error.code,message:this.videoElement.error.message,MEDIA_ERR_ABORTED:this.videoElement.error.code===he.MEDIA_ERR_ABORTED,MEDIA_ERR_NETWORK:this.videoElement.error.code===he.MEDIA_ERR_NETWORK,MEDIA_ERR_DECODE:this.videoElement.error.code===he.MEDIA_ERR_DECODE,MEDIA_ERR_SRC_NOT_SUPPORTED:this.videoElement.error.code===he.MEDIA_ERR_SRC_NOT_SUPPORTED})}))}initializeVideo(){this.videoElement&&(this.volume=this.videoElement.volume,this.isMuted=this.videoElement.muted,this.playbackRate=this.videoElement.playbackRate)}emitPlayEvent(){if(!this.videoElement)return;const e={type:"play",data:{currentTime:this.videoElement.currentTime,duration:this.videoElement.duration},timestamp:Date.now()};ie.emit(e)}emitPauseEvent(){if(!this.videoElement)return;const e={type:"pause",data:{currentTime:this.videoElement.currentTime,duration:this.videoElement.duration},timestamp:Date.now()};ie.emit(e)}emitVolumeChangeEvent(){const e={type:"volumechange",data:{volume:this.volume,muted:this.isMuted},timestamp:Date.now()};ie.emit(e)}emitMuteEvent(){const e={type:"mute",data:{muted:this.isMuted,volume:this.volume},timestamp:Date.now()};ie.emit(e)}async play(){if(!this.videoElement)throw new Error("Video element not found");try{await this.videoElement.play()}catch(e){throw console.error("Play failed:",e),e}}pause(){this.videoElement&&this.videoElement.pause()}toggleMute(){this.videoElement&&(this.videoElement.muted=!this.videoElement.muted,this.isMuted=this.videoElement.muted,this.emitMuteEvent())}setVolume(e){this.videoElement&&(this.videoElement.volume=Math.max(0,Math.min(1,e)))}seekTo(e){this.videoElement&&(this.videoElement.currentTime=Math.max(0,Math.min(this.duration,e)))}setPlaybackRate(e){this.videoElement&&(this.videoElement.playbackRate=Math.max(.25,Math.min(4,e)),this.playbackRate=this.videoElement.playbackRate)}setSource(e){this.videoElement&&(this.videoElement.src=e)}setPoster(e){this.videoElement&&(this.videoElement.poster=e)}setDimensions(e,t){this.videoElement&&(this.videoElement.width=typeof e=="number"?e:parseInt(e),this.videoElement.height=typeof t=="number"?t:parseInt(t))}getState(){return{isPlaying:this.isPlaying,isMuted:this.isMuted,volume:this.volume,playbackRate:this.playbackRate,currentTime:this.currentTime,duration:this.duration,src:this.videoElement?.src||"",poster:this.videoElement?.poster||""}}getVideoElement(){return this.videoElement}destroy(){this.videoElement&&(this.videoElement.removeEventListener("play",()=>{}),this.videoElement.removeEventListener("pause",()=>{}),this.videoElement.removeEventListener("volumechange",()=>{}),this.videoElement.removeEventListener("timeupdate",()=>{}),this.videoElement.removeEventListener("loadedmetadata",()=>{}),this.videoElement.removeEventListener("error",()=>{})),this.videoElement=null}}class Ot{config;defaultConfig;constructor(e){this.defaultConfig=this.getDefaultConfig(),this.config=this.mergeConfig(e),this.validateConfig(this.config)}getDefaultConfig(){return{container:"",src:"",width:800,height:450,autoplay:!1,muted:!1,controls:!1,poster:"",className:""}}mergeConfig(e){return{...this.defaultConfig,...e}}validateConfig(e){if(!e.container)throw new Error("Container is required");if(!e.src)throw new Error("Source is required");const t=typeof e.width=="number"?e.width:parseInt(e.width||"800"),r=typeof e.height=="number"?e.height:parseInt(e.height||"450");if(e.width&&(t<100||t>4e3))throw new Error("Width must be between 100 and 4000");if(e.height&&(r<100||r>4e3))throw new Error("Height must be between 100 and 4000")}updateConfig(e){const t={...this.config,...e};this.validateConfig(t),this.config=t}getConfig(){return{...this.config}}get(e){return this.config[e]}set(e,t){const r={[e]:t};this.updateConfig(r)}getContainer(){return typeof this.config.container=="string"?document.querySelector(this.config.container):this.config.container}getDimensions(){return{width:typeof this.config.width=="number"?this.config.width:parseInt(this.config.width||"800"),height:typeof this.config.height=="number"?this.config.height:parseInt(this.config.height||"450")}}reset(){this.config={...this.defaultConfig}}export(){return JSON.stringify(this.config,null,2)}import(e){try{const t=JSON.parse(e);this.validateConfig(t),this.config=t}catch{throw new Error("Invalid configuration format")}}listeners=[];onChange(e){this.listeners.push(e)}offChange(e){const t=this.listeners.indexOf(e);t>-1&&this.listeners.splice(t,1)}notifyChange(){this.listeners.forEach(e=>{try{e(this.config)}catch(t){console.error("Config change listener error:",t)}})}updateConfigAndNotify(e){this.updateConfig(e),this.notifyChange()}}class Wt{state;listeners=[];history=[];maxHistorySize=50;constructor(e){this.state=this.getInitialState(e)}getInitialState(e){return{...{isPlaying:!1,isMuted:!1,volume:1,currentTime:0,duration:0,playbackRate:1,isBuffering:!1,isSeeking:!1},...e}}updateState(e){const t={...this.state};this.state={...this.state,...e},this.addToHistory(t),this.notifyListeners()}getState(){return{...this.state}}get(e){return this.state[e]}set(e,t){this.updateState({[e]:t})}subscribe(e){this.listeners.push(e)}unsubscribe(e){const t=this.listeners.indexOf(e);t>-1&&this.listeners.splice(t,1)}notifyListeners(){this.listeners.forEach(e=>{try{e(this.state)}catch(t){console.error("State listener error:",t)}})}addToHistory(e){this.history.push(e),this.history.length>this.maxHistorySize&&this.history.shift()}undo(){if(this.history.length===0)return!1;const e=this.history.pop();return e?(this.state=e,this.notifyListeners(),!0):!1}reset(){this.state=this.getInitialState(),this.history=[],this.notifyListeners()}setState(e){const t={...this.state};this.state={...e},this.addToHistory(t),this.notifyListeners()}clearHistory(){this.history=[]}getHistory(){return[...this.history]}isInState(e){return e(this.state)}subscribeToChanges(e,t){let r={...this.state};const n=s=>{const o={};let l=!1;e.forEach(d=>{r[d]!==s[d]&&(o[d]=s[d],l=!0)}),l&&t(o),r={...s}};this.subscribe(n)}createSnapshot(){return{...this.state}}restoreFromSnapshot(e){this.setState(e)}getStats(){return{totalListeners:this.listeners.length,historySize:this.history.length,maxHistorySize:this.maxHistorySize,lastUpdate:new Date}}}class Ge{listeners=new Map;onceListeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}once(e,t){this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t)}off(e,t){const r=this.listeners.get(e);r&&(r.delete(t),r.size===0&&this.listeners.delete(e));const n=this.onceListeners.get(e);n&&(n.delete(t),n.size===0&&this.onceListeners.delete(e))}emit(e,t){const r=this.listeners.get(e);r&&r.forEach(s=>{try{s(t)}catch(o){console.error(`[Playron] Error in event listener for "${e}":`,o)}});const n=this.onceListeners.get(e);n&&(n.forEach(s=>{try{s(t)}catch(o){console.error(`[Playron] Error in once listener for "${e}":`,o)}}),this.onceListeners.delete(e))}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){const t=this.listeners.get(e)?.size||0,r=this.onceListeners.get(e)?.size||0;return t+r}eventNames(){const e=new Set;return this.listeners.forEach((t,r)=>e.add(r)),this.onceListeners.forEach((t,r)=>e.add(r)),Array.from(e)}}class Xe{async detectStream(e){const t=this.detectProtocol(e);try{if(t==="hls")return await this.detectHLS(e);if(t==="dash")return await this.detectDASH(e);if(t==="progressive")return this.detectProgressive(e)}catch(r){console.warn("[StreamDetector] Failed to detect stream type:",r)}return{type:"unknown",protocol:"unknown",isDynamic:!1,hasDVR:!1,isEngineSupported:this.preCheckCapability("unknown")}}preCheckCapability(e){if(typeof MediaSource>"u")return!1;const t=MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E"')||MediaSource.isTypeSupported('video/mp4; codecs="avc1.4d401e"')||MediaSource.isTypeSupported('video/mp4; codecs="avc1.64001F"'),r=MediaSource.isTypeSupported('video/mp4; codecs="hev1.1.6.L93.B0"')||MediaSource.isTypeSupported('video/mp4; codecs="hvc1.1.6.L93.B0"'),n=MediaSource.isTypeSupported('video/webm; codecs="vp9"')||MediaSource.isTypeSupported('video/mp4; codecs="vp09.00.10.08"'),s=t||r||n,o=/Safari/.test(navigator.userAgent)&&/Apple Computer/.test(navigator.vendor);return e==="hls"&&o?!0:s}detectProtocol(e){const t=e.toLowerCase();return t.includes(".m3u8")||t.includes(".m3u")?"hls":t.includes(".mpd")?"dash":t.match(/\.(mp4|webm|ogg)$/)?"progressive":"unknown"}async detectHLS(e){const t=await this.fetchManifest(e);if(t.includes("#EXT-X-ENDLIST")||t.includes("#EXT-X-PLAYLIST-TYPE:VOD"))return{type:"vod",protocol:"hls",isDynamic:!1,hasDVR:!1,isEngineSupported:this.preCheckCapability("hls")};const n=t.includes("#EXT-X-MEDIA-SEQUENCE"),s=t.includes("#EXT-X-ENDLIST"),o=t.includes("#EXT-X-PLAYLIST-TYPE:EVENT"),l=this.extractTargetDuration(t),d=this.extractMediaSequence(t);return n&&!s?{type:"live",protocol:"hls",isDynamic:!0,hasDVR:o,targetDuration:l,mediaSequence:d,isEngineSupported:this.preCheckCapability("hls")}:{type:"vod",protocol:"hls",isDynamic:!1,hasDVR:!1,isEngineSupported:this.preCheckCapability("hls")}}async detectDASH(e){const t=await this.fetchManifest(e),s=t.match(/<MPD[^>]*type="(static|dynamic)"/)?.[1]==="dynamic",o=t.includes("timeShiftBufferDepth");return{type:s?"live":"vod",protocol:"dash",isDynamic:s,hasDVR:o,isEngineSupported:this.preCheckCapability("dash")}}detectProgressive(e){return{type:"vod",protocol:"progressive",isDynamic:!1,hasDVR:!1,isEngineSupported:!0}}async fetchManifest(e){const t=await fetch(e,{method:"GET",headers:{Accept:"*/*"}});if(!t.ok)throw new Error(`Failed to fetch manifest: ${t.status}`);return await t.text()}extractTargetDuration(e){const t=e.match(/#EXT-X-TARGETDURATION:(\d+)/);return t?parseInt(t[1],10):void 0}extractMediaSequence(e){const t=e.match(/#EXT-X-MEDIA-SEQUENCE:(\d+)/);return t?parseInt(t[1],10):void 0}quickDetect(e){const t=this.detectProtocol(e);return t==="progressive"?{type:"vod",protocol:"progressive",isEngineSupported:!0}:{type:"unknown",protocol:t,isEngineSupported:this.preCheckCapability(t)}}}const Qe=new Xe;class Ze{video;events;options;timer=null;lastTime=-1;stallDuration=0;attempts=0;isRunning=!1;constructor(e,t,r={}){this.video=e,this.events=t,this.options={pollInterval:r.pollInterval??500,stallThreshold:r.stallThreshold??3,onQualityDowngrade:r.onQualityDowngrade}}start(){this.isRunning||(this.isRunning=!0,this.reset(),this.timer=setInterval(()=>this.tick(),this.options.pollInterval))}stop(){this.timer!==null&&(clearInterval(this.timer),this.timer=null),this.isRunning=!1,this.reset()}destroy(){this.stop()}reset(){this.lastTime=-1,this.stallDuration=0,this.attempts=0}tick(){const e=this.video;if(e.paused||e.ended||e.seeking||e.readyState<2){this.stallDuration=0,this.lastTime=e.currentTime;return}const t=e.currentTime;if(this.lastTime<0){this.lastTime=t;return}const r=t-this.lastTime;if(this.lastTime=t,r>.05){if(this.stallDuration>0){const o=this.attempts>=3?"quality":"seek";this.events.emit("stallrecovered",{duration:Math.round(this.stallDuration),method:o})}this.stallDuration=0,this.attempts=0;return}this.stallDuration+=this.options.pollInterval/1e3;const{stallThreshold:n}=this.options,s=Math.floor(this.stallDuration/n);s>this.attempts&&(this.attempts=s,this.recover())}recover(){const e=this.video;switch(this.events.emit("stall",{duration:Math.round(this.stallDuration),attempt:this.attempts}),this.attempts){case 1:e.currentTime=Math.min(e.currentTime+.5,e.duration||1/0);break;case 2:e.currentTime=Math.min(e.currentTime+2,e.duration||1/0);break;case 3:this.options.onQualityDowngrade&&this.options.onQualityDowngrade(),e.currentTime=Math.min(e.currentTime+2,e.duration||1/0);break;default:this.events.emit("error",{code:"STALL_UNRECOVERABLE",message:`Playback stalled for ${Math.round(this.stallDuration)}s and could not be recovered.`}),this.stop();break}}}const Je=[{contentType:'video/mp4; codecs="avc1.42E01E"'}],Ht=[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],zt=[{initDataTypes:["cenc"],videoCapabilities:Je,audioCapabilities:Ht}];async function Le(a){try{return await navigator.requestMediaKeySystemAccess(a,zt),!0}catch{return!1}}async function et(){const[a,e,t]=await Promise.all([Le("com.widevine.alpha"),Le("com.microsoft.playready"),Le("org.w3.clearkey")]),r=await(async()=>{try{return await navigator.requestMediaKeySystemAccess("com.apple.fps",[{initDataTypes:["skd"],videoCapabilities:Je}]),!0}catch{return!1}})();let n=null;return a?n="widevine":r?n="fairplay":e?n="playready":t&&(n="clearkey"),{widevine:a,fairplay:r,playready:e,clearkey:t,preferredSystem:n}}const qt=3e4,Kt=2,Yt=1e3,Ie=new Map;async function tt(a,e,t,r,n){let s=new Error("License request failed");for(let o=0;o<=r;o++){if(o>0){const u=n*Math.pow(2,o-1);await new Promise(h=>setTimeout(h,u))}const l=new AbortController,d=setTimeout(()=>l.abort(),t);try{const u=await fetch(a,{...e,signal:l.signal});if(clearTimeout(d),!u.ok)throw new Error(`HTTP ${u.status}: ${u.statusText}`);return await u.arrayBuffer()}catch(u){clearTimeout(d),u instanceof Error&&u.name==="AbortError"?s=new Error(`Request timed out after ${t}ms (attempt ${o+1}/${r+1})`):s=u instanceof Error?u:new Error(String(u))}}throw s}async function Gt(a,e={}){const t=Ie.get(a);if(t)return console.debug("[LicenseManager] Using cached FairPlay certificate:",a),t;console.debug("[LicenseManager] Fetching FairPlay certificate:",a);const r=await tt(a,{method:"GET",headers:e},15e3,1,500);return Ie.set(a,r),r}function Xt(){Ie.clear()}async function Qt(a,e,t={},r=!1,n={}){const s=n.timeout??qt,o=n.maxRetries??Kt,l=n.retryDelay??Yt;let d=e;n.prepareLicenseRequest&&(d=await n.prepareLicenseRequest(e));const u={method:"POST",body:d,headers:{"Content-Type":"application/octet-stream",...t},credentials:r?"include":"omit"};console.debug("[LicenseManager] Acquiring license from:",a);let h=await tt(a,u,s,o,l);return n.parseLicenseResponse&&(h=await n.parseLicenseResponse(h)),h}const Be="com.apple.fps",Zt=[{initDataTypes:["skd"],videoCapabilities:[{contentType:'video/mp4; codecs="avc1.42E01E"'},{contentType:'video/mp4; codecs="hvc1.1.6.L93.B0"'}],audioCapabilities:[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],sessionTypes:["temporary"],persistentState:"optional",distinctiveIdentifier:"optional"}];class Jt{keySystem=Be;config;mediaKeys=null;videoElement=null;sessions=new Set;destroyed=!1;boundOnEncrypted;constructor(e){this.config=e,this.boundOnEncrypted=t=>{this.handleEncrypted(t)}}async initialize(e){if(this.destroyed)return;this.videoElement=e;let t;try{t=await navigator.requestMediaKeySystemAccess(Be,Zt)}catch{throw new Error("FairPlay Streaming is not supported in this browser. Safari on macOS or iOS is required.")}this.mediaKeys=await t.createMediaKeys();let r;try{r=await Gt(this.config.certificateUrl,this.config.headers)}catch(n){throw new Error(`FairPlay: Failed to fetch server certificate from ${this.config.certificateUrl}: `+(n instanceof Error?n.message:String(n)))}try{await this.mediaKeys.setServerCertificate(r)||console.debug("[FairPlayAdapter] setServerCertificate returned false (certificate may not be required)")}catch(n){throw new Error(`FairPlay: setServerCertificate failed: ${n instanceof Error?n.message:String(n)}`)}await e.setMediaKeys(this.mediaKeys),e.addEventListener("encrypted",this.boundOnEncrypted),console.debug("[FairPlayAdapter] Initialized — waiting for encrypted event"),this.config.onReady?.()}async handleEncrypted(e){if(!this.mediaKeys||this.destroyed)return;console.debug("[FairPlayAdapter] Received encrypted event, initDataType:",e.initDataType);const t=this.mediaKeys.createSession("temporary");if(this.sessions.add(t),t.addEventListener("message",r=>{this.handleKeyMessage(t,r)}),t.addEventListener("keystatuseschange",()=>{this.handleKeyStatusChange(t)}),!e.initData){this.sessions.delete(t),console.warn("[FairPlayAdapter] Encrypted event has no initData — skipping session");return}try{await t.generateRequest(e.initDataType,e.initData)}catch(r){this.sessions.delete(t);const n=`FairPlay: generateRequest failed: ${r instanceof Error?r.message:String(r)}`;console.error("[FairPlayAdapter]",n),this.config.onError?.("FAIRPLAY_GENERATE_REQUEST_FAILED",n,!0)}}async handleKeyMessage(e,t){if(this.destroyed)return;const r=t.message;console.debug("[FairPlayAdapter] Received key message, acquiring license...");try{const n=await Qt(this.config.licenseUrl,r,this.config.headers??{},this.config.withCredentials??!1,this.config.licenseAcquisitionConfig??{});await e.update(n),console.debug("[FairPlayAdapter] License applied successfully")}catch(n){const s=`FairPlay: License acquisition failed: ${n instanceof Error?n.message:String(n)}`;console.error("[FairPlayAdapter]",s),this.config.onError?.("FAIRPLAY_LICENSE_FAILED",s,!0)}}handleKeyStatusChange(e){e.keyStatuses.forEach(t=>{switch(t){case"expired":this.config.onError?.("FAIRPLAY_KEY_EXPIRED","FairPlay: Content key has expired. Please reload the player.",!0);break;case"output-restricted":this.config.onError?.("FAIRPLAY_OUTPUT_RESTRICTED","FairPlay: Output restricted — HDCP connection required.",!1);break;case"internal-error":this.config.onError?.("FAIRPLAY_INTERNAL_ERROR","FairPlay: Internal key error.",!0);break;case"usable":console.debug("[FairPlayAdapter] Key status: usable");break;default:console.debug("[FairPlayAdapter] Key status:",t)}})}destroy(){this.destroyed||(this.destroyed=!0,this.videoElement&&this.videoElement.removeEventListener("encrypted",this.boundOnEncrypted),this.sessions.forEach(e=>{e.close().catch(()=>{})}),this.sessions.clear(),this.videoElement&&(this.videoElement.setMediaKeys(null).catch(()=>{}),this.videoElement=null),this.mediaKeys=null,console.debug("[FairPlayAdapter] Destroyed"))}}const Ne="com.widevine.alpha",er=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4; codecs="avc1.42E01E"',robustness:"SW_SECURE_CRYPTO"},{contentType:'video/mp4; codecs="avc1.42E01E"'}],audioCapabilities:[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],sessionTypes:["temporary"]}];class tr{keySystem=Ne;config;destroyed=!1;constructor(e){this.config=e}async initialize(e){if(!this.destroyed){try{await navigator.requestMediaKeySystemAccess(Ne,er)}catch{throw new Error("Widevine is not supported in this browser. Chrome, Firefox, or Edge (Chromium) is required for Widevine DRM.")}console.debug("[WidevineAdapter] Widevine key system confirmed — delegating EME to streaming engine"),this.config.onReady?.()}}destroy(){this.destroyed=!0,console.debug("[WidevineAdapter] Destroyed")}}const je="com.microsoft.playready",$e="com.microsoft.playready.hardware",rr=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4; codecs="avc1.42E01E"'}],audioCapabilities:[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],sessionTypes:["temporary"]}];class ir{keySystem;config;destroyed=!1;constructor(e){this.config=e,this.keySystem=e.preferHardware?$e:je}async initialize(e){if(this.destroyed)return;const t=this.config.preferHardware?[$e,je]:[je];let r=!1;for(const n of t)try{await navigator.requestMediaKeySystemAccess(n,rr),r=!0,console.debug(`[PlayReadyAdapter] Key system confirmed: ${n}`);break}catch{}if(!r)throw new Error("PlayReady is not supported in this browser. Microsoft Edge or Internet Explorer is required for PlayReady DRM.");console.debug("[PlayReadyAdapter] PlayReady key system confirmed — delegating EME to dashjs"),this.config.onReady?.()}destroy(){this.destroyed=!0,console.debug("[PlayReadyAdapter] Destroyed")}}const nr={widevine:"com.widevine.alpha",fairplay:"com.apple.fps",playready:"com.microsoft.playready"};class sr{adapter=null;selectedKeySystem=null;emitter;destroyed=!1;constructor(e){this.emitter=e}async initialize(e,t){if(this.destroyed||!t?.enabled)return null;const r=await et().catch(()=>({widevine:!1,fairplay:!1,playready:!1,clearkey:!1,preferredSystem:null})),n=t.preferredSystem;if(n&&(n==="fairplay"&&r.fairplay&&t.fairplay&&(this.selectedKeySystem="fairplay"),n==="widevine"&&r.widevine&&t.widevine&&(this.selectedKeySystem="widevine"),n==="playready"&&r.playready&&t.playready&&(this.selectedKeySystem="playready")),this.selectedKeySystem||(r.fairplay&&t.fairplay?this.selectedKeySystem="fairplay":r.widevine&&t.widevine?this.selectedKeySystem="widevine":r.playready&&t.playready&&(this.selectedKeySystem="playready")),!this.selectedKeySystem)return console.warn("[DrmManager] No supported DRM key system found for the provided configuration. Browser capabilities:",r),null;const s=nr[this.selectedKeySystem];if(console.debug("[DrmManager] Selected key system:",s),this.emitter.emit("drm:keysystem",{keySystem:s}),this.adapter=this.createAdapter(t),!this.adapter)return null;try{await this.adapter.initialize(e)}catch(o){const l=o instanceof Error?o.message:String(o);return console.error("[DrmManager] Adapter initialization failed:",l),this.emitter.emit("error",{code:"DRM_INIT_FAILED",message:l,details:o}),this.selectedKeySystem=null,null}return this.emitter.emit("drm:ready",{keySystem:s}),this.selectedKeySystem}getSelectedKeySystem(){return this.selectedKeySystem}destroy(){this.destroyed||(this.destroyed=!0,this.adapter?.destroy(),this.adapter=null,this.selectedKeySystem=null,Xt(),console.debug("[DrmManager] Destroyed"))}createAdapter(e){const t=(r,n,s=!0)=>{this.emitter.emit("error",{code:r,message:n,details:{fatal:s}})};switch(this.selectedKeySystem){case"fairplay":{const r=e.fairplay;return new Jt({licenseUrl:r.licenseUrl,certificateUrl:r.certificateUrl,headers:r.headers,withCredentials:r.withCredentials,licenseAcquisitionConfig:r.licenseAcquisitionConfig,onError:t})}case"widevine":{const r=e.widevine;return new tr({licenseUrl:r.licenseUrl,headers:r.headers,withCredentials:r.withCredentials,licenseAcquisitionConfig:r.licenseAcquisitionConfig,onError:t})}case"playready":{const r=e.playready;return new ir({licenseUrl:r.licenseUrl,headers:r.headers,withCredentials:r.withCredentials,licenseAcquisitionConfig:r.licenseAcquisitionConfig,onError:t})}default:return null}}}const or="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1",Fe="playron-cast-sdk";class rt{appId;onChange;isAvailable=!1;sessionActive=!1;sdkLoaded=!1;castStateHandler=null;constructor(e){this.appId=e.appId??"CC1AD845",this.onChange=e.onChange}setup(){if(this.sdkLoaded)return;this.sdkLoaded=!0;const e=window.__onGCastApiAvailable;if(window.__onGCastApiAvailable=t=>{e?.(t),t?this.initContext():(console.warn("[ChromecastManager] Cast API not available (no Cast devices found or extension missing)"),this.emitState())},!document.getElementById(Fe)){const t=document.createElement("script");t.id=Fe,t.src=or,t.async=!0,document.head.appendChild(t),console.log("[ChromecastManager] Cast SDK script injected")}}async requestSession(){const e=this.getContext();if(!e){console.warn("[ChromecastManager] Cast context not ready — call setup() first");return}try{await e.requestSession()}catch(t){(t instanceof Error?t.message:String(t)).toLowerCase().includes("cancel")||console.error("[ChromecastManager] requestSession error:",t)}}endSession(e=!0){this.getContext()?.endCurrentSession(e)}async loadMedia(e,t="video/mp4",r=0,n=!1){const s=this.getContext()?.getCurrentSession();if(!s){console.warn("[ChromecastManager] No active Cast session — call requestSession() first");return}const o=window.chrome?.cast;if(o)try{const l=new o.media.MediaInfo(e,t);l.streamType=n?o.media.StreamType.LIVE:o.media.StreamType.BUFFERED,l.metadata=null;const d=new o.media.LoadRequest(l);d.currentTime=r,d.autoplay=!0,await s.loadMedia(d),console.log(`[ChromecastManager] Media loaded on receiver: ${e} (t=${r}s)`)}catch(l){console.error("[ChromecastManager] loadMedia error:",l)}}syncTime(e){const r=this.getContext()?.getCurrentSession()?.getMediaSession();r&&r.seek({currentTime:e,type:"SEEK"})}async syncVolume(e,t){const r=this.getContext()?.getCurrentSession();if(r)try{await r.setVolume(e),await r.setMute(t)}catch{}}isCastAvailable(){return this.isAvailable}isCastActive(){return this.sessionActive}getState(){const e=this.getContext()?.getCastState()??"";let t="unavailable";const r=window.cast?.framework;return r&&(e===r.CastState.NO_DEVICES_AVAILABLE?t="unavailable":e===r.CastState.NOT_CONNECTED?t="not_connected":e===r.CastState.CONNECTING?t="connecting":e===r.CastState.CONNECTED&&(t="connected")),{isAvailable:this.isAvailable,isActive:this.sessionActive,state:t}}destroy(){const e=this.getContext();if(e&&this.castStateHandler){const t=window.cast?.framework?.CastContextEventType;t&&(e.removeEventListener(t.CAST_STATE_CHANGED,this.castStateHandler),e.removeEventListener(t.SESSION_STATE_CHANGED,this.castStateHandler)),this.castStateHandler=null}console.log("[ChromecastManager] Destroyed")}getContext(){return window.cast?.framework?.CastContext?.getInstance()??null}initContext(){const e=this.getContext();if(!e)return;try{e.setOptions({receiverApplicationId:this.appId})}catch(r){console.error("[ChromecastManager] setOptions error:",r);return}this.castStateHandler=()=>{this.syncState()};const t=window.cast?.framework?.CastContextEventType;t&&(e.addEventListener(t.CAST_STATE_CHANGED,this.castStateHandler),e.addEventListener(t.SESSION_STATE_CHANGED,this.castStateHandler)),this.syncState(),console.log(`[ChromecastManager] Initialized with appId=${this.appId}`)}syncState(){const e=this.getContext()?.getCastState()??"",t=window.cast?.framework;if(!t)return;const r=this.sessionActive;this.isAvailable=e!==t.CastState.NO_DEVICES_AVAILABLE,this.sessionActive=e===t.CastState.CONNECTED,r!==this.sessionActive&&console.log(`[ChromecastManager] Session state: ${this.sessionActive?"CONNECTED":"DISCONNECTED"}`),this.emitState()}emitState(){this.onChange(this.getState())}}class ne{videoEngine=null;configManager=null;stateManager=null;videoElement=null;container=null;events;streamType="unknown";streamInfo=null;hlsEngine=null;dashEngine=null;airPlayAvailable=!1;airPlayActive=!1;onAirPlayAvailabilityChanged=null;onAirPlayTargetChanged=null;stallDetector=null;liveLatencyTimer=null;atLiveEdgeTolerance=10;drmConfig=null;drmManager=null;playerConfig=null;castManager=null;static preloadEngines(){Promise.resolve().then(()=>require("./HlsEngine-DUVHcUpc.cjs")),Promise.resolve().then(()=>require("./DashEngine-CWBT5Q9y.cjs"))}constructor(e){this.videoElement=e,this.events=new Ge,this.initialize()}initialize(){if(!this.videoElement)return;this.videoEngine=new Ut(this.videoElement);const e=this.loadPersistedVolume();e!==null&&(this.videoElement.volume=e),this.stateManager=new Wt({isPlaying:!1,isMuted:this.videoElement.muted,volume:this.videoElement.volume,currentTime:0,duration:0,playbackRate:this.videoElement.playbackRate||1}),this.setupStateListeners(),this.setupAirPlay()}setupStateListeners(){!this.stateManager||!this.videoElement||(this.videoElement.addEventListener(E.PLAY,()=>{this.events.emit("play",{timestamp:Date.now()})}),this.videoElement.addEventListener(E.PAUSE,()=>{this.events.emit("pause",{timestamp:Date.now()})}),this.videoElement.addEventListener(E.TIME_UPDATE,()=>{this.events.emit("timeupdate",{currentTime:this.videoElement?.currentTime||0,duration:this.videoElement?.duration||0})}),this.videoElement.addEventListener(E.ENDED,()=>{this.events.emit("ended",{timestamp:Date.now()})}),this.videoElement.addEventListener(E.LOADED_METADATA,()=>{this.events.emit("loadedmetadata",{duration:this.videoElement?.duration||0,videoWidth:this.videoElement?.videoWidth||0,videoHeight:this.videoElement?.videoHeight||0})}),this.videoElement.addEventListener(E.RATE_CHANGE,()=>{const e=this.videoElement?.playbackRate||1;this.stateManager?.set("playbackRate",e),this.events.emit("ratechange",{playbackRate:e})}),this.videoElement.addEventListener(E.SEEKING,()=>{this.stateManager?.set("isSeeking",!0),this.stateManager?.set("isBuffering",!0),this.events.emit("seeking",{targetTime:this.videoElement?.currentTime??0}),this.events.emit("buffering",{isBuffering:!0})}),this.videoElement.addEventListener(E.SEEKED,()=>{this.stateManager?.set("isSeeking",!1),this.events.emit("seeked",{currentTime:this.videoElement?.currentTime??0})}),this.videoElement.addEventListener(E.WAITING,()=>{this.stateManager?.set("isBuffering",!0),this.events.emit("buffering",{isBuffering:!0})}),this.videoElement.addEventListener(E.PLAYING,()=>{this.stateManager?.set("isBuffering",!1),this.stateManager?.set("isSeeking",!1),this.events.emit("buffering",{isBuffering:!1})}),this.videoElement.addEventListener(E.CAN_PLAY,()=>{this.stateManager?.set("isBuffering",!1),this.events.emit("buffering",{isBuffering:!1})}),this.videoElement.addEventListener(E.ERROR,()=>{const e=this.videoElement?.error;if(e){const t=`MEDIA_ERR_${e.code===1?"ABORTED":e.code===2?"NETWORK":e.code===3?"DECODE":e.code===4?"SRC_NOT_SUPPORTED":"UNKNOWN"}`;Promise.resolve().then(()=>require("./ErrorManager-CDf_sFKX.cjs")).then(({errorManager:r})=>{r.dispatchError("Playback Error",t,e.message||"Video playback error",e)}),this.events.emit("error",{code:t,message:e.message||"Video playback error",details:e})}}),this.stateManager.subscribe(e=>{if(this.videoEngine){const t=this.videoEngine.getState();t.isPlaying!==e.isPlaying&&(e.isPlaying?this.videoEngine.play().catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Play failed:",r)}):this.videoEngine.pause()),t.isMuted!==e.isMuted&&this.videoEngine.toggleMute(),t.volume!==e.volume&&this.videoEngine.setVolume(e.volume)}}))}static createWithConfig(e){const t=typeof e.container=="string"?document.querySelector(e.container):e.container;if(!t)throw new Error(`Container not found: ${e.container}`);const r=document.createElement("video");r.id="virtus-video-player",r.src=e.src,r.width=typeof e.width=="number"?e.width:800,r.height=typeof e.height=="number"?e.height:450,r.autoplay=e.autoplay||!1,r.muted=e.muted||!1,r.controls=e.controls||!1,r.className=`playron ${e.className||""}`,e.poster&&(r.poster=e.poster),t.appendChild(r);const n=new ne(r);return n.container=t,n.configManager=new Ot(e),n}setupDrm(e){this.drmConfig=e}setConfig(e){this.playerConfig=e}async play(){if(!this.videoEngine)throw new Error("VideoEngine not initialized");try{await this.videoEngine.play(),this.stateManager?.set("isPlaying",!0)}catch(e){if(e instanceof DOMException&&e.name==="AbortError")return;throw console.error("Play failed:",e),e}}pause(){this.videoEngine&&(this.videoEngine.pause(),this.stateManager?.set("isPlaying",!1))}toggleMute(){if(!this.videoEngine)return;this.videoEngine.toggleMute();const e=this.videoEngine.getState();this.stateManager?.set("isMuted",e.isMuted)}setVolume(e){this.videoEngine&&(this.videoEngine.setVolume(e),this.stateManager?.set("volume",e),this.persistVolume(e))}getBufferedRanges(){if(!this.videoElement)return[];const e=[],{buffered:t}=this.videoElement;for(let r=0;r<t.length;r++)e.push({start:t.start(r),end:t.end(r)});return e}getPlayerStats(){const e=this.hlsEngine?.getStats()??{bandwidth:0,bufferHealth:0,droppedFrames:0,totalFrames:0,codec:"",resolution:"",segmentUrl:this.videoElement?.currentSrc??""};if(!this.hlsEngine&&this.videoElement){const t=this.videoElement,r=t.currentTime;for(let s=0;s<t.buffered.length;s++)if(t.buffered.start(s)<=r&&t.buffered.end(s)>=r){e.bufferHealth=parseFloat((t.buffered.end(s)-r).toFixed(2));break}const n=t.getVideoPlaybackQuality?.();e.droppedFrames=n?.droppedVideoFrames??0,e.totalFrames=n?.totalVideoFrames??0,t.videoWidth&&t.videoHeight&&!e.resolution&&(e.resolution=`${t.videoWidth}×${t.videoHeight}`),e.segmentUrl=t.currentSrc??""}return{...e,streamType:this.streamType}}persistVolume(e){try{localStorage.setItem("playron:volume",String(e))}catch{}}loadPersistedVolume(){try{const e=localStorage.getItem("playron:volume");if(e===null)return null;const t=parseFloat(e);return isFinite(t)?Math.max(0,Math.min(1,t)):null}catch{return null}}seekTo(e){this.videoEngine&&this.videoEngine.seekTo(e)}setPlaybackRate(e){this.videoEngine&&(this.videoEngine.setPlaybackRate(e),this.stateManager?.set("playbackRate",e))}async setSource(e){if(!this.videoEngine||!this.videoElement)return;console.log("[PlayerCore] Setting source:",e),await this.destroyStreamingEngines(),this.drmConfig?.enabled&&this.videoElement&&(this.drmManager=new sr(this.events),await this.drmManager.initialize(this.videoElement,this.drmConfig));const t=Qe.quickDetect(e);if(console.log("[PlayerCore] Detected protocol:",t.protocol),t.protocol==="hls"){const{HlsEngine:r}=await Promise.resolve().then(()=>require("./HlsEngine-DUVHcUpc.cjs"));this.hlsEngine=new r(this.videoElement,{autoStart:!0,maxBufferAhead:30,maxBufferBehind:10,...this.drmConfig&&{drmConfig:this.drmConfig},...this.playerConfig?.player?.withCredentials&&{withCredentials:!0}}),this.hlsEngine.on("quality-changed",({quality:n})=>{this.events.emit("qualitychange",{from:"",to:n.label})}),this.hlsEngine.on("error",({error:n})=>{Promise.resolve().then(()=>require("./ErrorManager-CDf_sFKX.cjs")).then(({errorManager:s})=>{const o=String(n?.code??""),l=o.includes("NETWORK")||o.includes("CORS")?"Network Error":o.includes("PARSE")?"Manifest Parse Error":o.includes("FRAG")?"Frag Load Error":"Playback Error";s.dispatchError(l,String(n?.code??"HLS_ERROR"),String(n?.message??"HLS streaming error"),n?.details)}),this.events.emit("error",{code:String(n?.code??"HLS_ERROR"),message:String(n?.message??"HLS streaming error"),details:n})}),this.hlsEngine.on("state-change",({state:n})=>{n==="buffering"?this.stateManager?.set("isBuffering",!0):(n==="playing"||n==="paused")&&this.stateManager?.set("isBuffering",!1)});try{await this.hlsEngine.load(e),this.container&&(this.hlsEngine.attachCaptions(this.container),this.hlsEngine.attachSubtitles(this.container));const n=this.hlsEngine.isLiveStream();this.streamType=n?"live":"vod",this.streamInfo={type:this.streamType,protocol:"hls",isDynamic:n,hasDVR:n,isEngineSupported:!0},n&&this.startLiveLatencyTracking(this.atLiveEdgeTolerance),this.events.emit("tracksready",{hasQualities:this.hlsEngine.getQualities().length>1,hasAudioTracks:this.hlsEngine.getAudioTracks().length>1,hasSubtitleTracks:this.hlsEngine.getSubtitleTracks().length>0})}catch(n){console.error("[PlayerCore] HLS load failed:",n),this.streamType="unknown",this.streamInfo=null,await this.fallbackToNative(e,"hls")}}else if(t.protocol==="dash"){const{DashEngine:r}=await Promise.resolve().then(()=>require("./DashEngine-CWBT5Q9y.cjs"));this.dashEngine=new r(this.videoElement,{autoStart:!0,maxBufferAhead:30,lowLatency:!1,...this.drmConfig&&{drmConfig:this.drmConfig}}),this.dashEngine.on("quality-changed",({quality:n})=>{this.events.emit("qualitychange",{from:"",to:n.label})}),this.dashEngine.on("error",({error:n})=>{Promise.resolve().then(()=>require("./ErrorManager-CDf_sFKX.cjs")).then(({errorManager:s})=>{const o=String(n?.code??""),l=o.includes("NETWORK")||o.includes("27")?"Network Error":o.includes("PARSE")||o.includes("31")?"Manifest Parse Error":"Playback Error";s.dispatchError(l,String(n?.code??"DASH_ERROR"),String(n?.message??"DASH streaming error"),n?.details)}),this.events.emit("error",{code:String(n?.code??"DASH_ERROR"),message:String(n?.message??"DASH streaming error"),details:n})}),this.dashEngine.on("state-change",({state:n})=>{n==="buffering"?this.stateManager?.set("isBuffering",!0):(n==="playing"||n==="paused")&&this.stateManager?.set("isBuffering",!1)});try{await this.dashEngine.load(e),this.container&&(this.dashEngine.attachCaptions(this.container),this.dashEngine.attachSubtitles(this.container));const n=this.dashEngine.isLiveStream();this.streamType=n?"live":"vod",this.streamInfo={type:this.streamType,protocol:"dash",isDynamic:n,hasDVR:n,isEngineSupported:!0},n&&this.startLiveLatencyTracking(this.atLiveEdgeTolerance),this.events.emit("tracksready",{hasQualities:this.dashEngine.getQualities().length>1,hasAudioTracks:this.dashEngine.getAudioTracks().length>1,hasSubtitleTracks:this.dashEngine.getSubtitleTracks().length>0})}catch(n){console.error("[PlayerCore] DASH load failed:",n),this.streamType="unknown",this.streamInfo=null,await this.fallbackToNative(e,"dash")}}else this.streamType="vod",this.streamInfo={type:"vod",protocol:"progressive",isDynamic:!1,hasDVR:!1,isEngineSupported:!0},this.videoEngine.setSource(e);if(this.events.emit("streamTypeDetected",{type:this.streamType,info:this.streamInfo}),window.dispatchEvent(new CustomEvent("virtus:streamTypeDetected",{detail:{type:this.streamType,info:this.streamInfo}})),this.castManager?.isCastActive()){const r=this.streamInfo?.isDynamic??!1,n=t.protocol==="hls"?"application/x-mpegURL":t.protocol==="dash"?"application/dash+xml":"video/mp4";this.castManager.loadMedia(e,n,0,r)}this.startStallDetector()}async destroyStreamingEngines(){this.stopLiveLatencyTracking(),this.hlsEngine&&(await this.hlsEngine.destroy(),this.hlsEngine=null),this.dashEngine&&(await this.dashEngine.destroy(),this.dashEngine=null),this.drmManager&&(this.drmManager.destroy(),this.drmManager=null)}async fallbackToNative(e,t){if(!(!this.videoElement||!this.videoEngine))try{console.log(`[PlayerCore] Attempting native fallback for ${t} stream`),this.videoEngine.setSource(e),this.streamType="vod",this.streamInfo={type:"vod",protocol:"progressive",isDynamic:!1,hasDVR:!1,isEngineSupported:!1}}catch(r){console.error("[PlayerCore] Native fallback failed:",r),this.events.emit("error",{code:"MEDIA_ERR_SRC_NOT_SUPPORTED",message:"Could not play stream natively or via fallback",details:r})}}getStreamType(){return this.streamType}getStreamInfo(){return this.streamInfo}isLive(){return this.streamType==="live"}getLiveEdgeTime(){return this.hlsEngine?.getLiveEdgeTime()??this.dashEngine?.getLiveEdgeTime()??0}getCurrentLatency(){if(!this.isLive())return 0;const e=this.getLiveEdgeTime();return e===0?0:Math.max(0,e-(this.videoElement?.currentTime??0))}isAtLiveEdge(e){return this.isLive()?this.getCurrentLatency()<=(e??this.atLiveEdgeTolerance):!1}seekToLiveEdge(){this.isLive()&&(this.hlsEngine?.seekToLiveEdge(),this.dashEngine?.seekToLiveEdge())}getDVRRange(){return this.hlsEngine?.getDVRRange()??this.dashEngine?.getDVRRange()??null}startLiveLatencyTracking(e){this.stopLiveLatencyTracking(),this.atLiveEdgeTolerance=e,this.liveLatencyTimer=setInterval(()=>{if(!this.isLive())return;const t=this.getCurrentLatency(),r=this.getLiveEdgeTime(),n=t<=this.atLiveEdgeTolerance;this.events.emit("livelatencyupdate",{latency:t,isAtLiveEdge:n,liveEdgeTime:r})},1e3)}stopLiveLatencyTracking(){this.liveLatencyTimer!==null&&(clearInterval(this.liveLatencyTimer),this.liveLatencyTimer=null)}startStallDetector(){this.stallDetector?.destroy(),this.stallDetector=new Ze(this.videoElement,this.events,{pollInterval:500,stallThreshold:3,onQualityDowngrade:()=>{const e=this.getAvailableQualities().filter(t=>t.id!=="auto");if(e.length>1){const t=this.getQuality();if(t&&t.id!=="auto"){const r=e.findIndex(n=>n.id===t.id);r>0&&this.setQuality(e[r-1].id)}}}}),this.stallDetector.start()}setPoster(e){this.videoEngine&&this.videoEngine.setPoster(e)}setDimensions(e,t){this.videoEngine&&this.videoEngine.setDimensions(e,t)}getState(){return this.stateManager?this.stateManager.getState():null}getVideoEngine(){return this.videoEngine}getConfigManager(){return this.configManager}getStateManager(){return this.stateManager}getVideoElement(){return this.videoElement}toggleFullscreen(){this.container&&(document.fullscreenElement?document.exitFullscreen?.():this.container.requestFullscreen?.())}async togglePip(){if(this.videoElement)try{document.pictureInPictureElement?await document.exitPictureInPicture():await this.videoElement.requestPictureInPicture()}catch(e){console.error("PiP error:",e)}}skipBackward(e=15){if(!this.videoElement)return;const t=Math.max(0,this.videoElement.currentTime-e);this.seekTo(t)}skipForward(e=15){if(!this.videoElement)return;const t=Math.min(this.videoElement.duration||0,this.videoElement.currentTime+e);this.seekTo(t)}setLoop(e){this.videoElement&&(this.videoElement.loop=e)}getLoop(){return this.videoElement?.loop||!1}setQuality(e){this.hlsEngine?e==="auto"?this.hlsEngine.enableAutoQuality():this.hlsEngine.setQuality(e):this.dashEngine&&this.dashEngine.setQuality(e)}getQuality(){return this.hlsEngine?.getCurrentQuality()??this.dashEngine?.getCurrentQuality()??null}getAvailableQualities(){return this.hlsEngine?.getQualities()??this.dashEngine?.getQualities()??[]}setAudioTrack(e){this.hlsEngine?.setAudioTrack(e),this.dashEngine?.setAudioTrack(e)}getAudioTrack(){return this.hlsEngine?.getActiveAudioTrackId()??this.dashEngine?.getActiveAudioTrackId()??""}getAvailableAudioTracks(){return this.hlsEngine?.getAudioTracks()??this.dashEngine?.getAudioTracks()??[]}getSubtitleTracks(){return this.hlsEngine?.getSubtitleTracks()??this.dashEngine?.getSubtitleTracks()??[]}async setSubtitleTrack(e){await this.hlsEngine?.setSubtitleTrack(e),await this.dashEngine?.setSubtitleTrack(e)}getActiveSubtitleLanguage(){return this.hlsEngine?.getActiveSubtitleLanguage()??this.dashEngine?.getActiveSubtitleLanguage()??null}setupAirPlay(){!this.videoElement||typeof this.videoElement.webkitShowPlaybackTargetPicker!="function"||(this.onAirPlayAvailabilityChanged=t=>{const r=t;this.airPlayAvailable=r.availability==="available",this.events.emit("airplaychange",{isAvailable:this.airPlayAvailable,isActive:this.airPlayActive})},this.onAirPlayTargetChanged=()=>{this.airPlayActive=!!this.videoElement.webkitCurrentPlaybackTargetIsWireless,this.events.emit("airplaychange",{isAvailable:this.airPlayAvailable,isActive:this.airPlayActive})},this.videoElement.addEventListener("webkitplaybacktargetavailabilitychanged",this.onAirPlayAvailabilityChanged),this.videoElement.addEventListener("webkitcurrentplaybacktargetiswirelesschanged",this.onAirPlayTargetChanged))}showAirPlayPicker(){if(!this.videoElement)return;const e=this.videoElement;typeof e.webkitShowPlaybackTargetPicker=="function"?e.webkitShowPlaybackTargetPicker():console.warn("[PlayerCore] AirPlay not supported in this browser")}isAirPlayAvailable(){return this.airPlayAvailable}isAirPlayActive(){return this.airPlayActive}destroyAirPlay(){this.videoElement&&(this.onAirPlayAvailabilityChanged&&(this.videoElement.removeEventListener("webkitplaybacktargetavailabilitychanged",this.onAirPlayAvailabilityChanged),this.onAirPlayAvailabilityChanged=null),this.onAirPlayTargetChanged&&(this.videoElement.removeEventListener("webkitcurrentplaybacktargetiswirelesschanged",this.onAirPlayTargetChanged),this.onAirPlayTargetChanged=null))}setupChromecast(e){this.castManager||(this.castManager=new rt({appId:e,onChange:t=>{this.events.emit("castchange",t)}}),this.castManager.setup(),console.log("[PlayerCore] Chromecast setup complete"))}async showCastPicker(){if(!this.castManager){console.warn("[PlayerCore] Chromecast not initialised — call setupChromecast() first");return}await this.castManager.requestSession()}stopCasting(){this.castManager?.endSession(!0)}isCastAvailable(){return this.castManager?.isCastAvailable()??!1}isCastActive(){return this.castManager?.isCastActive()??!1}destroyChromecast(){this.castManager?.destroy(),this.castManager=null}toggleTheaterMode(){if(this.container){const e=this.container,t=e.isTheaterMode||!1;e.isTheaterMode=!t,window.dispatchEvent(new CustomEvent("virtus:theatermodechange",{detail:{isTheaterMode:!t},bubbles:!0}))}}isTheaterMode(){return this.container?.isTheaterMode||!1}destroy(){this.stallDetector?.destroy(),this.stallDetector=null,this.destroyAirPlay(),this.destroyChromecast(),this.destroyStreamingEngines(),this.videoEngine&&(this.videoEngine.destroy(),this.videoEngine=null),this.stateManager&&(this.stateManager.reset(),this.stateManager=null),this.configManager&&(this.configManager.reset(),this.configManager=null),this.videoElement=null,this.container=null}}const it=c.createContext(null),nt={isPlaying:!1,isMuted:!1,volume:1,currentTime:0,duration:0,isLive:!1,isAtLiveEdge:!1,liveLatency:0},st=c.createContext(nt),ot=c.createContext(null);function at({children:a,playerInstance:e}){const[t,r]=c.useState(nt);c.useEffect(()=>{if(!e)return;const s=e.getStateManager();if(!s)return;r(s.getState());const o=d=>{r(d)};s.subscribe(o);const l=e.getVideoElement();if(l){const d=()=>{const g=e.isLive();s.updateState({currentTime:l.currentTime,duration:l.duration||0,isLive:g})},u=()=>{s.set("isPlaying",!l.paused)},h=()=>{s.updateState({volume:l.volume,isMuted:l.muted})},p=({latency:g,isAtLiveEdge:m})=>{s.updateState({liveLatency:g,isAtLiveEdge:m,isLive:!0})};return e.events.on("livelatencyupdate",p),l.addEventListener(E.TIME_UPDATE,d),l.addEventListener(E.PLAY,u),l.addEventListener(E.PAUSE,u),l.addEventListener(E.VOLUME_CHANGE,h),l.addEventListener(E.LOADED_METADATA,d),()=>{e.events.off("livelatencyupdate",p),l.removeEventListener(E.TIME_UPDATE,d),l.removeEventListener(E.PLAY,u),l.removeEventListener(E.PAUSE,u),l.removeEventListener(E.VOLUME_CHANGE,h),l.removeEventListener(E.LOADED_METADATA,d),s.unsubscribe(o)}}return()=>{s.unsubscribe(o)}},[e]);const n=c.useMemo(()=>e?{play:async()=>{await e.play()},pause:()=>{e.pause()},togglePlay:async()=>{e.getState()?.isPlaying?e.pause():await e.play()},toggleMute:()=>{e.toggleMute()},setVolume:s=>{e.setVolume(s)},seekTo:s=>{e.seekTo(s)},setPlaybackRate:s=>{e.setPlaybackRate(s)},toggleFullscreen:()=>{e.toggleFullscreen()},togglePip:async()=>{await e.togglePip()},skipBackward:(s=15)=>{e.skipBackward(s)},skipForward:(s=15)=>{e.skipForward(s)},setLoop:s=>{e.setLoop(s)},getLoop:()=>e.getLoop(),setQuality:s=>{e.setQuality(s)},getQuality:()=>e.getQuality(),getAvailableQualities:()=>e.getAvailableQualities(),setAudioTrack:s=>{e.setAudioTrack(s)},getAudioTrack:()=>e.getAudioTrack(),getAvailableAudioTracks:()=>e.getAvailableAudioTracks(),toggleTheaterMode:()=>{e.toggleTheaterMode()},isTheaterMode:()=>e.isTheaterMode(),getPlayer:()=>e,getStreamType:()=>e.getStreamType(),getStreamInfo:()=>e.getStreamInfo(),isLive:()=>e.isLive(),getBufferedRanges:()=>e.getBufferedRanges(),seekToLiveEdge:()=>{e.seekToLiveEdge()},getCurrentLatency:()=>e.getCurrentLatency(),isAtLiveEdge:s=>e.isAtLiveEdge(s),getDVRRange:()=>e.getDVRRange(),getSubtitleTracks:()=>e.getSubtitleTracks(),setSubtitleTrack:async s=>{await e.setSubtitleTrack(s)},getActiveSubtitleLanguage:()=>e.getActiveSubtitleLanguage(),getPlayerStats:()=>e.getPlayerStats()}:null,[e]);return i.jsx(it.Provider,{value:e,children:i.jsx(ot.Provider,{value:n,children:i.jsx(st.Provider,{value:t,children:a})})})}function O(a){const e=c.useContext(st);if(!e)throw new Error("usePlayerState must be used within PlayerProvider");return a?a(e):e}function U(){const a=c.useContext(ot);if(!a)throw new Error("usePlayerMethods must be used within PlayerProvider");return a}function Ue({size:a=40}){return i.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"#fff",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{width:`${a}px`,height:`${a}px`,animation:"spin 1s linear infinite"},children:[i.jsx("path",{d:"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"}),i.jsx("style",{children:`
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react/jsx-runtime"),c=require("react");class Ye{listeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){const r=this.listeners.get(e);r&&(r.delete(t),r.size===0&&this.listeners.delete(e))}emit(e){const t=this.listeners.get(e.type);t&&t.forEach(r=>{try{r(e)}catch(n){console.error(`Error in event listener for ${e.type}:`,n)}})}clear(){this.listeners.clear()}listenerCount(e){return this.listeners.get(e)?.size||0}}const ie=new Ye,E={PLAY:"play",PAUSE:"pause",PLAYING:"playing",ENDED:"ended",SEEKING:"seeking",SEEKED:"seeked",WAITING:"waiting",VOLUME_CHANGE:"volumechange",TIME_UPDATE:"timeupdate",DURATION_CHANGE:"durationchange",LOADED_METADATA:"loadedmetadata",LOADED_DATA:"loadeddata",CAN_PLAY:"canplay",CAN_PLAY_THROUGH:"canplaythrough",RATE_CHANGE:"ratechange",LOAD_START:"loadstart",PROGRESS:"progress",SUSPEND:"suspend",ABORT:"abort",STALLED:"stalled",ERROR:"error",EMPTIED:"emptied",RESIZE:"resize"},he={MEDIA_ERR_ABORTED:1,MEDIA_ERR_NETWORK:2,MEDIA_ERR_DECODE:3,MEDIA_ERR_SRC_NOT_SUPPORTED:4};function Ft(a){return Object.values(E).includes(a)}class Ut{videoElement=null;isPlaying=!1;isMuted=!1;volume=1;playbackRate=1;currentTime=0;duration=0;constructor(e){this.videoElement=e,this.setupEventListeners(),this.initializeVideo()}setupEventListeners(){this.videoElement&&(this.videoElement.addEventListener(E.PLAY,()=>{this.isPlaying=!0,this.emitPlayEvent()}),this.videoElement.addEventListener(E.PAUSE,()=>{this.isPlaying=!1,this.emitPauseEvent()}),this.videoElement.addEventListener(E.VOLUME_CHANGE,()=>{this.videoElement&&(this.volume=this.videoElement.volume,this.isMuted=this.videoElement.muted,this.emitVolumeChangeEvent())}),this.videoElement.addEventListener(E.TIME_UPDATE,()=>{this.videoElement&&(this.currentTime=this.videoElement.currentTime)}),this.videoElement.addEventListener(E.LOADED_METADATA,()=>{this.videoElement&&(this.duration=this.videoElement.duration)}),this.videoElement.addEventListener(E.RATE_CHANGE,()=>{this.videoElement&&(this.playbackRate=this.videoElement.playbackRate)}),this.videoElement.addEventListener(E.ERROR,e=>{console.error("Video error:",e),this.videoElement?.error&&console.error("Video error details:",{code:this.videoElement.error.code,message:this.videoElement.error.message,MEDIA_ERR_ABORTED:this.videoElement.error.code===he.MEDIA_ERR_ABORTED,MEDIA_ERR_NETWORK:this.videoElement.error.code===he.MEDIA_ERR_NETWORK,MEDIA_ERR_DECODE:this.videoElement.error.code===he.MEDIA_ERR_DECODE,MEDIA_ERR_SRC_NOT_SUPPORTED:this.videoElement.error.code===he.MEDIA_ERR_SRC_NOT_SUPPORTED})}))}initializeVideo(){this.videoElement&&(this.volume=this.videoElement.volume,this.isMuted=this.videoElement.muted,this.playbackRate=this.videoElement.playbackRate)}emitPlayEvent(){if(!this.videoElement)return;const e={type:"play",data:{currentTime:this.videoElement.currentTime,duration:this.videoElement.duration},timestamp:Date.now()};ie.emit(e)}emitPauseEvent(){if(!this.videoElement)return;const e={type:"pause",data:{currentTime:this.videoElement.currentTime,duration:this.videoElement.duration},timestamp:Date.now()};ie.emit(e)}emitVolumeChangeEvent(){const e={type:"volumechange",data:{volume:this.volume,muted:this.isMuted},timestamp:Date.now()};ie.emit(e)}emitMuteEvent(){const e={type:"mute",data:{muted:this.isMuted,volume:this.volume},timestamp:Date.now()};ie.emit(e)}async play(){if(!this.videoElement)throw new Error("Video element not found");try{await this.videoElement.play()}catch(e){throw console.error("Play failed:",e),e}}pause(){this.videoElement&&this.videoElement.pause()}toggleMute(){this.videoElement&&(this.videoElement.muted=!this.videoElement.muted,this.isMuted=this.videoElement.muted,this.emitMuteEvent())}setVolume(e){this.videoElement&&(this.videoElement.volume=Math.max(0,Math.min(1,e)))}seekTo(e){this.videoElement&&(this.videoElement.currentTime=Math.max(0,Math.min(this.duration,e)))}setPlaybackRate(e){this.videoElement&&(this.videoElement.playbackRate=Math.max(.25,Math.min(4,e)),this.playbackRate=this.videoElement.playbackRate)}setSource(e){this.videoElement&&(this.videoElement.src=e)}setPoster(e){this.videoElement&&(this.videoElement.poster=e)}setDimensions(e,t){this.videoElement&&(this.videoElement.width=typeof e=="number"?e:parseInt(e),this.videoElement.height=typeof t=="number"?t:parseInt(t))}getState(){return{isPlaying:this.isPlaying,isMuted:this.isMuted,volume:this.volume,playbackRate:this.playbackRate,currentTime:this.currentTime,duration:this.duration,src:this.videoElement?.src||"",poster:this.videoElement?.poster||""}}getVideoElement(){return this.videoElement}destroy(){this.videoElement&&(this.videoElement.removeEventListener("play",()=>{}),this.videoElement.removeEventListener("pause",()=>{}),this.videoElement.removeEventListener("volumechange",()=>{}),this.videoElement.removeEventListener("timeupdate",()=>{}),this.videoElement.removeEventListener("loadedmetadata",()=>{}),this.videoElement.removeEventListener("error",()=>{})),this.videoElement=null}}class Ot{config;defaultConfig;constructor(e){this.defaultConfig=this.getDefaultConfig(),this.config=this.mergeConfig(e),this.validateConfig(this.config)}getDefaultConfig(){return{container:"",src:"",width:800,height:450,autoplay:!1,muted:!1,controls:!1,poster:"",className:""}}mergeConfig(e){return{...this.defaultConfig,...e}}validateConfig(e){if(!e.container)throw new Error("Container is required");if(!e.src)throw new Error("Source is required");const t=typeof e.width=="number"?e.width:parseInt(e.width||"800"),r=typeof e.height=="number"?e.height:parseInt(e.height||"450");if(e.width&&(t<100||t>4e3))throw new Error("Width must be between 100 and 4000");if(e.height&&(r<100||r>4e3))throw new Error("Height must be between 100 and 4000")}updateConfig(e){const t={...this.config,...e};this.validateConfig(t),this.config=t}getConfig(){return{...this.config}}get(e){return this.config[e]}set(e,t){const r={[e]:t};this.updateConfig(r)}getContainer(){return typeof this.config.container=="string"?document.querySelector(this.config.container):this.config.container}getDimensions(){return{width:typeof this.config.width=="number"?this.config.width:parseInt(this.config.width||"800"),height:typeof this.config.height=="number"?this.config.height:parseInt(this.config.height||"450")}}reset(){this.config={...this.defaultConfig}}export(){return JSON.stringify(this.config,null,2)}import(e){try{const t=JSON.parse(e);this.validateConfig(t),this.config=t}catch{throw new Error("Invalid configuration format")}}listeners=[];onChange(e){this.listeners.push(e)}offChange(e){const t=this.listeners.indexOf(e);t>-1&&this.listeners.splice(t,1)}notifyChange(){this.listeners.forEach(e=>{try{e(this.config)}catch(t){console.error("Config change listener error:",t)}})}updateConfigAndNotify(e){this.updateConfig(e),this.notifyChange()}}class Wt{state;listeners=[];history=[];maxHistorySize=50;constructor(e){this.state=this.getInitialState(e)}getInitialState(e){return{...{isPlaying:!1,isMuted:!1,volume:1,currentTime:0,duration:0,playbackRate:1,isBuffering:!1,isSeeking:!1},...e}}updateState(e){const t={...this.state};this.state={...this.state,...e},this.addToHistory(t),this.notifyListeners()}getState(){return{...this.state}}get(e){return this.state[e]}set(e,t){this.updateState({[e]:t})}subscribe(e){this.listeners.push(e)}unsubscribe(e){const t=this.listeners.indexOf(e);t>-1&&this.listeners.splice(t,1)}notifyListeners(){this.listeners.forEach(e=>{try{e(this.state)}catch(t){console.error("State listener error:",t)}})}addToHistory(e){this.history.push(e),this.history.length>this.maxHistorySize&&this.history.shift()}undo(){if(this.history.length===0)return!1;const e=this.history.pop();return e?(this.state=e,this.notifyListeners(),!0):!1}reset(){this.state=this.getInitialState(),this.history=[],this.notifyListeners()}setState(e){const t={...this.state};this.state={...e},this.addToHistory(t),this.notifyListeners()}clearHistory(){this.history=[]}getHistory(){return[...this.history]}isInState(e){return e(this.state)}subscribeToChanges(e,t){let r={...this.state};const n=s=>{const o={};let l=!1;e.forEach(d=>{r[d]!==s[d]&&(o[d]=s[d],l=!0)}),l&&t(o),r={...s}};this.subscribe(n)}createSnapshot(){return{...this.state}}restoreFromSnapshot(e){this.setState(e)}getStats(){return{totalListeners:this.listeners.length,historySize:this.history.length,maxHistorySize:this.maxHistorySize,lastUpdate:new Date}}}class Ge{listeners=new Map;onceListeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}once(e,t){this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t)}off(e,t){const r=this.listeners.get(e);r&&(r.delete(t),r.size===0&&this.listeners.delete(e));const n=this.onceListeners.get(e);n&&(n.delete(t),n.size===0&&this.onceListeners.delete(e))}emit(e,t){const r=this.listeners.get(e);r&&r.forEach(s=>{try{s(t)}catch(o){console.error(`[Playron] Error in event listener for "${e}":`,o)}});const n=this.onceListeners.get(e);n&&(n.forEach(s=>{try{s(t)}catch(o){console.error(`[Playron] Error in once listener for "${e}":`,o)}}),this.onceListeners.delete(e))}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){const t=this.listeners.get(e)?.size||0,r=this.onceListeners.get(e)?.size||0;return t+r}eventNames(){const e=new Set;return this.listeners.forEach((t,r)=>e.add(r)),this.onceListeners.forEach((t,r)=>e.add(r)),Array.from(e)}}class Xe{async detectStream(e){const t=this.detectProtocol(e);try{if(t==="hls")return await this.detectHLS(e);if(t==="dash")return await this.detectDASH(e);if(t==="progressive")return this.detectProgressive(e)}catch(r){console.warn("[StreamDetector] Failed to detect stream type:",r)}return{type:"unknown",protocol:"unknown",isDynamic:!1,hasDVR:!1,isEngineSupported:this.preCheckCapability("unknown")}}preCheckCapability(e){if(typeof MediaSource>"u")return!1;const t=MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E"')||MediaSource.isTypeSupported('video/mp4; codecs="avc1.4d401e"')||MediaSource.isTypeSupported('video/mp4; codecs="avc1.64001F"'),r=MediaSource.isTypeSupported('video/mp4; codecs="hev1.1.6.L93.B0"')||MediaSource.isTypeSupported('video/mp4; codecs="hvc1.1.6.L93.B0"'),n=MediaSource.isTypeSupported('video/webm; codecs="vp9"')||MediaSource.isTypeSupported('video/mp4; codecs="vp09.00.10.08"'),s=t||r||n,o=/Safari/.test(navigator.userAgent)&&/Apple Computer/.test(navigator.vendor);return e==="hls"&&o?!0:s}detectProtocol(e){const t=e.toLowerCase();return t.includes(".m3u8")||t.includes(".m3u")?"hls":t.includes(".mpd")?"dash":t.match(/\.(mp4|webm|ogg)$/)?"progressive":"unknown"}async detectHLS(e){const t=await this.fetchManifest(e);if(t.includes("#EXT-X-ENDLIST")||t.includes("#EXT-X-PLAYLIST-TYPE:VOD"))return{type:"vod",protocol:"hls",isDynamic:!1,hasDVR:!1,isEngineSupported:this.preCheckCapability("hls")};const n=t.includes("#EXT-X-MEDIA-SEQUENCE"),s=t.includes("#EXT-X-ENDLIST"),o=t.includes("#EXT-X-PLAYLIST-TYPE:EVENT"),l=this.extractTargetDuration(t),d=this.extractMediaSequence(t);return n&&!s?{type:"live",protocol:"hls",isDynamic:!0,hasDVR:o,targetDuration:l,mediaSequence:d,isEngineSupported:this.preCheckCapability("hls")}:{type:"vod",protocol:"hls",isDynamic:!1,hasDVR:!1,isEngineSupported:this.preCheckCapability("hls")}}async detectDASH(e){const t=await this.fetchManifest(e),s=t.match(/<MPD[^>]*type="(static|dynamic)"/)?.[1]==="dynamic",o=t.includes("timeShiftBufferDepth");return{type:s?"live":"vod",protocol:"dash",isDynamic:s,hasDVR:o,isEngineSupported:this.preCheckCapability("dash")}}detectProgressive(e){return{type:"vod",protocol:"progressive",isDynamic:!1,hasDVR:!1,isEngineSupported:!0}}async fetchManifest(e){const t=await fetch(e,{method:"GET",headers:{Accept:"*/*"}});if(!t.ok)throw new Error(`Failed to fetch manifest: ${t.status}`);return await t.text()}extractTargetDuration(e){const t=e.match(/#EXT-X-TARGETDURATION:(\d+)/);return t?parseInt(t[1],10):void 0}extractMediaSequence(e){const t=e.match(/#EXT-X-MEDIA-SEQUENCE:(\d+)/);return t?parseInt(t[1],10):void 0}quickDetect(e){const t=this.detectProtocol(e);return t==="progressive"?{type:"vod",protocol:"progressive",isEngineSupported:!0}:{type:"unknown",protocol:t,isEngineSupported:this.preCheckCapability(t)}}}const Qe=new Xe;class Ze{video;events;options;timer=null;lastTime=-1;stallDuration=0;attempts=0;isRunning=!1;constructor(e,t,r={}){this.video=e,this.events=t,this.options={pollInterval:r.pollInterval??500,stallThreshold:r.stallThreshold??3,onQualityDowngrade:r.onQualityDowngrade}}start(){this.isRunning||(this.isRunning=!0,this.reset(),this.timer=setInterval(()=>this.tick(),this.options.pollInterval))}stop(){this.timer!==null&&(clearInterval(this.timer),this.timer=null),this.isRunning=!1,this.reset()}destroy(){this.stop()}reset(){this.lastTime=-1,this.stallDuration=0,this.attempts=0}tick(){const e=this.video;if(e.paused||e.ended||e.seeking||e.readyState<2){this.stallDuration=0,this.lastTime=e.currentTime;return}const t=e.currentTime;if(this.lastTime<0){this.lastTime=t;return}const r=t-this.lastTime;if(this.lastTime=t,r>.05){if(this.stallDuration>0){const o=this.attempts>=3?"quality":"seek";this.events.emit("stallrecovered",{duration:Math.round(this.stallDuration),method:o})}this.stallDuration=0,this.attempts=0;return}this.stallDuration+=this.options.pollInterval/1e3;const{stallThreshold:n}=this.options,s=Math.floor(this.stallDuration/n);s>this.attempts&&(this.attempts=s,this.recover())}recover(){const e=this.video;switch(this.events.emit("stall",{duration:Math.round(this.stallDuration),attempt:this.attempts}),this.attempts){case 1:e.currentTime=Math.min(e.currentTime+.5,e.duration||1/0);break;case 2:e.currentTime=Math.min(e.currentTime+2,e.duration||1/0);break;case 3:this.options.onQualityDowngrade&&this.options.onQualityDowngrade(),e.currentTime=Math.min(e.currentTime+2,e.duration||1/0);break;default:this.events.emit("error",{code:"STALL_UNRECOVERABLE",message:`Playback stalled for ${Math.round(this.stallDuration)}s and could not be recovered.`}),this.stop();break}}}const Je=[{contentType:'video/mp4; codecs="avc1.42E01E"'}],Ht=[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],zt=[{initDataTypes:["cenc"],videoCapabilities:Je,audioCapabilities:Ht}];async function Le(a){try{return await navigator.requestMediaKeySystemAccess(a,zt),!0}catch{return!1}}async function et(){const[a,e,t]=await Promise.all([Le("com.widevine.alpha"),Le("com.microsoft.playready"),Le("org.w3.clearkey")]),r=await(async()=>{try{return await navigator.requestMediaKeySystemAccess("com.apple.fps",[{initDataTypes:["skd"],videoCapabilities:Je}]),!0}catch{return!1}})();let n=null;return a?n="widevine":r?n="fairplay":e?n="playready":t&&(n="clearkey"),{widevine:a,fairplay:r,playready:e,clearkey:t,preferredSystem:n}}const qt=3e4,Kt=2,Yt=1e3,Ie=new Map;async function tt(a,e,t,r,n){let s=new Error("License request failed");for(let o=0;o<=r;o++){if(o>0){const u=n*Math.pow(2,o-1);await new Promise(h=>setTimeout(h,u))}const l=new AbortController,d=setTimeout(()=>l.abort(),t);try{const u=await fetch(a,{...e,signal:l.signal});if(clearTimeout(d),!u.ok)throw new Error(`HTTP ${u.status}: ${u.statusText}`);return await u.arrayBuffer()}catch(u){clearTimeout(d),u instanceof Error&&u.name==="AbortError"?s=new Error(`Request timed out after ${t}ms (attempt ${o+1}/${r+1})`):s=u instanceof Error?u:new Error(String(u))}}throw s}async function Gt(a,e={}){const t=Ie.get(a);if(t)return console.debug("[LicenseManager] Using cached FairPlay certificate:",a),t;console.debug("[LicenseManager] Fetching FairPlay certificate:",a);const r=await tt(a,{method:"GET",headers:e},15e3,1,500);return Ie.set(a,r),r}function Xt(){Ie.clear()}async function Qt(a,e,t={},r=!1,n={}){const s=n.timeout??qt,o=n.maxRetries??Kt,l=n.retryDelay??Yt;let d=e;n.prepareLicenseRequest&&(d=await n.prepareLicenseRequest(e));const u={method:"POST",body:d,headers:{"Content-Type":"application/octet-stream",...t},credentials:r?"include":"omit"};console.debug("[LicenseManager] Acquiring license from:",a);let h=await tt(a,u,s,o,l);return n.parseLicenseResponse&&(h=await n.parseLicenseResponse(h)),h}const Be="com.apple.fps",Zt=[{initDataTypes:["skd"],videoCapabilities:[{contentType:'video/mp4; codecs="avc1.42E01E"'},{contentType:'video/mp4; codecs="hvc1.1.6.L93.B0"'}],audioCapabilities:[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],sessionTypes:["temporary"],persistentState:"optional",distinctiveIdentifier:"optional"}];class Jt{keySystem=Be;config;mediaKeys=null;videoElement=null;sessions=new Set;destroyed=!1;boundOnEncrypted;constructor(e){this.config=e,this.boundOnEncrypted=t=>{this.handleEncrypted(t)}}async initialize(e){if(this.destroyed)return;this.videoElement=e;let t;try{t=await navigator.requestMediaKeySystemAccess(Be,Zt)}catch{throw new Error("FairPlay Streaming is not supported in this browser. Safari on macOS or iOS is required.")}this.mediaKeys=await t.createMediaKeys();let r;try{r=await Gt(this.config.certificateUrl,this.config.headers)}catch(n){throw new Error(`FairPlay: Failed to fetch server certificate from ${this.config.certificateUrl}: `+(n instanceof Error?n.message:String(n)))}try{await this.mediaKeys.setServerCertificate(r)||console.debug("[FairPlayAdapter] setServerCertificate returned false (certificate may not be required)")}catch(n){throw new Error(`FairPlay: setServerCertificate failed: ${n instanceof Error?n.message:String(n)}`)}await e.setMediaKeys(this.mediaKeys),e.addEventListener("encrypted",this.boundOnEncrypted),console.debug("[FairPlayAdapter] Initialized — waiting for encrypted event"),this.config.onReady?.()}async handleEncrypted(e){if(!this.mediaKeys||this.destroyed)return;console.debug("[FairPlayAdapter] Received encrypted event, initDataType:",e.initDataType);const t=this.mediaKeys.createSession("temporary");if(this.sessions.add(t),t.addEventListener("message",r=>{this.handleKeyMessage(t,r)}),t.addEventListener("keystatuseschange",()=>{this.handleKeyStatusChange(t)}),!e.initData){this.sessions.delete(t),console.warn("[FairPlayAdapter] Encrypted event has no initData — skipping session");return}try{await t.generateRequest(e.initDataType,e.initData)}catch(r){this.sessions.delete(t);const n=`FairPlay: generateRequest failed: ${r instanceof Error?r.message:String(r)}`;console.error("[FairPlayAdapter]",n),this.config.onError?.("FAIRPLAY_GENERATE_REQUEST_FAILED",n,!0)}}async handleKeyMessage(e,t){if(this.destroyed)return;const r=t.message;console.debug("[FairPlayAdapter] Received key message, acquiring license...");try{const n=await Qt(this.config.licenseUrl,r,this.config.headers??{},this.config.withCredentials??!1,this.config.licenseAcquisitionConfig??{});await e.update(n),console.debug("[FairPlayAdapter] License applied successfully")}catch(n){const s=`FairPlay: License acquisition failed: ${n instanceof Error?n.message:String(n)}`;console.error("[FairPlayAdapter]",s),this.config.onError?.("FAIRPLAY_LICENSE_FAILED",s,!0)}}handleKeyStatusChange(e){e.keyStatuses.forEach(t=>{switch(t){case"expired":this.config.onError?.("FAIRPLAY_KEY_EXPIRED","FairPlay: Content key has expired. Please reload the player.",!0);break;case"output-restricted":this.config.onError?.("FAIRPLAY_OUTPUT_RESTRICTED","FairPlay: Output restricted — HDCP connection required.",!1);break;case"internal-error":this.config.onError?.("FAIRPLAY_INTERNAL_ERROR","FairPlay: Internal key error.",!0);break;case"usable":console.debug("[FairPlayAdapter] Key status: usable");break;default:console.debug("[FairPlayAdapter] Key status:",t)}})}destroy(){this.destroyed||(this.destroyed=!0,this.videoElement&&this.videoElement.removeEventListener("encrypted",this.boundOnEncrypted),this.sessions.forEach(e=>{e.close().catch(()=>{})}),this.sessions.clear(),this.videoElement&&(this.videoElement.setMediaKeys(null).catch(()=>{}),this.videoElement=null),this.mediaKeys=null,console.debug("[FairPlayAdapter] Destroyed"))}}const Ne="com.widevine.alpha",er=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4; codecs="avc1.42E01E"',robustness:"SW_SECURE_CRYPTO"},{contentType:'video/mp4; codecs="avc1.42E01E"'}],audioCapabilities:[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],sessionTypes:["temporary"]}];class tr{keySystem=Ne;config;destroyed=!1;constructor(e){this.config=e}async initialize(e){if(!this.destroyed){try{await navigator.requestMediaKeySystemAccess(Ne,er)}catch{throw new Error("Widevine is not supported in this browser. Chrome, Firefox, or Edge (Chromium) is required for Widevine DRM.")}console.debug("[WidevineAdapter] Widevine key system confirmed — delegating EME to streaming engine"),this.config.onReady?.()}}destroy(){this.destroyed=!0,console.debug("[WidevineAdapter] Destroyed")}}const je="com.microsoft.playready",$e="com.microsoft.playready.hardware",rr=[{initDataTypes:["cenc"],videoCapabilities:[{contentType:'video/mp4; codecs="avc1.42E01E"'}],audioCapabilities:[{contentType:'audio/mp4; codecs="mp4a.40.2"'}],sessionTypes:["temporary"]}];class ir{keySystem;config;destroyed=!1;constructor(e){this.config=e,this.keySystem=e.preferHardware?$e:je}async initialize(e){if(this.destroyed)return;const t=this.config.preferHardware?[$e,je]:[je];let r=!1;for(const n of t)try{await navigator.requestMediaKeySystemAccess(n,rr),r=!0,console.debug(`[PlayReadyAdapter] Key system confirmed: ${n}`);break}catch{}if(!r)throw new Error("PlayReady is not supported in this browser. Microsoft Edge or Internet Explorer is required for PlayReady DRM.");console.debug("[PlayReadyAdapter] PlayReady key system confirmed — delegating EME to dashjs"),this.config.onReady?.()}destroy(){this.destroyed=!0,console.debug("[PlayReadyAdapter] Destroyed")}}const nr={widevine:"com.widevine.alpha",fairplay:"com.apple.fps",playready:"com.microsoft.playready"};class sr{adapter=null;selectedKeySystem=null;emitter;destroyed=!1;constructor(e){this.emitter=e}async initialize(e,t){if(this.destroyed||!t?.enabled)return null;const r=await et().catch(()=>({widevine:!1,fairplay:!1,playready:!1,clearkey:!1,preferredSystem:null})),n=t.preferredSystem;if(n&&(n==="fairplay"&&r.fairplay&&t.fairplay&&(this.selectedKeySystem="fairplay"),n==="widevine"&&r.widevine&&t.widevine&&(this.selectedKeySystem="widevine"),n==="playready"&&r.playready&&t.playready&&(this.selectedKeySystem="playready")),this.selectedKeySystem||(r.fairplay&&t.fairplay?this.selectedKeySystem="fairplay":r.widevine&&t.widevine?this.selectedKeySystem="widevine":r.playready&&t.playready&&(this.selectedKeySystem="playready")),!this.selectedKeySystem)return console.warn("[DrmManager] No supported DRM key system found for the provided configuration. Browser capabilities:",r),null;const s=nr[this.selectedKeySystem];if(console.debug("[DrmManager] Selected key system:",s),this.emitter.emit("drm:keysystem",{keySystem:s}),this.adapter=this.createAdapter(t),!this.adapter)return null;try{await this.adapter.initialize(e)}catch(o){const l=o instanceof Error?o.message:String(o);return console.error("[DrmManager] Adapter initialization failed:",l),this.emitter.emit("error",{code:"DRM_INIT_FAILED",message:l,details:o}),this.selectedKeySystem=null,null}return this.emitter.emit("drm:ready",{keySystem:s}),this.selectedKeySystem}getSelectedKeySystem(){return this.selectedKeySystem}destroy(){this.destroyed||(this.destroyed=!0,this.adapter?.destroy(),this.adapter=null,this.selectedKeySystem=null,Xt(),console.debug("[DrmManager] Destroyed"))}createAdapter(e){const t=(r,n,s=!0)=>{this.emitter.emit("error",{code:r,message:n,details:{fatal:s}})};switch(this.selectedKeySystem){case"fairplay":{const r=e.fairplay;return new Jt({licenseUrl:r.licenseUrl,certificateUrl:r.certificateUrl,headers:r.headers,withCredentials:r.withCredentials,licenseAcquisitionConfig:r.licenseAcquisitionConfig,onError:t})}case"widevine":{const r=e.widevine;return new tr({licenseUrl:r.licenseUrl,headers:r.headers,withCredentials:r.withCredentials,licenseAcquisitionConfig:r.licenseAcquisitionConfig,onError:t})}case"playready":{const r=e.playready;return new ir({licenseUrl:r.licenseUrl,headers:r.headers,withCredentials:r.withCredentials,licenseAcquisitionConfig:r.licenseAcquisitionConfig,onError:t})}default:return null}}}const or="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1",Fe="playron-cast-sdk";class rt{appId;onChange;isAvailable=!1;sessionActive=!1;sdkLoaded=!1;castStateHandler=null;constructor(e){this.appId=e.appId??"CC1AD845",this.onChange=e.onChange}setup(){if(this.sdkLoaded)return;this.sdkLoaded=!0;const e=window.__onGCastApiAvailable;if(window.__onGCastApiAvailable=t=>{e?.(t),t?this.initContext():(console.warn("[ChromecastManager] Cast API not available (no Cast devices found or extension missing)"),this.emitState())},!document.getElementById(Fe)){const t=document.createElement("script");t.id=Fe,t.src=or,t.async=!0,document.head.appendChild(t),console.log("[ChromecastManager] Cast SDK script injected")}}async requestSession(){const e=this.getContext();if(!e){console.warn("[ChromecastManager] Cast context not ready — call setup() first");return}try{await e.requestSession()}catch(t){(t instanceof Error?t.message:String(t)).toLowerCase().includes("cancel")||console.error("[ChromecastManager] requestSession error:",t)}}endSession(e=!0){this.getContext()?.endCurrentSession(e)}async loadMedia(e,t="video/mp4",r=0,n=!1){const s=this.getContext()?.getCurrentSession();if(!s){console.warn("[ChromecastManager] No active Cast session — call requestSession() first");return}const o=window.chrome?.cast;if(o)try{const l=new o.media.MediaInfo(e,t);l.streamType=n?o.media.StreamType.LIVE:o.media.StreamType.BUFFERED,l.metadata=null;const d=new o.media.LoadRequest(l);d.currentTime=r,d.autoplay=!0,await s.loadMedia(d),console.log(`[ChromecastManager] Media loaded on receiver: ${e} (t=${r}s)`)}catch(l){console.error("[ChromecastManager] loadMedia error:",l)}}syncTime(e){const r=this.getContext()?.getCurrentSession()?.getMediaSession();r&&r.seek({currentTime:e,type:"SEEK"})}async syncVolume(e,t){const r=this.getContext()?.getCurrentSession();if(r)try{await r.setVolume(e),await r.setMute(t)}catch{}}isCastAvailable(){return this.isAvailable}isCastActive(){return this.sessionActive}getState(){const e=this.getContext()?.getCastState()??"";let t="unavailable";const r=window.cast?.framework;return r&&(e===r.CastState.NO_DEVICES_AVAILABLE?t="unavailable":e===r.CastState.NOT_CONNECTED?t="not_connected":e===r.CastState.CONNECTING?t="connecting":e===r.CastState.CONNECTED&&(t="connected")),{isAvailable:this.isAvailable,isActive:this.sessionActive,state:t}}destroy(){const e=this.getContext();if(e&&this.castStateHandler){const t=window.cast?.framework?.CastContextEventType;t&&(e.removeEventListener(t.CAST_STATE_CHANGED,this.castStateHandler),e.removeEventListener(t.SESSION_STATE_CHANGED,this.castStateHandler)),this.castStateHandler=null}console.log("[ChromecastManager] Destroyed")}getContext(){return window.cast?.framework?.CastContext?.getInstance()??null}initContext(){const e=this.getContext();if(!e)return;try{e.setOptions({receiverApplicationId:this.appId})}catch(r){console.error("[ChromecastManager] setOptions error:",r);return}this.castStateHandler=()=>{this.syncState()};const t=window.cast?.framework?.CastContextEventType;t&&(e.addEventListener(t.CAST_STATE_CHANGED,this.castStateHandler),e.addEventListener(t.SESSION_STATE_CHANGED,this.castStateHandler)),this.syncState(),console.log(`[ChromecastManager] Initialized with appId=${this.appId}`)}syncState(){const e=this.getContext()?.getCastState()??"",t=window.cast?.framework;if(!t)return;const r=this.sessionActive;this.isAvailable=e!==t.CastState.NO_DEVICES_AVAILABLE,this.sessionActive=e===t.CastState.CONNECTED,r!==this.sessionActive&&console.log(`[ChromecastManager] Session state: ${this.sessionActive?"CONNECTED":"DISCONNECTED"}`),this.emitState()}emitState(){this.onChange(this.getState())}}class ne{videoEngine=null;configManager=null;stateManager=null;videoElement=null;container=null;events;streamType="unknown";streamInfo=null;hlsEngine=null;dashEngine=null;airPlayAvailable=!1;airPlayActive=!1;onAirPlayAvailabilityChanged=null;onAirPlayTargetChanged=null;stallDetector=null;liveLatencyTimer=null;atLiveEdgeTolerance=10;drmConfig=null;drmManager=null;playerConfig=null;castManager=null;static preloadEngines(){Promise.resolve().then(()=>require("./HlsEngine-DUVHcUpc.cjs")),Promise.resolve().then(()=>require("./DashEngine-CWBT5Q9y.cjs"))}constructor(e){this.videoElement=e,this.events=new Ge,this.initialize()}initialize(){if(!this.videoElement)return;this.videoEngine=new Ut(this.videoElement);const e=this.loadPersistedVolume();e!==null&&(this.videoElement.volume=e),this.stateManager=new Wt({isPlaying:!1,isMuted:this.videoElement.muted,volume:this.videoElement.volume,currentTime:0,duration:0,playbackRate:this.videoElement.playbackRate||1}),this.setupStateListeners(),this.setupAirPlay()}setupStateListeners(){!this.stateManager||!this.videoElement||(this.videoElement.addEventListener(E.PLAY,()=>{this.events.emit("play",{timestamp:Date.now()})}),this.videoElement.addEventListener(E.PAUSE,()=>{this.events.emit("pause",{timestamp:Date.now()})}),this.videoElement.addEventListener(E.TIME_UPDATE,()=>{this.events.emit("timeupdate",{currentTime:this.videoElement?.currentTime||0,duration:this.videoElement?.duration||0})}),this.videoElement.addEventListener(E.ENDED,()=>{this.events.emit("ended",{timestamp:Date.now()})}),this.videoElement.addEventListener(E.LOADED_METADATA,()=>{this.events.emit("loadedmetadata",{duration:this.videoElement?.duration||0,videoWidth:this.videoElement?.videoWidth||0,videoHeight:this.videoElement?.videoHeight||0})}),this.videoElement.addEventListener(E.RATE_CHANGE,()=>{const e=this.videoElement?.playbackRate||1;this.stateManager?.set("playbackRate",e),this.events.emit("ratechange",{playbackRate:e})}),this.videoElement.addEventListener(E.SEEKING,()=>{this.stateManager?.set("isSeeking",!0),this.stateManager?.set("isBuffering",!0),this.events.emit("seeking",{targetTime:this.videoElement?.currentTime??0}),this.events.emit("buffering",{isBuffering:!0})}),this.videoElement.addEventListener(E.SEEKED,()=>{this.stateManager?.set("isSeeking",!1),this.events.emit("seeked",{currentTime:this.videoElement?.currentTime??0})}),this.videoElement.addEventListener(E.WAITING,()=>{this.stateManager?.set("isBuffering",!0),this.events.emit("buffering",{isBuffering:!0})}),this.videoElement.addEventListener(E.PLAYING,()=>{this.stateManager?.set("isBuffering",!1),this.stateManager?.set("isSeeking",!1),this.events.emit("buffering",{isBuffering:!1})}),this.videoElement.addEventListener(E.CAN_PLAY,()=>{this.stateManager?.set("isBuffering",!1),this.events.emit("buffering",{isBuffering:!1})}),this.videoElement.addEventListener(E.ERROR,()=>{const e=this.videoElement?.error;if(e){const t=`MEDIA_ERR_${e.code===1?"ABORTED":e.code===2?"NETWORK":e.code===3?"DECODE":e.code===4?"SRC_NOT_SUPPORTED":"UNKNOWN"}`;Promise.resolve().then(()=>require("./ErrorManager-CDf_sFKX.cjs")).then(({errorManager:r})=>{r.dispatchError("Playback Error",t,e.message||"Video playback error",e)}),this.events.emit("error",{code:t,message:e.message||"Video playback error",details:e})}}),this.stateManager.subscribe(e=>{if(this.videoEngine){const t=this.videoEngine.getState();t.isPlaying!==e.isPlaying&&(e.isPlaying?this.videoEngine.play().catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.error("Play failed:",r)}):this.videoEngine.pause()),t.isMuted!==e.isMuted&&this.videoEngine.toggleMute(),t.volume!==e.volume&&this.videoEngine.setVolume(e.volume)}}))}static createWithConfig(e){const t=typeof e.container=="string"?document.querySelector(e.container):e.container;if(!t)throw new Error(`Container not found: ${e.container}`);const r=document.createElement("video");r.id="virtus-video-player",r.src=e.src,r.width=typeof e.width=="number"?e.width:800,r.height=typeof e.height=="number"?e.height:450,r.autoplay=e.autoplay||!1,r.muted=e.muted||!1,r.controls=e.controls||!1,r.className=`playron ${e.className||""}`,e.poster&&(r.poster=e.poster),t.appendChild(r);const n=new ne(r);return n.container=t,n.configManager=new Ot(e),n}setupDrm(e){this.drmConfig=e}setConfig(e){this.playerConfig=e}async play(){if(!this.videoEngine)throw new Error("VideoEngine not initialized");try{await this.videoEngine.play(),this.stateManager?.set("isPlaying",!0)}catch(e){if(e instanceof DOMException&&e.name==="AbortError")return;throw console.error("Play failed:",e),e}}pause(){this.videoEngine&&(this.videoEngine.pause(),this.stateManager?.set("isPlaying",!1))}toggleMute(){if(!this.videoEngine)return;this.videoEngine.toggleMute();const e=this.videoEngine.getState();this.stateManager?.set("isMuted",e.isMuted)}setVolume(e){this.videoEngine&&(this.videoEngine.setVolume(e),this.stateManager?.set("volume",e),this.persistVolume(e))}getBufferedRanges(){if(!this.videoElement)return[];const e=[],{buffered:t}=this.videoElement;for(let r=0;r<t.length;r++)e.push({start:t.start(r),end:t.end(r)});return e}getPlayerStats(){const e=this.hlsEngine?.getStats()??{bandwidth:0,bufferHealth:0,droppedFrames:0,totalFrames:0,codec:"",resolution:"",segmentUrl:this.videoElement?.currentSrc??""};if(!this.hlsEngine&&this.videoElement){const t=this.videoElement,r=t.currentTime;for(let s=0;s<t.buffered.length;s++)if(t.buffered.start(s)<=r&&t.buffered.end(s)>=r){e.bufferHealth=parseFloat((t.buffered.end(s)-r).toFixed(2));break}const n=t.getVideoPlaybackQuality?.();e.droppedFrames=n?.droppedVideoFrames??0,e.totalFrames=n?.totalVideoFrames??0,t.videoWidth&&t.videoHeight&&!e.resolution&&(e.resolution=`${t.videoWidth}×${t.videoHeight}`),e.segmentUrl=t.currentSrc??""}return{...e,streamType:this.streamType}}persistVolume(e){try{localStorage.setItem("playron:volume",String(e))}catch{}}loadPersistedVolume(){try{const e=localStorage.getItem("playron:volume");if(e===null)return null;const t=parseFloat(e);return isFinite(t)?Math.max(0,Math.min(1,t)):null}catch{return null}}seekTo(e){this.videoEngine&&this.videoEngine.seekTo(e)}setPlaybackRate(e){this.videoEngine&&(this.videoEngine.setPlaybackRate(e),this.stateManager?.set("playbackRate",e))}async setSource(e){if(!this.videoEngine||!this.videoElement)return;console.log("[PlayerCore] Setting source:",e),await this.destroyStreamingEngines(),this.drmConfig?.enabled&&this.videoElement&&(this.drmManager=new sr(this.events),await this.drmManager.initialize(this.videoElement,this.drmConfig));const t=Qe.quickDetect(e);if(console.log("[PlayerCore] Detected protocol:",t.protocol),t.protocol==="hls"){const{HlsEngine:r}=await Promise.resolve().then(()=>require("./HlsEngine-DUVHcUpc.cjs"));this.hlsEngine=new r(this.videoElement,{autoStart:!0,maxBufferAhead:30,maxBufferBehind:10,...this.drmConfig&&{drmConfig:this.drmConfig},...this.playerConfig?.player?.withCredentials&&{withCredentials:!0}}),this.hlsEngine.on("quality-changed",({quality:n})=>{this.events.emit("qualitychange",{from:"",to:n.label})}),this.hlsEngine.on("error",({error:n})=>{Promise.resolve().then(()=>require("./ErrorManager-CDf_sFKX.cjs")).then(({errorManager:s})=>{const o=String(n?.code??""),l=o.includes("NETWORK")||o.includes("CORS")?"Network Error":o.includes("PARSE")?"Manifest Parse Error":o.includes("FRAG")?"Frag Load Error":"Playback Error";s.dispatchError(l,String(n?.code??"HLS_ERROR"),String(n?.message??"HLS streaming error"),n?.details)}),this.events.emit("error",{code:String(n?.code??"HLS_ERROR"),message:String(n?.message??"HLS streaming error"),details:n})}),this.hlsEngine.on("state-change",({state:n})=>{n==="buffering"?this.stateManager?.set("isBuffering",!0):(n==="playing"||n==="paused")&&this.stateManager?.set("isBuffering",!1)});try{await this.hlsEngine.load(e),this.container&&(this.hlsEngine.attachCaptions(this.container),this.hlsEngine.attachSubtitles(this.container));const n=this.hlsEngine.isLiveStream();this.streamType=n?"live":"vod",this.streamInfo={type:this.streamType,protocol:"hls",isDynamic:n,hasDVR:n,isEngineSupported:!0},n&&this.startLiveLatencyTracking(this.atLiveEdgeTolerance),this.events.emit("tracksready",{hasQualities:this.hlsEngine.getQualities().length>1,hasAudioTracks:this.hlsEngine.getAudioTracks().length>1,hasSubtitleTracks:this.hlsEngine.getSubtitleTracks().length>0})}catch(n){console.error("[PlayerCore] HLS load failed:",n),this.streamType="unknown",this.streamInfo=null,await this.fallbackToNative(e,"hls")}}else if(t.protocol==="dash"){const{DashEngine:r}=await Promise.resolve().then(()=>require("./DashEngine-CWBT5Q9y.cjs"));this.dashEngine=new r(this.videoElement,{autoStart:!0,maxBufferAhead:30,lowLatency:!1,...this.drmConfig&&{drmConfig:this.drmConfig}}),this.dashEngine.on("quality-changed",({quality:n})=>{this.events.emit("qualitychange",{from:"",to:n.label})}),this.dashEngine.on("error",({error:n})=>{Promise.resolve().then(()=>require("./ErrorManager-CDf_sFKX.cjs")).then(({errorManager:s})=>{const o=String(n?.code??""),l=o.includes("NETWORK")||o.includes("27")?"Network Error":o.includes("PARSE")||o.includes("31")?"Manifest Parse Error":"Playback Error";s.dispatchError(l,String(n?.code??"DASH_ERROR"),String(n?.message??"DASH streaming error"),n?.details)}),this.events.emit("error",{code:String(n?.code??"DASH_ERROR"),message:String(n?.message??"DASH streaming error"),details:n})}),this.dashEngine.on("state-change",({state:n})=>{n==="buffering"?this.stateManager?.set("isBuffering",!0):(n==="playing"||n==="paused")&&this.stateManager?.set("isBuffering",!1)});try{await this.dashEngine.load(e),this.container&&(this.dashEngine.attachCaptions(this.container),this.dashEngine.attachSubtitles(this.container));const n=this.dashEngine.isLiveStream();this.streamType=n?"live":"vod",this.streamInfo={type:this.streamType,protocol:"dash",isDynamic:n,hasDVR:n,isEngineSupported:!0},n&&this.startLiveLatencyTracking(this.atLiveEdgeTolerance),this.events.emit("tracksready",{hasQualities:this.dashEngine.getQualities().length>1,hasAudioTracks:this.dashEngine.getAudioTracks().length>1,hasSubtitleTracks:this.dashEngine.getSubtitleTracks().length>0})}catch(n){console.error("[PlayerCore] DASH load failed:",n),this.streamType="unknown",this.streamInfo=null,await this.fallbackToNative(e,"dash")}}else this.streamType="vod",this.streamInfo={type:"vod",protocol:"progressive",isDynamic:!1,hasDVR:!1,isEngineSupported:!0},this.videoEngine.setSource(e);if(this.events.emit("streamTypeDetected",{type:this.streamType,info:this.streamInfo}),window.dispatchEvent(new CustomEvent("virtus:streamTypeDetected",{detail:{type:this.streamType,info:this.streamInfo}})),this.castManager?.isCastActive()){const r=this.streamInfo?.isDynamic??!1,n=t.protocol==="hls"?"application/x-mpegURL":t.protocol==="dash"?"application/dash+xml":"video/mp4";this.castManager.loadMedia(e,n,0,r)}this.startStallDetector(),this.videoElement?.autoplay&&this.videoElement.play().catch(r=>{r instanceof DOMException&&(r.name==="AbortError"||r.name==="NotAllowedError")||console.warn("[PlayerCore] Autoplay failed:",r)})}async destroyStreamingEngines(){this.stopLiveLatencyTracking(),this.hlsEngine&&(await this.hlsEngine.destroy(),this.hlsEngine=null),this.dashEngine&&(await this.dashEngine.destroy(),this.dashEngine=null),this.drmManager&&(this.drmManager.destroy(),this.drmManager=null)}async fallbackToNative(e,t){if(!(!this.videoElement||!this.videoEngine))try{console.log(`[PlayerCore] Attempting native fallback for ${t} stream`),this.videoEngine.setSource(e),this.videoElement?.autoplay&&this.videoElement.play().catch(r=>{r instanceof DOMException&&(r.name==="AbortError"||r.name)}),this.streamType="vod",this.streamInfo={type:"vod",protocol:"progressive",isDynamic:!1,hasDVR:!1,isEngineSupported:!1}}catch(r){console.error("[PlayerCore] Native fallback failed:",r),this.events.emit("error",{code:"MEDIA_ERR_SRC_NOT_SUPPORTED",message:"Could not play stream natively or via fallback",details:r})}}getStreamType(){return this.streamType}getStreamInfo(){return this.streamInfo}isLive(){return this.streamType==="live"}getLiveEdgeTime(){return this.hlsEngine?.getLiveEdgeTime()??this.dashEngine?.getLiveEdgeTime()??0}getCurrentLatency(){if(!this.isLive())return 0;const e=this.getLiveEdgeTime();return e===0?0:Math.max(0,e-(this.videoElement?.currentTime??0))}isAtLiveEdge(e){return this.isLive()?this.getCurrentLatency()<=(e??this.atLiveEdgeTolerance):!1}seekToLiveEdge(){this.isLive()&&(this.hlsEngine?.seekToLiveEdge(),this.dashEngine?.seekToLiveEdge())}getDVRRange(){return this.hlsEngine?.getDVRRange()??this.dashEngine?.getDVRRange()??null}startLiveLatencyTracking(e){this.stopLiveLatencyTracking(),this.atLiveEdgeTolerance=e,this.liveLatencyTimer=setInterval(()=>{if(!this.isLive())return;const t=this.getCurrentLatency(),r=this.getLiveEdgeTime(),n=t<=this.atLiveEdgeTolerance;this.events.emit("livelatencyupdate",{latency:t,isAtLiveEdge:n,liveEdgeTime:r})},1e3)}stopLiveLatencyTracking(){this.liveLatencyTimer!==null&&(clearInterval(this.liveLatencyTimer),this.liveLatencyTimer=null)}startStallDetector(){this.stallDetector?.destroy(),this.stallDetector=new Ze(this.videoElement,this.events,{pollInterval:500,stallThreshold:3,onQualityDowngrade:()=>{const e=this.getAvailableQualities().filter(t=>t.id!=="auto");if(e.length>1){const t=this.getQuality();if(t&&t.id!=="auto"){const r=e.findIndex(n=>n.id===t.id);r>0&&this.setQuality(e[r-1].id)}}}}),this.stallDetector.start()}setPoster(e){this.videoEngine&&this.videoEngine.setPoster(e)}setDimensions(e,t){this.videoEngine&&this.videoEngine.setDimensions(e,t)}getState(){return this.stateManager?this.stateManager.getState():null}getVideoEngine(){return this.videoEngine}getConfigManager(){return this.configManager}getStateManager(){return this.stateManager}getVideoElement(){return this.videoElement}toggleFullscreen(){this.container&&(document.fullscreenElement?document.exitFullscreen?.():this.container.requestFullscreen?.())}async togglePip(){if(this.videoElement)try{document.pictureInPictureElement?await document.exitPictureInPicture():await this.videoElement.requestPictureInPicture()}catch(e){console.error("PiP error:",e)}}skipBackward(e=15){if(!this.videoElement)return;const t=Math.max(0,this.videoElement.currentTime-e);this.seekTo(t)}skipForward(e=15){if(!this.videoElement)return;const t=Math.min(this.videoElement.duration||0,this.videoElement.currentTime+e);this.seekTo(t)}setLoop(e){this.videoElement&&(this.videoElement.loop=e)}getLoop(){return this.videoElement?.loop||!1}setQuality(e){this.hlsEngine?e==="auto"?this.hlsEngine.enableAutoQuality():this.hlsEngine.setQuality(e):this.dashEngine&&this.dashEngine.setQuality(e)}getQuality(){return this.hlsEngine?.getCurrentQuality()??this.dashEngine?.getCurrentQuality()??null}getAvailableQualities(){return this.hlsEngine?.getQualities()??this.dashEngine?.getQualities()??[]}setAudioTrack(e){this.hlsEngine?.setAudioTrack(e),this.dashEngine?.setAudioTrack(e)}getAudioTrack(){return this.hlsEngine?.getActiveAudioTrackId()??this.dashEngine?.getActiveAudioTrackId()??""}getAvailableAudioTracks(){return this.hlsEngine?.getAudioTracks()??this.dashEngine?.getAudioTracks()??[]}getSubtitleTracks(){return this.hlsEngine?.getSubtitleTracks()??this.dashEngine?.getSubtitleTracks()??[]}async setSubtitleTrack(e){await this.hlsEngine?.setSubtitleTrack(e),await this.dashEngine?.setSubtitleTrack(e)}getActiveSubtitleLanguage(){return this.hlsEngine?.getActiveSubtitleLanguage()??this.dashEngine?.getActiveSubtitleLanguage()??null}setupAirPlay(){!this.videoElement||typeof this.videoElement.webkitShowPlaybackTargetPicker!="function"||(this.onAirPlayAvailabilityChanged=t=>{const r=t;this.airPlayAvailable=r.availability==="available",this.events.emit("airplaychange",{isAvailable:this.airPlayAvailable,isActive:this.airPlayActive})},this.onAirPlayTargetChanged=()=>{this.airPlayActive=!!this.videoElement.webkitCurrentPlaybackTargetIsWireless,this.events.emit("airplaychange",{isAvailable:this.airPlayAvailable,isActive:this.airPlayActive})},this.videoElement.addEventListener("webkitplaybacktargetavailabilitychanged",this.onAirPlayAvailabilityChanged),this.videoElement.addEventListener("webkitcurrentplaybacktargetiswirelesschanged",this.onAirPlayTargetChanged))}showAirPlayPicker(){if(!this.videoElement)return;const e=this.videoElement;typeof e.webkitShowPlaybackTargetPicker=="function"?e.webkitShowPlaybackTargetPicker():console.warn("[PlayerCore] AirPlay not supported in this browser")}isAirPlayAvailable(){return this.airPlayAvailable}isAirPlayActive(){return this.airPlayActive}destroyAirPlay(){this.videoElement&&(this.onAirPlayAvailabilityChanged&&(this.videoElement.removeEventListener("webkitplaybacktargetavailabilitychanged",this.onAirPlayAvailabilityChanged),this.onAirPlayAvailabilityChanged=null),this.onAirPlayTargetChanged&&(this.videoElement.removeEventListener("webkitcurrentplaybacktargetiswirelesschanged",this.onAirPlayTargetChanged),this.onAirPlayTargetChanged=null))}setupChromecast(e){this.castManager||(this.castManager=new rt({appId:e,onChange:t=>{this.events.emit("castchange",t)}}),this.castManager.setup(),console.log("[PlayerCore] Chromecast setup complete"))}async showCastPicker(){if(!this.castManager){console.warn("[PlayerCore] Chromecast not initialised — call setupChromecast() first");return}await this.castManager.requestSession()}stopCasting(){this.castManager?.endSession(!0)}isCastAvailable(){return this.castManager?.isCastAvailable()??!1}isCastActive(){return this.castManager?.isCastActive()??!1}destroyChromecast(){this.castManager?.destroy(),this.castManager=null}toggleTheaterMode(){if(this.container){const e=this.container,t=e.isTheaterMode||!1;e.isTheaterMode=!t,window.dispatchEvent(new CustomEvent("virtus:theatermodechange",{detail:{isTheaterMode:!t},bubbles:!0}))}}isTheaterMode(){return this.container?.isTheaterMode||!1}destroy(){this.stallDetector?.destroy(),this.stallDetector=null,this.destroyAirPlay(),this.destroyChromecast(),this.destroyStreamingEngines(),this.videoEngine&&(this.videoEngine.destroy(),this.videoEngine=null),this.stateManager&&(this.stateManager.reset(),this.stateManager=null),this.configManager&&(this.configManager.reset(),this.configManager=null),this.videoElement=null,this.container=null}}const it=c.createContext(null),nt={isPlaying:!1,isMuted:!1,volume:1,currentTime:0,duration:0,isLive:!1,isAtLiveEdge:!1,liveLatency:0},st=c.createContext(nt),ot=c.createContext(null);function at({children:a,playerInstance:e}){const[t,r]=c.useState(nt);c.useEffect(()=>{if(!e)return;const s=e.getStateManager();if(!s)return;r(s.getState());const o=d=>{r(d)};s.subscribe(o);const l=e.getVideoElement();if(l){const d=()=>{const g=e.isLive();s.updateState({currentTime:l.currentTime,duration:l.duration||0,isLive:g})},u=()=>{s.set("isPlaying",!l.paused)},h=()=>{s.updateState({volume:l.volume,isMuted:l.muted})},p=({latency:g,isAtLiveEdge:m})=>{s.updateState({liveLatency:g,isAtLiveEdge:m,isLive:!0})};return e.events.on("livelatencyupdate",p),l.addEventListener(E.TIME_UPDATE,d),l.addEventListener(E.PLAY,u),l.addEventListener(E.PAUSE,u),l.addEventListener(E.VOLUME_CHANGE,h),l.addEventListener(E.LOADED_METADATA,d),()=>{e.events.off("livelatencyupdate",p),l.removeEventListener(E.TIME_UPDATE,d),l.removeEventListener(E.PLAY,u),l.removeEventListener(E.PAUSE,u),l.removeEventListener(E.VOLUME_CHANGE,h),l.removeEventListener(E.LOADED_METADATA,d),s.unsubscribe(o)}}return()=>{s.unsubscribe(o)}},[e]);const n=c.useMemo(()=>e?{play:async()=>{await e.play()},pause:()=>{e.pause()},togglePlay:async()=>{e.getState()?.isPlaying?e.pause():await e.play()},toggleMute:()=>{e.toggleMute()},setVolume:s=>{e.setVolume(s)},seekTo:s=>{e.seekTo(s)},setPlaybackRate:s=>{e.setPlaybackRate(s)},toggleFullscreen:()=>{e.toggleFullscreen()},togglePip:async()=>{await e.togglePip()},skipBackward:(s=15)=>{e.skipBackward(s)},skipForward:(s=15)=>{e.skipForward(s)},setLoop:s=>{e.setLoop(s)},getLoop:()=>e.getLoop(),setQuality:s=>{e.setQuality(s)},getQuality:()=>e.getQuality(),getAvailableQualities:()=>e.getAvailableQualities(),setAudioTrack:s=>{e.setAudioTrack(s)},getAudioTrack:()=>e.getAudioTrack(),getAvailableAudioTracks:()=>e.getAvailableAudioTracks(),toggleTheaterMode:()=>{e.toggleTheaterMode()},isTheaterMode:()=>e.isTheaterMode(),getPlayer:()=>e,getStreamType:()=>e.getStreamType(),getStreamInfo:()=>e.getStreamInfo(),isLive:()=>e.isLive(),getBufferedRanges:()=>e.getBufferedRanges(),seekToLiveEdge:()=>{e.seekToLiveEdge()},getCurrentLatency:()=>e.getCurrentLatency(),isAtLiveEdge:s=>e.isAtLiveEdge(s),getDVRRange:()=>e.getDVRRange(),getSubtitleTracks:()=>e.getSubtitleTracks(),setSubtitleTrack:async s=>{await e.setSubtitleTrack(s)},getActiveSubtitleLanguage:()=>e.getActiveSubtitleLanguage(),getPlayerStats:()=>e.getPlayerStats()}:null,[e]);return i.jsx(it.Provider,{value:e,children:i.jsx(ot.Provider,{value:n,children:i.jsx(st.Provider,{value:t,children:a})})})}function O(a){const e=c.useContext(st);if(!e)throw new Error("usePlayerState must be used within PlayerProvider");return a?a(e):e}function U(){const a=c.useContext(ot);if(!a)throw new Error("usePlayerMethods must be used within PlayerProvider");return a}function Ue({size:a=40}){return i.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"#fff",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{width:`${a}px`,height:`${a}px`,animation:"spin 1s linear infinite"},children:[i.jsx("path",{d:"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"}),i.jsx("style",{children:`
|
|
2
2
|
@keyframes spin {
|
|
3
3
|
0% { transform: rotate(0deg); }
|
|
4
4
|
100% { transform: rotate(360deg); }
|