diff --git a/backend/generate.go b/backend/generate.go index 0e13f68..3ea6cf0 100644 --- a/backend/generate.go +++ b/backend/generate.go @@ -69,7 +69,7 @@ func assetIDFromVideoPath(videoPath string) string { return strings.TrimSpace(id) } -// Liefert die standardisierten Pfade (thumbs.webp / preview.mp4 / preview-sprite.webp / meta.json) +// Liefert die standardisierten Pfade (preview.webp / preview.mp4 / preview-sprite.webp / meta.json) func assetPathsForID(id string) (assetDir, thumbPath, previewPath, spritePath, metaPath string, err error) { id = strings.TrimSpace(id) if id == "" { @@ -81,7 +81,7 @@ func assetPathsForID(id string) (assetDir, thumbPath, previewPath, spritePath, m return "", "", "", "", "", fmt.Errorf("generated dir: %v", err) } - thumbPath = filepath.Join(assetDir, "thumbs.webp") + thumbPath = filepath.Join(assetDir, "preview.webp") previewPath = filepath.Join(assetDir, "preview.mp4") spritePath = filepath.Join(assetDir, "preview-sprite.webp") diff --git a/backend/main.go b/backend/main.go index 0eaaae3..3aebd2b 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1340,7 +1340,7 @@ func generatedMetaRoot() (string, error) { return resolvePathRelativeToApp(filepath.Join("generated", "meta")) } -// generatedThumbWebPFile gibt den Pfad zu generated//thumbs.webp zurück. +// generatedThumbWebPFile gibt den Pfad zu generated//preview.webp zurück. // assetID darf "HOT " enthalten; wird entfernt und wie überall sonst sanitisiert. func generatedThumbWebPFile(assetID string) (string, error) { assetID = stripHotPrefix(strings.TrimSpace(assetID)) @@ -1360,7 +1360,7 @@ func generatedThumbWebPFile(assetID string) (string, error) { return "", fmt.Errorf("ensureGeneratedDir: %w", err) } - return filepath.Join(dir, "thumbs.webp"), nil + return filepath.Join(dir, "preview.webp"), nil } // Legacy (falls noch alte Assets liegen): diff --git a/backend/meta.go b/backend/meta.go index d262b97..13c91dd 100644 --- a/backend/meta.go +++ b/backend/meta.go @@ -498,7 +498,7 @@ func generatedThumbFile(id string) (string, error) { if err != nil { return "", err } - return filepath.Join(dir, "thumbs.webp"), nil + return filepath.Join(dir, "preview.webp"), nil } func generatedPreviewFile(id string) (string, error) { diff --git a/backend/preview_covers.go b/backend/preview_covers.go index 537d3f4..7257a57 100644 --- a/backend/preview_covers.go +++ b/backend/preview_covers.go @@ -712,9 +712,9 @@ func inferModelFromStem(stem string) string { } // akzeptiert: -// - "/generated/meta//thumbs.webp" -// - "C:\...\generated\meta\\thumbs.webp" -// - "http(s)://host/generated/meta//thumbs.webp" +// - "/generated/meta//preview.webp" +// - "C:\...\generated\meta\\preview.webp" +// - "http(s)://host/generated/meta//preview.webp" // - (fallback) irgendeinen Dateinamen-Stem, der wie "_MM_DD_YYYY__HH-MM-ss" aussieht func inferModelFromThumbLike(srcOrPath string) string { s := strings.TrimSpace(srcOrPath) @@ -730,7 +730,7 @@ func inferModelFromThumbLike(srcOrPath string) string { s = u.Path } - // Wenn es wie "...//thumbs.webp" aussieht: parent dir ist + // Wenn es wie "...//preview.webp" aussieht: parent dir ist base := path.Base(s) lb := strings.ToLower(base) if strings.HasPrefix(lb, "thumbs.") { diff --git a/backend/preview_hls.go b/backend/preview_hls.go index bfc92e9..9dabdc2 100644 --- a/backend/preview_hls.go +++ b/backend/preview_hls.go @@ -386,7 +386,7 @@ func startPreviewHLS(ctx context.Context, job *RecordJob, m3u8URL, previewDir, h jobsMu.Unlock() }() - // ✅ Live thumb writer starten (schreibt generated//thumbs.webp regelmäßig neu) + // ✅ Live thumb writer starten (schreibt generated//preview.webp regelmäßig neu) startLiveThumbWebPLoop(ctx, job) return nil diff --git a/backend/preview_webp.go b/backend/preview_webp.go index 86d7615..90c155e 100644 --- a/backend/preview_webp.go +++ b/backend/preview_webp.go @@ -243,7 +243,7 @@ func serveLivePreviewWebPFile(w http.ResponseWriter, r *http.Request, path strin w.Header().Set("Content-Type", "image/webp") w.Header().Set("Cache-Control", "no-store") - http.ServeContent(w, r, "thumbs.webp", st.ModTime(), f) + http.ServeContent(w, r, "preview.webp", st.ModTime(), f) } func servePreviewWebPFile(w http.ResponseWriter, r *http.Request, path string) { @@ -290,7 +290,7 @@ func serveLivePreviewWebPBytes(w http.ResponseWriter, b []byte) { } // ------------------------------------------------------------ -// Preview alias: thumbs.webp / preview.webp (webp only) +// Preview alias: preview.webp / preview.webp (webp only) // ------------------------------------------------------------ func servePreviewWebPAlias(w http.ResponseWriter, r *http.Request, id string) { @@ -422,7 +422,7 @@ func recordPreview(w http.ResponseWriter, r *http.Request) { if file := strings.TrimSpace(r.URL.Query().Get("file")); file != "" { low := strings.ToLower(file) // ✅ NUR WEBP - if low == "thumbs.webp" || low == "preview.webp" { + if low == "preview.webp" || low == "preview.webp" { servePreviewWebPAlias(w, r, id) return } @@ -437,7 +437,7 @@ func recordPreview(w http.ResponseWriter, r *http.Request) { jobsMu.Unlock() if ok { - // ✅ 0) Running: wenn generated//thumbs.webp existiert -> sofort ausliefern + // ✅ 0) Running: wenn generated//preview.webp existiert -> sofort ausliefern // (kein ffmpeg pro HTTP-Request) if job.Status == JobRunning { assetID := assetIDForJob(job) @@ -451,7 +451,7 @@ func recordPreview(w http.ResponseWriter, r *http.Request) { } } - // ✅ Fallback: In-Memory-Cache (falls thumbs.webp noch nicht da ist) + // ✅ Fallback: In-Memory-Cache (falls preview.webp noch nicht da ist) job.previewMu.Lock() cached := job.previewWebp cachedAt := job.previewWebpAt @@ -554,7 +554,7 @@ func updateLiveThumbWebPOnce(ctx context.Context, job *RecordJob) { return } - // Zielpfad: generated//thumbs.webp + // Zielpfad: generated//preview.webp assetID := assetIDForJob(job) thumbPath, err := generatedThumbWebPFile(assetID) if err != nil { @@ -693,7 +693,7 @@ func servePreviewForFinishedFile(w http.ResponseWriter, r *http.Request, id stri } } - thumbPath := filepath.Join(assetDir, "thumbs.webp") + thumbPath := filepath.Join(assetDir, "preview.webp") // 1) Cache hit if fi, err := os.Stat(thumbPath); err == nil && !fi.IsDir() && fi.Size() > 0 { diff --git a/backend/record_start.go b/backend/record_start.go index 335e02b..4a33e0b 100644 --- a/backend/record_start.go +++ b/backend/record_start.go @@ -407,7 +407,7 @@ func runJob(ctx context.Context, job *RecordJob, req RecordRequest) { } } - // 6) Assets (thumbs.webp + preview.mp4) + // 6) Assets (preview.webp + preview.mp4) const ( assetsStart = 86 assetsEnd = 99 diff --git a/backend/web/dist/assets/index-C4whm-WW.js b/backend/web/dist/assets/index-C4whm-WW.js index 60c7377..1566679 100644 --- a/backend/web/dist/assets/index-C4whm-WW.js +++ b/backend/web/dist/assets/index-C4whm-WW.js @@ -309,7 +309,7 @@ Schedule: ${c.map(S=>ha(S))} pos: ${this.timelinePos}`),f.length&&this.log(`Remo `).split(` `),d=[],f=e?v7(e.baseTime,e.timescale):0;let g="00:00.000",y=0,v=0,T,S=!0;u.oncue=function(w){const L=t[i];let O=t.ccOffset;const I=(y-f)/9e4;if(L!=null&&L.new&&(v!==void 0?O=t.ccOffset=L.start:d$(t,i,I)),I){if(!e){T=new Error("Missing initPTS for VTT MPEGTS");return}O=I-t.presentationOffset}const j=w.endTime-w.startTime,P=Ur((w.startTime+O-v)*9e4,n*9e4)/9e4;w.startTime=Math.max(P,0),w.endTime=Math.max(P+j,0);const G=w.text.trim();w.text=decodeURIComponent(encodeURIComponent(G)),w.id||(w.id=w1(w.startTime,w.endTime,G)),w.endTime>0&&d.push(w)},u.onparsingerror=function(w){T=w},u.onflush=function(){if(T){a(T);return}r(d)},c.forEach(w=>{if(S)if($v(w,"X-TIMESTAMP-MAP=")){S=!1,w.slice(16).split(",").forEach(L=>{$v(L,"LOCAL:")?g=L.slice(6):$v(L,"MPEGTS:")&&(y=parseInt(L.slice(7)))});try{v=c$(g)/1e3}catch(L){T=L}return}else w===""&&(S=!1);u.parse(w+` `)}),u.flush()}const Hv="stpp.ttml.im1t",wR=/^(\d{2,}):(\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/,AR=/^(\d*(?:\.\d*)?)(h|m|s|ms|f|t)$/,f$={left:"start",center:"center",right:"end",start:"start",end:"end"};function iA(s,e,t,i){const n=Ai(new Uint8Array(s),["mdat"]);if(n.length===0){i(new Error("Could not parse IMSC1 mdat"));return}const r=n.map(u=>Hr(u)),a=y7(e.baseTime,1,e.timescale);try{r.forEach(u=>t(m$(u,a)))}catch(u){i(u)}}function m$(s,e){const n=new DOMParser().parseFromString(s,"text/xml").getElementsByTagName("tt")[0];if(!n)throw new Error("Invalid ttml");const r={frameRate:30,subFrameRate:1,frameRateMultiplier:0,tickRate:0},a=Object.keys(r).reduce((g,y)=>(g[y]=n.getAttribute(`ttp:${y}`)||r[y],g),{}),u=n.getAttribute("xml:space")!=="preserve",c=sA(zv(n,"styling","style")),d=sA(zv(n,"layout","region")),f=zv(n,"body","[begin]");return[].map.call(f,g=>{const y=kR(g,u);if(!y||!g.hasAttribute("begin"))return null;const v=Gv(g.getAttribute("begin"),a),T=Gv(g.getAttribute("dur"),a);let S=Gv(g.getAttribute("end"),a);if(v===null)throw nA(g);if(S===null){if(T===null)throw nA(g);S=v+T}const w=new E1(v-e,S-e,y);w.id=w1(w.startTime,w.endTime,w.text);const L=d[g.getAttribute("region")],O=c[g.getAttribute("style")],I=p$(L,O,c),{textAlign:j}=I;if(j){const P=f$[j];P&&(w.lineAlign=P),w.align=j}return ys(w,I),w}).filter(g=>g!==null)}function zv(s,e,t){const i=s.getElementsByTagName(e)[0];return i?[].slice.call(i.querySelectorAll(t)):[]}function sA(s){return s.reduce((e,t)=>{const i=t.getAttribute("xml:id");return i&&(e[i]=t),e},{})}function kR(s,e){return[].slice.call(s.childNodes).reduce((t,i,n)=>{var r;return i.nodeName==="br"&&n?t+` -`:(r=i.childNodes)!=null&&r.length?kR(i,e):e?t+i.textContent.trim().replace(/\s+/g," "):t+i.textContent},"")}function p$(s,e,t){const i="http://www.w3.org/ns/ttml#styling";let n=null;const r=["displayAlign","textAlign","color","backgroundColor","fontSize","fontFamily"],a=s!=null&&s.hasAttribute("style")?s.getAttribute("style"):null;return a&&t.hasOwnProperty(a)&&(n=t[a]),r.reduce((u,c)=>{const d=Vv(e,i,c)||Vv(s,i,c)||Vv(n,i,c);return d&&(u[c]=d),u},{})}function Vv(s,e,t){return s&&s.hasAttributeNS(e,t)?s.getAttributeNS(e,t):null}function nA(s){return new Error(`Could not parse ttml timestamp ${s}`)}function Gv(s,e){if(!s)return null;let t=SR(s);return t===null&&(wR.test(s)?t=g$(s,e):AR.test(s)&&(t=y$(s,e))),t}function g$(s,e){const t=wR.exec(s),i=(t[4]|0)+(t[5]|0)/e.subFrameRate;return(t[1]|0)*3600+(t[2]|0)*60+(t[3]|0)+i/e.frameRate}function y$(s,e){const t=AR.exec(s),i=Number(t[1]);switch(t[2]){case"h":return i*3600;case"m":return i*60;case"ms":return i*1e3;case"f":return i/e.frameRate;case"t":return i/e.tickRate}return i}class Vm{constructor(e,t){this.timelineController=void 0,this.cueRanges=[],this.trackName=void 0,this.startTime=null,this.endTime=null,this.screen=null,this.timelineController=e,this.trackName=t}dispatchCue(){this.startTime!==null&&(this.timelineController.addCues(this.trackName,this.startTime,this.endTime,this.screen,this.cueRanges),this.startTime=null)}newCue(e,t,i){(this.startTime===null||this.startTime>e)&&(this.startTime=e),this.endTime=t,this.screen=i,this.timelineController.createCaptionsTrack(this.trackName)}reset(){this.cueRanges=[],this.startTime=null}}class v${constructor(e){this.hls=void 0,this.media=null,this.config=void 0,this.enabled=!0,this.Cues=void 0,this.textTracks=[],this.tracks=[],this.initPTS=[],this.unparsedVttFrags=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.cea608Parser1=void 0,this.cea608Parser2=void 0,this.lastCc=-1,this.lastSn=-1,this.lastPartIndex=-1,this.prevCC=-1,this.vttCCs=aA(),this.captionsProperties=void 0,this.hls=e,this.config=e.config,this.Cues=e.config.cueHandler,this.captionsProperties={textTrack1:{label:this.config.captionsTextTrack1Label,languageCode:this.config.captionsTextTrack1LanguageCode},textTrack2:{label:this.config.captionsTextTrack2Label,languageCode:this.config.captionsTextTrack2LanguageCode},textTrack3:{label:this.config.captionsTextTrack3Label,languageCode:this.config.captionsTextTrack3LanguageCode},textTrack4:{label:this.config.captionsTextTrack4Label,languageCode:this.config.captionsTextTrack4LanguageCode}},e.on(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.on(H.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),e.on(H.FRAG_LOADING,this.onFragLoading,this),e.on(H.FRAG_LOADED,this.onFragLoaded,this),e.on(H.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),e.on(H.FRAG_DECRYPTED,this.onFragDecrypted,this),e.on(H.INIT_PTS_FOUND,this.onInitPtsFound,this),e.on(H.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),e.on(H.BUFFER_FLUSHING,this.onBufferFlushing,this)}destroy(){const{hls:e}=this;e.off(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.off(H.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),e.off(H.FRAG_LOADING,this.onFragLoading,this),e.off(H.FRAG_LOADED,this.onFragLoaded,this),e.off(H.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),e.off(H.FRAG_DECRYPTED,this.onFragDecrypted,this),e.off(H.INIT_PTS_FOUND,this.onInitPtsFound,this),e.off(H.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),e.off(H.BUFFER_FLUSHING,this.onBufferFlushing,this),this.hls=this.config=this.media=null,this.cea608Parser1=this.cea608Parser2=void 0}initCea608Parsers(){const e=new Vm(this,"textTrack1"),t=new Vm(this,"textTrack2"),i=new Vm(this,"textTrack3"),n=new Vm(this,"textTrack4");this.cea608Parser1=new tA(1,e,t),this.cea608Parser2=new tA(3,i,n)}addCues(e,t,i,n,r){let a=!1;for(let u=r.length;u--;){const c=r[u],d=x$(c[0],c[1],t,i);if(d>=0&&(c[0]=Math.min(c[0],t),c[1]=Math.max(c[1],i),a=!0,d/(i-t)>.5))return}if(a||r.push([t,i]),this.config.renderTextTracksNatively){const u=this.captionsTracks[e];this.Cues.newCue(u,t,i,n)}else{const u=this.Cues.newCue(null,t,i,n);this.hls.trigger(H.CUES_PARSED,{type:"captions",cues:u,track:e})}}onInitPtsFound(e,{frag:t,id:i,initPTS:n,timescale:r,trackId:a}){const{unparsedVttFrags:u}=this;i===jt.MAIN&&(this.initPTS[t.cc]={baseTime:n,timescale:r,trackId:a}),u.length&&(this.unparsedVttFrags=[],u.forEach(c=>{this.initPTS[c.frag.cc]?this.onFragLoaded(H.FRAG_LOADED,c):this.hls.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:c.frag,error:new Error("Subtitle discontinuity domain does not match main")})}))}getExistingTrack(e,t){const{media:i}=this;if(i)for(let n=0;n{yc(n[r]),delete n[r]}),this.nonNativeCaptionsTracks={}}onManifestLoading(){this.lastCc=-1,this.lastSn=-1,this.lastPartIndex=-1,this.prevCC=-1,this.vttCCs=aA(),this._cleanTracks(),this.tracks=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.textTracks=[],this.unparsedVttFrags=[],this.initPTS=[],this.cea608Parser1&&this.cea608Parser2&&(this.cea608Parser1.reset(),this.cea608Parser2.reset())}_cleanTracks(){const{media:e}=this;if(!e)return;const t=e.textTracks;if(t)for(let i=0;ir.textCodec===Hv);if(this.config.enableWebVTT||n&&this.config.enableIMSC1){if(nR(this.tracks,i)){this.tracks=i;return}if(this.textTracks=[],this.tracks=i,this.config.renderTextTracksNatively){const a=this.media,u=a?u0(a.textTracks):null;if(this.tracks.forEach((c,d)=>{let f;if(u){let g=null;for(let y=0;yd!==null).map(d=>d.label);c.length&&this.hls.logger.warn(`Media element contains unused subtitle tracks: ${c.join(", ")}. Replace media element for each source to clear TextTracks and captions menu.`)}}else if(this.tracks.length){const a=this.tracks.map(u=>({label:u.name,kind:u.type.toLowerCase(),default:u.default,subtitleTrack:u}));this.hls.trigger(H.NON_NATIVE_TEXT_TRACKS_FOUND,{tracks:a})}}}onManifestLoaded(e,t){this.config.enableCEA708Captions&&t.captions&&t.captions.forEach(i=>{const n=/(?:CC|SERVICE)([1-4])/.exec(i.instreamId);if(!n)return;const r=`textTrack${n[1]}`,a=this.captionsProperties[r];a&&(a.label=i.name,i.lang&&(a.languageCode=i.lang),a.media=i)})}closedCaptionsForLevel(e){const t=this.hls.levels[e.level];return t?.attrs["CLOSED-CAPTIONS"]}onFragLoading(e,t){if(this.enabled&&t.frag.type===jt.MAIN){var i,n;const{cea608Parser1:r,cea608Parser2:a,lastSn:u}=this,{cc:c,sn:d}=t.frag,f=(i=(n=t.part)==null?void 0:n.index)!=null?i:-1;r&&a&&(d!==u+1||d===u&&f!==this.lastPartIndex+1||c!==this.lastCc)&&(r.reset(),a.reset()),this.lastCc=c,this.lastSn=d,this.lastPartIndex=f}}onFragLoaded(e,t){const{frag:i,payload:n}=t;if(i.type===jt.SUBTITLE)if(n.byteLength){const r=i.decryptdata,a="stats"in t;if(r==null||!r.encrypted||a){const u=this.tracks[i.level],c=this.vttCCs;c[i.cc]||(c[i.cc]={start:i.start,prevCC:this.prevCC,new:!0},this.prevCC=i.cc),u&&u.textCodec===Hv?this._parseIMSC1(i,n):this._parseVTTs(t)}}else this.hls.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:i,error:new Error("Empty subtitle payload")})}_parseIMSC1(e,t){const i=this.hls;iA(t,this.initPTS[e.cc],n=>{this._appendCues(n,e.level),i.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!0,frag:e})},n=>{i.logger.log(`Failed to parse IMSC1: ${n}`),i.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:e,error:n})})}_parseVTTs(e){var t;const{frag:i,payload:n}=e,{initPTS:r,unparsedVttFrags:a}=this,u=r.length-1;if(!r[i.cc]&&u===-1){a.push(e);return}const c=this.hls,d=(t=i.initSegment)!=null&&t.data?ia(i.initSegment.data,new Uint8Array(n)).buffer:n;h$(d,this.initPTS[i.cc],this.vttCCs,i.cc,i.start,f=>{this._appendCues(f,i.level),c.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!0,frag:i})},f=>{const g=f.message==="Missing initPTS for VTT MPEGTS";g?a.push(e):this._fallbackToIMSC1(i,n),c.logger.log(`Failed to parse VTT cue: ${f}`),!(g&&u>i.cc)&&c.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:i,error:f})})}_fallbackToIMSC1(e,t){const i=this.tracks[e.level];i.textCodec||iA(t,this.initPTS[e.cc],()=>{i.textCodec=Hv,this._parseIMSC1(e,t)},()=>{i.textCodec="wvtt"})}_appendCues(e,t){const i=this.hls;if(this.config.renderTextTracksNatively){const n=this.textTracks[t];if(!n||n.mode==="disabled")return;e.forEach(r=>vR(n,r))}else{const n=this.tracks[t];if(!n)return;const r=n.default?"default":"subtitles"+t;i.trigger(H.CUES_PARSED,{type:"subtitles",cues:e,track:r})}}onFragDecrypted(e,t){const{frag:i}=t;i.type===jt.SUBTITLE&&this.onFragLoaded(H.FRAG_LOADED,t)}onSubtitleTracksCleared(){this.tracks=[],this.captionsTracks={}}onFragParsingUserdata(e,t){if(!this.enabled||!this.config.enableCEA708Captions)return;const{frag:i,samples:n}=t;if(!(i.type===jt.MAIN&&this.closedCaptionsForLevel(i)==="NONE"))for(let r=0;rsb(u[c],t,i))}if(this.config.renderTextTracksNatively&&t===0&&n!==void 0){const{textTracks:u}=this;Object.keys(u).forEach(c=>sb(u[c],t,n))}}}extractCea608Data(e){const t=[[],[]],i=e[0]&31;let n=2;for(let r=0;r=16?c--:c++;const v=ER(d.trim()),T=w1(e,t,v);s!=null&&(g=s.cues)!=null&&g.getCueById(T)||(a=new f(e,t,v),a.id=T,a.line=y+1,a.align="left",a.position=10+Math.min(80,Math.floor(c*8/32)*10),n.push(a))}return s&&n.length&&(n.sort((y,v)=>y.line==="auto"||v.line==="auto"?0:y.line>8&&v.line>8?v.line-y.line:y.line-v.line),n.forEach(y=>vR(s,y))),n}};function S$(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch{}return!1}const _$=/(\d+)-(\d+)\/(\d+)/;class oA{constructor(e){this.fetchSetup=void 0,this.requestTimeout=void 0,this.request=null,this.response=null,this.controller=void 0,this.context=null,this.config=null,this.callbacks=null,this.stats=void 0,this.loader=null,this.fetchSetup=e.fetchSetup||k$,this.controller=new self.AbortController,this.stats=new s1}destroy(){this.loader=this.callbacks=this.context=this.config=this.request=null,this.abortInternal(),this.response=null,this.fetchSetup=this.controller=this.stats=null}abortInternal(){this.controller&&!this.stats.loading.end&&(this.stats.aborted=!0,this.controller.abort())}abort(){var e;this.abortInternal(),(e=this.callbacks)!=null&&e.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,i){const n=this.stats;if(n.loading.start)throw new Error("Loader can only be used once.");n.loading.start=self.performance.now();const r=E$(e,this.controller.signal),a=e.responseType==="arraybuffer",u=a?"byteLength":"length",{maxTimeToFirstByteMs:c,maxLoadTimeMs:d}=t.loadPolicy;this.context=e,this.config=t,this.callbacks=i,this.request=this.fetchSetup(e,r),self.clearTimeout(this.requestTimeout),t.timeout=c&&Ot(c)?c:d,this.requestTimeout=self.setTimeout(()=>{this.callbacks&&(this.abortInternal(),this.callbacks.onTimeout(n,e,this.response))},t.timeout),(Vh(this.request)?this.request.then(self.fetch):self.fetch(this.request)).then(g=>{var y;this.response=this.loader=g;const v=Math.max(self.performance.now(),n.loading.start);if(self.clearTimeout(this.requestTimeout),t.timeout=d,this.requestTimeout=self.setTimeout(()=>{this.callbacks&&(this.abortInternal(),this.callbacks.onTimeout(n,e,this.response))},d-(v-n.loading.start)),!g.ok){const{status:S,statusText:w}=g;throw new C$(w||"fetch, bad network response",S,g)}n.loading.first=v,n.total=A$(g.headers)||n.total;const T=(y=this.callbacks)==null?void 0:y.onProgress;return T&&Ot(t.highWaterMark)?this.loadProgressively(g,n,e,t.highWaterMark,T):a?g.arrayBuffer():e.responseType==="json"?g.json():g.text()}).then(g=>{var y,v;const T=this.response;if(!T)throw new Error("loader destroyed");self.clearTimeout(this.requestTimeout),n.loading.end=Math.max(self.performance.now(),n.loading.first);const S=g[u];S&&(n.loaded=n.total=S);const w={url:T.url,data:g,code:T.status},L=(y=this.callbacks)==null?void 0:y.onProgress;L&&!Ot(t.highWaterMark)&&L(n,e,g,T),(v=this.callbacks)==null||v.onSuccess(w,n,e,T)}).catch(g=>{var y;if(self.clearTimeout(this.requestTimeout),n.aborted)return;const v=g&&g.code||0,T=g?g.message:null;(y=this.callbacks)==null||y.onError({code:v,text:T},e,g?g.details:null,n)})}getCacheAge(){let e=null;if(this.response){const t=this.response.headers.get("age");e=t?parseFloat(t):null}return e}getResponseHeader(e){return this.response?this.response.headers.get(e):null}loadProgressively(e,t,i,n=0,r){const a=new FL,u=e.body.getReader(),c=()=>u.read().then(d=>{if(d.done)return a.dataLength&&r(t,i,a.flush().buffer,e),Promise.resolve(new ArrayBuffer(0));const f=d.value,g=f.length;return t.loaded+=g,g=n&&r(t,i,a.flush().buffer,e)):r(t,i,f.buffer,e),c()}).catch(()=>Promise.reject());return c()}}function E$(s,e){const t={method:"GET",mode:"cors",credentials:"same-origin",signal:e,headers:new self.Headers(ys({},s.headers))};return s.rangeEnd&&t.headers.set("Range","bytes="+s.rangeStart+"-"+String(s.rangeEnd-1)),t}function w$(s){const e=_$.exec(s);if(e)return parseInt(e[2])-parseInt(e[1])+1}function A$(s){const e=s.get("Content-Range");if(e){const i=w$(e);if(Ot(i))return i}const t=s.get("Content-Length");if(t)return parseInt(t)}function k$(s,e){return new self.Request(s.url,e)}class C$ extends Error{constructor(e,t,i){super(e),this.code=void 0,this.details=void 0,this.code=t,this.details=i}}const D$=/^age:\s*[\d.]+\s*$/im;class DR{constructor(e){this.xhrSetup=void 0,this.requestTimeout=void 0,this.retryTimeout=void 0,this.retryDelay=void 0,this.config=null,this.callbacks=null,this.context=null,this.loader=null,this.stats=void 0,this.xhrSetup=e&&e.xhrSetup||null,this.stats=new s1,this.retryDelay=0}destroy(){this.callbacks=null,this.abortInternal(),this.loader=null,this.config=null,this.context=null,this.xhrSetup=null}abortInternal(){const e=this.loader;self.clearTimeout(this.requestTimeout),self.clearTimeout(this.retryTimeout),e&&(e.onreadystatechange=null,e.onprogress=null,e.readyState!==4&&(this.stats.aborted=!0,e.abort()))}abort(){var e;this.abortInternal(),(e=this.callbacks)!=null&&e.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.loader)}load(e,t,i){if(this.stats.loading.start)throw new Error("Loader can only be used once.");this.stats.loading.start=self.performance.now(),this.context=e,this.config=t,this.callbacks=i,this.loadInternal()}loadInternal(){const{config:e,context:t}=this;if(!e||!t)return;const i=this.loader=new self.XMLHttpRequest,n=this.stats;n.loading.first=0,n.loaded=0,n.aborted=!1;const r=this.xhrSetup;r?Promise.resolve().then(()=>{if(!(this.loader!==i||this.stats.aborted))return r(i,t.url)}).catch(a=>{if(!(this.loader!==i||this.stats.aborted))return i.open("GET",t.url,!0),r(i,t.url)}).then(()=>{this.loader!==i||this.stats.aborted||this.openAndSendXhr(i,t,e)}).catch(a=>{var u;(u=this.callbacks)==null||u.onError({code:i.status,text:a.message},t,i,n)}):this.openAndSendXhr(i,t,e)}openAndSendXhr(e,t,i){e.readyState||e.open("GET",t.url,!0);const n=t.headers,{maxTimeToFirstByteMs:r,maxLoadTimeMs:a}=i.loadPolicy;if(n)for(const u in n)e.setRequestHeader(u,n[u]);t.rangeEnd&&e.setRequestHeader("Range","bytes="+t.rangeStart+"-"+(t.rangeEnd-1)),e.onreadystatechange=this.readystatechange.bind(this),e.onprogress=this.loadprogress.bind(this),e.responseType=t.responseType,self.clearTimeout(this.requestTimeout),i.timeout=r&&Ot(r)?r:a,this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),i.timeout),e.send()}readystatechange(){const{context:e,loader:t,stats:i}=this;if(!e||!t)return;const n=t.readyState,r=this.config;if(!i.aborted&&n>=2&&(i.loading.first===0&&(i.loading.first=Math.max(self.performance.now(),i.loading.start),r.timeout!==r.loadPolicy.maxLoadTimeMs&&(self.clearTimeout(this.requestTimeout),r.timeout=r.loadPolicy.maxLoadTimeMs,this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),r.loadPolicy.maxLoadTimeMs-(i.loading.first-i.loading.start)))),n===4)){self.clearTimeout(this.requestTimeout),t.onreadystatechange=null,t.onprogress=null;const d=t.status,f=t.responseType==="text"?t.responseText:null;if(d>=200&&d<300){const T=f??t.response;if(T!=null){var a,u;i.loading.end=Math.max(self.performance.now(),i.loading.first);const S=t.responseType==="arraybuffer"?T.byteLength:T.length;i.loaded=i.total=S,i.bwEstimate=i.total*8e3/(i.loading.end-i.loading.first);const w=(a=this.callbacks)==null?void 0:a.onProgress;w&&w(i,e,T,t);const L={url:t.responseURL,data:T,code:d};(u=this.callbacks)==null||u.onSuccess(L,i,e,t);return}}const g=r.loadPolicy.errorRetry,y=i.retry,v={url:e.url,data:void 0,code:d};if(q0(g,y,!1,v))this.retry(g);else{var c;cs.error(`${d} while loading ${e.url}`),(c=this.callbacks)==null||c.onError({code:d,text:t.statusText},e,t,i)}}}loadtimeout(){if(!this.config)return;const e=this.config.loadPolicy.timeoutRetry,t=this.stats.retry;if(q0(e,t,!0))this.retry(e);else{var i;cs.warn(`timeout while loading ${(i=this.context)==null?void 0:i.url}`);const n=this.callbacks;n&&(this.abortInternal(),n.onTimeout(this.stats,this.context,this.loader))}}retry(e){const{context:t,stats:i}=this;this.retryDelay=o1(e,i.retry),i.retry++,cs.warn(`${status?"HTTP Status "+status:"Timeout"} while loading ${t?.url}, retrying ${i.retry}/${e.maxNumRetry} in ${this.retryDelay}ms`),this.abortInternal(),this.loader=null,self.clearTimeout(this.retryTimeout),this.retryTimeout=self.setTimeout(this.loadInternal.bind(this),this.retryDelay)}loadprogress(e){const t=this.stats;t.loaded=e.loaded,e.lengthComputable&&(t.total=e.total)}getCacheAge(){let e=null;if(this.loader&&D$.test(this.loader.getAllResponseHeaders())){const t=this.loader.getResponseHeader("age");e=t?parseFloat(t):null}return e}getResponseHeader(e){return this.loader&&new RegExp(`^${e}:\\s*[\\d.]+\\s*$`,"im").test(this.loader.getAllResponseHeaders())?this.loader.getResponseHeader(e):null}}const L$={maxTimeToFirstByteMs:8e3,maxLoadTimeMs:2e4,timeoutRetry:null,errorRetry:null},R$=us(us({autoStartLoad:!0,startPosition:-1,defaultAudioCodec:void 0,debug:!1,capLevelOnFPSDrop:!1,capLevelToPlayerSize:!1,ignoreDevicePixelRatio:!1,maxDevicePixelRatio:Number.POSITIVE_INFINITY,preferManagedMediaSource:!0,initialLiveManifestSize:1,maxBufferLength:30,backBufferLength:1/0,frontBufferFlushThreshold:1/0,startOnSegmentBoundary:!1,maxBufferSize:60*1e3*1e3,maxFragLookUpTolerance:.25,maxBufferHole:.1,detectStallWithCurrentTimeMs:1250,highBufferWatchdogPeriod:2,nudgeOffset:.1,nudgeMaxRetry:3,nudgeOnVideoHole:!0,liveSyncMode:"edge",liveSyncDurationCount:3,liveSyncOnStallIncrease:1,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxLiveSyncPlaybackRate:1,liveDurationInfinity:!1,liveBackBufferLength:null,maxMaxBufferLength:600,enableWorker:!0,workerPath:null,enableSoftwareAES:!0,startLevel:void 0,startFragPrefetch:!1,fpsDroppedMonitoringPeriod:5e3,fpsDroppedMonitoringThreshold:.2,appendErrorMaxRetry:3,ignorePlaylistParsingErrors:!1,loader:DR,fLoader:void 0,pLoader:void 0,xhrSetup:void 0,licenseXhrSetup:void 0,licenseResponseCallback:void 0,abrController:zU,bufferController:N7,capLevelController:T1,errorController:WU,fpsController:O9,stretchShortVideoTrack:!1,maxAudioFramesDrift:1,forceKeyFrameOnDiscontinuity:!0,abrEwmaFastLive:3,abrEwmaSlowLive:9,abrEwmaFastVoD:3,abrEwmaSlowVoD:9,abrEwmaDefaultEstimate:5e5,abrEwmaDefaultEstimateMax:5e6,abrBandWidthFactor:.95,abrBandWidthUpFactor:.7,abrMaxWithRealBitrate:!1,maxStarvationDelay:4,maxLoadingDelay:4,minAutoBitrate:0,emeEnabled:!1,widevineLicenseUrl:void 0,drmSystems:{},drmSystemOptions:{},requestMediaKeySystemAccessFunc:kL,requireKeySystemAccessOnStart:!1,testBandwidth:!0,progressive:!1,lowLatencyMode:!0,cmcd:void 0,enableDateRangeMetadataCues:!0,enableEmsgMetadataCues:!0,enableEmsgKLVMetadata:!1,enableID3MetadataCues:!0,enableInterstitialPlayback:!0,interstitialAppendInPlace:!0,interstitialLiveLookAhead:10,useMediaCapabilities:!0,preserveManualLevelOnError:!1,certLoadPolicy:{default:L$},keyLoadPolicy:{default:{maxTimeToFirstByteMs:8e3,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:2e4,backoff:"linear"},errorRetry:{maxNumRetry:8,retryDelayMs:1e3,maxRetryDelayMs:2e4,backoff:"linear"}}},manifestLoadPolicy:{default:{maxTimeToFirstByteMs:1/0,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},playlistLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:2,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},fragLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:12e4,timeoutRetry:{maxNumRetry:4,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:6,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},steeringManifestLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},interstitialAssetListLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:3e4,timeoutRetry:{maxNumRetry:0,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:0,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,manifestLoadingMaxRetryTimeout:64e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,levelLoadingMaxRetryTimeout:64e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingMaxRetryTimeout:64e3},I$()),{},{subtitleStreamController:q9,subtitleTrackController:B9,timelineController:v$,audioStreamController:D7,audioTrackController:L7,emeController:Rc,cmcdController:L9,contentSteeringController:I9,interstitialsController:G9});function I$(){return{cueHandler:T$,enableWebVTT:!0,enableIMSC1:!0,enableCEA708Captions:!0,captionsTextTrack1Label:"English",captionsTextTrack1LanguageCode:"en",captionsTextTrack2Label:"Spanish",captionsTextTrack2LanguageCode:"es",captionsTextTrack3Label:"Unknown CC",captionsTextTrack3LanguageCode:"",captionsTextTrack4Label:"Unknown CC",captionsTextTrack4LanguageCode:"",renderTextTracksNatively:!0}}function N$(s,e,t){if((e.liveSyncDurationCount||e.liveMaxLatencyDurationCount)&&(e.liveSyncDuration||e.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");if(e.liveMaxLatencyDurationCount!==void 0&&(e.liveSyncDurationCount===void 0||e.liveMaxLatencyDurationCount<=e.liveSyncDurationCount))throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"');if(e.liveMaxLatencyDuration!==void 0&&(e.liveSyncDuration===void 0||e.liveMaxLatencyDuration<=e.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"');const i=rb(s),n=["manifest","level","frag"],r=["TimeOut","MaxRetry","RetryDelay","MaxRetryTimeout"];return n.forEach(a=>{const u=`${a==="level"?"playlist":a}LoadPolicy`,c=e[u]===void 0,d=[];r.forEach(f=>{const g=`${a}Loading${f}`,y=e[g];if(y!==void 0&&c){d.push(g);const v=i[u].default;switch(e[u]={default:v},f){case"TimeOut":v.maxLoadTimeMs=y,v.maxTimeToFirstByteMs=y;break;case"MaxRetry":v.errorRetry.maxNumRetry=y,v.timeoutRetry.maxNumRetry=y;break;case"RetryDelay":v.errorRetry.retryDelayMs=y,v.timeoutRetry.retryDelayMs=y;break;case"MaxRetryTimeout":v.errorRetry.maxRetryDelayMs=y,v.timeoutRetry.maxRetryDelayMs=y;break}}}),d.length&&t.warn(`hls.js config: "${d.join('", "')}" setting(s) are deprecated, use "${u}": ${ks(e[u])}`)}),us(us({},i),e)}function rb(s){return s&&typeof s=="object"?Array.isArray(s)?s.map(rb):Object.keys(s).reduce((e,t)=>(e[t]=rb(s[t]),e),{}):s}function O$(s,e){const t=s.loader;t!==oA&&t!==DR?(e.log("[config]: Custom loader detected, cannot enable progressive streaming"),s.progressive=!1):S$()&&(s.loader=oA,s.progressive=!0,s.enableSoftwareAES=!0,e.log("[config]: Progressive streaming enabled, using FetchLoader"))}const c0=2,M$=.1,P$=.05,B$=100;class F$ extends SL{constructor(e,t){super("gap-controller",e.logger),this.hls=void 0,this.fragmentTracker=void 0,this.media=null,this.mediaSource=void 0,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1,this.buffered={},this.lastCurrentTime=0,this.ended=0,this.waiting=0,this.onMediaPlaying=()=>{this.ended=0,this.waiting=0},this.onMediaWaiting=()=>{var i;(i=this.media)!=null&&i.seeking||(this.waiting=self.performance.now(),this.tick())},this.onMediaEnded=()=>{if(this.hls){var i;this.ended=((i=this.media)==null?void 0:i.currentTime)||1,this.hls.trigger(H.MEDIA_ENDED,{stalled:!1})}},this.hls=e,this.fragmentTracker=t,this.registerListeners()}registerListeners(){const{hls:e}=this;e&&(e.on(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.BUFFER_APPENDED,this.onBufferAppended,this))}unregisterListeners(){const{hls:e}=this;e&&(e.off(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.BUFFER_APPENDED,this.onBufferAppended,this))}destroy(){super.destroy(),this.unregisterListeners(),this.media=this.hls=this.fragmentTracker=null,this.mediaSource=void 0}onMediaAttached(e,t){this.setInterval(B$),this.mediaSource=t.mediaSource;const i=this.media=t.media;sr(i,"playing",this.onMediaPlaying),sr(i,"waiting",this.onMediaWaiting),sr(i,"ended",this.onMediaEnded)}onMediaDetaching(e,t){this.clearInterval();const{media:i}=this;i&&(br(i,"playing",this.onMediaPlaying),br(i,"waiting",this.onMediaWaiting),br(i,"ended",this.onMediaEnded),this.media=null),this.mediaSource=void 0}onBufferAppended(e,t){this.buffered=t.timeRanges}get hasBuffered(){return Object.keys(this.buffered).length>0}tick(){var e;if(!((e=this.media)!=null&&e.readyState)||!this.hasBuffered)return;const t=this.media.currentTime;this.poll(t,this.lastCurrentTime),this.lastCurrentTime=t}poll(e,t){var i,n;const r=(i=this.hls)==null?void 0:i.config;if(!r)return;const a=this.media;if(!a)return;const{seeking:u}=a,c=this.seeking&&!u,d=!this.seeking&&u,f=a.paused&&!u||a.ended||a.playbackRate===0;if(this.seeking=u,e!==t){t&&(this.ended=0),this.moved=!0,u||(this.nudgeRetry=0,r.nudgeOnVideoHole&&!f&&e>t&&this.nudgeOnVideoHole(e,t)),this.waiting===0&&this.stallResolved(e);return}if(d||c){c&&this.stallResolved(e);return}if(f){this.nudgeRetry=0,this.stallResolved(e),!this.ended&&a.ended&&this.hls&&(this.ended=e||1,this.hls.trigger(H.MEDIA_ENDED,{stalled:!1}));return}if(!gi.getBuffered(a).length){this.nudgeRetry=0;return}const g=gi.bufferInfo(a,e,0),y=g.nextStart||0,v=this.fragmentTracker;if(u&&v&&this.hls){const G=lA(this.hls.inFlightFragments,e),N=g.len>c0,K=!y||G||y-e>c0&&!v.getPartialFragment(e);if(N||K)return;this.moved=!1}const T=(n=this.hls)==null?void 0:n.latestLevelDetails;if(!this.moved&&this.stalled!==null&&v){if(!(g.len>0)&&!y)return;const N=Math.max(y,g.start||0)-e,k=!!(T!=null&&T.live)?T.targetduration*2:c0,R=Gm(e,v);if(N>0&&(N<=k||R)){a.paused||this._trySkipBufferHole(R);return}}const S=r.detectStallWithCurrentTimeMs,w=self.performance.now(),L=this.waiting;let O=this.stalled;if(O===null)if(L>0&&w-L=S||L)&&this.hls){var j;if(((j=this.mediaSource)==null?void 0:j.readyState)==="ended"&&!(T!=null&&T.live)&&Math.abs(e-(T?.edge||0))<1){if(this.ended)return;this.ended=e||1,this.hls.trigger(H.MEDIA_ENDED,{stalled:!0});return}if(this._reportStall(g),!this.media||!this.hls)return}const P=gi.bufferInfo(a,e,r.maxBufferHole);this._tryFixBufferStall(P,I,e)}stallResolved(e){const t=this.stalled;if(t&&this.hls&&(this.stalled=null,this.stallReported)){const i=self.performance.now()-t;this.log(`playback not stuck anymore @${e}, after ${Math.round(i)}ms`),this.stallReported=!1,this.waiting=0,this.hls.trigger(H.STALL_RESOLVED,{})}}nudgeOnVideoHole(e,t){var i;const n=this.buffered.video;if(this.hls&&this.media&&this.fragmentTracker&&(i=this.buffered.audio)!=null&&i.length&&n&&n.length>1&&e>n.end(0)){const r=gi.bufferedInfo(gi.timeRangesToArray(this.buffered.audio),e,0);if(r.len>1&&t>=r.start){const a=gi.timeRangesToArray(n),u=gi.bufferedInfo(a,t,0).bufferedIndex;if(u>-1&&uu)&&f-d<1&&e-d<2){const g=new Error(`nudging playhead to flush pipeline after video hole. currentTime: ${e} hole: ${d} -> ${f} buffered index: ${c}`);this.warn(g.message),this.media.currentTime+=1e-6;let y=Gm(e,this.fragmentTracker);y&&"fragment"in y?y=y.fragment:y||(y=void 0);const v=gi.bufferInfo(this.media,e,0);this.hls.trigger(H.ERROR,{type:Vt.MEDIA_ERROR,details:$e.BUFFER_SEEK_OVER_HOLE,fatal:!1,error:g,reason:g.message,frag:y,buffer:v.len,bufferInfo:v})}}}}}_tryFixBufferStall(e,t,i){var n,r;const{fragmentTracker:a,media:u}=this,c=(n=this.hls)==null?void 0:n.config;if(!u||!a||!c)return;const d=(r=this.hls)==null?void 0:r.latestLevelDetails,f=Gm(i,a);if((f||d!=null&&d.live&&i1&&e.len>c.maxBufferHole||e.nextStart&&(e.nextStart-ic.highBufferWatchdogPeriod*1e3||this.waiting)&&(this.warn("Trying to nudge playhead over buffer-hole"),this._tryNudgeBuffer(e))}adjacentTraversal(e,t){const i=this.fragmentTracker,n=e.nextStart;if(i&&n){const r=i.getFragAtPos(t,jt.MAIN),a=i.getFragAtPos(n,jt.MAIN);if(r&&a)return a.sn-r.sn<2}return!1}_reportStall(e){const{hls:t,media:i,stallReported:n,stalled:r}=this;if(!n&&r!==null&&i&&t){this.stallReported=!0;const a=new Error(`Playback stalling at @${i.currentTime} due to low buffer (${ks(e)})`);this.warn(a.message),t.trigger(H.ERROR,{type:Vt.MEDIA_ERROR,details:$e.BUFFER_STALLED_ERROR,fatal:!1,error:a,buffer:e.len,bufferInfo:e,stalled:{start:r}})}}_trySkipBufferHole(e){var t;const{fragmentTracker:i,media:n}=this,r=(t=this.hls)==null?void 0:t.config;if(!n||!i||!r)return 0;const a=n.currentTime,u=gi.bufferInfo(n,a,0),c=a0&&u.len<1&&n.readyState<3,y=c-a;if(y>0&&(f||g)){if(y>r.maxBufferHole){let T=!1;if(a===0){const S=i.getAppendedFrag(0,jt.MAIN);S&&c"u"))return self.VTTCue||self.TextTrackCue}function qv(s,e,t,i,n){let r=new s(e,t,"");try{r.value=i,n&&(r.type=n)}catch{r=new s(e,t,ks(n?us({type:n},i):i))}return r}const qm=(()=>{const s=ab();try{s&&new s(0,Number.POSITIVE_INFINITY,"")}catch{return Number.MAX_VALUE}return Number.POSITIVE_INFINITY})();class j${constructor(e){this.hls=void 0,this.id3Track=null,this.media=null,this.dateRangeCuesAppended={},this.removeCues=!0,this.assetCue=void 0,this.onEventCueEnter=()=>{this.hls&&this.hls.trigger(H.EVENT_CUE_ENTER,{})},this.hls=e,this._registerListeners()}destroy(){this._unregisterListeners(),this.id3Track=null,this.media=null,this.dateRangeCuesAppended={},this.hls=this.onEventCueEnter=null}_registerListeners(){const{hls:e}=this;e&&(e.on(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.on(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),e.on(H.BUFFER_FLUSHING,this.onBufferFlushing,this),e.on(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.on(H.LEVEL_PTS_UPDATED,this.onLevelPtsUpdated,this))}_unregisterListeners(){const{hls:e}=this;e&&(e.off(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.off(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),e.off(H.BUFFER_FLUSHING,this.onBufferFlushing,this),e.off(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.off(H.LEVEL_PTS_UPDATED,this.onLevelPtsUpdated,this))}onMediaAttaching(e,t){var i;this.media=t.media,((i=t.overrides)==null?void 0:i.cueRemoval)===!1&&(this.removeCues=!1)}onMediaAttached(){var e;const t=(e=this.hls)==null?void 0:e.latestLevelDetails;t&&this.updateDateRangeCues(t)}onMediaDetaching(e,t){this.media=null,!t.transferMedia&&(this.id3Track&&(this.removeCues&&yc(this.id3Track,this.onEventCueEnter),this.id3Track=null),this.dateRangeCuesAppended={})}onManifestLoading(){this.dateRangeCuesAppended={}}createTrack(e){const t=this.getID3Track(e.textTracks);return t.mode="hidden",t}getID3Track(e){if(this.media){for(let t=0;tqm&&(g=qm),g-f<=0&&(g=f+U$);for(let v=0;vf.type===jr.audioId3&&c:n==="video"?d=f=>f.type===jr.emsg&&u:d=f=>f.type===jr.audioId3&&c||f.type===jr.emsg&&u,sb(r,t,i,d)}}onLevelUpdated(e,{details:t}){this.updateDateRangeCues(t,!0)}onLevelPtsUpdated(e,t){Math.abs(t.drift)>.01&&this.updateDateRangeCues(t.details)}updateDateRangeCues(e,t){if(!this.hls||!this.media)return;const{assetPlayerId:i,timelineOffset:n,enableDateRangeMetadataCues:r,interstitialsController:a}=this.hls.config;if(!r)return;const u=ab();if(i&&n&&!a){const{fragmentStart:S,fragmentEnd:w}=e;let L=this.assetCue;L?(L.startTime=S,L.endTime=w):u&&(L=this.assetCue=qv(u,S,w,{assetPlayerId:this.hls.config.assetPlayerId},"hlsjs.interstitial.asset"),L&&(L.id=i,this.id3Track||(this.id3Track=this.createTrack(this.media)),this.id3Track.addCue(L),L.addEventListener("enter",this.onEventCueEnter)))}if(!e.hasProgramDateTime)return;const{id3Track:c}=this,{dateRanges:d}=e,f=Object.keys(d);let g=this.dateRangeCuesAppended;if(c&&t){var y;if((y=c.cues)!=null&&y.length){const S=Object.keys(g).filter(w=>!f.includes(w));for(let w=S.length;w--;){var v;const L=S[w],O=(v=g[L])==null?void 0:v.cues;delete g[L],O&&Object.keys(O).forEach(I=>{const j=O[I];if(j){j.removeEventListener("enter",this.onEventCueEnter);try{c.removeCue(j)}catch{}}})}}else g=this.dateRangeCuesAppended={}}const T=e.fragments[e.fragments.length-1];if(!(f.length===0||!Ot(T?.programDateTime))){this.id3Track||(this.id3Track=this.createTrack(this.media));for(let S=0;S{if(z!==L.id){const X=d[z];if(X.class===L.class&&X.startDate>L.startDate&&(!Y||L.startDate.01&&(z.startTime=O,z.endTime=G);else if(u){let X=L.attr[Y];lj(Y)&&(X=iL(X));const J=qv(u,O,G,{key:Y,data:X},jr.dateRange);J&&(J.id=w,this.id3Track.addCue(J),j[Y]=J,a&&(Y==="X-ASSET-LIST"||Y==="X-ASSET-URL")&&J.addEventListener("enter",this.onEventCueEnter))}}g[w]={cues:j,dateRange:L,durationKnown:P}}}}}class $${constructor(e){this.hls=void 0,this.config=void 0,this.media=null,this.currentTime=0,this.stallCount=0,this._latency=null,this._targetLatencyUpdated=!1,this.onTimeupdate=()=>{const{media:t}=this,i=this.levelDetails;if(!t||!i)return;this.currentTime=t.currentTime;const n=this.computeLatency();if(n===null)return;this._latency=n;const{lowLatencyMode:r,maxLiveSyncPlaybackRate:a}=this.config;if(!r||a===1||!i.live)return;const u=this.targetLatency;if(u===null)return;const c=n-u,d=Math.min(this.maxLatency,u+i.targetduration);if(c.05&&this.forwardBufferLength>1){const g=Math.min(2,Math.max(1,a)),y=Math.round(2/(1+Math.exp(-.75*c-this.edgeStalled))*20)/20,v=Math.min(g,Math.max(1,y));this.changeMediaPlaybackRate(t,v)}else t.playbackRate!==1&&t.playbackRate!==0&&this.changeMediaPlaybackRate(t,1)},this.hls=e,this.config=e.config,this.registerListeners()}get levelDetails(){var e;return((e=this.hls)==null?void 0:e.latestLevelDetails)||null}get latency(){return this._latency||0}get maxLatency(){const{config:e}=this;if(e.liveMaxLatencyDuration!==void 0)return e.liveMaxLatencyDuration;const t=this.levelDetails;return t?e.liveMaxLatencyDurationCount*t.targetduration:0}get targetLatency(){const e=this.levelDetails;if(e===null||this.hls===null)return null;const{holdBack:t,partHoldBack:i,targetduration:n}=e,{liveSyncDuration:r,liveSyncDurationCount:a,lowLatencyMode:u}=this.config,c=this.hls.userConfig;let d=u&&i||t;(this._targetLatencyUpdated||c.liveSyncDuration||c.liveSyncDurationCount||d===0)&&(d=r!==void 0?r:a*n);const f=n;return d+Math.min(this.stallCount*this.config.liveSyncOnStallIncrease,f)}set targetLatency(e){this.stallCount=0,this.config.liveSyncDuration=e,this._targetLatencyUpdated=!0}get liveSyncPosition(){const e=this.estimateLiveEdge(),t=this.targetLatency;if(e===null||t===null)return null;const i=this.levelDetails;if(i===null)return null;const n=i.edge,r=e-t-this.edgeStalled,a=n-i.totalduration,u=n-(this.config.lowLatencyMode&&i.partTarget||i.targetduration);return Math.min(Math.max(a,r),u)}get drift(){const e=this.levelDetails;return e===null?1:e.drift}get edgeStalled(){const e=this.levelDetails;if(e===null)return 0;const t=(this.config.lowLatencyMode&&e.partTarget||e.targetduration)*3;return Math.max(e.age-t,0)}get forwardBufferLength(){const{media:e}=this,t=this.levelDetails;if(!e||!t)return 0;const i=e.buffered.length;return(i?e.buffered.end(i-1):t.edge)-this.currentTime}destroy(){this.unregisterListeners(),this.onMediaDetaching(),this.hls=null}registerListeners(){const{hls:e}=this;e&&(e.on(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.on(H.ERROR,this.onError,this))}unregisterListeners(){const{hls:e}=this;e&&(e.off(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.off(H.ERROR,this.onError,this))}onMediaAttached(e,t){this.media=t.media,this.media.addEventListener("timeupdate",this.onTimeupdate)}onMediaDetaching(){this.media&&(this.media.removeEventListener("timeupdate",this.onTimeupdate),this.media=null)}onManifestLoading(){this._latency=null,this.stallCount=0}onLevelUpdated(e,{details:t}){t.advanced&&this.onTimeupdate(),!t.live&&this.media&&this.media.removeEventListener("timeupdate",this.onTimeupdate)}onError(e,t){var i;t.details===$e.BUFFER_STALLED_ERROR&&(this.stallCount++,this.hls&&(i=this.levelDetails)!=null&&i.live&&this.hls.logger.warn("[latency-controller]: Stall detected, adjusting target latency"))}changeMediaPlaybackRate(e,t){var i,n;e.playbackRate!==t&&((i=this.hls)==null||i.logger.debug(`[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${(n=this.targetLatency)==null?void 0:n.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${e.playbackRate} to ${t}`),e.playbackRate=t)}estimateLiveEdge(){const e=this.levelDetails;return e===null?null:e.edge+e.age}computeLatency(){const e=this.estimateLiveEdge();return e===null?null:e-this.currentTime}}class H$ extends b1{constructor(e,t){super(e,"level-controller"),this._levels=[],this._firstLevel=-1,this._maxAutoLevel=-1,this._startLevel=void 0,this.currentLevel=null,this.currentLevelIndex=-1,this.manualLevelIndex=-1,this.steering=void 0,this.onParsedComplete=void 0,this.steering=t,this._registerListeners()}_registerListeners(){const{hls:e}=this;e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.on(H.LEVEL_LOADED,this.onLevelLoaded,this),e.on(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.on(H.FRAG_BUFFERED,this.onFragBuffered,this),e.on(H.ERROR,this.onError,this)}_unregisterListeners(){const{hls:e}=this;e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.off(H.LEVEL_LOADED,this.onLevelLoaded,this),e.off(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.off(H.FRAG_BUFFERED,this.onFragBuffered,this),e.off(H.ERROR,this.onError,this)}destroy(){this._unregisterListeners(),this.steering=null,this.resetLevels(),super.destroy()}stopLoad(){this._levels.forEach(t=>{t.loadError=0,t.fragmentError=0}),super.stopLoad()}resetLevels(){this._startLevel=void 0,this.manualLevelIndex=-1,this.currentLevelIndex=-1,this.currentLevel=null,this._levels=[],this._maxAutoLevel=-1}onManifestLoading(e,t){this.resetLevels()}onManifestLoaded(e,t){const i=this.hls.config.preferManagedMediaSource,n=[],r={},a={};let u=!1,c=!1,d=!1;t.levels.forEach(f=>{const g=f.attrs;let{audioCodec:y,videoCodec:v}=f;y&&(f.audioCodec=y=H0(y,i)||void 0),v&&(v=f.videoCodec=EU(v));const{width:T,height:S,unknownCodecs:w}=f,L=w?.length||0;if(u||(u=!!(T&&S)),c||(c=!!v),d||(d=!!y),L||y&&!this.isAudioSupported(y)||v&&!this.isVideoSupported(v)){this.log(`Some or all CODECS not supported "${g.CODECS}"`);return}const{CODECS:O,"FRAME-RATE":I,"HDCP-LEVEL":j,"PATHWAY-ID":P,RESOLUTION:G,"VIDEO-RANGE":N}=g,k=`${`${P||"."}-`}${f.bitrate}-${G}-${I}-${O}-${N}-${j}`;if(r[k])if(r[k].uri!==f.url&&!f.attrs["PATHWAY-ID"]){const R=a[k]+=1;f.attrs["PATHWAY-ID"]=new Array(R+1).join(".");const Y=this.createLevel(f);r[k]=Y,n.push(Y)}else r[k].addGroupId("audio",g.AUDIO),r[k].addGroupId("text",g.SUBTITLES);else{const R=this.createLevel(f);r[k]=R,a[k]=1,n.push(R)}}),this.filterAndSortMediaOptions(n,t,u,c,d)}createLevel(e){const t=new $h(e),i=e.supplemental;if(i!=null&&i.videoCodec&&!this.isVideoSupported(i.videoCodec)){const n=new Error(`SUPPLEMENTAL-CODECS not supported "${i.videoCodec}"`);this.log(n.message),t.supportedResult=mL(n,[])}return t}isAudioSupported(e){return Uh(e,"audio",this.hls.config.preferManagedMediaSource)}isVideoSupported(e){return Uh(e,"video",this.hls.config.preferManagedMediaSource)}filterAndSortMediaOptions(e,t,i,n,r){var a;let u=[],c=[],d=e;const f=((a=t.stats)==null?void 0:a.parsing)||{};if((i||n)&&r&&(d=d.filter(({videoCodec:O,videoRange:I,width:j,height:P})=>(!!O||!!(j&&P))&&OU(I))),d.length===0){Promise.resolve().then(()=>{if(this.hls){let O="no level with compatible codecs found in manifest",I=O;t.levels.length&&(I=`one or more CODECS in variant not supported: ${ks(t.levels.map(P=>P.attrs.CODECS).filter((P,G,N)=>N.indexOf(P)===G))}`,this.warn(I),O+=` (${I})`);const j=new Error(O);this.hls.trigger(H.ERROR,{type:Vt.MEDIA_ERROR,details:$e.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:t.url,error:j,reason:I})}}),f.end=performance.now();return}t.audioTracks&&(u=t.audioTracks.filter(O=>!O.audioCodec||this.isAudioSupported(O.audioCodec)),cA(u)),t.subtitles&&(c=t.subtitles,cA(c));const g=d.slice(0);d.sort((O,I)=>{if(O.attrs["HDCP-LEVEL"]!==I.attrs["HDCP-LEVEL"])return(O.attrs["HDCP-LEVEL"]||"")>(I.attrs["HDCP-LEVEL"]||"")?1:-1;if(i&&O.height!==I.height)return O.height-I.height;if(O.frameRate!==I.frameRate)return O.frameRate-I.frameRate;if(O.videoRange!==I.videoRange)return z0.indexOf(O.videoRange)-z0.indexOf(I.videoRange);if(O.videoCodec!==I.videoCodec){const j=tw(O.videoCodec),P=tw(I.videoCodec);if(j!==P)return P-j}if(O.uri===I.uri&&O.codecSet!==I.codecSet){const j=$0(O.codecSet),P=$0(I.codecSet);if(j!==P)return P-j}return O.averageBitrate!==I.averageBitrate?O.averageBitrate-I.averageBitrate:0});let y=g[0];if(this.steering&&(d=this.steering.filterParsedLevels(d),d.length!==g.length)){for(let O=0;Oj&&j===this.hls.abrEwmaDefaultEstimate&&(this.hls.bandwidthEstimate=P)}break}const T=r&&!n,S=this.hls.config,w=!!(S.audioStreamController&&S.audioTrackController),L={levels:d,audioTracks:u,subtitleTracks:c,sessionData:t.sessionData,sessionKeys:t.sessionKeys,firstLevel:this._firstLevel,stats:t.stats,audio:r,video:n,altAudio:w&&!T&&u.some(O=>!!O.url)};f.end=performance.now(),this.hls.trigger(H.MANIFEST_PARSED,L)}get levels(){return this._levels.length===0?null:this._levels}get loadLevelObj(){return this.currentLevel}get level(){return this.currentLevelIndex}set level(e){const t=this._levels;if(t.length===0)return;if(e<0||e>=t.length){const f=new Error("invalid level idx"),g=e<0;if(this.hls.trigger(H.ERROR,{type:Vt.OTHER_ERROR,details:$e.LEVEL_SWITCH_ERROR,level:e,fatal:g,error:f,reason:f.message}),g)return;e=Math.min(e,t.length-1)}const i=this.currentLevelIndex,n=this.currentLevel,r=n?n.attrs["PATHWAY-ID"]:void 0,a=t[e],u=a.attrs["PATHWAY-ID"];if(this.currentLevelIndex=e,this.currentLevel=a,i===e&&n&&r===u)return;this.log(`Switching to level ${e} (${a.height?a.height+"p ":""}${a.videoRange?a.videoRange+" ":""}${a.codecSet?a.codecSet+" ":""}@${a.bitrate})${u?" with Pathway "+u:""} from level ${i}${r?" with Pathway "+r:""}`);const c={level:e,attrs:a.attrs,details:a.details,bitrate:a.bitrate,averageBitrate:a.averageBitrate,maxBitrate:a.maxBitrate,realBitrate:a.realBitrate,width:a.width,height:a.height,codecSet:a.codecSet,audioCodec:a.audioCodec,videoCodec:a.videoCodec,audioGroups:a.audioGroups,subtitleGroups:a.subtitleGroups,loaded:a.loaded,loadError:a.loadError,fragmentError:a.fragmentError,name:a.name,id:a.id,uri:a.uri,url:a.url,urlId:0,audioGroupIds:a.audioGroupIds,textGroupIds:a.textGroupIds};this.hls.trigger(H.LEVEL_SWITCHING,c);const d=a.details;if(!d||d.live){const f=this.switchParams(a.uri,n?.details,d);this.loadPlaylist(f)}}get manualLevel(){return this.manualLevelIndex}set manualLevel(e){this.manualLevelIndex=e,this._startLevel===void 0&&(this._startLevel=e),e!==-1&&(this.level=e)}get firstLevel(){return this._firstLevel}set firstLevel(e){this._firstLevel=e}get startLevel(){if(this._startLevel===void 0){const e=this.hls.config.startLevel;return e!==void 0?e:this.hls.firstAutoLevel}return this._startLevel}set startLevel(e){this._startLevel=e}get pathways(){return this.steering?this.steering.pathways():[]}get pathwayPriority(){return this.steering?this.steering.pathwayPriority:null}set pathwayPriority(e){if(this.steering){const t=this.steering.pathways(),i=e.filter(n=>t.indexOf(n)!==-1);if(e.length<1){this.warn(`pathwayPriority ${e} should contain at least one pathway from list: ${t}`);return}this.steering.pathwayPriority=i}}onError(e,t){t.fatal||!t.context||t.context.type===Ii.LEVEL&&t.context.level===this.level&&this.checkRetry(t)}onFragBuffered(e,{frag:t}){if(t!==void 0&&t.type===jt.MAIN){const i=t.elementaryStreams;if(!Object.keys(i).some(r=>!!i[r]))return;const n=this._levels[t.level];n!=null&&n.loadError&&(this.log(`Resetting level error count of ${n.loadError} on frag buffered`),n.loadError=0)}}onLevelLoaded(e,t){var i;const{level:n,details:r}=t,a=t.levelInfo;if(!a){var u;this.warn(`Invalid level index ${n}`),(u=t.deliveryDirectives)!=null&&u.skip&&(r.deltaUpdateFailed=!0);return}if(a===this.currentLevel||t.withoutMultiVariant){a.fragmentError===0&&(a.loadError=0);let c=a.details;c===t.details&&c.advanced&&(c=void 0),this.playlistLoaded(n,t,c)}else(i=t.deliveryDirectives)!=null&&i.skip&&(r.deltaUpdateFailed=!0)}loadPlaylist(e){super.loadPlaylist(),this.shouldLoadPlaylist(this.currentLevel)&&this.scheduleLoading(this.currentLevel,e)}loadingPlaylist(e,t){super.loadingPlaylist(e,t);const i=this.getUrlWithDirectives(e.uri,t),n=this.currentLevelIndex,r=e.attrs["PATHWAY-ID"],a=e.details,u=a?.age;this.log(`Loading level index ${n}${t?.msn!==void 0?" at sn "+t.msn+" part "+t.part:""}${r?" Pathway "+r:""}${u&&a.live?" age "+u.toFixed(1)+(a.type&&" "+a.type||""):""} ${i}`),this.hls.trigger(H.LEVEL_LOADING,{url:i,level:n,levelInfo:e,pathwayId:e.attrs["PATHWAY-ID"],id:0,deliveryDirectives:t||null})}get nextLoadLevel(){return this.manualLevelIndex!==-1?this.manualLevelIndex:this.hls.nextAutoLevel}set nextLoadLevel(e){this.level=e,this.manualLevelIndex===-1&&(this.hls.nextAutoLevel=e)}removeLevel(e){var t;if(this._levels.length===1)return;const i=this._levels.filter((r,a)=>a!==e?!0:(this.steering&&this.steering.removeLevel(r),r===this.currentLevel&&(this.currentLevel=null,this.currentLevelIndex=-1,r.details&&r.details.fragments.forEach(u=>u.level=-1)),!1));ML(i),this._levels=i,this.currentLevelIndex>-1&&(t=this.currentLevel)!=null&&t.details&&(this.currentLevelIndex=this.currentLevel.details.fragments[0].level),this.manualLevelIndex>-1&&(this.manualLevelIndex=this.currentLevelIndex);const n=i.length-1;this._firstLevel=Math.min(this._firstLevel,n),this._startLevel&&(this._startLevel=Math.min(this._startLevel,n)),this.hls.trigger(H.LEVELS_UPDATED,{levels:i})}onLevelsUpdated(e,{levels:t}){this._levels=t}checkMaxAutoUpdated(){const{autoLevelCapping:e,maxAutoLevel:t,maxHdcpLevel:i}=this.hls;this._maxAutoLevel!==t&&(this._maxAutoLevel=t,this.hls.trigger(H.MAX_AUTO_LEVEL_UPDATED,{autoLevelCapping:e,levels:this.levels,maxAutoLevel:t,minAutoLevel:this.hls.minAutoLevel,maxHdcpLevel:i}))}}function cA(s){const e={};s.forEach(t=>{const i=t.groupId||"";t.id=e[i]=e[i]||0,e[i]++})}function LR(){return self.SourceBuffer||self.WebKitSourceBuffer}function RR(){if(!Ll())return!1;const e=LR();return!e||e.prototype&&typeof e.prototype.appendBuffer=="function"&&typeof e.prototype.remove=="function"}function z$(){if(!RR())return!1;const s=Ll();return typeof s?.isTypeSupported=="function"&&(["avc1.42E01E,mp4a.40.2","av01.0.01M.08","vp09.00.50.08"].some(e=>s.isTypeSupported(jh(e,"video")))||["mp4a.40.2","fLaC"].some(e=>s.isTypeSupported(jh(e,"audio"))))}function V$(){var s;const e=LR();return typeof(e==null||(s=e.prototype)==null?void 0:s.changeType)=="function"}const G$=100;class q$ extends h1{constructor(e,t,i){super(e,t,i,"stream-controller",jt.MAIN),this.audioCodecSwap=!1,this.level=-1,this._forceStartLoad=!1,this._hasEnoughToStart=!1,this.altAudio=0,this.audioOnly=!1,this.fragPlaying=null,this.fragLastKbps=0,this.couldBacktrack=!1,this.backtrackFragment=null,this.audioCodecSwitch=!1,this.videoBuffer=null,this.onMediaPlaying=()=>{this.tick()},this.onMediaSeeked=()=>{const n=this.media,r=n?n.currentTime:null;if(r===null||!Ot(r)||(this.log(`Media seeked to ${r.toFixed(3)}`),!this.getBufferedFrag(r)))return;const a=this.getFwdBufferInfoAtPos(n,r,jt.MAIN,0);if(a===null||a.len===0){this.warn(`Main forward buffer length at ${r} on "seeked" event ${a?a.len:"empty"})`);return}this.tick()},this.registerListeners()}registerListeners(){super.registerListeners();const{hls:e}=this;e.on(H.MANIFEST_PARSED,this.onManifestParsed,this),e.on(H.LEVEL_LOADING,this.onLevelLoading,this),e.on(H.LEVEL_LOADED,this.onLevelLoaded,this),e.on(H.FRAG_LOAD_EMERGENCY_ABORTED,this.onFragLoadEmergencyAborted,this),e.on(H.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),e.on(H.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),e.on(H.BUFFER_CREATED,this.onBufferCreated,this),e.on(H.BUFFER_FLUSHED,this.onBufferFlushed,this),e.on(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.on(H.FRAG_BUFFERED,this.onFragBuffered,this)}unregisterListeners(){super.unregisterListeners();const{hls:e}=this;e.off(H.MANIFEST_PARSED,this.onManifestParsed,this),e.off(H.LEVEL_LOADED,this.onLevelLoaded,this),e.off(H.FRAG_LOAD_EMERGENCY_ABORTED,this.onFragLoadEmergencyAborted,this),e.off(H.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),e.off(H.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),e.off(H.BUFFER_CREATED,this.onBufferCreated,this),e.off(H.BUFFER_FLUSHED,this.onBufferFlushed,this),e.off(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.off(H.FRAG_BUFFERED,this.onFragBuffered,this)}onHandlerDestroying(){this.onMediaPlaying=this.onMediaSeeked=null,this.unregisterListeners(),super.onHandlerDestroying()}startLoad(e,t){if(this.levels){const{lastCurrentTime:i,hls:n}=this;if(this.stopLoad(),this.setInterval(G$),this.level=-1,!this.startFragRequested){let r=n.startLevel;r===-1&&(n.config.testBandwidth&&this.levels.length>1?(r=0,this.bitrateTest=!0):r=n.firstAutoLevel),n.nextLoadLevel=r,this.level=n.loadLevel,this._hasEnoughToStart=!!t}i>0&&e===-1&&!t&&(this.log(`Override startPosition with lastCurrentTime @${i.toFixed(3)}`),e=i),this.state=ot.IDLE,this.nextLoadPosition=this.lastCurrentTime=e+this.timelineOffset,this.startPosition=t?-1:e,this.tick()}else this._forceStartLoad=!0,this.state=ot.STOPPED}stopLoad(){this._forceStartLoad=!1,super.stopLoad()}doTick(){switch(this.state){case ot.WAITING_LEVEL:{const{levels:e,level:t}=this,i=e?.[t],n=i?.details;if(n&&(!n.live||this.levelLastLoaded===i&&!this.waitForLive(i))){if(this.waitForCdnTuneIn(n))break;this.state=ot.IDLE;break}else if(this.hls.nextLoadLevel!==this.level){this.state=ot.IDLE;break}break}case ot.FRAG_LOADING_WAITING_RETRY:this.checkRetryDate();break}this.state===ot.IDLE&&this.doTickIdle(),this.onTickEnd()}onTickEnd(){var e;super.onTickEnd(),(e=this.media)!=null&&e.readyState&&this.media.seeking===!1&&(this.lastCurrentTime=this.media.currentTime),this.checkFragmentChanged()}doTickIdle(){const{hls:e,levelLastLoaded:t,levels:i,media:n}=this;if(t===null||!n&&!this.primaryPrefetch&&(this.startFragRequested||!e.config.startFragPrefetch)||this.altAudio&&this.audioOnly)return;const r=this.buffering?e.nextLoadLevel:e.loadLevel;if(!(i!=null&&i[r]))return;const a=i[r],u=this.getMainFwdBufferInfo();if(u===null)return;const c=this.getLevelDetails();if(c&&this._streamEnded(u,c)){const S={};this.altAudio===2&&(S.type="video"),this.hls.trigger(H.BUFFER_EOS,S),this.state=ot.ENDED;return}if(!this.buffering)return;e.loadLevel!==r&&e.manualLevel===-1&&this.log(`Adapting to level ${r} from level ${this.level}`),this.level=e.nextLoadLevel=r;const d=a.details;if(!d||this.state===ot.WAITING_LEVEL||this.waitForLive(a)){this.level=r,this.state=ot.WAITING_LEVEL,this.startFragRequested=!1;return}const f=u.len,g=this.getMaxBufferLength(a.maxBitrate);if(f>=g)return;this.backtrackFragment&&this.backtrackFragment.start>u.end&&(this.backtrackFragment=null);const y=this.backtrackFragment?this.backtrackFragment.start:u.end;let v=this.getNextFragment(y,d);if(this.couldBacktrack&&!this.fragPrevious&&v&&an(v)&&this.fragmentTracker.getState(v)!==Sn.OK){var T;const w=((T=this.backtrackFragment)!=null?T:v).sn-d.startSN,L=d.fragments[w-1];L&&v.cc===L.cc&&(v=L,this.fragmentTracker.removeFragment(L))}else this.backtrackFragment&&u.len&&(this.backtrackFragment=null);if(v&&this.isLoopLoading(v,y)){if(!v.gap){const w=this.audioOnly&&!this.altAudio?ws.AUDIO:ws.VIDEO,L=(w===ws.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media;L&&this.afterBufferFlushed(L,w,jt.MAIN)}v=this.getNextFragmentLoopLoading(v,d,u,jt.MAIN,g)}v&&(v.initSegment&&!v.initSegment.data&&!this.bitrateTest&&(v=v.initSegment),this.loadFragment(v,a,y))}loadFragment(e,t,i){const n=this.fragmentTracker.getState(e);n===Sn.NOT_LOADED||n===Sn.PARTIAL?an(e)?this.bitrateTest?(this.log(`Fragment ${e.sn} of level ${e.level} is being downloaded to test bitrate and will not be buffered`),this._loadBitrateTestFrag(e,t)):super.loadFragment(e,t,i):this._loadInitSegment(e,t):this.clearTrackerIfNeeded(e)}getBufferedFrag(e){return this.fragmentTracker.getBufferedFrag(e,jt.MAIN)}followingBufferedFrag(e){return e?this.getBufferedFrag(e.end+.5):null}immediateLevelSwitch(){this.abortCurrentFrag(),this.flushMainBuffer(0,Number.POSITIVE_INFINITY)}nextLevelSwitch(){const{levels:e,media:t}=this;if(t!=null&&t.readyState){let i;const n=this.getAppendedFrag(t.currentTime);n&&n.start>1&&this.flushMainBuffer(0,n.start-1);const r=this.getLevelDetails();if(r!=null&&r.live){const u=this.getMainFwdBufferInfo();if(!u||u.len=a-t.maxFragLookUpTolerance&&r<=u;if(n!==null&&i.duration>n&&(r{this.hls&&this.hls.trigger(H.AUDIO_TRACK_SWITCHED,t)}),i.trigger(H.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:null});return}i.trigger(H.AUDIO_TRACK_SWITCHED,t)}}onAudioTrackSwitched(e,t){const i=V0(t.url,this.hls);if(i){const n=this.videoBuffer;n&&this.mediaBuffer!==n&&(this.log("Switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=n)}this.altAudio=i?2:0,this.tick()}onBufferCreated(e,t){const i=t.tracks;let n,r,a=!1;for(const u in i){const c=i[u];if(c.id==="main"){if(r=u,n=c,u==="video"){const d=i[u];d&&(this.videoBuffer=d.buffer)}}else a=!0}a&&n?(this.log(`Alternate track found, use ${r}.buffered to schedule main fragment loading`),this.mediaBuffer=n.buffer):this.mediaBuffer=this.media}onFragBuffered(e,t){const{frag:i,part:n}=t,r=i.type===jt.MAIN;if(r){if(this.fragContextChanged(i)){this.warn(`Fragment ${i.sn}${n?" p: "+n.index:""} of level ${i.level} finished buffering, but was aborted. state: ${this.state}`),this.state===ot.PARSED&&(this.state=ot.IDLE);return}const u=n?n.stats:i.stats;this.fragLastKbps=Math.round(8*u.total/(u.buffering.end-u.loading.first)),an(i)&&(this.fragPrevious=i),this.fragBufferedComplete(i,n)}const a=this.media;a&&(!this._hasEnoughToStart&&gi.getBuffered(a).length&&(this._hasEnoughToStart=!0,this.seekToStartPos()),r&&this.tick())}get hasEnoughToStart(){return this._hasEnoughToStart}onError(e,t){var i;if(t.fatal){this.state=ot.ERROR;return}switch(t.details){case $e.FRAG_GAP:case $e.FRAG_PARSING_ERROR:case $e.FRAG_DECRYPT_ERROR:case $e.FRAG_LOAD_ERROR:case $e.FRAG_LOAD_TIMEOUT:case $e.KEY_LOAD_ERROR:case $e.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(jt.MAIN,t);break;case $e.LEVEL_LOAD_ERROR:case $e.LEVEL_LOAD_TIMEOUT:case $e.LEVEL_PARSING_ERROR:!t.levelRetry&&this.state===ot.WAITING_LEVEL&&((i=t.context)==null?void 0:i.type)===Ii.LEVEL&&(this.state=ot.IDLE);break;case $e.BUFFER_ADD_CODEC_ERROR:case $e.BUFFER_APPEND_ERROR:if(t.parent!=="main")return;this.reduceLengthAndFlushBuffer(t)&&this.resetLoadingState();break;case $e.BUFFER_FULL_ERROR:if(t.parent!=="main")return;this.reduceLengthAndFlushBuffer(t)&&(!this.config.interstitialsController&&this.config.assetPlayerId?this._hasEnoughToStart=!0:this.flushMainBuffer(0,Number.POSITIVE_INFINITY));break;case $e.INTERNAL_EXCEPTION:this.recoverWorkerError(t);break}}onFragLoadEmergencyAborted(){this.state=ot.IDLE,this._hasEnoughToStart||(this.startFragRequested=!1,this.nextLoadPosition=this.lastCurrentTime),this.tickImmediate()}onBufferFlushed(e,{type:t}){if(t!==ws.AUDIO||!this.altAudio){const i=(t===ws.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media;i&&(this.afterBufferFlushed(i,t,jt.MAIN),this.tick())}}onLevelsUpdated(e,t){this.level>-1&&this.fragCurrent&&(this.level=this.fragCurrent.level,this.level===-1&&this.resetWhenMissingContext(this.fragCurrent)),this.levels=t.levels}swapAudioCodec(){this.audioCodecSwap=!this.audioCodecSwap}seekToStartPos(){const{media:e}=this;if(!e)return;const t=e.currentTime;let i=this.startPosition;if(i>=0&&t0&&(c{const{hls:n}=this,r=i?.frag;if(!r||this.fragContextChanged(r))return;t.fragmentError=0,this.state=ot.IDLE,this.startFragRequested=!1,this.bitrateTest=!1;const a=r.stats;a.parsing.start=a.parsing.end=a.buffering.start=a.buffering.end=self.performance.now(),n.trigger(H.FRAG_LOADED,i),r.bitrateTest=!1}).catch(i=>{this.state===ot.STOPPED||this.state===ot.ERROR||(this.warn(i),this.resetFragmentLoading(e))})}_handleTransmuxComplete(e){const t=this.playlistType,{hls:i}=this,{remuxResult:n,chunkMeta:r}=e,a=this.getCurrentContext(r);if(!a){this.resetWhenMissingContext(r);return}const{frag:u,part:c,level:d}=a,{video:f,text:g,id3:y,initSegment:v}=n,{details:T}=d,S=this.altAudio?void 0:n.audio;if(this.fragContextChanged(u)){this.fragmentTracker.removeFragment(u);return}if(this.state=ot.PARSING,v){const w=v.tracks;if(w){const j=u.initSegment||u;if(this.unhandledEncryptionError(v,u))return;this._bufferInitSegment(d,w,j,r),i.trigger(H.FRAG_PARSING_INIT_SEGMENT,{frag:j,id:t,tracks:w})}const L=v.initPTS,O=v.timescale,I=this.initPTS[u.cc];if(Ot(L)&&(!I||I.baseTime!==L||I.timescale!==O)){const j=v.trackId;this.initPTS[u.cc]={baseTime:L,timescale:O,trackId:j},i.trigger(H.INIT_PTS_FOUND,{frag:u,id:t,initPTS:L,timescale:O,trackId:j})}}if(f&&T){S&&f.type==="audiovideo"&&this.logMuxedErr(u);const w=T.fragments[u.sn-1-T.startSN],L=u.sn===T.startSN,O=!w||u.cc>w.cc;if(n.independent!==!1){const{startPTS:I,endPTS:j,startDTS:P,endDTS:G}=f;if(c)c.elementaryStreams[f.type]={startPTS:I,endPTS:j,startDTS:P,endDTS:G};else if(f.firstKeyFrame&&f.independent&&r.id===1&&!O&&(this.couldBacktrack=!0),f.dropped&&f.independent){const N=this.getMainFwdBufferInfo(),K=(N?N.end:this.getLoadPosition())+this.config.maxBufferHole,k=f.firstKeyFramePTS?f.firstKeyFramePTS:I;if(!L&&Kc0&&(u.gap=!0);u.setElementaryStreamInfo(f.type,I,j,P,G),this.backtrackFragment&&(this.backtrackFragment=u),this.bufferFragmentData(f,u,c,r,L||O)}else if(L||O)u.gap=!0;else{this.backtrack(u);return}}if(S){const{startPTS:w,endPTS:L,startDTS:O,endDTS:I}=S;c&&(c.elementaryStreams[ws.AUDIO]={startPTS:w,endPTS:L,startDTS:O,endDTS:I}),u.setElementaryStreamInfo(ws.AUDIO,w,L,O,I),this.bufferFragmentData(S,u,c,r)}if(T&&y!=null&&y.samples.length){const w={id:t,frag:u,details:T,samples:y.samples};i.trigger(H.FRAG_PARSING_METADATA,w)}if(T&&g){const w={id:t,frag:u,details:T,samples:g.samples};i.trigger(H.FRAG_PARSING_USERDATA,w)}}logMuxedErr(e){this.warn(`${an(e)?"Media":"Init"} segment with muxed audiovideo where only video expected: ${e.url}`)}_bufferInitSegment(e,t,i,n){if(this.state!==ot.PARSING)return;this.audioOnly=!!t.audio&&!t.video,this.altAudio&&!this.audioOnly&&(delete t.audio,t.audiovideo&&this.logMuxedErr(i));const{audio:r,video:a,audiovideo:u}=t;if(r){const d=e.audioCodec;let f=s0(r.codec,d);f==="mp4a"&&(f="mp4a.40.5");const g=navigator.userAgent.toLowerCase();if(this.audioCodecSwitch){f&&(f.indexOf("mp4a.40.5")!==-1?f="mp4a.40.2":f="mp4a.40.5");const y=r.metadata;y&&"channelCount"in y&&(y.channelCount||1)!==1&&g.indexOf("firefox")===-1&&(f="mp4a.40.5")}f&&f.indexOf("mp4a.40.5")!==-1&&g.indexOf("android")!==-1&&r.container!=="audio/mpeg"&&(f="mp4a.40.2",this.log(`Android: force audio codec to ${f}`)),d&&d!==f&&this.log(`Swapping manifest audio codec "${d}" for "${f}"`),r.levelCodec=f,r.id=jt.MAIN,this.log(`Init audio buffer, container:${r.container}, codecs[selected/level/parsed]=[${f||""}/${d||""}/${r.codec}]`),delete t.audiovideo}if(a){a.levelCodec=e.videoCodec,a.id=jt.MAIN;const d=a.codec;if(d?.length===4)switch(d){case"hvc1":case"hev1":a.codec="hvc1.1.6.L120.90";break;case"av01":a.codec="av01.0.04M.08";break;case"avc1":a.codec="avc1.42e01e";break}this.log(`Init video buffer, container:${a.container}, codecs[level/parsed]=[${e.videoCodec||""}/${d}]${a.codec!==d?" parsed-corrected="+a.codec:""}${a.supplemental?" supplemental="+a.supplemental:""}`),delete t.audiovideo}u&&(this.log(`Init audiovideo buffer, container:${u.container}, codecs[level/parsed]=[${e.codecs}/${u.codec}]`),delete t.video,delete t.audio);const c=Object.keys(t);if(c.length){if(this.hls.trigger(H.BUFFER_CODECS,t),!this.hls)return;c.forEach(d=>{const g=t[d].initSegment;g!=null&&g.byteLength&&this.hls.trigger(H.BUFFER_APPENDING,{type:d,data:g,frag:i,part:null,chunkMeta:n,parent:i.type})})}this.tickImmediate()}getMainFwdBufferInfo(){const e=this.mediaBuffer&&this.altAudio===2?this.mediaBuffer:this.media;return this.getFwdBufferInfo(e,jt.MAIN)}get maxBufferLength(){const{levels:e,level:t}=this,i=e?.[t];return i?this.getMaxBufferLength(i.maxBitrate):this.config.maxBufferLength}backtrack(e){this.couldBacktrack=!0,this.backtrackFragment=e,this.resetTransmuxer(),this.flushBufferGap(e),this.fragmentTracker.removeFragment(e),this.fragPrevious=null,this.nextLoadPosition=e.start,this.state=ot.IDLE}checkFragmentChanged(){const e=this.media;let t=null;if(e&&e.readyState>1&&e.seeking===!1){const i=e.currentTime;if(gi.isBuffered(e,i)?t=this.getAppendedFrag(i):gi.isBuffered(e,i+.1)&&(t=this.getAppendedFrag(i+.1)),t){this.backtrackFragment=null;const n=this.fragPlaying,r=t.level;(!n||t.sn!==n.sn||n.level!==r)&&(this.fragPlaying=t,this.hls.trigger(H.FRAG_CHANGED,{frag:t}),(!n||n.level!==r)&&this.hls.trigger(H.LEVEL_SWITCHED,{level:r}))}}}get nextLevel(){const e=this.nextBufferedFrag;return e?e.level:-1}get currentFrag(){var e;if(this.fragPlaying)return this.fragPlaying;const t=((e=this.media)==null?void 0:e.currentTime)||this.lastCurrentTime;return Ot(t)?this.getAppendedFrag(t):null}get currentProgramDateTime(){var e;const t=((e=this.media)==null?void 0:e.currentTime)||this.lastCurrentTime;if(Ot(t)){const i=this.getLevelDetails(),n=this.currentFrag||(i?Au(null,i.fragments,t):null);if(n){const r=n.programDateTime;if(r!==null){const a=r+(t-n.start)*1e3;return new Date(a)}}}return null}get currentLevel(){const e=this.currentFrag;return e?e.level:-1}get nextBufferedFrag(){const e=this.currentFrag;return e?this.followingBufferedFrag(e):null}get forceStartLoad(){return this._forceStartLoad}}class K$ extends ra{constructor(e,t){super("key-loader",t),this.config=void 0,this.keyIdToKeyInfo={},this.emeController=null,this.config=e}abort(e){for(const i in this.keyIdToKeyInfo){const n=this.keyIdToKeyInfo[i].loader;if(n){var t;if(e&&e!==((t=n.context)==null?void 0:t.frag.type))return;n.abort()}}}detach(){for(const e in this.keyIdToKeyInfo){const t=this.keyIdToKeyInfo[e];(t.mediaKeySessionContext||t.decryptdata.isCommonEncryption)&&delete this.keyIdToKeyInfo[e]}}destroy(){this.detach();for(const e in this.keyIdToKeyInfo){const t=this.keyIdToKeyInfo[e].loader;t&&t.destroy()}this.keyIdToKeyInfo={}}createKeyLoadError(e,t=$e.KEY_LOAD_ERROR,i,n,r){return new _o({type:Vt.NETWORK_ERROR,details:t,fatal:!1,frag:e,response:r,error:i,networkDetails:n})}loadClear(e,t,i){if(this.emeController&&this.config.emeEnabled&&!this.emeController.getSelectedKeySystemFormats().length){if(t.length)for(let n=0,r=t.length;n{if(!this.emeController)return;a.setKeyFormat(u);const c=r0(u);if(c)return this.emeController.getKeySystemAccess([c])})}if(this.config.requireKeySystemAccessOnStart){const n=ph(this.config);if(n.length)return this.emeController.getKeySystemAccess(n)}}return null}load(e){return!e.decryptdata&&e.encrypted&&this.emeController&&this.config.emeEnabled?this.emeController.selectKeySystemFormat(e).then(t=>this.loadInternal(e,t)):this.loadInternal(e)}loadInternal(e,t){var i,n;t&&e.setKeyFormat(t);const r=e.decryptdata;if(!r){const d=new Error(t?`Expected frag.decryptdata to be defined after setting format ${t}`:`Missing decryption data on fragment in onKeyLoading (emeEnabled with controller: ${this.emeController&&this.config.emeEnabled})`);return Promise.reject(this.createKeyLoadError(e,$e.KEY_LOAD_ERROR,d))}const a=r.uri;if(!a)return Promise.reject(this.createKeyLoadError(e,$e.KEY_LOAD_ERROR,new Error(`Invalid key URI: "${a}"`)));const u=Kv(r);let c=this.keyIdToKeyInfo[u];if((i=c)!=null&&i.decryptdata.key)return r.key=c.decryptdata.key,Promise.resolve({frag:e,keyInfo:c});if(this.emeController&&(n=c)!=null&&n.keyLoadPromise)switch(this.emeController.getKeyStatus(c.decryptdata)){case"usable":case"usable-in-future":return c.keyLoadPromise.then(f=>{const{keyInfo:g}=f;return r.key=g.decryptdata.key,{frag:e,keyInfo:g}})}switch(this.log(`${this.keyIdToKeyInfo[u]?"Rel":"L"}oading${r.keyId?" keyId: "+zn(r.keyId):""} URI: ${r.uri} from ${e.type} ${e.level}`),c=this.keyIdToKeyInfo[u]={decryptdata:r,keyLoadPromise:null,loader:null,mediaKeySessionContext:null},r.method){case"SAMPLE-AES":case"SAMPLE-AES-CENC":case"SAMPLE-AES-CTR":return r.keyFormat==="identity"?this.loadKeyHTTP(c,e):this.loadKeyEME(c,e);case"AES-128":case"AES-256":case"AES-256-CTR":return this.loadKeyHTTP(c,e);default:return Promise.reject(this.createKeyLoadError(e,$e.KEY_LOAD_ERROR,new Error(`Key supplied with unsupported METHOD: "${r.method}"`)))}}loadKeyEME(e,t){const i={frag:t,keyInfo:e};if(this.emeController&&this.config.emeEnabled){var n;if(!e.decryptdata.keyId&&(n=t.initSegment)!=null&&n.data){const a=hU(t.initSegment.data);if(a.length){let u=a[0];u.some(c=>c!==0)?(this.log(`Using keyId found in init segment ${zn(u)}`),kl.setKeyIdForUri(e.decryptdata.uri,u)):(u=kl.addKeyIdForUri(e.decryptdata.uri),this.log(`Generating keyId to patch media ${zn(u)}`)),e.decryptdata.keyId=u}}if(!e.decryptdata.keyId&&!an(t))return Promise.resolve(i);const r=this.emeController.loadKey(i);return(e.keyLoadPromise=r.then(a=>(e.mediaKeySessionContext=a,i))).catch(a=>{throw e.keyLoadPromise=null,"data"in a&&(a.data.frag=t),a})}return Promise.resolve(i)}loadKeyHTTP(e,t){const i=this.config,n=i.loader,r=new n(i);return t.keyLoader=e.loader=r,e.keyLoadPromise=new Promise((a,u)=>{const c={keyInfo:e,frag:t,responseType:"arraybuffer",url:e.decryptdata.uri},d=i.keyLoadPolicy.default,f={loadPolicy:d,timeout:d.maxLoadTimeMs,maxRetry:0,retryDelay:0,maxRetryDelay:0},g={onSuccess:(y,v,T,S)=>{const{frag:w,keyInfo:L}=T,O=Kv(L.decryptdata);if(!w.decryptdata||L!==this.keyIdToKeyInfo[O])return u(this.createKeyLoadError(w,$e.KEY_LOAD_ERROR,new Error("after key load, decryptdata unset or changed"),S));L.decryptdata.key=w.decryptdata.key=new Uint8Array(y.data),w.keyLoader=null,L.loader=null,a({frag:w,keyInfo:L})},onError:(y,v,T,S)=>{this.resetLoader(v),u(this.createKeyLoadError(t,$e.KEY_LOAD_ERROR,new Error(`HTTP Error ${y.code} loading key ${y.text}`),T,us({url:c.url,data:void 0},y)))},onTimeout:(y,v,T)=>{this.resetLoader(v),u(this.createKeyLoadError(t,$e.KEY_LOAD_TIMEOUT,new Error("key loading timed out"),T))},onAbort:(y,v,T)=>{this.resetLoader(v),u(this.createKeyLoadError(t,$e.INTERNAL_ABORTED,new Error("key loading aborted"),T))}};r.load(c,f,g)})}resetLoader(e){const{frag:t,keyInfo:i,url:n}=e,r=i.loader;t.keyLoader===r&&(t.keyLoader=null,i.loader=null);const a=Kv(i.decryptdata)||n;delete this.keyIdToKeyInfo[a],r&&r.destroy()}}function Kv(s){if(s.keyFormat!==Vn.FAIRPLAY){const e=s.keyId;if(e)return zn(e)}return s.uri}function dA(s){const{type:e}=s;switch(e){case Ii.AUDIO_TRACK:return jt.AUDIO;case Ii.SUBTITLE_TRACK:return jt.SUBTITLE;default:return jt.MAIN}}function Wv(s,e){let t=s.url;return(t===void 0||t.indexOf("data:")===0)&&(t=e.url),t}class W${constructor(e){this.hls=void 0,this.loaders=Object.create(null),this.variableList=null,this.onManifestLoaded=this.checkAutostartLoad,this.hls=e,this.registerListeners()}startLoad(e){}stopLoad(){this.destroyInternalLoaders()}registerListeners(){const{hls:e}=this;e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.LEVEL_LOADING,this.onLevelLoading,this),e.on(H.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),e.on(H.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this),e.on(H.LEVELS_UPDATED,this.onLevelsUpdated,this)}unregisterListeners(){const{hls:e}=this;e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.LEVEL_LOADING,this.onLevelLoading,this),e.off(H.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),e.off(H.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this),e.off(H.LEVELS_UPDATED,this.onLevelsUpdated,this)}createInternalLoader(e){const t=this.hls.config,i=t.pLoader,n=t.loader,r=i||n,a=new r(t);return this.loaders[e.type]=a,a}getInternalLoader(e){return this.loaders[e.type]}resetInternalLoader(e){this.loaders[e]&&delete this.loaders[e]}destroyInternalLoaders(){for(const e in this.loaders){const t=this.loaders[e];t&&t.destroy(),this.resetInternalLoader(e)}}destroy(){this.variableList=null,this.unregisterListeners(),this.destroyInternalLoaders()}onManifestLoading(e,t){const{url:i}=t;this.variableList=null,this.load({id:null,level:0,responseType:"text",type:Ii.MANIFEST,url:i,deliveryDirectives:null,levelOrTrack:null})}onLevelLoading(e,t){const{id:i,level:n,pathwayId:r,url:a,deliveryDirectives:u,levelInfo:c}=t;this.load({id:i,level:n,pathwayId:r,responseType:"text",type:Ii.LEVEL,url:a,deliveryDirectives:u,levelOrTrack:c})}onAudioTrackLoading(e,t){const{id:i,groupId:n,url:r,deliveryDirectives:a,track:u}=t;this.load({id:i,groupId:n,level:null,responseType:"text",type:Ii.AUDIO_TRACK,url:r,deliveryDirectives:a,levelOrTrack:u})}onSubtitleTrackLoading(e,t){const{id:i,groupId:n,url:r,deliveryDirectives:a,track:u}=t;this.load({id:i,groupId:n,level:null,responseType:"text",type:Ii.SUBTITLE_TRACK,url:r,deliveryDirectives:a,levelOrTrack:u})}onLevelsUpdated(e,t){const i=this.loaders[Ii.LEVEL];if(i){const n=i.context;n&&!t.levels.some(r=>r===n.levelOrTrack)&&(i.abort(),delete this.loaders[Ii.LEVEL])}}load(e){var t;const i=this.hls.config;let n=this.getInternalLoader(e);if(n){const d=this.hls.logger,f=n.context;if(f&&f.levelOrTrack===e.levelOrTrack&&(f.url===e.url||f.deliveryDirectives&&!e.deliveryDirectives)){f.url===e.url?d.log(`[playlist-loader]: ignore ${e.url} ongoing request`):d.log(`[playlist-loader]: ignore ${e.url} in favor of ${f.url}`);return}d.log(`[playlist-loader]: aborting previous loader for type: ${e.type}`),n.abort()}let r;if(e.type===Ii.MANIFEST?r=i.manifestLoadPolicy.default:r=ys({},i.playlistLoadPolicy.default,{timeoutRetry:null,errorRetry:null}),n=this.createInternalLoader(e),Ot((t=e.deliveryDirectives)==null?void 0:t.part)){let d;if(e.type===Ii.LEVEL&&e.level!==null?d=this.hls.levels[e.level].details:e.type===Ii.AUDIO_TRACK&&e.id!==null?d=this.hls.audioTracks[e.id].details:e.type===Ii.SUBTITLE_TRACK&&e.id!==null&&(d=this.hls.subtitleTracks[e.id].details),d){const f=d.partTarget,g=d.targetduration;if(f&&g){const y=Math.max(f*3,g*.8)*1e3;r=ys({},r,{maxTimeToFirstByteMs:Math.min(y,r.maxTimeToFirstByteMs),maxLoadTimeMs:Math.min(y,r.maxTimeToFirstByteMs)})}}}const a=r.errorRetry||r.timeoutRetry||{},u={loadPolicy:r,timeout:r.maxLoadTimeMs,maxRetry:a.maxNumRetry||0,retryDelay:a.retryDelayMs||0,maxRetryDelay:a.maxRetryDelayMs||0},c={onSuccess:(d,f,g,y)=>{const v=this.getInternalLoader(g);this.resetInternalLoader(g.type);const T=d.data;f.parsing.start=performance.now(),qa.isMediaPlaylist(T)||g.type!==Ii.MANIFEST?this.handleTrackOrLevelPlaylist(d,f,g,y||null,v):this.handleMasterPlaylist(d,f,g,y)},onError:(d,f,g,y)=>{this.handleNetworkError(f,g,!1,d,y)},onTimeout:(d,f,g)=>{this.handleNetworkError(f,g,!0,void 0,d)}};n.load(e,u,c)}checkAutostartLoad(){if(!this.hls)return;const{config:{autoStartLoad:e,startPosition:t},forceStartLoad:i}=this.hls;(e||i)&&(this.hls.logger.log(`${e?"auto":"force"} startLoad with configured startPosition ${t}`),this.hls.startLoad(t))}handleMasterPlaylist(e,t,i,n){const r=this.hls,a=e.data,u=Wv(e,i),c=qa.parseMasterPlaylist(a,u);if(c.playlistParsingError){t.parsing.end=performance.now(),this.handleManifestParsingError(e,i,c.playlistParsingError,n,t);return}const{contentSteering:d,levels:f,sessionData:g,sessionKeys:y,startTimeOffset:v,variableList:T}=c;this.variableList=T,f.forEach(O=>{const{unknownCodecs:I}=O;if(I){const{preferManagedMediaSource:j}=this.hls.config;let{audioCodec:P,videoCodec:G}=O;for(let N=I.length;N--;){const K=I[N];Uh(K,"audio",j)?(O.audioCodec=P=P?`${P},${K}`:K,Gc.audio[P.substring(0,4)]=2,I.splice(N,1)):Uh(K,"video",j)&&(O.videoCodec=G=G?`${G},${K}`:K,Gc.video[G.substring(0,4)]=2,I.splice(N,1))}}});const{AUDIO:S=[],SUBTITLES:w,"CLOSED-CAPTIONS":L}=qa.parseMasterPlaylistMedia(a,u,c);S.length&&!S.some(I=>!I.url)&&f[0].audioCodec&&!f[0].attrs.AUDIO&&(this.hls.logger.log("[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"),S.unshift({type:"main",name:"main",groupId:"main",default:!1,autoselect:!1,forced:!1,id:-1,attrs:new Hs({}),bitrate:0,url:""})),r.trigger(H.MANIFEST_LOADED,{levels:f,audioTracks:S,subtitles:w,captions:L,contentSteering:d,url:u,stats:t,networkDetails:n,sessionData:g,sessionKeys:y,startTimeOffset:v,variableList:T})}handleTrackOrLevelPlaylist(e,t,i,n,r){const a=this.hls,{id:u,level:c,type:d}=i,f=Wv(e,i),g=Ot(c)?c:Ot(u)?u:0,y=dA(i),v=qa.parseLevelPlaylist(e.data,f,g,y,0,this.variableList);if(d===Ii.MANIFEST){const T={attrs:new Hs({}),bitrate:0,details:v,name:"",url:f};v.requestScheduled=t.loading.start+IL(v,0),a.trigger(H.MANIFEST_LOADED,{levels:[T],audioTracks:[],url:f,stats:t,networkDetails:n,sessionData:null,sessionKeys:null,contentSteering:null,startTimeOffset:null,variableList:null})}t.parsing.end=performance.now(),i.levelDetails=v,this.handlePlaylistLoaded(v,e,t,i,n,r)}handleManifestParsingError(e,t,i,n,r){this.hls.trigger(H.ERROR,{type:Vt.NETWORK_ERROR,details:$e.MANIFEST_PARSING_ERROR,fatal:t.type===Ii.MANIFEST,url:e.url,err:i,error:i,reason:i.message,response:e,context:t,networkDetails:n,stats:r})}handleNetworkError(e,t,i=!1,n,r){let a=`A network ${i?"timeout":"error"+(n?" (status "+n.code+")":"")} occurred while loading ${e.type}`;e.type===Ii.LEVEL?a+=`: ${e.level} id: ${e.id}`:(e.type===Ii.AUDIO_TRACK||e.type===Ii.SUBTITLE_TRACK)&&(a+=` id: ${e.id} group-id: "${e.groupId}"`);const u=new Error(a);this.hls.logger.warn(`[playlist-loader]: ${a}`);let c=$e.UNKNOWN,d=!1;const f=this.getInternalLoader(e);switch(e.type){case Ii.MANIFEST:c=i?$e.MANIFEST_LOAD_TIMEOUT:$e.MANIFEST_LOAD_ERROR,d=!0;break;case Ii.LEVEL:c=i?$e.LEVEL_LOAD_TIMEOUT:$e.LEVEL_LOAD_ERROR,d=!1;break;case Ii.AUDIO_TRACK:c=i?$e.AUDIO_TRACK_LOAD_TIMEOUT:$e.AUDIO_TRACK_LOAD_ERROR,d=!1;break;case Ii.SUBTITLE_TRACK:c=i?$e.SUBTITLE_TRACK_LOAD_TIMEOUT:$e.SUBTITLE_LOAD_ERROR,d=!1;break}f&&this.resetInternalLoader(e.type);const g={type:Vt.NETWORK_ERROR,details:c,fatal:d,url:e.url,loader:f,context:e,error:u,networkDetails:t,stats:r};if(n){const y=t?.url||e.url;g.response=us({url:y,data:void 0},n)}this.hls.trigger(H.ERROR,g)}handlePlaylistLoaded(e,t,i,n,r,a){const u=this.hls,{type:c,level:d,levelOrTrack:f,id:g,groupId:y,deliveryDirectives:v}=n,T=Wv(t,n),S=dA(n);let w=typeof n.level=="number"&&S===jt.MAIN?d:void 0;const L=e.playlistParsingError;if(L){if(this.hls.logger.warn(`${L} ${e.url}`),!u.config.ignorePlaylistParsingErrors){u.trigger(H.ERROR,{type:Vt.NETWORK_ERROR,details:$e.LEVEL_PARSING_ERROR,fatal:!1,url:T,error:L,reason:L.message,response:t,context:n,level:w,parent:S,networkDetails:r,stats:i});return}e.playlistParsingError=null}if(!e.fragments.length){const O=e.playlistParsingError=new Error("No Segments found in Playlist");u.trigger(H.ERROR,{type:Vt.NETWORK_ERROR,details:$e.LEVEL_EMPTY_ERROR,fatal:!1,url:T,error:O,reason:O.message,response:t,context:n,level:w,parent:S,networkDetails:r,stats:i});return}switch(e.live&&a&&(a.getCacheAge&&(e.ageHeader=a.getCacheAge()||0),(!a.getCacheAge||isNaN(e.ageHeader))&&(e.ageHeader=0)),c){case Ii.MANIFEST:case Ii.LEVEL:if(w){if(!f)w=0;else if(f!==u.levels[w]){const O=u.levels.indexOf(f);O>-1&&(w=O)}}u.trigger(H.LEVEL_LOADED,{details:e,levelInfo:f||u.levels[0],level:w||0,id:g||0,stats:i,networkDetails:r,deliveryDirectives:v,withoutMultiVariant:c===Ii.MANIFEST});break;case Ii.AUDIO_TRACK:u.trigger(H.AUDIO_TRACK_LOADED,{details:e,track:f,id:g||0,groupId:y||"",stats:i,networkDetails:r,deliveryDirectives:v});break;case Ii.SUBTITLE_TRACK:u.trigger(H.SUBTITLE_TRACK_LOADED,{details:e,track:f,id:g||0,groupId:y||"",stats:i,networkDetails:r,deliveryDirectives:v});break}}}class $r{static get version(){return Hh}static isMSESupported(){return RR()}static isSupported(){return z$()}static getMediaSource(){return Ll()}static get Events(){return H}static get MetadataSchema(){return jr}static get ErrorTypes(){return Vt}static get ErrorDetails(){return $e}static get DefaultConfig(){return $r.defaultConfig?$r.defaultConfig:R$}static set DefaultConfig(e){$r.defaultConfig=e}constructor(e={}){this.config=void 0,this.userConfig=void 0,this.logger=void 0,this.coreComponents=void 0,this.networkControllers=void 0,this._emitter=new f1,this._autoLevelCapping=-1,this._maxHdcpLevel=null,this.abrController=void 0,this.bufferController=void 0,this.capLevelController=void 0,this.latencyController=void 0,this.levelController=void 0,this.streamController=void 0,this.audioStreamController=void 0,this.subtititleStreamController=void 0,this.audioTrackController=void 0,this.subtitleTrackController=void 0,this.interstitialsController=void 0,this.gapController=void 0,this.emeController=void 0,this.cmcdController=void 0,this._media=null,this._url=null,this._sessionId=void 0,this.triggeringException=void 0,this.started=!1;const t=this.logger=eU(e.debug||!1,"Hls instance",e.assetPlayerId),i=this.config=N$($r.DefaultConfig,e,t);this.userConfig=e,i.progressive&&O$(i,t);const{abrController:n,bufferController:r,capLevelController:a,errorController:u,fpsController:c}=i,d=new u(this),f=this.abrController=new n(this),g=new YU(this),y=i.interstitialsController,v=y?this.interstitialsController=new y(this,$r):null,T=this.bufferController=new r(this,g),S=this.capLevelController=new a(this),w=new c(this),L=new W$(this),O=i.contentSteeringController,I=O?new O(this):null,j=this.levelController=new H$(this,I),P=new j$(this),G=new K$(this.config,this.logger),N=this.streamController=new q$(this,g,G),K=this.gapController=new F$(this,g);S.setStreamController(N),w.setStreamController(N);const k=[L,j,N];v&&k.splice(1,0,v),I&&k.splice(1,0,I),this.networkControllers=k;const R=[f,T,K,S,w,P,g];this.audioTrackController=this.createController(i.audioTrackController,k);const Y=i.audioStreamController;Y&&k.push(this.audioStreamController=new Y(this,g,G)),this.subtitleTrackController=this.createController(i.subtitleTrackController,k);const z=i.subtitleStreamController;z&&k.push(this.subtititleStreamController=new z(this,g,G)),this.createController(i.timelineController,R),G.emeController=this.emeController=this.createController(i.emeController,R),this.cmcdController=this.createController(i.cmcdController,R),this.latencyController=this.createController($$,R),this.coreComponents=R,k.push(d);const X=d.onErrorOut;typeof X=="function"&&this.on(H.ERROR,X,d),this.on(H.MANIFEST_LOADED,L.onManifestLoaded,L)}createController(e,t){if(e){const i=new e(this);return t&&t.push(i),i}return null}on(e,t,i=this){this._emitter.on(e,t,i)}once(e,t,i=this){this._emitter.once(e,t,i)}removeAllListeners(e){this._emitter.removeAllListeners(e)}off(e,t,i=this,n){this._emitter.off(e,t,i,n)}listeners(e){return this._emitter.listeners(e)}emit(e,t,i){return this._emitter.emit(e,t,i)}trigger(e,t){if(this.config.debug)return this.emit(e,e,t);try{return this.emit(e,e,t)}catch(i){if(this.logger.error("An internal error happened while handling event "+e+'. Error message: "'+i.message+'". Here is a stacktrace:',i),!this.triggeringException){this.triggeringException=!0;const n=e===H.ERROR;this.trigger(H.ERROR,{type:Vt.OTHER_ERROR,details:$e.INTERNAL_EXCEPTION,fatal:n,event:e,error:i}),this.triggeringException=!1}}return!1}listenerCount(e){return this._emitter.listenerCount(e)}destroy(){this.logger.log("destroy"),this.trigger(H.DESTROYING,void 0),this.detachMedia(),this.removeAllListeners(),this._autoLevelCapping=-1,this._url=null,this.networkControllers.forEach(t=>t.destroy()),this.networkControllers.length=0,this.coreComponents.forEach(t=>t.destroy()),this.coreComponents.length=0;const e=this.config;e.xhrSetup=e.fetchSetup=void 0,this.userConfig=null}attachMedia(e){if(!e||"media"in e&&!e.media){const r=new Error(`attachMedia failed: invalid argument (${e})`);this.trigger(H.ERROR,{type:Vt.OTHER_ERROR,details:$e.ATTACH_MEDIA_ERROR,fatal:!0,error:r});return}this.logger.log("attachMedia"),this._media&&(this.logger.warn("media must be detached before attaching"),this.detachMedia());const t="media"in e,i=t?e.media:e,n=t?e:{media:i};this._media=i,this.trigger(H.MEDIA_ATTACHING,n)}detachMedia(){this.logger.log("detachMedia"),this.trigger(H.MEDIA_DETACHING,{}),this._media=null}transferMedia(){this._media=null;const e=this.bufferController.transferMedia();return this.trigger(H.MEDIA_DETACHING,{transferMedia:e}),e}loadSource(e){this.stopLoad();const t=this.media,i=this._url,n=this._url=i1.buildAbsoluteURL(self.location.href,e,{alwaysNormalize:!0});this._autoLevelCapping=-1,this._maxHdcpLevel=null,this.logger.log(`loadSource:${n}`),t&&i&&(i!==n||this.bufferController.hasSourceTypes())&&(this.detachMedia(),this.attachMedia(t)),this.trigger(H.MANIFEST_LOADING,{url:e})}get url(){return this._url}get hasEnoughToStart(){return this.streamController.hasEnoughToStart}get startPosition(){return this.streamController.startPositionValue}startLoad(e=-1,t){this.logger.log(`startLoad(${e+(t?", ":"")})`),this.started=!0,this.resumeBuffering();for(let i=0;i{e.resumeBuffering&&e.resumeBuffering()}))}pauseBuffering(){this.bufferingEnabled&&(this.logger.log("pause buffering"),this.networkControllers.forEach(e=>{e.pauseBuffering&&e.pauseBuffering()}))}get inFlightFragments(){const e={[jt.MAIN]:this.streamController.inFlightFrag};return this.audioStreamController&&(e[jt.AUDIO]=this.audioStreamController.inFlightFrag),this.subtititleStreamController&&(e[jt.SUBTITLE]=this.subtititleStreamController.inFlightFrag),e}swapAudioCodec(){this.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}recoverMediaError(){this.logger.log("recoverMediaError");const e=this._media,t=e?.currentTime;this.detachMedia(),e&&(this.attachMedia(e),t&&this.startLoad(t))}removeLevel(e){this.levelController.removeLevel(e)}get sessionId(){let e=this._sessionId;return e||(e=this._sessionId=F9()),e}get levels(){const e=this.levelController.levels;return e||[]}get latestLevelDetails(){return this.streamController.getLevelDetails()||null}get loadLevelObj(){return this.levelController.loadLevelObj}get currentLevel(){return this.streamController.currentLevel}set currentLevel(e){this.logger.log(`set currentLevel:${e}`),this.levelController.manualLevel=e,this.streamController.immediateLevelSwitch()}get nextLevel(){return this.streamController.nextLevel}set nextLevel(e){this.logger.log(`set nextLevel:${e}`),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}get loadLevel(){return this.levelController.level}set loadLevel(e){this.logger.log(`set loadLevel:${e}`),this.levelController.manualLevel=e}get nextLoadLevel(){return this.levelController.nextLoadLevel}set nextLoadLevel(e){this.levelController.nextLoadLevel=e}get firstLevel(){return Math.max(this.levelController.firstLevel,this.minAutoLevel)}set firstLevel(e){this.logger.log(`set firstLevel:${e}`),this.levelController.firstLevel=e}get startLevel(){const e=this.levelController.startLevel;return e===-1&&this.abrController.forcedAutoLevel>-1?this.abrController.forcedAutoLevel:e}set startLevel(e){this.logger.log(`set startLevel:${e}`),e!==-1&&(e=Math.max(e,this.minAutoLevel)),this.levelController.startLevel=e}get capLevelToPlayerSize(){return this.config.capLevelToPlayerSize}set capLevelToPlayerSize(e){const t=!!e;t!==this.config.capLevelToPlayerSize&&(t?this.capLevelController.startCapping():(this.capLevelController.stopCapping(),this.autoLevelCapping=-1,this.streamController.nextLevelSwitch()),this.config.capLevelToPlayerSize=t)}get autoLevelCapping(){return this._autoLevelCapping}get bandwidthEstimate(){const{bwEstimator:e}=this.abrController;return e?e.getEstimate():NaN}set bandwidthEstimate(e){this.abrController.resetEstimator(e)}get abrEwmaDefaultEstimate(){const{bwEstimator:e}=this.abrController;return e?e.defaultEstimate:NaN}get ttfbEstimate(){const{bwEstimator:e}=this.abrController;return e?e.getEstimateTTFB():NaN}set autoLevelCapping(e){this._autoLevelCapping!==e&&(this.logger.log(`set autoLevelCapping:${e}`),this._autoLevelCapping=e,this.levelController.checkMaxAutoUpdated())}get maxHdcpLevel(){return this._maxHdcpLevel}set maxHdcpLevel(e){NU(e)&&this._maxHdcpLevel!==e&&(this._maxHdcpLevel=e,this.levelController.checkMaxAutoUpdated())}get autoLevelEnabled(){return this.levelController.manualLevel===-1}get manualLevel(){return this.levelController.manualLevel}get minAutoLevel(){const{levels:e,config:{minAutoBitrate:t}}=this;if(!e)return 0;const i=e.length;for(let n=0;n=t)return n;return 0}get maxAutoLevel(){const{levels:e,autoLevelCapping:t,maxHdcpLevel:i}=this;let n;if(t===-1&&e!=null&&e.length?n=e.length-1:n=t,i)for(let r=n;r--;){const a=e[r].attrs["HDCP-LEVEL"];if(a&&a<=i)return r}return n}get firstAutoLevel(){return this.abrController.firstAutoLevel}get nextAutoLevel(){return this.abrController.nextAutoLevel}set nextAutoLevel(e){this.abrController.nextAutoLevel=e}get playingDate(){return this.streamController.currentProgramDateTime}get mainForwardBufferInfo(){return this.streamController.getMainFwdBufferInfo()}get maxBufferLength(){return this.streamController.maxBufferLength}setAudioOption(e){var t;return((t=this.audioTrackController)==null?void 0:t.setAudioOption(e))||null}setSubtitleOption(e){var t;return((t=this.subtitleTrackController)==null?void 0:t.setSubtitleOption(e))||null}get allAudioTracks(){const e=this.audioTrackController;return e?e.allAudioTracks:[]}get audioTracks(){const e=this.audioTrackController;return e?e.audioTracks:[]}get audioTrack(){const e=this.audioTrackController;return e?e.audioTrack:-1}set audioTrack(e){const t=this.audioTrackController;t&&(t.audioTrack=e)}get allSubtitleTracks(){const e=this.subtitleTrackController;return e?e.allSubtitleTracks:[]}get subtitleTracks(){const e=this.subtitleTrackController;return e?e.subtitleTracks:[]}get subtitleTrack(){const e=this.subtitleTrackController;return e?e.subtitleTrack:-1}get media(){return this._media}set subtitleTrack(e){const t=this.subtitleTrackController;t&&(t.subtitleTrack=e)}get subtitleDisplay(){const e=this.subtitleTrackController;return e?e.subtitleDisplay:!1}set subtitleDisplay(e){const t=this.subtitleTrackController;t&&(t.subtitleDisplay=e)}get lowLatencyMode(){return this.config.lowLatencyMode}set lowLatencyMode(e){this.config.lowLatencyMode=e}get liveSyncPosition(){return this.latencyController.liveSyncPosition}get latency(){return this.latencyController.latency}get maxLatency(){return this.latencyController.maxLatency}get targetLatency(){return this.latencyController.targetLatency}set targetLatency(e){this.latencyController.targetLatency=e}get drift(){return this.latencyController.drift}get forceStartLoad(){return this.streamController.forceStartLoad}get pathways(){return this.levelController.pathways}get pathwayPriority(){return this.levelController.pathwayPriority}set pathwayPriority(e){this.levelController.pathwayPriority=e}get bufferedToEnd(){var e;return!!((e=this.bufferController)!=null&&e.bufferedToEnd)}get interstitialsManager(){var e;return((e=this.interstitialsController)==null?void 0:e.interstitialsManager)||null}getMediaDecodingInfo(e,t=this.allAudioTracks){const i=yL(t);return pL(e,i,navigator.mediaCapabilities)}}$r.defaultConfig=void 0;function hA(s,e){const t=s.includes("?")?"&":"?";return`${s}${t}v=${e}`}function IR({src:s,muted:e=x0,className:t}){const i=b.useRef(null),[n,r]=b.useState(!1),[a,u]=b.useState(null),[c,d]=b.useState(1),f=b.useMemo(()=>hA(s,c),[s,c]);return b.useEffect(()=>{let g=!1,y=null,v=null,T=null;const S=i.current;if(!S)return;const w=S;r(!1),u(null),Nh(w,{muted:e});const L=()=>{v&&window.clearTimeout(v),T&&window.clearInterval(T),v=null,T=null},O=()=>{g||(L(),d(G=>G+1))};async function I(){const G=Date.now();for(;!g&&Date.now()-G<9e4;){try{const N=hA(s,Date.now()),K=await fetch(N,{cache:"no-store"});if(K.status===403)return{ok:!1,reason:"private"};if(K.status===404)return{ok:!1,reason:"offline"};if(K.ok&&(await K.text()).includes("#EXTINF"))return{ok:!0}}catch{}await new Promise(N=>setTimeout(N,500))}return{ok:!1}}async function j(){const G=await I();if(!g){if(!G.ok){if(G.reason==="private"||G.reason==="offline"){u(G.reason),r(!0);return}window.setTimeout(()=>{g||O()},800);return}if(w.canPlayType("application/vnd.apple.mpegurl")){w.pause(),w.removeAttribute("src"),w.load(),w.src=f,w.load(),w.play().catch(()=>{});let N=Date.now(),K=-1;const k=()=>{w.currentTime>K+.01&&(K=w.currentTime,N=Date.now())},R=()=>{v||(v=window.setTimeout(()=>{v=null,!g&&Date.now()-N>3500&&O()},800))};return w.addEventListener("timeupdate",k),w.addEventListener("waiting",R),w.addEventListener("stalled",R),w.addEventListener("error",R),T=window.setInterval(()=>{g||!w.paused&&Date.now()-N>6e3&&O()},2e3),()=>{w.removeEventListener("timeupdate",k),w.removeEventListener("waiting",R),w.removeEventListener("stalled",R),w.removeEventListener("error",R)}}if(!$r.isSupported()){r(!0);return}y=new $r({lowLatencyMode:!0,liveSyncDurationCount:2,maxBufferLength:8}),y.on($r.Events.ERROR,(N,K)=>{if(y&&K.fatal){if(K.type===$r.ErrorTypes.NETWORK_ERROR){y.startLoad();return}if(K.type===$r.ErrorTypes.MEDIA_ERROR){y.recoverMediaError();return}O()}}),y.loadSource(f),y.attachMedia(w),y.on($r.Events.MANIFEST_PARSED,()=>{w.play().catch(()=>{})})}}let P;return(async()=>{const G=await j();typeof G=="function"&&(P=G)})(),()=>{g=!0,L();try{P?.()}catch{}try{y?.destroy()}catch{}}},[s,e,f]),n?m.jsx("div",{className:"text-xs text-gray-400 italic",children:a==="private"?"Private":a==="offline"?"Offline":"–"}):m.jsx("video",{ref:i,className:t,playsInline:!0,autoPlay:!0,muted:e,preload:"auto",crossOrigin:"anonymous",onClick:()=>{const g=i.current;g&&(g.muted=!1,g.play().catch(()=>{}))}})}const Qr=s=>(s||"").replaceAll("\\","/").split("/").pop()||"",A1=s=>s.startsWith("HOT ")?s.slice(4):s,Y$=s=>(s||"").trim().toLowerCase(),X$=s=>{const e=String(s??"").trim();if(!e)return[];const t=e.split(/[\n,;|]+/g).map(r=>r.trim()).filter(Boolean),i=new Set,n=[];for(const r of t){const a=r.toLowerCase();i.has(a)||(i.add(a),n.push(r))}return n.sort((r,a)=>r.localeCompare(a,void 0,{sensitivity:"base"})),n};function Q$(s){if(!Number.isFinite(s)||s<=0)return"—";const e=Math.floor(s/1e3),t=Math.floor(e/3600),i=Math.floor(e%3600/60),n=e%60;return t>0?`${t}h ${i}m`:i>0?`${i}m ${n}s`:`${n}s`}function Z$(s){if(typeof s!="number"||!Number.isFinite(s)||s<=0)return"—";const e=["B","KB","MB","GB","TB"];let t=s,i=0;for(;t>=1024&&i=100?0:t>=10?1:2;return`${t.toFixed(n)} ${e[i]}`}function fA(s){if(!s)return"—";const e=s instanceof Date?s:new Date(s),t=e.getTime();return Number.isFinite(t)?e.toLocaleString(void 0,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"—"}const Km=(...s)=>{for(const e of s){const t=typeof e=="string"?Number(e):e;if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t}return null};function J$(s){if(!s||!Number.isFinite(s))return"—";const e=s>=10?0:2;return`${s.toFixed(e)} fps`}function eH(s){return!s||!Number.isFinite(s)?"—":`${Math.round(s)}p`}function tH(s){const e=Qr(s||""),t=A1(e);if(!t)return null;const n=t.replace(/\.[^.]+$/,"").match(/_(\d{1,2})_(\d{1,2})_(\d{4})__(\d{1,2})-(\d{2})-(\d{2})$/);if(!n)return null;const r=Number(n[1]),a=Number(n[2]),u=Number(n[3]),c=Number(n[4]),d=Number(n[5]),f=Number(n[6]);return[r,a,u,c,d,f].every(g=>Number.isFinite(g))?new Date(u,r-1,a,c,d,f):null}const iH=s=>{const e=Qr(s||""),t=A1(e);if(!t)return"—";const i=t.replace(/\.[^.]+$/,""),n=i.match(/^(.*?)_\d{1,2}_\d{1,2}_\d{4}__\d{1,2}-\d{2}-\d{2}$/);if(n?.[1])return n[1];const r=i.lastIndexOf("_");return r>0?i.slice(0,r):i},sH=s=>{const e=s,t=e.sizeBytes??e.fileSizeBytes??e.bytes??e.size??null;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:null};function bo(...s){return s.filter(Boolean).join(" ")}function nH(s){const[e,t]=b.useState(!1);return b.useEffect(()=>{if(typeof window>"u")return;const i=window.matchMedia(s),n=()=>t(i.matches);return n(),i.addEventListener?i.addEventListener("change",n):i.addListener(n),()=>{i.removeEventListener?i.removeEventListener("change",n):i.removeListener(n)}},[s]),e}function rH(s){!s||s.__absTimelineShimInstalled||(s.__absTimelineShimInstalled=!0,s.__origCurrentTime=s.currentTime.bind(s),s.__origDuration=s.duration.bind(s),s.__setRelativeTime=e=>{try{s.__origCurrentTime(Math.max(0,e||0))}catch{}},s.currentTime=function(e){const t=Number(this.__timeOffsetSec??0)||0;if(typeof e=="number"&&Number.isFinite(e)){const n=Math.max(0,e);return typeof this.__serverSeekAbs=="function"?(this.__serverSeekAbs(n),n):this.__origCurrentTime(Math.max(0,n-t))}const i=Number(this.__origCurrentTime()??0)||0;return Math.max(0,t+i)},s.duration=function(){const e=Number(this.__fullDurationSec??0)||0;if(e>0)return e;const t=Number(this.__timeOffsetSec??0)||0,i=Number(this.__origDuration()??0)||0;return Math.max(0,t+i)})}function aH({job:s,expanded:e,onClose:t,onToggleExpand:i,modelKey:n,modelsByKey:r,isHot:a=!1,isFavorite:u=!1,isLiked:c=!1,isWatching:d=!1,onKeep:f,onDelete:g,onToggleHot:y,onToggleFavorite:v,onToggleLike:T,onToggleWatch:S,onStopJob:w,startMuted:L=JM,startAtSec:O=0}){const I=b.useMemo(()=>Qr(s.output?.trim()||"")||s.id,[s.output,s.id]),j=b.useMemo(()=>Qr(s.output?.trim()||""),[s.output]),P=b.useMemo(()=>Qr(s.output?.trim()||""),[s.output]),G=b.useMemo(()=>Z$(sH(s)),[s]),N=s,[K,k]=b.useState(()=>Number(s?.meta?.durationSeconds)||Number(s?.durationSeconds)||0),[R,Y]=b.useState(()=>s.status==="running"),[z,X]=b.useState(()=>({h:0,fps:null})),re=s.status==="running",[J,W]=b.useState(!1),q=re&&J,Z=b.useMemo(()=>(P||"").replace(/\.[^.]+$/,""),[P]),te=b.useMemo(()=>re?s.id:Z||s.id,[re,s.id,Z]);b.useEffect(()=>{if(re||K>0)return;const me=Qr(s.output?.trim()||"");if(!me)return;let we=!0;const ue=new AbortController;return(async()=>{try{const pe=lu(`/api/record/done/meta?file=${encodeURIComponent(me)}`),xe=await Ev(pe,{signal:ue.signal,cache:"no-store"});if(!xe.ok)return;const Oe=await xe.json(),Q=Number(Oe?.durationSeconds||Oe?.meta?.durationSeconds||0)||0;if(!we||Q<=0)return;k(Q);const ne=Ze.current;if(ne&&!ne.isDisposed?.())try{ne.__fullDurationSec=Q,ne.trigger?.("durationchange"),ne.trigger?.("timeupdate")}catch{}}catch{}})(),()=>{we=!1,ue.abort()}},[re,K,s.output]);const oe=j.startsWith("HOT "),F=b.useMemo(()=>{const me=(n||"").trim();return me||iH(s.output)},[n,s.output]),le=b.useMemo(()=>A1(j),[j]),ge=b.useMemo(()=>{const me=Number(K||0)||0;return me>0?Q$(me*1e3):"—"},[K]),Ie=b.useMemo(()=>{const me=tH(s.output);if(me)return fA(me);const we=N.startedAt??N.endedAt??N.createdAt??N.fileCreatedAt??N.ctime??null,ue=we?new Date(we):null;return fA(ue&&Number.isFinite(ue.getTime())?ue:null)},[s.output,N.startedAt,N.endedAt,N.createdAt,N.fileCreatedAt,N.ctime]),Le=b.useMemo(()=>Y$((n||F||"").trim()),[n,F]),Pe=b.useMemo(()=>{const me=r?.[Le];return X$(me?.tags)},[r,Le]),Je=b.useMemo(()=>lu(`/api/preview?id=${encodeURIComponent(te)}&file=thumbs.webp`),[te]),Se=b.useMemo(()=>lu(`/api/preview?id=${encodeURIComponent(te)}&play=1&file=index_hq.m3u8`),[te]),[Re,Ve]=b.useState(Je);b.useEffect(()=>{Ve(Je)},[Je]);const Ee=b.useMemo(()=>Km(z.h,N.videoHeight,N.height,N.meta?.height),[z.h,N.videoHeight,N.height,N.meta?.height]),_e=b.useMemo(()=>Km(z.fps,N.fps,N.frameRate,N.meta?.fps,N.meta?.frameRate),[z.fps,N.fps,N.frameRate,N.meta?.fps,N.meta?.frameRate]),[yt,ut]=b.useState(null),pt=b.useMemo(()=>eH(yt??Ee),[yt,Ee]),Fe=b.useMemo(()=>J$(_e),[_e]);b.useEffect(()=>{const me=we=>we.key==="Escape"&&t();return window.addEventListener("keydown",me),()=>window.removeEventListener("keydown",me)},[t]);const _t=b.useMemo(()=>{const me=`/api/preview?id=${encodeURIComponent(te)}&file=index_hq.m3u8&play=1`;return lu(re?`${me}&t=${Date.now()}`:me)},[te,re]);b.useEffect(()=>{if(!re){W(!1);return}let me=!0;const we=new AbortController;return W(!1),(async()=>{for(let pe=0;pe<120&&me&&!we.signal.aborted;pe++){try{const xe=await Ev(_t,{method:"GET",cache:"no-store",signal:we.signal,headers:{"cache-control":"no-cache"}});if(xe.ok){const Oe=await xe.text(),Q=Oe.includes("#EXTM3U"),ne=/#EXTINF:/i.test(Oe)||/\.ts(\?|$)/i.test(Oe)||/\.m4s(\?|$)/i.test(Oe);if(Q&&ne){me&&W(!0);return}}}catch{}await new Promise(xe=>setTimeout(xe,500))}})(),()=>{me=!1,we.abort()}},[re,_t]);const Qe=b.useCallback(me=>{const we=new URLSearchParams;return me.file&&we.set("file",me.file),me.id&&we.set("id",me.id),lu(`/api/record/video?${we.toString()}`)},[]),Xe=b.useMemo(()=>{if(re)return{src:"",type:""};if(!R)return{src:"",type:""};const me=Qr(s.output?.trim()||"");if(me){const we=me.toLowerCase().split(".").pop(),ue=we==="mp4"?"video/mp4":we==="ts"?"video/mp2t":"application/octet-stream";return{src:Qe({file:me}),type:ue}}return{src:Qe({id:s.id}),type:"video/mp4"}},[re,R,s.output,s.id,Qe]),ze=b.useRef(null),Ze=b.useRef(null),ct=b.useRef(null),[St,se]=b.useState(!1),ke=b.useCallback(()=>{const me=Ze.current;if(!me||me.isDisposed?.())return;const we=typeof me.videoHeight=="function"?me.videoHeight():0;typeof we=="number"&&we>0&&Number.isFinite(we)&&ut(we)},[]),De=b.useCallback(()=>{try{const me=Ze.current?.tech?.(!0)?.el?.()||Ze.current?.el?.()?.querySelector?.("video.vjs-tech")||ct.current;if(!me||!(me instanceof HTMLVideoElement))return null;const we=Number(me.videoWidth||0),ue=Number(me.videoHeight||0);if(!Number.isFinite(we)||!Number.isFinite(ue)||we<=0||ue<=0)return null;let pe=Gi.current;pe||(pe=document.createElement("canvas"),Gi.current=pe);const Oe=Math.min(1,640/we),Q=Math.max(1,Math.round(we*Oe)),ne=Math.max(1,Math.round(ue*Oe));pe.width!==Q&&(pe.width=Q),pe.height!==ne&&(pe.height=ne);const ce=pe.getContext("2d",{alpha:!1});return ce?(ce.drawImage(me,0,0,Q,ne),pe.toDataURL("image/jpeg",.78)):null}catch{return null}},[]),Ue=b.useMemo(()=>Qr(s.output?.trim()||"")||s.id,[s.output,s.id]),at=b.useMemo(()=>{const me=Number(O);return Number.isFinite(me)&&me>=0?me:0},[O]),dt=b.useRef("");b.useEffect(()=>{if(re){Y(!0);return}const me=Qr(s.output?.trim()||"");if(!me){Y(!0);return}let we=!0;const ue=new AbortController;return Y(!1),(async()=>{for(let pe=0;pe<80&&we&&!ue.signal.aborted;pe++){try{const xe=lu(`/api/record/done/meta?file=${encodeURIComponent(me)}`),Oe=await Ev(xe,{signal:ue.signal,cache:"no-store"});if(Oe.ok){const Q=await Oe.json(),ne=!!Q?.metaExists,ce=Number(Q?.durationSeconds||0)||0,fe=Number(Q?.height||0)||0,Ne=Number(Q?.fps||0)||0;if(ce>0){k(ce);const We=Ze.current;if(We&&!We.isDisposed?.())try{We.__fullDurationSec=ce,We.trigger?.("durationchange"),We.trigger?.("timeupdate")}catch{}}if(fe>0&&X({h:fe,fps:Ne>0?Ne:null}),ne){Y(!0);return}}}catch{}await new Promise(xe=>setTimeout(xe,250))}we&&Y(!0)})(),()=>{we=!1,ue.abort()}},[re,Ue,s.output]);const[,wt]=b.useState(0);b.useEffect(()=>{if(typeof window>"u")return;const me=window.visualViewport;if(!me)return;const we=()=>wt(ue=>ue+1);return we(),me.addEventListener("resize",we),me.addEventListener("scroll",we),window.addEventListener("resize",we),window.addEventListener("orientationchange",we),()=>{me.removeEventListener("resize",we),me.removeEventListener("scroll",we),window.removeEventListener("resize",we),window.removeEventListener("orientationchange",we)}},[]);const[kt,Tt]=b.useState(30),[Ft,Qt]=b.useState(null),Zt=!e,Et=nH("(min-width: 640px)"),Dt=Zt&&Et,yi=e||Dt,Pi="player_window_v1",Jt=420,ki=280,gt=12,V=320,$=200;b.useEffect(()=>{if(!St)return;const me=Ze.current;if(!me||me.isDisposed?.())return;const we=me.el();if(!we)return;const ue=we.querySelector(".vjs-control-bar");if(!ue)return;const pe=()=>{const Oe=Math.round(ue.getBoundingClientRect().height||0);Oe>0&&Tt(Oe)};pe();let xe=null;return typeof ResizeObserver<"u"&&(xe=new ResizeObserver(pe),xe.observe(ue)),window.addEventListener("resize",pe),()=>{window.removeEventListener("resize",pe),xe?.disconnect()}},[St,e]),b.useEffect(()=>se(!0),[]),b.useEffect(()=>{if(!yi){Qt(null);return}let me=document.getElementById("player-root");me||(me=document.createElement("div"),me.id="player-root");let we=null;if(Et){const ue=Array.from(document.querySelectorAll("dialog[open]"));we=ue.length?ue[ue.length-1]:null}we=we??document.body,we.appendChild(me),me.style.position="relative",me.style.zIndex="2147483647",Qt(me)},[Et,yi]),b.useEffect(()=>{const me=Ze.current;if(!me||me.isDisposed?.()||re||(rH(me),!Qr(s.output?.trim()||"")))return;const ue=Number(K||0)||0;return ue>0&&(me.__fullDurationSec=ue),me.__serverSeekAbs=pe=>{const xe=Math.max(0,Number(pe)||0);try{me.__origCurrentTime?.(xe);try{me.trigger?.("timeupdate")}catch{}}catch{try{me.currentTime?.(xe)}catch{}}},()=>{try{delete me.__serverSeekAbs}catch{}}},[s.output,re]),b.useLayoutEffect(()=>{if(!St||!ze.current||Ze.current||re||!R)return;const me=document.createElement("video");me.className="video-js vjs-big-play-centered w-full h-full",me.setAttribute("playsinline","true"),ze.current.appendChild(me),ct.current=me;const we=He(me,{autoplay:!0,muted:L,controls:!0,preload:"metadata",playsinline:!0,responsive:!0,fluid:!1,fill:!0,liveui:!1,html5:{vhs:{lowLatencyMode:!0}},inactivityTimeout:0,controlBar:{skipButtons:{backward:10,forward:10},volumePanel:{inline:!1},children:["skipBackward","playToggle","skipForward","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","spacer","playbackRateMenuButton","fullscreenToggle"]},playbackRates:[.5,1,1.25,1.5,2]});return Ze.current=we,we.one("loadedmetadata",()=>{ke()}),we.userActive(!0),we.on("userinactive",()=>we.userActive(!0)),()=>{try{Ze.current&&(Ze.current.dispose(),Ze.current=null)}finally{ct.current&&(ct.current.remove(),ct.current=null)}}},[St,L,re,R,Ee,ke]),b.useEffect(()=>{const me=Ze.current;if(!me||me.isDisposed?.())return;const we=me.el();we&&we.classList.toggle("is-live-download",!!q)},[q]);const ie=b.useCallback(()=>{const me=Ze.current;if(!(!me||me.isDisposed?.())){try{me.pause(),me.reset?.()}catch{}try{me.src({src:"",type:"video/mp4"}),me.load?.()}catch{}}},[]),Te=b.useCallback(me=>{const we=Ze.current;if(!we||we.isDisposed?.())return;const ue=Math.max(0,Number(me)||0);try{const pe=Number(we.duration?.()??0),xe=Number.isFinite(pe)&&pe>0?Math.max(0,pe-.05):ue;we.currentTime(Math.min(ue,xe)),we.trigger?.("timeupdate")}catch{try{we.currentTime(ue)}catch{}}},[]);b.useEffect(()=>{if(!St)return;if(!re&&!R){ie();return}const me=Ze.current;if(!me||me.isDisposed?.())return;const we=me.currentTime()||0;if(me.muted(L),!Xe.src){try{me.pause(),me.reset?.(),me.error(null)}catch{}return}me.__timeOffsetSec=0;const ue=Number(K||0)||0;me.__fullDurationSec=ue;const pe=String(me.currentSrc?.()||"");if(dt.current="",pe&&pe===Xe.src){const Oe=me.play?.();Oe&&typeof Oe.catch=="function"&&Oe.catch(()=>{});return}me.src({src:Xe.src,type:Xe.type});const xe=()=>{const Oe=me.play?.();Oe&&typeof Oe.catch=="function"&&Oe.catch(()=>{})};me.one("loadedmetadata",()=>{if(me.isDisposed?.())return;ke();try{const Q=Number(K||0)||0;Q>0&&(me.__fullDurationSec=Q)}catch{}try{me.playbackRate(1)}catch{}const Oe=/mpegurl/i.test(Xe.type);if(we>0&&!Oe)try{const Q=Number(me.__timeOffsetSec??0)||0,ne=Math.max(0,we-Q);me.__setRelativeTime?.(ne)}catch{}try{me.trigger?.("timeupdate")}catch{}xe()}),xe()},[St,re,R,Xe.src,Xe.type,L,ke,K,ie]),b.useEffect(()=>{if(!St||re||!R||!Xe.src)return;const me=Ze.current;if(!me||me.isDisposed?.())return;if(!(at>0)){dt.current="";return}const we=`${Ue}|${Xe.src}|${at.toFixed(3)}`;if(dt.current===we)return;let ue=!1;const pe=()=>{if(ue)return;const ne=Ze.current;if(!ne||ne.isDisposed?.())return;const ce=String(ne.currentSrc?.()||"");if(!ce||ce!==Xe.src)return;const fe=ne.tech?.(!0)?.el?.()||ne.el?.()?.querySelector?.("video.vjs-tech");if(!((fe instanceof HTMLVideoElement?Number(fe.readyState||0):0)<1)){Te(at),dt.current=we;try{const We=ne.play?.();We&&typeof We.catch=="function"&&We.catch(()=>{})}catch{}}};if(pe(),dt.current===we)return;const xe=()=>pe();me.one?.("loadedmetadata",xe),me.one?.("canplay",xe),me.one?.("durationchange",xe);const Oe=window.setTimeout(pe,0),Q=window.setTimeout(pe,120);return()=>{ue=!0,window.clearTimeout(Oe),window.clearTimeout(Q);try{me.off?.("loadedmetadata",xe)}catch{}try{me.off?.("canplay",xe)}catch{}try{me.off?.("durationchange",xe)}catch{}}},[St,re,R,Xe.src,Ue,at,Te]),b.useEffect(()=>{if(!St)return;const me=Ze.current;if(!me||me.isDisposed?.())return;const we=()=>{s.status==="running"&&W(!1)};return me.on("error",we),()=>{try{me.off("error",we)}catch{}}},[St,s.status]),b.useEffect(()=>{const me=Ze.current;!me||me.isDisposed?.()||queueMicrotask(()=>me.trigger("resize"))},[e]),b.useEffect(()=>{const me=we=>{const pe=(we.detail?.file??"").trim();if(!pe)return;const xe=Qr(s.output?.trim()||"");xe&&xe===pe&&ie()};return window.addEventListener("player:release",me),()=>window.removeEventListener("player:release",me)},[s.output,ie]),b.useEffect(()=>{const me=we=>{const pe=(we.detail?.file??"").trim();if(!pe)return;const xe=Qr(s.output?.trim()||"");xe&&xe===pe&&(ie(),t())};return window.addEventListener("player:close",me),()=>window.removeEventListener("player:close",me)},[s.output,ie,t]);const Be=()=>{if(typeof window>"u")return{w:0,h:0,ox:0,oy:0,bottomInset:0};const me=window.visualViewport;if(me&&Number.isFinite(me.width)&&Number.isFinite(me.height)){const xe=Math.floor(me.width),Oe=Math.floor(me.height),Q=Math.floor(me.offsetLeft||0),ne=Math.floor(me.offsetTop||0),ce=Math.max(0,Math.floor(window.innerHeight-(me.height+me.offsetTop)));return{w:xe,h:Oe,ox:Q,oy:ne,bottomInset:ce}}const we=document.documentElement,ue=we?.clientWidth||window.innerWidth,pe=we?.clientHeight||window.innerHeight;return{w:ue,h:pe,ox:0,oy:0,bottomInset:0}},ht=b.useRef(null);b.useEffect(()=>{if(typeof window>"u")return;const{w:me,h:we}=Be();ht.current={w:me,h:we}},[]);const It=b.useCallback(()=>{const me=s,we=Km(Ze.current?.videoWidth?.(),me.videoWidth,me.width,me.meta?.width)??0,ue=Km(yt,Ze.current?.videoHeight?.(),me.videoHeight,me.height,me.meta?.height)??0;return we>0&&ue>0?we/ue:16/9},[s,yt]),Yt=b.useCallback(me=>{if(typeof window>"u")return me;const we=It(),ue=30,{w:pe,h:xe}=Be(),Oe=pe-gt*2,Q=Math.max(1,xe-gt*2-ue),ne=Math.max(1,$-ue);let ce=Math.max(V,Math.min(me.w,Oe)),fe=ce/we;feQ&&(fe=Q,ce=fe*we),ce>Oe&&(ce=Oe,fe=ce/we);const Ne=Math.round(fe+ue),We=Math.max(gt,Math.min(me.x,pe-ce-gt)),xt=Math.max(gt,Math.min(me.y,xe-Ne-gt));return{x:We,y:xt,w:Math.round(ce),h:Ne}},[It]),pi=b.useCallback(()=>{if(typeof window>"u")return{x:gt,y:gt,w:Jt,h:ki};try{const Q=window.localStorage.getItem(Pi);if(Q){const ne=JSON.parse(Q);if(typeof ne.x=="number"&&typeof ne.y=="number"&&typeof ne.w=="number"&&typeof ne.h=="number")return Yt({x:ne.x,y:ne.y,w:ne.w,h:ne.h})}}catch{}const{w:me,h:we}=Be(),ue=Jt,pe=ki,xe=Math.max(gt,me-ue-gt),Oe=Math.max(gt,we-pe-gt);return Yt({x:xe,y:Oe,w:ue,h:pe})},[Yt]),[oi,ci]=b.useState(()=>pi()),Bi=Dt&&oi.w<380,Gt=b.useCallback(me=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Pi,JSON.stringify(me))}catch{}},[]),xi=b.useRef(oi);b.useEffect(()=>{xi.current=oi},[oi]),b.useEffect(()=>{Dt&&ci(pi())},[Dt,pi]),b.useEffect(()=>{if(!Dt)return;const me=()=>{const we=ht.current,{w:ue,h:pe}=Be();ci(xe=>{if(!we)return Yt(xe);const Oe=24,Q=xe.x-gt,ne=we.w-gt-(xe.x+xe.w),ce=we.h-gt-(xe.y+xe.h),fe=Math.abs(Q)<=Oe,Ne=Math.abs(ne)<=Oe,We=Math.abs(ce)<=Oe;let xt=Yt(xe);return We&&(xt={...xt,y:Math.max(gt,pe-xt.h-gt)}),Ne?xt={...xt,x:Math.max(gt,ue-xt.w-gt)}:fe&&(xt={...xt,x:gt}),Yt(xt)}),ht.current={w:ue,h:pe}};return ht.current=(()=>{const{w:we,h:ue}=Be();return{w:we,h:ue}})(),window.addEventListener("resize",me),()=>window.removeEventListener("resize",me)},[Dt,Yt]);const ai=b.useRef(null);b.useEffect(()=>{const me=Ze.current;if(!(!me||me.isDisposed?.()))return ai.current!=null&&cancelAnimationFrame(ai.current),ai.current=requestAnimationFrame(()=>{ai.current=null;try{me.trigger("resize")}catch{}}),()=>{ai.current!=null&&(cancelAnimationFrame(ai.current),ai.current=null)}},[Dt,oi.w,oi.h]);const[di,qt]=b.useState(!1),[Mt,vt]=b.useState(!1),[Ci,ss]=b.useState(null),[vs,xs]=b.useState(null),Gi=b.useRef(null),fi=b.useRef(null),Zi=b.useRef(null),ts=b.useRef(null),$i=b.useCallback(me=>{const{w:we,h:ue}=Be(),pe=gt,xe=we-me.w-gt,Oe=ue-me.h-gt,ne=me.x+me.w/2{const we=ts.current;if(!we)return;const ue=me.clientX-we.sx,pe=me.clientY-we.sy,xe=we.start,Oe=Yt({x:xe.x+ue,y:xe.y+pe,w:xe.w,h:xe.h});Zi.current={x:Oe.x,y:Oe.y},ss($i(Oe)),fi.current==null&&(fi.current=requestAnimationFrame(()=>{fi.current=null;const Q=Zi.current;Q&&ci(ne=>({...ne,x:Q.x,y:Q.y}))}))},[Yt,$i]),Di=b.useCallback(()=>{ts.current&&(vt(!1),ss(null),fi.current!=null&&(cancelAnimationFrame(fi.current),fi.current=null),ts.current=null,window.removeEventListener("pointermove",Ji),window.removeEventListener("pointerup",Di),ci(me=>{const we=$i(Yt(me));return queueMicrotask(()=>Gt(we)),we}))},[Ji,$i,Yt,Gt]),$s=b.useCallback(me=>{if(!Dt||di||me.button!==0)return;me.preventDefault(),me.stopPropagation();const we=xi.current;ts.current={sx:me.clientX,sy:me.clientY,start:we},vt(!0);const ue=De();xs(ue),ss($i(we)),window.addEventListener("pointermove",Ji),window.addEventListener("pointerup",Di)},[Dt,di,Ji,Di,$i,De]),Cs=b.useRef(null),ns=b.useRef(null),rs=b.useRef(null),Rs=b.useCallback(me=>{const we=rs.current;if(!we)return;const ue=me.clientX-we.sx,pe=me.clientY-we.sy,xe=we.ratio,Oe=we.dir.includes("w"),Q=we.dir.includes("e"),ne=we.dir.includes("n"),ce=we.dir.includes("s");let fe=we.start.w,Ne=we.start.h,We=we.start.x,xt=we.start.y;const{w:it,h:mt}=Be(),Rt=24,Pt=we.start.x+we.start.w,Nt=we.start.y+we.start.h,Ht=Math.abs(it-gt-Pt)<=Rt,Vi=Math.abs(mt-gt-Nt)<=Rt,gn=hs=>{hs=Math.max(V,hs);let Ms=hs/xe;return Ms<$&&(Ms=$,hs=Ms*xe),{newW:hs,newH:Ms}},yn=hs=>{hs=Math.max($,hs);let Ms=hs*xe;return Ms=Math.abs(pe)){const Ms=Q?we.start.w+ue:we.start.w-ue,{newW:En,newH:ba}=gn(Ms);fe=En,Ne=ba}else{const Ms=ce?we.start.h+pe:we.start.h-pe,{newW:En,newH:ba}=yn(Ms);fe=En,Ne=ba}Oe&&(We=we.start.x+(we.start.w-fe)),ne&&(xt=we.start.y+(we.start.h-Ne))}else if(Q||Oe){const hs=Q?we.start.w+ue:we.start.w-ue,{newW:Ms,newH:En}=gn(hs);fe=Ms,Ne=En,Oe&&(We=we.start.x+(we.start.w-fe)),xt=Vi?we.start.y+(we.start.h-Ne):we.start.y}else if(ne||ce){const hs=ce?we.start.h+pe:we.start.h-pe,{newW:Ms,newH:En}=yn(hs);fe=Ms,Ne=En,ne&&(xt=we.start.y+(we.start.h-Ne)),Ht?We=we.start.x+(we.start.w-fe):We=we.start.x}const Er=Yt({x:We,y:xt,w:fe,h:Ne});ns.current=Er,Cs.current==null&&(Cs.current=requestAnimationFrame(()=>{Cs.current=null;const hs=ns.current;hs&&ci(hs)}))},[Yt]),Li=b.useCallback(()=>{rs.current&&(qt(!1),ss(null),xs(null),Cs.current!=null&&(cancelAnimationFrame(Cs.current),Cs.current=null),rs.current=null,window.removeEventListener("pointermove",Rs),window.removeEventListener("pointerup",Li),Gt(xi.current))},[Rs,Gt]),qi=b.useCallback(me=>we=>{if(!Dt||we.button!==0)return;we.preventDefault(),we.stopPropagation();const ue=xi.current;rs.current={dir:me,sx:we.clientX,sy:we.clientY,start:ue,ratio:ue.w/ue.h},qt(!0),window.addEventListener("pointermove",Rs),window.addEventListener("pointerup",Li)},[Dt,Rs,Li]),[bs,Kt]=b.useState(!1),[ds,Fi]=b.useState(!1);b.useEffect(()=>{const me=window.matchMedia?.("(hover: hover) and (pointer: fine)"),we=()=>Kt(!!me?.matches);return we(),me?.addEventListener?.("change",we),()=>me?.removeEventListener?.("change",we)},[]);const Hi=Dt&&(ds||Mt||di),[Ge,Lt]=b.useState(!1);if(b.useEffect(()=>{s.status!=="running"&&Lt(!1)},[s.id,s.status]),!St||yi&&!Ft)return null;const Ct="inline-flex items-center justify-center rounded-md p-2 transition bg-white/75 text-gray-900 ring-1 ring-black/10 hover:bg-white/90 active:scale-[0.98] dark:bg-black/45 dark:text-white dark:ring-white/10 dark:hover:bg-black/60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500",Wt=String(s.phase??"").toLowerCase(),_i=Wt==="stopping"||Wt==="remuxing"||Wt==="moving",ei=!w||!re||_i||Ge,Ki=m.jsx("div",{className:"flex items-center gap-1 min-w-0",children:re?m.jsxs(m.Fragment,{children:[m.jsx(ri,{variant:"primary",color:"red",size:"sm",rounded:"md",disabled:ei,title:_i||Ge?"Stoppe…":"Stop","aria-label":_i||Ge?"Stoppe…":"Stop",onClick:async me=>{if(me.preventDefault(),me.stopPropagation(),!ei)try{Lt(!0),await w?.(s.id)}finally{Lt(!1)}},className:bo("shadow-none shrink-0",Dt&&Bi&&"px-2"),children:m.jsx("span",{className:"whitespace-nowrap",children:_i||Ge?"Stoppe…":Dt&&Bi?"Stop":"Stoppen"})}),m.jsx(ga,{job:s,variant:"overlay",collapseToMenu:!0,busy:_i||Ge,isFavorite:u,isLiked:c,isWatching:d,onToggleWatch:S?me=>S(me):void 0,onToggleFavorite:v?me=>v(me):void 0,onToggleLike:T?me=>T(me):void 0,order:["watch","favorite","like","details"],className:"gap-1 min-w-0 flex-1"})]}):m.jsx(ga,{job:s,variant:"overlay",collapseToMenu:!0,isHot:a||oe,isFavorite:u,isLiked:c,isWatching:d,onToggleWatch:S?me=>S(me):void 0,onToggleFavorite:v?me=>v(me):void 0,onToggleLike:T?me=>T(me):void 0,onToggleHot:y?async me=>{ie(),await new Promise(ue=>setTimeout(ue,150)),await y(me),await new Promise(ue=>setTimeout(ue,0));const we=Ze.current;if(we&&!we.isDisposed?.()){const ue=we.play?.();ue&&typeof ue.catch=="function"&&ue.catch(()=>{})}}:void 0,onKeep:f?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await f(me)}:void 0,onDelete:g?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await g(me)}:void 0,order:["watch","favorite","like","hot","keep","delete","details"],className:"gap-1 min-w-0 flex-1"})}),Ts=e||Dt,In=re?"calc(4px + env(safe-area-inset-bottom))":`calc(${kt+2}px + env(safe-area-inset-bottom))`,Wi="top-2",Nn=e&&Et,On=m.jsx("div",{className:bo("relative overflow-visible",e||Dt?"flex-1 min-h-0":"aspect-video"),onMouseEnter:()=>{!Dt||!bs||Fi(!0)},onMouseLeave:()=>{!Dt||!bs||Fi(!1)},children:m.jsxs("div",{className:bo("relative w-full h-full",Dt&&"vjs-mini"),style:{"--vjs-controlbar-h":`${kt}px`},children:[re?m.jsxs("div",{className:"absolute inset-0 bg-black",children:[m.jsx(IR,{src:Se,muted:L,className:"w-full h-full object-contain object-bottom"}),m.jsxs("div",{className:"absolute right-2 bottom-2 z-[60] pointer-events-none inline-flex items-center gap-1.5 rounded-full bg-red-600/90 px-2 py-1 text-[11px] font-semibold text-white shadow-sm",children:[m.jsx("span",{className:"inline-block size-1.5 rounded-full bg-white animate-pulse"}),"Live"]})]}):m.jsx("div",{ref:ze,className:"absolute inset-0"}),m.jsxs("div",{className:bo("absolute inset-x-0 z-30 pointer-events-none","top-0"),children:[m.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 h-16 bg-gradient-to-b from-black/35 to-transparent"}),m.jsx("div",{className:bo("absolute inset-x-2",Wi),children:m.jsxs("div",{className:"grid grid-cols-[minmax(0,1fr)_auto_auto] items-start gap-2",children:[m.jsx("div",{className:"min-w-0 pointer-events-auto overflow-visible",children:Nn?null:Ki}),Dt?m.jsxs("button",{type:"button","aria-label":"Player-Fenster verschieben",title:"Ziehen zum Verschieben",onPointerDown:$s,onClick:me=>{me.preventDefault(),me.stopPropagation()},className:bo(Ct,"px-3 gap-1 cursor-grab active:cursor-grabbing select-none",Hi?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none -translate-y-1",Mt&&"scale-[0.98] opacity-90"),children:[m.jsx("span",{className:"h-1 w-1 rounded-full bg-black/35 dark:bg-white/35"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-black/35 dark:bg-white/35"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-black/35 dark:bg-white/35"})]}):null,m.jsxs("div",{className:"shrink-0 flex items-center gap-1 pointer-events-auto",children:[m.jsx("button",{type:"button",className:Ct,onClick:i,"aria-label":e?"Minimieren":"Maximieren",title:e?"Minimieren":"Maximieren",children:e?m.jsx(WO,{className:"h-5 w-5"}):m.jsx(XO,{className:"h-5 w-5"})}),m.jsx("button",{type:"button",className:Ct,onClick:t,"aria-label":"Schließen",title:"Schließen",children:m.jsx(v0,{className:"h-5 w-5"})})]})]})})]}),m.jsxs("div",{className:bo("player-ui pointer-events-none absolute inset-x-2 z-50","flex items-end justify-between gap-2","transition-all duration-200 ease-out"),style:{bottom:In},children:[m.jsxs("div",{className:"min-w-0",children:[m.jsx("div",{className:"truncate text-sm font-semibold text-white",children:F}),m.jsx("div",{className:"truncate text-[11px] text-white/80",children:m.jsxs("span",{className:"inline-flex items-center gap-1 min-w-0 align-middle",children:[m.jsx("span",{className:"truncate",children:le||I}),a||oe?m.jsx("span",{className:"shrink-0 rounded bg-amber-500/25 px-1.5 py-0.5 font-semibold text-white",children:"HOT"}):null]})})]}),m.jsxs("div",{className:"shrink-0 flex items-center gap-1.5 text-[11px] text-white",children:[pt!=="—"?m.jsx("span",{className:"rounded bg-black/40 px-1.5 py-0.5 font-medium",children:pt}):null,re?null:m.jsx("span",{className:"rounded bg-black/40 px-1.5 py-0.5 font-medium",children:ge}),G!=="—"?m.jsx("span",{className:"rounded bg-black/40 px-1.5 py-0.5 font-medium",children:G}):null]})]})]})}),Zs=m.jsx("div",{className:"w-[360px] shrink-0 border-r border-white/10 bg-black/40 text-white",children:m.jsxs("div",{className:"h-full p-4 flex flex-col gap-3 overflow-y-auto",children:[m.jsx("div",{className:"rounded-lg overflow-hidden ring-1 ring-white/10 bg-black/30",children:m.jsx("div",{className:"relative aspect-video",children:m.jsx("img",{src:Re,alt:"",className:"absolute inset-0 h-full w-full object-contain opacity-80",draggable:!1,onError:()=>{}})})}),m.jsxs("div",{className:"space-y-1",children:[m.jsx("div",{className:"text-lg font-semibold truncate",children:F}),m.jsx("div",{className:"text-xs text-white/70 break-all",children:le||I})]}),m.jsx("div",{className:"pointer-events-auto",children:m.jsxs("div",{className:"flex items-center justify-center gap-2 flex-wrap",children:[re?m.jsx(ri,{variant:"primary",color:"red",size:"sm",rounded:"md",disabled:ei,title:_i||Ge?"Stoppe…":"Stop","aria-label":_i||Ge?"Stoppe…":"Stop",onClick:async me=>{if(me.preventDefault(),me.stopPropagation(),!ei)try{Lt(!0),await w?.(s.id)}finally{Lt(!1)}},className:"shadow-none",children:_i||Ge?"Stoppe…":"Stoppen"}):null,m.jsx(ga,{job:s,variant:"table",collapseToMenu:!1,busy:_i||Ge,isHot:a||oe,isFavorite:u,isLiked:c,isWatching:d,onToggleWatch:S?me=>S(me):void 0,onToggleFavorite:v?me=>v(me):void 0,onToggleLike:T?me=>T(me):void 0,onToggleHot:y?async me=>{ie(),await new Promise(ue=>setTimeout(ue,150)),await y(me),await new Promise(ue=>setTimeout(ue,0));const we=Ze.current;if(we&&!we.isDisposed?.()){const ue=we.play?.();ue&&typeof ue.catch=="function"&&ue.catch(()=>{})}}:void 0,onKeep:f?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await f(me)}:void 0,onDelete:g?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await g(me)}:void 0,order:re?["watch","favorite","like","details"]:["watch","favorite","like","hot","details","keep","delete"],className:"flex items-center justify-start gap-1"})]})}),m.jsxs("div",{className:"grid grid-cols-2 gap-x-3 gap-y-2 text-sm",children:[m.jsx("div",{className:"text-white/60",children:"Status"}),m.jsx("div",{className:"font-medium",children:s.status}),m.jsx("div",{className:"text-white/60",children:"Auflösung"}),m.jsx("div",{className:"font-medium",children:pt}),m.jsx("div",{className:"text-white/60",children:"FPS"}),m.jsx("div",{className:"font-medium",children:Fe}),m.jsx("div",{className:"text-white/60",children:"Laufzeit"}),m.jsx("div",{className:"font-medium",children:ge}),m.jsx("div",{className:"text-white/60",children:"Größe"}),m.jsx("div",{className:"font-medium",children:G}),m.jsx("div",{className:"text-white/60",children:"Datum"}),m.jsx("div",{className:"font-medium",children:Ie}),m.jsx("div",{className:"col-span-2",children:Pe.length?m.jsx("div",{className:"flex flex-wrap gap-1.5",children:Pe.map(me=>m.jsx("span",{className:"rounded bg-white/10 px-2 py-0.5 text-xs text-white/90",children:me},me))}):m.jsx("span",{className:"text-white/50",children:"—"})})]})]})}),pn=Dt&&Mt&&Ci?m.jsx("div",{className:"pointer-events-none absolute z-0 player-snap-ghost overflow-hidden rounded-lg border-2 border-dashed border-white/70 bg-black/55 shadow-2xl dark:border-white/60",style:{left:Ci.x-oi.x,top:Ci.y-oi.y,width:Ci.w,height:Ci.h},"aria-hidden":"true",children:m.jsxs("div",{className:"absolute inset-0 bg-black",children:[m.jsx("img",{src:vs||Re,alt:"",className:"absolute inset-0 h-full w-full object-contain opacity-80",draggable:!1,onError:()=>{}}),m.jsx("div",{className:"absolute inset-x-0 top-0 h-14 bg-gradient-to-b from-black/55 to-transparent"}),m.jsxs("div",{className:"absolute top-2 right-2 flex items-center gap-1.5 opacity-80",children:[m.jsx("div",{className:"h-8 w-8 rounded-md bg-white/15 ring-1 ring-white/20"}),m.jsx("div",{className:"h-8 w-8 rounded-md bg-white/15 ring-1 ring-white/20"})]}),m.jsxs("div",{className:"absolute top-2 left-2 h-8 rounded-md bg-white/12 px-2 flex items-center gap-1 ring-1 ring-white/15",children:[m.jsx("span",{className:"h-1 w-1 rounded-full bg-white/50"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-white/50"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-white/50"})]}),m.jsxs("div",{className:"absolute inset-x-2 bottom-2 flex items-end justify-between gap-2",children:[m.jsxs("div",{className:"min-w-0",children:[m.jsx("div",{className:"truncate text-sm font-semibold text-white/95",children:F}),m.jsxs("div",{className:"truncate text-[11px] text-white/75",children:[le||I,a||oe?m.jsx("span",{className:"ml-1.5 rounded bg-amber-500/30 px-1.5 py-0.5 text-white",children:"HOT"}):null]})]}),m.jsxs("div",{className:"shrink-0 flex items-center gap-1 text-[10px] text-white/90",children:[pt!=="—"?m.jsx("span",{className:"rounded bg-black/45 px-1.5 py-0.5",children:pt}):null,!re&&ge!=="—"?m.jsx("span",{className:"rounded bg-black/45 px-1.5 py-0.5",children:ge}):null]})]}),m.jsx("div",{className:"absolute inset-x-0 bottom-0 h-8 bg-gradient-to-t from-white/8 to-transparent"})]})}):null,ln=m.jsx(pa,{edgeToEdgeMobile:!0,noBodyPadding:!0,className:bo("relative z-10 flex flex-col shadow-2xl ring-1 ring-black/10 dark:ring-white/10","w-full",Ts?"h-full":"h-[220px] max-h-[40vh]",e?"rounded-2xl":Dt?"rounded-lg":"rounded-none"),bodyClassName:"flex flex-col flex-1 min-h-0 p-0",children:m.jsxs("div",{className:"flex flex-1 min-h-0",children:[Nn?Zs:null,On]})}),{w:Is,h:un,ox:Mn,oy:Js,bottomInset:en}=Be(),zi={left:Mn+16,top:Js+16,width:Math.max(0,Is-32),height:Math.max(0,un-32)},Pn=e?zi:Dt?{left:oi.x,top:oi.y,width:oi.w,height:oi.h}:void 0,_n=m.jsxs(m.Fragment,{children:[m.jsx("style",{children:` +`:(r=i.childNodes)!=null&&r.length?kR(i,e):e?t+i.textContent.trim().replace(/\s+/g," "):t+i.textContent},"")}function p$(s,e,t){const i="http://www.w3.org/ns/ttml#styling";let n=null;const r=["displayAlign","textAlign","color","backgroundColor","fontSize","fontFamily"],a=s!=null&&s.hasAttribute("style")?s.getAttribute("style"):null;return a&&t.hasOwnProperty(a)&&(n=t[a]),r.reduce((u,c)=>{const d=Vv(e,i,c)||Vv(s,i,c)||Vv(n,i,c);return d&&(u[c]=d),u},{})}function Vv(s,e,t){return s&&s.hasAttributeNS(e,t)?s.getAttributeNS(e,t):null}function nA(s){return new Error(`Could not parse ttml timestamp ${s}`)}function Gv(s,e){if(!s)return null;let t=SR(s);return t===null&&(wR.test(s)?t=g$(s,e):AR.test(s)&&(t=y$(s,e))),t}function g$(s,e){const t=wR.exec(s),i=(t[4]|0)+(t[5]|0)/e.subFrameRate;return(t[1]|0)*3600+(t[2]|0)*60+(t[3]|0)+i/e.frameRate}function y$(s,e){const t=AR.exec(s),i=Number(t[1]);switch(t[2]){case"h":return i*3600;case"m":return i*60;case"ms":return i*1e3;case"f":return i/e.frameRate;case"t":return i/e.tickRate}return i}class Vm{constructor(e,t){this.timelineController=void 0,this.cueRanges=[],this.trackName=void 0,this.startTime=null,this.endTime=null,this.screen=null,this.timelineController=e,this.trackName=t}dispatchCue(){this.startTime!==null&&(this.timelineController.addCues(this.trackName,this.startTime,this.endTime,this.screen,this.cueRanges),this.startTime=null)}newCue(e,t,i){(this.startTime===null||this.startTime>e)&&(this.startTime=e),this.endTime=t,this.screen=i,this.timelineController.createCaptionsTrack(this.trackName)}reset(){this.cueRanges=[],this.startTime=null}}class v${constructor(e){this.hls=void 0,this.media=null,this.config=void 0,this.enabled=!0,this.Cues=void 0,this.textTracks=[],this.tracks=[],this.initPTS=[],this.unparsedVttFrags=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.cea608Parser1=void 0,this.cea608Parser2=void 0,this.lastCc=-1,this.lastSn=-1,this.lastPartIndex=-1,this.prevCC=-1,this.vttCCs=aA(),this.captionsProperties=void 0,this.hls=e,this.config=e.config,this.Cues=e.config.cueHandler,this.captionsProperties={textTrack1:{label:this.config.captionsTextTrack1Label,languageCode:this.config.captionsTextTrack1LanguageCode},textTrack2:{label:this.config.captionsTextTrack2Label,languageCode:this.config.captionsTextTrack2LanguageCode},textTrack3:{label:this.config.captionsTextTrack3Label,languageCode:this.config.captionsTextTrack3LanguageCode},textTrack4:{label:this.config.captionsTextTrack4Label,languageCode:this.config.captionsTextTrack4LanguageCode}},e.on(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.on(H.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),e.on(H.FRAG_LOADING,this.onFragLoading,this),e.on(H.FRAG_LOADED,this.onFragLoaded,this),e.on(H.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),e.on(H.FRAG_DECRYPTED,this.onFragDecrypted,this),e.on(H.INIT_PTS_FOUND,this.onInitPtsFound,this),e.on(H.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),e.on(H.BUFFER_FLUSHING,this.onBufferFlushing,this)}destroy(){const{hls:e}=this;e.off(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.off(H.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),e.off(H.FRAG_LOADING,this.onFragLoading,this),e.off(H.FRAG_LOADED,this.onFragLoaded,this),e.off(H.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),e.off(H.FRAG_DECRYPTED,this.onFragDecrypted,this),e.off(H.INIT_PTS_FOUND,this.onInitPtsFound,this),e.off(H.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),e.off(H.BUFFER_FLUSHING,this.onBufferFlushing,this),this.hls=this.config=this.media=null,this.cea608Parser1=this.cea608Parser2=void 0}initCea608Parsers(){const e=new Vm(this,"textTrack1"),t=new Vm(this,"textTrack2"),i=new Vm(this,"textTrack3"),n=new Vm(this,"textTrack4");this.cea608Parser1=new tA(1,e,t),this.cea608Parser2=new tA(3,i,n)}addCues(e,t,i,n,r){let a=!1;for(let u=r.length;u--;){const c=r[u],d=x$(c[0],c[1],t,i);if(d>=0&&(c[0]=Math.min(c[0],t),c[1]=Math.max(c[1],i),a=!0,d/(i-t)>.5))return}if(a||r.push([t,i]),this.config.renderTextTracksNatively){const u=this.captionsTracks[e];this.Cues.newCue(u,t,i,n)}else{const u=this.Cues.newCue(null,t,i,n);this.hls.trigger(H.CUES_PARSED,{type:"captions",cues:u,track:e})}}onInitPtsFound(e,{frag:t,id:i,initPTS:n,timescale:r,trackId:a}){const{unparsedVttFrags:u}=this;i===jt.MAIN&&(this.initPTS[t.cc]={baseTime:n,timescale:r,trackId:a}),u.length&&(this.unparsedVttFrags=[],u.forEach(c=>{this.initPTS[c.frag.cc]?this.onFragLoaded(H.FRAG_LOADED,c):this.hls.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:c.frag,error:new Error("Subtitle discontinuity domain does not match main")})}))}getExistingTrack(e,t){const{media:i}=this;if(i)for(let n=0;n{yc(n[r]),delete n[r]}),this.nonNativeCaptionsTracks={}}onManifestLoading(){this.lastCc=-1,this.lastSn=-1,this.lastPartIndex=-1,this.prevCC=-1,this.vttCCs=aA(),this._cleanTracks(),this.tracks=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.textTracks=[],this.unparsedVttFrags=[],this.initPTS=[],this.cea608Parser1&&this.cea608Parser2&&(this.cea608Parser1.reset(),this.cea608Parser2.reset())}_cleanTracks(){const{media:e}=this;if(!e)return;const t=e.textTracks;if(t)for(let i=0;ir.textCodec===Hv);if(this.config.enableWebVTT||n&&this.config.enableIMSC1){if(nR(this.tracks,i)){this.tracks=i;return}if(this.textTracks=[],this.tracks=i,this.config.renderTextTracksNatively){const a=this.media,u=a?u0(a.textTracks):null;if(this.tracks.forEach((c,d)=>{let f;if(u){let g=null;for(let y=0;yd!==null).map(d=>d.label);c.length&&this.hls.logger.warn(`Media element contains unused subtitle tracks: ${c.join(", ")}. Replace media element for each source to clear TextTracks and captions menu.`)}}else if(this.tracks.length){const a=this.tracks.map(u=>({label:u.name,kind:u.type.toLowerCase(),default:u.default,subtitleTrack:u}));this.hls.trigger(H.NON_NATIVE_TEXT_TRACKS_FOUND,{tracks:a})}}}onManifestLoaded(e,t){this.config.enableCEA708Captions&&t.captions&&t.captions.forEach(i=>{const n=/(?:CC|SERVICE)([1-4])/.exec(i.instreamId);if(!n)return;const r=`textTrack${n[1]}`,a=this.captionsProperties[r];a&&(a.label=i.name,i.lang&&(a.languageCode=i.lang),a.media=i)})}closedCaptionsForLevel(e){const t=this.hls.levels[e.level];return t?.attrs["CLOSED-CAPTIONS"]}onFragLoading(e,t){if(this.enabled&&t.frag.type===jt.MAIN){var i,n;const{cea608Parser1:r,cea608Parser2:a,lastSn:u}=this,{cc:c,sn:d}=t.frag,f=(i=(n=t.part)==null?void 0:n.index)!=null?i:-1;r&&a&&(d!==u+1||d===u&&f!==this.lastPartIndex+1||c!==this.lastCc)&&(r.reset(),a.reset()),this.lastCc=c,this.lastSn=d,this.lastPartIndex=f}}onFragLoaded(e,t){const{frag:i,payload:n}=t;if(i.type===jt.SUBTITLE)if(n.byteLength){const r=i.decryptdata,a="stats"in t;if(r==null||!r.encrypted||a){const u=this.tracks[i.level],c=this.vttCCs;c[i.cc]||(c[i.cc]={start:i.start,prevCC:this.prevCC,new:!0},this.prevCC=i.cc),u&&u.textCodec===Hv?this._parseIMSC1(i,n):this._parseVTTs(t)}}else this.hls.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:i,error:new Error("Empty subtitle payload")})}_parseIMSC1(e,t){const i=this.hls;iA(t,this.initPTS[e.cc],n=>{this._appendCues(n,e.level),i.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!0,frag:e})},n=>{i.logger.log(`Failed to parse IMSC1: ${n}`),i.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:e,error:n})})}_parseVTTs(e){var t;const{frag:i,payload:n}=e,{initPTS:r,unparsedVttFrags:a}=this,u=r.length-1;if(!r[i.cc]&&u===-1){a.push(e);return}const c=this.hls,d=(t=i.initSegment)!=null&&t.data?ia(i.initSegment.data,new Uint8Array(n)).buffer:n;h$(d,this.initPTS[i.cc],this.vttCCs,i.cc,i.start,f=>{this._appendCues(f,i.level),c.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!0,frag:i})},f=>{const g=f.message==="Missing initPTS for VTT MPEGTS";g?a.push(e):this._fallbackToIMSC1(i,n),c.logger.log(`Failed to parse VTT cue: ${f}`),!(g&&u>i.cc)&&c.trigger(H.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:i,error:f})})}_fallbackToIMSC1(e,t){const i=this.tracks[e.level];i.textCodec||iA(t,this.initPTS[e.cc],()=>{i.textCodec=Hv,this._parseIMSC1(e,t)},()=>{i.textCodec="wvtt"})}_appendCues(e,t){const i=this.hls;if(this.config.renderTextTracksNatively){const n=this.textTracks[t];if(!n||n.mode==="disabled")return;e.forEach(r=>vR(n,r))}else{const n=this.tracks[t];if(!n)return;const r=n.default?"default":"subtitles"+t;i.trigger(H.CUES_PARSED,{type:"subtitles",cues:e,track:r})}}onFragDecrypted(e,t){const{frag:i}=t;i.type===jt.SUBTITLE&&this.onFragLoaded(H.FRAG_LOADED,t)}onSubtitleTracksCleared(){this.tracks=[],this.captionsTracks={}}onFragParsingUserdata(e,t){if(!this.enabled||!this.config.enableCEA708Captions)return;const{frag:i,samples:n}=t;if(!(i.type===jt.MAIN&&this.closedCaptionsForLevel(i)==="NONE"))for(let r=0;rsb(u[c],t,i))}if(this.config.renderTextTracksNatively&&t===0&&n!==void 0){const{textTracks:u}=this;Object.keys(u).forEach(c=>sb(u[c],t,n))}}}extractCea608Data(e){const t=[[],[]],i=e[0]&31;let n=2;for(let r=0;r=16?c--:c++;const v=ER(d.trim()),T=w1(e,t,v);s!=null&&(g=s.cues)!=null&&g.getCueById(T)||(a=new f(e,t,v),a.id=T,a.line=y+1,a.align="left",a.position=10+Math.min(80,Math.floor(c*8/32)*10),n.push(a))}return s&&n.length&&(n.sort((y,v)=>y.line==="auto"||v.line==="auto"?0:y.line>8&&v.line>8?v.line-y.line:y.line-v.line),n.forEach(y=>vR(s,y))),n}};function S$(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch{}return!1}const _$=/(\d+)-(\d+)\/(\d+)/;class oA{constructor(e){this.fetchSetup=void 0,this.requestTimeout=void 0,this.request=null,this.response=null,this.controller=void 0,this.context=null,this.config=null,this.callbacks=null,this.stats=void 0,this.loader=null,this.fetchSetup=e.fetchSetup||k$,this.controller=new self.AbortController,this.stats=new s1}destroy(){this.loader=this.callbacks=this.context=this.config=this.request=null,this.abortInternal(),this.response=null,this.fetchSetup=this.controller=this.stats=null}abortInternal(){this.controller&&!this.stats.loading.end&&(this.stats.aborted=!0,this.controller.abort())}abort(){var e;this.abortInternal(),(e=this.callbacks)!=null&&e.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,i){const n=this.stats;if(n.loading.start)throw new Error("Loader can only be used once.");n.loading.start=self.performance.now();const r=E$(e,this.controller.signal),a=e.responseType==="arraybuffer",u=a?"byteLength":"length",{maxTimeToFirstByteMs:c,maxLoadTimeMs:d}=t.loadPolicy;this.context=e,this.config=t,this.callbacks=i,this.request=this.fetchSetup(e,r),self.clearTimeout(this.requestTimeout),t.timeout=c&&Ot(c)?c:d,this.requestTimeout=self.setTimeout(()=>{this.callbacks&&(this.abortInternal(),this.callbacks.onTimeout(n,e,this.response))},t.timeout),(Vh(this.request)?this.request.then(self.fetch):self.fetch(this.request)).then(g=>{var y;this.response=this.loader=g;const v=Math.max(self.performance.now(),n.loading.start);if(self.clearTimeout(this.requestTimeout),t.timeout=d,this.requestTimeout=self.setTimeout(()=>{this.callbacks&&(this.abortInternal(),this.callbacks.onTimeout(n,e,this.response))},d-(v-n.loading.start)),!g.ok){const{status:S,statusText:w}=g;throw new C$(w||"fetch, bad network response",S,g)}n.loading.first=v,n.total=A$(g.headers)||n.total;const T=(y=this.callbacks)==null?void 0:y.onProgress;return T&&Ot(t.highWaterMark)?this.loadProgressively(g,n,e,t.highWaterMark,T):a?g.arrayBuffer():e.responseType==="json"?g.json():g.text()}).then(g=>{var y,v;const T=this.response;if(!T)throw new Error("loader destroyed");self.clearTimeout(this.requestTimeout),n.loading.end=Math.max(self.performance.now(),n.loading.first);const S=g[u];S&&(n.loaded=n.total=S);const w={url:T.url,data:g,code:T.status},L=(y=this.callbacks)==null?void 0:y.onProgress;L&&!Ot(t.highWaterMark)&&L(n,e,g,T),(v=this.callbacks)==null||v.onSuccess(w,n,e,T)}).catch(g=>{var y;if(self.clearTimeout(this.requestTimeout),n.aborted)return;const v=g&&g.code||0,T=g?g.message:null;(y=this.callbacks)==null||y.onError({code:v,text:T},e,g?g.details:null,n)})}getCacheAge(){let e=null;if(this.response){const t=this.response.headers.get("age");e=t?parseFloat(t):null}return e}getResponseHeader(e){return this.response?this.response.headers.get(e):null}loadProgressively(e,t,i,n=0,r){const a=new FL,u=e.body.getReader(),c=()=>u.read().then(d=>{if(d.done)return a.dataLength&&r(t,i,a.flush().buffer,e),Promise.resolve(new ArrayBuffer(0));const f=d.value,g=f.length;return t.loaded+=g,g=n&&r(t,i,a.flush().buffer,e)):r(t,i,f.buffer,e),c()}).catch(()=>Promise.reject());return c()}}function E$(s,e){const t={method:"GET",mode:"cors",credentials:"same-origin",signal:e,headers:new self.Headers(ys({},s.headers))};return s.rangeEnd&&t.headers.set("Range","bytes="+s.rangeStart+"-"+String(s.rangeEnd-1)),t}function w$(s){const e=_$.exec(s);if(e)return parseInt(e[2])-parseInt(e[1])+1}function A$(s){const e=s.get("Content-Range");if(e){const i=w$(e);if(Ot(i))return i}const t=s.get("Content-Length");if(t)return parseInt(t)}function k$(s,e){return new self.Request(s.url,e)}class C$ extends Error{constructor(e,t,i){super(e),this.code=void 0,this.details=void 0,this.code=t,this.details=i}}const D$=/^age:\s*[\d.]+\s*$/im;class DR{constructor(e){this.xhrSetup=void 0,this.requestTimeout=void 0,this.retryTimeout=void 0,this.retryDelay=void 0,this.config=null,this.callbacks=null,this.context=null,this.loader=null,this.stats=void 0,this.xhrSetup=e&&e.xhrSetup||null,this.stats=new s1,this.retryDelay=0}destroy(){this.callbacks=null,this.abortInternal(),this.loader=null,this.config=null,this.context=null,this.xhrSetup=null}abortInternal(){const e=this.loader;self.clearTimeout(this.requestTimeout),self.clearTimeout(this.retryTimeout),e&&(e.onreadystatechange=null,e.onprogress=null,e.readyState!==4&&(this.stats.aborted=!0,e.abort()))}abort(){var e;this.abortInternal(),(e=this.callbacks)!=null&&e.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.loader)}load(e,t,i){if(this.stats.loading.start)throw new Error("Loader can only be used once.");this.stats.loading.start=self.performance.now(),this.context=e,this.config=t,this.callbacks=i,this.loadInternal()}loadInternal(){const{config:e,context:t}=this;if(!e||!t)return;const i=this.loader=new self.XMLHttpRequest,n=this.stats;n.loading.first=0,n.loaded=0,n.aborted=!1;const r=this.xhrSetup;r?Promise.resolve().then(()=>{if(!(this.loader!==i||this.stats.aborted))return r(i,t.url)}).catch(a=>{if(!(this.loader!==i||this.stats.aborted))return i.open("GET",t.url,!0),r(i,t.url)}).then(()=>{this.loader!==i||this.stats.aborted||this.openAndSendXhr(i,t,e)}).catch(a=>{var u;(u=this.callbacks)==null||u.onError({code:i.status,text:a.message},t,i,n)}):this.openAndSendXhr(i,t,e)}openAndSendXhr(e,t,i){e.readyState||e.open("GET",t.url,!0);const n=t.headers,{maxTimeToFirstByteMs:r,maxLoadTimeMs:a}=i.loadPolicy;if(n)for(const u in n)e.setRequestHeader(u,n[u]);t.rangeEnd&&e.setRequestHeader("Range","bytes="+t.rangeStart+"-"+(t.rangeEnd-1)),e.onreadystatechange=this.readystatechange.bind(this),e.onprogress=this.loadprogress.bind(this),e.responseType=t.responseType,self.clearTimeout(this.requestTimeout),i.timeout=r&&Ot(r)?r:a,this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),i.timeout),e.send()}readystatechange(){const{context:e,loader:t,stats:i}=this;if(!e||!t)return;const n=t.readyState,r=this.config;if(!i.aborted&&n>=2&&(i.loading.first===0&&(i.loading.first=Math.max(self.performance.now(),i.loading.start),r.timeout!==r.loadPolicy.maxLoadTimeMs&&(self.clearTimeout(this.requestTimeout),r.timeout=r.loadPolicy.maxLoadTimeMs,this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),r.loadPolicy.maxLoadTimeMs-(i.loading.first-i.loading.start)))),n===4)){self.clearTimeout(this.requestTimeout),t.onreadystatechange=null,t.onprogress=null;const d=t.status,f=t.responseType==="text"?t.responseText:null;if(d>=200&&d<300){const T=f??t.response;if(T!=null){var a,u;i.loading.end=Math.max(self.performance.now(),i.loading.first);const S=t.responseType==="arraybuffer"?T.byteLength:T.length;i.loaded=i.total=S,i.bwEstimate=i.total*8e3/(i.loading.end-i.loading.first);const w=(a=this.callbacks)==null?void 0:a.onProgress;w&&w(i,e,T,t);const L={url:t.responseURL,data:T,code:d};(u=this.callbacks)==null||u.onSuccess(L,i,e,t);return}}const g=r.loadPolicy.errorRetry,y=i.retry,v={url:e.url,data:void 0,code:d};if(q0(g,y,!1,v))this.retry(g);else{var c;cs.error(`${d} while loading ${e.url}`),(c=this.callbacks)==null||c.onError({code:d,text:t.statusText},e,t,i)}}}loadtimeout(){if(!this.config)return;const e=this.config.loadPolicy.timeoutRetry,t=this.stats.retry;if(q0(e,t,!0))this.retry(e);else{var i;cs.warn(`timeout while loading ${(i=this.context)==null?void 0:i.url}`);const n=this.callbacks;n&&(this.abortInternal(),n.onTimeout(this.stats,this.context,this.loader))}}retry(e){const{context:t,stats:i}=this;this.retryDelay=o1(e,i.retry),i.retry++,cs.warn(`${status?"HTTP Status "+status:"Timeout"} while loading ${t?.url}, retrying ${i.retry}/${e.maxNumRetry} in ${this.retryDelay}ms`),this.abortInternal(),this.loader=null,self.clearTimeout(this.retryTimeout),this.retryTimeout=self.setTimeout(this.loadInternal.bind(this),this.retryDelay)}loadprogress(e){const t=this.stats;t.loaded=e.loaded,e.lengthComputable&&(t.total=e.total)}getCacheAge(){let e=null;if(this.loader&&D$.test(this.loader.getAllResponseHeaders())){const t=this.loader.getResponseHeader("age");e=t?parseFloat(t):null}return e}getResponseHeader(e){return this.loader&&new RegExp(`^${e}:\\s*[\\d.]+\\s*$`,"im").test(this.loader.getAllResponseHeaders())?this.loader.getResponseHeader(e):null}}const L$={maxTimeToFirstByteMs:8e3,maxLoadTimeMs:2e4,timeoutRetry:null,errorRetry:null},R$=us(us({autoStartLoad:!0,startPosition:-1,defaultAudioCodec:void 0,debug:!1,capLevelOnFPSDrop:!1,capLevelToPlayerSize:!1,ignoreDevicePixelRatio:!1,maxDevicePixelRatio:Number.POSITIVE_INFINITY,preferManagedMediaSource:!0,initialLiveManifestSize:1,maxBufferLength:30,backBufferLength:1/0,frontBufferFlushThreshold:1/0,startOnSegmentBoundary:!1,maxBufferSize:60*1e3*1e3,maxFragLookUpTolerance:.25,maxBufferHole:.1,detectStallWithCurrentTimeMs:1250,highBufferWatchdogPeriod:2,nudgeOffset:.1,nudgeMaxRetry:3,nudgeOnVideoHole:!0,liveSyncMode:"edge",liveSyncDurationCount:3,liveSyncOnStallIncrease:1,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxLiveSyncPlaybackRate:1,liveDurationInfinity:!1,liveBackBufferLength:null,maxMaxBufferLength:600,enableWorker:!0,workerPath:null,enableSoftwareAES:!0,startLevel:void 0,startFragPrefetch:!1,fpsDroppedMonitoringPeriod:5e3,fpsDroppedMonitoringThreshold:.2,appendErrorMaxRetry:3,ignorePlaylistParsingErrors:!1,loader:DR,fLoader:void 0,pLoader:void 0,xhrSetup:void 0,licenseXhrSetup:void 0,licenseResponseCallback:void 0,abrController:zU,bufferController:N7,capLevelController:T1,errorController:WU,fpsController:O9,stretchShortVideoTrack:!1,maxAudioFramesDrift:1,forceKeyFrameOnDiscontinuity:!0,abrEwmaFastLive:3,abrEwmaSlowLive:9,abrEwmaFastVoD:3,abrEwmaSlowVoD:9,abrEwmaDefaultEstimate:5e5,abrEwmaDefaultEstimateMax:5e6,abrBandWidthFactor:.95,abrBandWidthUpFactor:.7,abrMaxWithRealBitrate:!1,maxStarvationDelay:4,maxLoadingDelay:4,minAutoBitrate:0,emeEnabled:!1,widevineLicenseUrl:void 0,drmSystems:{},drmSystemOptions:{},requestMediaKeySystemAccessFunc:kL,requireKeySystemAccessOnStart:!1,testBandwidth:!0,progressive:!1,lowLatencyMode:!0,cmcd:void 0,enableDateRangeMetadataCues:!0,enableEmsgMetadataCues:!0,enableEmsgKLVMetadata:!1,enableID3MetadataCues:!0,enableInterstitialPlayback:!0,interstitialAppendInPlace:!0,interstitialLiveLookAhead:10,useMediaCapabilities:!0,preserveManualLevelOnError:!1,certLoadPolicy:{default:L$},keyLoadPolicy:{default:{maxTimeToFirstByteMs:8e3,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:2e4,backoff:"linear"},errorRetry:{maxNumRetry:8,retryDelayMs:1e3,maxRetryDelayMs:2e4,backoff:"linear"}}},manifestLoadPolicy:{default:{maxTimeToFirstByteMs:1/0,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},playlistLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:2,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},fragLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:12e4,timeoutRetry:{maxNumRetry:4,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:6,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},steeringManifestLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},interstitialAssetListLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:3e4,timeoutRetry:{maxNumRetry:0,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:0,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,manifestLoadingMaxRetryTimeout:64e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,levelLoadingMaxRetryTimeout:64e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingMaxRetryTimeout:64e3},I$()),{},{subtitleStreamController:q9,subtitleTrackController:B9,timelineController:v$,audioStreamController:D7,audioTrackController:L7,emeController:Rc,cmcdController:L9,contentSteeringController:I9,interstitialsController:G9});function I$(){return{cueHandler:T$,enableWebVTT:!0,enableIMSC1:!0,enableCEA708Captions:!0,captionsTextTrack1Label:"English",captionsTextTrack1LanguageCode:"en",captionsTextTrack2Label:"Spanish",captionsTextTrack2LanguageCode:"es",captionsTextTrack3Label:"Unknown CC",captionsTextTrack3LanguageCode:"",captionsTextTrack4Label:"Unknown CC",captionsTextTrack4LanguageCode:"",renderTextTracksNatively:!0}}function N$(s,e,t){if((e.liveSyncDurationCount||e.liveMaxLatencyDurationCount)&&(e.liveSyncDuration||e.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");if(e.liveMaxLatencyDurationCount!==void 0&&(e.liveSyncDurationCount===void 0||e.liveMaxLatencyDurationCount<=e.liveSyncDurationCount))throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"');if(e.liveMaxLatencyDuration!==void 0&&(e.liveSyncDuration===void 0||e.liveMaxLatencyDuration<=e.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"');const i=rb(s),n=["manifest","level","frag"],r=["TimeOut","MaxRetry","RetryDelay","MaxRetryTimeout"];return n.forEach(a=>{const u=`${a==="level"?"playlist":a}LoadPolicy`,c=e[u]===void 0,d=[];r.forEach(f=>{const g=`${a}Loading${f}`,y=e[g];if(y!==void 0&&c){d.push(g);const v=i[u].default;switch(e[u]={default:v},f){case"TimeOut":v.maxLoadTimeMs=y,v.maxTimeToFirstByteMs=y;break;case"MaxRetry":v.errorRetry.maxNumRetry=y,v.timeoutRetry.maxNumRetry=y;break;case"RetryDelay":v.errorRetry.retryDelayMs=y,v.timeoutRetry.retryDelayMs=y;break;case"MaxRetryTimeout":v.errorRetry.maxRetryDelayMs=y,v.timeoutRetry.maxRetryDelayMs=y;break}}}),d.length&&t.warn(`hls.js config: "${d.join('", "')}" setting(s) are deprecated, use "${u}": ${ks(e[u])}`)}),us(us({},i),e)}function rb(s){return s&&typeof s=="object"?Array.isArray(s)?s.map(rb):Object.keys(s).reduce((e,t)=>(e[t]=rb(s[t]),e),{}):s}function O$(s,e){const t=s.loader;t!==oA&&t!==DR?(e.log("[config]: Custom loader detected, cannot enable progressive streaming"),s.progressive=!1):S$()&&(s.loader=oA,s.progressive=!0,s.enableSoftwareAES=!0,e.log("[config]: Progressive streaming enabled, using FetchLoader"))}const c0=2,M$=.1,P$=.05,B$=100;class F$ extends SL{constructor(e,t){super("gap-controller",e.logger),this.hls=void 0,this.fragmentTracker=void 0,this.media=null,this.mediaSource=void 0,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1,this.buffered={},this.lastCurrentTime=0,this.ended=0,this.waiting=0,this.onMediaPlaying=()=>{this.ended=0,this.waiting=0},this.onMediaWaiting=()=>{var i;(i=this.media)!=null&&i.seeking||(this.waiting=self.performance.now(),this.tick())},this.onMediaEnded=()=>{if(this.hls){var i;this.ended=((i=this.media)==null?void 0:i.currentTime)||1,this.hls.trigger(H.MEDIA_ENDED,{stalled:!1})}},this.hls=e,this.fragmentTracker=t,this.registerListeners()}registerListeners(){const{hls:e}=this;e&&(e.on(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.BUFFER_APPENDED,this.onBufferAppended,this))}unregisterListeners(){const{hls:e}=this;e&&(e.off(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.BUFFER_APPENDED,this.onBufferAppended,this))}destroy(){super.destroy(),this.unregisterListeners(),this.media=this.hls=this.fragmentTracker=null,this.mediaSource=void 0}onMediaAttached(e,t){this.setInterval(B$),this.mediaSource=t.mediaSource;const i=this.media=t.media;sr(i,"playing",this.onMediaPlaying),sr(i,"waiting",this.onMediaWaiting),sr(i,"ended",this.onMediaEnded)}onMediaDetaching(e,t){this.clearInterval();const{media:i}=this;i&&(br(i,"playing",this.onMediaPlaying),br(i,"waiting",this.onMediaWaiting),br(i,"ended",this.onMediaEnded),this.media=null),this.mediaSource=void 0}onBufferAppended(e,t){this.buffered=t.timeRanges}get hasBuffered(){return Object.keys(this.buffered).length>0}tick(){var e;if(!((e=this.media)!=null&&e.readyState)||!this.hasBuffered)return;const t=this.media.currentTime;this.poll(t,this.lastCurrentTime),this.lastCurrentTime=t}poll(e,t){var i,n;const r=(i=this.hls)==null?void 0:i.config;if(!r)return;const a=this.media;if(!a)return;const{seeking:u}=a,c=this.seeking&&!u,d=!this.seeking&&u,f=a.paused&&!u||a.ended||a.playbackRate===0;if(this.seeking=u,e!==t){t&&(this.ended=0),this.moved=!0,u||(this.nudgeRetry=0,r.nudgeOnVideoHole&&!f&&e>t&&this.nudgeOnVideoHole(e,t)),this.waiting===0&&this.stallResolved(e);return}if(d||c){c&&this.stallResolved(e);return}if(f){this.nudgeRetry=0,this.stallResolved(e),!this.ended&&a.ended&&this.hls&&(this.ended=e||1,this.hls.trigger(H.MEDIA_ENDED,{stalled:!1}));return}if(!gi.getBuffered(a).length){this.nudgeRetry=0;return}const g=gi.bufferInfo(a,e,0),y=g.nextStart||0,v=this.fragmentTracker;if(u&&v&&this.hls){const G=lA(this.hls.inFlightFragments,e),N=g.len>c0,K=!y||G||y-e>c0&&!v.getPartialFragment(e);if(N||K)return;this.moved=!1}const T=(n=this.hls)==null?void 0:n.latestLevelDetails;if(!this.moved&&this.stalled!==null&&v){if(!(g.len>0)&&!y)return;const N=Math.max(y,g.start||0)-e,k=!!(T!=null&&T.live)?T.targetduration*2:c0,R=Gm(e,v);if(N>0&&(N<=k||R)){a.paused||this._trySkipBufferHole(R);return}}const S=r.detectStallWithCurrentTimeMs,w=self.performance.now(),L=this.waiting;let O=this.stalled;if(O===null)if(L>0&&w-L=S||L)&&this.hls){var j;if(((j=this.mediaSource)==null?void 0:j.readyState)==="ended"&&!(T!=null&&T.live)&&Math.abs(e-(T?.edge||0))<1){if(this.ended)return;this.ended=e||1,this.hls.trigger(H.MEDIA_ENDED,{stalled:!0});return}if(this._reportStall(g),!this.media||!this.hls)return}const P=gi.bufferInfo(a,e,r.maxBufferHole);this._tryFixBufferStall(P,I,e)}stallResolved(e){const t=this.stalled;if(t&&this.hls&&(this.stalled=null,this.stallReported)){const i=self.performance.now()-t;this.log(`playback not stuck anymore @${e}, after ${Math.round(i)}ms`),this.stallReported=!1,this.waiting=0,this.hls.trigger(H.STALL_RESOLVED,{})}}nudgeOnVideoHole(e,t){var i;const n=this.buffered.video;if(this.hls&&this.media&&this.fragmentTracker&&(i=this.buffered.audio)!=null&&i.length&&n&&n.length>1&&e>n.end(0)){const r=gi.bufferedInfo(gi.timeRangesToArray(this.buffered.audio),e,0);if(r.len>1&&t>=r.start){const a=gi.timeRangesToArray(n),u=gi.bufferedInfo(a,t,0).bufferedIndex;if(u>-1&&uu)&&f-d<1&&e-d<2){const g=new Error(`nudging playhead to flush pipeline after video hole. currentTime: ${e} hole: ${d} -> ${f} buffered index: ${c}`);this.warn(g.message),this.media.currentTime+=1e-6;let y=Gm(e,this.fragmentTracker);y&&"fragment"in y?y=y.fragment:y||(y=void 0);const v=gi.bufferInfo(this.media,e,0);this.hls.trigger(H.ERROR,{type:Vt.MEDIA_ERROR,details:$e.BUFFER_SEEK_OVER_HOLE,fatal:!1,error:g,reason:g.message,frag:y,buffer:v.len,bufferInfo:v})}}}}}_tryFixBufferStall(e,t,i){var n,r;const{fragmentTracker:a,media:u}=this,c=(n=this.hls)==null?void 0:n.config;if(!u||!a||!c)return;const d=(r=this.hls)==null?void 0:r.latestLevelDetails,f=Gm(i,a);if((f||d!=null&&d.live&&i1&&e.len>c.maxBufferHole||e.nextStart&&(e.nextStart-ic.highBufferWatchdogPeriod*1e3||this.waiting)&&(this.warn("Trying to nudge playhead over buffer-hole"),this._tryNudgeBuffer(e))}adjacentTraversal(e,t){const i=this.fragmentTracker,n=e.nextStart;if(i&&n){const r=i.getFragAtPos(t,jt.MAIN),a=i.getFragAtPos(n,jt.MAIN);if(r&&a)return a.sn-r.sn<2}return!1}_reportStall(e){const{hls:t,media:i,stallReported:n,stalled:r}=this;if(!n&&r!==null&&i&&t){this.stallReported=!0;const a=new Error(`Playback stalling at @${i.currentTime} due to low buffer (${ks(e)})`);this.warn(a.message),t.trigger(H.ERROR,{type:Vt.MEDIA_ERROR,details:$e.BUFFER_STALLED_ERROR,fatal:!1,error:a,buffer:e.len,bufferInfo:e,stalled:{start:r}})}}_trySkipBufferHole(e){var t;const{fragmentTracker:i,media:n}=this,r=(t=this.hls)==null?void 0:t.config;if(!n||!i||!r)return 0;const a=n.currentTime,u=gi.bufferInfo(n,a,0),c=a0&&u.len<1&&n.readyState<3,y=c-a;if(y>0&&(f||g)){if(y>r.maxBufferHole){let T=!1;if(a===0){const S=i.getAppendedFrag(0,jt.MAIN);S&&c"u"))return self.VTTCue||self.TextTrackCue}function qv(s,e,t,i,n){let r=new s(e,t,"");try{r.value=i,n&&(r.type=n)}catch{r=new s(e,t,ks(n?us({type:n},i):i))}return r}const qm=(()=>{const s=ab();try{s&&new s(0,Number.POSITIVE_INFINITY,"")}catch{return Number.MAX_VALUE}return Number.POSITIVE_INFINITY})();class j${constructor(e){this.hls=void 0,this.id3Track=null,this.media=null,this.dateRangeCuesAppended={},this.removeCues=!0,this.assetCue=void 0,this.onEventCueEnter=()=>{this.hls&&this.hls.trigger(H.EVENT_CUE_ENTER,{})},this.hls=e,this._registerListeners()}destroy(){this._unregisterListeners(),this.id3Track=null,this.media=null,this.dateRangeCuesAppended={},this.hls=this.onEventCueEnter=null}_registerListeners(){const{hls:e}=this;e&&(e.on(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.on(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),e.on(H.BUFFER_FLUSHING,this.onBufferFlushing,this),e.on(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.on(H.LEVEL_PTS_UPDATED,this.onLevelPtsUpdated,this))}_unregisterListeners(){const{hls:e}=this;e&&(e.off(H.MEDIA_ATTACHING,this.onMediaAttaching,this),e.off(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),e.off(H.BUFFER_FLUSHING,this.onBufferFlushing,this),e.off(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.off(H.LEVEL_PTS_UPDATED,this.onLevelPtsUpdated,this))}onMediaAttaching(e,t){var i;this.media=t.media,((i=t.overrides)==null?void 0:i.cueRemoval)===!1&&(this.removeCues=!1)}onMediaAttached(){var e;const t=(e=this.hls)==null?void 0:e.latestLevelDetails;t&&this.updateDateRangeCues(t)}onMediaDetaching(e,t){this.media=null,!t.transferMedia&&(this.id3Track&&(this.removeCues&&yc(this.id3Track,this.onEventCueEnter),this.id3Track=null),this.dateRangeCuesAppended={})}onManifestLoading(){this.dateRangeCuesAppended={}}createTrack(e){const t=this.getID3Track(e.textTracks);return t.mode="hidden",t}getID3Track(e){if(this.media){for(let t=0;tqm&&(g=qm),g-f<=0&&(g=f+U$);for(let v=0;vf.type===jr.audioId3&&c:n==="video"?d=f=>f.type===jr.emsg&&u:d=f=>f.type===jr.audioId3&&c||f.type===jr.emsg&&u,sb(r,t,i,d)}}onLevelUpdated(e,{details:t}){this.updateDateRangeCues(t,!0)}onLevelPtsUpdated(e,t){Math.abs(t.drift)>.01&&this.updateDateRangeCues(t.details)}updateDateRangeCues(e,t){if(!this.hls||!this.media)return;const{assetPlayerId:i,timelineOffset:n,enableDateRangeMetadataCues:r,interstitialsController:a}=this.hls.config;if(!r)return;const u=ab();if(i&&n&&!a){const{fragmentStart:S,fragmentEnd:w}=e;let L=this.assetCue;L?(L.startTime=S,L.endTime=w):u&&(L=this.assetCue=qv(u,S,w,{assetPlayerId:this.hls.config.assetPlayerId},"hlsjs.interstitial.asset"),L&&(L.id=i,this.id3Track||(this.id3Track=this.createTrack(this.media)),this.id3Track.addCue(L),L.addEventListener("enter",this.onEventCueEnter)))}if(!e.hasProgramDateTime)return;const{id3Track:c}=this,{dateRanges:d}=e,f=Object.keys(d);let g=this.dateRangeCuesAppended;if(c&&t){var y;if((y=c.cues)!=null&&y.length){const S=Object.keys(g).filter(w=>!f.includes(w));for(let w=S.length;w--;){var v;const L=S[w],O=(v=g[L])==null?void 0:v.cues;delete g[L],O&&Object.keys(O).forEach(I=>{const j=O[I];if(j){j.removeEventListener("enter",this.onEventCueEnter);try{c.removeCue(j)}catch{}}})}}else g=this.dateRangeCuesAppended={}}const T=e.fragments[e.fragments.length-1];if(!(f.length===0||!Ot(T?.programDateTime))){this.id3Track||(this.id3Track=this.createTrack(this.media));for(let S=0;S{if(z!==L.id){const X=d[z];if(X.class===L.class&&X.startDate>L.startDate&&(!Y||L.startDate.01&&(z.startTime=O,z.endTime=G);else if(u){let X=L.attr[Y];lj(Y)&&(X=iL(X));const J=qv(u,O,G,{key:Y,data:X},jr.dateRange);J&&(J.id=w,this.id3Track.addCue(J),j[Y]=J,a&&(Y==="X-ASSET-LIST"||Y==="X-ASSET-URL")&&J.addEventListener("enter",this.onEventCueEnter))}}g[w]={cues:j,dateRange:L,durationKnown:P}}}}}class $${constructor(e){this.hls=void 0,this.config=void 0,this.media=null,this.currentTime=0,this.stallCount=0,this._latency=null,this._targetLatencyUpdated=!1,this.onTimeupdate=()=>{const{media:t}=this,i=this.levelDetails;if(!t||!i)return;this.currentTime=t.currentTime;const n=this.computeLatency();if(n===null)return;this._latency=n;const{lowLatencyMode:r,maxLiveSyncPlaybackRate:a}=this.config;if(!r||a===1||!i.live)return;const u=this.targetLatency;if(u===null)return;const c=n-u,d=Math.min(this.maxLatency,u+i.targetduration);if(c.05&&this.forwardBufferLength>1){const g=Math.min(2,Math.max(1,a)),y=Math.round(2/(1+Math.exp(-.75*c-this.edgeStalled))*20)/20,v=Math.min(g,Math.max(1,y));this.changeMediaPlaybackRate(t,v)}else t.playbackRate!==1&&t.playbackRate!==0&&this.changeMediaPlaybackRate(t,1)},this.hls=e,this.config=e.config,this.registerListeners()}get levelDetails(){var e;return((e=this.hls)==null?void 0:e.latestLevelDetails)||null}get latency(){return this._latency||0}get maxLatency(){const{config:e}=this;if(e.liveMaxLatencyDuration!==void 0)return e.liveMaxLatencyDuration;const t=this.levelDetails;return t?e.liveMaxLatencyDurationCount*t.targetduration:0}get targetLatency(){const e=this.levelDetails;if(e===null||this.hls===null)return null;const{holdBack:t,partHoldBack:i,targetduration:n}=e,{liveSyncDuration:r,liveSyncDurationCount:a,lowLatencyMode:u}=this.config,c=this.hls.userConfig;let d=u&&i||t;(this._targetLatencyUpdated||c.liveSyncDuration||c.liveSyncDurationCount||d===0)&&(d=r!==void 0?r:a*n);const f=n;return d+Math.min(this.stallCount*this.config.liveSyncOnStallIncrease,f)}set targetLatency(e){this.stallCount=0,this.config.liveSyncDuration=e,this._targetLatencyUpdated=!0}get liveSyncPosition(){const e=this.estimateLiveEdge(),t=this.targetLatency;if(e===null||t===null)return null;const i=this.levelDetails;if(i===null)return null;const n=i.edge,r=e-t-this.edgeStalled,a=n-i.totalduration,u=n-(this.config.lowLatencyMode&&i.partTarget||i.targetduration);return Math.min(Math.max(a,r),u)}get drift(){const e=this.levelDetails;return e===null?1:e.drift}get edgeStalled(){const e=this.levelDetails;if(e===null)return 0;const t=(this.config.lowLatencyMode&&e.partTarget||e.targetduration)*3;return Math.max(e.age-t,0)}get forwardBufferLength(){const{media:e}=this,t=this.levelDetails;if(!e||!t)return 0;const i=e.buffered.length;return(i?e.buffered.end(i-1):t.edge)-this.currentTime}destroy(){this.unregisterListeners(),this.onMediaDetaching(),this.hls=null}registerListeners(){const{hls:e}=this;e&&(e.on(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.on(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.on(H.ERROR,this.onError,this))}unregisterListeners(){const{hls:e}=this;e&&(e.off(H.MEDIA_ATTACHED,this.onMediaAttached,this),e.off(H.MEDIA_DETACHING,this.onMediaDetaching,this),e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.LEVEL_UPDATED,this.onLevelUpdated,this),e.off(H.ERROR,this.onError,this))}onMediaAttached(e,t){this.media=t.media,this.media.addEventListener("timeupdate",this.onTimeupdate)}onMediaDetaching(){this.media&&(this.media.removeEventListener("timeupdate",this.onTimeupdate),this.media=null)}onManifestLoading(){this._latency=null,this.stallCount=0}onLevelUpdated(e,{details:t}){t.advanced&&this.onTimeupdate(),!t.live&&this.media&&this.media.removeEventListener("timeupdate",this.onTimeupdate)}onError(e,t){var i;t.details===$e.BUFFER_STALLED_ERROR&&(this.stallCount++,this.hls&&(i=this.levelDetails)!=null&&i.live&&this.hls.logger.warn("[latency-controller]: Stall detected, adjusting target latency"))}changeMediaPlaybackRate(e,t){var i,n;e.playbackRate!==t&&((i=this.hls)==null||i.logger.debug(`[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${(n=this.targetLatency)==null?void 0:n.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${e.playbackRate} to ${t}`),e.playbackRate=t)}estimateLiveEdge(){const e=this.levelDetails;return e===null?null:e.edge+e.age}computeLatency(){const e=this.estimateLiveEdge();return e===null?null:e-this.currentTime}}class H$ extends b1{constructor(e,t){super(e,"level-controller"),this._levels=[],this._firstLevel=-1,this._maxAutoLevel=-1,this._startLevel=void 0,this.currentLevel=null,this.currentLevelIndex=-1,this.manualLevelIndex=-1,this.steering=void 0,this.onParsedComplete=void 0,this.steering=t,this._registerListeners()}_registerListeners(){const{hls:e}=this;e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.on(H.LEVEL_LOADED,this.onLevelLoaded,this),e.on(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.on(H.FRAG_BUFFERED,this.onFragBuffered,this),e.on(H.ERROR,this.onError,this)}_unregisterListeners(){const{hls:e}=this;e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.MANIFEST_LOADED,this.onManifestLoaded,this),e.off(H.LEVEL_LOADED,this.onLevelLoaded,this),e.off(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.off(H.FRAG_BUFFERED,this.onFragBuffered,this),e.off(H.ERROR,this.onError,this)}destroy(){this._unregisterListeners(),this.steering=null,this.resetLevels(),super.destroy()}stopLoad(){this._levels.forEach(t=>{t.loadError=0,t.fragmentError=0}),super.stopLoad()}resetLevels(){this._startLevel=void 0,this.manualLevelIndex=-1,this.currentLevelIndex=-1,this.currentLevel=null,this._levels=[],this._maxAutoLevel=-1}onManifestLoading(e,t){this.resetLevels()}onManifestLoaded(e,t){const i=this.hls.config.preferManagedMediaSource,n=[],r={},a={};let u=!1,c=!1,d=!1;t.levels.forEach(f=>{const g=f.attrs;let{audioCodec:y,videoCodec:v}=f;y&&(f.audioCodec=y=H0(y,i)||void 0),v&&(v=f.videoCodec=EU(v));const{width:T,height:S,unknownCodecs:w}=f,L=w?.length||0;if(u||(u=!!(T&&S)),c||(c=!!v),d||(d=!!y),L||y&&!this.isAudioSupported(y)||v&&!this.isVideoSupported(v)){this.log(`Some or all CODECS not supported "${g.CODECS}"`);return}const{CODECS:O,"FRAME-RATE":I,"HDCP-LEVEL":j,"PATHWAY-ID":P,RESOLUTION:G,"VIDEO-RANGE":N}=g,k=`${`${P||"."}-`}${f.bitrate}-${G}-${I}-${O}-${N}-${j}`;if(r[k])if(r[k].uri!==f.url&&!f.attrs["PATHWAY-ID"]){const R=a[k]+=1;f.attrs["PATHWAY-ID"]=new Array(R+1).join(".");const Y=this.createLevel(f);r[k]=Y,n.push(Y)}else r[k].addGroupId("audio",g.AUDIO),r[k].addGroupId("text",g.SUBTITLES);else{const R=this.createLevel(f);r[k]=R,a[k]=1,n.push(R)}}),this.filterAndSortMediaOptions(n,t,u,c,d)}createLevel(e){const t=new $h(e),i=e.supplemental;if(i!=null&&i.videoCodec&&!this.isVideoSupported(i.videoCodec)){const n=new Error(`SUPPLEMENTAL-CODECS not supported "${i.videoCodec}"`);this.log(n.message),t.supportedResult=mL(n,[])}return t}isAudioSupported(e){return Uh(e,"audio",this.hls.config.preferManagedMediaSource)}isVideoSupported(e){return Uh(e,"video",this.hls.config.preferManagedMediaSource)}filterAndSortMediaOptions(e,t,i,n,r){var a;let u=[],c=[],d=e;const f=((a=t.stats)==null?void 0:a.parsing)||{};if((i||n)&&r&&(d=d.filter(({videoCodec:O,videoRange:I,width:j,height:P})=>(!!O||!!(j&&P))&&OU(I))),d.length===0){Promise.resolve().then(()=>{if(this.hls){let O="no level with compatible codecs found in manifest",I=O;t.levels.length&&(I=`one or more CODECS in variant not supported: ${ks(t.levels.map(P=>P.attrs.CODECS).filter((P,G,N)=>N.indexOf(P)===G))}`,this.warn(I),O+=` (${I})`);const j=new Error(O);this.hls.trigger(H.ERROR,{type:Vt.MEDIA_ERROR,details:$e.MANIFEST_INCOMPATIBLE_CODECS_ERROR,fatal:!0,url:t.url,error:j,reason:I})}}),f.end=performance.now();return}t.audioTracks&&(u=t.audioTracks.filter(O=>!O.audioCodec||this.isAudioSupported(O.audioCodec)),cA(u)),t.subtitles&&(c=t.subtitles,cA(c));const g=d.slice(0);d.sort((O,I)=>{if(O.attrs["HDCP-LEVEL"]!==I.attrs["HDCP-LEVEL"])return(O.attrs["HDCP-LEVEL"]||"")>(I.attrs["HDCP-LEVEL"]||"")?1:-1;if(i&&O.height!==I.height)return O.height-I.height;if(O.frameRate!==I.frameRate)return O.frameRate-I.frameRate;if(O.videoRange!==I.videoRange)return z0.indexOf(O.videoRange)-z0.indexOf(I.videoRange);if(O.videoCodec!==I.videoCodec){const j=tw(O.videoCodec),P=tw(I.videoCodec);if(j!==P)return P-j}if(O.uri===I.uri&&O.codecSet!==I.codecSet){const j=$0(O.codecSet),P=$0(I.codecSet);if(j!==P)return P-j}return O.averageBitrate!==I.averageBitrate?O.averageBitrate-I.averageBitrate:0});let y=g[0];if(this.steering&&(d=this.steering.filterParsedLevels(d),d.length!==g.length)){for(let O=0;Oj&&j===this.hls.abrEwmaDefaultEstimate&&(this.hls.bandwidthEstimate=P)}break}const T=r&&!n,S=this.hls.config,w=!!(S.audioStreamController&&S.audioTrackController),L={levels:d,audioTracks:u,subtitleTracks:c,sessionData:t.sessionData,sessionKeys:t.sessionKeys,firstLevel:this._firstLevel,stats:t.stats,audio:r,video:n,altAudio:w&&!T&&u.some(O=>!!O.url)};f.end=performance.now(),this.hls.trigger(H.MANIFEST_PARSED,L)}get levels(){return this._levels.length===0?null:this._levels}get loadLevelObj(){return this.currentLevel}get level(){return this.currentLevelIndex}set level(e){const t=this._levels;if(t.length===0)return;if(e<0||e>=t.length){const f=new Error("invalid level idx"),g=e<0;if(this.hls.trigger(H.ERROR,{type:Vt.OTHER_ERROR,details:$e.LEVEL_SWITCH_ERROR,level:e,fatal:g,error:f,reason:f.message}),g)return;e=Math.min(e,t.length-1)}const i=this.currentLevelIndex,n=this.currentLevel,r=n?n.attrs["PATHWAY-ID"]:void 0,a=t[e],u=a.attrs["PATHWAY-ID"];if(this.currentLevelIndex=e,this.currentLevel=a,i===e&&n&&r===u)return;this.log(`Switching to level ${e} (${a.height?a.height+"p ":""}${a.videoRange?a.videoRange+" ":""}${a.codecSet?a.codecSet+" ":""}@${a.bitrate})${u?" with Pathway "+u:""} from level ${i}${r?" with Pathway "+r:""}`);const c={level:e,attrs:a.attrs,details:a.details,bitrate:a.bitrate,averageBitrate:a.averageBitrate,maxBitrate:a.maxBitrate,realBitrate:a.realBitrate,width:a.width,height:a.height,codecSet:a.codecSet,audioCodec:a.audioCodec,videoCodec:a.videoCodec,audioGroups:a.audioGroups,subtitleGroups:a.subtitleGroups,loaded:a.loaded,loadError:a.loadError,fragmentError:a.fragmentError,name:a.name,id:a.id,uri:a.uri,url:a.url,urlId:0,audioGroupIds:a.audioGroupIds,textGroupIds:a.textGroupIds};this.hls.trigger(H.LEVEL_SWITCHING,c);const d=a.details;if(!d||d.live){const f=this.switchParams(a.uri,n?.details,d);this.loadPlaylist(f)}}get manualLevel(){return this.manualLevelIndex}set manualLevel(e){this.manualLevelIndex=e,this._startLevel===void 0&&(this._startLevel=e),e!==-1&&(this.level=e)}get firstLevel(){return this._firstLevel}set firstLevel(e){this._firstLevel=e}get startLevel(){if(this._startLevel===void 0){const e=this.hls.config.startLevel;return e!==void 0?e:this.hls.firstAutoLevel}return this._startLevel}set startLevel(e){this._startLevel=e}get pathways(){return this.steering?this.steering.pathways():[]}get pathwayPriority(){return this.steering?this.steering.pathwayPriority:null}set pathwayPriority(e){if(this.steering){const t=this.steering.pathways(),i=e.filter(n=>t.indexOf(n)!==-1);if(e.length<1){this.warn(`pathwayPriority ${e} should contain at least one pathway from list: ${t}`);return}this.steering.pathwayPriority=i}}onError(e,t){t.fatal||!t.context||t.context.type===Ii.LEVEL&&t.context.level===this.level&&this.checkRetry(t)}onFragBuffered(e,{frag:t}){if(t!==void 0&&t.type===jt.MAIN){const i=t.elementaryStreams;if(!Object.keys(i).some(r=>!!i[r]))return;const n=this._levels[t.level];n!=null&&n.loadError&&(this.log(`Resetting level error count of ${n.loadError} on frag buffered`),n.loadError=0)}}onLevelLoaded(e,t){var i;const{level:n,details:r}=t,a=t.levelInfo;if(!a){var u;this.warn(`Invalid level index ${n}`),(u=t.deliveryDirectives)!=null&&u.skip&&(r.deltaUpdateFailed=!0);return}if(a===this.currentLevel||t.withoutMultiVariant){a.fragmentError===0&&(a.loadError=0);let c=a.details;c===t.details&&c.advanced&&(c=void 0),this.playlistLoaded(n,t,c)}else(i=t.deliveryDirectives)!=null&&i.skip&&(r.deltaUpdateFailed=!0)}loadPlaylist(e){super.loadPlaylist(),this.shouldLoadPlaylist(this.currentLevel)&&this.scheduleLoading(this.currentLevel,e)}loadingPlaylist(e,t){super.loadingPlaylist(e,t);const i=this.getUrlWithDirectives(e.uri,t),n=this.currentLevelIndex,r=e.attrs["PATHWAY-ID"],a=e.details,u=a?.age;this.log(`Loading level index ${n}${t?.msn!==void 0?" at sn "+t.msn+" part "+t.part:""}${r?" Pathway "+r:""}${u&&a.live?" age "+u.toFixed(1)+(a.type&&" "+a.type||""):""} ${i}`),this.hls.trigger(H.LEVEL_LOADING,{url:i,level:n,levelInfo:e,pathwayId:e.attrs["PATHWAY-ID"],id:0,deliveryDirectives:t||null})}get nextLoadLevel(){return this.manualLevelIndex!==-1?this.manualLevelIndex:this.hls.nextAutoLevel}set nextLoadLevel(e){this.level=e,this.manualLevelIndex===-1&&(this.hls.nextAutoLevel=e)}removeLevel(e){var t;if(this._levels.length===1)return;const i=this._levels.filter((r,a)=>a!==e?!0:(this.steering&&this.steering.removeLevel(r),r===this.currentLevel&&(this.currentLevel=null,this.currentLevelIndex=-1,r.details&&r.details.fragments.forEach(u=>u.level=-1)),!1));ML(i),this._levels=i,this.currentLevelIndex>-1&&(t=this.currentLevel)!=null&&t.details&&(this.currentLevelIndex=this.currentLevel.details.fragments[0].level),this.manualLevelIndex>-1&&(this.manualLevelIndex=this.currentLevelIndex);const n=i.length-1;this._firstLevel=Math.min(this._firstLevel,n),this._startLevel&&(this._startLevel=Math.min(this._startLevel,n)),this.hls.trigger(H.LEVELS_UPDATED,{levels:i})}onLevelsUpdated(e,{levels:t}){this._levels=t}checkMaxAutoUpdated(){const{autoLevelCapping:e,maxAutoLevel:t,maxHdcpLevel:i}=this.hls;this._maxAutoLevel!==t&&(this._maxAutoLevel=t,this.hls.trigger(H.MAX_AUTO_LEVEL_UPDATED,{autoLevelCapping:e,levels:this.levels,maxAutoLevel:t,minAutoLevel:this.hls.minAutoLevel,maxHdcpLevel:i}))}}function cA(s){const e={};s.forEach(t=>{const i=t.groupId||"";t.id=e[i]=e[i]||0,e[i]++})}function LR(){return self.SourceBuffer||self.WebKitSourceBuffer}function RR(){if(!Ll())return!1;const e=LR();return!e||e.prototype&&typeof e.prototype.appendBuffer=="function"&&typeof e.prototype.remove=="function"}function z$(){if(!RR())return!1;const s=Ll();return typeof s?.isTypeSupported=="function"&&(["avc1.42E01E,mp4a.40.2","av01.0.01M.08","vp09.00.50.08"].some(e=>s.isTypeSupported(jh(e,"video")))||["mp4a.40.2","fLaC"].some(e=>s.isTypeSupported(jh(e,"audio"))))}function V$(){var s;const e=LR();return typeof(e==null||(s=e.prototype)==null?void 0:s.changeType)=="function"}const G$=100;class q$ extends h1{constructor(e,t,i){super(e,t,i,"stream-controller",jt.MAIN),this.audioCodecSwap=!1,this.level=-1,this._forceStartLoad=!1,this._hasEnoughToStart=!1,this.altAudio=0,this.audioOnly=!1,this.fragPlaying=null,this.fragLastKbps=0,this.couldBacktrack=!1,this.backtrackFragment=null,this.audioCodecSwitch=!1,this.videoBuffer=null,this.onMediaPlaying=()=>{this.tick()},this.onMediaSeeked=()=>{const n=this.media,r=n?n.currentTime:null;if(r===null||!Ot(r)||(this.log(`Media seeked to ${r.toFixed(3)}`),!this.getBufferedFrag(r)))return;const a=this.getFwdBufferInfoAtPos(n,r,jt.MAIN,0);if(a===null||a.len===0){this.warn(`Main forward buffer length at ${r} on "seeked" event ${a?a.len:"empty"})`);return}this.tick()},this.registerListeners()}registerListeners(){super.registerListeners();const{hls:e}=this;e.on(H.MANIFEST_PARSED,this.onManifestParsed,this),e.on(H.LEVEL_LOADING,this.onLevelLoading,this),e.on(H.LEVEL_LOADED,this.onLevelLoaded,this),e.on(H.FRAG_LOAD_EMERGENCY_ABORTED,this.onFragLoadEmergencyAborted,this),e.on(H.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),e.on(H.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),e.on(H.BUFFER_CREATED,this.onBufferCreated,this),e.on(H.BUFFER_FLUSHED,this.onBufferFlushed,this),e.on(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.on(H.FRAG_BUFFERED,this.onFragBuffered,this)}unregisterListeners(){super.unregisterListeners();const{hls:e}=this;e.off(H.MANIFEST_PARSED,this.onManifestParsed,this),e.off(H.LEVEL_LOADED,this.onLevelLoaded,this),e.off(H.FRAG_LOAD_EMERGENCY_ABORTED,this.onFragLoadEmergencyAborted,this),e.off(H.AUDIO_TRACK_SWITCHING,this.onAudioTrackSwitching,this),e.off(H.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),e.off(H.BUFFER_CREATED,this.onBufferCreated,this),e.off(H.BUFFER_FLUSHED,this.onBufferFlushed,this),e.off(H.LEVELS_UPDATED,this.onLevelsUpdated,this),e.off(H.FRAG_BUFFERED,this.onFragBuffered,this)}onHandlerDestroying(){this.onMediaPlaying=this.onMediaSeeked=null,this.unregisterListeners(),super.onHandlerDestroying()}startLoad(e,t){if(this.levels){const{lastCurrentTime:i,hls:n}=this;if(this.stopLoad(),this.setInterval(G$),this.level=-1,!this.startFragRequested){let r=n.startLevel;r===-1&&(n.config.testBandwidth&&this.levels.length>1?(r=0,this.bitrateTest=!0):r=n.firstAutoLevel),n.nextLoadLevel=r,this.level=n.loadLevel,this._hasEnoughToStart=!!t}i>0&&e===-1&&!t&&(this.log(`Override startPosition with lastCurrentTime @${i.toFixed(3)}`),e=i),this.state=ot.IDLE,this.nextLoadPosition=this.lastCurrentTime=e+this.timelineOffset,this.startPosition=t?-1:e,this.tick()}else this._forceStartLoad=!0,this.state=ot.STOPPED}stopLoad(){this._forceStartLoad=!1,super.stopLoad()}doTick(){switch(this.state){case ot.WAITING_LEVEL:{const{levels:e,level:t}=this,i=e?.[t],n=i?.details;if(n&&(!n.live||this.levelLastLoaded===i&&!this.waitForLive(i))){if(this.waitForCdnTuneIn(n))break;this.state=ot.IDLE;break}else if(this.hls.nextLoadLevel!==this.level){this.state=ot.IDLE;break}break}case ot.FRAG_LOADING_WAITING_RETRY:this.checkRetryDate();break}this.state===ot.IDLE&&this.doTickIdle(),this.onTickEnd()}onTickEnd(){var e;super.onTickEnd(),(e=this.media)!=null&&e.readyState&&this.media.seeking===!1&&(this.lastCurrentTime=this.media.currentTime),this.checkFragmentChanged()}doTickIdle(){const{hls:e,levelLastLoaded:t,levels:i,media:n}=this;if(t===null||!n&&!this.primaryPrefetch&&(this.startFragRequested||!e.config.startFragPrefetch)||this.altAudio&&this.audioOnly)return;const r=this.buffering?e.nextLoadLevel:e.loadLevel;if(!(i!=null&&i[r]))return;const a=i[r],u=this.getMainFwdBufferInfo();if(u===null)return;const c=this.getLevelDetails();if(c&&this._streamEnded(u,c)){const S={};this.altAudio===2&&(S.type="video"),this.hls.trigger(H.BUFFER_EOS,S),this.state=ot.ENDED;return}if(!this.buffering)return;e.loadLevel!==r&&e.manualLevel===-1&&this.log(`Adapting to level ${r} from level ${this.level}`),this.level=e.nextLoadLevel=r;const d=a.details;if(!d||this.state===ot.WAITING_LEVEL||this.waitForLive(a)){this.level=r,this.state=ot.WAITING_LEVEL,this.startFragRequested=!1;return}const f=u.len,g=this.getMaxBufferLength(a.maxBitrate);if(f>=g)return;this.backtrackFragment&&this.backtrackFragment.start>u.end&&(this.backtrackFragment=null);const y=this.backtrackFragment?this.backtrackFragment.start:u.end;let v=this.getNextFragment(y,d);if(this.couldBacktrack&&!this.fragPrevious&&v&&an(v)&&this.fragmentTracker.getState(v)!==Sn.OK){var T;const w=((T=this.backtrackFragment)!=null?T:v).sn-d.startSN,L=d.fragments[w-1];L&&v.cc===L.cc&&(v=L,this.fragmentTracker.removeFragment(L))}else this.backtrackFragment&&u.len&&(this.backtrackFragment=null);if(v&&this.isLoopLoading(v,y)){if(!v.gap){const w=this.audioOnly&&!this.altAudio?ws.AUDIO:ws.VIDEO,L=(w===ws.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media;L&&this.afterBufferFlushed(L,w,jt.MAIN)}v=this.getNextFragmentLoopLoading(v,d,u,jt.MAIN,g)}v&&(v.initSegment&&!v.initSegment.data&&!this.bitrateTest&&(v=v.initSegment),this.loadFragment(v,a,y))}loadFragment(e,t,i){const n=this.fragmentTracker.getState(e);n===Sn.NOT_LOADED||n===Sn.PARTIAL?an(e)?this.bitrateTest?(this.log(`Fragment ${e.sn} of level ${e.level} is being downloaded to test bitrate and will not be buffered`),this._loadBitrateTestFrag(e,t)):super.loadFragment(e,t,i):this._loadInitSegment(e,t):this.clearTrackerIfNeeded(e)}getBufferedFrag(e){return this.fragmentTracker.getBufferedFrag(e,jt.MAIN)}followingBufferedFrag(e){return e?this.getBufferedFrag(e.end+.5):null}immediateLevelSwitch(){this.abortCurrentFrag(),this.flushMainBuffer(0,Number.POSITIVE_INFINITY)}nextLevelSwitch(){const{levels:e,media:t}=this;if(t!=null&&t.readyState){let i;const n=this.getAppendedFrag(t.currentTime);n&&n.start>1&&this.flushMainBuffer(0,n.start-1);const r=this.getLevelDetails();if(r!=null&&r.live){const u=this.getMainFwdBufferInfo();if(!u||u.len=a-t.maxFragLookUpTolerance&&r<=u;if(n!==null&&i.duration>n&&(r{this.hls&&this.hls.trigger(H.AUDIO_TRACK_SWITCHED,t)}),i.trigger(H.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:null});return}i.trigger(H.AUDIO_TRACK_SWITCHED,t)}}onAudioTrackSwitched(e,t){const i=V0(t.url,this.hls);if(i){const n=this.videoBuffer;n&&this.mediaBuffer!==n&&(this.log("Switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=n)}this.altAudio=i?2:0,this.tick()}onBufferCreated(e,t){const i=t.tracks;let n,r,a=!1;for(const u in i){const c=i[u];if(c.id==="main"){if(r=u,n=c,u==="video"){const d=i[u];d&&(this.videoBuffer=d.buffer)}}else a=!0}a&&n?(this.log(`Alternate track found, use ${r}.buffered to schedule main fragment loading`),this.mediaBuffer=n.buffer):this.mediaBuffer=this.media}onFragBuffered(e,t){const{frag:i,part:n}=t,r=i.type===jt.MAIN;if(r){if(this.fragContextChanged(i)){this.warn(`Fragment ${i.sn}${n?" p: "+n.index:""} of level ${i.level} finished buffering, but was aborted. state: ${this.state}`),this.state===ot.PARSED&&(this.state=ot.IDLE);return}const u=n?n.stats:i.stats;this.fragLastKbps=Math.round(8*u.total/(u.buffering.end-u.loading.first)),an(i)&&(this.fragPrevious=i),this.fragBufferedComplete(i,n)}const a=this.media;a&&(!this._hasEnoughToStart&&gi.getBuffered(a).length&&(this._hasEnoughToStart=!0,this.seekToStartPos()),r&&this.tick())}get hasEnoughToStart(){return this._hasEnoughToStart}onError(e,t){var i;if(t.fatal){this.state=ot.ERROR;return}switch(t.details){case $e.FRAG_GAP:case $e.FRAG_PARSING_ERROR:case $e.FRAG_DECRYPT_ERROR:case $e.FRAG_LOAD_ERROR:case $e.FRAG_LOAD_TIMEOUT:case $e.KEY_LOAD_ERROR:case $e.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(jt.MAIN,t);break;case $e.LEVEL_LOAD_ERROR:case $e.LEVEL_LOAD_TIMEOUT:case $e.LEVEL_PARSING_ERROR:!t.levelRetry&&this.state===ot.WAITING_LEVEL&&((i=t.context)==null?void 0:i.type)===Ii.LEVEL&&(this.state=ot.IDLE);break;case $e.BUFFER_ADD_CODEC_ERROR:case $e.BUFFER_APPEND_ERROR:if(t.parent!=="main")return;this.reduceLengthAndFlushBuffer(t)&&this.resetLoadingState();break;case $e.BUFFER_FULL_ERROR:if(t.parent!=="main")return;this.reduceLengthAndFlushBuffer(t)&&(!this.config.interstitialsController&&this.config.assetPlayerId?this._hasEnoughToStart=!0:this.flushMainBuffer(0,Number.POSITIVE_INFINITY));break;case $e.INTERNAL_EXCEPTION:this.recoverWorkerError(t);break}}onFragLoadEmergencyAborted(){this.state=ot.IDLE,this._hasEnoughToStart||(this.startFragRequested=!1,this.nextLoadPosition=this.lastCurrentTime),this.tickImmediate()}onBufferFlushed(e,{type:t}){if(t!==ws.AUDIO||!this.altAudio){const i=(t===ws.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media;i&&(this.afterBufferFlushed(i,t,jt.MAIN),this.tick())}}onLevelsUpdated(e,t){this.level>-1&&this.fragCurrent&&(this.level=this.fragCurrent.level,this.level===-1&&this.resetWhenMissingContext(this.fragCurrent)),this.levels=t.levels}swapAudioCodec(){this.audioCodecSwap=!this.audioCodecSwap}seekToStartPos(){const{media:e}=this;if(!e)return;const t=e.currentTime;let i=this.startPosition;if(i>=0&&t0&&(c{const{hls:n}=this,r=i?.frag;if(!r||this.fragContextChanged(r))return;t.fragmentError=0,this.state=ot.IDLE,this.startFragRequested=!1,this.bitrateTest=!1;const a=r.stats;a.parsing.start=a.parsing.end=a.buffering.start=a.buffering.end=self.performance.now(),n.trigger(H.FRAG_LOADED,i),r.bitrateTest=!1}).catch(i=>{this.state===ot.STOPPED||this.state===ot.ERROR||(this.warn(i),this.resetFragmentLoading(e))})}_handleTransmuxComplete(e){const t=this.playlistType,{hls:i}=this,{remuxResult:n,chunkMeta:r}=e,a=this.getCurrentContext(r);if(!a){this.resetWhenMissingContext(r);return}const{frag:u,part:c,level:d}=a,{video:f,text:g,id3:y,initSegment:v}=n,{details:T}=d,S=this.altAudio?void 0:n.audio;if(this.fragContextChanged(u)){this.fragmentTracker.removeFragment(u);return}if(this.state=ot.PARSING,v){const w=v.tracks;if(w){const j=u.initSegment||u;if(this.unhandledEncryptionError(v,u))return;this._bufferInitSegment(d,w,j,r),i.trigger(H.FRAG_PARSING_INIT_SEGMENT,{frag:j,id:t,tracks:w})}const L=v.initPTS,O=v.timescale,I=this.initPTS[u.cc];if(Ot(L)&&(!I||I.baseTime!==L||I.timescale!==O)){const j=v.trackId;this.initPTS[u.cc]={baseTime:L,timescale:O,trackId:j},i.trigger(H.INIT_PTS_FOUND,{frag:u,id:t,initPTS:L,timescale:O,trackId:j})}}if(f&&T){S&&f.type==="audiovideo"&&this.logMuxedErr(u);const w=T.fragments[u.sn-1-T.startSN],L=u.sn===T.startSN,O=!w||u.cc>w.cc;if(n.independent!==!1){const{startPTS:I,endPTS:j,startDTS:P,endDTS:G}=f;if(c)c.elementaryStreams[f.type]={startPTS:I,endPTS:j,startDTS:P,endDTS:G};else if(f.firstKeyFrame&&f.independent&&r.id===1&&!O&&(this.couldBacktrack=!0),f.dropped&&f.independent){const N=this.getMainFwdBufferInfo(),K=(N?N.end:this.getLoadPosition())+this.config.maxBufferHole,k=f.firstKeyFramePTS?f.firstKeyFramePTS:I;if(!L&&Kc0&&(u.gap=!0);u.setElementaryStreamInfo(f.type,I,j,P,G),this.backtrackFragment&&(this.backtrackFragment=u),this.bufferFragmentData(f,u,c,r,L||O)}else if(L||O)u.gap=!0;else{this.backtrack(u);return}}if(S){const{startPTS:w,endPTS:L,startDTS:O,endDTS:I}=S;c&&(c.elementaryStreams[ws.AUDIO]={startPTS:w,endPTS:L,startDTS:O,endDTS:I}),u.setElementaryStreamInfo(ws.AUDIO,w,L,O,I),this.bufferFragmentData(S,u,c,r)}if(T&&y!=null&&y.samples.length){const w={id:t,frag:u,details:T,samples:y.samples};i.trigger(H.FRAG_PARSING_METADATA,w)}if(T&&g){const w={id:t,frag:u,details:T,samples:g.samples};i.trigger(H.FRAG_PARSING_USERDATA,w)}}logMuxedErr(e){this.warn(`${an(e)?"Media":"Init"} segment with muxed audiovideo where only video expected: ${e.url}`)}_bufferInitSegment(e,t,i,n){if(this.state!==ot.PARSING)return;this.audioOnly=!!t.audio&&!t.video,this.altAudio&&!this.audioOnly&&(delete t.audio,t.audiovideo&&this.logMuxedErr(i));const{audio:r,video:a,audiovideo:u}=t;if(r){const d=e.audioCodec;let f=s0(r.codec,d);f==="mp4a"&&(f="mp4a.40.5");const g=navigator.userAgent.toLowerCase();if(this.audioCodecSwitch){f&&(f.indexOf("mp4a.40.5")!==-1?f="mp4a.40.2":f="mp4a.40.5");const y=r.metadata;y&&"channelCount"in y&&(y.channelCount||1)!==1&&g.indexOf("firefox")===-1&&(f="mp4a.40.5")}f&&f.indexOf("mp4a.40.5")!==-1&&g.indexOf("android")!==-1&&r.container!=="audio/mpeg"&&(f="mp4a.40.2",this.log(`Android: force audio codec to ${f}`)),d&&d!==f&&this.log(`Swapping manifest audio codec "${d}" for "${f}"`),r.levelCodec=f,r.id=jt.MAIN,this.log(`Init audio buffer, container:${r.container}, codecs[selected/level/parsed]=[${f||""}/${d||""}/${r.codec}]`),delete t.audiovideo}if(a){a.levelCodec=e.videoCodec,a.id=jt.MAIN;const d=a.codec;if(d?.length===4)switch(d){case"hvc1":case"hev1":a.codec="hvc1.1.6.L120.90";break;case"av01":a.codec="av01.0.04M.08";break;case"avc1":a.codec="avc1.42e01e";break}this.log(`Init video buffer, container:${a.container}, codecs[level/parsed]=[${e.videoCodec||""}/${d}]${a.codec!==d?" parsed-corrected="+a.codec:""}${a.supplemental?" supplemental="+a.supplemental:""}`),delete t.audiovideo}u&&(this.log(`Init audiovideo buffer, container:${u.container}, codecs[level/parsed]=[${e.codecs}/${u.codec}]`),delete t.video,delete t.audio);const c=Object.keys(t);if(c.length){if(this.hls.trigger(H.BUFFER_CODECS,t),!this.hls)return;c.forEach(d=>{const g=t[d].initSegment;g!=null&&g.byteLength&&this.hls.trigger(H.BUFFER_APPENDING,{type:d,data:g,frag:i,part:null,chunkMeta:n,parent:i.type})})}this.tickImmediate()}getMainFwdBufferInfo(){const e=this.mediaBuffer&&this.altAudio===2?this.mediaBuffer:this.media;return this.getFwdBufferInfo(e,jt.MAIN)}get maxBufferLength(){const{levels:e,level:t}=this,i=e?.[t];return i?this.getMaxBufferLength(i.maxBitrate):this.config.maxBufferLength}backtrack(e){this.couldBacktrack=!0,this.backtrackFragment=e,this.resetTransmuxer(),this.flushBufferGap(e),this.fragmentTracker.removeFragment(e),this.fragPrevious=null,this.nextLoadPosition=e.start,this.state=ot.IDLE}checkFragmentChanged(){const e=this.media;let t=null;if(e&&e.readyState>1&&e.seeking===!1){const i=e.currentTime;if(gi.isBuffered(e,i)?t=this.getAppendedFrag(i):gi.isBuffered(e,i+.1)&&(t=this.getAppendedFrag(i+.1)),t){this.backtrackFragment=null;const n=this.fragPlaying,r=t.level;(!n||t.sn!==n.sn||n.level!==r)&&(this.fragPlaying=t,this.hls.trigger(H.FRAG_CHANGED,{frag:t}),(!n||n.level!==r)&&this.hls.trigger(H.LEVEL_SWITCHED,{level:r}))}}}get nextLevel(){const e=this.nextBufferedFrag;return e?e.level:-1}get currentFrag(){var e;if(this.fragPlaying)return this.fragPlaying;const t=((e=this.media)==null?void 0:e.currentTime)||this.lastCurrentTime;return Ot(t)?this.getAppendedFrag(t):null}get currentProgramDateTime(){var e;const t=((e=this.media)==null?void 0:e.currentTime)||this.lastCurrentTime;if(Ot(t)){const i=this.getLevelDetails(),n=this.currentFrag||(i?Au(null,i.fragments,t):null);if(n){const r=n.programDateTime;if(r!==null){const a=r+(t-n.start)*1e3;return new Date(a)}}}return null}get currentLevel(){const e=this.currentFrag;return e?e.level:-1}get nextBufferedFrag(){const e=this.currentFrag;return e?this.followingBufferedFrag(e):null}get forceStartLoad(){return this._forceStartLoad}}class K$ extends ra{constructor(e,t){super("key-loader",t),this.config=void 0,this.keyIdToKeyInfo={},this.emeController=null,this.config=e}abort(e){for(const i in this.keyIdToKeyInfo){const n=this.keyIdToKeyInfo[i].loader;if(n){var t;if(e&&e!==((t=n.context)==null?void 0:t.frag.type))return;n.abort()}}}detach(){for(const e in this.keyIdToKeyInfo){const t=this.keyIdToKeyInfo[e];(t.mediaKeySessionContext||t.decryptdata.isCommonEncryption)&&delete this.keyIdToKeyInfo[e]}}destroy(){this.detach();for(const e in this.keyIdToKeyInfo){const t=this.keyIdToKeyInfo[e].loader;t&&t.destroy()}this.keyIdToKeyInfo={}}createKeyLoadError(e,t=$e.KEY_LOAD_ERROR,i,n,r){return new _o({type:Vt.NETWORK_ERROR,details:t,fatal:!1,frag:e,response:r,error:i,networkDetails:n})}loadClear(e,t,i){if(this.emeController&&this.config.emeEnabled&&!this.emeController.getSelectedKeySystemFormats().length){if(t.length)for(let n=0,r=t.length;n{if(!this.emeController)return;a.setKeyFormat(u);const c=r0(u);if(c)return this.emeController.getKeySystemAccess([c])})}if(this.config.requireKeySystemAccessOnStart){const n=ph(this.config);if(n.length)return this.emeController.getKeySystemAccess(n)}}return null}load(e){return!e.decryptdata&&e.encrypted&&this.emeController&&this.config.emeEnabled?this.emeController.selectKeySystemFormat(e).then(t=>this.loadInternal(e,t)):this.loadInternal(e)}loadInternal(e,t){var i,n;t&&e.setKeyFormat(t);const r=e.decryptdata;if(!r){const d=new Error(t?`Expected frag.decryptdata to be defined after setting format ${t}`:`Missing decryption data on fragment in onKeyLoading (emeEnabled with controller: ${this.emeController&&this.config.emeEnabled})`);return Promise.reject(this.createKeyLoadError(e,$e.KEY_LOAD_ERROR,d))}const a=r.uri;if(!a)return Promise.reject(this.createKeyLoadError(e,$e.KEY_LOAD_ERROR,new Error(`Invalid key URI: "${a}"`)));const u=Kv(r);let c=this.keyIdToKeyInfo[u];if((i=c)!=null&&i.decryptdata.key)return r.key=c.decryptdata.key,Promise.resolve({frag:e,keyInfo:c});if(this.emeController&&(n=c)!=null&&n.keyLoadPromise)switch(this.emeController.getKeyStatus(c.decryptdata)){case"usable":case"usable-in-future":return c.keyLoadPromise.then(f=>{const{keyInfo:g}=f;return r.key=g.decryptdata.key,{frag:e,keyInfo:g}})}switch(this.log(`${this.keyIdToKeyInfo[u]?"Rel":"L"}oading${r.keyId?" keyId: "+zn(r.keyId):""} URI: ${r.uri} from ${e.type} ${e.level}`),c=this.keyIdToKeyInfo[u]={decryptdata:r,keyLoadPromise:null,loader:null,mediaKeySessionContext:null},r.method){case"SAMPLE-AES":case"SAMPLE-AES-CENC":case"SAMPLE-AES-CTR":return r.keyFormat==="identity"?this.loadKeyHTTP(c,e):this.loadKeyEME(c,e);case"AES-128":case"AES-256":case"AES-256-CTR":return this.loadKeyHTTP(c,e);default:return Promise.reject(this.createKeyLoadError(e,$e.KEY_LOAD_ERROR,new Error(`Key supplied with unsupported METHOD: "${r.method}"`)))}}loadKeyEME(e,t){const i={frag:t,keyInfo:e};if(this.emeController&&this.config.emeEnabled){var n;if(!e.decryptdata.keyId&&(n=t.initSegment)!=null&&n.data){const a=hU(t.initSegment.data);if(a.length){let u=a[0];u.some(c=>c!==0)?(this.log(`Using keyId found in init segment ${zn(u)}`),kl.setKeyIdForUri(e.decryptdata.uri,u)):(u=kl.addKeyIdForUri(e.decryptdata.uri),this.log(`Generating keyId to patch media ${zn(u)}`)),e.decryptdata.keyId=u}}if(!e.decryptdata.keyId&&!an(t))return Promise.resolve(i);const r=this.emeController.loadKey(i);return(e.keyLoadPromise=r.then(a=>(e.mediaKeySessionContext=a,i))).catch(a=>{throw e.keyLoadPromise=null,"data"in a&&(a.data.frag=t),a})}return Promise.resolve(i)}loadKeyHTTP(e,t){const i=this.config,n=i.loader,r=new n(i);return t.keyLoader=e.loader=r,e.keyLoadPromise=new Promise((a,u)=>{const c={keyInfo:e,frag:t,responseType:"arraybuffer",url:e.decryptdata.uri},d=i.keyLoadPolicy.default,f={loadPolicy:d,timeout:d.maxLoadTimeMs,maxRetry:0,retryDelay:0,maxRetryDelay:0},g={onSuccess:(y,v,T,S)=>{const{frag:w,keyInfo:L}=T,O=Kv(L.decryptdata);if(!w.decryptdata||L!==this.keyIdToKeyInfo[O])return u(this.createKeyLoadError(w,$e.KEY_LOAD_ERROR,new Error("after key load, decryptdata unset or changed"),S));L.decryptdata.key=w.decryptdata.key=new Uint8Array(y.data),w.keyLoader=null,L.loader=null,a({frag:w,keyInfo:L})},onError:(y,v,T,S)=>{this.resetLoader(v),u(this.createKeyLoadError(t,$e.KEY_LOAD_ERROR,new Error(`HTTP Error ${y.code} loading key ${y.text}`),T,us({url:c.url,data:void 0},y)))},onTimeout:(y,v,T)=>{this.resetLoader(v),u(this.createKeyLoadError(t,$e.KEY_LOAD_TIMEOUT,new Error("key loading timed out"),T))},onAbort:(y,v,T)=>{this.resetLoader(v),u(this.createKeyLoadError(t,$e.INTERNAL_ABORTED,new Error("key loading aborted"),T))}};r.load(c,f,g)})}resetLoader(e){const{frag:t,keyInfo:i,url:n}=e,r=i.loader;t.keyLoader===r&&(t.keyLoader=null,i.loader=null);const a=Kv(i.decryptdata)||n;delete this.keyIdToKeyInfo[a],r&&r.destroy()}}function Kv(s){if(s.keyFormat!==Vn.FAIRPLAY){const e=s.keyId;if(e)return zn(e)}return s.uri}function dA(s){const{type:e}=s;switch(e){case Ii.AUDIO_TRACK:return jt.AUDIO;case Ii.SUBTITLE_TRACK:return jt.SUBTITLE;default:return jt.MAIN}}function Wv(s,e){let t=s.url;return(t===void 0||t.indexOf("data:")===0)&&(t=e.url),t}class W${constructor(e){this.hls=void 0,this.loaders=Object.create(null),this.variableList=null,this.onManifestLoaded=this.checkAutostartLoad,this.hls=e,this.registerListeners()}startLoad(e){}stopLoad(){this.destroyInternalLoaders()}registerListeners(){const{hls:e}=this;e.on(H.MANIFEST_LOADING,this.onManifestLoading,this),e.on(H.LEVEL_LOADING,this.onLevelLoading,this),e.on(H.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),e.on(H.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this),e.on(H.LEVELS_UPDATED,this.onLevelsUpdated,this)}unregisterListeners(){const{hls:e}=this;e.off(H.MANIFEST_LOADING,this.onManifestLoading,this),e.off(H.LEVEL_LOADING,this.onLevelLoading,this),e.off(H.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),e.off(H.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this),e.off(H.LEVELS_UPDATED,this.onLevelsUpdated,this)}createInternalLoader(e){const t=this.hls.config,i=t.pLoader,n=t.loader,r=i||n,a=new r(t);return this.loaders[e.type]=a,a}getInternalLoader(e){return this.loaders[e.type]}resetInternalLoader(e){this.loaders[e]&&delete this.loaders[e]}destroyInternalLoaders(){for(const e in this.loaders){const t=this.loaders[e];t&&t.destroy(),this.resetInternalLoader(e)}}destroy(){this.variableList=null,this.unregisterListeners(),this.destroyInternalLoaders()}onManifestLoading(e,t){const{url:i}=t;this.variableList=null,this.load({id:null,level:0,responseType:"text",type:Ii.MANIFEST,url:i,deliveryDirectives:null,levelOrTrack:null})}onLevelLoading(e,t){const{id:i,level:n,pathwayId:r,url:a,deliveryDirectives:u,levelInfo:c}=t;this.load({id:i,level:n,pathwayId:r,responseType:"text",type:Ii.LEVEL,url:a,deliveryDirectives:u,levelOrTrack:c})}onAudioTrackLoading(e,t){const{id:i,groupId:n,url:r,deliveryDirectives:a,track:u}=t;this.load({id:i,groupId:n,level:null,responseType:"text",type:Ii.AUDIO_TRACK,url:r,deliveryDirectives:a,levelOrTrack:u})}onSubtitleTrackLoading(e,t){const{id:i,groupId:n,url:r,deliveryDirectives:a,track:u}=t;this.load({id:i,groupId:n,level:null,responseType:"text",type:Ii.SUBTITLE_TRACK,url:r,deliveryDirectives:a,levelOrTrack:u})}onLevelsUpdated(e,t){const i=this.loaders[Ii.LEVEL];if(i){const n=i.context;n&&!t.levels.some(r=>r===n.levelOrTrack)&&(i.abort(),delete this.loaders[Ii.LEVEL])}}load(e){var t;const i=this.hls.config;let n=this.getInternalLoader(e);if(n){const d=this.hls.logger,f=n.context;if(f&&f.levelOrTrack===e.levelOrTrack&&(f.url===e.url||f.deliveryDirectives&&!e.deliveryDirectives)){f.url===e.url?d.log(`[playlist-loader]: ignore ${e.url} ongoing request`):d.log(`[playlist-loader]: ignore ${e.url} in favor of ${f.url}`);return}d.log(`[playlist-loader]: aborting previous loader for type: ${e.type}`),n.abort()}let r;if(e.type===Ii.MANIFEST?r=i.manifestLoadPolicy.default:r=ys({},i.playlistLoadPolicy.default,{timeoutRetry:null,errorRetry:null}),n=this.createInternalLoader(e),Ot((t=e.deliveryDirectives)==null?void 0:t.part)){let d;if(e.type===Ii.LEVEL&&e.level!==null?d=this.hls.levels[e.level].details:e.type===Ii.AUDIO_TRACK&&e.id!==null?d=this.hls.audioTracks[e.id].details:e.type===Ii.SUBTITLE_TRACK&&e.id!==null&&(d=this.hls.subtitleTracks[e.id].details),d){const f=d.partTarget,g=d.targetduration;if(f&&g){const y=Math.max(f*3,g*.8)*1e3;r=ys({},r,{maxTimeToFirstByteMs:Math.min(y,r.maxTimeToFirstByteMs),maxLoadTimeMs:Math.min(y,r.maxTimeToFirstByteMs)})}}}const a=r.errorRetry||r.timeoutRetry||{},u={loadPolicy:r,timeout:r.maxLoadTimeMs,maxRetry:a.maxNumRetry||0,retryDelay:a.retryDelayMs||0,maxRetryDelay:a.maxRetryDelayMs||0},c={onSuccess:(d,f,g,y)=>{const v=this.getInternalLoader(g);this.resetInternalLoader(g.type);const T=d.data;f.parsing.start=performance.now(),qa.isMediaPlaylist(T)||g.type!==Ii.MANIFEST?this.handleTrackOrLevelPlaylist(d,f,g,y||null,v):this.handleMasterPlaylist(d,f,g,y)},onError:(d,f,g,y)=>{this.handleNetworkError(f,g,!1,d,y)},onTimeout:(d,f,g)=>{this.handleNetworkError(f,g,!0,void 0,d)}};n.load(e,u,c)}checkAutostartLoad(){if(!this.hls)return;const{config:{autoStartLoad:e,startPosition:t},forceStartLoad:i}=this.hls;(e||i)&&(this.hls.logger.log(`${e?"auto":"force"} startLoad with configured startPosition ${t}`),this.hls.startLoad(t))}handleMasterPlaylist(e,t,i,n){const r=this.hls,a=e.data,u=Wv(e,i),c=qa.parseMasterPlaylist(a,u);if(c.playlistParsingError){t.parsing.end=performance.now(),this.handleManifestParsingError(e,i,c.playlistParsingError,n,t);return}const{contentSteering:d,levels:f,sessionData:g,sessionKeys:y,startTimeOffset:v,variableList:T}=c;this.variableList=T,f.forEach(O=>{const{unknownCodecs:I}=O;if(I){const{preferManagedMediaSource:j}=this.hls.config;let{audioCodec:P,videoCodec:G}=O;for(let N=I.length;N--;){const K=I[N];Uh(K,"audio",j)?(O.audioCodec=P=P?`${P},${K}`:K,Gc.audio[P.substring(0,4)]=2,I.splice(N,1)):Uh(K,"video",j)&&(O.videoCodec=G=G?`${G},${K}`:K,Gc.video[G.substring(0,4)]=2,I.splice(N,1))}}});const{AUDIO:S=[],SUBTITLES:w,"CLOSED-CAPTIONS":L}=qa.parseMasterPlaylistMedia(a,u,c);S.length&&!S.some(I=>!I.url)&&f[0].audioCodec&&!f[0].attrs.AUDIO&&(this.hls.logger.log("[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"),S.unshift({type:"main",name:"main",groupId:"main",default:!1,autoselect:!1,forced:!1,id:-1,attrs:new Hs({}),bitrate:0,url:""})),r.trigger(H.MANIFEST_LOADED,{levels:f,audioTracks:S,subtitles:w,captions:L,contentSteering:d,url:u,stats:t,networkDetails:n,sessionData:g,sessionKeys:y,startTimeOffset:v,variableList:T})}handleTrackOrLevelPlaylist(e,t,i,n,r){const a=this.hls,{id:u,level:c,type:d}=i,f=Wv(e,i),g=Ot(c)?c:Ot(u)?u:0,y=dA(i),v=qa.parseLevelPlaylist(e.data,f,g,y,0,this.variableList);if(d===Ii.MANIFEST){const T={attrs:new Hs({}),bitrate:0,details:v,name:"",url:f};v.requestScheduled=t.loading.start+IL(v,0),a.trigger(H.MANIFEST_LOADED,{levels:[T],audioTracks:[],url:f,stats:t,networkDetails:n,sessionData:null,sessionKeys:null,contentSteering:null,startTimeOffset:null,variableList:null})}t.parsing.end=performance.now(),i.levelDetails=v,this.handlePlaylistLoaded(v,e,t,i,n,r)}handleManifestParsingError(e,t,i,n,r){this.hls.trigger(H.ERROR,{type:Vt.NETWORK_ERROR,details:$e.MANIFEST_PARSING_ERROR,fatal:t.type===Ii.MANIFEST,url:e.url,err:i,error:i,reason:i.message,response:e,context:t,networkDetails:n,stats:r})}handleNetworkError(e,t,i=!1,n,r){let a=`A network ${i?"timeout":"error"+(n?" (status "+n.code+")":"")} occurred while loading ${e.type}`;e.type===Ii.LEVEL?a+=`: ${e.level} id: ${e.id}`:(e.type===Ii.AUDIO_TRACK||e.type===Ii.SUBTITLE_TRACK)&&(a+=` id: ${e.id} group-id: "${e.groupId}"`);const u=new Error(a);this.hls.logger.warn(`[playlist-loader]: ${a}`);let c=$e.UNKNOWN,d=!1;const f=this.getInternalLoader(e);switch(e.type){case Ii.MANIFEST:c=i?$e.MANIFEST_LOAD_TIMEOUT:$e.MANIFEST_LOAD_ERROR,d=!0;break;case Ii.LEVEL:c=i?$e.LEVEL_LOAD_TIMEOUT:$e.LEVEL_LOAD_ERROR,d=!1;break;case Ii.AUDIO_TRACK:c=i?$e.AUDIO_TRACK_LOAD_TIMEOUT:$e.AUDIO_TRACK_LOAD_ERROR,d=!1;break;case Ii.SUBTITLE_TRACK:c=i?$e.SUBTITLE_TRACK_LOAD_TIMEOUT:$e.SUBTITLE_LOAD_ERROR,d=!1;break}f&&this.resetInternalLoader(e.type);const g={type:Vt.NETWORK_ERROR,details:c,fatal:d,url:e.url,loader:f,context:e,error:u,networkDetails:t,stats:r};if(n){const y=t?.url||e.url;g.response=us({url:y,data:void 0},n)}this.hls.trigger(H.ERROR,g)}handlePlaylistLoaded(e,t,i,n,r,a){const u=this.hls,{type:c,level:d,levelOrTrack:f,id:g,groupId:y,deliveryDirectives:v}=n,T=Wv(t,n),S=dA(n);let w=typeof n.level=="number"&&S===jt.MAIN?d:void 0;const L=e.playlistParsingError;if(L){if(this.hls.logger.warn(`${L} ${e.url}`),!u.config.ignorePlaylistParsingErrors){u.trigger(H.ERROR,{type:Vt.NETWORK_ERROR,details:$e.LEVEL_PARSING_ERROR,fatal:!1,url:T,error:L,reason:L.message,response:t,context:n,level:w,parent:S,networkDetails:r,stats:i});return}e.playlistParsingError=null}if(!e.fragments.length){const O=e.playlistParsingError=new Error("No Segments found in Playlist");u.trigger(H.ERROR,{type:Vt.NETWORK_ERROR,details:$e.LEVEL_EMPTY_ERROR,fatal:!1,url:T,error:O,reason:O.message,response:t,context:n,level:w,parent:S,networkDetails:r,stats:i});return}switch(e.live&&a&&(a.getCacheAge&&(e.ageHeader=a.getCacheAge()||0),(!a.getCacheAge||isNaN(e.ageHeader))&&(e.ageHeader=0)),c){case Ii.MANIFEST:case Ii.LEVEL:if(w){if(!f)w=0;else if(f!==u.levels[w]){const O=u.levels.indexOf(f);O>-1&&(w=O)}}u.trigger(H.LEVEL_LOADED,{details:e,levelInfo:f||u.levels[0],level:w||0,id:g||0,stats:i,networkDetails:r,deliveryDirectives:v,withoutMultiVariant:c===Ii.MANIFEST});break;case Ii.AUDIO_TRACK:u.trigger(H.AUDIO_TRACK_LOADED,{details:e,track:f,id:g||0,groupId:y||"",stats:i,networkDetails:r,deliveryDirectives:v});break;case Ii.SUBTITLE_TRACK:u.trigger(H.SUBTITLE_TRACK_LOADED,{details:e,track:f,id:g||0,groupId:y||"",stats:i,networkDetails:r,deliveryDirectives:v});break}}}class $r{static get version(){return Hh}static isMSESupported(){return RR()}static isSupported(){return z$()}static getMediaSource(){return Ll()}static get Events(){return H}static get MetadataSchema(){return jr}static get ErrorTypes(){return Vt}static get ErrorDetails(){return $e}static get DefaultConfig(){return $r.defaultConfig?$r.defaultConfig:R$}static set DefaultConfig(e){$r.defaultConfig=e}constructor(e={}){this.config=void 0,this.userConfig=void 0,this.logger=void 0,this.coreComponents=void 0,this.networkControllers=void 0,this._emitter=new f1,this._autoLevelCapping=-1,this._maxHdcpLevel=null,this.abrController=void 0,this.bufferController=void 0,this.capLevelController=void 0,this.latencyController=void 0,this.levelController=void 0,this.streamController=void 0,this.audioStreamController=void 0,this.subtititleStreamController=void 0,this.audioTrackController=void 0,this.subtitleTrackController=void 0,this.interstitialsController=void 0,this.gapController=void 0,this.emeController=void 0,this.cmcdController=void 0,this._media=null,this._url=null,this._sessionId=void 0,this.triggeringException=void 0,this.started=!1;const t=this.logger=eU(e.debug||!1,"Hls instance",e.assetPlayerId),i=this.config=N$($r.DefaultConfig,e,t);this.userConfig=e,i.progressive&&O$(i,t);const{abrController:n,bufferController:r,capLevelController:a,errorController:u,fpsController:c}=i,d=new u(this),f=this.abrController=new n(this),g=new YU(this),y=i.interstitialsController,v=y?this.interstitialsController=new y(this,$r):null,T=this.bufferController=new r(this,g),S=this.capLevelController=new a(this),w=new c(this),L=new W$(this),O=i.contentSteeringController,I=O?new O(this):null,j=this.levelController=new H$(this,I),P=new j$(this),G=new K$(this.config,this.logger),N=this.streamController=new q$(this,g,G),K=this.gapController=new F$(this,g);S.setStreamController(N),w.setStreamController(N);const k=[L,j,N];v&&k.splice(1,0,v),I&&k.splice(1,0,I),this.networkControllers=k;const R=[f,T,K,S,w,P,g];this.audioTrackController=this.createController(i.audioTrackController,k);const Y=i.audioStreamController;Y&&k.push(this.audioStreamController=new Y(this,g,G)),this.subtitleTrackController=this.createController(i.subtitleTrackController,k);const z=i.subtitleStreamController;z&&k.push(this.subtititleStreamController=new z(this,g,G)),this.createController(i.timelineController,R),G.emeController=this.emeController=this.createController(i.emeController,R),this.cmcdController=this.createController(i.cmcdController,R),this.latencyController=this.createController($$,R),this.coreComponents=R,k.push(d);const X=d.onErrorOut;typeof X=="function"&&this.on(H.ERROR,X,d),this.on(H.MANIFEST_LOADED,L.onManifestLoaded,L)}createController(e,t){if(e){const i=new e(this);return t&&t.push(i),i}return null}on(e,t,i=this){this._emitter.on(e,t,i)}once(e,t,i=this){this._emitter.once(e,t,i)}removeAllListeners(e){this._emitter.removeAllListeners(e)}off(e,t,i=this,n){this._emitter.off(e,t,i,n)}listeners(e){return this._emitter.listeners(e)}emit(e,t,i){return this._emitter.emit(e,t,i)}trigger(e,t){if(this.config.debug)return this.emit(e,e,t);try{return this.emit(e,e,t)}catch(i){if(this.logger.error("An internal error happened while handling event "+e+'. Error message: "'+i.message+'". Here is a stacktrace:',i),!this.triggeringException){this.triggeringException=!0;const n=e===H.ERROR;this.trigger(H.ERROR,{type:Vt.OTHER_ERROR,details:$e.INTERNAL_EXCEPTION,fatal:n,event:e,error:i}),this.triggeringException=!1}}return!1}listenerCount(e){return this._emitter.listenerCount(e)}destroy(){this.logger.log("destroy"),this.trigger(H.DESTROYING,void 0),this.detachMedia(),this.removeAllListeners(),this._autoLevelCapping=-1,this._url=null,this.networkControllers.forEach(t=>t.destroy()),this.networkControllers.length=0,this.coreComponents.forEach(t=>t.destroy()),this.coreComponents.length=0;const e=this.config;e.xhrSetup=e.fetchSetup=void 0,this.userConfig=null}attachMedia(e){if(!e||"media"in e&&!e.media){const r=new Error(`attachMedia failed: invalid argument (${e})`);this.trigger(H.ERROR,{type:Vt.OTHER_ERROR,details:$e.ATTACH_MEDIA_ERROR,fatal:!0,error:r});return}this.logger.log("attachMedia"),this._media&&(this.logger.warn("media must be detached before attaching"),this.detachMedia());const t="media"in e,i=t?e.media:e,n=t?e:{media:i};this._media=i,this.trigger(H.MEDIA_ATTACHING,n)}detachMedia(){this.logger.log("detachMedia"),this.trigger(H.MEDIA_DETACHING,{}),this._media=null}transferMedia(){this._media=null;const e=this.bufferController.transferMedia();return this.trigger(H.MEDIA_DETACHING,{transferMedia:e}),e}loadSource(e){this.stopLoad();const t=this.media,i=this._url,n=this._url=i1.buildAbsoluteURL(self.location.href,e,{alwaysNormalize:!0});this._autoLevelCapping=-1,this._maxHdcpLevel=null,this.logger.log(`loadSource:${n}`),t&&i&&(i!==n||this.bufferController.hasSourceTypes())&&(this.detachMedia(),this.attachMedia(t)),this.trigger(H.MANIFEST_LOADING,{url:e})}get url(){return this._url}get hasEnoughToStart(){return this.streamController.hasEnoughToStart}get startPosition(){return this.streamController.startPositionValue}startLoad(e=-1,t){this.logger.log(`startLoad(${e+(t?", ":"")})`),this.started=!0,this.resumeBuffering();for(let i=0;i{e.resumeBuffering&&e.resumeBuffering()}))}pauseBuffering(){this.bufferingEnabled&&(this.logger.log("pause buffering"),this.networkControllers.forEach(e=>{e.pauseBuffering&&e.pauseBuffering()}))}get inFlightFragments(){const e={[jt.MAIN]:this.streamController.inFlightFrag};return this.audioStreamController&&(e[jt.AUDIO]=this.audioStreamController.inFlightFrag),this.subtititleStreamController&&(e[jt.SUBTITLE]=this.subtititleStreamController.inFlightFrag),e}swapAudioCodec(){this.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}recoverMediaError(){this.logger.log("recoverMediaError");const e=this._media,t=e?.currentTime;this.detachMedia(),e&&(this.attachMedia(e),t&&this.startLoad(t))}removeLevel(e){this.levelController.removeLevel(e)}get sessionId(){let e=this._sessionId;return e||(e=this._sessionId=F9()),e}get levels(){const e=this.levelController.levels;return e||[]}get latestLevelDetails(){return this.streamController.getLevelDetails()||null}get loadLevelObj(){return this.levelController.loadLevelObj}get currentLevel(){return this.streamController.currentLevel}set currentLevel(e){this.logger.log(`set currentLevel:${e}`),this.levelController.manualLevel=e,this.streamController.immediateLevelSwitch()}get nextLevel(){return this.streamController.nextLevel}set nextLevel(e){this.logger.log(`set nextLevel:${e}`),this.levelController.manualLevel=e,this.streamController.nextLevelSwitch()}get loadLevel(){return this.levelController.level}set loadLevel(e){this.logger.log(`set loadLevel:${e}`),this.levelController.manualLevel=e}get nextLoadLevel(){return this.levelController.nextLoadLevel}set nextLoadLevel(e){this.levelController.nextLoadLevel=e}get firstLevel(){return Math.max(this.levelController.firstLevel,this.minAutoLevel)}set firstLevel(e){this.logger.log(`set firstLevel:${e}`),this.levelController.firstLevel=e}get startLevel(){const e=this.levelController.startLevel;return e===-1&&this.abrController.forcedAutoLevel>-1?this.abrController.forcedAutoLevel:e}set startLevel(e){this.logger.log(`set startLevel:${e}`),e!==-1&&(e=Math.max(e,this.minAutoLevel)),this.levelController.startLevel=e}get capLevelToPlayerSize(){return this.config.capLevelToPlayerSize}set capLevelToPlayerSize(e){const t=!!e;t!==this.config.capLevelToPlayerSize&&(t?this.capLevelController.startCapping():(this.capLevelController.stopCapping(),this.autoLevelCapping=-1,this.streamController.nextLevelSwitch()),this.config.capLevelToPlayerSize=t)}get autoLevelCapping(){return this._autoLevelCapping}get bandwidthEstimate(){const{bwEstimator:e}=this.abrController;return e?e.getEstimate():NaN}set bandwidthEstimate(e){this.abrController.resetEstimator(e)}get abrEwmaDefaultEstimate(){const{bwEstimator:e}=this.abrController;return e?e.defaultEstimate:NaN}get ttfbEstimate(){const{bwEstimator:e}=this.abrController;return e?e.getEstimateTTFB():NaN}set autoLevelCapping(e){this._autoLevelCapping!==e&&(this.logger.log(`set autoLevelCapping:${e}`),this._autoLevelCapping=e,this.levelController.checkMaxAutoUpdated())}get maxHdcpLevel(){return this._maxHdcpLevel}set maxHdcpLevel(e){NU(e)&&this._maxHdcpLevel!==e&&(this._maxHdcpLevel=e,this.levelController.checkMaxAutoUpdated())}get autoLevelEnabled(){return this.levelController.manualLevel===-1}get manualLevel(){return this.levelController.manualLevel}get minAutoLevel(){const{levels:e,config:{minAutoBitrate:t}}=this;if(!e)return 0;const i=e.length;for(let n=0;n=t)return n;return 0}get maxAutoLevel(){const{levels:e,autoLevelCapping:t,maxHdcpLevel:i}=this;let n;if(t===-1&&e!=null&&e.length?n=e.length-1:n=t,i)for(let r=n;r--;){const a=e[r].attrs["HDCP-LEVEL"];if(a&&a<=i)return r}return n}get firstAutoLevel(){return this.abrController.firstAutoLevel}get nextAutoLevel(){return this.abrController.nextAutoLevel}set nextAutoLevel(e){this.abrController.nextAutoLevel=e}get playingDate(){return this.streamController.currentProgramDateTime}get mainForwardBufferInfo(){return this.streamController.getMainFwdBufferInfo()}get maxBufferLength(){return this.streamController.maxBufferLength}setAudioOption(e){var t;return((t=this.audioTrackController)==null?void 0:t.setAudioOption(e))||null}setSubtitleOption(e){var t;return((t=this.subtitleTrackController)==null?void 0:t.setSubtitleOption(e))||null}get allAudioTracks(){const e=this.audioTrackController;return e?e.allAudioTracks:[]}get audioTracks(){const e=this.audioTrackController;return e?e.audioTracks:[]}get audioTrack(){const e=this.audioTrackController;return e?e.audioTrack:-1}set audioTrack(e){const t=this.audioTrackController;t&&(t.audioTrack=e)}get allSubtitleTracks(){const e=this.subtitleTrackController;return e?e.allSubtitleTracks:[]}get subtitleTracks(){const e=this.subtitleTrackController;return e?e.subtitleTracks:[]}get subtitleTrack(){const e=this.subtitleTrackController;return e?e.subtitleTrack:-1}get media(){return this._media}set subtitleTrack(e){const t=this.subtitleTrackController;t&&(t.subtitleTrack=e)}get subtitleDisplay(){const e=this.subtitleTrackController;return e?e.subtitleDisplay:!1}set subtitleDisplay(e){const t=this.subtitleTrackController;t&&(t.subtitleDisplay=e)}get lowLatencyMode(){return this.config.lowLatencyMode}set lowLatencyMode(e){this.config.lowLatencyMode=e}get liveSyncPosition(){return this.latencyController.liveSyncPosition}get latency(){return this.latencyController.latency}get maxLatency(){return this.latencyController.maxLatency}get targetLatency(){return this.latencyController.targetLatency}set targetLatency(e){this.latencyController.targetLatency=e}get drift(){return this.latencyController.drift}get forceStartLoad(){return this.streamController.forceStartLoad}get pathways(){return this.levelController.pathways}get pathwayPriority(){return this.levelController.pathwayPriority}set pathwayPriority(e){this.levelController.pathwayPriority=e}get bufferedToEnd(){var e;return!!((e=this.bufferController)!=null&&e.bufferedToEnd)}get interstitialsManager(){var e;return((e=this.interstitialsController)==null?void 0:e.interstitialsManager)||null}getMediaDecodingInfo(e,t=this.allAudioTracks){const i=yL(t);return pL(e,i,navigator.mediaCapabilities)}}$r.defaultConfig=void 0;function hA(s,e){const t=s.includes("?")?"&":"?";return`${s}${t}v=${e}`}function IR({src:s,muted:e=x0,className:t}){const i=b.useRef(null),[n,r]=b.useState(!1),[a,u]=b.useState(null),[c,d]=b.useState(1),f=b.useMemo(()=>hA(s,c),[s,c]);return b.useEffect(()=>{let g=!1,y=null,v=null,T=null;const S=i.current;if(!S)return;const w=S;r(!1),u(null),Nh(w,{muted:e});const L=()=>{v&&window.clearTimeout(v),T&&window.clearInterval(T),v=null,T=null},O=()=>{g||(L(),d(G=>G+1))};async function I(){const G=Date.now();for(;!g&&Date.now()-G<9e4;){try{const N=hA(s,Date.now()),K=await fetch(N,{cache:"no-store"});if(K.status===403)return{ok:!1,reason:"private"};if(K.status===404)return{ok:!1,reason:"offline"};if(K.ok&&(await K.text()).includes("#EXTINF"))return{ok:!0}}catch{}await new Promise(N=>setTimeout(N,500))}return{ok:!1}}async function j(){const G=await I();if(!g){if(!G.ok){if(G.reason==="private"||G.reason==="offline"){u(G.reason),r(!0);return}window.setTimeout(()=>{g||O()},800);return}if(w.canPlayType("application/vnd.apple.mpegurl")){w.pause(),w.removeAttribute("src"),w.load(),w.src=f,w.load(),w.play().catch(()=>{});let N=Date.now(),K=-1;const k=()=>{w.currentTime>K+.01&&(K=w.currentTime,N=Date.now())},R=()=>{v||(v=window.setTimeout(()=>{v=null,!g&&Date.now()-N>3500&&O()},800))};return w.addEventListener("timeupdate",k),w.addEventListener("waiting",R),w.addEventListener("stalled",R),w.addEventListener("error",R),T=window.setInterval(()=>{g||!w.paused&&Date.now()-N>6e3&&O()},2e3),()=>{w.removeEventListener("timeupdate",k),w.removeEventListener("waiting",R),w.removeEventListener("stalled",R),w.removeEventListener("error",R)}}if(!$r.isSupported()){r(!0);return}y=new $r({lowLatencyMode:!0,liveSyncDurationCount:2,maxBufferLength:8}),y.on($r.Events.ERROR,(N,K)=>{if(y&&K.fatal){if(K.type===$r.ErrorTypes.NETWORK_ERROR){y.startLoad();return}if(K.type===$r.ErrorTypes.MEDIA_ERROR){y.recoverMediaError();return}O()}}),y.loadSource(f),y.attachMedia(w),y.on($r.Events.MANIFEST_PARSED,()=>{w.play().catch(()=>{})})}}let P;return(async()=>{const G=await j();typeof G=="function"&&(P=G)})(),()=>{g=!0,L();try{P?.()}catch{}try{y?.destroy()}catch{}}},[s,e,f]),n?m.jsx("div",{className:"text-xs text-gray-400 italic",children:a==="private"?"Private":a==="offline"?"Offline":"–"}):m.jsx("video",{ref:i,className:t,playsInline:!0,autoPlay:!0,muted:e,preload:"auto",crossOrigin:"anonymous",onClick:()=>{const g=i.current;g&&(g.muted=!1,g.play().catch(()=>{}))}})}const Qr=s=>(s||"").replaceAll("\\","/").split("/").pop()||"",A1=s=>s.startsWith("HOT ")?s.slice(4):s,Y$=s=>(s||"").trim().toLowerCase(),X$=s=>{const e=String(s??"").trim();if(!e)return[];const t=e.split(/[\n,;|]+/g).map(r=>r.trim()).filter(Boolean),i=new Set,n=[];for(const r of t){const a=r.toLowerCase();i.has(a)||(i.add(a),n.push(r))}return n.sort((r,a)=>r.localeCompare(a,void 0,{sensitivity:"base"})),n};function Q$(s){if(!Number.isFinite(s)||s<=0)return"—";const e=Math.floor(s/1e3),t=Math.floor(e/3600),i=Math.floor(e%3600/60),n=e%60;return t>0?`${t}h ${i}m`:i>0?`${i}m ${n}s`:`${n}s`}function Z$(s){if(typeof s!="number"||!Number.isFinite(s)||s<=0)return"—";const e=["B","KB","MB","GB","TB"];let t=s,i=0;for(;t>=1024&&i=100?0:t>=10?1:2;return`${t.toFixed(n)} ${e[i]}`}function fA(s){if(!s)return"—";const e=s instanceof Date?s:new Date(s),t=e.getTime();return Number.isFinite(t)?e.toLocaleString(void 0,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"—"}const Km=(...s)=>{for(const e of s){const t=typeof e=="string"?Number(e):e;if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t}return null};function J$(s){if(!s||!Number.isFinite(s))return"—";const e=s>=10?0:2;return`${s.toFixed(e)} fps`}function eH(s){return!s||!Number.isFinite(s)?"—":`${Math.round(s)}p`}function tH(s){const e=Qr(s||""),t=A1(e);if(!t)return null;const n=t.replace(/\.[^.]+$/,"").match(/_(\d{1,2})_(\d{1,2})_(\d{4})__(\d{1,2})-(\d{2})-(\d{2})$/);if(!n)return null;const r=Number(n[1]),a=Number(n[2]),u=Number(n[3]),c=Number(n[4]),d=Number(n[5]),f=Number(n[6]);return[r,a,u,c,d,f].every(g=>Number.isFinite(g))?new Date(u,r-1,a,c,d,f):null}const iH=s=>{const e=Qr(s||""),t=A1(e);if(!t)return"—";const i=t.replace(/\.[^.]+$/,""),n=i.match(/^(.*?)_\d{1,2}_\d{1,2}_\d{4}__\d{1,2}-\d{2}-\d{2}$/);if(n?.[1])return n[1];const r=i.lastIndexOf("_");return r>0?i.slice(0,r):i},sH=s=>{const e=s,t=e.sizeBytes??e.fileSizeBytes??e.bytes??e.size??null;return typeof t=="number"&&Number.isFinite(t)&&t>0?t:null};function bo(...s){return s.filter(Boolean).join(" ")}function nH(s){const[e,t]=b.useState(!1);return b.useEffect(()=>{if(typeof window>"u")return;const i=window.matchMedia(s),n=()=>t(i.matches);return n(),i.addEventListener?i.addEventListener("change",n):i.addListener(n),()=>{i.removeEventListener?i.removeEventListener("change",n):i.removeListener(n)}},[s]),e}function rH(s){!s||s.__absTimelineShimInstalled||(s.__absTimelineShimInstalled=!0,s.__origCurrentTime=s.currentTime.bind(s),s.__origDuration=s.duration.bind(s),s.__setRelativeTime=e=>{try{s.__origCurrentTime(Math.max(0,e||0))}catch{}},s.currentTime=function(e){const t=Number(this.__timeOffsetSec??0)||0;if(typeof e=="number"&&Number.isFinite(e)){const n=Math.max(0,e);return typeof this.__serverSeekAbs=="function"?(this.__serverSeekAbs(n),n):this.__origCurrentTime(Math.max(0,n-t))}const i=Number(this.__origCurrentTime()??0)||0;return Math.max(0,t+i)},s.duration=function(){const e=Number(this.__fullDurationSec??0)||0;if(e>0)return e;const t=Number(this.__timeOffsetSec??0)||0,i=Number(this.__origDuration()??0)||0;return Math.max(0,t+i)})}function aH({job:s,expanded:e,onClose:t,onToggleExpand:i,modelKey:n,modelsByKey:r,isHot:a=!1,isFavorite:u=!1,isLiked:c=!1,isWatching:d=!1,onKeep:f,onDelete:g,onToggleHot:y,onToggleFavorite:v,onToggleLike:T,onToggleWatch:S,onStopJob:w,startMuted:L=JM,startAtSec:O=0}){const I=b.useMemo(()=>Qr(s.output?.trim()||"")||s.id,[s.output,s.id]),j=b.useMemo(()=>Qr(s.output?.trim()||""),[s.output]),P=b.useMemo(()=>Qr(s.output?.trim()||""),[s.output]),G=b.useMemo(()=>Z$(sH(s)),[s]),N=s,[K,k]=b.useState(()=>Number(s?.meta?.durationSeconds)||Number(s?.durationSeconds)||0),[R,Y]=b.useState(()=>s.status==="running"),[z,X]=b.useState(()=>({h:0,fps:null})),re=s.status==="running",[J,W]=b.useState(!1),q=re&&J,Z=b.useMemo(()=>(P||"").replace(/\.[^.]+$/,""),[P]),te=b.useMemo(()=>re?s.id:Z||s.id,[re,s.id,Z]);b.useEffect(()=>{if(re||K>0)return;const me=Qr(s.output?.trim()||"");if(!me)return;let we=!0;const ue=new AbortController;return(async()=>{try{const pe=lu(`/api/record/done/meta?file=${encodeURIComponent(me)}`),xe=await Ev(pe,{signal:ue.signal,cache:"no-store"});if(!xe.ok)return;const Oe=await xe.json(),Q=Number(Oe?.durationSeconds||Oe?.meta?.durationSeconds||0)||0;if(!we||Q<=0)return;k(Q);const ne=Ze.current;if(ne&&!ne.isDisposed?.())try{ne.__fullDurationSec=Q,ne.trigger?.("durationchange"),ne.trigger?.("timeupdate")}catch{}}catch{}})(),()=>{we=!1,ue.abort()}},[re,K,s.output]);const oe=j.startsWith("HOT "),F=b.useMemo(()=>{const me=(n||"").trim();return me||iH(s.output)},[n,s.output]),le=b.useMemo(()=>A1(j),[j]),ge=b.useMemo(()=>{const me=Number(K||0)||0;return me>0?Q$(me*1e3):"—"},[K]),Ie=b.useMemo(()=>{const me=tH(s.output);if(me)return fA(me);const we=N.startedAt??N.endedAt??N.createdAt??N.fileCreatedAt??N.ctime??null,ue=we?new Date(we):null;return fA(ue&&Number.isFinite(ue.getTime())?ue:null)},[s.output,N.startedAt,N.endedAt,N.createdAt,N.fileCreatedAt,N.ctime]),Le=b.useMemo(()=>Y$((n||F||"").trim()),[n,F]),Pe=b.useMemo(()=>{const me=r?.[Le];return X$(me?.tags)},[r,Le]),Je=b.useMemo(()=>lu(`/api/preview?id=${encodeURIComponent(te)}&file=preview.webp`),[te]),Se=b.useMemo(()=>lu(`/api/preview?id=${encodeURIComponent(te)}&play=1&file=index_hq.m3u8`),[te]),[Re,Ve]=b.useState(Je);b.useEffect(()=>{Ve(Je)},[Je]);const Ee=b.useMemo(()=>Km(z.h,N.videoHeight,N.height,N.meta?.height),[z.h,N.videoHeight,N.height,N.meta?.height]),_e=b.useMemo(()=>Km(z.fps,N.fps,N.frameRate,N.meta?.fps,N.meta?.frameRate),[z.fps,N.fps,N.frameRate,N.meta?.fps,N.meta?.frameRate]),[yt,ut]=b.useState(null),pt=b.useMemo(()=>eH(yt??Ee),[yt,Ee]),Fe=b.useMemo(()=>J$(_e),[_e]);b.useEffect(()=>{const me=we=>we.key==="Escape"&&t();return window.addEventListener("keydown",me),()=>window.removeEventListener("keydown",me)},[t]);const _t=b.useMemo(()=>{const me=`/api/preview?id=${encodeURIComponent(te)}&file=index_hq.m3u8&play=1`;return lu(re?`${me}&t=${Date.now()}`:me)},[te,re]);b.useEffect(()=>{if(!re){W(!1);return}let me=!0;const we=new AbortController;return W(!1),(async()=>{for(let pe=0;pe<120&&me&&!we.signal.aborted;pe++){try{const xe=await Ev(_t,{method:"GET",cache:"no-store",signal:we.signal,headers:{"cache-control":"no-cache"}});if(xe.ok){const Oe=await xe.text(),Q=Oe.includes("#EXTM3U"),ne=/#EXTINF:/i.test(Oe)||/\.ts(\?|$)/i.test(Oe)||/\.m4s(\?|$)/i.test(Oe);if(Q&&ne){me&&W(!0);return}}}catch{}await new Promise(xe=>setTimeout(xe,500))}})(),()=>{me=!1,we.abort()}},[re,_t]);const Qe=b.useCallback(me=>{const we=new URLSearchParams;return me.file&&we.set("file",me.file),me.id&&we.set("id",me.id),lu(`/api/record/video?${we.toString()}`)},[]),Xe=b.useMemo(()=>{if(re)return{src:"",type:""};if(!R)return{src:"",type:""};const me=Qr(s.output?.trim()||"");if(me){const we=me.toLowerCase().split(".").pop(),ue=we==="mp4"?"video/mp4":we==="ts"?"video/mp2t":"application/octet-stream";return{src:Qe({file:me}),type:ue}}return{src:Qe({id:s.id}),type:"video/mp4"}},[re,R,s.output,s.id,Qe]),ze=b.useRef(null),Ze=b.useRef(null),ct=b.useRef(null),[St,se]=b.useState(!1),ke=b.useCallback(()=>{const me=Ze.current;if(!me||me.isDisposed?.())return;const we=typeof me.videoHeight=="function"?me.videoHeight():0;typeof we=="number"&&we>0&&Number.isFinite(we)&&ut(we)},[]),De=b.useCallback(()=>{try{const me=Ze.current?.tech?.(!0)?.el?.()||Ze.current?.el?.()?.querySelector?.("video.vjs-tech")||ct.current;if(!me||!(me instanceof HTMLVideoElement))return null;const we=Number(me.videoWidth||0),ue=Number(me.videoHeight||0);if(!Number.isFinite(we)||!Number.isFinite(ue)||we<=0||ue<=0)return null;let pe=Gi.current;pe||(pe=document.createElement("canvas"),Gi.current=pe);const Oe=Math.min(1,640/we),Q=Math.max(1,Math.round(we*Oe)),ne=Math.max(1,Math.round(ue*Oe));pe.width!==Q&&(pe.width=Q),pe.height!==ne&&(pe.height=ne);const ce=pe.getContext("2d",{alpha:!1});return ce?(ce.drawImage(me,0,0,Q,ne),pe.toDataURL("image/jpeg",.78)):null}catch{return null}},[]),Ue=b.useMemo(()=>Qr(s.output?.trim()||"")||s.id,[s.output,s.id]),at=b.useMemo(()=>{const me=Number(O);return Number.isFinite(me)&&me>=0?me:0},[O]),dt=b.useRef("");b.useEffect(()=>{if(re){Y(!0);return}const me=Qr(s.output?.trim()||"");if(!me){Y(!0);return}let we=!0;const ue=new AbortController;return Y(!1),(async()=>{for(let pe=0;pe<80&&we&&!ue.signal.aborted;pe++){try{const xe=lu(`/api/record/done/meta?file=${encodeURIComponent(me)}`),Oe=await Ev(xe,{signal:ue.signal,cache:"no-store"});if(Oe.ok){const Q=await Oe.json(),ne=!!Q?.metaExists,ce=Number(Q?.durationSeconds||0)||0,fe=Number(Q?.height||0)||0,Ne=Number(Q?.fps||0)||0;if(ce>0){k(ce);const We=Ze.current;if(We&&!We.isDisposed?.())try{We.__fullDurationSec=ce,We.trigger?.("durationchange"),We.trigger?.("timeupdate")}catch{}}if(fe>0&&X({h:fe,fps:Ne>0?Ne:null}),ne){Y(!0);return}}}catch{}await new Promise(xe=>setTimeout(xe,250))}we&&Y(!0)})(),()=>{we=!1,ue.abort()}},[re,Ue,s.output]);const[,wt]=b.useState(0);b.useEffect(()=>{if(typeof window>"u")return;const me=window.visualViewport;if(!me)return;const we=()=>wt(ue=>ue+1);return we(),me.addEventListener("resize",we),me.addEventListener("scroll",we),window.addEventListener("resize",we),window.addEventListener("orientationchange",we),()=>{me.removeEventListener("resize",we),me.removeEventListener("scroll",we),window.removeEventListener("resize",we),window.removeEventListener("orientationchange",we)}},[]);const[kt,Tt]=b.useState(30),[Ft,Qt]=b.useState(null),Zt=!e,Et=nH("(min-width: 640px)"),Dt=Zt&&Et,yi=e||Dt,Pi="player_window_v1",Jt=420,ki=280,gt=12,V=320,$=200;b.useEffect(()=>{if(!St)return;const me=Ze.current;if(!me||me.isDisposed?.())return;const we=me.el();if(!we)return;const ue=we.querySelector(".vjs-control-bar");if(!ue)return;const pe=()=>{const Oe=Math.round(ue.getBoundingClientRect().height||0);Oe>0&&Tt(Oe)};pe();let xe=null;return typeof ResizeObserver<"u"&&(xe=new ResizeObserver(pe),xe.observe(ue)),window.addEventListener("resize",pe),()=>{window.removeEventListener("resize",pe),xe?.disconnect()}},[St,e]),b.useEffect(()=>se(!0),[]),b.useEffect(()=>{if(!yi){Qt(null);return}let me=document.getElementById("player-root");me||(me=document.createElement("div"),me.id="player-root");let we=null;if(Et){const ue=Array.from(document.querySelectorAll("dialog[open]"));we=ue.length?ue[ue.length-1]:null}we=we??document.body,we.appendChild(me),me.style.position="relative",me.style.zIndex="2147483647",Qt(me)},[Et,yi]),b.useEffect(()=>{const me=Ze.current;if(!me||me.isDisposed?.()||re||(rH(me),!Qr(s.output?.trim()||"")))return;const ue=Number(K||0)||0;return ue>0&&(me.__fullDurationSec=ue),me.__serverSeekAbs=pe=>{const xe=Math.max(0,Number(pe)||0);try{me.__origCurrentTime?.(xe);try{me.trigger?.("timeupdate")}catch{}}catch{try{me.currentTime?.(xe)}catch{}}},()=>{try{delete me.__serverSeekAbs}catch{}}},[s.output,re]),b.useLayoutEffect(()=>{if(!St||!ze.current||Ze.current||re||!R)return;const me=document.createElement("video");me.className="video-js vjs-big-play-centered w-full h-full",me.setAttribute("playsinline","true"),ze.current.appendChild(me),ct.current=me;const we=He(me,{autoplay:!0,muted:L,controls:!0,preload:"metadata",playsinline:!0,responsive:!0,fluid:!1,fill:!0,liveui:!1,html5:{vhs:{lowLatencyMode:!0}},inactivityTimeout:0,controlBar:{skipButtons:{backward:10,forward:10},volumePanel:{inline:!1},children:["skipBackward","playToggle","skipForward","volumePanel","currentTimeDisplay","timeDivider","durationDisplay","progressControl","spacer","playbackRateMenuButton","fullscreenToggle"]},playbackRates:[.5,1,1.25,1.5,2]});return Ze.current=we,we.one("loadedmetadata",()=>{ke()}),we.userActive(!0),we.on("userinactive",()=>we.userActive(!0)),()=>{try{Ze.current&&(Ze.current.dispose(),Ze.current=null)}finally{ct.current&&(ct.current.remove(),ct.current=null)}}},[St,L,re,R,Ee,ke]),b.useEffect(()=>{const me=Ze.current;if(!me||me.isDisposed?.())return;const we=me.el();we&&we.classList.toggle("is-live-download",!!q)},[q]);const ie=b.useCallback(()=>{const me=Ze.current;if(!(!me||me.isDisposed?.())){try{me.pause(),me.reset?.()}catch{}try{me.src({src:"",type:"video/mp4"}),me.load?.()}catch{}}},[]),Te=b.useCallback(me=>{const we=Ze.current;if(!we||we.isDisposed?.())return;const ue=Math.max(0,Number(me)||0);try{const pe=Number(we.duration?.()??0),xe=Number.isFinite(pe)&&pe>0?Math.max(0,pe-.05):ue;we.currentTime(Math.min(ue,xe)),we.trigger?.("timeupdate")}catch{try{we.currentTime(ue)}catch{}}},[]);b.useEffect(()=>{if(!St)return;if(!re&&!R){ie();return}const me=Ze.current;if(!me||me.isDisposed?.())return;const we=me.currentTime()||0;if(me.muted(L),!Xe.src){try{me.pause(),me.reset?.(),me.error(null)}catch{}return}me.__timeOffsetSec=0;const ue=Number(K||0)||0;me.__fullDurationSec=ue;const pe=String(me.currentSrc?.()||"");if(dt.current="",pe&&pe===Xe.src){const Oe=me.play?.();Oe&&typeof Oe.catch=="function"&&Oe.catch(()=>{});return}me.src({src:Xe.src,type:Xe.type});const xe=()=>{const Oe=me.play?.();Oe&&typeof Oe.catch=="function"&&Oe.catch(()=>{})};me.one("loadedmetadata",()=>{if(me.isDisposed?.())return;ke();try{const Q=Number(K||0)||0;Q>0&&(me.__fullDurationSec=Q)}catch{}try{me.playbackRate(1)}catch{}const Oe=/mpegurl/i.test(Xe.type);if(we>0&&!Oe)try{const Q=Number(me.__timeOffsetSec??0)||0,ne=Math.max(0,we-Q);me.__setRelativeTime?.(ne)}catch{}try{me.trigger?.("timeupdate")}catch{}xe()}),xe()},[St,re,R,Xe.src,Xe.type,L,ke,K,ie]),b.useEffect(()=>{if(!St||re||!R||!Xe.src)return;const me=Ze.current;if(!me||me.isDisposed?.())return;if(!(at>0)){dt.current="";return}const we=`${Ue}|${Xe.src}|${at.toFixed(3)}`;if(dt.current===we)return;let ue=!1;const pe=()=>{if(ue)return;const ne=Ze.current;if(!ne||ne.isDisposed?.())return;const ce=String(ne.currentSrc?.()||"");if(!ce||ce!==Xe.src)return;const fe=ne.tech?.(!0)?.el?.()||ne.el?.()?.querySelector?.("video.vjs-tech");if(!((fe instanceof HTMLVideoElement?Number(fe.readyState||0):0)<1)){Te(at),dt.current=we;try{const We=ne.play?.();We&&typeof We.catch=="function"&&We.catch(()=>{})}catch{}}};if(pe(),dt.current===we)return;const xe=()=>pe();me.one?.("loadedmetadata",xe),me.one?.("canplay",xe),me.one?.("durationchange",xe);const Oe=window.setTimeout(pe,0),Q=window.setTimeout(pe,120);return()=>{ue=!0,window.clearTimeout(Oe),window.clearTimeout(Q);try{me.off?.("loadedmetadata",xe)}catch{}try{me.off?.("canplay",xe)}catch{}try{me.off?.("durationchange",xe)}catch{}}},[St,re,R,Xe.src,Ue,at,Te]),b.useEffect(()=>{if(!St)return;const me=Ze.current;if(!me||me.isDisposed?.())return;const we=()=>{s.status==="running"&&W(!1)};return me.on("error",we),()=>{try{me.off("error",we)}catch{}}},[St,s.status]),b.useEffect(()=>{const me=Ze.current;!me||me.isDisposed?.()||queueMicrotask(()=>me.trigger("resize"))},[e]),b.useEffect(()=>{const me=we=>{const pe=(we.detail?.file??"").trim();if(!pe)return;const xe=Qr(s.output?.trim()||"");xe&&xe===pe&&ie()};return window.addEventListener("player:release",me),()=>window.removeEventListener("player:release",me)},[s.output,ie]),b.useEffect(()=>{const me=we=>{const pe=(we.detail?.file??"").trim();if(!pe)return;const xe=Qr(s.output?.trim()||"");xe&&xe===pe&&(ie(),t())};return window.addEventListener("player:close",me),()=>window.removeEventListener("player:close",me)},[s.output,ie,t]);const Be=()=>{if(typeof window>"u")return{w:0,h:0,ox:0,oy:0,bottomInset:0};const me=window.visualViewport;if(me&&Number.isFinite(me.width)&&Number.isFinite(me.height)){const xe=Math.floor(me.width),Oe=Math.floor(me.height),Q=Math.floor(me.offsetLeft||0),ne=Math.floor(me.offsetTop||0),ce=Math.max(0,Math.floor(window.innerHeight-(me.height+me.offsetTop)));return{w:xe,h:Oe,ox:Q,oy:ne,bottomInset:ce}}const we=document.documentElement,ue=we?.clientWidth||window.innerWidth,pe=we?.clientHeight||window.innerHeight;return{w:ue,h:pe,ox:0,oy:0,bottomInset:0}},ht=b.useRef(null);b.useEffect(()=>{if(typeof window>"u")return;const{w:me,h:we}=Be();ht.current={w:me,h:we}},[]);const It=b.useCallback(()=>{const me=s,we=Km(Ze.current?.videoWidth?.(),me.videoWidth,me.width,me.meta?.width)??0,ue=Km(yt,Ze.current?.videoHeight?.(),me.videoHeight,me.height,me.meta?.height)??0;return we>0&&ue>0?we/ue:16/9},[s,yt]),Yt=b.useCallback(me=>{if(typeof window>"u")return me;const we=It(),ue=30,{w:pe,h:xe}=Be(),Oe=pe-gt*2,Q=Math.max(1,xe-gt*2-ue),ne=Math.max(1,$-ue);let ce=Math.max(V,Math.min(me.w,Oe)),fe=ce/we;feQ&&(fe=Q,ce=fe*we),ce>Oe&&(ce=Oe,fe=ce/we);const Ne=Math.round(fe+ue),We=Math.max(gt,Math.min(me.x,pe-ce-gt)),xt=Math.max(gt,Math.min(me.y,xe-Ne-gt));return{x:We,y:xt,w:Math.round(ce),h:Ne}},[It]),pi=b.useCallback(()=>{if(typeof window>"u")return{x:gt,y:gt,w:Jt,h:ki};try{const Q=window.localStorage.getItem(Pi);if(Q){const ne=JSON.parse(Q);if(typeof ne.x=="number"&&typeof ne.y=="number"&&typeof ne.w=="number"&&typeof ne.h=="number")return Yt({x:ne.x,y:ne.y,w:ne.w,h:ne.h})}}catch{}const{w:me,h:we}=Be(),ue=Jt,pe=ki,xe=Math.max(gt,me-ue-gt),Oe=Math.max(gt,we-pe-gt);return Yt({x:xe,y:Oe,w:ue,h:pe})},[Yt]),[oi,ci]=b.useState(()=>pi()),Bi=Dt&&oi.w<380,Gt=b.useCallback(me=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Pi,JSON.stringify(me))}catch{}},[]),xi=b.useRef(oi);b.useEffect(()=>{xi.current=oi},[oi]),b.useEffect(()=>{Dt&&ci(pi())},[Dt,pi]),b.useEffect(()=>{if(!Dt)return;const me=()=>{const we=ht.current,{w:ue,h:pe}=Be();ci(xe=>{if(!we)return Yt(xe);const Oe=24,Q=xe.x-gt,ne=we.w-gt-(xe.x+xe.w),ce=we.h-gt-(xe.y+xe.h),fe=Math.abs(Q)<=Oe,Ne=Math.abs(ne)<=Oe,We=Math.abs(ce)<=Oe;let xt=Yt(xe);return We&&(xt={...xt,y:Math.max(gt,pe-xt.h-gt)}),Ne?xt={...xt,x:Math.max(gt,ue-xt.w-gt)}:fe&&(xt={...xt,x:gt}),Yt(xt)}),ht.current={w:ue,h:pe}};return ht.current=(()=>{const{w:we,h:ue}=Be();return{w:we,h:ue}})(),window.addEventListener("resize",me),()=>window.removeEventListener("resize",me)},[Dt,Yt]);const ai=b.useRef(null);b.useEffect(()=>{const me=Ze.current;if(!(!me||me.isDisposed?.()))return ai.current!=null&&cancelAnimationFrame(ai.current),ai.current=requestAnimationFrame(()=>{ai.current=null;try{me.trigger("resize")}catch{}}),()=>{ai.current!=null&&(cancelAnimationFrame(ai.current),ai.current=null)}},[Dt,oi.w,oi.h]);const[di,qt]=b.useState(!1),[Mt,vt]=b.useState(!1),[Ci,ss]=b.useState(null),[vs,xs]=b.useState(null),Gi=b.useRef(null),fi=b.useRef(null),Zi=b.useRef(null),ts=b.useRef(null),$i=b.useCallback(me=>{const{w:we,h:ue}=Be(),pe=gt,xe=we-me.w-gt,Oe=ue-me.h-gt,ne=me.x+me.w/2{const we=ts.current;if(!we)return;const ue=me.clientX-we.sx,pe=me.clientY-we.sy,xe=we.start,Oe=Yt({x:xe.x+ue,y:xe.y+pe,w:xe.w,h:xe.h});Zi.current={x:Oe.x,y:Oe.y},ss($i(Oe)),fi.current==null&&(fi.current=requestAnimationFrame(()=>{fi.current=null;const Q=Zi.current;Q&&ci(ne=>({...ne,x:Q.x,y:Q.y}))}))},[Yt,$i]),Di=b.useCallback(()=>{ts.current&&(vt(!1),ss(null),fi.current!=null&&(cancelAnimationFrame(fi.current),fi.current=null),ts.current=null,window.removeEventListener("pointermove",Ji),window.removeEventListener("pointerup",Di),ci(me=>{const we=$i(Yt(me));return queueMicrotask(()=>Gt(we)),we}))},[Ji,$i,Yt,Gt]),$s=b.useCallback(me=>{if(!Dt||di||me.button!==0)return;me.preventDefault(),me.stopPropagation();const we=xi.current;ts.current={sx:me.clientX,sy:me.clientY,start:we},vt(!0);const ue=De();xs(ue),ss($i(we)),window.addEventListener("pointermove",Ji),window.addEventListener("pointerup",Di)},[Dt,di,Ji,Di,$i,De]),Cs=b.useRef(null),ns=b.useRef(null),rs=b.useRef(null),Rs=b.useCallback(me=>{const we=rs.current;if(!we)return;const ue=me.clientX-we.sx,pe=me.clientY-we.sy,xe=we.ratio,Oe=we.dir.includes("w"),Q=we.dir.includes("e"),ne=we.dir.includes("n"),ce=we.dir.includes("s");let fe=we.start.w,Ne=we.start.h,We=we.start.x,xt=we.start.y;const{w:it,h:mt}=Be(),Rt=24,Pt=we.start.x+we.start.w,Nt=we.start.y+we.start.h,Ht=Math.abs(it-gt-Pt)<=Rt,Vi=Math.abs(mt-gt-Nt)<=Rt,gn=hs=>{hs=Math.max(V,hs);let Ms=hs/xe;return Ms<$&&(Ms=$,hs=Ms*xe),{newW:hs,newH:Ms}},yn=hs=>{hs=Math.max($,hs);let Ms=hs*xe;return Ms=Math.abs(pe)){const Ms=Q?we.start.w+ue:we.start.w-ue,{newW:En,newH:ba}=gn(Ms);fe=En,Ne=ba}else{const Ms=ce?we.start.h+pe:we.start.h-pe,{newW:En,newH:ba}=yn(Ms);fe=En,Ne=ba}Oe&&(We=we.start.x+(we.start.w-fe)),ne&&(xt=we.start.y+(we.start.h-Ne))}else if(Q||Oe){const hs=Q?we.start.w+ue:we.start.w-ue,{newW:Ms,newH:En}=gn(hs);fe=Ms,Ne=En,Oe&&(We=we.start.x+(we.start.w-fe)),xt=Vi?we.start.y+(we.start.h-Ne):we.start.y}else if(ne||ce){const hs=ce?we.start.h+pe:we.start.h-pe,{newW:Ms,newH:En}=yn(hs);fe=Ms,Ne=En,ne&&(xt=we.start.y+(we.start.h-Ne)),Ht?We=we.start.x+(we.start.w-fe):We=we.start.x}const Er=Yt({x:We,y:xt,w:fe,h:Ne});ns.current=Er,Cs.current==null&&(Cs.current=requestAnimationFrame(()=>{Cs.current=null;const hs=ns.current;hs&&ci(hs)}))},[Yt]),Li=b.useCallback(()=>{rs.current&&(qt(!1),ss(null),xs(null),Cs.current!=null&&(cancelAnimationFrame(Cs.current),Cs.current=null),rs.current=null,window.removeEventListener("pointermove",Rs),window.removeEventListener("pointerup",Li),Gt(xi.current))},[Rs,Gt]),qi=b.useCallback(me=>we=>{if(!Dt||we.button!==0)return;we.preventDefault(),we.stopPropagation();const ue=xi.current;rs.current={dir:me,sx:we.clientX,sy:we.clientY,start:ue,ratio:ue.w/ue.h},qt(!0),window.addEventListener("pointermove",Rs),window.addEventListener("pointerup",Li)},[Dt,Rs,Li]),[bs,Kt]=b.useState(!1),[ds,Fi]=b.useState(!1);b.useEffect(()=>{const me=window.matchMedia?.("(hover: hover) and (pointer: fine)"),we=()=>Kt(!!me?.matches);return we(),me?.addEventListener?.("change",we),()=>me?.removeEventListener?.("change",we)},[]);const Hi=Dt&&(ds||Mt||di),[Ge,Lt]=b.useState(!1);if(b.useEffect(()=>{s.status!=="running"&&Lt(!1)},[s.id,s.status]),!St||yi&&!Ft)return null;const Ct="inline-flex items-center justify-center rounded-md p-2 transition bg-white/75 text-gray-900 ring-1 ring-black/10 hover:bg-white/90 active:scale-[0.98] dark:bg-black/45 dark:text-white dark:ring-white/10 dark:hover:bg-black/60 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-500",Wt=String(s.phase??"").toLowerCase(),_i=Wt==="stopping"||Wt==="remuxing"||Wt==="moving",ei=!w||!re||_i||Ge,Ki=m.jsx("div",{className:"flex items-center gap-1 min-w-0",children:re?m.jsxs(m.Fragment,{children:[m.jsx(ri,{variant:"primary",color:"red",size:"sm",rounded:"md",disabled:ei,title:_i||Ge?"Stoppe…":"Stop","aria-label":_i||Ge?"Stoppe…":"Stop",onClick:async me=>{if(me.preventDefault(),me.stopPropagation(),!ei)try{Lt(!0),await w?.(s.id)}finally{Lt(!1)}},className:bo("shadow-none shrink-0",Dt&&Bi&&"px-2"),children:m.jsx("span",{className:"whitespace-nowrap",children:_i||Ge?"Stoppe…":Dt&&Bi?"Stop":"Stoppen"})}),m.jsx(ga,{job:s,variant:"overlay",collapseToMenu:!0,busy:_i||Ge,isFavorite:u,isLiked:c,isWatching:d,onToggleWatch:S?me=>S(me):void 0,onToggleFavorite:v?me=>v(me):void 0,onToggleLike:T?me=>T(me):void 0,order:["watch","favorite","like","details"],className:"gap-1 min-w-0 flex-1"})]}):m.jsx(ga,{job:s,variant:"overlay",collapseToMenu:!0,isHot:a||oe,isFavorite:u,isLiked:c,isWatching:d,onToggleWatch:S?me=>S(me):void 0,onToggleFavorite:v?me=>v(me):void 0,onToggleLike:T?me=>T(me):void 0,onToggleHot:y?async me=>{ie(),await new Promise(ue=>setTimeout(ue,150)),await y(me),await new Promise(ue=>setTimeout(ue,0));const we=Ze.current;if(we&&!we.isDisposed?.()){const ue=we.play?.();ue&&typeof ue.catch=="function"&&ue.catch(()=>{})}}:void 0,onKeep:f?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await f(me)}:void 0,onDelete:g?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await g(me)}:void 0,order:["watch","favorite","like","hot","keep","delete","details"],className:"gap-1 min-w-0 flex-1"})}),Ts=e||Dt,In=re?"calc(4px + env(safe-area-inset-bottom))":`calc(${kt+2}px + env(safe-area-inset-bottom))`,Wi="top-2",Nn=e&&Et,On=m.jsx("div",{className:bo("relative overflow-visible",e||Dt?"flex-1 min-h-0":"aspect-video"),onMouseEnter:()=>{!Dt||!bs||Fi(!0)},onMouseLeave:()=>{!Dt||!bs||Fi(!1)},children:m.jsxs("div",{className:bo("relative w-full h-full",Dt&&"vjs-mini"),style:{"--vjs-controlbar-h":`${kt}px`},children:[re?m.jsxs("div",{className:"absolute inset-0 bg-black",children:[m.jsx(IR,{src:Se,muted:L,className:"w-full h-full object-contain object-bottom"}),m.jsxs("div",{className:"absolute right-2 bottom-2 z-[60] pointer-events-none inline-flex items-center gap-1.5 rounded-full bg-red-600/90 px-2 py-1 text-[11px] font-semibold text-white shadow-sm",children:[m.jsx("span",{className:"inline-block size-1.5 rounded-full bg-white animate-pulse"}),"Live"]})]}):m.jsx("div",{ref:ze,className:"absolute inset-0"}),m.jsxs("div",{className:bo("absolute inset-x-0 z-30 pointer-events-none","top-0"),children:[m.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 h-16 bg-gradient-to-b from-black/35 to-transparent"}),m.jsx("div",{className:bo("absolute inset-x-2",Wi),children:m.jsxs("div",{className:"grid grid-cols-[minmax(0,1fr)_auto_auto] items-start gap-2",children:[m.jsx("div",{className:"min-w-0 pointer-events-auto overflow-visible",children:Nn?null:Ki}),Dt?m.jsxs("button",{type:"button","aria-label":"Player-Fenster verschieben",title:"Ziehen zum Verschieben",onPointerDown:$s,onClick:me=>{me.preventDefault(),me.stopPropagation()},className:bo(Ct,"px-3 gap-1 cursor-grab active:cursor-grabbing select-none",Hi?"opacity-100 pointer-events-auto":"opacity-0 pointer-events-none -translate-y-1",Mt&&"scale-[0.98] opacity-90"),children:[m.jsx("span",{className:"h-1 w-1 rounded-full bg-black/35 dark:bg-white/35"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-black/35 dark:bg-white/35"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-black/35 dark:bg-white/35"})]}):null,m.jsxs("div",{className:"shrink-0 flex items-center gap-1 pointer-events-auto",children:[m.jsx("button",{type:"button",className:Ct,onClick:i,"aria-label":e?"Minimieren":"Maximieren",title:e?"Minimieren":"Maximieren",children:e?m.jsx(WO,{className:"h-5 w-5"}):m.jsx(XO,{className:"h-5 w-5"})}),m.jsx("button",{type:"button",className:Ct,onClick:t,"aria-label":"Schließen",title:"Schließen",children:m.jsx(v0,{className:"h-5 w-5"})})]})]})})]}),m.jsxs("div",{className:bo("player-ui pointer-events-none absolute inset-x-2 z-50","flex items-end justify-between gap-2","transition-all duration-200 ease-out"),style:{bottom:In},children:[m.jsxs("div",{className:"min-w-0",children:[m.jsx("div",{className:"truncate text-sm font-semibold text-white",children:F}),m.jsx("div",{className:"truncate text-[11px] text-white/80",children:m.jsxs("span",{className:"inline-flex items-center gap-1 min-w-0 align-middle",children:[m.jsx("span",{className:"truncate",children:le||I}),a||oe?m.jsx("span",{className:"shrink-0 rounded bg-amber-500/25 px-1.5 py-0.5 font-semibold text-white",children:"HOT"}):null]})})]}),m.jsxs("div",{className:"shrink-0 flex items-center gap-1.5 text-[11px] text-white",children:[pt!=="—"?m.jsx("span",{className:"rounded bg-black/40 px-1.5 py-0.5 font-medium",children:pt}):null,re?null:m.jsx("span",{className:"rounded bg-black/40 px-1.5 py-0.5 font-medium",children:ge}),G!=="—"?m.jsx("span",{className:"rounded bg-black/40 px-1.5 py-0.5 font-medium",children:G}):null]})]})]})}),Zs=m.jsx("div",{className:"w-[360px] shrink-0 border-r border-white/10 bg-black/40 text-white",children:m.jsxs("div",{className:"h-full p-4 flex flex-col gap-3 overflow-y-auto",children:[m.jsx("div",{className:"rounded-lg overflow-hidden ring-1 ring-white/10 bg-black/30",children:m.jsx("div",{className:"relative aspect-video",children:m.jsx("img",{src:Re,alt:"",className:"absolute inset-0 h-full w-full object-contain opacity-80",draggable:!1,onError:()=>{}})})}),m.jsxs("div",{className:"space-y-1",children:[m.jsx("div",{className:"text-lg font-semibold truncate",children:F}),m.jsx("div",{className:"text-xs text-white/70 break-all",children:le||I})]}),m.jsx("div",{className:"pointer-events-auto",children:m.jsxs("div",{className:"flex items-center justify-center gap-2 flex-wrap",children:[re?m.jsx(ri,{variant:"primary",color:"red",size:"sm",rounded:"md",disabled:ei,title:_i||Ge?"Stoppe…":"Stop","aria-label":_i||Ge?"Stoppe…":"Stop",onClick:async me=>{if(me.preventDefault(),me.stopPropagation(),!ei)try{Lt(!0),await w?.(s.id)}finally{Lt(!1)}},className:"shadow-none",children:_i||Ge?"Stoppe…":"Stoppen"}):null,m.jsx(ga,{job:s,variant:"table",collapseToMenu:!1,busy:_i||Ge,isHot:a||oe,isFavorite:u,isLiked:c,isWatching:d,onToggleWatch:S?me=>S(me):void 0,onToggleFavorite:v?me=>v(me):void 0,onToggleLike:T?me=>T(me):void 0,onToggleHot:y?async me=>{ie(),await new Promise(ue=>setTimeout(ue,150)),await y(me),await new Promise(ue=>setTimeout(ue,0));const we=Ze.current;if(we&&!we.isDisposed?.()){const ue=we.play?.();ue&&typeof ue.catch=="function"&&ue.catch(()=>{})}}:void 0,onKeep:f?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await f(me)}:void 0,onDelete:g?async me=>{ie(),t(),await new Promise(we=>setTimeout(we,150)),await g(me)}:void 0,order:re?["watch","favorite","like","details"]:["watch","favorite","like","hot","details","keep","delete"],className:"flex items-center justify-start gap-1"})]})}),m.jsxs("div",{className:"grid grid-cols-2 gap-x-3 gap-y-2 text-sm",children:[m.jsx("div",{className:"text-white/60",children:"Status"}),m.jsx("div",{className:"font-medium",children:s.status}),m.jsx("div",{className:"text-white/60",children:"Auflösung"}),m.jsx("div",{className:"font-medium",children:pt}),m.jsx("div",{className:"text-white/60",children:"FPS"}),m.jsx("div",{className:"font-medium",children:Fe}),m.jsx("div",{className:"text-white/60",children:"Laufzeit"}),m.jsx("div",{className:"font-medium",children:ge}),m.jsx("div",{className:"text-white/60",children:"Größe"}),m.jsx("div",{className:"font-medium",children:G}),m.jsx("div",{className:"text-white/60",children:"Datum"}),m.jsx("div",{className:"font-medium",children:Ie}),m.jsx("div",{className:"col-span-2",children:Pe.length?m.jsx("div",{className:"flex flex-wrap gap-1.5",children:Pe.map(me=>m.jsx("span",{className:"rounded bg-white/10 px-2 py-0.5 text-xs text-white/90",children:me},me))}):m.jsx("span",{className:"text-white/50",children:"—"})})]})]})}),pn=Dt&&Mt&&Ci?m.jsx("div",{className:"pointer-events-none absolute z-0 player-snap-ghost overflow-hidden rounded-lg border-2 border-dashed border-white/70 bg-black/55 shadow-2xl dark:border-white/60",style:{left:Ci.x-oi.x,top:Ci.y-oi.y,width:Ci.w,height:Ci.h},"aria-hidden":"true",children:m.jsxs("div",{className:"absolute inset-0 bg-black",children:[m.jsx("img",{src:vs||Re,alt:"",className:"absolute inset-0 h-full w-full object-contain opacity-80",draggable:!1,onError:()=>{}}),m.jsx("div",{className:"absolute inset-x-0 top-0 h-14 bg-gradient-to-b from-black/55 to-transparent"}),m.jsxs("div",{className:"absolute top-2 right-2 flex items-center gap-1.5 opacity-80",children:[m.jsx("div",{className:"h-8 w-8 rounded-md bg-white/15 ring-1 ring-white/20"}),m.jsx("div",{className:"h-8 w-8 rounded-md bg-white/15 ring-1 ring-white/20"})]}),m.jsxs("div",{className:"absolute top-2 left-2 h-8 rounded-md bg-white/12 px-2 flex items-center gap-1 ring-1 ring-white/15",children:[m.jsx("span",{className:"h-1 w-1 rounded-full bg-white/50"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-white/50"}),m.jsx("span",{className:"h-1 w-1 rounded-full bg-white/50"})]}),m.jsxs("div",{className:"absolute inset-x-2 bottom-2 flex items-end justify-between gap-2",children:[m.jsxs("div",{className:"min-w-0",children:[m.jsx("div",{className:"truncate text-sm font-semibold text-white/95",children:F}),m.jsxs("div",{className:"truncate text-[11px] text-white/75",children:[le||I,a||oe?m.jsx("span",{className:"ml-1.5 rounded bg-amber-500/30 px-1.5 py-0.5 text-white",children:"HOT"}):null]})]}),m.jsxs("div",{className:"shrink-0 flex items-center gap-1 text-[10px] text-white/90",children:[pt!=="—"?m.jsx("span",{className:"rounded bg-black/45 px-1.5 py-0.5",children:pt}):null,!re&&ge!=="—"?m.jsx("span",{className:"rounded bg-black/45 px-1.5 py-0.5",children:ge}):null]})]}),m.jsx("div",{className:"absolute inset-x-0 bottom-0 h-8 bg-gradient-to-t from-white/8 to-transparent"})]})}):null,ln=m.jsx(pa,{edgeToEdgeMobile:!0,noBodyPadding:!0,className:bo("relative z-10 flex flex-col shadow-2xl ring-1 ring-black/10 dark:ring-white/10","w-full",Ts?"h-full":"h-[220px] max-h-[40vh]",e?"rounded-2xl":Dt?"rounded-lg":"rounded-none"),bodyClassName:"flex flex-col flex-1 min-h-0 p-0",children:m.jsxs("div",{className:"flex flex-1 min-h-0",children:[Nn?Zs:null,On]})}),{w:Is,h:un,ox:Mn,oy:Js,bottomInset:en}=Be(),zi={left:Mn+16,top:Js+16,width:Math.max(0,Is-32),height:Math.max(0,un-32)},Pn=e?zi:Dt?{left:oi.x,top:oi.y,width:oi.w,height:oi.h}:void 0,_n=m.jsxs(m.Fragment,{children:[m.jsx("style",{children:` /* Live-Download: Progress/Seek-Bar ausblenden */ .is-live-download .vjs-progress-control { display: none !important; @@ -390,7 +390,7 @@ Schedule: ${c.map(S=>ha(S))} pos: ${this.timelinePos}`),f.length&&this.log(`Remo fixed z-[2147483647] inset-x-0 w-full\r shadow-2xl\r md:bottom-4 md:left-1/2 md:right-auto md:inset-x-auto md:w-[min(760px,calc(100vw-32px))] md:-translate-x-1/2\r - `,style:{bottom:`calc(${en}px + env(safe-area-inset-bottom))`},children:ln})]});return yi?Nc.createPortal(_n,Ft):_n}function NR({jobId:s,thumbTick:e,autoTickMs:t=1e4,blur:i=!1,className:n,alignStartAt:r,alignEndAt:a=null,alignEveryMs:u,fastRetryMs:c,fastRetryMax:d,fastRetryWindowMs:f,thumbsWebpUrl:g,thumbsCandidates:y}){const v=i?"blur-md":"",T=30,S=b.useRef(null),w=b.useRef(!0),[L,O]=b.useState(!1),I=b.useRef(!1),[j,P]=b.useState(0),[G,N]=b.useState(!1),[K,k]=b.useState(!1),R=b.useRef(null),Y=b.useRef(0),z=b.useRef(!1),X=b.useRef(!1),[re,J]=b.useState(!0),W=Re=>{if(typeof Re=="number"&&Number.isFinite(Re))return Re;if(Re instanceof Date)return Re.getTime();const Ve=Date.parse(String(Re??""));return Number.isFinite(Ve)?Ve:NaN},q=Re=>{const Ve=String(Re??"").trim();return Ve?/^https?:\/\//i.test(Ve)||Ve.startsWith("/")?Ve:`/${Ve}`:""},Z=b.useMemo(()=>{const Re=[g,...Array.isArray(y)?y:[]].map(q).filter(Boolean);return Array.from(new Set(Re)).join("|")},[g,y]);b.useEffect(()=>{const Re=()=>{const Ee=!document.hidden;w.current=Ee,J(Ee)},Ve=!document.hidden;return w.current=Ve,J(Ve),document.addEventListener("visibilitychange",Re),()=>document.removeEventListener("visibilitychange",Re)},[]),b.useEffect(()=>()=>{R.current&&window.clearTimeout(R.current)},[]),b.useEffect(()=>{const Re=S.current;if(!Re)return;const Ve=new IntersectionObserver(Ee=>{const _e=Ee[0],yt=!!(_e&&(_e.isIntersecting||_e.intersectionRatio>0));yt!==I.current&&(I.current=yt,O(yt))},{root:null,threshold:0,rootMargin:"300px 0px"});return Ve.observe(Re),()=>Ve.disconnect()},[]),b.useEffect(()=>{typeof e!="number"&&L&&w.current&&(X.current||(X.current=!0,P(Re=>Re+1)))},[L,e]),b.useEffect(()=>{if(typeof e=="number"||!L||!w.current)return;const Re=Number(u??t??1e4);if(!Number.isFinite(Re)||Re<=0)return;const Ve=r?W(r):NaN,Ee=a?W(a):NaN;if(Number.isFinite(Ve)){let yt;const ut=()=>{if(!w.current)return;const pt=Date.now();if(Number.isFinite(Ee)&&pt>=Ee)return;const _t=Math.max(0,pt-Ve)%Re,Qe=_t===0?Re:Re-_t;yt=window.setTimeout(()=>{I.current&&w.current&&(P(Xe=>Xe+1),ut())},Qe)};return ut(),()=>{yt&&window.clearTimeout(yt)}}const _e=window.setInterval(()=>{I.current&&w.current&&P(yt=>yt+1)},Re);return()=>window.clearInterval(_e)},[e,t,L,re,r,a,u]);const te=typeof e=="number"?e:j,oe=b.useRef(0),[F,le]=b.useState(0);b.useEffect(()=>{L&&w.current&&(oe.current=te,le(te))},[te,L]),b.useEffect(()=>{N(!1),k(!1)},[F]),b.useEffect(()=>{z.current=!1,Y.current=0,X.current=!1,N(!1),k(!1),I.current&&w.current&&P(Re=>Re+1)},[s,Z]);const ge=b.useMemo(()=>`/api/preview?id=${encodeURIComponent(s)}&v=${F}`,[s,F]),Ie=b.useMemo(()=>`/api/preview?id=${encodeURIComponent(s)}&hover=1&file=index_hq.m3u8`,[s]),Pe=b.useMemo(()=>Z?Z.split("|"):[],[Z])[0]||"",Je=!!Pe&&!G,Se=b.useMemo(()=>{if(Je){const Re=Pe.includes("?")?"&":"?";return`${Pe}${Re}v=${encodeURIComponent(String(F))}`}return ge},[Je,Pe,F,ge]);return m.jsx(ck,{content:(Re,{close:Ve})=>Re&&m.jsx("div",{className:"w-[420px] max-w-[calc(100vw-1.5rem)]",children:m.jsx("div",{className:"relative rounded-lg overflow-hidden bg-black",style:{paddingBottom:`calc(56.25% + ${T}px)`},children:m.jsxs("div",{className:"absolute inset-0",children:[m.jsx(IR,{src:Ie,muted:!1,className:"w-full h-full object-contain object-bottom relative z-0"}),m.jsxs("div",{className:"absolute left-2 top-2 inline-flex items-center gap-1.5 rounded-full bg-red-600/90 px-2 py-1 text-[11px] font-semibold text-white shadow-sm",children:[m.jsx("span",{className:"inline-block size-1.5 rounded-full bg-white animate-pulse"}),"Live"]}),m.jsx("button",{type:"button",className:"absolute right-2 top-2 z-20 inline-flex items-center justify-center rounded-md p-1.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/70 bg-white/75 text-gray-900 ring-1 ring-black/10 hover:bg-white/90 dark:bg-black/40 dark:text-white dark:ring-white/10 dark:hover:bg-black/55","aria-label":"Live-Vorschau schließen",title:"Vorschau schließen",onClick:Ee=>{Ee.preventDefault(),Ee.stopPropagation(),Ve()},children:m.jsx(v0,{className:"h-4 w-4"})})]})})}),children:m.jsx("div",{ref:S,className:["block relative rounded bg-gray-100 dark:bg-white/5 overflow-hidden",n||"w-full h-full"].join(" "),children:K?m.jsx("div",{className:"absolute inset-0 grid place-items-center px-1 text-center text-[10px] text-gray-500 dark:text-gray-400",children:"keine Vorschau"}):m.jsx("img",{src:Se,loading:L?"eager":"lazy",fetchPriority:L?"high":"auto",decoding:"async",alt:"",className:["block w-full h-full object-cover object-center",v].filter(Boolean).join(" "),onLoad:()=>{z.current=!0,Y.current=0,R.current&&window.clearTimeout(R.current),Je?N(!1):k(!1)},onError:()=>{if(Je){N(!0);return}if(k(!0),!c||!I.current||!w.current||z.current)return;const Re=r?W(r):NaN,Ve=Number(f??6e4);if(!(!Number.isFinite(Re)||Date.now()-Re=_e||(R.current&&window.clearTimeout(R.current),R.current=window.setTimeout(()=>{Y.current+=1,k(!1),P(yt=>yt+1)},c))}})})})}function qh({label:s,value:e=0,indeterminate:t=!1,showPercent:i=!1,rightLabel:n,steps:r,currentStep:a,size:u="md",className:c}){const d=Math.max(0,Math.min(100,Number(e)||0)),f=u==="sm"?"h-1.5":"h-2",g=Array.isArray(r)&&r.length>0,y=g?r.length:0,v=w=>w===0?"text-left":w===y-1?"text-right":"text-center",T=w=>typeof a!="number"||!Number.isFinite(a)?!1:w<=a,S=i&&!t;return m.jsxs("div",{className:c,children:[s||S?m.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s?m.jsx("p",{className:"flex-1 min-w-0 truncate text-xs font-medium text-gray-900 dark:text-white",children:s}):m.jsx("span",{className:"flex-1"}),S?m.jsxs("span",{className:"shrink-0 text-xs font-medium text-gray-700 dark:text-gray-300",children:[Math.round(d),"%"]}):null]}):null,m.jsxs("div",{"aria-hidden":"true",className:s||S?"mt-2":"",children:[m.jsx("div",{className:"overflow-hidden rounded-full bg-gray-200 dark:bg-white/10",children:t?m.jsx("div",{className:`${f} w-full rounded-full bg-indigo-600/70 dark:bg-indigo-500/70 animate-pulse`}):m.jsx("div",{className:`${f} rounded-full bg-indigo-600 dark:bg-indigo-500 transition-[width] duration-200`,style:{width:`${d}%`}})}),n?m.jsx("div",{className:"mt-2 text-xs text-gray-600 dark:text-gray-400",children:n}):null,g?m.jsx("div",{className:"mt-3 hidden text-sm font-medium text-gray-600 sm:grid dark:text-gray-400",style:{gridTemplateColumns:`repeat(${y}, minmax(0, 1fr))`},children:r.map((w,L)=>m.jsx("div",{className:[v(L),T(L)?"text-indigo-600 dark:text-indigo-400":""].join(" "),children:w},`${L}-${w}`))}):null]})]})}function oH(s){const[e,t]=b.useState(s),i=b.useRef(s.length);return b.useEffect(()=>{const n=up("/api/record/stream","jobs",r=>{Array.isArray(r)&&(r.length,i.current,i.current=r.length,t(r))});return()=>n()},[]),e}function lH(s,e=!1){const[t,i]=b.useState(e);return b.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const n=window.matchMedia(s),r=()=>{i(n.matches)};return r(),typeof n.addEventListener=="function"?(n.addEventListener("change",r),()=>n.removeEventListener("change",r)):(n.addListener(r),()=>n.removeListener(r))},[s]),t}const Z0=s=>{const e=s;return e.modelName??e.model??e.modelKey??e.username??e.name??"—"},OR=s=>{const e=s;return e.sourceUrl??e.url??e.roomUrl??""},MR=s=>{const e=s;return String(e.imageUrl??e.image_url??"").trim()},cc=s=>{const e=s;return String(e.key??e.id??Z0(s))},Xs=s=>{if(typeof s=="number"&&Number.isFinite(s))return s<1e12?s*1e3:s;if(typeof s=="string"){const e=Date.parse(s);return Number.isFinite(e)?e:0}return s instanceof Date?s.getTime():0},uH=s=>{const e=String(s??"").trim();return e?/^https?:\/\//i.test(e)||e.startsWith("/")?e:`/${e}`:""},PR=s=>{const e=s,t=[e.thumbsWebpUrl,e.thumbsUrl,e.previewThumbsUrl,e.thumbnailSheetUrl],i=[e.previewBaseUrl?`${String(e.previewBaseUrl).replace(/\/+$/,"")}/thumbs.webp`:"",e.assetBaseUrl?`${String(e.assetBaseUrl).replace(/\/+$/,"")}/thumbs.webp`:"",e.thumbsBaseUrl?`${String(e.thumbsBaseUrl).replace(/\/+$/,"")}/thumbs.webp`:""];return[...t,...i].map(n=>uH(String(n??""))).filter(Boolean)},dc=s=>{if(s.kind==="job"){const t=s.job;return Xs(t.addedAt)||Xs(t.createdAt)||Xs(t.enqueuedAt)||Xs(t.queuedAt)||Xs(t.requestedAt)||Xs(t.startedAt)||0}const e=s.pending;return Xs(e.addedAt)||Xs(e.createdAt)||Xs(e.enqueuedAt)||Xs(e.queuedAt)||Xs(e.requestedAt)||0},BR=s=>{switch((s??"").toLowerCase()){case"stopping":return"Stop wird angefordert…";case"probe":return"Analysiere Datei (Dauer/Streams)…";case"remuxing":return"Konvertiere Container zu MP4…";case"moving":return"Verschiebe nach Done…";case"assets":return"Erstelle Vorschau/Thumbnails…";case"postwork":return"Nacharbeiten laufen…";default:return""}};async function cH(s,e){const t=await fetch(s,e);if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(i||`HTTP ${t.status}`)}return t.json()}function FR(s,e){const t=s.postWork;if(!t)return"Warte auf Nacharbeiten…";if(t.state==="running"){const i=typeof t.running=="number"?t.running:0,n=typeof t.maxParallel=="number"?t.maxParallel:0;return n>0?`Nacharbeiten laufen… (${i}/${n} parallel)`:"Nacharbeiten laufen…"}if(t.state==="queued"){const i=typeof t.position=="number"?t.position:0,n=typeof t.waiting=="number"?t.waiting:0,r=typeof t.running=="number"?t.running:0,a=Math.max(n+r,i),u=typeof e?.pos=="number"&&Number.isFinite(e.pos)&&e.pos>0?e.pos:i,c=typeof e?.total=="number"&&Number.isFinite(e.total)&&e.total>0?e.total:a;return u>0&&c>0?`Warte auf Nacharbeiten… ${u} / ${c}`:"Warte auf Nacharbeiten…"}return"Warte auf Nacharbeiten…"}function dH({job:s,postworkInfo:e}){const t=String(s?.phase??"").trim(),i=Number(s?.progress??0),n=t.toLowerCase(),r=n==="recording";let a=t?BR(t)||t:"";n==="postwork"&&(a=FR(s,e)),r&&(a="Recording läuft…");const u=a||String(s?.status??"").trim().toLowerCase(),c=!r&&Number.isFinite(i)&&i>0&&i<100,d=!r&&!c&&!!t&&(!Number.isFinite(i)||i<=0||i>=100);return m.jsx("div",{className:"min-w-0",children:c?m.jsx(qh,{label:u,value:Math.max(0,Math.min(100,i)),showPercent:!0,size:"sm",className:"w-full min-w-0 sm:min-w-[220px]"}):d?m.jsx(qh,{label:u,indeterminate:!0,size:"sm",className:"w-full min-w-0 sm:min-w-[220px]"}):m.jsx("div",{className:"truncate",children:m.jsx("span",{className:"font-medium",children:u})})})}function Yv({r:s,nowMs:e,blurPreviews:t,modelsByKey:i,stopRequestedIds:n,postworkInfoOf:r,markStopRequested:a,onOpenPlayer:u,onStopJob:c,onToggleFavorite:d,onToggleLike:f,onToggleWatch:g}){if(s.kind==="pending"){const q=s.pending,Z=Z0(q),te=OR(q),oe=(q.currentShow||"unknown").toLowerCase();return m.jsxs("div",{className:` + `,style:{bottom:`calc(${en}px + env(safe-area-inset-bottom))`},children:ln})]});return yi?Nc.createPortal(_n,Ft):_n}function NR({jobId:s,thumbTick:e,autoTickMs:t=1e4,blur:i=!1,className:n,alignStartAt:r,alignEndAt:a=null,alignEveryMs:u,fastRetryMs:c,fastRetryMax:d,fastRetryWindowMs:f,thumbsWebpUrl:g,thumbsCandidates:y}){const v=i?"blur-md":"",T=30,S=b.useRef(null),w=b.useRef(!0),[L,O]=b.useState(!1),I=b.useRef(!1),[j,P]=b.useState(0),[G,N]=b.useState(!1),[K,k]=b.useState(!1),R=b.useRef(null),Y=b.useRef(0),z=b.useRef(!1),X=b.useRef(!1),[re,J]=b.useState(!0),W=Re=>{if(typeof Re=="number"&&Number.isFinite(Re))return Re;if(Re instanceof Date)return Re.getTime();const Ve=Date.parse(String(Re??""));return Number.isFinite(Ve)?Ve:NaN},q=Re=>{const Ve=String(Re??"").trim();return Ve?/^https?:\/\//i.test(Ve)||Ve.startsWith("/")?Ve:`/${Ve}`:""},Z=b.useMemo(()=>{const Re=[g,...Array.isArray(y)?y:[]].map(q).filter(Boolean);return Array.from(new Set(Re)).join("|")},[g,y]);b.useEffect(()=>{const Re=()=>{const Ee=!document.hidden;w.current=Ee,J(Ee)},Ve=!document.hidden;return w.current=Ve,J(Ve),document.addEventListener("visibilitychange",Re),()=>document.removeEventListener("visibilitychange",Re)},[]),b.useEffect(()=>()=>{R.current&&window.clearTimeout(R.current)},[]),b.useEffect(()=>{const Re=S.current;if(!Re)return;const Ve=new IntersectionObserver(Ee=>{const _e=Ee[0],yt=!!(_e&&(_e.isIntersecting||_e.intersectionRatio>0));yt!==I.current&&(I.current=yt,O(yt))},{root:null,threshold:0,rootMargin:"300px 0px"});return Ve.observe(Re),()=>Ve.disconnect()},[]),b.useEffect(()=>{typeof e!="number"&&L&&w.current&&(X.current||(X.current=!0,P(Re=>Re+1)))},[L,e]),b.useEffect(()=>{if(typeof e=="number"||!L||!w.current)return;const Re=Number(u??t??1e4);if(!Number.isFinite(Re)||Re<=0)return;const Ve=r?W(r):NaN,Ee=a?W(a):NaN;if(Number.isFinite(Ve)){let yt;const ut=()=>{if(!w.current)return;const pt=Date.now();if(Number.isFinite(Ee)&&pt>=Ee)return;const _t=Math.max(0,pt-Ve)%Re,Qe=_t===0?Re:Re-_t;yt=window.setTimeout(()=>{I.current&&w.current&&(P(Xe=>Xe+1),ut())},Qe)};return ut(),()=>{yt&&window.clearTimeout(yt)}}const _e=window.setInterval(()=>{I.current&&w.current&&P(yt=>yt+1)},Re);return()=>window.clearInterval(_e)},[e,t,L,re,r,a,u]);const te=typeof e=="number"?e:j,oe=b.useRef(0),[F,le]=b.useState(0);b.useEffect(()=>{L&&w.current&&(oe.current=te,le(te))},[te,L]),b.useEffect(()=>{N(!1),k(!1)},[F]),b.useEffect(()=>{z.current=!1,Y.current=0,X.current=!1,N(!1),k(!1),I.current&&w.current&&P(Re=>Re+1)},[s,Z]);const ge=b.useMemo(()=>`/api/preview?id=${encodeURIComponent(s)}&v=${F}`,[s,F]),Ie=b.useMemo(()=>`/api/preview?id=${encodeURIComponent(s)}&hover=1&file=index_hq.m3u8`,[s]),Pe=b.useMemo(()=>Z?Z.split("|"):[],[Z])[0]||"",Je=!!Pe&&!G,Se=b.useMemo(()=>{if(Je){const Re=Pe.includes("?")?"&":"?";return`${Pe}${Re}v=${encodeURIComponent(String(F))}`}return ge},[Je,Pe,F,ge]);return m.jsx(ck,{content:(Re,{close:Ve})=>Re&&m.jsx("div",{className:"w-[420px] max-w-[calc(100vw-1.5rem)]",children:m.jsx("div",{className:"relative rounded-lg overflow-hidden bg-black",style:{paddingBottom:`calc(56.25% + ${T}px)`},children:m.jsxs("div",{className:"absolute inset-0",children:[m.jsx(IR,{src:Ie,muted:!1,className:"w-full h-full object-contain object-bottom relative z-0"}),m.jsxs("div",{className:"absolute left-2 top-2 inline-flex items-center gap-1.5 rounded-full bg-red-600/90 px-2 py-1 text-[11px] font-semibold text-white shadow-sm",children:[m.jsx("span",{className:"inline-block size-1.5 rounded-full bg-white animate-pulse"}),"Live"]}),m.jsx("button",{type:"button",className:"absolute right-2 top-2 z-20 inline-flex items-center justify-center rounded-md p-1.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white/70 bg-white/75 text-gray-900 ring-1 ring-black/10 hover:bg-white/90 dark:bg-black/40 dark:text-white dark:ring-white/10 dark:hover:bg-black/55","aria-label":"Live-Vorschau schließen",title:"Vorschau schließen",onClick:Ee=>{Ee.preventDefault(),Ee.stopPropagation(),Ve()},children:m.jsx(v0,{className:"h-4 w-4"})})]})})}),children:m.jsx("div",{ref:S,className:["block relative rounded bg-gray-100 dark:bg-white/5 overflow-hidden",n||"w-full h-full"].join(" "),children:K?m.jsx("div",{className:"absolute inset-0 grid place-items-center px-1 text-center text-[10px] text-gray-500 dark:text-gray-400",children:"keine Vorschau"}):m.jsx("img",{src:Se,loading:L?"eager":"lazy",fetchPriority:L?"high":"auto",decoding:"async",alt:"",className:["block w-full h-full object-cover object-center",v].filter(Boolean).join(" "),onLoad:()=>{z.current=!0,Y.current=0,R.current&&window.clearTimeout(R.current),Je?N(!1):k(!1)},onError:()=>{if(Je){N(!0);return}if(k(!0),!c||!I.current||!w.current||z.current)return;const Re=r?W(r):NaN,Ve=Number(f??6e4);if(!(!Number.isFinite(Re)||Date.now()-Re=_e||(R.current&&window.clearTimeout(R.current),R.current=window.setTimeout(()=>{Y.current+=1,k(!1),P(yt=>yt+1)},c))}})})})}function qh({label:s,value:e=0,indeterminate:t=!1,showPercent:i=!1,rightLabel:n,steps:r,currentStep:a,size:u="md",className:c}){const d=Math.max(0,Math.min(100,Number(e)||0)),f=u==="sm"?"h-1.5":"h-2",g=Array.isArray(r)&&r.length>0,y=g?r.length:0,v=w=>w===0?"text-left":w===y-1?"text-right":"text-center",T=w=>typeof a!="number"||!Number.isFinite(a)?!1:w<=a,S=i&&!t;return m.jsxs("div",{className:c,children:[s||S?m.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s?m.jsx("p",{className:"flex-1 min-w-0 truncate text-xs font-medium text-gray-900 dark:text-white",children:s}):m.jsx("span",{className:"flex-1"}),S?m.jsxs("span",{className:"shrink-0 text-xs font-medium text-gray-700 dark:text-gray-300",children:[Math.round(d),"%"]}):null]}):null,m.jsxs("div",{"aria-hidden":"true",className:s||S?"mt-2":"",children:[m.jsx("div",{className:"overflow-hidden rounded-full bg-gray-200 dark:bg-white/10",children:t?m.jsx("div",{className:`${f} w-full rounded-full bg-indigo-600/70 dark:bg-indigo-500/70 animate-pulse`}):m.jsx("div",{className:`${f} rounded-full bg-indigo-600 dark:bg-indigo-500 transition-[width] duration-200`,style:{width:`${d}%`}})}),n?m.jsx("div",{className:"mt-2 text-xs text-gray-600 dark:text-gray-400",children:n}):null,g?m.jsx("div",{className:"mt-3 hidden text-sm font-medium text-gray-600 sm:grid dark:text-gray-400",style:{gridTemplateColumns:`repeat(${y}, minmax(0, 1fr))`},children:r.map((w,L)=>m.jsx("div",{className:[v(L),T(L)?"text-indigo-600 dark:text-indigo-400":""].join(" "),children:w},`${L}-${w}`))}):null]})]})}function oH(s){const[e,t]=b.useState(s),i=b.useRef(s.length);return b.useEffect(()=>{const n=up("/api/record/stream","jobs",r=>{Array.isArray(r)&&(r.length,i.current,i.current=r.length,t(r))});return()=>n()},[]),e}function lH(s,e=!1){const[t,i]=b.useState(e);return b.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const n=window.matchMedia(s),r=()=>{i(n.matches)};return r(),typeof n.addEventListener=="function"?(n.addEventListener("change",r),()=>n.removeEventListener("change",r)):(n.addListener(r),()=>n.removeListener(r))},[s]),t}const Z0=s=>{const e=s;return e.modelName??e.model??e.modelKey??e.username??e.name??"—"},OR=s=>{const e=s;return e.sourceUrl??e.url??e.roomUrl??""},MR=s=>{const e=s;return String(e.imageUrl??e.image_url??"").trim()},cc=s=>{const e=s;return String(e.key??e.id??Z0(s))},Xs=s=>{if(typeof s=="number"&&Number.isFinite(s))return s<1e12?s*1e3:s;if(typeof s=="string"){const e=Date.parse(s);return Number.isFinite(e)?e:0}return s instanceof Date?s.getTime():0},uH=s=>{const e=String(s??"").trim();return e?/^https?:\/\//i.test(e)||e.startsWith("/")?e:`/${e}`:""},PR=s=>{const e=s,t=[e.thumbsWebpUrl,e.thumbsUrl,e.previewThumbsUrl,e.thumbnailSheetUrl],i=[e.previewBaseUrl?`${String(e.previewBaseUrl).replace(/\/+$/,"")}/preview.webp`:"",e.assetBaseUrl?`${String(e.assetBaseUrl).replace(/\/+$/,"")}/preview.webp`:"",e.thumbsBaseUrl?`${String(e.thumbsBaseUrl).replace(/\/+$/,"")}/preview.webp`:""];return[...t,...i].map(n=>uH(String(n??""))).filter(Boolean)},dc=s=>{if(s.kind==="job"){const t=s.job;return Xs(t.addedAt)||Xs(t.createdAt)||Xs(t.enqueuedAt)||Xs(t.queuedAt)||Xs(t.requestedAt)||Xs(t.startedAt)||0}const e=s.pending;return Xs(e.addedAt)||Xs(e.createdAt)||Xs(e.enqueuedAt)||Xs(e.queuedAt)||Xs(e.requestedAt)||0},BR=s=>{switch((s??"").toLowerCase()){case"stopping":return"Stop wird angefordert…";case"probe":return"Analysiere Datei (Dauer/Streams)…";case"remuxing":return"Konvertiere Container zu MP4…";case"moving":return"Verschiebe nach Done…";case"assets":return"Erstelle Vorschau/Thumbnails…";case"postwork":return"Nacharbeiten laufen…";default:return""}};async function cH(s,e){const t=await fetch(s,e);if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(i||`HTTP ${t.status}`)}return t.json()}function FR(s,e){const t=s.postWork;if(!t)return"Warte auf Nacharbeiten…";if(t.state==="running"){const i=typeof t.running=="number"?t.running:0,n=typeof t.maxParallel=="number"?t.maxParallel:0;return n>0?`Nacharbeiten laufen… (${i}/${n} parallel)`:"Nacharbeiten laufen…"}if(t.state==="queued"){const i=typeof t.position=="number"?t.position:0,n=typeof t.waiting=="number"?t.waiting:0,r=typeof t.running=="number"?t.running:0,a=Math.max(n+r,i),u=typeof e?.pos=="number"&&Number.isFinite(e.pos)&&e.pos>0?e.pos:i,c=typeof e?.total=="number"&&Number.isFinite(e.total)&&e.total>0?e.total:a;return u>0&&c>0?`Warte auf Nacharbeiten… ${u} / ${c}`:"Warte auf Nacharbeiten…"}return"Warte auf Nacharbeiten…"}function dH({job:s,postworkInfo:e}){const t=String(s?.phase??"").trim(),i=Number(s?.progress??0),n=t.toLowerCase(),r=n==="recording";let a=t?BR(t)||t:"";n==="postwork"&&(a=FR(s,e)),r&&(a="Recording läuft…");const u=a||String(s?.status??"").trim().toLowerCase(),c=!r&&Number.isFinite(i)&&i>0&&i<100,d=!r&&!c&&!!t&&(!Number.isFinite(i)||i<=0||i>=100);return m.jsx("div",{className:"min-w-0",children:c?m.jsx(qh,{label:u,value:Math.max(0,Math.min(100,i)),showPercent:!0,size:"sm",className:"w-full min-w-0 sm:min-w-[220px]"}):d?m.jsx(qh,{label:u,indeterminate:!0,size:"sm",className:"w-full min-w-0 sm:min-w-[220px]"}):m.jsx("div",{className:"truncate",children:m.jsx("span",{className:"font-medium",children:u})})})}function Yv({r:s,nowMs:e,blurPreviews:t,modelsByKey:i,stopRequestedIds:n,postworkInfoOf:r,markStopRequested:a,onOpenPlayer:u,onStopJob:c,onToggleFavorite:d,onToggleLike:f,onToggleWatch:g}){if(s.kind==="pending"){const q=s.pending,Z=Z0(q),te=OR(q),oe=(q.currentShow||"unknown").toLowerCase();return m.jsxs("div",{className:` relative overflow-hidden rounded-2xl border border-white/40 bg-white/35 shadow-sm backdrop-blur-xl supports-[backdrop-filter]:bg-white/25 ring-1 ring-black/5 @@ -459,7 +459,7 @@ Schedule: ${c.map(S=>ha(S))} pos: ${this.timelinePos}`),f.length&&this.log(`Remo dark:border-white/10 dark:bg-white/5\r grid grid-cols-2 gap-x-3 gap-y-2\r sm:flex sm:items-center sm:gap-3\r - `,children:[m.jsxs("div",{className:"flex items-center gap-2",title:Y,children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"Disk"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(R)}`,style:{width:`${Math.round(k*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-11 tabular-nums text-gray-900 dark:text-gray-100",children:Jv(c)})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"Ping"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(L)}`,style:{width:`${Math.round(j*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-10 tabular-nums text-gray-900 dark:text-gray-100",children:IH(n)})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"FPS"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(O)}`,style:{width:`${Math.round(P*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-8 tabular-nums text-gray-900 dark:text-gray-100",children:i??"–"})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"CPU"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(I)}`,style:{width:`${Math.round(G*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-10 tabular-nums text-gray-900 dark:text-gray-100",children:AA(a)})]})]})})}function OH(s,e){const t=[];for(let i=0;i{t!=null&&(window.clearTimeout(t),t=null)},c=()=>{if(i){try{i.abort()}catch{}i=null}},d=g=>{a||(u(),t=window.setTimeout(()=>{f()},g))},f=async()=>{if(!a)try{const g=(s.getModels?.()??[]).map(Y=>String(Y||"").trim()).filter(Boolean),v=(s.getShow?.()??[]).map(Y=>String(Y||"").trim()).filter(Boolean).slice().sort(),T=g.slice().sort(),S=T.length===0&&!!s.fetchAllWhenNoModels;if(T.length===0&&!S){c();const Y={enabled:r?.enabled??!1,rooms:[]};r=Y,s.onData(Y);const z=document.hidden?Math.max(15e3,e):e;d(z);return}const w=S?[]:T,L=`${v.join(",")}|${S?"__ALL__":w.join(",")}`,O=L;n=L,c();const I=new AbortController;i=I;const P=S?[[]]:OH(w,350);let G=[],N=!1,K=0,k=!1;for(const Y of P){if(I.signal.aborted||O!==n||a)return;const z=await fetch("/api/chaturbate/online",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({q:Y,show:v,refresh:!1}),signal:I.signal,cache:"no-store"});if(!z.ok)continue;k=!0;const X=await z.json();N=N||!!X?.enabled,G.push(...Array.isArray(X?.rooms)?X.rooms:[]);const re=Number(X?.total??0);Number.isFinite(re)&&re>K&&(K=re)}if(!k){const Y=document.hidden?Math.max(15e3,e):e;d(Y);return}const R={enabled:N,rooms:MH(G),total:K};if(I.signal.aborted||O!==n||a)return;r=R,s.onData(R)}catch(g){if(g?.name==="AbortError")return;s.onError?.(g)}finally{const g=document.hidden?Math.max(15e3,e):e;d(g)}};return f(),()=>{a=!0,u(),c()}}async function ex(s,e){const t=await fetch(s,e);if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(i||`HTTP ${t.status}`)}return t.json()}function PH(s,e,t,i){const n=`/api/generated/cover?category=${encodeURIComponent(s)}`,r=e?`&v=${e}`:"",a="",u=i&&i.trim()?`&model=${encodeURIComponent(i.trim())}`:"";return`${n}${r}${a}${u}`}function DA(s){if(!s)return[];const e=s.split(/[\n,;|]+/g).map(t=>t.trim()).filter(Boolean);return Array.from(new Set(e))}function VR(s){return String(s||"").replaceAll("\\","/").split("/").pop()||""}function GR(s){return s.toUpperCase().startsWith("HOT ")?s.slice(4).trim():s}function BH(s){const e=GR(VR(s||""));return e?e.replace(/\.[^.]+$/,""):""}const FH=/^(.*?)_\d{1,2}_\d{1,2}_\d{4}__\d{1,2}-\d{2}-\d{2}/;function tx(s){const t=GR(VR(s)).replace(/\.[^.]+$/,""),i=t.match(FH);if(i?.[1]?.trim())return i[1].trim();const n=t.lastIndexOf("_");return n>0?t.slice(0,n).trim():t?t.trim():null}function UH(s){const e=BH(s);return e?`/generated/meta/${encodeURIComponent(e)}/thumbs.webp`:null}async function jH(s,e,t,i){const n=(t||"").trim(),r=`/api/generated/cover?category=${encodeURIComponent(s)}&src=${encodeURIComponent(e)}`+(n?`&model=${encodeURIComponent(n)}`:"")+"&refresh=1",a=await fetch(r,{method:"GET",cache:"no-store"});if(!a.ok){const u=await a.text().catch(()=>"");throw new Error(u||`ensureCover failed: HTTP ${a.status}`)}}function $H(){const[s,e]=b.useState([]),[t,i]=b.useState(!1),[n,r]=b.useState(null),[a,u]=b.useState(()=>Date.now()),[c,d]=b.useState({}),[f,g]=b.useState({}),[y,v]=b.useState(!1),[T,S]=b.useState(null),[w,L]=b.useState({}),O=b.useRef(null),I=b.useRef({}),j=b.useCallback((k,R)=>{const Y={};for(const X of Array.isArray(k)?k:[]){const re=String(X?.modelKey??"").trim().toLowerCase();if(!re)continue;const J=DA(X?.tags).map(W=>W.toLowerCase());J.length&&(Y[re]=J)}const z={};for(const X of Array.isArray(R)?R:[]){const re=String(X?.output??"");if(!re)continue;const J=(tx(re)||"").trim().toLowerCase();if(!J)continue;const W=Y[J];if(!(!W||W.length===0))for(const q of W)q&&(z[q]||(z[q]=[]),z[q].push(re))}for(const[X,re]of Object.entries(z))z[X]=Array.from(new Set(re));I.current=z},[]),P=b.useCallback(k=>{const R=String(k||"").trim();if(R){try{localStorage.setItem("finishedDownloads_pendingTags",JSON.stringify([R]))}catch{}window.dispatchEvent(new CustomEvent("app:navigate-tab",{detail:{tab:"finished"}})),window.dispatchEvent(new CustomEvent("finished-downloads:tag-filter",{detail:{tags:[R],mode:"replace"}}))}},[]),G=b.useCallback(k=>{const R=String(k||"").trim();if(R){try{localStorage.setItem("models_pendingTags",JSON.stringify([R]))}catch{}window.dispatchEvent(new CustomEvent("app:navigate-tab",{detail:{tab:"models"}})),window.dispatchEvent(new CustomEvent("models:set-tag-filter",{detail:{tags:[R]}}))}},[]),N=b.useCallback(async()=>{O.current?.abort();const k=new AbortController;O.current=k,i(!0),r(null);try{const[R,Y]=await Promise.all([ex("/api/models",{cache:"no-store",signal:k.signal}),ex("/api/record/done?page=1&pageSize=2000&sort=completed_desc",{cache:"no-store",signal:k.signal})]),z=Array.isArray(Y?.items)?Y.items:Array.isArray(Y)?Y:[];j(Array.isArray(R)?R:[],z);const X=new Map;for(const te of Array.isArray(R)?R:[])for(const oe of DA(te?.tags)){const F=oe.toLowerCase();X.set(F,(X.get(F)??0)+1)}const re=I.current||{},J=Array.from(X.entries()).map(([te,oe])=>({tag:te,modelsCount:oe,downloadsCount:(re[te]||[]).length})).sort((te,oe)=>te.tag.localeCompare(oe.tag,void 0,{sensitivity:"base"})),W=new Map;try{const te=await ex("/api/generated/coverinfo/list",{cache:"no-store",signal:k.signal});for(const oe of Array.isArray(te)?te:[]){const F=String(oe?.category??"").trim().toLowerCase();F&&W.set(F,oe)}}catch{}const q={};for(const te of J){const oe=W.get(te.tag);q[te.tag]=!!oe?.hasCover}g(q);const Z={};for(const te of J){const F=(re[te.tag]||[])[0]||"";let le=F?tx(F):null;if(!le){const ge=W.get(te.tag);ge?.hasCover&&ge.model?.trim()&&(le=ge.model.trim())}le&&(Z[te.tag]=le)}L(Z),d(te=>{const oe={};for(const F of J){const le=te[F.tag];le&&q[F.tag]===!0&&(oe[F.tag]=le)}return oe}),e(J)}catch(R){if(R?.name==="AbortError")return;r(R?.message??String(R)),e([]),I.current={},L({}),g({}),d({})}finally{O.current===k&&(O.current=null,i(!1))}},[j]);b.useEffect(()=>(N(),()=>{O.current?.abort()}),[N]);const K=b.useCallback(async()=>{if(!y){v(!0),r(null),S({done:0,total:s.length});try{const k=I.current||{},R=await Promise.all(s.map(async z=>{try{const X=k[z.tag]||[];if(X.length===0)return{tag:z.tag,ok:!0,status:0,text:"skipped (no candidates)"};const re=X[Math.floor(Math.random()*X.length)],J=UH(re);if(!J)return{tag:z.tag,ok:!0,status:0,text:"skipped (no thumb url)"};const W=tx(re);return await jH(z.tag,J,W,!0),g(q=>({...q,[z.tag]:!0})),L(q=>{const Z={...q};return W?.trim()?Z[z.tag]=W.trim():delete Z[z.tag],Z}),d(q=>{const Z={...q};return delete Z[z.tag],Z}),{tag:z.tag,ok:!0,status:200,text:""}}catch(X){return{tag:z.tag,ok:!1,status:0,text:X?.message??String(X)}}finally{S(X=>X&&{...X,done:Math.min(X.total,X.done+1)})}})),Y=R.filter(z=>!z.ok);if(Y.length){console.warn("Cover renew failed:",Y.slice(0,20));const z=Y.slice(0,8).map(X=>`${X.tag} (ERR)`).join(", ");r(`Covers fehlgeschlagen: ${Y.length}/${R.length} — z.B.: ${z}`)}else r(null)}finally{u(Date.now()),v(!1),setTimeout(()=>S(null),400)}}},[s,y]);return m.jsxs(pa,{header:m.jsxs("div",{className:"flex items-center justify-between gap-2",children:[m.jsxs("div",{className:"text-sm font-medium text-gray-900 dark:text-white",children:["Kategorien ",m.jsxs("span",{className:"text-gray-500 dark:text-gray-400",children:["(",s.length,")"]})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[T?m.jsxs("div",{className:"hidden sm:flex items-center gap-2 mr-2",children:[m.jsxs("div",{className:"text-xs text-gray-600 dark:text-gray-300 tabular-nums",children:["Covers: ",T.done,"/",T.total]}),m.jsx("div",{className:"h-2 w-28 rounded-full bg-gray-200 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:"h-full bg-indigo-500",style:{width:T.total>0?`${Math.round(T.done/T.total*100)}%`:"0%"}})})]}):null,m.jsx(ri,{variant:"secondary",size:"md",onClick:K,disabled:t||y,children:"Cover erneuern"}),m.jsx(ri,{variant:"secondary",size:"md",onClick:N,disabled:t||y,children:"Aktualisieren"})]})]}),grayBody:!0,children:[n?m.jsx("div",{className:"text-xs text-red-600 dark:text-red-300",children:n}):null,s.length===0&&!t?m.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-300",children:"Keine Kategorien/Tags gefunden."}):null,m.jsx("div",{className:"mt-3 grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:s.map(k=>{const R=w[k.tag]??null,Y=f[k.tag]===!0,z=Object.prototype.hasOwnProperty.call(f,k.tag),X=Y?PH(k.tag,a,!1,R):"",re=c[k.tag]==="ok",J=c[k.tag]==="error";return m.jsxs("button",{type:"button",onClick:()=>P(k.tag),className:ni("group text-left rounded-2xl overflow-hidden transition","bg-white/70 dark:bg-white/[0.06]","border border-gray-200/70 dark:border-white/10","shadow-sm hover:shadow-md","hover:-translate-y-[1px]","hover:bg-white dark:hover:bg-white/[0.09]","focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-gray-950"),title:"In FinishedDownloads öffnen (Tag-Filter setzen)",children:[m.jsx("div",{className:"relative w-full overflow-hidden aspect-[16/9] bg-gray-100/70 dark:bg-white/5",children:z?Y?J?m.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-2",children:[m.jsx("div",{className:"absolute inset-0 opacity-70",style:{background:"radial-gradient(circle at 30% 20%, rgba(99,102,241,0.25), transparent 55%),radial-gradient(circle at 70% 80%, rgba(14,165,233,0.18), transparent 55%)"}}),m.jsxs("div",{className:"relative z-10 rounded-xl bg-white/80 dark:bg-black/30 px-3 py-2.5 shadow-sm ring-1 ring-black/5 dark:ring-white/10 backdrop-blur-md",children:[m.jsx("div",{className:"text-xs font-semibold text-gray-900 dark:text-white",children:"Cover konnte nicht geladen werden"}),m.jsx("div",{className:"mt-1 flex justify-center",children:m.jsx("span",{className:`text-[11px] inline-flex items-center rounded-full bg-indigo-50 px-2 py-1 font-semibold text-indigo-700 ring-1 ring-indigo-100 hover:bg-indigo-100\r + `,children:[m.jsxs("div",{className:"flex items-center gap-2",title:Y,children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"Disk"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(R)}`,style:{width:`${Math.round(k*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-11 tabular-nums text-gray-900 dark:text-gray-100",children:Jv(c)})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"Ping"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(L)}`,style:{width:`${Math.round(j*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-10 tabular-nums text-gray-900 dark:text-gray-100",children:IH(n)})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"FPS"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(O)}`,style:{width:`${Math.round(P*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-8 tabular-nums text-gray-900 dark:text-gray-100",children:i??"–"})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[m.jsx("span",{className:"text-[11px] font-medium text-gray-600 dark:text-gray-300",children:"CPU"}),m.jsx("div",{className:"hidden sm:block h-2 w-14 sm:w-16 rounded-full bg-gray-200/70 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:`h-full ${Qm(I)}`,style:{width:`${Math.round(G*100)}%`}})}),m.jsx("span",{className:"text-[11px] w-10 tabular-nums text-gray-900 dark:text-gray-100",children:AA(a)})]})]})})}function OH(s,e){const t=[];for(let i=0;i{t!=null&&(window.clearTimeout(t),t=null)},c=()=>{if(i){try{i.abort()}catch{}i=null}},d=g=>{a||(u(),t=window.setTimeout(()=>{f()},g))},f=async()=>{if(!a)try{const g=(s.getModels?.()??[]).map(Y=>String(Y||"").trim()).filter(Boolean),v=(s.getShow?.()??[]).map(Y=>String(Y||"").trim()).filter(Boolean).slice().sort(),T=g.slice().sort(),S=T.length===0&&!!s.fetchAllWhenNoModels;if(T.length===0&&!S){c();const Y={enabled:r?.enabled??!1,rooms:[]};r=Y,s.onData(Y);const z=document.hidden?Math.max(15e3,e):e;d(z);return}const w=S?[]:T,L=`${v.join(",")}|${S?"__ALL__":w.join(",")}`,O=L;n=L,c();const I=new AbortController;i=I;const P=S?[[]]:OH(w,350);let G=[],N=!1,K=0,k=!1;for(const Y of P){if(I.signal.aborted||O!==n||a)return;const z=await fetch("/api/chaturbate/online",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({q:Y,show:v,refresh:!1}),signal:I.signal,cache:"no-store"});if(!z.ok)continue;k=!0;const X=await z.json();N=N||!!X?.enabled,G.push(...Array.isArray(X?.rooms)?X.rooms:[]);const re=Number(X?.total??0);Number.isFinite(re)&&re>K&&(K=re)}if(!k){const Y=document.hidden?Math.max(15e3,e):e;d(Y);return}const R={enabled:N,rooms:MH(G),total:K};if(I.signal.aborted||O!==n||a)return;r=R,s.onData(R)}catch(g){if(g?.name==="AbortError")return;s.onError?.(g)}finally{const g=document.hidden?Math.max(15e3,e):e;d(g)}};return f(),()=>{a=!0,u(),c()}}async function ex(s,e){const t=await fetch(s,e);if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(i||`HTTP ${t.status}`)}return t.json()}function PH(s,e,t,i){const n=`/api/generated/cover?category=${encodeURIComponent(s)}`,r=e?`&v=${e}`:"",a="",u=i&&i.trim()?`&model=${encodeURIComponent(i.trim())}`:"";return`${n}${r}${a}${u}`}function DA(s){if(!s)return[];const e=s.split(/[\n,;|]+/g).map(t=>t.trim()).filter(Boolean);return Array.from(new Set(e))}function VR(s){return String(s||"").replaceAll("\\","/").split("/").pop()||""}function GR(s){return s.toUpperCase().startsWith("HOT ")?s.slice(4).trim():s}function BH(s){const e=GR(VR(s||""));return e?e.replace(/\.[^.]+$/,""):""}const FH=/^(.*?)_\d{1,2}_\d{1,2}_\d{4}__\d{1,2}-\d{2}-\d{2}/;function tx(s){const t=GR(VR(s)).replace(/\.[^.]+$/,""),i=t.match(FH);if(i?.[1]?.trim())return i[1].trim();const n=t.lastIndexOf("_");return n>0?t.slice(0,n).trim():t?t.trim():null}function UH(s){const e=BH(s);return e?`/generated/meta/${encodeURIComponent(e)}/preview.webp`:null}async function jH(s,e,t,i){const n=(t||"").trim(),r=`/api/generated/cover?category=${encodeURIComponent(s)}&src=${encodeURIComponent(e)}`+(n?`&model=${encodeURIComponent(n)}`:"")+"&refresh=1",a=await fetch(r,{method:"GET",cache:"no-store"});if(!a.ok){const u=await a.text().catch(()=>"");throw new Error(u||`ensureCover failed: HTTP ${a.status}`)}}function $H(){const[s,e]=b.useState([]),[t,i]=b.useState(!1),[n,r]=b.useState(null),[a,u]=b.useState(()=>Date.now()),[c,d]=b.useState({}),[f,g]=b.useState({}),[y,v]=b.useState(!1),[T,S]=b.useState(null),[w,L]=b.useState({}),O=b.useRef(null),I=b.useRef({}),j=b.useCallback((k,R)=>{const Y={};for(const X of Array.isArray(k)?k:[]){const re=String(X?.modelKey??"").trim().toLowerCase();if(!re)continue;const J=DA(X?.tags).map(W=>W.toLowerCase());J.length&&(Y[re]=J)}const z={};for(const X of Array.isArray(R)?R:[]){const re=String(X?.output??"");if(!re)continue;const J=(tx(re)||"").trim().toLowerCase();if(!J)continue;const W=Y[J];if(!(!W||W.length===0))for(const q of W)q&&(z[q]||(z[q]=[]),z[q].push(re))}for(const[X,re]of Object.entries(z))z[X]=Array.from(new Set(re));I.current=z},[]),P=b.useCallback(k=>{const R=String(k||"").trim();if(R){try{localStorage.setItem("finishedDownloads_pendingTags",JSON.stringify([R]))}catch{}window.dispatchEvent(new CustomEvent("app:navigate-tab",{detail:{tab:"finished"}})),window.dispatchEvent(new CustomEvent("finished-downloads:tag-filter",{detail:{tags:[R],mode:"replace"}}))}},[]),G=b.useCallback(k=>{const R=String(k||"").trim();if(R){try{localStorage.setItem("models_pendingTags",JSON.stringify([R]))}catch{}window.dispatchEvent(new CustomEvent("app:navigate-tab",{detail:{tab:"models"}})),window.dispatchEvent(new CustomEvent("models:set-tag-filter",{detail:{tags:[R]}}))}},[]),N=b.useCallback(async()=>{O.current?.abort();const k=new AbortController;O.current=k,i(!0),r(null);try{const[R,Y]=await Promise.all([ex("/api/models",{cache:"no-store",signal:k.signal}),ex("/api/record/done?page=1&pageSize=2000&sort=completed_desc",{cache:"no-store",signal:k.signal})]),z=Array.isArray(Y?.items)?Y.items:Array.isArray(Y)?Y:[];j(Array.isArray(R)?R:[],z);const X=new Map;for(const te of Array.isArray(R)?R:[])for(const oe of DA(te?.tags)){const F=oe.toLowerCase();X.set(F,(X.get(F)??0)+1)}const re=I.current||{},J=Array.from(X.entries()).map(([te,oe])=>({tag:te,modelsCount:oe,downloadsCount:(re[te]||[]).length})).sort((te,oe)=>te.tag.localeCompare(oe.tag,void 0,{sensitivity:"base"})),W=new Map;try{const te=await ex("/api/generated/coverinfo/list",{cache:"no-store",signal:k.signal});for(const oe of Array.isArray(te)?te:[]){const F=String(oe?.category??"").trim().toLowerCase();F&&W.set(F,oe)}}catch{}const q={};for(const te of J){const oe=W.get(te.tag);q[te.tag]=!!oe?.hasCover}g(q);const Z={};for(const te of J){const F=(re[te.tag]||[])[0]||"";let le=F?tx(F):null;if(!le){const ge=W.get(te.tag);ge?.hasCover&&ge.model?.trim()&&(le=ge.model.trim())}le&&(Z[te.tag]=le)}L(Z),d(te=>{const oe={};for(const F of J){const le=te[F.tag];le&&q[F.tag]===!0&&(oe[F.tag]=le)}return oe}),e(J)}catch(R){if(R?.name==="AbortError")return;r(R?.message??String(R)),e([]),I.current={},L({}),g({}),d({})}finally{O.current===k&&(O.current=null,i(!1))}},[j]);b.useEffect(()=>(N(),()=>{O.current?.abort()}),[N]);const K=b.useCallback(async()=>{if(!y){v(!0),r(null),S({done:0,total:s.length});try{const k=I.current||{},R=await Promise.all(s.map(async z=>{try{const X=k[z.tag]||[];if(X.length===0)return{tag:z.tag,ok:!0,status:0,text:"skipped (no candidates)"};const re=X[Math.floor(Math.random()*X.length)],J=UH(re);if(!J)return{tag:z.tag,ok:!0,status:0,text:"skipped (no thumb url)"};const W=tx(re);return await jH(z.tag,J,W,!0),g(q=>({...q,[z.tag]:!0})),L(q=>{const Z={...q};return W?.trim()?Z[z.tag]=W.trim():delete Z[z.tag],Z}),d(q=>{const Z={...q};return delete Z[z.tag],Z}),{tag:z.tag,ok:!0,status:200,text:""}}catch(X){return{tag:z.tag,ok:!1,status:0,text:X?.message??String(X)}}finally{S(X=>X&&{...X,done:Math.min(X.total,X.done+1)})}})),Y=R.filter(z=>!z.ok);if(Y.length){console.warn("Cover renew failed:",Y.slice(0,20));const z=Y.slice(0,8).map(X=>`${X.tag} (ERR)`).join(", ");r(`Covers fehlgeschlagen: ${Y.length}/${R.length} — z.B.: ${z}`)}else r(null)}finally{u(Date.now()),v(!1),setTimeout(()=>S(null),400)}}},[s,y]);return m.jsxs(pa,{header:m.jsxs("div",{className:"flex items-center justify-between gap-2",children:[m.jsxs("div",{className:"text-sm font-medium text-gray-900 dark:text-white",children:["Kategorien ",m.jsxs("span",{className:"text-gray-500 dark:text-gray-400",children:["(",s.length,")"]})]}),m.jsxs("div",{className:"flex items-center gap-2",children:[T?m.jsxs("div",{className:"hidden sm:flex items-center gap-2 mr-2",children:[m.jsxs("div",{className:"text-xs text-gray-600 dark:text-gray-300 tabular-nums",children:["Covers: ",T.done,"/",T.total]}),m.jsx("div",{className:"h-2 w-28 rounded-full bg-gray-200 dark:bg-white/10 overflow-hidden",children:m.jsx("div",{className:"h-full bg-indigo-500",style:{width:T.total>0?`${Math.round(T.done/T.total*100)}%`:"0%"}})})]}):null,m.jsx(ri,{variant:"secondary",size:"md",onClick:K,disabled:t||y,children:"Cover erneuern"}),m.jsx(ri,{variant:"secondary",size:"md",onClick:N,disabled:t||y,children:"Aktualisieren"})]})]}),grayBody:!0,children:[n?m.jsx("div",{className:"text-xs text-red-600 dark:text-red-300",children:n}):null,s.length===0&&!t?m.jsx("div",{className:"text-sm text-gray-600 dark:text-gray-300",children:"Keine Kategorien/Tags gefunden."}):null,m.jsx("div",{className:"mt-3 grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:s.map(k=>{const R=w[k.tag]??null,Y=f[k.tag]===!0,z=Object.prototype.hasOwnProperty.call(f,k.tag),X=Y?PH(k.tag,a,!1,R):"",re=c[k.tag]==="ok",J=c[k.tag]==="error";return m.jsxs("button",{type:"button",onClick:()=>P(k.tag),className:ni("group text-left rounded-2xl overflow-hidden transition","bg-white/70 dark:bg-white/[0.06]","border border-gray-200/70 dark:border-white/10","shadow-sm hover:shadow-md","hover:-translate-y-[1px]","hover:bg-white dark:hover:bg-white/[0.09]","focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-gray-950"),title:"In FinishedDownloads öffnen (Tag-Filter setzen)",children:[m.jsx("div",{className:"relative w-full overflow-hidden aspect-[16/9] bg-gray-100/70 dark:bg-white/5",children:z?Y?J?m.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-2",children:[m.jsx("div",{className:"absolute inset-0 opacity-70",style:{background:"radial-gradient(circle at 30% 20%, rgba(99,102,241,0.25), transparent 55%),radial-gradient(circle at 70% 80%, rgba(14,165,233,0.18), transparent 55%)"}}),m.jsxs("div",{className:"relative z-10 rounded-xl bg-white/80 dark:bg-black/30 px-3 py-2.5 shadow-sm ring-1 ring-black/5 dark:ring-white/10 backdrop-blur-md",children:[m.jsx("div",{className:"text-xs font-semibold text-gray-900 dark:text-white",children:"Cover konnte nicht geladen werden"}),m.jsx("div",{className:"mt-1 flex justify-center",children:m.jsx("span",{className:`text-[11px] inline-flex items-center rounded-full bg-indigo-50 px-2 py-1 font-semibold text-indigo-700 ring-1 ring-indigo-100 hover:bg-indigo-100\r dark:bg-indigo-500/10 dark:text-indigo-200 dark:ring-indigo-500/20 dark:hover:bg-indigo-500/20`,onClick:W=>{W.preventDefault(),W.stopPropagation(),d(q=>{const Z={...q};return delete Z[k.tag],Z}),u(Date.now())},children:"Retry"})})]})]}):m.jsxs(m.Fragment,{children:[m.jsx("div",{"aria-hidden":"true",className:"absolute inset-0 z-[1] pointer-events-none",style:{background:"linear-gradient(to bottom, rgba(255,255,255,0.10), rgba(255,255,255,0) 35%),linear-gradient(to top, rgba(0,0,0,0.35), rgba(0,0,0,0) 45%)"}}),m.jsx("img",{src:X,alt:"","aria-hidden":"true",className:"absolute inset-0 z-0 h-full w-full object-cover blur-xl scale-110 opacity-60",loading:"lazy"}),m.jsx("img",{src:X,alt:k.tag,className:"absolute inset-0 z-0 h-full w-full object-contain",loading:"lazy",onLoad:()=>d(W=>({...W,[k.tag]:"ok"})),onError:()=>{d(W=>({...W,[k.tag]:"error"})),g(W=>({...W,[k.tag]:!1}))}}),re&&R?m.jsx("div",{className:"absolute left-3 bottom-3 z-10 max-w-[calc(100%-24px)]",children:m.jsx("div",{className:ni("truncate rounded-full px-2.5 py-1 text-[11px] font-semibold","bg-black/40 text-white backdrop-blur-md","ring-1 ring-white/15"),children:R})}):null]}):m.jsxs("div",{className:"absolute inset-0 flex flex-col items-center justify-center gap-2",children:[m.jsx("div",{className:"absolute inset-0 opacity-70",style:{background:"radial-gradient(circle at 30% 20%, rgba(99,102,241,0.25), transparent 55%),radial-gradient(circle at 70% 80%, rgba(14,165,233,0.18), transparent 55%)"}}),m.jsxs("div",{className:"relative z-10 rounded-xl bg-white/80 dark:bg-black/30 px-3 py-2.5 shadow-sm ring-1 ring-black/5 dark:ring-white/10 backdrop-blur-md",children:[m.jsx("div",{className:"text-xs font-semibold text-gray-900 dark:text-white",children:"Kein Cover vorhanden"}),R?m.jsxs("div",{className:"mt-0.5 text-[11px] text-gray-700 dark:text-gray-300",children:["Model: ",m.jsx("span",{className:"font-semibold",children:R})]}):null,m.jsx("div",{className:"mt-1 text-[11px] text-gray-600 dark:text-gray-400 text-center",children:"(Kein Request / keine 404)"})]})]}):m.jsxs("div",{className:"absolute inset-0",children:[m.jsx("div",{className:"absolute inset-0 opacity-70",style:{background:"radial-gradient(circle at 30% 20%, rgba(99,102,241,0.20), transparent 55%),radial-gradient(circle at 70% 80%, rgba(14,165,233,0.14), transparent 55%)"}}),m.jsx("div",{className:"absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"}),m.jsx("div",{className:"absolute left-3 bottom-3 text-[11px] font-semibold text-white/80 bg-black/30 px-2.5 py-1 rounded-full ring-1 ring-white/10",children:"Cover wird geprüft…"})]})}),m.jsx("div",{className:"px-4 py-3.5",children:m.jsxs("div",{className:"flex items-start justify-between gap-3",children:[m.jsxs("div",{className:"min-w-0",children:[m.jsx("div",{className:"font-semibold text-gray-900 dark:text-white truncate tracking-tight",children:k.tag}),m.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2",children:[m.jsxs("span",{role:"button",tabIndex:0,className:ni("inline-flex max-w-full items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-semibold","tabular-nums whitespace-nowrap","overflow-hidden","bg-indigo-50 text-indigo-700 ring-1 ring-indigo-100","dark:bg-indigo-500/10 dark:text-indigo-200 dark:ring-indigo-500/20","cursor-pointer"),title:"FinishedDownloads nach diesem Tag filtern",onClick:W=>{W.preventDefault(),W.stopPropagation(),P(k.tag)},onKeyDown:W=>{(W.key==="Enter"||W.key===" ")&&(W.preventDefault(),W.stopPropagation(),P(k.tag))},children:[m.jsx("span",{className:"shrink-0",children:k.downloadsCount}),m.jsx("span",{className:"min-w-0 truncate font-medium",children:"Downloads"})]}),m.jsxs("span",{role:"button",tabIndex:0,className:ni("inline-flex max-w-full items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-semibold","tabular-nums whitespace-nowrap overflow-hidden","bg-gray-50 text-gray-700 ring-1 ring-gray-200","dark:bg-white/5 dark:text-gray-200 dark:ring-white/10","cursor-pointer"),title:"Models nach diesem Tag filtern",onClick:W=>{W.preventDefault(),W.stopPropagation(),G(k.tag)},onKeyDown:W=>{(W.key==="Enter"||W.key===" ")&&(W.preventDefault(),W.stopPropagation(),G(k.tag))},children:[m.jsx("span",{className:"shrink-0",children:k.modelsCount}),m.jsx("span",{className:"min-w-0 truncate font-medium",children:"Models"})]})]})]}),m.jsx("span",{"aria-hidden":"true",className:ni("shrink-0 mt-0.5 text-gray-400 dark:text-gray-500","transition-transform group-hover:translate-x-[1px]"),children:"→"})]})})]},k.tag)})})]})}async function oh(s,e){const t=await fetch(s,{credentials:"include",...e});if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(i||`HTTP ${t.status}`)}return t.json()}function HH(){try{const e=new URL(window.location.href).searchParams.get("next")||"/";return!e.startsWith("/")||e.startsWith("/login")?"/":e}catch{return"/"}}const D1="recorder_login_state_v1";function zH(){try{const s=sessionStorage.getItem(D1);if(!s)return null;const e=JSON.parse(s);return!e?.ts||Date.now()-e.ts>900*1e3?null:e}catch{return null}}function VH(s){try{sessionStorage.setItem(D1,JSON.stringify(s))}catch{}}function Zm(){try{sessionStorage.removeItem(D1)}catch{}}function GH(s){const t=(s??"").replace(/\D/g,"").slice(0,6).split("");for(;t.length<6;)t.push("");return t}function qH(s){return(s??[]).join("")}function KH({onLoggedIn:s}){const e=b.useMemo(()=>HH(),[]),[t,i]=b.useState(""),[n,r]=b.useState(""),[a,u]=b.useState(["","","","","",""]),c=b.useRef([]),[d,f]=b.useState(!1),[g,y]=b.useState(null),[v,T]=b.useState("login"),[S,w]=b.useState(null),[L,O]=b.useState(null),[I,j]=b.useState(null),P=b.useRef(!1),G=b.useMemo(()=>qH(a),[a]);function N(q){const Z=c.current[q];Z&&Z.focus()}function K(){u(["","","","","",""]),P.current=!1,window.setTimeout(()=>N(0),0)}function k(q,Z){const te=(Z??"").replace(/\D/g,"").slice(-1);u(oe=>{const F=[...oe];return F[q]=te,F})}function R(q,Z){const te=(Z??"").replace(/\D/g,"");if(!te){k(q,""),P.current=!1;return}if(te.length>1){u(oe=>{const F=[...oe];let le=q;for(const ge of te){if(le>5)break;F[le]=ge,le++}return F}),P.current=!1,window.setTimeout(()=>N(Math.min(5,q+te.length)),0);return}k(q,te),P.current=!1,q<5&&window.setTimeout(()=>N(q+1),0)}function Y(q,Z){if(Z.key==="Backspace"){if(a[q]){Z.preventDefault(),k(q,""),P.current=!1;return}q>0&&(Z.preventDefault(),N(q-1),k(q-1,""),P.current=!1);return}if(Z.key==="ArrowLeft"){Z.preventDefault(),q>0&&N(q-1);return}if(Z.key==="ArrowRight"){Z.preventDefault(),q<5&&N(q+1);return}}function z(q,Z){const oe=(Z.clipboardData.getData("text")||"").replace(/\D/g,"").slice(0,6);oe&&(Z.preventDefault(),u(F=>{const le=[...F];let ge=q;for(const Ie of oe){if(ge>5)break;le[ge]=Ie,ge++}return le}),P.current=!1,window.setTimeout(()=>N(Math.min(5,q+oe.length)),0))}b.useEffect(()=>{const q=zH();q&&(T(q.stage??"login"),i(q.username??""),u(GH(q.code??"")),w(q.setupAuthUrl??null),O(q.setupSecret??null),j(q.setupInfo??null))},[]),b.useEffect(()=>{VH({stage:v,username:t,code:G,setupAuthUrl:S,setupSecret:L,setupInfo:I,ts:Date.now()})},[v,t,G,S,L,I]),b.useEffect(()=>{P.current=!1,(v==="verify"||v==="setup")&&window.setTimeout(()=>N(0),0)},[v]),b.useEffect(()=>{let q=!1;return(async()=>{try{const te=await oh("/api/auth/me",{cache:"no-store"});if(q)return;if(te?.authenticated){te?.totpConfigured?(Zm(),window.location.assign(e||"/")):(T("setup"),J());return}if(te?.pending2fa){T("verify");return}T("login")}catch{}})(),()=>{q=!0}},[e]);const X=async()=>{f(!0),y(null);try{if((await oh("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:n})}))?.totpRequired){T("verify"),K();return}const Z=await oh("/api/auth/me",{cache:"no-store"});if(Z?.authenticated&&!Z?.totpConfigured){T("setup"),K(),await J();return}s&&await s(),Zm(),window.location.assign(e||"/")}catch(q){y(q?.message??String(q))}finally{f(!1)}},re=async()=>{const q=G.trim();if(/^\d{6}$/.test(q)){f(!0),y(null);try{await oh("/api/auth/2fa/enable",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:q})}),s&&await s(),Zm(),window.location.assign(e||"/")}catch(Z){P.current=!1,y(Z?.message??String(Z))}finally{f(!1)}}},J=async()=>{y(null),j(null);try{const q=await oh("/api/auth/2fa/setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),Z=(q?.otpauth??"").trim();if(!Z)throw new Error("2FA Setup fehlgeschlagen (keine otpauth URL).");w(Z),O((q?.secret??"").trim()||null),j("Scan den QR-Code in deiner Authenticator-App und bestätige danach mit dem 6-stelligen Code.")}catch(q){y(q?.message??String(q))}};b.useEffect(()=>{d||v!=="verify"&&v!=="setup"||/^\d{6}$/.test(G)&&(P.current||(P.current=!0,re()))},[G,v,d]);const W=m.jsxs("div",{className:"space-y-1",children:[m.jsx("label",{className:"text-xs font-medium text-gray-700 dark:text-gray-200",children:"2FA Code"}),m.jsx("div",{className:"flex items-center justify-between gap-2",children:a.map((q,Z)=>m.jsx("input",{ref:te=>{c.current[Z]=te},value:q,onChange:te=>R(Z,te.target.value),onKeyDown:te=>Y(Z,te),onPaste:te=>z(Z,te),inputMode:"numeric",pattern:"[0-9]*",maxLength:1,autoComplete:Z===0?"one-time-code":"off",enterKeyHint:Z===5?"done":"next",autoCapitalize:"none",autoCorrect:"off",disabled:d,className:`h-12 w-12 rounded-lg text-center text-lg tabular-nums bg-white text-gray-900 shadow-sm ring-1 ring-gray-200\r focus:outline-none focus:ring-2 focus:ring-indigo-500\r dark:bg-white/10 dark:text-white dark:ring-white/10`,"aria-label":`2FA Ziffer ${Z+1}`},Z))})]});return m.jsxs("div",{className:"min-h-[100dvh] bg-gray-50 text-gray-900 dark:bg-gray-950 dark:text-gray-100",children:[m.jsxs("div",{"aria-hidden":"true",className:"pointer-events-none fixed inset-0 overflow-hidden",children:[m.jsx("div",{className:"absolute -top-28 left-1/2 h-80 w-[52rem] -translate-x-1/2 rounded-full bg-indigo-500/10 blur-3xl dark:bg-indigo-400/10"}),m.jsx("div",{className:"absolute -bottom-28 right-[-6rem] h-80 w-[46rem] rounded-full bg-sky-500/10 blur-3xl dark:bg-sky-400/10"})]}),m.jsx("div",{className:"relative grid min-h-[100dvh] place-items-center px-4",children:m.jsxs("div",{className:"w-full max-w-md rounded-2xl border border-gray-200/70 bg-white/80 p-6 shadow-sm backdrop-blur dark:border-white/10 dark:bg-white/5",children:[m.jsxs("div",{className:"space-y-1",children:[m.jsx("h1",{className:"text-lg font-semibold tracking-tight",children:"Recorder Login"}),m.jsx("p",{className:"text-sm text-gray-600 dark:text-gray-300",children:"Bitte melde dich an, um fortzufahren."})]}),m.jsxs("div",{className:"mt-5 space-y-3",children:[v==="login"?m.jsxs("form",{onSubmit:q=>{q.preventDefault(),!d&&X()},className:"space-y-3",children:[m.jsxs("div",{className:"space-y-1",children:[m.jsx("label",{className:"text-xs font-medium text-gray-700 dark:text-gray-200",children:"Username"}),m.jsx("input",{value:t,onChange:q=>i(q.target.value),autoComplete:"username",className:"block w-full rounded-lg px-3 py-2.5 text-sm bg-white text-gray-900 shadow-sm ring-1 ring-gray-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-white/10 dark:text-white dark:ring-white/10",placeholder:"admin",disabled:d})]}),m.jsxs("div",{className:"space-y-1",children:[m.jsx("label",{className:"text-xs font-medium text-gray-700 dark:text-gray-200",children:"Passwort"}),m.jsx("input",{type:"password",value:n,onChange:q=>r(q.target.value),autoComplete:"current-password",className:"block w-full rounded-lg px-3 py-2.5 text-sm bg-white text-gray-900 shadow-sm ring-1 ring-gray-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-white/10 dark:text-white dark:ring-white/10",placeholder:"••••••••••",disabled:d})]}),m.jsx(ri,{type:"submit",variant:"primary",className:"w-full rounded-lg",disabled:d||!t.trim()||!n,children:d?"Login…":"Login"})]}):v==="verify"?m.jsxs("form",{onSubmit:q=>{q.preventDefault(),!d&&re()},className:"space-y-3",children:[m.jsx("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200",children:"2FA ist aktiv – bitte gib den Code aus deiner Authenticator-App ein."}),W,m.jsxs("div",{className:"flex gap-2",children:[m.jsx(ri,{type:"button",variant:"secondary",className:"flex-1 rounded-lg",disabled:d,onClick:()=>{T("login"),K()},children:"Zurück"}),m.jsx(ri,{type:"submit",variant:"primary",className:"flex-1 rounded-lg",disabled:d||!/^\d{6}$/.test(G),children:d?"Prüfe…":"Bestätigen"})]})]}):m.jsxs("form",{onSubmit:q=>{q.preventDefault(),!d&&re()},className:"space-y-3",children:[m.jsx("div",{className:"rounded-lg border border-indigo-200 bg-indigo-50 px-3 py-2 text-sm text-indigo-900 dark:border-indigo-500/30 dark:bg-indigo-500/10 dark:text-indigo-200",children:"2FA ist noch nicht eingerichtet – bitte richte es jetzt ein (empfohlen)."}),m.jsxs("div",{className:"space-y-2 text-sm text-gray-700 dark:text-gray-200",children:[m.jsx("div",{children:"1) Öffne deine Authenticator-App und füge einen neuen Account hinzu."}),m.jsx("div",{children:"2) Scanne den QR-Code oder verwende den Secret-Key."})]}),m.jsxs("div",{className:"rounded-lg border border-gray-200 bg-white/70 p-3 dark:border-white/10 dark:bg-white/5",children:[m.jsx("div",{className:"text-xs font-medium text-gray-700 dark:text-gray-200",children:"QR / Setup"}),S?m.jsx("div",{className:"mt-2 flex items-center justify-center",children:m.jsx("img",{alt:"2FA QR Code",className:"h-44 w-44 rounded bg-white p-2",src:`https://api.qrserver.com/v1/create-qr-code/?size=220x220&data=${encodeURIComponent(S)}`})}):m.jsx("div",{className:"mt-2 text-xs text-gray-600 dark:text-gray-300",children:"QR wird geladen…"}),L?m.jsxs("div",{className:"mt-3",children:[m.jsx("div",{className:"text-xs text-gray-600 dark:text-gray-300",children:"Secret (manuell):"}),m.jsx("div",{className:"mt-1 select-all break-all rounded bg-gray-100 px-2 py-1 text-xs font-mono text-gray-900 dark:bg-white/10 dark:text-gray-100",children:L})]}):null,I?m.jsx("div",{className:"mt-3 text-xs text-gray-600 dark:text-gray-300",children:I}):null,m.jsx("div",{className:"mt-3",children:m.jsx(ri,{type:"button",variant:"secondary",className:"w-full rounded-lg",disabled:d,onClick:()=>{J()},title:"Setup-Infos neu laden",children:S?"QR/Setup erneut laden":"QR/Setup laden"})})]}),W,m.jsxs("div",{className:"flex gap-2",children:[m.jsx(ri,{type:"button",variant:"secondary",className:"flex-1 rounded-lg",disabled:d,onClick:()=>{s&&s(),Zm(),window.location.assign(e||"/")},title:"Ohne 2FA fortfahren (nicht empfohlen)",children:"Später"}),m.jsx(ri,{type:"submit",variant:"primary",className:"flex-1 rounded-lg",disabled:d||!/^\d{6}$/.test(G),children:d?"Aktiviere…":"2FA aktivieren"})]})]}),g?m.jsx("div",{className:"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200",children:m.jsxs("div",{className:"flex items-start justify-between gap-3",children:[m.jsx("div",{className:"min-w-0 break-words",children:g}),m.jsx("button",{type:"button",className:"shrink-0 rounded px-2 py-1 text-xs font-medium text-red-700 hover:bg-red-100 dark:text-red-200 dark:hover:bg-white/10",onClick:()=>y(null),"aria-label":"Fehlermeldung schließen",title:"Schließen",children:"✕"})]})}):null]})]})})]})}const ix="record_cookies";function Jm(s){return Object.fromEntries(Object.entries(s??{}).map(([t,i])=>[t.trim().toLowerCase(),String(i??"").trim()]).filter(([t,i])=>t.length>0&&i.length>0))}async function Cn(s,e){const t=await fetch(s,e);if(!t.ok){const i=await t.text().catch(()=>"");throw new Error(i||`HTTP ${t.status}`)}return t.json()}const LA={recordDir:"records",doneDir:"records/done",ffmpegPath:"",autoAddToDownloadList:!1,autoStartAddedDownloads:!1,useChaturbateApi:!1,useMyFreeCamsWatcher:!1,autoDeleteSmallDownloads:!1,autoDeleteSmallDownloadsBelowMB:200,blurPreviews:!1,teaserPlayback:"hover",teaserAudio:!1,lowDiskPauseBelowGB:3e3};function So(s){let e=(s??"").trim();if(!e)return null;e=e.replace(/^[("'[{<]+/,"").replace(/[)"'\]}>.,;:]+$/,""),/^https?:\/\//i.test(e)||(e=`https://${e}`);try{const t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"?null:t.toString()}catch{return null}}function ru(s){const e=(s??"").trim();if(!e)return null;for(const t of e.split(/\s+/g)){const i=So(t);if(i)return i}return null}function Ih(s){try{const e=new URL(s).hostname.replace(/^www\./i,"").toLowerCase();return e==="chaturbate.com"||e.endsWith(".chaturbate.com")?"chaturbate":e==="myfreecams.com"||e.endsWith(".myfreecams.com")?"mfc":null}catch{return null}}function qR(s){try{const e=new URL(s),t=e.hostname.replace(/^www\./i,"").toLowerCase();if(t!=="chaturbate.com"&&!t.endsWith(".chaturbate.com"))return"";const i=e.pathname.split("/").filter(Boolean);return i[0]?decodeURIComponent(i[0]).trim():""}catch{return""}}function vl(s){const e=Ih(s);if(!e)return s;if(e==="chaturbate"){const i=qR(s);return i?`https://chaturbate.com/${encodeURIComponent(i)}/`:s}const t=KR(s);return t?`https://www.myfreecams.com/#${encodeURIComponent(t)}`:s}function WH(s){const e=Ih(s);return e?((e==="chaturbate"?qR(s):KR(s))||"").trim().toLowerCase():""}function KR(s){try{const e=new URL(s),t=e.hostname.replace(/^www\./i,"").toLowerCase();if(t!=="myfreecams.com"&&!t.endsWith(".myfreecams.com"))return"";const i=(e.hash||"").replace(/^#\/?/,"");if(i){const a=i.split("/").filter(Boolean),u=a[a.length-1]||"";if(u)return decodeURIComponent(u).trim()}const n=e.pathname.split("/").filter(Boolean),r=n[n.length-1]||"";return r?decodeURIComponent(r).trim():""}catch{return""}}const Os=s=>(s||"").replaceAll("\\","/").split("/").pop()||"";function YH(s,e){const i=(s||"").replaceAll("\\","/").split("/");return i[i.length-1]=e,i.join("/")}function XH(s){return s.startsWith("HOT ")?s.slice(4):s}const QH=/^(.*?)_\d{1,2}_\d{1,2}_\d{4}__\d{1,2}-\d{2}-\d{2}/;function lh(s){const t=XH(Os(s)).replace(/\.[^.]+$/,""),i=t.match(QH);if(i?.[1]?.trim())return i[1].trim();const n=t.lastIndexOf("_");return n>0?t.slice(0,n):t||null}function ZH(){const[s,e]=b.useState(!1),[t,i]=b.useState(!1),n=b.useCallback(async()=>{try{const ue=await Cn("/api/auth/me",{cache:"no-store"});i(!!ue?.authenticated)}catch{i(!1)}finally{e(!0)}},[]),r=b.useCallback(async()=>{try{await fetch("/api/auth/logout",{method:"POST",cache:"no-store"})}catch{}finally{i(!1),e(!0),De(null),at(!1),Et("running"),yi(null),Jt(!1),St(null),q([]),te([]),ge(0),F(1),Fe({}),Le(0),Di({}),$s.current={},di.current={},qt.current=!1,oi([]),Bi({}),Je(0),J("")}},[]);b.useEffect(()=>{n()},[n]);const a=pk(),u=b.useRef(a),c=b.useRef(0),d=ue=>{const pe=(ue||"").toLowerCase();return pe.includes("altersverifikationsseite erhalten")||pe.includes("verify your age")||pe.includes("schutzseite von cloudflare erhalten")||pe.includes("just a moment")||pe.includes("kein room-html")},f=ue=>{const pe=!!ue?.silent,xe="Cookies fehlen oder sind abgelaufen",Oe="Der Recorder hat statt des Room-HTML eine Schutz-/Altersverifikationsseite erhalten. Bitte Cookies aktualisieren (bei Chaturbate z.B. cf_clearance + sessionId) und erneut starten.";if(!pe){De(`⚠️ ${xe}. ${Oe}`),wt(!0);return}const Q=Date.now();Q-c.current>15e3&&(c.current=Q,u.current?.error(xe,Oe))};b.useEffect(()=>{u.current=a},[a]);const[g,y]=b.useState(!1);b.useEffect(()=>{const ue=window,pe=typeof ue.requestIdleCallback=="function"?ue.requestIdleCallback(()=>y(!0),{timeout:1500}):window.setTimeout(()=>y(!0),800);return()=>{typeof ue.cancelIdleCallback=="function"?ue.cancelIdleCallback(pe):window.clearTimeout(pe)}},[]);const v=8,T="finishedDownloads_sort",[S,w]=b.useState(()=>{try{return window.localStorage.getItem(T)||"completed_desc"}catch{return"completed_desc"}}),L=b.useRef(null),O=b.useRef(!1),I=(ue,pe)=>`${pe}::${ue}`,j=b.useCallback(async ue=>{if(ue<1||O.current)return;const pe=I(ue,S),xe=L.current;if(!(xe?.key===pe&&Date.now()-xe.ts<15e3)){O.current=!0;try{const Oe=await fetch(`/api/record/done?page=${ue}&pageSize=${v}&sort=${encodeURIComponent(S)}`,{cache:"no-store"});if(!Oe.ok)return;const Q=await Oe.json().catch(()=>null),ne=Array.isArray(Q?.items)?Q.items:Array.isArray(Q)?Q:[];L.current={key:pe,items:ne,ts:Date.now()}}finally{O.current=!1}}},[S]),P=b.useCallback(async()=>{const ue=Date.now();if(!G.current&&!(ue-N.current<500)){G.current=!0,N.current=ue;try{const pe=await fetch("/api/record/done/meta",{cache:"no-store"});if(!pe.ok)return;const xe=await pe.json().catch(()=>null),Oe=Number(xe?.count??0),Q=Number.isFinite(Oe)&&Oe>=0?Oe:0;ge(Q),Re(Date.now())}catch{}finally{G.current=!1}}},[]),G=b.useRef(!1),N=b.useRef(0),K=b.useRef(null),k=b.useRef(0),R=b.useCallback((ue="unknown")=>{const pe=Date.now(),xe=700;if(Fi.current!=="finished"||K.current!=null)return;const Oe=pe-k.current;if(Oe{K.current=null,k.current=Date.now(),window.dispatchEvent(new CustomEvent("finished-downloads:reload",{detail:{source:"App.requestFinishedReload(cooldown-tail)",reason:ue}}))},xe-Oe);return}K.current=window.setTimeout(()=>{K.current=null,k.current=Date.now(),window.dispatchEvent(new CustomEvent("finished-downloads:reload",{detail:{source:"App.requestFinishedReload",reason:ue}}))},150)},[]);b.useEffect(()=>()=>{K.current!=null&&(window.clearTimeout(K.current),K.current=null)},[]);const Y=b.useCallback(async()=>{try{const ue=await fetch("/api/record/list",{cache:"no-store"});if(!ue.ok)return;const pe=await ue.json().catch(()=>null),xe=Array.isArray(pe)?pe:Array.isArray(pe?.items)?pe.items:[];q(xe),ai.current=xe,Re(Date.now())}catch{}},[]);b.useEffect(()=>{try{window.localStorage.setItem(T,S)}catch{}},[S]),b.useEffect(()=>{t&&P()},[t,P]);const[z,X]=b.useState(null),[re,J]=b.useState(""),[W,q]=b.useState([]),[Z,te]=b.useState([]),[oe,F]=b.useState(1),[le,ge]=b.useState(0),[Ie,Le]=b.useState(0),[Pe,Je]=b.useState(0),[Se,Re]=b.useState(()=>Date.now()),[Ve,Ee]=b.useState(()=>Date.now());b.useEffect(()=>{const ue=window.setInterval(()=>Ee(Date.now()),1e3);return()=>window.clearInterval(ue)},[]);const _e=ue=>(ue||"").toLowerCase().trim(),yt=ue=>{const pe=Math.max(0,Math.floor(ue/1e3));if(pe<2)return"gerade eben";if(pe<60)return`vor ${pe} Sekunden`;const xe=Math.floor(pe/60);if(xe===1)return"vor 1 Minute";if(xe<60)return`vor ${xe} Minuten`;const Oe=Math.floor(xe/60);return Oe===1?"vor 1 Stunde":`vor ${Oe} Stunden`},ut=b.useMemo(()=>{const ue=Ve-Se;return`(zuletzt aktualisiert: ${yt(ue)})`},[Ve,Se]),[pt,Fe]=b.useState({}),_t=b.useCallback(ue=>{const pe={};for(const xe of Array.isArray(ue)?ue:[]){const Oe=(xe?.modelKey||"").trim().toLowerCase();if(!Oe)continue;const Q=ce=>(ce.favorite?4:0)+(ce.liked===!0?2:0)+(ce.watching?1:0),ne=pe[Oe];(!ne||Q(xe)>=Q(ne))&&(pe[Oe]=xe)}return pe},[]),Qe=b.useCallback(async()=>{try{const ue=await Cn("/api/models",{cache:"no-store"});Fe(_t(Array.isArray(ue)?ue:[])),Re(Date.now())}catch{}},[_t]),[Xe,ze]=b.useState(null),Ze=b.useRef(null),[ct,St]=b.useState(null);b.useEffect(()=>{const ue=pe=>{const Oe=(pe.detail?.modelKey??"").trim();if(!Oe)return;if(!Oe.includes(" ")&&!Oe.includes("/")&&!Oe.includes("\\")){const Ne=Oe.replace(/^@/,"").trim().toLowerCase();Ne&&St(Ne);return}const ne=So(Oe);if(!ne){let Ne=Oe.replace(/^https?:\/\//i,"");Ne.includes("/")&&(Ne=Ne.split("/").filter(Boolean).pop()||Ne),Ne.includes(":")&&(Ne=Ne.split(":").pop()||Ne),Ne=Ne.trim().toLowerCase(),Ne&&St(Ne);return}const ce=vl(ne),fe=WH(ce);fe&&St(fe)};return window.addEventListener("open-model-details",ue),()=>window.removeEventListener("open-model-details",ue)},[]);const se=b.useCallback(ue=>{const pe=Date.now(),xe=Ze.current;if(!xe){Ze.current={ts:pe,list:[ue]};return}xe.ts=pe;const Oe=xe.list.findIndex(Q=>Q.id===ue.id);Oe>=0?xe.list[Oe]=ue:xe.list.unshift(ue)},[]);b.useEffect(()=>{Qe();const ue=pe=>{const Oe=pe?.detail??{},Q=Oe?.model;if(Q&&typeof Q=="object"){const ne=String(Q.modelKey??"").toLowerCase().trim();ne&&Fe(ce=>({...ce,[ne]:Q}));try{se(Q)}catch{}ze(ce=>ce?.id===Q.id?Q:ce),Re(Date.now());return}if(Oe?.removed){const ne=String(Oe?.id??"").trim(),ce=String(Oe?.modelKey??"").toLowerCase().trim();ce&&Fe(fe=>{const{[ce]:Ne,...We}=fe;return We}),ne&&ze(fe=>fe?.id===ne?null:fe),Re(Date.now());return}Qe()};return window.addEventListener("models-changed",ue),()=>window.removeEventListener("models-changed",ue)},[Qe,se]);const[ke,De]=b.useState(null),[Ue,at]=b.useState(!1),[dt,wt]=b.useState(!1),[kt,Tt]=b.useState({}),[Ft,Qt]=b.useState(!1),[Zt,Et]=b.useState("running"),[Dt,yi]=b.useState(null),[Pi,Jt]=b.useState(!1),[ki,gt]=b.useState(null),[V,$]=b.useState(0),ie=b.useCallback(()=>$(ue=>ue+1),[]),[Te,Be]=b.useState(LA),ht=b.useRef(Te);b.useEffect(()=>{ht.current=Te},[Te]);const It=!!Te.autoAddToDownloadList,Yt=!!Te.autoStartAddedDownloads,[pi,oi]=b.useState([]),[ci,Bi]=b.useState({}),Gt=b.useRef(!1),xi=b.useRef({}),ai=b.useRef([]),di=b.useRef({}),qt=b.useRef(!1);b.useEffect(()=>{Gt.current=Ue},[Ue]),b.useEffect(()=>{xi.current=kt},[kt]),b.useEffect(()=>{ai.current=W},[W]);const Mt=b.useRef(null),vt=b.useRef(""),Ci=4,ss=b.useRef([]),vs=b.useRef(0),xs=b.useRef(new Set),Gi=b.useRef(!1),fi=b.useCallback(()=>{const ue=vs.current>0;at(ue),Gt.current=ue},[]),Zi=b.useCallback(ue=>{const pe=So(ue.url);if(!pe)return!1;const xe=vl(pe);return xs.current.has(xe)||(xs.current.add(xe),ss.current.push({...ue,url:xe}),Gi.current||(Gi.current=!0,queueMicrotask(()=>{Gi.current=!1,$i()}))),!0},[]);async function ts(ue,pe){if(ue=vl(ue),ai.current.some(Oe=>{if(String(Oe.status||"").toLowerCase()!=="running"||Oe.endedAt)return!1;const Q=So(String(Oe.sourceUrl||""));return(Q?vl(Q):"")===ue}))return!0;try{const Oe=xi.current,Q=Ih(ue);if(!Q)return pe||De("Nur chaturbate.com oder myfreecams.com werden unterstützt."),!1;if(Q==="chaturbate"&&!Wi(Oe))return pe||De('Für Chaturbate müssen die Cookies "cf_clearance" und "sessionId" gesetzt sein.'),!1;const ne=Object.entries(Oe).map(([fe,Ne])=>`${fe}=${Ne}`).join("; "),ce=await Cn("/api/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:ue,cookie:ne})});return ce?.id&&(di.current[String(ce.id)]=!0),q(fe=>[ce,...fe]),ai.current=[ce,...ai.current],!0}catch(Oe){const Q=Oe?.message??String(Oe);return d(Q)?(f({silent:pe}),!1):(pe||De(Q),!1)}}async function $i(){for(;vs.current0;){const ue=ss.current.shift();vs.current++,fi(),(async()=>{try{if(await ts(ue.url,ue.silent)&&ue.pendingKeyLower){const xe=ue.pendingKeyLower;Bi(Oe=>{const Q={...Oe||{}};return delete Q[xe],Kt.current=Q,Q})}}finally{xs.current.delete(ue.url),vs.current=Math.max(0,vs.current-1),fi(),ss.current.length>0&&$i()}})()}}const[Ji,Di]=b.useState({}),$s=b.useRef({}),Cs=b.useRef({}),ns=b.useRef({}),rs=b.useRef(!1),Rs=b.useRef({});b.useEffect(()=>{$s.current=Ji},[Ji]);const Li=b.useCallback(ue=>{const pe=String(ue?.host??"").toLowerCase(),xe=String(ue?.input??"").toLowerCase();return pe.includes("chaturbate")||xe.includes("chaturbate.com")},[]),qi=b.useMemo(()=>{const ue=new Set;for(const pe of Object.values(pt)){if(!Li(pe))continue;const xe=_e(String(pe?.modelKey??""));xe&&ue.add(xe)}return Array.from(ue)},[pt,Li]),bs=b.useRef(pt);b.useEffect(()=>{bs.current=pt},[pt]);const Kt=b.useRef(ci);b.useEffect(()=>{Kt.current=ci},[ci]);const ds=b.useRef(qi);b.useEffect(()=>{ds.current=qi},[qi]);const Fi=b.useRef(Zt);b.useEffect(()=>{Fi.current=Zt},[Zt]);const Hi=b.useCallback(async(ue,pe)=>{const xe=So(ue);if(!xe)return!1;const Oe=vl(xe),Q=!!pe?.silent;Q||De(null);const ne=Ih(Oe);if(!ne)return Q||De("Nur chaturbate.com oder myfreecams.com werden unterstützt."),!1;const ce=xi.current;if(ne==="chaturbate"&&!Wi(ce))return Q||De('Für Chaturbate müssen die Cookies "cf_clearance" und "sessionId" gesetzt sein.'),!1;if(ai.current.some(Ne=>{if(String(Ne.status||"").toLowerCase()!=="running"||Ne.endedAt)return!1;const We=So(String(Ne.sourceUrl||""));return(We?vl(We):"")===Oe}))return!0;if(ne==="chaturbate"&&ht.current.useChaturbateApi)try{const Ne=await Cn("/api/models/parse",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:Oe})}),We=String(Ne?.modelKey??"").trim().toLowerCase();if(We){if(Gt.current)return Bi(mt=>({...mt||{},[We]:Oe})),!0;const xt=$s.current[We],it=String(xt?.current_show??"");if(xt&&it&&it!=="public")return Bi(mt=>({...mt||{},[We]:Oe})),!0}}catch{}else if(Gt.current)return Mt.current=Oe,!0;if(Gt.current)return!1;at(!0),Gt.current=!0;try{const Ne=Object.entries(ce).map(([xt,it])=>`${xt}=${it}`).join("; "),We=await Cn("/api/record",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:Oe,cookie:Ne})});return We?.id&&(di.current[String(We.id)]=!0),q(xt=>[We,...xt]),ai.current=[We,...ai.current],!0}catch(Ne){const We=Ne?.message??String(Ne);return d(We)?(f({silent:Q}),!1):(Q||De(We),!1)}finally{at(!1),Gt.current=!1}},[]);b.useEffect(()=>{let ue=!1;const pe=async()=>{try{const Q=await Cn("/api/settings",{cache:"no-store"});!ue&&Q&&Be({...LA,...Q})}catch{}},xe=()=>{pe()},Oe=()=>{pe()};return window.addEventListener("recorder-settings-updated",xe),window.addEventListener("focus",Oe),document.addEventListener("visibilitychange",Oe),pe(),()=>{ue=!0,window.removeEventListener("recorder-settings-updated",xe),window.removeEventListener("focus",Oe),document.removeEventListener("visibilitychange",Oe)}},[]),b.useEffect(()=>{let ue=!1;const pe=async()=>{try{const Oe=await Cn("/api/models/meta",{cache:"no-store"}),Q=Number(Oe?.count??0);!ue&&Number.isFinite(Q)&&(Le(Q),Re(Date.now()))}catch{}};pe();const xe=window.setInterval(pe,document.hidden?6e4:3e4);return()=>{ue=!0,window.clearInterval(xe)}},[]);const Ge=b.useMemo(()=>Object.entries(kt).map(([ue,pe])=>({name:ue,value:pe})),[kt]),Lt=b.useCallback((ue,pe)=>{Ze.current=null,ze(null),yi(ue),Jt(!1),gt(typeof pe=="number"&&Number.isFinite(pe)&&pe>=0?pe:null)},[]),Ct=W.filter(ue=>{const pe=String(ue?.status??"").toLowerCase();return pe==="running"||pe==="postwork"}),Xt=b.useMemo(()=>{let ue=0;for(const pe of Object.values(pt)){if(!pe?.watching||!Li(pe))continue;const xe=_e(String(pe?.modelKey??""));xe&&Ji[xe]&&ue++}return ue},[pt,Ji,Li]),{onlineFavCount:Wt,onlineLikedCount:_i}=b.useMemo(()=>{let ue=0,pe=0;for(const xe of Object.values(pt)){const Oe=_e(String(xe?.modelKey??""));Oe&&Ji[Oe]&&(xe?.favorite&&ue++,xe?.liked===!0&&pe++)}return{onlineFavCount:ue,onlineLikedCount:pe}},[pt,Ji]),ei=[{id:"running",label:"Laufende Downloads",count:Ct.length},{id:"finished",label:"Abgeschlossene Downloads",count:le},{id:"models",label:"Models",count:Ie},{id:"categories",label:"Kategorien"},{id:"settings",label:"Einstellungen"}],Ki=b.useMemo(()=>re.trim().length>0&&!Ue,[re,Ue]);b.useEffect(()=>{let ue=!1;return(async()=>{try{const xe=await Cn("/api/cookies",{cache:"no-store"}),Oe=Jm(xe?.cookies);if(ue||Tt(Oe),Object.keys(Oe).length===0){const Q=localStorage.getItem(ix);if(Q)try{const ne=JSON.parse(Q),ce=Jm(ne);Object.keys(ce).length>0&&(ue||Tt(ce),await Cn("/api/cookies",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cookies:ce})}))}catch{}}}catch{const xe=localStorage.getItem(ix);if(xe)try{const Oe=JSON.parse(xe);ue||Tt(Jm(Oe))}catch{}}finally{ue||Qt(!0)}})(),()=>{ue=!0}},[]),b.useEffect(()=>{Ft&&localStorage.setItem(ix,JSON.stringify(kt))},[kt,Ft]),b.useEffect(()=>{P();const ue=()=>{document.hidden||P()};return document.addEventListener("visibilitychange",ue),()=>{document.removeEventListener("visibilitychange",ue)}},[P]),b.useEffect(()=>{if(Zt!=="finished")return;P(),R("selectedTab effect");const ue=()=>{document.hidden||(P(),R("selectedTab visibilitychange"))};return document.addEventListener("visibilitychange",ue),()=>{document.removeEventListener("visibilitychange",ue)}},[Zt,P,R]),b.useEffect(()=>{const ue=Math.max(1,Math.ceil(le/v));oe>ue&&F(ue)},[le,oe]),b.useEffect(()=>{if(!t)return;let ue=null,pe=null;const xe=()=>{pe!=null&&(window.clearInterval(pe),pe=null)},Oe=()=>{pe==null&&(pe=window.setInterval(()=>{document.hidden||(Fi.current==="finished"?(P(),R("done-stream poll tick")):P())},document.hidden?6e4:15e3))},Q={t:0};let ne=null;const ce=()=>{const We=Date.now();if(We-Q.t<800){if(ne!=null)return;ne=window.setTimeout(()=>{ne=null,Q.t=Date.now(),Fi.current==="finished"?(P(),R("done-stream coalesced requestRefresh")):P()},900);return}Q.t=We,Fi.current==="finished"?(P(),R("done-stream requestRefresh")):P()};P(),ue=new EventSource("/api/record/done/stream"),ue.onopen=()=>{xe()},ue.onerror=()=>{Oe()};const fe=()=>ce();ue.addEventListener("doneChanged",fe);const Ne=()=>{document.hidden||ce()};return document.addEventListener("visibilitychange",Ne),()=>{document.removeEventListener("visibilitychange",Ne),ne!=null&&window.clearTimeout(ne),xe(),ue?.removeEventListener("doneChanged",fe),ue?.close(),ue=null}},[t,P,R]),b.useEffect(()=>{if(!t)return;Y();const ue=window.setInterval(()=>{if(document.hidden)return;const xe=ai.current.some(Oe=>{const Q=String(Oe?.status??"").toLowerCase();return Q==="running"||Q==="postwork"});(Fi.current==="running"||xe)&&Y()},document.hidden?6e4:3e3),pe=()=>{document.hidden||Y()};return document.addEventListener("visibilitychange",pe),()=>{window.clearInterval(ue),document.removeEventListener("visibilitychange",pe)}},[t,Y]);function Ts(ue){const pe=So(ue);if(!pe)return!1;try{return new URL(pe).hostname.includes("chaturbate.com")}catch{return!1}}function In(ue,pe){const xe=Object.fromEntries(Object.entries(ue).map(([Oe,Q])=>[Oe.trim().toLowerCase(),Q]));for(const Oe of pe){const Q=xe[Oe.toLowerCase()];if(Q)return Q}}function Wi(ue){const pe=In(ue,["cf_clearance"]),xe=In(ue,["sessionid","session_id","sessionId"]);return!!(pe&&xe)}async function Nn(ue){try{await Cn(`/api/record/stop?id=${encodeURIComponent(ue)}`,{method:"POST"})}catch(pe){a.error("Stop fehlgeschlagen",pe?.message??String(pe))}}b.useEffect(()=>{const ue=pe=>{const Oe=Number(pe.detail?.delta??0);Number.isFinite(Oe)&&Oe!==0&&ge(Q=>Math.max(0,Q+Oe)),P()};return window.addEventListener("finished-downloads:count-hint",ue),()=>window.removeEventListener("finished-downloads:count-hint",ue)},[P]),b.useEffect(()=>{const ue=pe=>{const xe=pe.detail||{};xe.tab==="finished"&&Et("finished"),xe.tab==="categories"&&Et("categories"),xe.tab==="models"&&Et("models"),xe.tab==="running"&&Et("running"),xe.tab==="settings"&&Et("settings")};return window.addEventListener("app:navigate-tab",ue),()=>window.removeEventListener("app:navigate-tab",ue)},[]),b.useEffect(()=>{if(!Dt){ze(null),X(null);return}const ue=(lh(Dt.output||"")||"").trim().toLowerCase();X(ue||null);const pe=ue?pt[ue]:void 0;ze(pe??null)},[Dt,pt]);async function On(){return Hi(re)}const Zs=b.useCallback(async ue=>{const pe=String(ue?.sourceUrl??""),xe=ru(pe);if(!xe)return!1;const Oe=So(xe);if(!Oe)return!1;const Q=vl(Oe),ne=await Hi(Q,{silent:!0});return ne||a.error("Konnte URL nicht hinzufügen","Start fehlgeschlagen oder URL ungültig."),ne},[Hi,a]);async function pn(ue){const{kind:pe,file:xe,run:Oe,onSuccess:Q,onError:ne}=ue;(pe==="delete"||pe==="keep")&&window.dispatchEvent(new CustomEvent("finished-downloads:delete",{detail:{file:xe,phase:"start"}}));try{const ce=await Oe();return(pe==="delete"||pe==="keep")&&window.dispatchEvent(new CustomEvent("finished-downloads:delete",{detail:{file:xe,phase:"success"}})),await Q?.(ce),ce}catch(ce){throw(pe==="delete"||pe==="keep")&&window.dispatchEvent(new CustomEvent("finished-downloads:delete",{detail:{file:xe,phase:"error"}})),await ne?.(ce),ce}}const ln=b.useCallback(async ue=>{const pe=Os(ue.output||"");if(pe)try{const xe=await pn({kind:"delete",file:pe,run:()=>Cn(`/api/record/delete?file=${encodeURIComponent(pe)}`,{method:"POST"}),onSuccess:async()=>{window.setTimeout(()=>{te(Q=>{const ne=Q.filter(it=>Os(it.output||"")!==pe);if(v-ne.length<=0)return ne;const fe=I(oe+1,S),Ne=L.current;if(!Ne||Ne.key!==fe||!Array.isArray(Ne.items)||Ne.items.length===0)return ne;const We=[...ne],xt=new Set(We.map(it=>String(it.id||Os(it.output||"")).trim()));for(;We.length0;){const it=Ne.items.shift(),mt=String(it.id||Os(it.output||"")).trim();!mt||xt.has(mt)||(xt.add(mt),We.push(it))}return L.current={...Ne,items:Ne.items,ts:Ne.ts},We}),ge(Q=>Math.max(0,Q-1)),q(Q=>Q.filter(ne=>Os(ne.output||"")!==pe)),yi(Q=>Q&&Os(Q.output||"")===pe?null:Q),j(oe+1)},320)},onError:async()=>{a.error("Löschen fehlgeschlagen",pe)}}),Oe=typeof xe?.undoToken=="string"?xe.undoToken:"";return Oe?{undoToken:Oe}:{}}catch{return}},[pn,a,oe,S,j]),Is=b.useCallback(async ue=>{const pe=Os(ue.output||"");if(pe)try{await pn({kind:"keep",file:pe,run:()=>Cn(`/api/record/keep?file=${encodeURIComponent(pe)}`,{method:"POST"}),onSuccess:async()=>{window.setTimeout(()=>{te(xe=>xe.filter(Oe=>Os(Oe.output||"")!==pe)),q(xe=>xe.filter(Oe=>Os(Oe.output||"")!==pe)),yi(xe=>xe&&Os(xe.output||"")===pe?null:xe),ge(xe=>Math.max(0,xe-1)),j(oe+1)},320)},onError:async()=>{a.error("Keep fehlgeschlagen",pe)}})}catch{return}},[pn,a,oe,j]),un=b.useCallback(async ue=>{const pe=Os(ue.output||"");if(pe)try{window.dispatchEvent(new CustomEvent("player:release",{detail:{file:pe}})),await new Promise(ce=>window.setTimeout(ce,60));const xe=await Cn(`/api/record/toggle-hot?file=${encodeURIComponent(pe)}`,{method:"POST"}),Oe=Os(xe.oldFile||pe)||pe,Q=Os(xe.newFile||"")||"";if(!Q)throw new Error("Backend lieferte keinen neuen Dateinamen zurück");window.dispatchEvent(new CustomEvent("finished-downloads:rename",{detail:{oldFile:Oe,newFile:Q}}));const ne=ce=>YH(ce||"",Q);return yi(ce=>ce&&(ce.id===ue.id||Os(ce.output||"")===Oe?{...ce,output:ne(ce.output||"")}:ce)),te(ce=>ce.map(fe=>fe.id===ue.id||Os(fe.output||"")===Oe?{...fe,output:ne(fe.output||"")}:fe)),q(ce=>ce.map(fe=>fe.id===ue.id||Os(fe.output||"")===Oe?{...fe,output:ne(fe.output||"")}:fe)),xe}catch(xe){a.error("Umbenennen fehlgeschlagen",xe?.message??String(xe));return}},[a]),Mn=b.useCallback(async ue=>{await ln(ue)},[ln]);async function Js(ue){const pe=await fetch("/api/models/flags",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ue)});if(pe.status===204)return null;if(!pe.ok){const xe=await pe.text().catch(()=>"");throw new Error(xe||`HTTP ${pe.status}`)}return pe.json()}const en=b.useCallback(ue=>{const pe=Ze.current;!pe||!ue||(pe.ts=Date.now(),pe.list=pe.list.filter(xe=>xe.id!==ue))},[]),zi=b.useRef({}),Pn=b.useCallback(async ue=>{const pe=Os(ue.output||""),xe=!!(Dt&&Os(Dt.output||"")===pe),Oe=it=>{try{const mt=String(it.sourceUrl??it.SourceURL??""),Rt=ru(mt);return Rt?new URL(Rt).hostname.replace(/^www\./i,"").toLowerCase():""}catch{return""}},Q=(lh(ue.output||"")||"").trim().toLowerCase();if(Q){const it=Q;if(zi.current[it])return;zi.current[it]=!0;const mt=pt[Q]??{id:"",input:"",host:Oe(ue)||void 0,modelKey:Q,watching:!1,favorite:!1,liked:null,isUrl:!1},Rt=!mt.favorite,Pt={...mt,modelKey:mt.modelKey||Q,favorite:Rt,liked:Rt?!1:mt.liked};Fe(Nt=>({...Nt,[Q]:Pt})),se(Pt),xe&&ze(Pt);try{const Nt=await Js({...Pt.id?{id:Pt.id}:{},host:Pt.host||Oe(ue)||"",modelKey:Q,favorite:Rt,...Rt?{liked:!1}:{}});if(!Nt){Fe(Vi=>{const{[Q]:gn,...yn}=Vi;return yn}),mt.id&&en(mt.id),xe&&ze(null),window.dispatchEvent(new CustomEvent("models-changed",{detail:{removed:!0,id:mt.id,modelKey:Q}}));return}const Ht=_e(Nt.modelKey||Q);Ht&&Fe(Vi=>({...Vi,[Ht]:Nt})),se(Nt),xe&&ze(Nt),window.dispatchEvent(new CustomEvent("models-changed",{detail:{model:Nt}}))}catch(Nt){Fe(Ht=>({...Ht,[Q]:mt})),se(mt),xe&&ze(mt),a.error("Favorit umschalten fehlgeschlagen",Nt?.message??String(Nt))}finally{delete zi.current[it]}return}let ne=xe?Xe:null;if(ne||(ne=await we(ue,{ensure:!0})),!ne)return;const ce=_e(ne.modelKey||ne.id||"");if(!ce||zi.current[ce])return;zi.current[ce]=!0;const fe=ne,Ne=!fe.favorite,We={...fe,favorite:Ne,liked:Ne?!1:fe.liked},xt=_e(fe.modelKey||"");xt&&Fe(it=>({...it,[xt]:We})),se(We),xe&&ze(We);try{const it=await Js({id:fe.id,favorite:Ne,...Ne?{liked:!1}:{}});if(!it){Fe(Rt=>{const Pt=_e(fe.modelKey||"");if(!Pt)return Rt;const{[Pt]:Nt,...Ht}=Rt;return Ht}),en(fe.id),xe&&ze(null),window.dispatchEvent(new CustomEvent("models-changed",{detail:{removed:!0,id:fe.id,modelKey:fe.modelKey}}));return}const mt=_e(it.modelKey||"");mt&&Fe(Rt=>({...Rt,[mt]:it})),se(it),xe&&ze(it),window.dispatchEvent(new CustomEvent("models-changed",{detail:{model:it}}))}catch(it){const mt=_e(fe.modelKey||"");mt&&Fe(Rt=>({...Rt,[mt]:fe})),se(fe),xe&&ze(fe),a.error("Favorit umschalten fehlgeschlagen",it?.message??String(it))}finally{delete zi.current[ce]}},[a,Dt,Xe,we,Js,se,en,pt]),_n=b.useCallback(async ue=>{const pe=Os(ue.output||""),xe=!!(Dt&&Os(Dt.output||"")===pe),Oe=it=>{try{const mt=String(it.sourceUrl??it.SourceURL??""),Rt=ru(mt);return Rt?new URL(Rt).hostname.replace(/^www\./i,"").toLowerCase():""}catch{return""}},Q=(lh(ue.output||"")||"").trim().toLowerCase();if(Q){const it=Q;if(zi.current[it])return;zi.current[it]=!0;const mt=pt[Q]??{id:"",input:"",host:Oe(ue)||void 0,modelKey:Q,watching:!1,favorite:!1,liked:null,isUrl:!1},Rt=mt.liked!==!0,Pt={...mt,modelKey:mt.modelKey||Q,liked:Rt,favorite:Rt?!1:mt.favorite};Fe(Nt=>({...Nt,[Q]:Pt})),se(Pt),xe&&ze(Pt);try{const Nt=await Js({...Pt.id?{id:Pt.id}:{},host:Pt.host||Oe(ue)||"",modelKey:Q,liked:Rt,...Rt?{favorite:!1}:{}});if(!Nt){Fe(Vi=>{const{[Q]:gn,...yn}=Vi;return yn}),mt.id&&en(mt.id),xe&&ze(null),window.dispatchEvent(new CustomEvent("models-changed",{detail:{removed:!0,id:mt.id,modelKey:Q}}));return}const Ht=_e(Nt.modelKey||Q);Ht&&Fe(Vi=>({...Vi,[Ht]:Nt})),se(Nt),xe&&ze(Nt),window.dispatchEvent(new CustomEvent("models-changed",{detail:{model:Nt}}))}catch(Nt){Fe(Ht=>({...Ht,[Q]:mt})),se(mt),xe&&ze(mt),a.error("Like umschalten fehlgeschlagen",Nt?.message??String(Nt))}finally{delete zi.current[it]}return}let ne=xe?Xe:null;if(ne||(ne=await we(ue,{ensure:!0})),!ne)return;const ce=_e(ne.modelKey||ne.id||"");if(!ce||zi.current[ce])return;zi.current[ce]=!0;const fe=ne,Ne=fe.liked!==!0,We={...fe,liked:Ne,favorite:Ne?!1:fe.favorite},xt=_e(fe.modelKey||"");xt&&Fe(it=>({...it,[xt]:We})),se(We),xe&&ze(We);try{const it=Ne?await Js({id:fe.id,liked:!0,favorite:!1}):await Js({id:fe.id,liked:!1});if(!it){Fe(Rt=>{const Pt=_e(fe.modelKey||"");if(!Pt)return Rt;const{[Pt]:Nt,...Ht}=Rt;return Ht}),en(fe.id),xe&&ze(null),window.dispatchEvent(new CustomEvent("models-changed",{detail:{removed:!0,id:fe.id,modelKey:fe.modelKey}}));return}const mt=_e(it.modelKey||"");mt&&Fe(Rt=>({...Rt,[mt]:it})),se(it),xe&&ze(it),window.dispatchEvent(new CustomEvent("models-changed",{detail:{model:it}}))}catch(it){const mt=_e(fe.modelKey||"");mt&&Fe(Rt=>({...Rt,[mt]:fe})),se(fe),xe&&ze(fe),a.error("Like umschalten fehlgeschlagen",it?.message??String(it))}finally{delete zi.current[ce]}},[a,Dt,Xe,we,Js,se,en,pt]),me=b.useCallback(async ue=>{const pe=Os(ue.output||""),xe=!!(Dt&&Os(Dt.output||"")===pe),Oe=it=>{try{const mt=String(it.sourceUrl??it.SourceURL??""),Rt=ru(mt);return Rt?new URL(Rt).hostname.replace(/^www\./i,"").toLowerCase():""}catch{return""}},Q=(lh(ue.output||"")||"").trim().toLowerCase();if(Q){const it=Q;if(zi.current[it])return;zi.current[it]=!0;const mt=pt[Q]??{id:"",input:"",host:Oe(ue)||void 0,modelKey:Q,watching:!1,favorite:!1,liked:null,isUrl:!1},Rt=!mt.watching,Pt={...mt,modelKey:mt.modelKey||Q,watching:Rt};Fe(Nt=>({...Nt,[Q]:Pt})),se(Pt),xe&&ze(Pt);try{const Nt=await Js({...Pt.id?{id:Pt.id}:{},host:Pt.host||Oe(ue)||"",modelKey:Q,watched:Rt});if(!Nt){Fe(Vi=>{const{[Q]:gn,...yn}=Vi;return yn}),mt.id&&en(mt.id),xe&&ze(null),window.dispatchEvent(new CustomEvent("models-changed",{detail:{removed:!0,id:mt.id,modelKey:Q}}));return}const Ht=_e(Nt.modelKey||Q);Ht&&Fe(Vi=>({...Vi,[Ht]:Nt})),se(Nt),xe&&ze(Nt),window.dispatchEvent(new CustomEvent("models-changed",{detail:{model:Nt}}))}catch(Nt){Fe(Ht=>({...Ht,[Q]:mt})),se(mt),xe&&ze(mt),a.error("Watched umschalten fehlgeschlagen",Nt?.message??String(Nt))}finally{delete zi.current[it]}return}let ne=xe?Xe:null;if(ne||(ne=await we(ue,{ensure:!0})),!ne)return;const ce=_e(ne.modelKey||ne.id||"");if(!ce||zi.current[ce])return;zi.current[ce]=!0;const fe=ne,Ne=!fe.watching,We={...fe,watching:Ne},xt=_e(fe.modelKey||"");xt&&Fe(it=>({...it,[xt]:We})),se(We),xe&&ze(We);try{const it=await Js({id:fe.id,watched:Ne});if(!it){Fe(Rt=>{const Pt=_e(fe.modelKey||"");if(!Pt)return Rt;const{[Pt]:Nt,...Ht}=Rt;return Ht}),en(fe.id),xe&&ze(null),window.dispatchEvent(new CustomEvent("models-changed",{detail:{removed:!0,id:fe.id,modelKey:fe.modelKey}}));return}const mt=_e(it.modelKey||"");mt&&Fe(Rt=>({...Rt,[mt]:it})),se(it),xe&&ze(it),window.dispatchEvent(new CustomEvent("models-changed",{detail:{model:it}}))}catch(it){const mt=_e(fe.modelKey||"");mt&&Fe(Rt=>({...Rt,[mt]:fe})),se(fe),xe&&ze(fe),a.error("Watched umschalten fehlgeschlagen",it?.message??String(it))}finally{delete zi.current[ce]}},[a,Dt,Xe,we,Js,se,en,pt]);async function we(ue,pe){const xe=!!pe?.ensure,Oe=We=>{const xt=Date.now(),it=Ze.current;if(!it){Ze.current={ts:xt,list:[We]};return}it.ts=xt;const mt=it.list.findIndex(Rt=>Rt.id===We.id);mt>=0?it.list[mt]=We:it.list.unshift(We)},Q=async We=>{if(!We)return null;const xt=We.trim().toLowerCase();if(!xt)return null;const it=pt[xt];if(it)return Oe(it),it;if(xe){let Ht;try{const gn=ue.sourceUrl??ue.SourceURL??"",yn=ru(gn);yn&&(Ht=new URL(yn).hostname.replace(/^www\./i,"").toLowerCase())}catch{}const Vi=await Cn("/api/models/ensure",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({modelKey:We,...Ht?{host:Ht}:{}})});return se(Vi),Vi}const mt=Date.now(),Rt=Ze.current;if(!Rt||mt-Rt.ts>3e4){const Ht=Object.values(pt);if(Ht.length)Ze.current={ts:mt,list:Ht};else{const Vi=await Cn("/api/models",{cache:"no-store"});Ze.current={ts:mt,list:Array.isArray(Vi)?Vi:[]}}}const Nt=(Ze.current?.list??[]).find(Ht=>(Ht.modelKey||"").trim().toLowerCase()===xt);return Nt||null},ne=lh(ue.output||"");if(ne)return Q(ne);const ce=ue.status==="running",fe=ue.sourceUrl??ue.SourceURL??"",Ne=ru(fe);if(ce&&Ne){const We=await Cn("/api/models/parse",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({input:Ne})}),xt=await Cn("/api/models/upsert",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(We)});return se(xt),xt}return null}return b.useEffect(()=>{if(!It&&!Yt||!navigator.clipboard?.readText)return;let ue=!1,pe=!1,xe=null;const Oe=async()=>{if(!(ue||pe)){pe=!0;try{const ce=await navigator.clipboard.readText(),fe=ru(ce);if(!fe)return;const Ne=So(fe);if(!Ne||!Ih(Ne))return;const xt=vl(Ne);if(xt===vt.current)return;vt.current=xt,It&&J(xt),Yt&&Zi({url:xt,silent:!1})}catch{}finally{pe=!1}}},Q=ce=>{ue||(xe=window.setTimeout(async()=>{await Oe(),Q(document.hidden?5e3:1500)},ce))},ne=()=>{Oe()};return window.addEventListener("hover",ne),document.addEventListener("visibilitychange",ne),Q(0),()=>{ue=!0,xe&&window.clearTimeout(xe),window.removeEventListener("hover",ne),document.removeEventListener("visibilitychange",ne)}},[It,Yt,Zi]),b.useEffect(()=>{const ue=CA({getModels:()=>{if(!ht.current.useChaturbateApi)return[];const pe=bs.current,xe=Kt.current,Oe=Object.values(pe).filter(ne=>!!ne?.watching&&String(ne?.host??"").toLowerCase().includes("chaturbate")).map(ne=>String(ne?.modelKey??"").trim().toLowerCase()).filter(Boolean),Q=Object.keys(xe||{}).map(ne=>String(ne||"").trim().toLowerCase()).filter(Boolean);return Array.from(new Set([...Oe,...Q]))},getShow:()=>["public","private","hidden","away"],intervalMs:8e3,onData:pe=>{(async()=>{if(!pe?.enabled){Di({}),$s.current={},Cs.current={},oi([]),Rs.current={},rs.current=!1,ns.current={},Re(Date.now());return}const xe={};for(const ce of Array.isArray(pe.rooms)?pe.rooms:[]){const fe=String(ce?.username??"").trim().toLowerCase();fe&&(xe[fe]=ce)}Di(xe),$s.current=xe;try{const ce=!!(ht.current.enableNotifications??!0),fe=new Set(["private","away","hidden"]),Ne=new Set(Object.values(bs.current||{}).filter(Ht=>!!Ht?.watching&&String(Ht?.host??"").toLowerCase().includes("chaturbate")).map(Ht=>String(Ht?.modelKey??"").trim().toLowerCase()).filter(Boolean)),We=Cs.current||{},xt={...We},it=ns.current||{},mt=!rs.current,Rt=Rs.current||{},Pt={...Rt};for(const[Ht,Vi]of Object.entries(xe)){const gn=String(Vi?.current_show??"").toLowerCase().trim(),yn=String(We[Ht]??"").toLowerCase().trim(),hs=!0&&!!!it[Ht],Ms=!!Rt[Ht],En=String(Vi?.username??Ht).trim()||Ht,ba=String(Vi?.image_url??"").trim();if(Pt[Ht]=!0,gn==="public"&&fe.has(yn)){ce&&a.info(En,"ist wieder online.",{imageUrl:ba,imageAlt:`${En} Vorschau`,durationMs:5500,onClick:()=>{window.dispatchEvent(new CustomEvent("open-model-details",{detail:{modelKey:En}}))}}),gn&&(xt[Ht]=gn);continue}if(Ne.has(Ht)&&hs){const Ta=Ms;ce&&!mt&&a.info(En,Ta?"ist wieder online.":"ist online.",{imageUrl:ba,imageAlt:`${En} Vorschau`,durationMs:5500,onClick:()=>{window.dispatchEvent(new CustomEvent("open-model-details",{detail:{modelKey:En}}))}})}gn&&(xt[Ht]=gn)}const Nt={};for(const Ht of Object.keys(xe))Nt[Ht]=!0;ns.current=Nt,Rs.current=Pt,rs.current=!0,Cs.current=xt}catch{}const Oe=ds.current;for(const ce of Oe||[]){const fe=String(ce||"").trim().toLowerCase();fe&&xe[fe]}if(!ht.current.useChaturbateApi)oi([]);else if(Fi.current==="running"){const ce=bs.current,fe=Kt.current,Ne=Array.from(new Set(Object.values(ce).filter(mt=>!!mt?.watching&&String(mt?.host??"").toLowerCase().includes("chaturbate")).map(mt=>String(mt?.modelKey??"").trim().toLowerCase()).filter(Boolean))),We=Object.keys(fe||{}).map(mt=>String(mt||"").trim().toLowerCase()).filter(Boolean),xt=new Set(We),it=Array.from(new Set([...Ne,...We]));if(it.length===0)oi([]);else{const mt=[];for(const Rt of it){const Pt=xe[Rt];if(!Pt)continue;const Nt=String(Pt?.username??"").trim(),Ht=String(Pt?.current_show??"unknown");if(Ht==="public"&&!xt.has(Rt))continue;const Vi=`https://chaturbate.com/${(Nt||Rt).trim()}/`;mt.push({id:Rt,modelKey:Nt||Rt,url:Vi,currentShow:Ht,imageUrl:String(Pt?.image_url??"")})}mt.sort((Rt,Pt)=>Rt.modelKey.localeCompare(Pt.modelKey,void 0,{sensitivity:"base"})),oi(mt)}}if(!ht.current.useChaturbateApi||Gt.current)return;const Q=Kt.current,ne=Object.keys(Q||{}).map(ce=>String(ce||"").toLowerCase()).filter(Boolean);for(const ce of ne){const fe=xe[ce];if(!fe||String(fe.current_show??"")!=="public")continue;const Ne=Q[ce];Ne&&Zi({url:Ne,silent:!0,pendingKeyLower:ce})}Re(Date.now())})()}});return()=>ue()},[]),b.useEffect(()=>{if(!Te.useChaturbateApi){Je(0);return}const ue=CA({getModels:()=>[],getShow:()=>["public","private","hidden","away"],intervalMs:3e4,fetchAllWhenNoModels:!0,onData:pe=>{if(!pe?.enabled){Je(0);return}const xe=Number(pe?.total??0);Je(Number.isFinite(xe)?xe:0),Re(Date.now())},onError:pe=>{console.error("[ALL-online poller] error",pe)}});return()=>ue()},[Te.useChaturbateApi]),s?t?m.jsxs("div",{className:"min-h-[100dvh] bg-gray-50 text-gray-900 dark:bg-gray-950 dark:text-gray-100",children:[m.jsxs("div",{"aria-hidden":"true",className:"pointer-events-none fixed inset-0 overflow-hidden",children:[m.jsx("div",{className:"absolute -top-28 left-1/2 h-80 w-[52rem] -translate-x-1/2 rounded-full bg-indigo-500/10 blur-3xl dark:bg-indigo-400/10"}),m.jsx("div",{className:"absolute -bottom-28 right-[-6rem] h-80 w-[46rem] rounded-full bg-sky-500/10 blur-3xl dark:bg-sky-400/10"})]}),m.jsxs("div",{className:"relative",children:[m.jsx("header",{className:"z-30 bg-white/70 backdrop-blur dark:bg-gray-950/60 sm:sticky sm:top-0 sm:border-b sm:border-gray-200/70 sm:dark:border-white/10",children:m.jsxs("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 pt-3 sm:py-4 space-y-2 sm:space-y-3",children:[m.jsxs("div",{className:"flex items-center sm:items-start justify-between gap-3 sm:gap-4",children:[m.jsx("div",{className:"min-w-0",children:m.jsxs("div",{className:"min-w-0",children:[m.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[m.jsx("h1",{className:"text-lg font-semibold tracking-tight text-gray-900 dark:text-white",children:"Recorder"}),m.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[m.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-gray-100/80 px-2 py-1 text-[11px] font-semibold text-gray-900 ring-1 ring-gray-200/60 dark:bg-white/10 dark:text-gray-100 dark:ring-white/10",title:"online",children:[m.jsx(WM,{className:"size-4 opacity-80"}),m.jsx("span",{className:"tabular-nums",children:Pe})]}),m.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-gray-100/80 px-2 py-1 text-[11px] font-semibold text-gray-900 ring-1 ring-gray-200/60 dark:bg-white/10 dark:text-gray-100 dark:ring-white/10",title:"Watched online",children:[m.jsx(Su,{className:"size-4 opacity-80"}),m.jsx("span",{className:"tabular-nums",children:Xt})]}),m.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-gray-100/80 px-2 py-1 text-[11px] font-semibold text-gray-900 ring-1 ring-gray-200/60 dark:bg-white/10 dark:text-gray-100 dark:ring-white/10",title:"Fav online",children:[m.jsx(_u,{className:"size-4 opacity-80"}),m.jsx("span",{className:"tabular-nums",children:Wt})]}),m.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-gray-100/80 px-2 py-1 text-[11px] font-semibold text-gray-900 ring-1 ring-gray-200/60 dark:bg-white/10 dark:text-gray-100 dark:ring-white/10",title:"Like online",children:[m.jsx($M,{className:"size-4 opacity-80"}),m.jsx("span",{className:"tabular-nums",children:_i})]})]}),m.jsx("div",{className:"hidden sm:block text-[11px] text-gray-500 dark:text-gray-400",children:ut})]}),m.jsxs("div",{className:"sm:hidden mt-1 w-full",children:[m.jsx("div",{className:"text-[11px] text-gray-500 dark:text-gray-400",children:ut}),m.jsxs("div",{className:"mt-2 flex items-stretch gap-2",children:[g?m.jsx(kA,{mode:"inline",className:"flex-1"}):m.jsx("div",{className:"flex-1"}),m.jsx(ri,{variant:"secondary",onClick:()=>wt(!0),className:"px-3 shrink-0",children:"Cookies"}),m.jsx(ri,{variant:"secondary",onClick:r,className:"px-3 shrink-0",children:"Abmelden"})]})]})]})}),m.jsxs("div",{className:"hidden sm:flex items-center gap-2 h-full",children:[g?m.jsx(kA,{mode:"inline"}):null,m.jsx(ri,{variant:"secondary",onClick:()=>wt(!0),className:"h-9 px-3",children:"Cookies"}),m.jsx(ri,{variant:"secondary",onClick:r,className:"h-9 px-3",children:"Abmelden"})]})]}),m.jsxs("div",{className:"grid gap-2 sm:grid-cols-[1fr_auto] sm:items-stretch",children:[m.jsxs("div",{className:"relative",children:[m.jsx("label",{className:"sr-only",children:"Source URL"}),m.jsx("input",{value:re,onChange:ue=>J(ue.target.value),placeholder:"https://…",className:"block w-full rounded-lg px-3 py-2.5 text-sm bg-white text-gray-900 shadow-sm ring-1 ring-gray-200 focus:outline-none focus:ring-2 focus:ring-indigo-500 dark:bg-white/10 dark:text-white dark:ring-white/10"})]}),m.jsx(ri,{variant:"primary",onClick:On,disabled:!Ki,className:"w-full sm:w-auto rounded-lg",children:"Start"})]}),ke?m.jsx("div",{className:"rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200",children:m.jsxs("div",{className:"flex items-start justify-between gap-3",children:[m.jsx("div",{className:"min-w-0 break-words",children:ke}),m.jsx("button",{type:"button",className:"shrink-0 rounded px-2 py-1 text-xs font-medium text-red-700 hover:bg-red-100 dark:text-red-200 dark:hover:bg-white/10",onClick:()=>De(null),"aria-label":"Fehlermeldung schließen",title:"Schließen",children:"✕"})]})}):null,Ts(re)&&!Wi(kt)?m.jsxs("div",{className:"text-xs text-amber-700 dark:text-amber-300",children:["⚠️ Für Chaturbate werden die Cookies ",m.jsx("code",{children:"cf_clearance"})," und ",m.jsx("code",{children:"sessionId"})," benötigt."]}):null,Ue?m.jsx("div",{className:"pt-1",children:m.jsx(qh,{label:"Starte Download…",indeterminate:!0})}):null,m.jsx("div",{className:"hidden sm:block pt-2",children:m.jsx(cx,{tabs:ei,value:Zt,onChange:Et,ariaLabel:"Tabs",variant:"barUnderline"})})]})}),m.jsx("div",{className:"sm:hidden sticky top-0 z-20 border-b border-gray-200/70 bg-white/70 backdrop-blur dark:border-white/10 dark:bg-gray-950/60",children:m.jsx("div",{className:"mx-auto max-w-7xl px-4 pt-0 pb-2",children:m.jsx(cx,{tabs:ei,value:Zt,onChange:Et,ariaLabel:"Tabs",variant:"barUnderline"})})}),m.jsxs("main",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-2 space-y-2",children:[Zt==="running"?m.jsx(fH,{jobs:Ct,modelsByKey:pt,pending:pi,onOpenPlayer:Lt,onStopJob:Nn,onToggleFavorite:Pn,onToggleLike:_n,onToggleWatch:me,onAddToDownloads:Zs,blurPreviews:!!Te.blurPreviews}):null,Zt==="finished"?m.jsx(U3,{jobs:W,modelsByKey:pt,doneJobs:Z,doneTotal:le,page:oe,pageSize:v,onPageChange:F,onOpenPlayer:Lt,onDeleteJob:ln,onToggleHot:un,onToggleFavorite:Pn,onToggleLike:_n,onToggleWatch:me,onKeepJob:Is,blurPreviews:!!Te.blurPreviews,teaserPlayback:Te.teaserPlayback??"hover",teaserAudio:!!Te.teaserAudio,assetNonce:V,sortMode:S,onSortModeChange:ue=>{w(ue),F(1)},loadMode:"paged"}):null,Zt==="models"?m.jsx(xH,{}):null,Zt==="categories"?m.jsx($H,{}):null,Zt==="settings"?m.jsx(UO,{onAssetsGenerated:ie}):null]}),m.jsx(DO,{open:dt,onClose:()=>wt(!1),initialCookies:Ge,onApply:ue=>{const pe=Jm(Object.fromEntries(ue.map(xe=>[xe.name,xe.value])));Tt(pe),Cn("/api/cookies",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cookies:pe})}).catch(()=>{})}}),m.jsx(RH,{open:!!ct,modelKey:ct,onClose:()=>St(null),onOpenPlayer:Lt,runningJobs:Ct,cookies:kt,blurPreviews:Te.blurPreviews,onToggleHot:un,onDelete:Mn,onToggleFavorite:Pn,onToggleLike:_n,onToggleWatch:me}),Dt?m.jsx(aH,{job:Dt,modelKey:z??void 0,modelsByKey:pt,expanded:Pi,onToggleExpand:()=>Jt(ue=>!ue),onClose:()=>{yi(null),gt(null)},startAtSec:ki??void 0,isHot:Os(Dt.output||"").startsWith("HOT "),isFavorite:!!Xe?.favorite,isLiked:Xe?.liked===!0,isWatching:!!Xe?.watching,onKeep:Is,onDelete:Mn,onToggleHot:un,onToggleFavorite:Pn,onToggleLike:_n,onStopJob:Nn,onToggleWatch:me},[String(Dt?.id??""),Os(Dt.output||""),String(V)].join("::")):null]})]}):m.jsx(KH,{onLoggedIn:n}):m.jsx("div",{className:"min-h-[100dvh] grid place-items-center",children:"Lade…"})}IA.createRoot(document.getElementById("root")).render(m.jsx(b.StrictMode,{children:m.jsx(I3,{position:"top-right",maxToasts:3,defaultDurationMs:3500,children:m.jsx(ZH,{})})})); diff --git a/frontend/src/components/ui/CategoriesTab.tsx b/frontend/src/components/ui/CategoriesTab.tsx index 03c9f88..999e31a 100644 --- a/frontend/src/components/ui/CategoriesTab.tsx +++ b/frontend/src/components/ui/CategoriesTab.tsx @@ -62,11 +62,11 @@ function modelKeyFromFilename(fileOrPath: string): string | null { return stem ? stem.trim() : null } -// ✅ passt zu Backend: generated/meta//thumbs.webp +// ✅ passt zu Backend: generated/meta//preview.webp function thumbUrlFromOutput(output: string): string | null { const id = assetIdFromOutput(output) if (!id) return null - return `/generated/meta/${encodeURIComponent(id)}/thumbs.webp` + return `/generated/meta/${encodeURIComponent(id)}/preview.webp` } async function ensureCover(category: string, thumbPath: string, modelName: string | null, refresh: boolean) { diff --git a/frontend/src/components/ui/Downloads.tsx b/frontend/src/components/ui/Downloads.tsx index cc607bd..8d9b74b 100644 --- a/frontend/src/components/ui/Downloads.tsx +++ b/frontend/src/components/ui/Downloads.tsx @@ -108,9 +108,9 @@ const jobThumbsWebpCandidates = (job: RecordJob): string[] => { ] const base = [ - j.previewBaseUrl ? `${String(j.previewBaseUrl).replace(/\/+$/, '')}/thumbs.webp` : '', - j.assetBaseUrl ? `${String(j.assetBaseUrl).replace(/\/+$/, '')}/thumbs.webp` : '', - j.thumbsBaseUrl ? `${String(j.thumbsBaseUrl).replace(/\/+$/, '')}/thumbs.webp` : '', + j.previewBaseUrl ? `${String(j.previewBaseUrl).replace(/\/+$/, '')}/preview.webp` : '', + j.assetBaseUrl ? `${String(j.assetBaseUrl).replace(/\/+$/, '')}/preview.webp` : '', + j.thumbsBaseUrl ? `${String(j.thumbsBaseUrl).replace(/\/+$/, '')}/preview.webp` : '', ] return [...direct, ...base] diff --git a/frontend/src/components/ui/ModelPreview.tsx b/frontend/src/components/ui/ModelPreview.tsx index 59c2d69..2d4b245 100644 --- a/frontend/src/components/ui/ModelPreview.tsx +++ b/frontend/src/components/ui/ModelPreview.tsx @@ -320,7 +320,7 @@ export default function ModelPreview({ else setApiImgError(false) }} onError={() => { - // 1) Wenn direkte thumbs.webp fehlschlägt -> auf API-Fallback umschalten + // 1) Wenn direkte preview.webp fehlschlägt -> auf API-Fallback umschalten if (useDirectThumb) { setDirectImgError(true) return diff --git a/frontend/src/components/ui/Player.tsx b/frontend/src/components/ui/Player.tsx index 4df1482..9d629cb 100644 --- a/frontend/src/components/ui/Player.tsx +++ b/frontend/src/components/ui/Player.tsx @@ -411,7 +411,7 @@ export default function Player({ // Vorschaubild oben const previewA = React.useMemo( - () => apiUrl(`/api/preview?id=${encodeURIComponent(previewId)}&file=thumbs.webp`), + () => apiUrl(`/api/preview?id=${encodeURIComponent(previewId)}&file=preview.webp`), [previewId] )