@serifpersia/dango 3.3.4 → 3.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/client/dist/assets/AnimeCard-CXx2EIN7.js +1 -0
- package/client/dist/assets/{AnimeInfo-0huPAq0O.js → AnimeInfo-C6ehrfYW.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-Dqr5QH6R.js → AnimeInfoPage-pgnMg0On.js} +2 -2
- package/client/dist/assets/{Asmr-B6ZiqkmU.js → Asmr-DfA8xB-U.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-Cqsoo3XC.js → AsmrResetProgressModal-QUNnEh9C.js} +1 -1
- package/client/dist/assets/AvSyncCalibrator-Bs4iejCG.js +10 -0
- package/client/dist/assets/Home-Csx6zT32.js +1 -0
- package/client/dist/assets/{Insights-ZlgPrzGD.js → Insights-MW8oRqeX.js} +1 -1
- package/client/dist/assets/{LibraryListPage-CCiee-Ot.js → LibraryListPage-VYaHXgXt.js} +1 -1
- package/client/dist/assets/{ListeningList-ctAz_6Zi.js → ListeningList-BzbQwmh0.js} +1 -1
- package/client/dist/assets/{Manga-BI9WMTx5.js → Manga-223panCD.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-DcrEr7Sk.js → MangaInfoPage-DBqX-Ord.js} +1 -1
- package/client/dist/assets/{MangaReadPage-SYg63m48.js → MangaReadPage-DuXdVyTd.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-DX-1PS4h.js → MangaResetProgressModal-6C3iaR6g.js} +1 -1
- package/client/dist/assets/{Mature-Dqh_9SA3.js → Mature-3VlywJMR.js} +1 -1
- package/client/dist/assets/{MediaCard-Be1ST9oj.js → MediaCard-xfJv6irD.js} +1 -1
- package/client/dist/assets/{Music-zsPwT8_5.js → Music-DkIeCRq1.js} +1 -1
- package/client/dist/assets/{OptionListMenu-Drc_vybW.js → OptionListMenu-JQ_--ggT.js} +1 -1
- package/client/dist/assets/Player-Czg_D7FN.js +56 -0
- package/client/dist/assets/{PlayerSettings-Cwoji-P7.js → PlayerSettings-KrFECely.js} +1 -1
- package/client/dist/assets/{QueueOptionsButton-B6BMq66e.js → QueueOptionsButton-BKNDfpCl.js} +1 -1
- package/client/dist/assets/{QueueRail-VxpUDBSm.js → QueueRail-Cgljhm64.js} +1 -1
- package/client/dist/assets/{Radio-B2Q_Egj7.js → Radio-wbxhaiqy.js} +1 -1
- package/client/dist/assets/{ReadingList-O0QPwXu7.js → ReadingList-DNJAx_LW.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-CR_ovLAu.js → ResetProgressModal-By-iSYwL.js} +1 -1
- package/client/dist/assets/{Search-C8e2nlDD.js → Search-63TcSgOa.js} +1 -1
- package/client/dist/assets/{Settings-BgPWBl2V.js → Settings-BeS0llCE.js} +1 -1
- package/client/dist/assets/{SkeletonGrid-CtHKKMLj.js → SkeletonGrid-CnE_aoEU.js} +1 -1
- package/client/dist/assets/{Trackers-Bfoiyuzy.js → Trackers-ACFHfLXZ.js} +1 -1
- package/client/dist/assets/Tv-BCmNLUsp.js +4 -0
- package/client/dist/assets/{TvInfo-D_scgw_h.js → TvInfo-fFNHV1RJ.js} +1 -1
- package/client/dist/assets/{TvPopup-YTI7dEbJ.js → TvPopup-DYKTHRrD.js} +1 -1
- package/client/dist/assets/{TvSearch-CxU33UOf.js → TvSearch-CpenLEBz.js} +1 -1
- package/client/dist/assets/TvWatchlist-CTUZAvfa.js +1 -0
- package/client/dist/assets/{Watchlist-P6YMZUdF.js → Watchlist-B10pIG1F.js} +1 -1
- package/client/dist/assets/{hls-C4cG9wQw.js → hls-Cbou9Eb-.js} +1 -1
- package/client/dist/assets/index-CfvzoNYQ.js +178 -0
- package/client/dist/assets/{useAnimeInfoData-DeuwDSnI.js → useAnimeInfoData-D-vEehTG.js} +1 -1
- package/client/dist/assets/{useAsmr-CbMVRjmV.js → useAsmr-B-3EYd-B.js} +1 -1
- package/client/dist/assets/{useAsmrPopup-D91Q3CBg.js → useAsmrPopup-D9BxuTDg.js} +1 -1
- package/client/dist/assets/{useMangaLibrary-BPvFb1lU.js → useMangaLibrary-DtRKgk2x.js} +1 -1
- package/client/dist/assets/{useMangaPopup-BOL2mQJs.js → useMangaPopup-BNWJ5pR2.js} +1 -1
- package/client/dist/assets/{useProviders-BsRGONMA.js → useProviders-jxh6fvMH.js} +1 -1
- package/client/dist/assets/{useTv-D37MfTHA.js → useTv-CP4mofvR.js} +1 -1
- package/client/dist/assets/{useTvLibrary-Cwxgy_Bg.js → useTvLibrary-DeGkJuvp.js} +1 -1
- package/client/dist/index.html +1 -1
- package/package.json +2 -2
- package/server/dist/controllers/tv-library.controller.js +9 -5
- package/server/dist/repositories/tv.repository.js +10 -8
- package/server/dist/sync.js +19 -1
- package/server/package.json +1 -1
- package/client/dist/assets/AnimeCard-B5A20jAI.js +0 -1
- package/client/dist/assets/AvSyncCalibrator-C8ZoIwMY.js +0 -10
- package/client/dist/assets/Home-thJhPfs1.js +0 -1
- package/client/dist/assets/Player-BEtAYps2.js +0 -56
- package/client/dist/assets/Tv-Ca0fCdko.js +0 -3
- package/client/dist/assets/TvWatchlist-B4X1fWEH.js +0 -1
- package/client/dist/assets/index-IZgh1beL.js +0 -178
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PlayerSettings-Cwoji-P7.js","assets/vendor-core-8R2fFbyN.js","assets/vendor-icons-CDMuNDeL.js","assets/OptionListMenu-Drc_vybW.js","assets/AvSyncCalibrator-C8ZoIwMY.js","assets/index-IZgh1beL.js","assets/vendor-query-BXRECSI6.js","assets/index-CUm1meqr.css","assets/AvSyncCalibrator-C1_iBSyL.css","assets/PlayerSettings-Bj6SsmQ2.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{g as Dt,h as x,u as r,P as xr,z as Pr,d as Q,A as f,q,y as Ar,T as ot,n as Br,a as Ir,c as Lr,_ as Dr,S as St}from"./vendor-core-8R2fFbyN.js";import{_ as ir,S as _t,q as Ie,z as Ve,N as $r,j as Fr,k as Or,l as Wr,m as Vr,d as Ur,M as Xe,B as pt,O as Qr,f as qr}from"./index-IZgh1beL.js";import{u as lr,b as nr,a as qt}from"./vendor-query-BXRECSI6.js";import{C as zr,S as Gr,U as Hr,a as Kr,p as zt,s as jr,u as Yr,b as Jr,c as Xr,d as sr,f as or,e as Zr,g as en,h as tn,r as rn,l as We,E as nn,i as sn,j as u,k as on,A as an,P as ln,m as cn}from"./AvSyncCalibrator-C8ZoIwMY.js";import{I as F}from"./vendor-icons-CDMuNDeL.js";import{l as un}from"./hls-C4cG9wQw.js";import{u as dn}from"./useMatureConsent-CT7-KfzG.js";import{u as pn}from"./useIsMobile-Dm_b6Ob3.js";import{s as Ze,Q as mn}from"./QueueRail-VxpUDBSm.js";import{u as hn,Q as fn}from"./QueueOptionsButton-B6BMq66e.js";import{u as cr}from"./useProviders-BsRGONMA.js";import{A as vn}from"./AnimeMetaDetails-BPvv5xIl.js";import{S as gn}from"./SynopsisText-BcpwT5iw.js";import"./vendor-ui-CUDCvRS_.js";const bn={soft:"Softsub",hard:"Hardsub",mixed:"Mixed"},yn={direct:"Direct",embed:"Embed",cookie:"Needs cookie"},Sn=["direct","cookie","embed"],En="_controlsOverlay_1b7ea_1",wn="_hidden_1b7ea_21",kn="_topControls_1b7ea_27",Tn="_backBtn_1b7ea_47",Cn="_videoTitleInfo_1b7ea_67",Mn="_animeTitle_1b7ea_73",Rn="_episodeNumber_1b7ea_81",_n="_bottomControls_1b7ea_89",Nn="_progressBarContainer_1b7ea_108",xn="_progressBar_1b7ea_108",Pn="_thumb_1b7ea_127",An="_scrubbing_1b7ea_142",Bn="_watchedBar_1b7ea_146",In="_bufferedBar_1b7ea_147",Ln="_timeBubble_1b7ea_185",Dn="_skipSegment_1b7ea_219",$n="_op_1b7ea_229",Fn="_ed_1b7ea_232",On="_recap_1b7ea_235",Wn="_bottomControlsRow_1b7ea_239",Vn="_leftControls_1b7ea_247",Un="_rightControls_1b7ea_248",Qn="_controlBtn_1b7ea_255",qn="_theaterBtn_1b7ea_296",zn="_nextEpisodeBtn_1b7ea_300",Gn="_active_1b7ea_317",Hn="_timeDisplay_1b7ea_321",Kn="_skipControls_1b7ea_329",jn="_skipBtn_1b7ea_335",Yn="_volumeContainer_1b7ea_376",Jn="_volumeSlider_1b7ea_382",Xn="_playerPageLayout_1b7ea_440",Zn="_videoPlayerWrapper_1b7ea_444",es="_playerInfoContainer_1b7ea_449",ts="_visible_1b7ea_566",rs="_shortcuts_1b7ea_584",E={controlsOverlay:En,hidden:wn,topControls:kn,backBtn:Tn,videoTitleInfo:Cn,animeTitle:Mn,episodeNumber:Rn,bottomControls:_n,progressBarContainer:Nn,progressBar:xn,thumb:Pn,scrubbing:An,watchedBar:Bn,bufferedBar:In,timeBubble:Ln,skipSegment:Dn,op:$n,ed:Fn,recap:On,bottomControlsRow:Wn,leftControls:Vn,rightControls:Un,controlBtn:Qn,theaterBtn:qn,nextEpisodeBtn:zn,active:Gn,timeDisplay:Hn,skipControls:Kn,skipBtn:jn,volumeContainer:Yn,volumeSlider:Jn,playerPageLayout:Xn,videoPlayerWrapper:Zn,playerInfoContainer:es,visible:ts,shortcuts:rs},ns=Pr(()=>ir(()=>import("./PlayerSettings-Cwoji-P7.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),ss=({player:n,isAutoplayEnabled:v,onAutoplayChange:w,showNextEpisodeButton:K,onNextEpisode:g,videoSources:T,selectedSource:S,selectedLink:P,onSourceChange:R,skipIntervals:ie,animeTitle:ye,episodeNumber:e,isTheaterMode:b,onTheaterModeToggle:O,anime4kEnabled:W,onAnime4kToggle:le,anime4kSupported:z,anime4kProfile:ve,onAnime4kProfileChange:A,anime4kInitializing:D,anime4kError:Le,videoDelayEnabled:Ue,onVideoDelayToggle:a,videoDelayMs:h,onVideoDelayChange:k,onCalibrateAvSync:Se,fallbackChoice:De,onFallbackChoiceChange:Pe,children:Ae,overlays:Qe,isInteractingExtra:ee=!1,className:Re,hideChrome:l=!1})=>{const{state:o,refs:d,actions:p}=n,{showSettings:B}=o,{setShowSettings:V,setShowVolumeSlider:j}=p,te=Dt.useRef(null),Ee=Dt.useRef(null);x(()=>{const m=_=>{te.current&&!te.current.contains(_.target)&&Ee.current&&!Ee.current.contains(_.target)&&B&&V(!1)};return B&&document.addEventListener("mousedown",m),()=>{document.removeEventListener("mousedown",m)}},[B,V]);const we=Dt.useRef(null),qe=m=>{d.videoRef.current&&(d.videoRef.current.volume=m,d.videoRef.current.muted=m===0,localStorage.setItem("playerVolume",m.toString()))},ze=m=>{!d.videoRef.current||isNaN(o.duration)||o.duration===0||(d.videoRef.current.currentTime=m*o.duration,p.sendProgressUpdate(!1,!0))},et=()=>{d.videoRef.current&&(p.setIsScrubbing(!0),p.wasPlayingBeforeScrub.current=!d.videoRef.current.paused,d.videoRef.current.pause())},G=m=>{!d.videoRef.current||!o.duration||(d.videoRef.current.currentTime=m*o.duration)},Ge=()=>{p.setIsScrubbing(!1),p.wasPlayingBeforeScrub.current&&d.videoRef.current?.play()},at=m=>{if(!d.videoRef.current)return;p.setActiveSubtitleTrack(m);try{if(m===null||m==="off")localStorage.setItem("playerSubtitlesEnabled","false");else{localStorage.setItem("playerSubtitlesEnabled","true");const I=o.availableSubtitles.find(Y=>Y.label===m||Y.lang===m);I?localStorage.setItem("playerLastSubtitle",jr(I)):localStorage.setItem("playerLastSubtitle",m)}}catch{}let _=!1;Array.from(d.videoRef.current.textTracks).forEach(I=>{const rt=m!==null&&m!=="off"&&(I.language===m||I.label===m)&&!_;I.mode=rt?"showing":"hidden",rt&&(_=!0)})},re=o.activeSubtitleTrack!==null&&o.activeSubtitleTrack!=="off",pe=()=>{if(!d.videoRef.current)return;if(re){at("off");return}if(o.availableSubtitles.length===0)return;let m=null;try{m=localStorage.getItem("playerLastSubtitle")}catch{}const _=zt(o.availableSubtitles,{lastKey:m,enabled:!0});if(_<0)return;const I=o.availableSubtitles[_];at(I.label||I.lang)},He=()=>o.isMuted||o.volume===0?r(F,{name:"volume-mute"}):o.volume<.5?r(F,{name:"volume-down"}):r(F,{name:"volume-up"}),tt=r("div",{className:`${E.controlsOverlay} ${!o.showControls&&!B&&!o.isScrubbing?E.hidden:""} `,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none"},children:r("div",{className:E.topControls,onClick:m=>m.stopPropagation(),children:[r("button",{className:E.backBtn,onClick:m=>{m.stopPropagation(),window.history.back()},title:"Back","aria-label":"Back",children:r(F,{name:"chevron-left"})}),r("div",{className:E.videoTitleInfo,children:[r("span",{className:E.animeTitle,children:ye}),e&&r("span",{className:E.episodeNumber,children:["Episode ",e]})]})]})}),ht=r(zr,{isPlaying:o.isPlaying,onTogglePlay:p.togglePlay,onSkipBack:()=>p.seek(-10),onSkipForward:()=>p.seek(10)}),ne=r("div",{className:`${E.controlsOverlay} ${!o.showControls&&!B&&!o.isScrubbing?E.hidden:""} `,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:r("div",{className:E.bottomControls,"data-speed-boost-ignore":"true",onClick:m=>m.stopPropagation(),children:[r(Gr,{classes:{container:E.progressBarContainer,scrubbing:E.scrubbing,timeBubble:E.timeBubble,bar:E.progressBar,buffered:E.bufferedBar,watched:E.watchedBar,thumb:E.thumb},videoRef:d.videoRef,duration:o.duration,formatTime:p.formatTime,isScrubbing:o.isScrubbing,onSeek:ze,onScrubStart:et,onScrubMove:G,onScrubEnd:Ge,timeLabelRef:we,children:[o.duration>0&&n.state.currentSkipInterval&&r("div",{className:`${E.skipSegment} ${E[n.state.currentSkipInterval.skip_type]} `,style:{left:`${n.state.currentSkipInterval.start_time/o.duration*100}% `,width:`${(n.state.currentSkipInterval.end_time-n.state.currentSkipInterval.start_time)/o.duration*100}% `}}),ie.map(m=>{const _=m.start_time/o.duration*100,I=(m.end_time-m.start_time)/o.duration*100;return r("div",{className:`${E.skipSegment} ${E[m.skip_type]} `,style:{left:`${_}% `,width:`${I}% `},title:m.skip_type.toUpperCase()},m.skip_id)})]}),r("div",{className:E.bottomControlsRow,children:[r("div",{className:E.leftControls,children:[r("button",{className:E.controlBtn,onClick:p.togglePlay,"aria-label":o.isPlaying?"Pause":"Play",children:o.isPlaying?r(F,{name:"pause"}):r(F,{name:"play"})}),r(Hr,{muted:o.isMuted,volume:o.volume,volumeIcon:He(),buttonClassName:E.controlBtn,onToggleMute:p.toggleMute,onVolumeChange:qe,onExpandedChange:m=>j(m)}),r("span",{className:E.timeDisplay,ref:we,children:[p.formatTime(0)," / ",p.formatTime(o.duration)]}),o.currentSkipInterval&&!o.isAutoSkipEnabled&&r("button",{className:E.controlBtn,onClick:()=>{d.videoRef.current&&o.currentSkipInterval&&(d.videoRef.current.currentTime=o.currentSkipInterval.end_time,p.setCurrentSkipInterval(null))},children:["Skip ",o.currentSkipInterval.skip_type==="op"?"Opening":"Ending"]})]}),r("div",{className:E.rightControls,children:[r("div",{className:E.skipControls,children:K&&r("button",{className:E.nextEpisodeBtn,onClick:g,title:"Play next episode",children:"Next EP"})}),r("button",{className:`${E.controlBtn} ${re?E.active:""}`,onClick:pe,title:re?"Disable Subtitles":"Enable Subtitles","aria-label":"Toggle Subtitles",children:r(F,{name:"closed-captioning",size:22})}),r("button",{ref:Ee,className:`${E.controlBtn} ${B?E.active:""} `,onClick:()=>V(!B),"aria-label":"Settings",children:r(F,{name:"cog"})}),r("button",{className:`${E.controlBtn} ${E.theaterBtn} ${b?E.active:""} `,onClick:m=>{m.stopPropagation(),O()},title:b?"Exit Theater Mode":"Theater Mode","aria-label":b?"Exit Theater Mode":"Theater Mode",children:r(F,{name:"tv"})}),r("button",{className:E.controlBtn,onClick:p.toggleFullscreen,"aria-label":o.isFullscreen?"Exit Fullscreen":"Fullscreen",children:o.isFullscreen?r(F,{name:"compress"}):r(F,{name:"expand"})})]})]})]})}),Ke=r(xr,{fallback:null,children:r(ns,{ref:te,isOpen:B,onClose:()=>V(!1),videoSources:T,currentSource:S,currentLink:P,onSourceChange:R,subtitles:o.availableSubtitles,activeSubtitleTrack:o.activeSubtitleTrack,onSubtitleChange:at,subtitleSettings:{fontSize:o.subtitleFontSize,position:o.subtitlePosition,bgOpacity:o.subtitleBgOpacity,bgColor:o.subtitleBgColor,textColor:o.subtitleTextColor,edge:o.subtitleEdge,bold:o.subtitleBold},onSubtitleSettingsChange:(m,_)=>{const I=(Y,rt)=>{try{localStorage.setItem(Y,String(rt))}catch{}};switch(m){case"fontSize":p.setSubtitleFontSize(_),I("subtitleFontSize",_);break;case"position":p.setSubtitlePosition(_),I("subtitlePosition",_);break;case"bgOpacity":p.setSubtitleBgOpacity(_),I("subtitleBgOpacity",_);break;case"bgColor":p.setSubtitleBgColor(_),I("subtitleBgColor",_);break;case"textColor":p.setSubtitleTextColor(_),I("subtitleTextColor",_);break;case"edge":p.setSubtitleEdge(_),I("subtitleEdge",_);break;case"bold":p.setSubtitleBold(_),I("subtitleBold",_);break}},useNativeControls:o.useNativeControls,onNativeControlsToggle:p.setUseNativeControls,anime4kEnabled:W,onAnime4kToggle:le,anime4kSupported:z,anime4kProfile:ve,onAnime4kProfileChange:A,anime4kInitializing:D,anime4kError:Le,videoDelayEnabled:Ue,onVideoDelayToggle:a,videoDelayMs:h,onVideoDelayChange:k,onCalibrateAvSync:Se,isAutoSkipEnabled:o.isAutoSkipEnabled,onAutoSkipChange:m=>{p.setIsAutoSkipEnabled(m);try{localStorage.setItem("autoSkipEnabled",m.toString())}catch{}},isAutoplayEnabled:v,onAutoplayChange:w,fallbackChoice:De,onFallbackChoiceChange:Pe})});return r(Kr,{player:n,topBar:tt,centerControls:ht,bottomBar:ne,settingsPanel:Ke,overlays:Qe,isInteracting:ee,className:Re,chromeDisabled:l,children:Ae})},os=({count:n=3})=>r("section",{className:Ze.section,children:[r("div",{className:Ze.header,children:r("button",{className:Ze.headerToggle,disabled:!0,children:[r("span",{className:Ze.title,children:r(_t,{width:"60px",height:"1.2rem",variant:"text"})}),r(F,{name:"chevron-down",style:{opacity:.3}})]})}),r("div",{className:Ze.list,children:Array.from({length:n}).map((v,w)=>r("div",{className:Ze.item,style:{pointerEvents:"none"},children:[r("div",{className:Ze.dragHandle,style:{opacity:.2},children:r(_t,{width:"16px",height:"16px",variant:"rectangular"})}),r("div",{className:Ze.thumbnail,style:{overflow:"hidden",background:"transparent"},children:r(_t,{width:"100%",height:"100%",variant:"rectangular"})}),r("div",{className:Ze.meta,children:[r(_t,{width:"80%",height:"1.2rem",variant:"text",className:"mb-2"}),r(_t,{width:"40%",height:"0.8rem",variant:"rectangular",style:{borderRadius:"var(--radius-sm)"}})]})]},w))})]}),as="_sourceSelectionContainer_c5tub_76",is="_providerSelectContainer_c5tub_89",ls="_providerSelect_c5tub_89",cs="_sourceSelect_c5tub_76",us="_sourceButtons_c5tub_145",ds="_sourceButton_c5tub_145",ps="_active_c5tub_170",mt={sourceSelectionContainer:as,providerSelectContainer:is,providerSelect:ls,sourceSelect:cs,sourceButtons:us,sourceButton:ds,active:ps},ms=({selectedProvider:n,onProviderChange:v,isAdult:w,options:K})=>{const g=K&&K.length>0?K:[],T=w===void 0?g:g.filter(S=>S.mature===w);return r("div",{className:mt.providerSelectContainer,children:[r("h4",{children:"Provider"}),r("select",{className:mt.providerSelect,value:n,onChange:S=>v(S.target.value),children:Sn.map(S=>{const P=T.filter(R=>(R.tier??"direct")===S);return P.length===0?null:r("optgroup",{label:yn[S],children:P.map(R=>r("option",{value:R.value,children:R.sub?`${R.label} (${bn[R.sub]})`:R.label},R.value))},S)})})]})},hs=({videoSources:n,selectedSource:v,selectedLink:w,onSourceChange:K,onLinkChange:g})=>{const T=Array.isArray(n)?n:[];if(T.length===0)return null;const S=v?.type==="iframe"&&(v.links?.length??0)>1;return r("div",{className:mt.sourceSelectionContainer,children:[r("h4",{children:"Source"}),r("div",{className:mt.sourceButtons,children:T.map((P,R)=>r("button",{className:`${mt.sourceButton} ${v?.sourceName===P.sourceName?mt.active:""} `,onClick:()=>K(P),children:P.sourceName},`${P.sourceName}-${R}`))}),S&&r("select",{className:mt.sourceSelect,"aria-label":"Fallback embed quality",value:w?.link??v.links[0]?.link??"",onChange:P=>{const R=v.links.find(ie=>ie.link===P.target.value);R&&g(R)},children:v.links.map(P=>r("option",{value:P.link,children:P.resolutionStr},P.link))})]})},fs=Dt.memo(hs,(n,v)=>n.selectedSource?.sourceName===v.selectedSource?.sourceName&&n.selectedLink?.link===v.selectedLink?.link&&n.videoSources===v.videoSources),vs={low:{sd:1.5,hd:1.3,fhd:1.25},balanced:{sd:2,hd:1.5,fhd:1.25},high:{sd:2.5,hd:2,fhd:1.5},denoise:{sd:1.5,hd:1.5,fhd:1.5}},gs={low:"ModeB",balanced:"ModeA",high:"ModeAA",denoise:"ModeC"},bs=5,ys=15e3,Ss=`
|
|
3
|
-
@group(0) @binding(0) var extTex: texture_external;
|
|
4
|
-
@group(0) @binding(1) var extSamp: sampler;
|
|
5
|
-
struct VSOut {
|
|
6
|
-
@builtin(position) pos: vec4f,
|
|
7
|
-
@location(0) uv: vec2f,
|
|
8
|
-
};
|
|
9
|
-
@vertex
|
|
10
|
-
fn vs(@builtin(vertex_index) idx: u32) -> VSOut {
|
|
11
|
-
var positions = array<vec2f, 6>(
|
|
12
|
-
vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),
|
|
13
|
-
vec2f(-1.0, 1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0)
|
|
14
|
-
);
|
|
15
|
-
var uvs = array<vec2f, 6>(
|
|
16
|
-
vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(0.0, 0.0),
|
|
17
|
-
vec2f(0.0, 0.0), vec2f(1.0, 1.0), vec2f(1.0, 0.0)
|
|
18
|
-
);
|
|
19
|
-
var out: VSOut;
|
|
20
|
-
out.pos = vec4f(positions[idx], 0.0, 1.0);
|
|
21
|
-
out.uv = uvs[idx];
|
|
22
|
-
return out;
|
|
23
|
-
}
|
|
24
|
-
@fragment
|
|
25
|
-
fn fs(@location(0) uv: vec2f) -> @location(0) vec4f {
|
|
26
|
-
return textureSampleBaseClampToEdge(extTex, extSamp, uv);
|
|
27
|
-
}
|
|
28
|
-
`;function Es({videoRef:n,canvasRef:v,profile:w="balanced",delayMs:K=0}){const[g,T]=Q(!1),[S,P]=Q(!1),[R,ie]=Q(!1),[ye,e]=Q(null),[b,O]=Q(0),W=f(0),le=f(null),z=f(null),ve=f(null),A=f(null),D=f(null),Le=f(null),Ue=f(null),a=f(null),h=f(null),k=f(!1),Se=f(-1),De=f(0),Pe=f(K);Pe.current=K;const Ae=f([]),Qe=f(!1),ee=f(!1),Re=f(!1),l=f(null),o=f(-1),d=f(-1),p=f(!1),B=f(0);x(()=>{async function j(){if(typeof navigator>"u"||!navigator.gpu){T(!1);return}try{const te=await navigator.gpu.requestAdapter();T(!!te)}catch{T(!1)}}j()},[]),x(()=>{if(!S||!g)return;let j=!1;const te=++W.current,Ee=G=>{if(G)try{G.close()}catch{}},we=()=>{for(const G of Ae.current)Ee(G.bitmap);Ae.current=[]},qe=G=>Math.max(8,Math.min(40,Math.ceil(G/16.7)+4));function ze(){h.current!==null&&(cancelAnimationFrame(h.current),h.current=null)}async function et(){let G=n.current;const Ge=v.current;if(!G||!Ge||W.current!==te)return;const at=performance.now()+ys;for(;(!G||G.videoWidth===0)&&performance.now()<at;){if(await new Promise(Y=>requestAnimationFrame(Y)),j||W.current!==te)return;G=n.current}if(!G||G.videoWidth===0){!j&&W.current===te&&(e("Timed out waiting for video metadata"),ie(!1),P(!1));return}const re=G.videoWidth,pe=G.videoHeight,He=Math.max(re,pe),tt=window.innerWidth,ht=window.innerHeight,ne=Math.max(tt,ht),Ke=He<ne?ne/He:1,m=vs[w],_=He<=480?m.sd:He<=720?m.hd:He<=1080?m.fhd:1,I=Math.min(_,Ke);Ge.width=Math.round(re*I),Ge.height=Math.round(pe*I),ie(!0),e(null),De.current=0,Se.current=-1,k.current=!1;try{let Y=function(){j||W.current!==te||(ze(),h.current=requestAnimationFrame(()=>{lt()}))};const{ModeA:rt,ModeB:Et,ModeC:it,ModeAA:wt}=await ir(async()=>{const{ModeA:L,ModeB:ce,ModeC:Ne,ModeAA:U}=await import("./index-BOKlZEHq.js").then(ue=>ue.i);return{ModeA:L,ModeB:ce,ModeC:Ne,ModeAA:U}},[]);if(!navigator.gpu)throw new Error("WebGPU not available");const kt=await navigator.gpu.requestAdapter();if(!kt)throw new Error("No GPU adapter found");const M=await kt.requestDevice();if(!M)throw new Error("Failed to get GPU device");const $e=Ge.getContext("webgpu");if(!$e)throw new Error("Failed to get WebGPU context");const nt=navigator.gpu.getPreferredCanvasFormat();$e.configure({device:M,format:nt,alphaMode:"premultiplied"});const me=M.createTexture({size:[re,pe],format:"rgba16float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),je=gs[w],ke=Math.round(re*I),Be=Math.round(pe*I),ft=(()=>{switch(je){case"ModeB":return new Et({device:M,inputTexture:me,nativeDimensions:{width:re,height:pe},targetDimensions:{width:ke,height:Be}});case"ModeC":return new it({device:M,inputTexture:me,nativeDimensions:{width:re,height:pe},targetDimensions:{width:ke,height:Be}});case"ModeAA":return new wt({device:M,inputTexture:me,nativeDimensions:{width:re,height:pe},targetDimensions:{width:ke,height:Be}});default:return new rt({device:M,inputTexture:me,nativeDimensions:{width:re,height:pe},targetDimensions:{width:ke,height:Be}})}})(),_e=ft.getOutputTexture(),vt=M.createSampler({magFilter:"linear",minFilter:"linear"}),gt=M.createShaderModule({code:`
|
|
29
|
-
@group(0) @binding(0) var tex: texture_2d<f32>;
|
|
30
|
-
@group(0) @binding(1) var samp: sampler;
|
|
31
|
-
struct VertexOutput {
|
|
32
|
-
@builtin(position) pos: vec4f,
|
|
33
|
-
@location(0) uv: vec2f,
|
|
34
|
-
}
|
|
35
|
-
@vertex
|
|
36
|
-
fn vs(@builtin(vertex_index) idx: u32) -> VertexOutput {
|
|
37
|
-
var positions = array<vec2f, 6>(
|
|
38
|
-
vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),
|
|
39
|
-
vec2f(-1.0, 1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0)
|
|
40
|
-
);
|
|
41
|
-
var uvs = array<vec2f, 6>(
|
|
42
|
-
vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(0.0, 0.0),
|
|
43
|
-
vec2f(0.0, 0.0), vec2f(1.0, 1.0), vec2f(1.0, 0.0)
|
|
44
|
-
);
|
|
45
|
-
var out: VertexOutput;
|
|
46
|
-
out.pos = vec4f(positions[idx], 0.0, 1.0);
|
|
47
|
-
out.uv = uvs[idx];
|
|
48
|
-
return out;
|
|
49
|
-
}
|
|
50
|
-
@fragment
|
|
51
|
-
fn fs(@location(0) uv: vec2f) -> @location(0) vec4f {
|
|
52
|
-
return textureSample(tex, samp, uv);
|
|
53
|
-
}
|
|
54
|
-
`}),Ye=M.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),Tt=M.createRenderPipeline({layout:M.createPipelineLayout({bindGroupLayouts:[Ye]}),vertex:{module:gt,entryPoint:"vs"},fragment:{module:gt,entryPoint:"fs",targets:[{format:nt}]},primitive:{topology:"triangle-list"}}),Ct=M.createBindGroup({layout:Ye,entries:[{binding:0,resource:_e.createView()},{binding:1,resource:vt}]});try{const L=M.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,externalTexture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),ce=M.createShaderModule({code:Ss}),Ne=M.createRenderPipeline({layout:M.createPipelineLayout({bindGroupLayouts:[L]}),vertex:{module:ce,entryPoint:"vs"},fragment:{module:ce,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-list"}});l.current={pipeline:Ne,layout:L,inputView:me.createView()}}catch{l.current=null}if(W.current!==te){me.destroy(),M.destroy();return}le.current=M,z.current=$e,ve.current=ft,A.current=me,D.current=_e,Le.current=Tt,Ue.current=vt,a.current=Ye,ee.current=!1,Re.current=!1;async function $t(){const L=l.current;if(!L||ee.current)return!1;const ce=n.current;if(!ce)return!1;const Ne=!Re.current;Ne&&M.pushErrorScope("validation");try{const U=M.importExternalTexture({source:ce}),ue=M.createBindGroup({layout:L.layout,entries:[{binding:0,resource:U},{binding:1,resource:vt}]}),Te=M.createCommandEncoder(),C=Te.beginRenderPass({colorAttachments:[{view:L.inputView,loadOp:"load",storeOp:"store"}]});C.setPipeline(L.pipeline),C.setBindGroup(0,ue),C.draw(6),C.end(),M.queue.submit([Te.finish()])}catch{return ee.current=!0,l.current=null,!1}if(Ne){const U=await M.popErrorScope().catch(()=>null);if(U)return console.warn("[anime4k] blit probe failed:",U.message),ee.current=!0,l.current=null,!1;Re.current=!0}return!0}ie(!1);async function lt(){if(j||W.current!==te)return;const L=n.current;if(!L||L.videoWidth===0){Y();return}if(L!==G||L.videoWidth!==re||L.videoHeight!==pe){O(ue=>ue+1);return}if(L.paused||L.ended||document.hidden||L.readyState<HTMLMediaElement.HAVE_CURRENT_DATA){Y();return}const ce=L.getVideoPlaybackQuality().totalVideoFrames;if(ce===d.current){Y();return}if(k.current){Y();return}const Ne=L.currentTime;(L.seeking||o.current>=0&&Math.abs(Ne-o.current)>.5)&&(we(),p.current=!1,B.current=0,d.current=-1),o.current=Ne;const U=Math.max(0,Pe.current||0);U>B.current&&(p.current=!1),k.current=!0;try{const ue=performance.now();let Te=null,C=!1;if(U<=0){Ae.current.length>0&&we(),p.current=!1,B.current=0;let Ce=!1;if(!Qe.current)try{M.queue.copyExternalImageToTexture({source:L},{texture:me},[re,pe]),d.current=ce,Ce=!0}catch(he){if(he instanceof TypeError)Qe.current=!0;else throw he}if(!Ce&&!ee.current&&l.current&&await $t()&&(d.current=ce,Ce=!0),!Ce){const he=await createImageBitmap(L);d.current=ce,M.queue.copyExternalImageToTexture({source:he},{texture:me},[re,pe]),Ee(he)}}else{const Ce=await createImageBitmap(L);d.current=ce;const he=Ae.current;he.push({bitmap:Ce,capture:ue});const Ft=qe(U);for(;he.length>Ft;)Ee(he.shift()?.bitmap);let se=-1;for(let ge=he.length-1;ge>=0;ge--)if(ue-he[ge].capture>=U){se=ge;break}if(se!==-1){for(let Oe=0;Oe<se;Oe++)Ee(he.shift()?.bitmap);const ge=he.shift();ge?(Te=ge.bitmap,p.current=!0,B.current=U):(Te=Ce,C=!0)}else if(!p.current)Te=Ce,C=!0;else{const ge=he.shift();Te=ge?ge.bitmap:Ce,ge||(C=!0)}if(!Te){k.current=!1,Y();return}M.queue.copyExternalImageToTexture({source:Te},{texture:me},[re,pe]),C||Ee(Te)}const Mt=M.createCommandEncoder();await ft.pass(Mt);const Fe=Mt.beginRenderPass({colorAttachments:[{view:$e.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});Fe.setPipeline(Tt),Fe.setBindGroup(0,Ct),Fe.draw(6),Fe.end(),M.queue.submit([Mt.finish()]),Se.current=ce,De.current=0,M.queue.onSubmittedWorkDone().then(()=>{W.current===te&&(k.current=!1)})}catch(ue){if(k.current=!1,De.current+=1,De.current>=bs&&!j&&W.current===te){console.error(ue),e(ue instanceof Error?ue.message:"Render error"),P(!1);return}}Y()}Y()}catch(Y){!j&&W.current===te&&(e(Y instanceof Error?Y.message:"Failed to initialize upscaler"),ie(!1),P(!1))}}return et(),()=>{j=!0,W.current+=1,ze(),we(),A.current&&(A.current.destroy(),A.current=null),D.current&&(D.current.destroy(),D.current=null),le.current&&(le.current.destroy(),le.current=null),ve.current=null,Le.current=null,Ue.current=null,a.current=null,l.current=null,z.current=null,k.current=!1}},[S,g,n,v,w,b]);const V=q(()=>{P(j=>!j)},[]);return{isWebGPUSupported:g,isEnabled:S,isInitializing:R,error:ye,toggle:V}}const ws=()=>localStorage.getItem("preferredMode")==="dub"?"dub":"sub",ks=()=>{const n=localStorage.getItem("preferredProvider");return n&&/^[a-z0-9-]+$/i.test(n)?n:"megaplay"},ur=()=>({showMeta:{},episodes:[],watchedEpisodes:[],watchlistStatus:null,showCombinedDetails:!1,currentMode:ws(),inWatchlist:!1,videoSources:[],selectedSource:null,selectedLink:null,forceNativePlayer:localStorage.getItem("forceNativePlayer")==="true",isAutoplayEnabled:localStorage.getItem("autoplayEnabled")==="true",showResumeModal:!0,resumeTime:0,resumeDuration:0,skipIntervals:[],selectedProvider:ks(),loadingShowData:!0,loadingVideo:!1,loadingDetails:!1,error:null,detailsError:null,showCookieModal:!1,cookieProvider:null});ur();function Ts(n,v){switch(v.type){case"SET_STATE":return{...n,...v.payload};case"SET_MODE":return{...n,currentMode:v.payload,videoSources:[],selectedSource:null,selectedLink:null};case"SET_PROVIDER":return{...n,selectedProvider:v.payload};case"SET_OVERRIDE_SOURCE":return{...n,selectedSource:v.payload?.source??null,selectedLink:v.payload?.link??null};default:return n}}async function ar(n,v,w,K,g=!1){if(!n||!v)throw new Error("Missing params");try{const[T,S,P,R]=await Promise.all([Ie(`/api/video?showId=${n}&episodeNumber=${v}&mode=${w.currentMode}&provider=${w.selectedProvider}`).catch(()=>null),Ie(`/api/episode-progress/${n}/${v}`).catch(()=>null),Ie("/api/settings?key=preferredSource").catch(()=>null),Ie(`/api/skip-times/${n}/${v}`).catch(()=>[])]),ie=P?.value,ye=T?.filter(A=>{const D=A.sourceName.toLowerCase();return w.currentMode==="dub"?D.includes("eng")||D.includes("dub"):D.includes("jpn")||D.includes("sub")||!D.includes("eng")&&!D.includes("dub")})??[],e=ye.length>0?ye:T??[];let b=e.length>0?e[0]:null;if(ie){const A=e.find(D=>D.sourceName===ie);A&&(b=A)}const O=b&&b.links.length>0?b.links.sort((A,D)=>(parseInt(D.resolutionStr)||0)-(parseInt(A.resolutionStr)||0))[0]:null,W=S?.currentTime||0,le=S?.duration||0,ve=(Array.isArray(R)?R:R?.results||[]).map(A=>({skip_id:A.skip_id||"",skip_type:A.skip_type||"",start_time:A.interval?.start_time??A.start_time??0,end_time:A.interval?.end_time??A.end_time??0})).filter(A=>A.end_time>0);return(!T||T.length===0)&&(g||Ve.error(`No video sources found for ${w.selectedProvider}`)),{videoSources:T,selectedSource:b,selectedLink:O,resumeTime:W,resumeDuration:le,showResumeModal:W>5&&b?.type!=="iframe",skipIntervals:ve,fetchedEpisodeNumber:v}}catch(T){const S=T;if(S.message==="AUTH_REQUIRED")return K({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:S.provider}}),{videoSources:[],selectedSource:null,selectedLink:null,resumeTime:0,resumeDuration:0,showResumeModal:!1,skipIntervals:[],fetchedEpisodeNumber:v};throw T}}const Cs=(n,v,w,K)=>{const[g,T]=Ar(Ts,w,l=>({...ur(),showMeta:l?.name?{name:l.name,thumbnail:l.thumbnail,nativeName:l.nativeName,englishName:l.englishName,names:{romaji:l.name||l.englishName,english:l.englishName||l.name,native:l.nativeName}}:{}})),S=lr(),P=f(null),R=f(null),{options:ie}=cr(),ye=ot(()=>ie.filter(l=>(l.kind??"anime")==="anime"),[ie]),e=v||g.initialEpisode,b=f(e);x(()=>{b.current!==e&&(b.current=e,T({type:"SET_STATE",payload:{selectedSource:null,selectedLink:null}}))},[e,T]),x(()=>{n&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(n)&&g.selectedProvider!=="animepahe"&&P.current!==n&&(P.current=n,T({type:"SET_PROVIDER",payload:"animepahe"}))},[n,g.selectedProvider]);const{data:O,isLoading:W,error:le}=hn(n),{data:z}=nr({queryKey:["player-data",n,g.currentMode,g.selectedProvider],queryFn:async()=>{if(!n)throw new Error("No showId");const l=async()=>{try{const V=await Ie(`/api/episodes?showId=${n}&mode=${g.currentMode}&provider=${g.selectedProvider}`);if(V?.episodes?.length)return V}catch{}return null},[o,d,p]=await Promise.all([l(),Ie(`/api/watchlist/check/${n}`).catch(()=>({inWatchlist:!1})),Ie(`/api/watched-episodes/${n}`).catch(()=>[])]),B=o?.episodes?o.episodes.sort((V,j)=>parseFloat(V)-parseFloat(j)):[];return{description:o?.description||"",episodes:B,inWatchlist:d.inWatchlist,watchlistStatus:d.status??null,watchedEpisodes:p}},enabled:!!n});x(()=>{!v&&z?.episodes&&z.episodes.length>0&&!v&&T({type:"SET_STATE",payload:{initialEpisode:z.episodes[0]}})},[z,v]),x(()=>{if(O?.isAdult===void 0)return;const o=new Set(ye.filter(d=>d.mature).map(d=>d.value)).has(g.selectedProvider);if(R.current!==n){if(O.isAdult&&!o){R.current=n;const d=ye.find(p=>p.mature);if(!d)return;T({type:"SET_PROVIDER",payload:d.value}),localStorage.setItem("preferredProvider",d.value)}if(!O.isAdult&&o){R.current=n;const d=ye.find(p=>!p.mature);if(!d)return;T({type:"SET_PROVIDER",payload:d.value}),localStorage.setItem("preferredProvider",d.value)}}},[O?.isAdult,g.selectedProvider,n,ye]),x(()=>{if(!n||!/^dango-mt-\d+$/.test(n)||R.current===`temp:${n}`)return;const l=O?.provider;l&&(R.current=`temp:${n}`,l!==g.selectedProvider&&T({type:"SET_PROVIDER",payload:l}))},[n,O,g.selectedProvider]);const{data:ve,isLoading:A,error:D}=nr({queryKey:["video-sources",n,e,g.selectedProvider,g.currentMode],queryFn:()=>ar(n,e,g,T),enabled:!!n&&!!e&&!(g.showMeta?.isAdult===!0&&!K?.hasMatureConsent)}),Le=!1,{mutateAsync:Ue}=qt({mutationFn:async({wasIn:l,showMeta:o})=>{const d=l?"/api/watchlist/remove":"/api/watchlist/add",p={id:n,name:o.name||o.names?.romaji,thumbnail:o.thumbnail,nativeName:o.names?.native,englishName:o.names?.english,type:o.type,isAdult:o.isAdult},B=await fetch(d,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(p)});if(!B.ok){const V=await B.json().catch(()=>null);throw new Error(V?.error||"Failed to update watchlist")}return!l},onSuccess:l=>{Ve.success(l?"Added to watchlist":"Removed from watchlist"),S.invalidateQueries({queryKey:["player-data",n]}),S.invalidateQueries({queryKey:["show-data",n]}),S.invalidateQueries({queryKey:["watchlist"]})},onError:l=>Ve.error(l instanceof Error?l.message:"Failed to update watchlist")}),a=q(async()=>{!n||!O||await Ue({wasIn:!!z?.inWatchlist,showMeta:O})},[n,O,z?.inWatchlist,Ue]),h=q(async l=>{try{await Ie("/api/settings",{method:"POST",body:JSON.stringify({key:"preferredSource",value:l})})}catch(o){console.error(o)}},[]),{mutateAsync:k,isPending:Se}=qt({mutationFn:async({status:l})=>{if(!n)throw new Error("Missing showId");return await Ie("/api/watchlist/status",{method:"POST",body:JSON.stringify({id:n,status:l})}),l},onSuccess:l=>{T({type:"SET_STATE",payload:{inWatchlist:!0,watchlistStatus:l}}),Ve.success(`Moved to ${l}`),S.invalidateQueries({queryKey:["show-data",n]}),S.invalidateQueries({queryKey:["watchlist"]}),S.invalidateQueries({queryKey:["allContinueWatching"]})},onError:()=>Ve.error("Failed to update watchlist status")}),De=q(async()=>{await k({status:"Completed"})},[k]),{mutateAsync:Pe}=qt({mutationFn:async({episodeNumber:l,duration:o,showMeta:d,episodes:p})=>{await Ie("/api/update-progress",{method:"POST",body:JSON.stringify({showId:n,episodeNumber:l,currentTime:o,duration:o,showName:d.name,showThumbnail:d.thumbnail,nativeName:d.names?.native,englishName:d.names?.english,genres:d.genres?.map(B=>B.name),popularityScore:$r(d.score??d.stats?.averageScore),type:d.type,status:d.status,episodeCount:p.length,isAdult:d.isAdult}),keepalive:!0})},onSuccess:(l,o)=>{Ve.success(`Episode ${o.episodeNumber} marked as watched`),S.invalidateQueries({queryKey:["player-data",n]}),S.invalidateQueries({queryKey:["show-meta",n]}),S.invalidateQueries({queryKey:["video-sources",n,o.episodeNumber]}),S.invalidateQueries({queryKey:["allContinueWatching"]}),S.invalidateQueries({queryKey:["thisWeekSchedule"]})},onError:()=>Ve.error("Failed to mark episode as watched")}),Ae=q(async(l,o)=>{!n||!O||await Pe({episodeNumber:l,duration:o,showMeta:O,episodes:z?.episodes||[]})},[n,O,z?.episodes,Pe]),Qe=q(async()=>{T({type:"SET_STATE",payload:{showCombinedDetails:!g.showCombinedDetails}})},[g.showCombinedDetails]),ee=ot(()=>{const l=le||D,o=l?l.message:null,d=o==="AUTH_REQUIRED"?null:o,p=ve&&ve.fetchedEpisodeNumber===e?ve:null,B=!!ve&&!p;return{...g,currentEpisode:e,showMeta:{...g.showMeta||{},...O||{}},episodes:z?.episodes||[],watchedEpisodes:z?.watchedEpisodes||[],inWatchlist:!!z?.inWatchlist,watchlistStatus:z?.watchlistStatus??g.watchlistStatus??null,videoSources:p?.videoSources||[],selectedSource:g.selectedSource||p?.selectedSource||null,selectedLink:g.selectedLink||p?.selectedLink||null,resumeTime:p?.resumeTime||0,resumeDuration:p?.resumeDuration||0,showResumeModal:g.showResumeModal&&(p?.showResumeModal??!1),skipIntervals:p?.skipIntervals||[],loadingShowData:W,loadingVideo:A||B,loadingDetails:Le,error:d,fetchedEpisodeNumber:p?.fetchedEpisodeNumber}},[g,O,z,ve,W,A,Le,le,D,e]),Re=q((l,o)=>{const d=o||n;if(!d||!l||d===n&&l===e)return;const B=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(d)&&g.selectedProvider!=="animepahe"?"animepahe":g.selectedProvider,V=["video-sources",d,l,B,g.currentMode];S.getQueryState(V)?.status!=="success"&&S.prefetchQuery({queryKey:V,queryFn:()=>ar(d,l,{selectedProvider:B,currentMode:g.currentMode},T,!0),staleTime:300*1e3,gcTime:1800*1e3})},[n,e,S,g,T]);return{state:ee,dispatch:T,toggleWatchlist:a,moveToCompleted:De,setPreferredSource:h,handleToggleDetails:Qe,markEpisodeWatched:Ae,prefetchEpisodeSources:Re,isMarkingWatched:Pe.isPending,isUpdatingWatchlistStatus:Se}},Gt="fallbackChoice";function Ms(){try{const n=localStorage.getItem(Gt);return n==="iframe"||n==="retry"?n:null}catch{return null}}function Rs(n){try{n===null?localStorage.removeItem(Gt):localStorage.setItem(Gt,n)}catch{}}const zs=()=>{const{id:n,episodeNumber:v}=Br(),w=Ir(),K=lr(),g=Lr(),{hasConsent:T,grant:S}=dn(),{options:P}=cr(),R=ot(()=>P.filter(t=>(t.kind??"anime")==="anime"),[P]),ie=ot(()=>R.map(t=>t.value),[R]),ye=ot(()=>new Set(R.filter(t=>t.mature).map(t=>t.value)),[R]),{state:e,dispatch:b,toggleWatchlist:O,moveToCompleted:W,setPreferredSource:le,handleToggleDetails:z,markEpisodeWatched:ve,prefetchEpisodeSources:A,isMarkingWatched:D,isUpdatingWatchlistStatus:Le}=Cs(n,v,g.state||null,{hasMatureConsent:T});x(()=>{if(n&&e.showMeta?.id&&e.showMeta.id!==n){const t=v?`/watch/${e.showMeta.id}/${v}${window.location.search}`:`/watch/${e.showMeta.id}${window.location.search}`;w(t,{replace:!0})}},[n,e.showMeta?.id,v,w]);const Ue=ot(()=>{if(e.showMeta.name)return{name:e.showMeta.name,thumbnail:e.showMeta.thumbnail,names:e.showMeta.names,genres:e.showMeta.genres,score:e.showMeta.score,isAdult:e.showMeta.isAdult}},[e.showMeta.name,e.showMeta.thumbnail,e.showMeta.names,e.showMeta.genres,e.showMeta.score,e.showMeta.isAdult]),a=Yr({skipIntervals:e.skipIntervals,showId:n,episodeNumber:e.currentEpisode?.toString(),episodeCount:e.episodes.length||void 0,sourceType:e.selectedSource?.type,showMeta:Ue}),{refs:h,actions:k}=a,Se=f(null),De=pn(),Pe=f(null),Ae=f(null),Qe=f(null),ee=f(0),Re=f(e.resumeTime),l=f(e.showResumeModal),[o,d]=Q(()=>{try{const t=localStorage.getItem("anime4kProfile");return["low","balanced","high","denoise"].includes(t)?t:"balanced"}catch{return"balanced"}}),[p,B]=Q(()=>{try{const t=Number(localStorage.getItem("playerVideoDelayMs"));if(Number.isFinite(t)&&t>=0&&t<=500)return Math.round(t)}catch{}return 180}),[V,j]=Q(()=>{try{return localStorage.getItem("playerVideoDelayEnabled")==="true"}catch{return!1}}),[te,Ee]=Q(!1),[we,qe]=Q(!1),ze=f(null),et=f(null),G=(t,s)=>{try{localStorage.setItem("playerVideoDelayMs",String(t)),localStorage.setItem("playerVideoDelayEnabled",String(s))}catch{}},Ge=t=>{const s=Math.max(0,Math.min(500,Math.round(t)));B(s);try{localStorage.setItem("playerVideoDelayMs",String(s))}catch{}},at=()=>{ze.current={enabled:V,ms:p},j(!0);try{localStorage.setItem("playerVideoDelayEnabled","true")}catch{}k.setShowSettings(!1),Ee(!0)},re=()=>{const t=ze.current;ze.current=null,t&&(B(t.ms),j(t.enabled),G(t.ms,t.enabled)),qe(!1),Ee(!1)},pe=()=>{ze.current=null,j(!0),G(p,!0),qe(!1),Ee(!1)},He=()=>{if(we){qe(!1);return}const t=h.videoRef.current;t&&!isNaN(t.currentTime)&&(et.current=t.currentTime),qe(!0)},tt=V?p:0,ht=f(null),ne=Es({videoRef:h.videoRef,canvasRef:Ae,profile:o,delayMs:tt}),Ke=ne.isEnabled&&ne.isWebGPUSupported;Jr({videoRef:h.videoRef,canvasRef:ht,delayMs:tt,enabled:V&&!Ke});const m=V&&!Ke,_=Ke||m;x(()=>{Re.current=e.resumeTime,l.current=e.showResumeModal},[e.resumeTime,e.showResumeModal]);const[I,Y]=Q(null),[rt,Et]=Q(!1),[it,wt]=Q(!1),[kt,M]=Q(!1),$e=f(!1),[nt,me]=Q(null),je=f(!1),ke=f([]),Be=f(!1),[ft,_e]=Q(null),[vt,gt]=Q(!1),[Ye,Tt]=Q(!1),[Ct,$t]=Q(()=>Ms()??"ask"),lt=q(t=>{$t(t),Rs(t==="ask"?null:t)},[]),L=f(Ct);L.current=Ct;const ce=f(e.videoSources);ce.current=e.videoSources;const Ne=f(()=>{}),[U,ue]=Q(null),Te=f(v);x(()=>{Te.current!==v&&(Te.current=v,ue(null),me(null),$e.current=!1,qe(!1),Ee(!1))},[v]),x(()=>{je.current=!1,ke.current=[],Be.current=!1,_e(null),gt(!1)},[n,e.currentEpisode]),x(()=>{it||($e.current=!1)},[it]);const{data:C=[],isLoading:Mt}=Fr(),Fe=Or(),Ce=f(Fe);Ce.current=Fe;const he=Wr(),Ft=Vr(),[se,ge]=Q(()=>{try{return localStorage.getItem("playerTheaterMode")==="true"}catch{return!1}});Xr(a,!!e.selectedLink&&!se),x(()=>{try{se?document.body.classList.add("theater-mode"):document.body.classList.remove("theater-mode")}catch(t){console.error(t)}return()=>{try{document.body.classList.remove("theater-mode")}catch(t){console.error(t)}}},[se]),Dr(()=>{if(a.state.isFullscreen||se)return;const t=h.playerContainerRef.current,s=Pe.current;if(!t||!s)return;const i=()=>{const N=t.getBoundingClientRect().height;s.style.height=`${N}px`};i();const c=new ResizeObserver(i);return c.observe(t),()=>c.disconnect()},[a.state.isFullscreen,se,h.playerContainerRef]);const Oe=ot(()=>e.episodes.findIndex(t=>t===e.currentEpisode),[e.episodes,e.currentEpisode]),Ot=Oe>0?e.episodes[Oe-1]:null,Je=Oe>=0&&Oe<e.episodes.length-1?e.episodes[Oe+1]:null,Wt=Oe>-1&&Oe<e.episodes.length-1,dr=e.episodes.length>0&&!!e.currentEpisode&&e.episodes[e.episodes.length-1]===e.currentEpisode,pr=String(e.showMeta.status||"").trim().toLowerCase(),mr=["finished","completed","complete","ended"].some(t=>pr.includes(t)),Ht=e.resumeTime>0&&e.resumeDuration>0&&e.resumeTime>=e.resumeDuration*.8||it,ct=dr&&mr&&Ht,ut=e.showResumeModal&&(ct||!Ht);x(()=>{const t=h.videoRef.current;if(!t)return;let s=!1;for(Se.current&&(Se.current.destroy(),Se.current=null),(e.loadingVideo||e.selectedSource)&&(t.pause(),t.removeAttribute("src"),t.load());t.firstChild;)t.removeChild(t.firstChild);if(we)return t.src="/av-sync-test.mp4",t.play().catch(()=>{k.setShowControls(!0)}),()=>{s=!0};if(!e.selectedSource||!e.selectedLink)return;if(e.selectedSource.type==="iframe"){ee.current=0;return}et.current!=null?(ee.current=et.current,et.current=null):Re.current>5&&!l.current?ee.current=Re.current:l.current&&(ee.current=0);let i=e.selectedLink.link;if(i.startsWith("/api/proxy")||(i=`/api/proxy?url=${encodeURIComponent(i)}`,e.selectedLink.headers?.Referer&&(i+=`&referer=${encodeURIComponent(e.selectedLink.headers.Referer)}`)),e.selectedSource.subtitles){const fe=localStorage.getItem("playerSubtitlesEnabled")!=="false";let Me=null;try{Me=localStorage.getItem("playerLastSubtitle")}catch{}const J=zt(e.selectedSource.subtitles,{lastKey:Me,enabled:fe}),xe=J>=0?e.selectedSource.subtitles[J]:null;e.selectedSource.subtitles.forEach(be=>{const X=document.createElement("track");X.kind="subtitles",X.label=be.label,X.srclang=be.lang;const y=be.src??be.url;if(y){let Z=`/api/subtitle-proxy?url=${encodeURIComponent(y)}`;const ae=e.selectedLink?.headers?.Referer,bt=y.includes("anilight.live")?"https://anilight.live/":"",Lt=ae||bt;Lt&&(Z+=`&referer=${encodeURIComponent(Lt)}`),X.src=Z}xe&&be.label===xe.label&&be.lang===xe.lang&&(X.default=!0),t.appendChild(X)}),fe||k.setActiveSubtitleTrack("off"),k.setAvailableSubtitles(e.selectedSource.subtitles)}const c=ee.current;ee.current=0;const N=()=>{c>0&&(t.currentTime=c)};t.addEventListener("loadedmetadata",N,{once:!0});const de=!(l.current&&Re.current>5),H=()=>{de&&t.play().catch(()=>{k.setShowControls(!0)})};e.selectedLink.hls?(async()=>{const fe=await un();if(s)return;if(!fe||!fe.isSupported()){t.src=i,H();return}const Me=document.body.classList.contains("low-end"),J=new fe({maxBufferLength:Me?15:30,maxMaxBufferLength:Me?30:60,maxBufferSize:Me?25*1e3*1e3:60*1e3*1e3,startLevel:-1,enableWorker:!0});Se.current=J,J.on(fe.Events.ERROR,(X,y)=>{y.fatal&&!je.current&&Ne.current()});const xe=(e.selectedSource?.subtitles?.length??0)>0,be=()=>{try{xe&&typeof J.subtitleTrack=="number"&&J.subtitleTrack!==-1&&(J.subtitleTrack=-1)}catch{}};J.on(fe.Events.SUBTITLE_TRACK_SWITCH,(X,y)=>{y?.id!==-1&&be()}),be(),J.loadSource(i),J.attachMedia(t),J.once(fe.Events.MANIFEST_PARSED,()=>{s||H()})})():(t.src=i,H());const $=localStorage.getItem("playerVolume"),oe=localStorage.getItem("playerMuted");return $!==null&&(t.volume=parseFloat($)),oe!==null&&(t.muted=oe==="true"),()=>{s=!0,t.removeEventListener("loadedmetadata",N),Se.current&&(Se.current.destroy(),Se.current=null)}},[e.selectedSource,e.selectedLink,h.videoRef,k,e.loadingVideo,we]);const Nt=q(t=>{if(je.current)return;je.current=!0;const s=t.links[0];le(t.sourceName),b({type:"SET_STATE",payload:{selectedSource:t,selectedLink:s}}),_e(null)},[b,le]),xt=q(()=>{const s=ce.current.find(i=>i.type==="iframe");return s?.links?.length?s:null},[]),Pt=q(async()=>{const t=e.showMeta?.isAdult,s=ie.filter(i=>{if(ke.current.includes(i))return!1;const c=ye.has(i);return t===void 0?!0:c===t});gt(!0);try{for(const i of s){ke.current.push(i);let c=null;try{c=await Ie(`/api/video?showId=${n}&episodeNumber=${e.currentEpisode}&mode=${e.currentMode}&provider=${i}`)}catch{continue}const N=(c??[]).filter($=>{const oe=$.sourceName.toLowerCase();return e.currentMode==="dub"?oe.includes("eng")||oe.includes("dub"):oe.includes("jpn")||oe.includes("sub")||!oe.includes("eng")&&!oe.includes("dub")});if((N.length>0?N:c??[]).find($=>$.type!=="iframe"&&$.links?.length)){ke.current=[e.selectedProvider],Be.current=!1,b({type:"SET_STATE",payload:{selectedProvider:i,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),localStorage.setItem("preferredProvider",i),_e(null),Ve.success(`Switched to ${i} (direct stream)`);return}}_e({retryFailed:!0}),Ve.error("No working direct stream found on other providers")}finally{gt(!1)}},[n,e.currentEpisode,e.currentMode,e.showMeta?.isAdult,e.selectedProvider,b,ie,ye]),Kt=q(()=>{if(je.current||Be.current||e.selectedSource?.type!=="player")return;const t=xt();if(!t)return;ke.current.includes(e.selectedProvider)||ke.current.push(e.selectedProvider);const s=L.current;if(s==="iframe"){Nt(t);return}if(s==="retry"){Pt();return}k.setShowControls(!0),_e({retryFailed:!1})},[e.selectedSource,e.selectedProvider,xt,Nt,Pt,k]);Ne.current=Kt;const hr=q(()=>{Be.current=!0,_e(null),Tt(!1)},[]),fr=q(()=>{Ye&<("iframe");const t=xt();t?Nt(t):_e(null)},[Ye,lt,xt,Nt]),vr=q(()=>{Ye&<("retry"),Pt()},[Ye,lt,Pt]),Rt=(t,s,i)=>t.showId===s||!!i&&t.showId===i,At=q(()=>{k.onEnded();const t=C.find(i=>Rt(i,n,e.showMeta?.id)&&i.episodeNumber===e.currentEpisode);if(C.length>0){const i=C.findIndex(N=>Rt(N,n,e.showMeta?.id)&&N.episodeNumber===e.currentEpisode),c=i>=0?C[i+1]||null:C[0];ue({nextItem:c,playedItem:t||null}),me(2)}else t&&Ce.current.mutate({showId:t.showId,episodeNumber:t.episodeNumber});let s=!1;if(e.isAutoplayEnabled&&C.length===0){const i=e.episodes.findIndex(c=>c===e.currentEpisode);if(i>-1&&i<e.episodes.length-1){const c=e.episodes[i+1];K.invalidateQueries({queryKey:["allContinueWatching"]}),w(`/watch/${n}/${c}`),s=!0}}if(!s&&C.length===0&&!U&&!$e.current){const i=e.episodes.length>0&&!!e.currentEpisode&&e.episodes[e.episodes.length-1]===e.currentEpisode,c=String(e.showMeta.status||"").trim().toLowerCase(),N=["finished","completed","complete","ended"].some(de=>c.includes(de));i&&N&&b({type:"SET_STATE",payload:{showResumeModal:!0}})}},[k,w,C,n,e.showMeta?.id,e.showMeta?.status,e.currentEpisode,e.episodes,e.isAutoplayEnabled,U,b,K]),Vt=q(()=>{if(C.length===0)return;k.onEnded();const t=C.find(c=>Rt(c,n,e.showMeta?.id)&&c.episodeNumber===e.currentEpisode),s=C.findIndex(c=>Rt(c,n,e.showMeta?.id)&&c.episodeNumber===e.currentEpisode),i=s>=0?C[s+1]||null:C[0];t&&Fe.mutate({showId:t.showId,episodeNumber:t.episodeNumber}),i?w(`/watch/${i.showId}/${i.episodeNumber}`):t&&b({type:"SET_STATE",payload:{showResumeModal:!0}})},[k,w,C,Fe,n,e.showMeta?.id,e.currentEpisode,b]),Bt=q(()=>{Je&&(K.invalidateQueries({queryKey:["allContinueWatching"]}),w(`/watch/${n}/${Je}`)),b({type:"SET_STATE",payload:{showResumeModal:!1}})},[Je,w,n,b,K]),jt=q(()=>{C.length>0?Vt():Je?Bt():Ve.error("No next episode available")},[C.length,Vt,Bt,Je]),gr=()=>{Ot&&w(`/watch/${n}/${Ot}`)};x(()=>{const t=h.videoRef.current;if(!t)return;const s=()=>{we||At()};return t.addEventListener("ended",s),()=>{t&&t.removeEventListener("ended",s)}},[At,h.videoRef,a.state.isFullscreen,we]),x(()=>{const t=s=>{s.origin===window.location.origin&&e.selectedSource?.type==="iframe"&&s.data?.type==="ANI_WEB_MEDIA_ENDED"&&At()};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)},[At,e.selectedSource?.type]),x(()=>{if(!U||nt===null)return;if(nt<=0){const{nextItem:s,playedItem:i}=U;ue(null),me(null),i&&Ce.current.mutate({showId:i.showId,episodeNumber:i.episodeNumber}),s?w(`/watch/${s.showId}/${s.episodeNumber}`):i&&b({type:"SET_STATE",payload:{showResumeModal:!0}});return}const t=window.setTimeout(()=>{me(s=>s===null?null:s-1)},1e3);return()=>window.clearTimeout(t)},[U,nt,w,b]),x(()=>{ut&&a.state.isFullscreen&&a.actions.toggleFullscreen()},[ut,a.state.isFullscreen,a.actions]),x(()=>{ut&&h.videoRef.current&&h.videoRef.current.pause()},[ut,h.videoRef]);const{titlePreference:It}=Ur(),dt=ot(()=>{if(!e.showMeta||e.loadingShowData)return"Loading...";const{name:t,names:s}=e.showMeta;return It==="name"?t||"Loading...":It==="nativeName"?s?.native||t||"Loading...":It==="englishName"?s?.english||t||"Loading...":t||"Loading..."},[e.showMeta,It,e.loadingShowData]);x(()=>{dt&&dt!=="Loading..."&&e.currentEpisode&&(document.title=`► ${dt} Episode ${e.currentEpisode} - dango`)},[dt,e.currentEpisode]),x(()=>{const t=s=>{if(!s.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')&&(["arrowup","arrowdown","arrowleft","arrowright"].includes(s.key.toLowerCase())&&(k.setShowControls(!0),a.actions.inactivityTimer.current&&clearTimeout(a.actions.inactivityTimer.current),a.actions.inactivityTimer.current=window.setTimeout(()=>{k.setShowControls(!1)},1e3)),s.key.toLowerCase()==="n"&&jt(),s.key.toLowerCase()==="t")){const c=!se;ge(c),localStorage.setItem("playerTheaterMode",c.toString())}};return document.addEventListener("keydown",t),()=>{document.removeEventListener("keydown",t)}},[k,a.actions.inactivityTimer,jt,se]);const{setAvailableSubtitles:Yt,setActiveSubtitleTrack:Ut}=k;x(()=>{const t=h.videoRef.current;if(!t)return;const s=()=>{const i=Array.from(t.textTracks).map(c=>({label:c.label,lang:c.language,src:void 0,mode:c.mode}));Yt(i)};return t.textTracks.addEventListener("addtrack",s),t.textTracks.addEventListener("removetrack",s),s(),()=>{t&&(t.textTracks.removeEventListener("addtrack",s),t.textTracks.removeEventListener("removetrack",s))}},[h.videoRef,Yt]),x(()=>{if(a.state.activeSubtitleTrack===null&&a.state.availableSubtitles.length>0&&localStorage.getItem("playerSubtitlesEnabled")!=="false"){let t=null;try{t=localStorage.getItem("playerLastSubtitle")}catch{}const s=zt(a.state.availableSubtitles,{lastKey:t,enabled:!0});if(s<0){Ut("off");return}const i=a.state.availableSubtitles[s];Ut(i.lang||i.label)}},[a.state.activeSubtitleTrack,a.state.availableSubtitles,Ut]),x(()=>{const t=h.videoRef.current;if(!t||a.state.availableSubtitles.length===0)return;const s=a.state.activeSubtitleTrack;if(!(localStorage.getItem("playerSubtitlesEnabled")!=="false")||s==="off"||s===null){Array.from(t.textTracks).forEach(N=>{N.mode="hidden"});return}let c=!1;if(Array.from(t.textTracks).forEach(N=>{const H=(N.language===s||N.label===s)&&!c;N.mode=H?"showing":"hidden",H&&(c=!0)}),!c&&t.textTracks.length>0){const N=Array.from(t.textTracks).find(de=>de.language==="en"||de.label==="English")||t.textTracks[0];N&&(N.mode="showing")}},[a.state.activeSubtitleTrack,a.state.availableSubtitles,h.videoRef]);const[Jt,br]=Q(0);x(()=>{const t=h.videoRef.current;if(!t)return;const s=()=>br(t.clientHeight||0);s();const i=new ResizeObserver(s);return i.observe(t),()=>i.disconnect()},[h.videoRef,e.selectedSource,e.selectedLink]),x(()=>{const t="dynamic-subtitle-styles";let s=document.getElementById(t);s||(s=document.createElement("style"),s.id=t,document.head.appendChild(s));const i={fontSize:a.state.subtitleFontSize,position:a.state.subtitlePosition,bgOpacity:a.state.subtitleBgOpacity,bgColor:a.state.subtitleBgColor,textColor:a.state.subtitleTextColor,edge:a.state.subtitleEdge,bold:a.state.subtitleBold};s.textContent=sr(i);const c=h.videoRef.current;if(!c)return;const N=or(a.state.subtitleFontSize,Jt||c.clientHeight||720);s.textContent=sr({...i,fontSize:N});const de=()=>{const y=Number(a.state.subtitlePosition),Z=isNaN(y)?0:Math.max(0,Math.min(100,y));return Math.max(0,Math.min(100,100-Z))},H=(y,Z)=>{try{const ae=y;ae.snapToLines=!1,ae.line=Z}catch{}},$=()=>{const y=N*16,Z=c.videoHeight||c.clientHeight||720,ae=c.videoWidth||c.clientWidth||1280;return{step:y*1.3/Z*100,chars:Math.max(20,Math.floor(ae/(y*.55)))}},oe=y=>{const Z=de(),ae=Array.from(y.activeCues??[]);if(ae.length<=1){ae.forEach(yt=>H(yt,Z));return}const{step:bt,chars:Lt}=$();let tr=Z;for(let yt=ae.length-1;yt>=0;yt--){const Rr=String(ae[yt].text??"").replace(/<[^>]*>/g,"").split(`
|
|
55
|
-
`).reduce((_r,Nr)=>_r+Math.max(1,Math.ceil(Nr.length/Lt)),0),rr=tr-Rr*bt;H(ae[yt],Math.max(0,rr)),tr=rr-bt*.4}},fe=y=>{if(!y.cues)return;const Z=de();Array.from(y.cues).forEach(ae=>H(ae,Z)),y.mode==="showing"&&oe(y)},Me=()=>{Array.from(c.textTracks).forEach(fe)};Me();const J=y=>{const Z=y.target;Z.mode==="showing"&&oe(Z)};Array.from(c.textTracks).forEach(y=>{y.addEventListener("cuechange",J)});const xe=()=>{Array.from(c.textTracks).forEach(y=>{y.removeEventListener("cuechange",J),y.addEventListener("cuechange",J)}),Me()};c.textTracks.addEventListener("addtrack",xe),c.textTracks.addEventListener("removetrack",xe);const be=Array.from(c.querySelectorAll("track")),X=()=>{Me()};return be.forEach(y=>{y.addEventListener("load",X)}),()=>{Array.from(c.textTracks).forEach(y=>{y.removeEventListener("cuechange",J)}),c.textTracks.removeEventListener("addtrack",xe),c.textTracks.removeEventListener("removetrack",xe),be.forEach(y=>{y.removeEventListener("load",X)})}},[a.state.subtitleFontSize,a.state.subtitlePosition,a.state.subtitleBgOpacity,a.state.subtitleBgColor,a.state.subtitleTextColor,a.state.subtitleEdge,a.state.subtitleBold,a.state.activeSubtitleTrack,a.state.availableSubtitles,e.selectedSource,e.selectedLink,h.videoRef,Jt]),x(()=>{if(!_)return;const t=h.videoRef.current,s=Qe.current;if(!t||!s)return;const i=localStorage.getItem("playerSubtitlesEnabled")!=="false",c=a.state.activeSubtitleTrack;function N(){if(s.innerHTML="",!i||c==="off"||c===null)return;const $=Array.from(t.textTracks).find(X=>X.language===c||X.label===c);if(!$||$.mode!=="showing")return;const oe=tt/1e3;let fe;if(oe>0&&$.cues){const X=t.currentTime-oe;fe=Array.from($.cues).filter(y=>y.startTime<=X&&X<=y.endTime)}else fe=Array.from($.activeCues??[]);if(fe.length===0)return;const Me={fontSize:or(a.state.subtitleFontSize,t.clientHeight||0),position:a.state.subtitlePosition,bgOpacity:a.state.subtitleBgOpacity,bgColor:a.state.subtitleBgColor,textColor:a.state.subtitleTextColor,edge:a.state.subtitleEdge,bold:a.state.subtitleBold},J=Zr(Me),xe=en(t,Me.position),be=Array.from(fe);be.forEach((X,y)=>{const Z=String(X.text??"");if(!tn(Z).trim())return;const ae=document.createElement("div"),bt=(be.length-1-y)*1.7;ae.style.cssText=`${J}
|
|
56
|
-
bottom: calc(${xe}px + ${bt}em);`,ae.innerHTML=rn(Z),s.appendChild(ae)})}const de=()=>N(),H=()=>N();return Array.from(t.textTracks).forEach($=>{$.addEventListener("cuechange",de)}),t.addEventListener("timeupdate",H),N(),()=>{Array.from(t.textTracks).forEach($=>{$.removeEventListener("cuechange",de)}),t.removeEventListener("timeupdate",H),s.innerHTML=""}},[ne.isEnabled,ne.isWebGPUSupported,a.state.subtitleFontSize,a.state.subtitlePosition,a.state.subtitleBgOpacity,a.state.subtitleBgColor,a.state.subtitleTextColor,a.state.subtitleEdge,a.state.subtitleBold,a.state.activeSubtitleTrack,h.videoRef,_,tt]),x(()=>{try{localStorage.setItem("anime4kProfile",o)}catch{}},[o]);const yr=()=>{h.videoRef.current&&(h.videoRef.current.currentTime=e.resumeTime,h.videoRef.current.play()),b({type:"SET_STATE",payload:{showResumeModal:!1}})},Sr=()=>{h.videoRef.current&&(h.videoRef.current.currentTime=0,h.videoRef.current.play()),b({type:"SET_STATE",payload:{showResumeModal:!1}})},Er=q(()=>{ct&&($e.current=!0),b({type:"SET_STATE",payload:{showResumeModal:!1}})},[b,ct]),wr=q(async()=>{try{await W(),b({type:"SET_STATE",payload:{showResumeModal:!1}}),w("/")}catch{}},[W,b,w]),Xt=(t,s)=>r("div",{className:t,children:[r("button",{className:`${u.episodeNavBtn} ${u.secondary}`,onClick:gr,disabled:!Ot,type:"button",children:[r(F,{name:"chevron-left",size:12}),"Prev EP"]}),r("button",{className:`${u.episodeNavBtn} ${u.primary}`,onClick:Bt,disabled:!Je,type:"button",children:["Next EP",r(F,{name:"chevron-right",size:12})]}),s==="mobile"&&De&&r("button",{className:`${u.episodeNavBtn} ${u.episodePickerBtn}`,onClick:()=>M(!0),type:"button",children:[r(F,{name:"list-ul",size:12}),"Episodes"]})]});x(()=>{it&&(e.showResumeModal||C.length>0||U||$e.current||ct&&b({type:"SET_STATE",payload:{showResumeModal:!0}}))},[it,ct,e.showResumeModal,C.length,U,b]);const kr=t=>{b({type:"SET_STATE",payload:{isAutoplayEnabled:t}}),localStorage.setItem("autoplayEnabled",t.toString())},Zt=!!(e.currentEpisode&&e.watchedEpisodes.includes(e.currentEpisode)),Tr=e.selectedProvider!=="megaplay"||e.selectedSource?.type==="iframe",Qt=f(A);Qt.current=A;const er=f("");x(()=>{const t=h.videoRef.current;if(Et(!1),wt(!1),!t||e.selectedSource?.type==="iframe")return;const s=()=>{const i=t.duration,c=t.currentTime;if(!i||Number.isNaN(i)){Et(!1),wt(!1);return}const N=c/i;if(i-c<=60){const de=C.findIndex(oe=>Rt(oe,n,e.showMeta?.id)&&oe.episodeNumber===e.currentEpisode),H=C.length>0?de>=0?C[de+1]||null:C[0]:null,$=H?`${H.showId}:${H.episodeNumber}`:Wt?`${n}:${Je}`:"";$&&er.current!==$&&(er.current=$,H?Qt.current(H.episodeNumber,H.showId):Qt.current(Je))}Et(Wt&&N>=.8),wt(c>=Math.max(i*.98,i-10))};return s(),t.addEventListener("timeupdate",s),t.addEventListener("loadedmetadata",s),()=>{t.removeEventListener("timeupdate",s),t.removeEventListener("loadedmetadata",s)}},[h.videoRef,Wt,e.currentEpisode,e.selectedSource,Je,n,C,e.showMeta?.id]);const Cr=q(async()=>{if(!n||!e.currentEpisode||!e.showMeta.name||D)return;const t=h.videoRef.current?.duration,s=Math.max(t||0,e.resumeDuration||0,(e.showMeta.lengthMin||0)*60,1);await ve(e.currentEpisode,s)},[n,e.currentEpisode,e.showMeta,e.resumeDuration,ve,D,h.videoRef]);if(e.error&&!e.showMeta.name&&e.videoSources.length===0&&e.episodes.length===0)return r("p",{className:"error-message",children:["Error: ",e.error]});const st=e.loadingShowData||e.loadingVideo,Mr=t=>{se&&t.target===t.currentTarget&&(ge(!1),localStorage.setItem("playerTheaterMode","false"))};return e.showMeta?.isAdult===!0&&!T?r("div",{className:We.playerPageLayout,children:r(Xe,{isOpen:!0,title:"Content Warning",onClose:()=>w("/home"),children:r("div",{style:{padding:"1rem",textAlign:"center"},children:[r("p",{children:"This title contains mature content intended for adult audiences."}),r("p",{children:["By proceeding, you confirm that you are ",r("strong",{children:"18 years of age or older"})," (or the age of majority in your jurisdiction) and wish to view this content."]}),r("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[r(pt,{variant:"secondary",onClick:()=>w("/home"),children:"Go Back"}),r(pt,{onClick:S,children:"I'm 18+, Continue"})]})]})})}):r("div",{className:`${We.playerPageLayout} ${se?We.theaterMode:""}`,onClick:Mr,children:[r(Xe,{isOpen:ut,onClose:Er,title:ct?"Show Completed!":"Resume Playback?",width:"sm",children:ct?r(St,{children:[r(Xe.Body,{children:r("p",{children:"Congratulations! You've finished the final episode of this series."})}),r(Xe.Actions,{children:r(pt,{onClick:wr,disabled:Le,children:Le?"Saving...":"Move to Completed"})})]}):r(St,{children:[r(Xe.Body,{children:r("p",{children:["You were watching at ",r("strong",{children:a.actions.formatTime(e.resumeTime)}),". Would you like to continue?"]})}),r(Xe.Actions,{children:[r(pt,{variant:"secondary",onClick:Sr,children:"Start Over"}),r(pt,{onClick:yr,children:"Resume"})]})]})}),r(Xe,{isOpen:!!ft,onClose:hr,title:"Direct stream failed",width:"sm",children:[r(Xe.Body,{children:[r("p",{children:[r("strong",{children:e.selectedProvider}),"'s direct stream failed for this episode."]}),ft?.retryFailed&&r("p",{children:"No working direct stream was found on the other providers either."}),r("p",{children:["You can continue with the embedded (iframe) player, but embedded players may show"," ",r("strong",{children:"ads and pop-ups"}),"."]}),r("label",{style:{display:"flex",alignItems:"center",gap:"8px",marginTop:"0.75rem",cursor:"pointer"},children:[r("input",{type:"checkbox",checked:Ye,onChange:t=>Tt(t.target.checked)}),"Remember my choice"]})]}),r(Xe.Actions,{children:[r(pt,{variant:"secondary",onClick:fr,children:"Continue with iframe"}),r(pt,{onClick:vr,disabled:vt,children:vt?"Searching…":"Try another provider"})]})]}),r(Qr,{isOpen:!!e.showCookieModal,onClose:()=>b({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{K.invalidateQueries({queryKey:["video-sources",n,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),!se&&r("aside",{ref:Pe,className:We.episodeSidebar,children:e.loadingShowData?r(nn,{variant:"sidebar"}):r(sn,{episodes:e.episodes,currentEpisode:e.currentEpisode,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:t=>w(`/watch/${n}/${t}`)})}),r("div",{className:We.playerMain,children:[r("div",{className:`${u.videoContainer} ${a.state.isFullscreen?"":We.videoPlayerWrapper} ${a.state.isFullscreen?u.fullscreenActive:""}`,style:{...ut?{visibility:"hidden"}:{}},onContextMenu:t=>t.preventDefault(),children:r(ss,{player:a,isAutoplayEnabled:e.isAutoplayEnabled,onAutoplayChange:kr,fallbackChoice:Ct,onFallbackChoiceChange:lt,showNextEpisodeButton:!ut&&rt&&C.length===0,onNextEpisode:Bt,videoSources:e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:(t,s)=>{h.videoRef.current&&!isNaN(h.videoRef.current.currentTime)&&(ee.current=h.videoRef.current.currentTime),le(t.sourceName),b({type:"SET_STATE",payload:{selectedSource:t,selectedLink:s,showResumeModal:e.showResumeModal&&t.type!=="iframe"}})},loadingVideo:e.loadingVideo,skipIntervals:e.skipIntervals,animeTitle:dt,episodeNumber:e.currentEpisode,isTheaterMode:se,onTheaterModeToggle:()=>{const t=!se;ge(t),localStorage.setItem("playerTheaterMode",t.toString())},anime4kEnabled:ne.isEnabled,onAnime4kToggle:ne.toggle,anime4kSupported:ne.isWebGPUSupported,anime4kProfile:o,onAnime4kProfileChange:d,anime4kInitializing:ne.isInitializing,anime4kError:ne.error,videoDelayEnabled:V,onVideoDelayToggle:t=>{j(t);try{localStorage.setItem("playerVideoDelayEnabled",String(t))}catch{}},videoDelayMs:p,onVideoDelayChange:Ge,onCalibrateAvSync:at,isInteractingExtra:kt||te,className:on.shellFill,hideChrome:e.selectedSource?.type==="iframe",overlays:r(St,{children:[a.state.isSpeedBoostActive&&r("div",{className:u.speedBoostBadge,"aria-hidden":"true",children:[r("span",{children:"2x"}),r(F,{name:"forward",size:12})]}),nt!==null&&U?.nextItem&&r("div",{className:u.queueCountdown,children:["Queue next in ",nt,"s"]})]}),children:[I&&r("div",{className:`${u.skipIndicatorContainer} ${I.side==="left"?u.leftSkip:u.rightSkip} `,children:r("div",{className:u.skipBubble,children:[r("div",{className:u.skipIcon,children:I.side==="left"?r(F,{name:"backward"}):r(F,{name:"forward"})}),r("div",{className:u.skipText,children:"15s"})]})}),st&&r("div",{className:u.loadingOverlay,children:r("div",{className:u.loadingDots,children:[r("div",{className:u.dot}),r("div",{className:u.dot}),r("div",{className:u.dot})]})}),a.state.isBuffering&&!st&&e.selectedSource?.type!=="iframe"&&r("div",{className:u.bufferingOverlay,children:r("div",{className:u.bufferingSpinner})}),e.selectedSource?.type==="iframe"?!st&&r("iframe",{src:e.selectedLink?.link,className:u.videoIframe,allow:"autoplay; fullscreen; picture-in-picture",allowFullScreen:!0,sandbox:e.selectedSource.sandbox?`${e.selectedSource.sandbox} allow-fullscreen allow-popups allow-popups-to-escape-sandbox`:void 0}):r(St,{children:[!st&&e.videoSources.length===0&&r("div",{className:u.errorOverlay,children:[r("p",{children:["No sources found for this episode with ",e.selectedProvider,"."]}),r("p",{className:u.errorSubtext,children:"Please try selecting a different provider below."}),r("button",{className:u.retryButton,onClick:()=>window.location.reload(),"data-speed-boost-ignore":"true",style:{marginTop:8},children:"Retry"})]}),!st&&e.videoSources.length>0&&r("video",{ref:h.videoRef,controls:a.state.useNativeControls,playsInline:!0,"webkit-playsinline":"true",disablePictureInPicture:!0,disableRemotePlayback:!0,onPlay:k.onPlay,onPause:k.onPause,onLoadedMetadata:k.onLoadedMetadata,onTimeUpdate:()=>{we||(k.onTimeUpdate(),U&&h.videoRef.current&&h.videoRef.current.currentTime<h.videoRef.current.duration-1&&(ue(null),me(null)))},onProgress:k.onProgress,onVolumeChange:k.onVolumeChange,onWaiting:k.onWaiting,onPlaying:k.onPlaying,onError:Kt,onContextMenu:t=>t.preventDefault(),className:_?u.videoElementHidden:""}),ne.isWebGPUSupported&&!st&&e.videoSources.length>0&&r("canvas",{ref:Ae,className:`${u.upscalerCanvas} ${Ke?u.upscalerActive:""}`}),!Ke&&!st&&e.videoSources.length>0&&r("canvas",{ref:ht,className:`${u.upscalerCanvas} ${m?u.upscalerActive:""}`}),ne.isEnabled&&ne.isWebGPUSupported&&ne.isInitializing&&r("div",{className:u.upscalerStatusBadge,children:"Preparing upscaler…"}),_&&r("div",{ref:Qe,className:u.subtitleOverlay}),r(an,{isOpen:te,ms:p,onChange:Ge,onApply:pe,onClose:re,testClipActive:we,onTestClip:He})]})]})}),!se&&r(ln,{}),!se&&r(St,{children:[Mt&&C.length===0?r(os,{count:3}):r(mn,{title:"Queue",items:C,currentShowId:n,currentEpisode:e.currentEpisode,onNextQueue:Vt,onRemove:t=>Fe.mutate({showId:t.showId,episodeNumber:t.episodeNumber}),onClear:()=>he.mutate(),showClearAll:!0,onReorder:t=>Ft.mutate(t.map(s=>({id:s.id,showId:s.showId,episodeNumber:s.episodeNumber})))}),r("div",{className:u.providerAndEpisodeRow,children:[r(ms,{selectedProvider:e.selectedProvider,isAdult:e.showMeta?.isAdult,options:R,onProviderChange:t=>{je.current=!1,ke.current=[],Be.current=!1,_e(null),b({type:"SET_STATE",payload:{selectedProvider:t,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),localStorage.setItem("preferredProvider",t)}}),Xt(`${u.episodeActions} ${u.desktopEpisodeActions}`,"desktop")]}),st?r("div",{className:u.sourceLoader,children:r("div",{className:u.spinner})}):r(St,{children:r(fs,{videoSources:e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:t=>{h.videoRef.current&&!isNaN(h.videoRef.current.currentTime)&&(ee.current=h.videoRef.current.currentTime);const i=(t.links||[]).sort((c,N)=>(parseInt(N.resolutionStr)||0)-(parseInt(c.resolutionStr)||0))[0]||null;le(t.sourceName),b({type:"SET_STATE",payload:{selectedSource:t,selectedLink:i,showResumeModal:e.showResumeModal&&t.type!=="iframe"}})},onLinkChange:t=>{e.selectedSource&&(le(e.selectedSource.sourceName),b({type:"SET_STATE",payload:{selectedLink:t}}))}})}),r("div",{className:We.playerInfoContainer,children:[r("div",{className:We.playerInfoHeader,children:[r("div",{className:We.playerAnimeCard,children:r("img",{src:qr(e.showMeta.thumbnail||""),alt:dt,loading:"lazy",decoding:"async",onError:t=>{t.target.src="/placeholder.svg"}})}),r("div",{className:We.videoTitleSection,children:[r("div",{className:u.titleContainer,children:[r("h1",{children:dt}),r("div",{className:u.scheduleInfo,children:[e.showMeta.status&&r("span",{className:u.status,children:e.showMeta.status}),e.showMeta.nextEpisodeAirDate&&r("span",{className:u.nextEpisode,children:["Next episode: ",e.showMeta.nextEpisodeAirDate]})]})]}),r("div",{className:u.controls,children:[r("button",{className:`${u.watchlistBtn} ${e.inWatchlist?u.inList:""}`,onClick:O,children:[e.inWatchlist?r(F,{name:"check",size:14}):r(F,{name:"plus",size:14}),e.inWatchlist?"In Watchlist":"Add to Watchlist"]}),r(fn,{showId:n,showName:e.showMeta.name||e.showMeta.names?.romaji,showThumbnail:e.showMeta.thumbnail,nativeName:e.showMeta.names?.native,englishName:e.showMeta.names?.english,showType:e.showMeta.type,className:`${u.watchlistBtn} ${u.queueBtn}`,activeClassName:u.queueActive}),Tr&&r("button",{className:`${u.watchlistBtn} ${u.markWatchedBtn} ${Zt?u.markWatchedDone:""}`,onClick:Cr,disabled:D||!e.currentEpisode,children:[r(F,{name:"check",size:14}),D?"Saving...":Zt?"Watched":"Mark Watched"]}),r("button",{className:`${u.watchlistBtn} ${u.modeToggleBtn} ${e.currentMode==="dub"?u.modeToggleActive:""}`,onClick:()=>{const t=e.currentMode==="dub"?"sub":"dub";je.current=!1,ke.current=[],Be.current=!1,_e(null),b({type:"SET_MODE",payload:t}),localStorage.setItem("preferredMode",t)},type:"button","aria-pressed":e.currentMode==="dub",children:e.currentMode==="dub"?"DUB":"SUB"}),r("button",{className:`${u.watchlistBtn} ${u.modeToggleBtn} ${a.state.useNativeControls?u.modeToggleActive:""}`,onClick:()=>{const t=!a.state.useNativeControls;a.actions.setUseNativeControls(t),localStorage.setItem("playerUseNativeControls",t.toString())},type:"button",children:a.state.useNativeControls?"NATIVE: ON":"NATIVE: OFF"})]})]})]}),Xt(`${u.episodeActions} ${u.mobileEpisodeActions}`,"mobile"),r("div",{className:u.descriptionSection,children:[r("h3",{children:"Synopsis"}),r(gn,{text:e.showMeta.description?e.showMeta.description.replace(/<[^>]*>?/gm,""):"",emptyText:"No description available."})]}),r("button",{className:u.detailsToggleBtn,onClick:z,children:[e.showCombinedDetails?r(F,{name:"chevron-up"}):r(F,{name:"chevron-down"}),e.showCombinedDetails?"Hide Details":"Show Details"]}),e.showCombinedDetails&&r(vn,{showMeta:e.showMeta,styles:u})]})]})]}),r(cn,{isOpen:kt,onClose:()=>M(!1),episodes:e.episodes,currentEpisode:e.currentEpisode,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:t=>{M(!1),w(`/watch/${n}/${t}`)}})]})};export{zs as default};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{u as t,d as v,A as D,h as f,S as Nt,n as kn,o as xn,a as Nn,T as _e,q as P}from"./vendor-core-8R2fFbyN.js";import{e as Ht,z as In,M as Ut,B as qe}from"./index-IZgh1beL.js";import{I}from"./vendor-icons-CDMuNDeL.js";import{f as an,d as En,C as wn,S as Bn,U as Pn,a as Mn,p as jt,u as An,c as $n,b as Ln,s as Wt,e as Rn,g as Dn,h as Vn,r as On,l as Be,i as Fn,E as zn,A as Hn,P as Un,j as ue,m as Wn}from"./AvSyncCalibrator-C8ZoIwMY.js";import{O as It,S as jn,a as Kn,A as qn}from"./OptionListMenu-Drc_vybW.js";import{u as Gn}from"./useMatureConsent-CT7-KfzG.js";import{u as Jn}from"./useProviders-BsRGONMA.js";import{d as Qn,g as Yn,f as Xn,e as Zn,h as er,j as tr}from"./useTvLibrary-Cwxgy_Bg.js";import{l as nr,c as rr}from"./hls-C4cG9wQw.js";import{u as sr}from"./useIsMobile-Dm_b6Ob3.js";import{S as ar}from"./SynopsisText-BcpwT5iw.js";import"./vendor-query-BXRECSI6.js";const or="_fullscreenFlat_oxcpx_1",ir="_timeDisplay_oxcpx_15",lr="_bottomControls_oxcpx_19",cr="_leftControls_oxcpx_23",dr="_rightControls_oxcpx_24",ur="_controlBtn_oxcpx_28",mr="_controlsOverlay_oxcpx_47",pr="_hidden_oxcpx_67",hr="_topControls_oxcpx_73",gr="_backBtn_oxcpx_93",fr="_videoTitleInfo_oxcpx_113",br="_animeTitle_oxcpx_119",vr="_episodeLabel_oxcpx_127",yr="_speedBoostBadge_oxcpx_134",_r="_progressBarContainer_oxcpx_180",Sr="_progressBar_oxcpx_180",Tr="_thumb_oxcpx_199",Cr="_bufferedBar_oxcpx_217",kr="_watchedBar_oxcpx_227",xr="_scrubbing_oxcpx_252",Nr="_timeBubble_oxcpx_256",Ir="_bottomControlsRow_oxcpx_270",Er="_active_oxcpx_323",wr="_settingsPanel_oxcpx_398",Br="_settingsHeader_oxcpx_417",Pr="_settingsBackBtn_oxcpx_425",Mr="_settingsTitle_oxcpx_443",Ar="_settingsContent_oxcpx_454",$r="_currentValue_oxcpx_463",Lr="_menuItem_oxcpx_478",Rr="_menuNote_oxcpx_511",o={fullscreenFlat:or,timeDisplay:ir,bottomControls:lr,leftControls:cr,rightControls:dr,controlBtn:ur,controlsOverlay:mr,hidden:pr,topControls:hr,backBtn:gr,videoTitleInfo:fr,animeTitle:br,episodeLabel:vr,speedBoostBadge:yr,progressBarContainer:_r,progressBar:Sr,thumb:Tr,bufferedBar:Cr,watchedBar:kr,scrubbing:xr,timeBubble:Nr,bottomControlsRow:Ir,active:Er,settingsPanel:wr,settingsHeader:Br,settingsBackBtn:Pr,settingsTitle:Mr,settingsContent:Ar,currentValue:$r,menuItem:Lr,menuNote:Rr},Dr=({classes:p,tracks:E,selected:z,onChange:V})=>t(It,{classes:p,options:E.map((r,G)=>({key:String(G),label:r.label||r.language,selected:G===z})),onSelect:r=>V(Number(r))}),Vr=({player:p,title:E,episodeLabel:z,audioTracks:V,selectedAudioTrack:r,onAudioTrackChange:G,subtitles:j,selectedSubtitle:M,onSubtitleChange:u,streams:me,qualityIdx:ce,onQualityChange:Ge,onBack:y,children:pe,movyServers:O=[],selectedMovyServer:Je="atlanta",onMovyServerSelect:X,isMovySource:Se=!1,videoDelayEnabled:Qe=!1,onVideoDelayToggle:Et,videoDelayMs:ct=0,onVideoDelayChange:dt,onCalibrateAvSync:J})=>{const{state:C,refs:ut,actions:x}=p,A=ut.videoRef,{subtitleFontSize:Z,subtitlePosition:$,subtitleBgOpacity:Pe,subtitleBgColor:Me,subtitleTextColor:se,subtitleEdge:Te,subtitleBold:ee}=C,[k,w]=v(null),de=D(null),[he,wt]=v(0);f(()=>{const a=A.current;if(!a)return;const l=()=>wt(a.clientHeight||0);l();const Ie=new ResizeObserver(l);return Ie.observe(a),()=>Ie.disconnect()},[A,me]);const te=(a,l)=>{try{localStorage.setItem(a,String(l))}catch{}},Ae=(a,l)=>{switch(a){case"fontSize":typeof l=="number"&&(x.setSubtitleFontSize(l),te("subtitleFontSize",l));break;case"position":typeof l=="number"&&(x.setSubtitlePosition(l),te("subtitlePosition",l));break;case"bgOpacity":typeof l=="number"&&(x.setSubtitleBgOpacity(l),te("subtitleBgOpacity",l));break;case"bgColor":typeof l=="string"&&(x.setSubtitleBgColor(l),te("subtitleBgColor",l));break;case"textColor":typeof l=="string"&&(x.setSubtitleTextColor(l),te("subtitleTextColor",l));break;case"edge":(l==="shadow"||l==="outline"||l==="none")&&(x.setSubtitleEdge(l),te("subtitleEdge",l));break;case"bold":typeof l=="boolean"&&(x.setSubtitleBold(l),te("subtitleBold",l));break}};f(()=>{const a="tv-player-subtitle-style";let l=document.getElementById(a);l||(l=document.createElement("style"),l.id=a,document.head.appendChild(l));const Ie={fontSize:Z,position:$,bgOpacity:Pe,bgColor:Me,textColor:se,edge:Te,bold:ee},H=A.current,ft=an(Z,he||H?.clientHeight||720);if(l.textContent=En({...Ie,fontSize:ft}),H){const bt=()=>{const h=Number($);return isNaN(h)?0:Math.max(0,Math.min(100,h))},Ze=(h,F)=>{try{const U=h;U.snapToLines=!1,U.line=F}catch{}},et=()=>{const h=ft*16,F=H.videoHeight||H.clientHeight||720,U=H.videoWidth||H.clientWidth||1280;return{step:h*1.3/F*100,chars:Math.max(20,Math.floor(U/(h*.55)))}},fe=h=>{const F=Math.max(0,Math.min(100,100-bt())),U=Array.from(h.activeCues??[]);if(U.length<=1){U.forEach(ae=>Ze(ae,F));return}const{step:vt,chars:Mt}=et();let tt=F;for(let ae=U.length-1;ae>=0;ae--){const nt=String(U[ae].text??"").replace(/<[^>]*>/g,"").split(`
|
|
2
|
-
`).reduce((oe,Fe)=>oe+Math.max(1,Math.ceil(Fe.length/Mt)),0),rt=tt-nt*vt;Ze(U[ae],Math.max(0,rt)),tt=rt-vt*.4}},be=()=>{const h=Math.max(0,Math.min(100,100-bt()));Array.from(H.textTracks).forEach(F=>{F.cues&&(Array.from(F.cues).forEach(U=>Ze(U,h)),F.mode==="showing"&&fe(F))})};be();const Oe=h=>{const F=h.target;F.mode==="showing"&&fe(F)},ve=()=>{Array.from(H.textTracks).forEach(h=>{h.removeEventListener("cuechange",Oe),h.addEventListener("cuechange",Oe)}),be()};Array.from(H.textTracks).forEach(h=>{h.addEventListener("cuechange",Oe)}),H.textTracks.addEventListener("addtrack",ve);const _=Array.from(H.querySelectorAll("track")),Ee=()=>be();return _.forEach(h=>h.addEventListener("load",Ee)),()=>{Array.from(H.textTracks).forEach(h=>{h.removeEventListener("cuechange",Oe)}),H.textTracks.removeEventListener("addtrack",ve),_.forEach(h=>h.removeEventListener("load",Ee))}}},[Z,$,Pe,Me,se,Te,ee,M,j,A,he]);const $e=a=>{const l=A.current;!l||isNaN(C.duration)||C.duration===0||(l.currentTime=a*C.duration)},Bt=()=>{A.current&&(x.setIsScrubbing(!0),x.wasPlayingBeforeScrub.current=!A.current.paused,A.current.pause())},Ye=a=>{const l=A.current;l&&C.duration&&(l.currentTime=a*C.duration)},Ce=()=>{x.setIsScrubbing(!1),x.wasPlayingBeforeScrub.current&&A.current?.play().catch(()=>{})},Q=a=>{const l=A.current;l&&(l.volume=a,l.muted=a===0,localStorage.setItem("playerVolume",a.toString()))},mt=()=>{x.toggleMute()},Le=j.length>0,ge=M>=0,Xe=()=>{w("main"),x.setShowControls(!0)},T=()=>{if(ge){u(-1);return}let a=null;try{a=localStorage.getItem("tvLastSubtitle")}catch{}u(jt(j,{lastKey:a,enabled:!0}))},d=()=>{w(null)},Y=()=>t(Nt,{children:[me.length>1&&t("button",{className:o.menuItem,onClick:()=>w("quality"),children:[t("span",{children:"Quality"}),t("span",{className:o.currentValue,children:me[ce]?.quality||"Auto"})]}),Se&&O.length>0&&t("button",{className:o.menuItem,onClick:()=>w("server"),children:[t("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t(I,{name:"server",size:12})," Movy Server"]}),t("span",{className:o.currentValue,style:{textTransform:"capitalize"},children:Je})]}),Le&&t("button",{className:o.menuItem,onClick:()=>w("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:o.currentValue,children:ge?j[M]?.label||j[M]?.language:"Off"})]}),Le&&t("button",{className:o.menuItem,onClick:()=>w("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:o.currentValue,children:[Z.toFixed(1),"x · ",$]})]}),V.length>0&&t("button",{className:o.menuItem,onClick:()=>w("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:o.currentValue,children:V[r]?.label||V[r]?.language})]}),t("button",{className:o.menuItem,onClick:()=>w("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:o.currentValue,children:Qe?`${ct}ms`:"Off"})]})]}),ne=()=>t(It,{classes:{item:o.menuItem,active:o.active},options:me.map((a,l)=>({key:String(l),label:a.quality,selected:l===ce})),onSelect:a=>Ge(Number(a))}),pt=()=>t(It,{classes:{item:o.menuItem,active:o.active},options:[{key:"off",label:"Off",selected:!ge},...j.map((a,l)=>({key:String(l),label:a.label||a.language,selected:l===M}))],onSelect:a=>u(a==="off"?-1:Number(a))}),ht=()=>t(Kn,{classes:{item:o.menuItem,active:o.active},values:{fontSize:Z,position:$,bgOpacity:Pe,bgColor:Me,textColor:se,edge:Te,bold:ee},onChange:Ae}),ke=()=>t(Dr,{classes:{item:o.menuItem,active:o.active},tracks:V,selected:r,onChange:G}),gt=()=>t(It,{classes:{item:o.menuItem,active:o.active},options:O.map(a=>({key:a,label:t("span",{style:{textTransform:"capitalize"},children:a}),selected:Je===a})),onSelect:a=>X?.(a)}),xe=()=>t(qn,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},enabled:Qe,delayMs:ct,onToggle:a=>Et?.(a),onDelayChange:a=>dt?.(a),onCalibrate:()=>{w(null),J?.()}}),Re=C.isMuted?t(I,{name:"volume-mute"}):C.volume<.5?t(I,{name:"volume-down"}):t(I,{name:"volume-up"}),Pt=t("div",{className:`${o.controlsOverlay} ${!C.showControls&&!k?o.hidden:""}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none"},children:t("div",{className:o.topControls,onClick:a=>a.stopPropagation(),children:[t("button",{className:o.backBtn,onClick:y,title:"Back","aria-label":"Back",children:t(I,{name:"chevron-left"})}),t("div",{className:o.videoTitleInfo,children:[t("span",{className:o.animeTitle,children:E}),z&&t("span",{className:o.episodeLabel,children:z})]})]})}),De=t(wn,{isPlaying:C.isPlaying,onTogglePlay:x.togglePlay,onSkipBack:()=>x.seek(-10),onSkipForward:()=>x.seek(10)}),re=t("div",{className:`${o.controlsOverlay} ${!C.showControls&&!k?o.hidden:""}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:o.bottomControls,onClick:a=>a.stopPropagation(),children:[t(Bn,{classes:{container:o.progressBarContainer,scrubbing:o.scrubbing,timeBubble:o.timeBubble,bar:o.progressBar,buffered:o.bufferedBar,watched:o.watchedBar,thumb:o.thumb},videoRef:A,duration:C.duration,formatTime:Ht,isScrubbing:C.isScrubbing,buffered:"full",onSeek:$e,onScrubStart:Bt,onScrubMove:Ye,onScrubEnd:Ce,timeLabelRef:de}),t("div",{className:o.bottomControlsRow,children:[t("div",{className:o.leftControls,children:[t("button",{className:o.controlBtn,onClick:x.togglePlay,"aria-label":C.isPlaying?"Pause":"Play",children:C.isPlaying?t(I,{name:"pause"}):t(I,{name:"play"})}),t(Pn,{muted:C.isMuted,volume:C.volume,volumeIcon:Re,buttonClassName:o.controlBtn,onToggleMute:mt,onVolumeChange:Q,onExpandedChange:a=>x.setShowVolumeSlider(a)}),t("span",{className:o.timeDisplay,ref:de,children:[Ht(0)," / ",Ht(C.duration)]})]}),t("div",{className:o.rightControls,children:[Le&&t("button",{className:`${o.controlBtn} ${ge?o.active:""}`,onClick:T,"aria-label":ge?"Turn subtitles off":"Turn subtitles on",children:t(I,{name:"closed-captioning"})}),t("button",{className:`${o.controlBtn} ${k?o.active:""}`,onClick:()=>k?d():Xe(),"aria-label":"Settings",children:t(I,{name:"cog"})}),t("button",{className:o.controlBtn,onClick:x.toggleFullscreen,"aria-label":C.isFullscreen?"Exit Fullscreen":"Fullscreen",children:C.isFullscreen?t(I,{name:"compress"}):t(I,{name:"expand"})})]})]})]})}),Ne=k?t("div",{"data-speed-boost-ignore":"true",onClick:a=>a.stopPropagation(),children:t(jn,{classes:{panel:o.settingsPanel,header:o.settingsHeader,backBtn:o.settingsBackBtn,title:o.settingsTitle,content:o.settingsContent},title:k==="main"?"Settings":k==="subtitle-style"?"Subtitle Style":k==="audio"?"Audio Track":k==="server"?"Movy Server":k==="av-sync"?"A/V Sync":k.charAt(0).toUpperCase()+k.slice(1),onBack:()=>k==="main"?d():w("main"),children:[k==="main"&&Y(),k==="quality"&&ne(),k==="subtitles"&&pt(),k==="subtitle-style"&&ht(),k==="audio"&&ke(),k==="server"&>(),k==="av-sync"&&xe()]})}):null,Ve=C.isSpeedBoostActive?t("div",{className:o.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(I,{name:"forward",size:12})]}):null;return t(Mn,{player:p,topBar:Pt,centerControls:De,bottomBar:re,settingsPanel:Ne,overlays:Ve,isInteracting:!!k,className:C.isFullscreen?o.fullscreenFlat:"",children:pe})};function Or(p,E,z){const V=()=>{const G=Array.isArray(p.audioTracks)?p.audioTracks.length:0,j=z.getWant(),M=G>0?Math.min(Math.max(0,j),G-1):j;p.audioTrack=M,M!==j&&z.onResolve(M)},r=(G,j)=>{const M=z.getWant(),u=Array.isArray(p.audioTracks)?p.audioTracks.length:0;if(j.id!==M&&M>=0&&M<u){p.audioTrack!==M&&(p.audioTrack=M);return}z.onResolve(j.id)};return p.on(E.MANIFEST_PARSED,V),p.on(E.AUDIO_TRACK_SWITCHED,r),()=>{p.off(E.MANIFEST_PARSED,V),p.off(E.AUDIO_TRACK_SWITCHED,r)}}const Fr="_page_263ma_1",zr="_header_263ma_7",Hr="_pageTitle_263ma_11",Ur="_searchForm_263ma_21",Wr="_searchInput_263ma_27",jr="_searchBtn_263ma_42",Kr="_suggestions_263ma_58",qr="_suggestionPill_263ma_65",Gr="_statusMsg_263ma_81",Jr="_error_263ma_87",Qr="_textOnly_263ma_91",Yr="_spinner_263ma_96",Xr="_spin_263ma_96",Zr="_grid_263ma_110",es="_skeletonCard_263ma_116",ts="_skeletonThumb_263ma_121",ns="_skeletonLine_263ma_127",rs="_shimmer_263ma_134",ss="_backBtn_263ma_154",as="_meta_263ma_172",os="_headerActions_263ma_180",is="_watchlistBtn_263ma_187",ls="_active_263ma_205",cs="_year_263ma_215",ds="_rating_263ma_220",us="_typeBadge_263ma_229",ms="_tv_263ma_237",ps="_movie_263ma_242",hs="_tvSeries_263ma_247",gs="_tvMiniSeries_263ma_252",fs="_overview_263ma_257",bs="_controls_263ma_264",vs="_controlLabel_263ma_272",ys="_select_263ma_282",_s="_playerSection_263ma_293",Ss="_video_263ma_297",Ts="_videoHidden_263ma_319",Cs="_delayCanvas_263ma_324",ks="_delayCanvasActive_263ma_337",xs="_subtitleOverlay_263ma_341",Ns="_videoIframe_263ma_360",Is="_retryButton_263ma_368",Es="_sidebarSeason_263ma_383",ws="_mobileSeasonRow_263ma_399",Bs="_sidebarPosterCard_263ma_413",Ps="_sidebarPosterMeta_263ma_428",Ms="_providerSelectWrap_263ma_445",As="_genreRow_263ma_457",$s="_genreChip_263ma_464",Ls="_metaRow_263ma_474",Rs="_detailGrid_263ma_483",Ds="_detailItem_263ma_490",Vs="_imdbLink_263ma_512",c={page:Fr,header:zr,pageTitle:Hr,searchForm:Ur,searchInput:Wr,searchBtn:jr,suggestions:Kr,suggestionPill:qr,statusMsg:Gr,error:Jr,textOnly:Qr,spinner:Yr,spin:Xr,grid:Zr,skeletonCard:es,skeletonThumb:ts,skeletonLine:ns,shimmer:rs,backBtn:ss,meta:as,headerActions:os,watchlistBtn:is,active:ls,year:cs,rating:ds,typeBadge:us,tv:ms,movie:ps,tvSeries:hs,tvMiniSeries:gs,overview:fs,controls:bs,controlLabel:vs,select:ys,playerSection:_s,video:Ss,videoHidden:Ts,delayCanvas:Cs,delayCanvasActive:ks,subtitleOverlay:xs,videoIframe:Ns,retryButton:Is,sidebarSeason:Es,mobileSeasonRow:ws,sidebarPosterCard:Bs,sidebarPosterMeta:Ps,providerSelectWrap:Ms,genreRow:As,genreChip:$s,metaRow:Ls,detailGrid:Rs,detailItem:Ds,imdbLink:Vs},Os=[],Xs=()=>{const{id:p}=kn(),[E]=xn(),z=Nn(),V=E.get("type"),[r,G]=v(null),[j,M]=v(!1),[u,me]=v(()=>parseInt(E.get("s")||"1",10)||1),[ce,Ge]=v([]),[y,pe]=v(()=>parseInt(E.get("e")||"1",10)||1),[O,Je]=v(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[X,Se]=v([]),{options:Qe,isFallback:Et,isLoading:ct}=Jn(),dt=_e(()=>Qe.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.value,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[Qe]),J=Et||dt.length===0?Os:dt,C=J.filter(e=>e.tier==="direct"),ut=J.filter(e=>e.tier==="embed"),[x,A]=v(!1),[Z,$]=v(""),[Pe,Me]=v([]),[se,Te]=v(0),[ee,k]=v([]),[w,de]=v(-1),[he,wt]=v("all"),[te,Ae]=v(0),[$e,Bt]=v(""),[Ye,Ce]=v(""),[Q,mt]=v(()=>{try{return localStorage.getItem("movyServer")||""}catch{return""}}),Le=D([]);f(()=>{Le.current=X},[X]);const ge=D(se);f(()=>{ge.current=se},[se]);const Xe=D(w);f(()=>{Xe.current=w},[w]);const T=An({skipIntervals:[]}),d=T.refs.videoRef;$n(T,X.length>0||Ye!=="");const Y=D(null),ne=D([]),pt=D(null),ht=D(null),[ke,gt]=v(()=>{try{const e=Number(localStorage.getItem("playerVideoDelayMs"));if(Number.isFinite(e)&&e>=0&&e<=500)return Math.round(e)}catch{}return 180}),[xe,Re]=v(()=>{try{return localStorage.getItem("playerVideoDelayEnabled")==="true"}catch{return!1}}),[Pt,De]=v(!1),[re,Ne]=v(!1),Ve=D(null),a=D(null),l=(e,n)=>{try{localStorage.setItem("playerVideoDelayMs",String(e)),localStorage.setItem("playerVideoDelayEnabled",String(n))}catch{}},Ie=e=>{const n=Math.max(0,Math.min(500,Math.round(e)));gt(n);try{localStorage.setItem("playerVideoDelayMs",String(n))}catch{}},H=()=>{Ve.current={enabled:xe,ms:ke},Re(!0);try{localStorage.setItem("playerVideoDelayEnabled","true")}catch{}De(!0)},ft=()=>{const e=Ve.current;Ve.current=null,e&&(gt(e.ms),Re(e.enabled),l(e.ms,e.enabled)),Ne(!1),De(!1)},bt=()=>{Ve.current=null,Re(!0),l(ke,!0),Ne(!1),De(!1)},Ze=()=>{if(re){Ne(!1);return}const e=d.current;e&&!isNaN(e.currentTime)&&(a.current=e.currentTime),Ne(!0)},et=xe?ke:0;Ln({videoRef:d,canvasRef:pt,delayMs:et,enabled:xe});const fe=xe,{hasConsent:be,grant:Oe}=Gn(),ve=D("");ve.current||(ve.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const _=V==="movie",Ee=p?Qn(V||"tv",p):"",h=Ee,F=Yn(),{toggle:U,bookmarkedIds:vt,pending:Mt}=Xn(),{data:tt}=Zn(r?Ee:void 0),ae=tt?!!tt.inLibrary:Ee?vt.has(Ee):!1,Kt=P(()=>{!r||!p||U({tmdbId:Number(p),mediaType:V||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,p,V,U]),{data:nt,isFetched:rt}=er(h||void 0,u,y),[oe,Fe]=v(!1),[ze,qt]=v(0),[st,Gt]=v(!1),[on,at]=v(!1),[ln,Jt]=v(""),[yt,cn]=v(!1),[dn,At]=v(!1),un=sr(),_t=D(!1),we=D(null),$t=D(0),Qt=D(!1),K=D(null),Yt=D(""),ot=D(!1);f(()=>{ot.current=oe},[oe]);const He=D(!1);f(()=>{He.current=st},[st]);const mn=e=>{const n=Math.floor(e/3600),s=Math.floor(e%3600/60),i=Math.floor(e%60);return n>0?`${n}:${String(s).padStart(2,"0")}:${String(i).padStart(2,"0")}`:`${s}:${String(i).padStart(2,"0")}`},ye=P((e,n)=>{!h||!n||n<30||Math.abs(e-$t.current)<10||($t.current=e,F.mutate({mediaId:h,season:u,episode:y,currentTime:Math.floor(e),duration:Math.floor(n),title:r?.title??null,poster:r?.poster??null,backdrop:r?.backdrop??null,year:r?.year??null,overview:r?.overview??null,tmdbId:r?.id??null,mediaType:V||"tv",adult:r?.adult?1:0}))},[h,u,y,F,r,V]),Ue=P((e,n)=>{Ne(!1),De(!1);const s=new URLSearchParams(E);s.set("type",E.get("type")||"tv"),s.set("s",String(e)),s.set("e",String(n)),z(`${window.location.pathname}?${s.toString()}`)},[E,z]),pn=P(()=>{if(re)return;const e=d.current;!e||e.paused||e.ended||(we.current&&clearTimeout(we.current),we.current=setTimeout(()=>{ye(e.currentTime,e.duration||0)},5e3))},[ye,d,re]),hn=P(()=>{const e=d.current;if(e){if(we.current&&clearTimeout(we.current),ye(e.currentTime,e.duration||0),Qt.current=!0,_&&r)Jt(r.title),at(!0);else if(r){const n=y+1;ce.some(m=>m.episode_number===n)?(pe(n),Ue(u,n)):(Jt(`${r.title} — Season ${u}`),at(!0))}}},[_,r,y,u,ce,ye,Ue,d]),gn=P(()=>{Qt.current=!1,T.actions.onPlay()},[T.actions]),fn=P(()=>{T.actions.onPause();const e=d.current;e&&!e.ended&&ye(e.currentTime,e.duration||0)},[T.actions,ye,d]),bn=P(()=>{T.actions.onLoadedMetadata();const e=d.current;if(e){try{const n=parseFloat(localStorage.getItem("playerVolume")||"");isNaN(n)||(e.volume=Math.max(0,Math.min(1,n))),e.muted=localStorage.getItem("playerMuted")==="true"}catch{}if(K.current!=null&&K.current>0){try{e.currentTime=K.current}catch{}K.current=null}}},[T.actions,d]),We=P(()=>{const e=d.current;if(e&&K.current!=null&&K.current>0){try{e.currentTime=K.current}catch{}K.current=null}},[d]),vn=P(()=>{ze>0&&(K.current=ze);const e=d.current;if(e&&ze>0){try{e.currentTime=ze,K.current=null}catch{}e.play().catch(()=>{})}Fe(!1),_t.current=!0},[ze,d]),Xt=P(()=>{K.current=null;const e=d.current;e&&(e.currentTime=0,e.play().catch(()=>{})),Fe(!1),_t.current=!0},[d]);f(()=>{_t.current=!1,Fe(!1),qt(0),Gt(!1),He.current=!1,K.current=null,Yt.current=`${h}:${u}:${y}`,$t.current=0},[h,u,y]),f(()=>{rt&&(Gt(!0),He.current=!0)},[rt,h,u,y]),f(()=>{if(!nt||_t.current)return;const e=nt,n=e.currentTime??0,s=e.duration??0;n>5&&(s<=0||n<s*.8)&&(qt(n),Fe(!0))},[nt,h,u,y]),f(()=>{oe&&d.current&&d.current.pause()},[oe,d]),f(()=>{const e=d.current;return()=>{we.current&&clearTimeout(we.current),e&&!e.ended&&ye(e.currentTime,e.duration||0)}},[ye,d]);const Lt=P(e=>{let n=null,s=!0;try{n=localStorage.getItem("tvLastSubtitle"),s=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return jt(e,{lastKey:n,enabled:s})},[]),Rt=P(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),Zt=P(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const s=e.findIndex(g=>Wt(g)===n);if(s>=0)return s;const i=n.indexOf("|||"),m=i>=0?n.slice(0,i):n,S=i>=0?n.slice(i+3):n,b=e.findIndex(g=>g.language===m||g.label===S);if(b>=0)return b}return jt(e,{lastKey:null,enabled:!0})},[]),Dt=_e(()=>J.find(e=>e.id===O),[J,O]),B=Dt?.tier==="embed",q=_e(()=>Dt?.servers??[],[Dt]),{data:en}=tr(h||void 0),tn=_e(()=>(en?.progress??[]).filter(n=>n.season===u&&n.duration>0&&n.currentTime>=n.duration*.8).map(n=>String(n.episode)),[en,u]),nn=_e(()=>ce.map(e=>({id:String(e.episode_number),label:`Episode ${e.episode_number}`,sublabel:e.name||void 0,thumbnail:e.still_path?`https://image.tmdb.org/t/p/w185${e.still_path}`:void 0})),[ce]),St=_e(()=>ce.map(e=>e.episode_number).sort((e,n)=>e-n),[ce]),it=St.indexOf(y),Vt=it>0?St[it-1]:null,je=it>=0&&it<St.length-1?St[it+1]:null,rn=_e(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Ot=_e(()=>[r?.year,r?.status,r?.number_of_seasons?`${r.number_of_seasons} Season${r.number_of_seasons>1?"s":""}`:null,r?.number_of_episodes?`${r.number_of_episodes} Episodes`:null].filter(Boolean),[r]);f(()=>{if(J.length!==0&&!J.some(e=>e.id===O)){const e=J.find(n=>n.tier==="direct")?.id??J[0].id;Je(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[J,O]),f(()=>{if(q.length!==0&&!q.includes(Q)){mt(q[0]);try{localStorage.setItem("movyServer",q[0])}catch{}}},[q,Q]),f(()=>{if(!p){G(null),Se([]),$(""),Ce("");return}const e=Number(p),n=V||"tv";M(!0),G(null),Se([]),$(""),Ce("");const s=parseInt(E.get("s")||"",10),i=parseInt(E.get("e")||"",10);me(isNaN(s)?1:s),pe(isNaN(i)?1:i),Ae(0),fetch(`/api/tv/details/${n}/${e}`).then(m=>m.json()).then(m=>{G(m),M(!1),m.seasons&&m.seasons.length>0&&isNaN(s)&&me(m.seasons[0].season_number)}).catch(()=>{M(!1)})},[p,V,E]),f(()=>{if(!r||!p)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){Ge([]);return}const n=parseInt(E.get("e")||"",10);fetch(`/api/tv/episodes/${p}/${u}`).then(s=>s.json()).then(s=>{if(Ge(s.episodes||[]),s.episodes?.length>0){const i=!isNaN(n)&&s.episodes.find(m=>m.episode_number===n)?n:s.episodes[0].episode_number;pe(i)}}).catch(()=>{})},[r,p,u,E]),f(()=>{!r||!p||_||fetch(`/api/tv/episodes/${p}/${u}`).then(e=>e.json()).then(e=>{const n=e.episodes||[];Ge(n),n.length>0&&!n.find(s=>s.episode_number===y)&&pe(n[0].episode_number)}).catch(()=>{})},[u,r,p,_,y]),f(()=>{if(!B||!r||!p)return;fetch(`/api/tv/embed/${O}/${_?"movie":"tv"}/${p}?season=${u}&episode=${y}`).then(n=>n.json()).then(n=>{if(n.url)return Ce(n.url),fetch(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(s=>s.json()).then(s=>{s.finalUrl&&Ce(s.finalUrl)})}).catch(()=>{})},[O,r,p,u,y,_,B]);const Tt=P(async()=>{if(!r||!p||!O||B||r.adult&&!be)return;Le.current.length>0?$(""):(A(!0),$(""),Se([]),Ae(0),Me([]),k([]));try{const n=_?"movie":"tv",s=new URLSearchParams({title:r.title||"",year:r.year||"",season:String(u),episode:String(y),totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||""});q.length>0&&Q&&s.set("server",Q);const m=await(await fetch(`/api/tv/sources/${O}/${n}/${p}?${s.toString()}`)).json();if(A(!1),!m.valid||!m.sources?.length){$(m.error?`${m.error}`:q.length>0?`No streams from ${Q}. Try another server.`:"No streams available.");return}Se(m.sources),wt("all"),Ae(0),m.referer&&Bt(m.referer);const S=m.audioTracks||[];Me(S),Te(S.length>0?Zt(S):0);const b=m.subtitles||[];if(k(b),b.length>0){const L=Lt(b);de(L),Rt(L)}else de(-1);fetch(`/api/tv/subtitles/${n}/${p}?season=${u}&episode=${y}`).then(L=>L.json()).then(L=>{const ie=Array.isArray(L.subtitles)?L.subtitles:[];ie.length!==0&&k(W=>{const R=[...W,...ie.filter(N=>!W.some(le=>le.url===N.url))];if(W.length===0){const N=Lt(R);de(N),Rt(N)}return R})}).catch(()=>{}),$("")}catch{A(!1),$("Failed to load streams.")}},[r,p,O,u,y,_,B,be,q,Q,Lt,Rt,Zt]),Ft=P(e=>{const n=e.toLowerCase();mt(n);try{localStorage.setItem("movyServer",n)}catch{}$("")},[]),yn=P(e=>{Je(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);f(()=>{O&&r&&!B&&Tt()},[O,r,Tt,B]),f(()=>{if(!d.current||(Y.current&&(Y.current.destroy(),Y.current=null),B))return;let e=!1;if(re){const b=d.current;return b&&(b.pause(),b.removeAttribute("src"),b.load(),b.src="/av-sync-test.mp4",ot.current||b.play().catch(()=>{})),()=>{e=!0}}const n=he==="all"?X:X.filter(b=>b.type===he),s=n[te]?.url||"";if(!s)return;const i=d.current;if(Yt.current===`${h}:${u}:${y}`&&K.current==null)try{!i.ended&&i.currentTime>1&&(K.current=i.currentTime)}catch{}i.pause(),i.removeAttribute("src"),i.load();const m=`/api/tv/stream-proxy?url=${encodeURIComponent(s)}&referer=${encodeURIComponent($e)}`;n[te]?.type==="hls"?(async()=>{const b=await nr();if(!e)if(b&&b.isSupported()){const g=new b({enableWorker:!0});Y.current=g,g.on(b.Events.ERROR,(W,R)=>{R.fatal&&($(`Stream failed (${R.details}). Try another source or reload.`),A(!1),g.destroy(),Y.current=null)}),g.loadSource(m),g.attachMedia(i);const L=()=>{let W=!1,R=0;try{W=localStorage.getItem("tvSubtitlesEnabled")==="true";const N=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(N)&&N>=0&&(R=N)}catch{}return{enabled:W,index:R}},ie=()=>{if(typeof g.subtitleTrack!="number")return;if(ne.current.length>0){g.subtitleTrack=-1;return}const W=Array.isArray(g.subtitleTracks)?g.subtitleTracks:[];if(W.length===0){g.subtitleTrack=-1;return}const R=L();if(R.enabled){const N=R.index<W.length?R.index:0;g.subtitleTrack=N,de(N)}else g.subtitleTrack=-1};Or(g,b.Events,{getWant:()=>ge.current,onResolve:W=>Te(W)}),g.on(b.Events.MANIFEST_PARSED,()=>{ie(),a.current!=null&&(i.currentTime=a.current,a.current=null),We(),!ot.current&&He.current&&i.play().catch(()=>{})}),g.on(b.Events.SUBTITLE_TRACKS_UPDATED,()=>{ie()}),g.on(b.Events.SUBTITLE_TRACK_SWITCH,(W,R)=>{if(ne.current.length>0){if(R.id!==-1)try{g.subtitleTrack=-1}catch{}return}const N=Array.isArray(g.subtitleTracks)?g.subtitleTracks:[];if(N.length!==0){if(R.id===-1){const le=L();if(le.enabled){const xt=le.index<N.length?le.index:0;g.subtitleTrack=xt;return}}de(R.id)}})}else rr(i)&&(i.src=m,a.current!=null&&(i.currentTime=a.current,a.current=null),We(),!ot.current&&He.current&&i.play().catch(()=>{$("Failed to play stream. Try another source.")}))})():(i.src=m,a.current!=null&&(i.currentTime=a.current,a.current=null),We(),!ot.current&&He.current&&i.play().catch(()=>{$("Failed to play stream. Try another source.")}));const S=()=>{const L=i.error?.code===4?"Video source not supported or not found":"Failed to load video stream";$(`${L}. The source may be invalid or expired. Try switching source or reloading.`),A(!1)};return i.addEventListener("error",S),()=>{e=!0,i.removeEventListener("error",S)}},[X,te,he,O,$e,B,d,re,h,u,y,We]),f(()=>{if(!st||oe||B||re)return;const e=d.current;!e||!e.paused||e.ended||e.readyState<1||(We(),e.play().catch(()=>{}))},[st,oe,B,re,We,d]),f(()=>{const e=Y.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=se)},[se]),f(()=>{const e=Y.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ne.current.length>0||(w>=0?e.subtitleTrack=w:e.subtitleTrack=-1)},[w]),f(()=>{const e=d.current;if(!(!e||B)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ne.current=[],ee.length!==0&&(ee.forEach(n=>{const s=document.createElement("track");s.kind="subtitles",s.label=n.label||n.language||"Unknown",s.srclang=n.language||n.label||"en";const i=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent($e)}`;s.src=i,s.addEventListener("load",()=>{const m=ne.current.indexOf(s),S=s.track;S&&m>=0&&(S.mode=m===Xe.current?"showing":"hidden")}),e.appendChild(s),ne.current.push(s)}),ee.length>0)))try{const n=Y.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[ee,$e,B,O,d]),f(()=>{const e=d.current;if(!e||B)return;const n=Y.current;n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const s=()=>{const S=ne.current;if(S.length>0){S.forEach((g,L)=>{const ie=g.track;ie&&(ie.mode=L===w?"showing":"hidden")});return}const b=Array.from(e.textTracks);b.length!==0&&b.forEach((g,L)=>{g.mode=L===w?"showing":"hidden"})};s();const i=()=>s();e.textTracks.addEventListener("addtrack",i),e.addEventListener("loadedmetadata",s,{once:!0});const m=window.setTimeout(s,600);return()=>{e.textTracks.removeEventListener("addtrack",i),e.removeEventListener("loadedmetadata",s),window.clearTimeout(m)}},[w,ee,B,O,d]),f(()=>{if(!fe)return;const e=d.current,n=ht.current;if(!e||!n)return;const s=()=>{if(n.innerHTML="",Xe.current<0)return;const S=ne.current.map(N=>N.track).find(N=>N&&N.mode==="showing");if(!S)return;const b=et/1e3;let g;if(b>0&&S.cues){const N=e.currentTime-b;g=Array.from(S.cues).filter(le=>le.startTime<=N&&N<=le.endTime)}else g=Array.from(S.activeCues??[]);if(g.length===0)return;const L={fontSize:an(T.state.subtitleFontSize,e.clientHeight||0),position:T.state.subtitlePosition,bgOpacity:T.state.subtitleBgOpacity,bgColor:T.state.subtitleBgColor,textColor:T.state.subtitleTextColor,edge:T.state.subtitleEdge,bold:T.state.subtitleBold},ie=Rn(L),W=Dn(e,L.position),R=Array.from(g);R.forEach((N,le)=>{const xt=String(N.text??"");if(!Vn(xt).trim())return;const zt=document.createElement("div"),Cn=(R.length-1-le)*1.7;zt.style.cssText=`${ie}
|
|
3
|
-
bottom: calc(${W}px + ${Cn}em);`,zt.innerHTML=On(xt),n.appendChild(zt)})},i=()=>s(),m=ne.current.map(S=>S.track).filter(S=>!!S);return m.forEach(S=>S.addEventListener("cuechange",i)),e.addEventListener("timeupdate",i),s(),()=>{m.forEach(S=>S.removeEventListener("cuechange",i)),e.removeEventListener("timeupdate",i),n.innerHTML=""}},[fe,w,ee,et,d,T.state.subtitleFontSize,T.state.subtitlePosition,T.state.subtitleBgOpacity,T.state.subtitleBgColor,T.state.subtitleTextColor,T.state.subtitleEdge,T.state.subtitleBold]);const Ct=()=>{G(null),Se([]),Ce(""),z(-1)},_n=P(e=>{me(e),pe(1),Ue(e,1)},[Ue]),kt=!_&&r?.seasons&&r.seasons.length>1?t("label",{className:c.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:u,onChange:e=>_n(parseInt(e.target.value,10)||1),className:c.select,children:r.seasons.map(e=>t("option",{value:e.season_number,children:["Season ",e.season_number," (",e.episode_count," ep)"]},e.season_number))})]}):null,Ke=P(e=>{const n=parseInt(e,10);isNaN(n)||(pe(n),Ue(u,n)),At(!1)},[u,Ue]);f(()=>{if(_)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(je!=null?Ke(String(je)):In.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[_,je,Ke]);const Sn=e=>{Te(e);try{const s=Pe[e];s&&localStorage.setItem("tvLastAudio",Wt(s))}catch{}const n=Y.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Tn=e=>{de(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const i=ee[e];i&&localStorage.setItem("tvLastSubtitle",Wt(i))}}catch{}const n=d.current,s=Y.current;s&&typeof s.subtitleTrack=="number"&&Array.isArray(s.subtitleTracks)&&s.subtitleTracks.length>0&&(s.subtitleTrack=-1),n&&Array.from(n.textTracks).forEach((i,m)=>{i.mode=m===e?"showing":"hidden"})},lt=P(()=>{if(!r)return;const e=d.current,n=_?"":`S${String(u).padStart(2,"0")}E${String(y).padStart(2,"0")}`;fetch("/api/discord/tv",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:r.title,episodeLabel:n,isPlaying:e?!e.paused&&!e.ended:!0,thumbnail:r.poster,currentTime:e?e.currentTime:0,duration:e&&e.duration||0,isAdult:r.adult===!0,sessionId:ve.current})}).catch(()=>{}),fetch("/api/discord/heartbeat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:ve.current})}).catch(()=>{})},[r,_,u,y,d]);f(()=>{if(!r)return;lt();const e=window.setInterval(()=>{const n=d.current;(!n||!n.paused)&<()},15e3);return()=>window.clearInterval(e)},[lt,r,d]),f(()=>{if(!r||B||x||Z||X.length===0)return;const e=d.current;if(!e)return;const n=()=>lt();return e.addEventListener("play",n),e.addEventListener("pause",n),e.addEventListener("seeked",n),()=>{e.removeEventListener("play",n),e.removeEventListener("pause",n),e.removeEventListener("seeked",n)}},[r,B,x,Z,X,lt,d]),f(()=>{const e=ve.current,n=()=>{const i=JSON.stringify({sessionId:e});navigator.sendBeacon?(navigator.sendBeacon("/api/discord/clear",new Blob([i],{type:"application/json"})),navigator.sendBeacon("/api/discord/heartbeat",new Blob([JSON.stringify({sessionId:e,bye:!0})],{type:"application/json"}))):fetch("/api/discord/clear",{method:"POST",headers:{"Content-Type":"application/json"},body:i,keepalive:!0}).catch(()=>{})},s=()=>n();return window.addEventListener("pagehide",s),window.addEventListener("beforeunload",s),()=>{window.removeEventListener("pagehide",s),window.removeEventListener("beforeunload",s),n()}},[]);const sn=he==="all"?X:X.filter(e=>e.type===he);return f(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=_?`${r.title} - dango`:`${r.title} - Season ${u} Episode ${y} - dango`},[r,_,u,y]),f(()=>{if(!r||_)return;const e=new URLSearchParams(E),n=e.get("s"),s=e.get("e"),i=String(u),m=String(y);n===i&&s===m||(e.set("type",E.get("type")||"tv"),e.set("s",i),e.set("e",m),z(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,_,u,y,E,z]),t("div",{className:Be.playerPageLayout,children:[t("aside",{className:Be.episodeSidebar,children:r?_?t("div",{className:c.sidebarPosterCard,children:[r.poster&&t("img",{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"}),t("div",{className:c.sidebarPosterMeta,children:[t("strong",{children:r.title}),t("span",{children:r.year})]})]}):t(Fn,{episodes:nn,currentEpisode:String(y),watchedEpisodes:tn,onEpisodeClick:Ke,header:kt}):_?t("div",{className:c.statusMsg,children:[t(I,{name:"spinner",className:c.spinner})," Loading..."]}):t(zn,{variant:"sidebar"})}),t("div",{className:Be.playerMain,children:[r&&t("div",{className:c.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!be?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:[x&&!B&&t("div",{className:c.statusMsg,children:[t(I,{name:"spinner",className:c.spinner})," Loading stream..."]}),B&&Ye?t("iframe",{src:Ye,className:c.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!B&&!x&&sn.length>0?t(Nt,{children:[Z&&t("div",{className:`${c.statusMsg} ${c.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:[t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:Z}),t("button",{className:c.retryButton,onClick:Tt,children:"Retry"})]}),q.length>0&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center",marginTop:4},children:[t("span",{style:{fontSize:"0.8rem",opacity:.9,fontWeight:600},children:"Servers:"}),q.map(e=>t("button",{onClick:()=>Ft(e),className:c.retryButton,style:{padding:"4px 8px",fontSize:"0.75rem",textTransform:"capitalize",background:Q===e?"var(--accent)":void 0,color:Q===e?"white":void 0},children:e},e))]})]}),t(Vr,{player:T,title:r.title,episodeLabel:_?void 0:`S${u} E${y}`,audioTracks:Pe,selectedAudioTrack:se,onAudioTrackChange:Sn,subtitles:ee,selectedSubtitle:w,onSubtitleChange:Tn,streams:sn,qualityIdx:te,onQualityChange:Ae,onBack:Ct,movyServers:q,selectedMovyServer:Q,onMovyServerSelect:Ft,isMovySource:q.length>0,videoDelayEnabled:xe,onVideoDelayToggle:e=>{Re(e);try{localStorage.setItem("playerVideoDelayEnabled",String(e))}catch{}},videoDelayMs:ke,onVideoDelayChange:Ie,onCalibrateAvSync:H,children:[t("video",{ref:d,autoPlay:st&&!oe,playsInline:!0,disablePictureInPicture:!0,className:`${c.video} ${fe?c.videoHidden:""}`,onTimeUpdate:pn,onEnded:()=>{re||hn()},onPlay:gn,onPause:fn,onLoadedMetadata:bn,onVolumeChange:T.actions.onVolumeChange,onContextMenu:e=>e.preventDefault(),onError:()=>{$("Video failed to load. Try another server or reload."),A(!1)}}),t("canvas",{ref:pt,className:`${c.delayCanvas} ${fe?c.delayCanvasActive:""}`}),fe&&t("div",{ref:ht,className:c.subtitleOverlay}),t(Hn,{isOpen:Pt,ms:ke,onChange:Ie,onApply:bt,onClose:ft,testClipActive:re,onTestClip:Ze})]})]}):Z&&!B?t("div",{className:`${c.statusMsg} ${c.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:[t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:Z}),t("button",{className:c.retryButton,onClick:Tt,children:"Retry"})]}),q.length>0&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center",marginTop:4},children:[t("span",{style:{fontSize:"0.8rem",opacity:.9,fontWeight:600},children:"Servers:"}),q.map(e=>t("button",{onClick:()=>Ft(e),className:c.retryButton,style:{padding:"4px 8px",fontSize:"0.75rem",textTransform:"capitalize",background:Q===e?"var(--accent)":void 0,color:Q===e?"white":void 0},children:e},e))]})]}):null]}),r&&t(Un,{showTheater:!1}),kt&&t("div",{className:c.mobileSeasonRow,children:kt}),r&&t("div",{className:c.providerSelectWrap,children:t("label",{className:c.controlLabel,children:["Source",t("select",{value:O,onChange:e=>yn(e.target.value),className:c.select,disabled:J.length===0,children:ct?t("option",{value:"",children:"Loading…"}):J.length===0?t("option",{value:"",children:"No providers available"}):t(Nt,{children:[C.length>0&&t("optgroup",{label:"Direct HLS",children:C.map(e=>t("option",{value:e.id,children:e.label},e.id))}),ut.length>0&&t("optgroup",{label:"Embeds",children:ut.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),r&&t("div",{className:Be.playerInfoContainer,children:[t("div",{className:Be.playerInfoHeader,children:[t("div",{className:Be.playerAnimeCard,children:r.poster&&t("img",{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"})}),t("div",{className:Be.videoTitleSection,children:[t("div",{className:ue.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:c.meta,children:[t("span",{className:c.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:c.rating,children:[t(I,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${c.typeBadge} ${c[_?"movie":"tv"]}`,children:_?"Movie":"TV Show"})]}),rn.length>0&&t("div",{className:c.genreRow,children:rn.map(e=>t("span",{className:c.genreChip,children:e},e))}),Ot.length>0&&t("div",{className:c.metaRow,children:Ot.map((e,n)=>t("span",{children:[e,n<Ot.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:ue.controls,children:[t("button",{className:`${ue.watchlistBtn} ${ae?ue.inList:""}`,onClick:Kt,disabled:Mt,type:"button",children:[ae?t(I,{name:"check",size:14}):t(I,{name:"plus",size:14}),ae?"In Watchlist":"Add to Watchlist"]}),!_&&t(Nt,{children:[t("button",{className:`${ue.watchlistBtn}`,onClick:()=>Vt!=null&&Ke(String(Vt)),disabled:Vt==null,type:"button",children:[t(I,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${ue.watchlistBtn}`,onClick:()=>je!=null&&Ke(String(je)),disabled:je==null,type:"button",children:["Next EP",t(I,{name:"chevron-right",size:14})]}),un&&t("button",{className:`${ue.watchlistBtn}`,onClick:()=>At(!0),type:"button",children:[t(I,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:ue.descriptionSection,children:[t("h3",{children:"Synopsis"}),t(ar,{text:r.overview,emptyText:"No description available."})]}),t("button",{className:ue.detailsToggleBtn,onClick:()=>cn(!yt),type:"button",children:[yt?t(I,{name:"chevron-up"}):t(I,{name:"chevron-down"}),yt?"Hide Details":"Show Details"]}),yt&&t("div",{className:c.detailGrid,children:[r.first_air_date&&t("div",{className:c.detailItem,children:[t("strong",{children:_?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:c.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:c.detailItem,children:[t("strong",{children:"Networks"}),t("span",{children:r.networks.map(e=>e.name).join(", ")})]}),r.created_by&&r.created_by.length>0&&t("div",{className:c.detailItem,children:[t("strong",{children:"Created By"}),t("span",{children:r.created_by.map(e=>e.name).join(", ")})]}),r.episode_run_time&&r.episode_run_time.length>0&&t("div",{className:c.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:c.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:c.imdbLink,children:"View on IMDb"})]})]})]}),!_&&t(Wn,{isOpen:dn,onClose:()=>At(!1),episodes:nn,currentEpisode:String(y),watchedEpisodes:tn,onEpisodeClick:Ke,header:kt}),r?.adult&&!be&&t(Ut,{isOpen:!0,title:"Content Warning",onClose:Ct,children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:"This title contains mature content intended for adult audiences."}),t("p",{children:["By proceeding, you confirm that you are ",t("strong",{children:"18 years of age or older"})," ","(or the age of majority in your jurisdiction) and wish to view this content."]}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(qe,{variant:"secondary",onClick:Ct,children:"Go Back"}),t(qe,{onClick:Oe,children:"I'm 18+, Continue"})]})]})}),t(Ut,{isOpen:oe,onClose:Xt,title:"Resume Watching",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:["You were at ",t("strong",{children:mn(ze)})]}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(qe,{variant:"secondary",onClick:Xt,children:"Start from Beginning"}),t(qe,{onClick:vn,children:"Resume"})]})]})}),t(Ut,{isOpen:on,onClose:()=>at(!1),title:"Finished!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(I,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:ln}),t("p",{style:{color:"var(--text-secondary)"},children:_?"You finished this movie!":"You finished this season!"}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(qe,{variant:"secondary",onClick:()=>at(!1),children:"Close"}),t(qe,{onClick:()=>{at(!1),Ct()},children:"Back to Details"})]})]})}),!r&&t("div",{className:c.statusMsg,children:[t(I,{name:"spinner",className:c.spinner})," Loading..."]})]})]})};export{Xs as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as $,d as m,h as b,T as V,u as l}from"./vendor-core-8R2fFbyN.js";import{M as F}from"./MediaCard-Be1ST9oj.js";import{L as U}from"./LibraryListPage-CCiee-Ot.js";import{R as x}from"./ResetProgressModal-CR_ovLAu.js";import{T as N}from"./TvPopup-YTI7dEbJ.js";import{e as f}from"./index-IZgh1beL.js";import{k as _,u as K,a as O,b as Q,l as Y,m as q,o as z,p as G,t as R,i as S,T as y}from"./useTvLibrary-Cwxgy_Bg.js";import"./vendor-ui-CUDCvRS_.js";import"./vendor-icons-CDMuNDeL.js";import"./useIsMobile-Dm_b6Ob3.js";import"./SkeletonGrid-CtHKKMLj.js";import"./ErrorMessage-z4f4WGgP.js";import"./Watchlist.module-XGtVQr1d.js";import"./vendor-query-BXRECSI6.js";const Z=["All","Continue Watching",...y],L=24;function ne(){const{filter:d="All"}=$(),[v,T]=m(1),[o,p]=m(null),[g,c]=m(!1);b(()=>{document.title="TV Watchlist - dango"},[]),b(()=>{T(1)},[d]);const t=d==="Continue Watching",r=_(t?"All":d,v,L),i=K(100),h=O(),P=Q(),I=Y(),k=q(),w=z(),C=G(),E=V(()=>t?(i.data?.data??[]).map(e=>{const a=e.currentTime??0,s=e.duration??0,n=e.season??e.lastSeason??1,u=e.episode??e.lastEpisode??1;return{key:e.id,libId:e.id,tmdbId:e.tmdbId,mediaType:e.mediaType,title:e.title,poster:e.poster||"",year:e.year,adult:S({adult:e.adult===1}),status:e.status,badge:`S${n} E${u}`,progressPercent:s>0?a/s*100:0,progressLabel:s>0?`S${n} E${u} · ${f(a)} / ${f(s)}`:`S${n} E${u}`,watchTarget:R(e.mediaType,e.tmdbId,n,u)}}):(r.data?.data??[]).map(e=>({key:e.id,libId:e.id,tmdbId:e.tmdbId,mediaType:e.mediaType,title:e.title,poster:e.poster||"",year:e.year,adult:S({adult:e.adult===1}),status:e.status,badge:e.lastSeason&&e.lastEpisode?`S${e.lastSeason} E${e.lastEpisode}`:void 0,progressPercent:void 0,progressLabel:void 0,watchTarget:R(e.mediaType,e.tmdbId,e.lastSeason??void 0,e.lastEpisode??void 0)})),[t,i.data,r.data]),B=t?i.data?.total??0:r.data?.total??0,W=t?i.isLoading:r.isLoading,A=t?i.error:r.error,M=()=>{o&&(P.mutate({mediaId:o.libId}),g&&h.mutate(o.libId),p(null),c(!1))};return l(U,{headerTitle:"My TV Watchlist",headerSubtitle:"Track and manage your movies and shows",filters:Z,filterBy:d,filterBasePath:"/tv-watchlist",continueFilter:"Continue Watching",statusOptions:[...y],entries:E,total:B,isLoading:W,error:A,page:v,pageSize:L,onPageChange:T,emptyTitle:"Your TV watchlist is looking a bit empty",emptyFilteredText:"No titles match this filter.",emptyAllText:"Let's find something to watch!",browseLabel:"Browse TV & Movies",browseTarget:"/tv",removeListLabel:"Remove from TV Watchlist",listNoun:"TV watchlist",skipConfirmKey:"tvSkipRemoveConfirmation",onBulkStatus:(e,a)=>k.mutate({ids:e,status:a}),onBulkRemove:e=>{t?C.mutate(e):w.mutate(e)},onStatusChange:(e,a)=>I.mutate({id:e,status:a}),onRemoveItem:e=>h.mutate(e),renderCard:e=>l(F,{item:{id:e.libId,title:e.title,thumbnail:e.poster,typeBadge:e.mediaType==="movie"?"Movie":"TV",chapterBadge:e.badge??null,isAdult:e.adult},linkTo:e.watchTarget,hoverIcon:"play",progress:e.progressPercent!==void 0&&e.progressLabel?{percent:e.progressPercent,label:e.progressLabel}:void 0,showProgress:t,metaRow:e.year?l("span",{style:{opacity:.75},children:e.year}):void 0,onRemove:t?()=>p(e):void 0,renderPopup:(a,s)=>l(N,{item:{id:e.tmdbId??0,title:e.title||"",year:e.year||"",type:e.mediaType||"tv",image:e.poster||""},anchorRect:a,onMouseEnter:s.onMouseEnter,onMouseLeave:s.onMouseLeave,onRequestClose:s.close})}),modals:l(x,{isOpen:!!o,itemName:o?.title,progressKind:"watch",listLabel:"my TV watchlist",alsoRemove:g,onAlsoRemoveChange:c,onClose:()=>{p(null),c(!1)},onConfirm:M})})}export{ne as default};
|