@serifpersia/dango 3.5.2 → 3.5.4
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-BVnAhrys.js → AnimeCard-Cw_PS4ev.js} +1 -1
- package/client/dist/assets/{AnimeInfo-DYBLIXmE.js → AnimeInfo-C_a0TTXe.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-DnXV4EMC.js → AnimeInfoPage-BB2RY_yn.js} +2 -2
- package/client/dist/assets/{Asmr-Dwlv-Af8.js → Asmr-oc1NaBzW.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-CnF9ZTJQ.js → AsmrResetProgressModal-cYbhZUTn.js} +1 -1
- package/client/dist/assets/AvSyncCalibrator-DyT8IH_y.js +10 -0
- package/client/dist/assets/{AvSyncCalibrator-gEONBv5a.css → AvSyncCalibrator-ieaRTs3u.css} +1 -1
- package/client/dist/assets/{Home-CUZPz_wy.js → Home-D3BVXJ5-.js} +1 -1
- package/client/dist/assets/{Insights-hvaO1jbY.js → Insights-BmBDfdDO.js} +1 -1
- package/client/dist/assets/{LibraryListPage-BeYz_I1y.js → LibraryListPage-C463kkiG.js} +1 -1
- package/client/dist/assets/{ListeningList-D-D-W7JK.js → ListeningList--EcSwlrV.js} +1 -1
- package/client/dist/assets/{Manga-DqIR2B6F.js → Manga-BhOs1yu_.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-CWqxWbb3.js → MangaInfoPage-BP-kWQoG.js} +1 -1
- package/client/dist/assets/{MangaReadPage-BlyJ-OdY.js → MangaReadPage-CWCo81Qx.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-gvz9_X7z.js → MangaResetProgressModal-DZGo5ZOV.js} +1 -1
- package/client/dist/assets/{Mature-B1Cuj67a.js → Mature-2wFvZ1Ix.js} +1 -1
- package/client/dist/assets/{MediaCard-GwFTnacn.js → MediaCard-BjnksiL1.js} +1 -1
- package/client/dist/assets/{Music-BEmRDuSo.js → Music-Bkz_ZyA4.js} +1 -1
- package/client/dist/assets/OptionListMenu-DIEBUA77.js +1 -0
- package/client/dist/assets/{Player-khTFa_o1.js → Player-BX_Skj8G.js} +6 -6
- package/client/dist/assets/{Player-B036Ic3m.css → Player-DBLl-bj_.css} +1 -1
- package/client/dist/assets/{PlayerSettings-B16FnAO_.js → PlayerSettings-B5ebT96a.js} +1 -1
- package/client/dist/assets/{QueueOptionsButton-DjBOibpt.js → QueueOptionsButton-iynUiGDS.js} +1 -1
- package/client/dist/assets/{QueueRail-DcLtEU46.js → QueueRail-D2RYa8Lf.js} +1 -1
- package/client/dist/assets/{Radio-rpaFuI72.js → Radio-DuFCL4ru.js} +1 -1
- package/client/dist/assets/{ReadingList-DTnI5411.js → ReadingList-CTOkZdFF.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-Bcv92v7c.js → ResetProgressModal-Cjzd8-mT.js} +1 -1
- package/client/dist/assets/{Search-DNxPl_On.js → Search-CY6kxAYD.js} +1 -1
- package/client/dist/assets/{Settings-CQ-ykTG3.js → Settings-B2cCZBVq.js} +1 -1
- package/client/dist/assets/{SkeletonGrid-ZN-kS9re.js → SkeletonGrid-D98PFdEd.js} +1 -1
- package/client/dist/assets/{Trackers-EN1_ol5G.js → Trackers-CE2fejJC.js} +1 -1
- package/client/dist/assets/{Tv-Bx7tGS57.css → Tv-BlVIanQL.css} +1 -1
- package/client/dist/assets/Tv-BrwGG26Z.js +4 -0
- package/client/dist/assets/{TvInfo-Mpzun3PF.js → TvInfo-Dg_hN9lr.js} +1 -1
- package/client/dist/assets/{TvPopup-YYgg9-7r.js → TvPopup-CuR-CXOg.js} +1 -1
- package/client/dist/assets/{TvSearch-CdL9EA-S.js → TvSearch-DertJ9Je.js} +1 -1
- package/client/dist/assets/{TvWatchlist-DD6nRESU.js → TvWatchlist-DAp6XFbP.js} +1 -1
- package/client/dist/assets/{Watchlist-CD8UqukO.js → Watchlist-C5eiD8Nw.js} +1 -1
- package/client/dist/assets/{hls-E94cMCjR.js → hls-s6kEkfvo.js} +1 -1
- package/client/dist/assets/{index-CZW1But9.js → index-GAU-R8jU.js} +2 -2
- package/client/dist/assets/{useAnimeInfoData-C9tOyy6E.js → useAnimeInfoData-9eudX-hq.js} +1 -1
- package/client/dist/assets/{useAsmr-B4HAapZD.js → useAsmr-Dj8QioSc.js} +1 -1
- package/client/dist/assets/{useAsmrPopup-trIV7nUr.js → useAsmrPopup-QhQCU1HG.js} +1 -1
- package/client/dist/assets/{useMangaLibrary-CZ2Gke8p.js → useMangaLibrary-B6HQI4jU.js} +1 -1
- package/client/dist/assets/{useMangaPopup-80Daa4y-.js → useMangaPopup-BC8Mg08o.js} +1 -1
- package/client/dist/assets/{useProviders-CqMq_6ue.js → useProviders-DoJoJR_4.js} +1 -1
- package/client/dist/assets/{useTv-CHDhiKWu.js → useTv-C0AAHhYE.js} +1 -1
- package/client/dist/assets/{useTvLibrary-DWUGDtld.js → useTvLibrary-B1csgiZ_.js} +1 -1
- package/client/dist/index.html +1 -1
- package/package.json +2 -2
- package/server/dist/hono/tv.js +31 -14
- package/server/dist/lib/ytmusic.js +28 -2
- package/server/dist/trpc/routers/music.js +25 -3
- package/server/dist/trpc/routers/tv.js +1 -0
- package/server/package.json +1 -1
- package/client/dist/assets/AvSyncCalibrator-Cr9n1euF.js +0 -10
- package/client/dist/assets/OptionListMenu-Dlk9eHM7.js +0 -1
- package/client/dist/assets/Tv-C-4wd-BS.js +0 -4
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{u as t,d as C,A as I,h as y,S as Pe,g as Fr,o as jr,p as Vr,a as Wr,T as Ae,q as S}from"./vendor-core-DfaOB3Rn.js";import{u as Hr}from"./vendor-query-BBT5_sHx.js";import{g as an,e as Ur,t as bt,z as zr,O as Kr,M as xn,B as Fe}from"./index-GAU-R8jU.js";import{I as D}from"./vendor-icons-DrybRNxP.js";import{S as qr,U as Yr,p as An,M as Gr,D as lr,m as Pn,k as Qr,C as Xr,a as Jr,b as Zr,c as sn,u as es,d as ts,e as ns,j as rs,f as ss,h as os,l as as,B as is,i as Nn,F as ls,G as cs,H as or,s as In,n as ds,o as us,q as ms,r as hs,t as Ge,A as gs,v as ps,E as fs,y as bs,P as vs,w as _e,z as ys,R as _s}from"./AvSyncCalibrator-DyT8IH_y.js";import{S as Ss,O as Bn,a as Cs,A as Ts,b as ks}from"./OptionListMenu-DIEBUA77.js";import{u as Es}from"./useProviders-DoJoJR_4.js";import{d as xs,g as Ns,h as Is,f as Bs,e as ws,j as As,k as Ps}from"./useTvLibrary-B1csgiZ_.js";import{l as Ls,c as Ms}from"./hls-s6kEkfvo.js";import{u as Rs}from"./useIsMobile-Dvx1uJ82.js";import{S as $s}from"./SynopsisText-B3Sa5pRv.js";const Os="_fullscreenFlat_1xij1_1",Ds="_timeDisplay_1xij1_15",Fs="_bottomControls_1xij1_19",js="_leftControls_1xij1_23",Vs="_rightControls_1xij1_24",Ws="_controlBtn_1xij1_28",Hs="_controlsOverlay_1xij1_47",Us="_hidden_1xij1_67",zs="_topControls_1xij1_73",Ks="_backBtn_1xij1_93",qs="_videoTitleInfo_1xij1_113",Ys="_animeTitle_1xij1_119",Gs="_episodeLabel_1xij1_127",Qs="_speedBoostBadge_1xij1_134",Xs="_progressBarContainer_1xij1_180",Js="_progressBar_1xij1_180",Zs="_thumb_1xij1_199",eo="_bufferedBar_1xij1_217",to="_watchedBar_1xij1_227",no="_scrubbing_1xij1_252",ro="_timeBubble_1xij1_256",so="_bottomControlsRow_1xij1_270",oo="_nextEpisodeBtn_1xij1_293",ao="_active_1xij1_346",io="_settingsPanel_1xij1_421",lo="_settingsHeader_1xij1_440",co="_settingsBackBtn_1xij1_448",uo="_settingsTitle_1xij1_466",mo="_settingsContent_1xij1_477",ho="_currentValue_1xij1_486",go="_menuItem_1xij1_501",po="_menuNote_1xij1_534",fo="_loadingOverlay_1xij1_547",bo="_loadingDots_1xij1_558",vo="_dot_1xij1_563",yo="_bufferingOverlay_1xij1_592",_o="_bufferingSpinner_1xij1_601",o={fullscreenFlat:Os,timeDisplay:Ds,bottomControls:Fs,leftControls:js,rightControls:Vs,controlBtn:Ws,controlsOverlay:Hs,hidden:Us,topControls:zs,backBtn:Ks,videoTitleInfo:qs,animeTitle:Ys,episodeLabel:Gs,speedBoostBadge:Qs,progressBarContainer:Xs,progressBar:Js,thumb:Zs,bufferedBar:eo,watchedBar:to,scrubbing:no,timeBubble:ro,bottomControlsRow:so,nextEpisodeBtn:oo,active:ao,settingsPanel:io,settingsHeader:lo,settingsBackBtn:co,settingsTitle:uo,settingsContent:mo,currentValue:ho,menuItem:go,menuNote:po,loadingOverlay:fo,loadingDots:bo,dot:vo,bufferingOverlay:yo,bufferingSpinner:_o},So=({player:a,visible:b,settingsOpen:W,onOpenSettings:R,onCloseSettings:Y,hasSubtitles:A,isSubtitleActive:r,subtitles:N,onSubtitleChange:i,showNextEpisodeButton:ee,onNextEpisode:G,isTheaterMode:P,onTheaterModeToggle:g,timeLabelRef:z})=>{const{state:m,refs:je,actions:L}=a,Q=je.videoRef,Le=T=>{const te=Q.current;!te||isNaN(m.duration)||m.duration===0||(te.currentTime=T*m.duration)},Me=()=>{Q.current&&(L.setIsScrubbing(!0),L.wasPlayingBeforeScrub.current=!Q.current.paused,Q.current.pause())},Ve=T=>{const te=Q.current;te&&m.duration&&(te.currentTime=T*m.duration)},We=()=>{L.setIsScrubbing(!1),L.wasPlayingBeforeScrub.current&&Q.current?.play().catch(()=>{})},Qe=T=>{const te=Q.current;te&&(te.volume=T,te.muted=T===0)},le=()=>{if(r){i(-1);return}let T=null;try{T=localStorage.getItem("tvLastSubtitle")}catch{}i(An(N,{lastKey:T,enabled:!0}))},K=m.isMuted?t(D,{name:"volume-mute"}):m.volume<.5?t(D,{name:"volume-down"}):t(D,{name:"volume-up"});return t("div",{className:`${o.controlsOverlay} ${b?"":o.hidden}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:o.bottomControls,onClick:T=>T.stopPropagation(),children:[t(qr,{classes:{container:o.progressBarContainer,scrubbing:o.scrubbing,timeBubble:o.timeBubble,bar:o.progressBar,buffered:o.bufferedBar,watched:o.watchedBar,thumb:o.thumb},videoRef:Q,duration:m.duration,formatTime:an,isScrubbing:m.isScrubbing,buffered:"full",onSeek:Le,onScrubStart:Me,onScrubMove:Ve,onScrubEnd:We,timeLabelRef:z}),t("div",{className:o.bottomControlsRow,children:[t("div",{className:o.leftControls,children:[t("button",{className:o.controlBtn,onClick:L.togglePlay,"aria-label":m.isPlaying?"Pause":"Play",children:m.isPlaying?t(D,{name:"pause"}):t(D,{name:"play"})}),t(Yr,{muted:m.isMuted,volume:m.volume,volumeIcon:K,buttonClassName:o.controlBtn,onToggleMute:L.toggleMute,onVolumeChange:Qe,onExpandedChange:T=>L.setShowVolumeSlider(T)}),t("span",{className:o.timeDisplay,ref:z,children:[an(0)," / ",an(m.duration)]})]}),t("div",{className:o.rightControls,children:[ee&&t("button",{className:o.nextEpisodeBtn,onClick:G,title:"Play next episode",children:"Next EP"}),A&&t("button",{className:`${o.controlBtn} ${r?o.active:""}`,onClick:le,"aria-label":r?"Turn subtitles off":"Turn subtitles on",children:t(D,{name:"closed-captioning"})}),t("button",{className:`${o.controlBtn} ${W?o.active:""}`,onClick:()=>W?Y():R(),"aria-label":"Settings",children:t(D,{name:"cog"})}),t("button",{className:`${o.controlBtn} ${P?o.active:""}`,onClick:T=>{T.stopPropagation(),g()},title:P?"Exit Theater Mode":"Theater Mode","aria-label":P?"Exit Theater Mode":"Theater Mode",children:t(D,{name:"tv"})}),t("button",{className:o.controlBtn,onClick:L.toggleFullscreen,"aria-label":m.isFullscreen?"Exit Fullscreen":"Fullscreen",children:m.isFullscreen?t(D,{name:"compress"}):t(D,{name:"expand"})})]})]})]})})},on=-6e4,wn=6e4,ar=500,Co=({classes:a,delayMs:b,onDelayChange:W})=>{const[R,Y]=C(null),A=R??b,r=I(W);r.current=W;const N=I(b);N.current=b;const i=I(null);i.current=R,y(()=>{Y(null)},[b]),y(()=>()=>{const P=i.current;P!==null&&P!==N.current&&r.current(P)},[]);const ee=P=>{N.current=P,i.current=null,r.current(P),Y(null)},G=P=>{const g=i.current??N.current,z=Math.max(on,Math.min(wn,g+P));ee(z)};return t(Pe,{children:[t("div",{style:{display:"flex",gap:6,padding:"0.5rem 0.75rem 0.25rem"},children:[t("button",{type:"button",className:a.item,onClick:()=>G(-ar),"aria-label":"Show subtitles 0.5 seconds earlier",style:{flex:1,justifyContent:"center"},children:t("span",{children:"-0.5s"})}),t("button",{type:"button",className:a.item,onClick:()=>G(ar),"aria-label":"Show subtitles 0.5 seconds later",style:{flex:1,justifyContent:"center"},children:t("span",{children:"+0.5s"})}),t("button",{type:"button",className:a.item,onClick:()=>ee(0),disabled:A===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(Gr,{label:"Subtitle timing",display:lr(A),min:on,max:wn,step:100,value:A,percent:(A-on)/(wn-on)*100,onChange:P=>{const g=Math.round(P);i.current=g,Y(g)},onCommit:()=>{const P=i.current;P!==null&&ee(P)}}),t("div",{className:a.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},To=({view:a,onSelectView:b,onClose:W,player:R,onSubtitleStyleChange:Y,streams:A,resolutionIdx:r,onResolutionChange:N,hasSubtitles:i,subtitles:ee,selectedSubtitle:G,isSubtitleActive:P,onSubtitleChange:g,audioTracks:z,selectedAudioTrack:m,onAudioTrackChange:je,videoDelayEnabled:L,onVideoDelayToggle:Q,videoDelayMs:Le,onVideoDelayChange:Me,onCalibrate:Ve,subtitleDelayMs:We,onSubtitleDelayChange:Qe,ambientSettings:le,onAmbientChange:K})=>{const{state:T}=R,te=()=>t(Pe,{children:[A.length>1&&t("button",{className:o.menuItem,onClick:()=>b("resolution"),children:[t("span",{children:"Resolution"}),t("span",{className:o.currentValue,children:A[r]?.quality||"Auto"})]}),i&&t("button",{className:o.menuItem,onClick:()=>b("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:o.currentValue,children:P?ee[G]?.label||ee[G]?.language:"Off"})]}),i&&t("button",{className:o.menuItem,onClick:()=>b("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:o.currentValue,children:[T.subtitleFontSize.toFixed(1),"x · ",T.subtitlePosition]})]}),i&&t("button",{className:o.menuItem,onClick:()=>b("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:o.currentValue,children:lr(We)})]}),z.length>0&&t("button",{className:o.menuItem,onClick:()=>b("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:o.currentValue,children:z[m]?.label||z[m]?.language})]}),t("button",{className:o.menuItem,onClick:()=>b("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:o.currentValue,children:L?`${Le}ms`:"Off"})]}),le&&K&&t("button",{className:o.menuItem,onClick:()=>b("ambient"),children:[t("span",{children:"Ambient Light"}),t("span",{className:o.currentValue,children:le.enabled?"On":"Off"})]})]}),Se=()=>t(Bn,{classes:{item:o.menuItem,active:o.active},options:A.map((k,H)=>({key:String(H),label:k.quality,selected:H===r})),onSelect:k=>N(Number(k))}),X=()=>t(Bn,{classes:{item:o.menuItem,active:o.active},options:[{key:"off",label:"Off",selected:!P},...ee.map((k,H)=>({key:String(H),label:k.label||k.language,selected:H===G}))],onSelect:k=>g(k==="off"?-1:Number(k))}),Ce=()=>t(Cs,{classes:{item:o.menuItem,active:o.active},values:{fontSize:T.subtitleFontSize,position:T.subtitlePosition,bgOpacity:T.subtitleBgOpacity,bgColor:T.subtitleBgColor,textColor:T.subtitleTextColor,edge:T.subtitleEdge,bold:T.subtitleBold},onChange:Y}),B=()=>t(Co,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},delayMs:We,onDelayChange:k=>Qe?.(k)}),Re=()=>t(Bn,{classes:{item:o.menuItem,active:o.active},options:z.map((k,H)=>({key:String(H),label:k.label||k.language,selected:H===m})),onSelect:k=>je(Number(k))}),He=()=>t(Ts,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},enabled:L,delayMs:Le,onToggle:k=>Q?.(k),onDelayChange:k=>Me?.(k),onCalibrate:Ve}),fe=()=>le&&K?t(ks,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},values:le,onChange:K}):null;return t("div",{"data-speed-boost-ignore":"true",onClick:k=>k.stopPropagation(),children:t(Ss,{classes:{panel:o.settingsPanel,header:o.settingsHeader,backBtn:o.settingsBackBtn,title:o.settingsTitle,content:o.settingsContent},title:a==="main"?"Settings":a==="subtitle-style"?"Subtitle Style":a==="subtitle-timing"?"Subtitle Timing":a==="audio"?"Audio Track":a==="resolution"?"Resolution":a==="av-sync"?"A/V Sync":a==="ambient"?"Ambient Light":a.charAt(0).toUpperCase()+a.slice(1),onBack:()=>a==="main"?W():b("main"),children:[a==="main"&&te(),a==="resolution"&&Se(),a==="subtitles"&&X(),a==="subtitle-style"&&Ce(),a==="subtitle-timing"&&B(),a==="audio"&&Re(),a==="av-sync"&&He(),a==="ambient"&&fe()]})})},ko=({player:a,title:b,episodeLabel:W,audioTracks:R,selectedAudioTrack:Y,onAudioTrackChange:A,subtitles:r,selectedSubtitle:N,onSubtitleChange:i,streams:ee,resolutionIdx:G,onResolutionChange:P,onBack:g,children:z,videoDelayEnabled:m=!1,onVideoDelayToggle:je,videoDelayMs:L=0,onVideoDelayChange:Q,onCalibrateAvSync:Le,subtitleDelayMs:Me=0,onSubtitleDelayChange:Ve,showNextEpisodeButton:We=!1,onNextEpisode:Qe,isLoading:le=!1,isTheaterMode:K,onTheaterModeToggle:T,ambientSettings:te,onAmbientChange:Se})=>{const{state:X,refs:Ce,actions:B}=a,Re=Ce.videoRef,{subtitleFontSize:He,subtitlePosition:fe,subtitleBgOpacity:k,subtitleBgColor:H,subtitleTextColor:at,subtitleEdge:ce,subtitleBold:$e}=X,[Te,Oe]=C(null),it=I(null),[Dt,vt]=C(0);y(()=>{const l=Re.current;if(!l)return;const d=()=>vt(l.clientHeight||0);d();const ne=new ResizeObserver(d);return ne.observe(l),()=>ne.disconnect()},[Re]);const de=(l,d)=>{try{localStorage.setItem(l,String(d))}catch{}},be=(l,d)=>{switch(l){case"fontSize":typeof d=="number"&&(B.setSubtitleFontSize(d),de("subtitleFontSize",d));break;case"position":typeof d=="number"&&(B.setSubtitlePosition(d),de("subtitlePosition",d));break;case"bgOpacity":typeof d=="number"&&(B.setSubtitleBgOpacity(d),de("subtitleBgOpacity",d));break;case"bgColor":typeof d=="string"&&(B.setSubtitleBgColor(d),de("subtitleBgColor",d));break;case"textColor":typeof d=="string"&&(B.setSubtitleTextColor(d),de("subtitleTextColor",d));break;case"edge":(d==="shadow"||d==="outline"||d==="none")&&(B.setSubtitleEdge(d),de("subtitleEdge",d));break;case"bold":typeof d=="boolean"&&(B.setSubtitleBold(d),de("subtitleBold",d));break}};y(()=>{const l="tv-player-subtitle-style";let d=document.getElementById(l);d||(d=document.createElement("style"),d.id=l,document.head.appendChild(d));const ne={fontSize:He,position:fe,bgOpacity:k,bgColor:H,textColor:at,edge:ce,bold:$e},re=Re.current,Ct=Pn(He,Dt||re?.clientHeight||720);if(d.textContent=Qr({...ne,fontSize:Ct}),re){const Tt=()=>{const w=Number(fe);return isNaN(w)?0:Math.max(0,Math.min(100,w))},Xe=(w,se)=>{try{const $=w;$.snapToLines=!1,$.line=se}catch{}},ln=()=>{const w=Ct*16,se=re.videoHeight||re.clientHeight||720,$=re.videoWidth||re.clientWidth||1280;return{step:w*1.3/se*100,chars:Math.max(20,Math.floor($/(w*.55)))}},kt=w=>{const se=Math.max(0,Math.min(100,100-Tt())),$=Array.from(w.activeCues??[]);if($.length<=1){$.forEach(ke=>Xe(ke,se));return}const{step:dt,chars:Ue}=ln();let Ht=se;for(let ke=$.length-1;ke>=0;ke--){const Nt=String($[ke].text??"").replace(/<[^>]*>/g,"").split(`
|
|
2
|
+
`).reduce((It,cn)=>It+Math.max(1,Math.ceil(cn.length/Ue)),0),ae=Ht-Nt*dt;Xe($[ke],Math.max(0,ae)),Ht=ae-dt*.4}},Et=()=>{const w=Math.max(0,Math.min(100,100-Tt()));Array.from(re.textTracks).forEach(se=>{se.cues&&(Array.from(se.cues).forEach($=>Xe($,w)),se.mode==="showing"&&kt(se))})};Et();const ue=w=>{const se=w.target;se.mode==="showing"&&kt(se)},xt=()=>{Array.from(re.textTracks).forEach(w=>{w.removeEventListener("cuechange",ue),w.addEventListener("cuechange",ue)}),Et()};Array.from(re.textTracks).forEach(w=>{w.addEventListener("cuechange",ue)}),re.textTracks.addEventListener("addtrack",xt);const Vt=Array.from(re.querySelectorAll("track")),Wt=()=>Et();return Vt.forEach(w=>w.addEventListener("load",Wt)),()=>{Array.from(re.textTracks).forEach(w=>{w.removeEventListener("cuechange",ue)}),re.textTracks.removeEventListener("addtrack",xt),Vt.forEach(w=>w.removeEventListener("load",Wt))}}},[He,fe,k,H,at,ce,$e,N,r,Re,Dt]);const yt=r.length>0,lt=N>=0,M=()=>{Oe("main"),B.setShowControls(!0)},ct=()=>{Oe(null)},_t=X.showControls||!!Te,ve=t(Zr,{visible:_t,title:b,episode:W,onBack:g,classes:{overlay:o.controlsOverlay,hidden:o.hidden,top:o.topControls,backBtn:o.backBtn,titleInfo:o.videoTitleInfo,title:o.animeTitle,episode:o.episodeLabel}}),Ft=!le&&!X.isBuffering&&X.duration>0?t(Xr,{isPlaying:X.isPlaying,onTogglePlay:B.togglePlay,onSkipBack:()=>B.seek(-10),onSkipForward:()=>B.seek(10)}):null,jt=t(So,{player:a,visible:_t,settingsOpen:!!Te,onOpenSettings:M,onCloseSettings:ct,hasSubtitles:yt,isSubtitleActive:lt,subtitles:r,onSubtitleChange:i,showNextEpisodeButton:We,onNextEpisode:Qe,isTheaterMode:K,onTheaterModeToggle:T,timeLabelRef:it}),St=Te?t(To,{view:Te,onSelectView:Oe,onClose:ct,player:a,onSubtitleStyleChange:be,streams:ee,resolutionIdx:G,onResolutionChange:P,hasSubtitles:yt,subtitles:r,selectedSubtitle:N,isSubtitleActive:lt,onSubtitleChange:i,audioTracks:R,selectedAudioTrack:Y,onAudioTrackChange:A,videoDelayEnabled:m,onVideoDelayToggle:je,videoDelayMs:L,onVideoDelayChange:Q,onCalibrate:()=>{Oe(null),Le?.()},subtitleDelayMs:Me,onSubtitleDelayChange:Ve,ambientSettings:te,onAmbientChange:Se}):null,_=t(Pe,{children:[le&&t("div",{className:o.loadingOverlay,"aria-hidden":"true",children:t("div",{className:o.loadingDots,children:[t("div",{className:o.dot}),t("div",{className:o.dot}),t("div",{className:o.dot})]})}),X.isBuffering&&!le&&t("div",{className:o.bufferingOverlay,"aria-hidden":"true",children:t("div",{className:o.bufferingSpinner})}),X.isSpeedBoostActive&&t("div",{className:o.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(D,{name:"forward",size:12})]})]});return t(Jr,{player:a,topBar:ve,centerControls:Ft,bottomBar:!le&&X.duration>0?jt:null,settingsPanel:St,overlays:_,isInteracting:!!Te,className:X.isFullscreen?o.fullscreenFlat:"",children:z})},Eo=({servers:a,selectedServer:b,onServerSelect:W})=>a.length===0?null:t("div",{className:sn.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:sn.sourceButtons,children:a.map(R=>t("button",{className:`${sn.sourceButton} ${b===R?sn.active:""}`,onClick:()=>W(R),children:R},R))})]}),xo=Fr.memo(Eo);function No(a,b,W){const R=()=>{const A=Array.isArray(a.audioTracks)?a.audioTracks.length:0,r=W.getWant(),N=A>0?Math.min(Math.max(0,r),A-1):r;a.audioTrack=N,N!==r&&W.onResolve(N)},Y=(A,r)=>{const N=W.getWant(),i=Array.isArray(a.audioTracks)?a.audioTracks.length:0;if(r.id!==N&&N>=0&&N<i){a.audioTrack!==N&&(a.audioTrack=N);return}W.onResolve(r.id)};return a.on(b.MANIFEST_PARSED,R),a.on(b.AUDIO_TRACK_SWITCHED,Y),()=>{a.off(b.MANIFEST_PARSED,R),a.off(b.AUDIO_TRACK_SWITCHED,Y)}}const Io="_page_y9mr4_1",Bo="_header_y9mr4_7",wo="_pageTitle_y9mr4_11",Ao="_searchForm_y9mr4_21",Po="_searchInput_y9mr4_27",Lo="_searchBtn_y9mr4_42",Mo="_suggestions_y9mr4_58",Ro="_suggestionPill_y9mr4_65",$o="_statusMsg_y9mr4_81",Oo="_error_y9mr4_87",Do="_textOnly_y9mr4_91",Fo="_spinner_y9mr4_96",jo="_spin_y9mr4_96",Vo="_sourceLoader_y9mr4_101",Wo="_ringSpinner_y9mr4_107",Ho="_grid_y9mr4_125",Uo="_skeletonCard_y9mr4_131",zo="_skeletonThumb_y9mr4_136",Ko="_skeletonLine_y9mr4_142",qo="_shimmer_y9mr4_149",Yo="_backBtn_y9mr4_169",Go="_meta_y9mr4_187",Qo="_headerActions_y9mr4_195",Xo="_watchlistBtn_y9mr4_202",Jo="_active_y9mr4_220",Zo="_year_y9mr4_230",ea="_rating_y9mr4_235",ta="_typeBadge_y9mr4_244",na="_tv_y9mr4_252",ra="_movie_y9mr4_257",sa="_tvSeries_y9mr4_262",oa="_tvMiniSeries_y9mr4_267",aa="_overview_y9mr4_272",ia="_controls_y9mr4_279",la="_controlLabel_y9mr4_287",ca="_select_y9mr4_297",da="_playerSection_y9mr4_308",ua="_video_y9mr4_312",ma="_videoHidden_y9mr4_334",ha="_delayCanvas_y9mr4_339",ga="_delayCanvasActive_y9mr4_352",pa="_subtitleOverlay_y9mr4_356",fa="_videoIframe_y9mr4_375",ba="_retryButton_y9mr4_383",va="_sidebarSeason_y9mr4_398",ya="_mobileSeasonRow_y9mr4_414",_a="_sidebarPosterCard_y9mr4_428",Sa="_sidebarPosterMeta_y9mr4_443",Ca="_providerSelectWrap_y9mr4_460",Ta="_genreRow_y9mr4_472",ka="_genreChip_y9mr4_479",Ea="_metaRow_y9mr4_489",xa="_detailGrid_y9mr4_498",Na="_detailItem_y9mr4_505",Ia="_imdbLink_y9mr4_527",v={page:Io,header:Bo,pageTitle:wo,searchForm:Ao,searchInput:Po,searchBtn:Lo,suggestions:Mo,suggestionPill:Ro,statusMsg:$o,error:Oo,textOnly:Do,spinner:Fo,spin:jo,sourceLoader:Vo,ringSpinner:Wo,grid:Ho,skeletonCard:Uo,skeletonThumb:zo,skeletonLine:Ko,shimmer:qo,backBtn:Yo,meta:Go,headerActions:Qo,watchlistBtn:Xo,active:Jo,year:Zo,rating:ea,typeBadge:ta,tv:na,movie:ra,tvSeries:sa,tvMiniSeries:oa,overview:aa,controls:ia,controlLabel:la,select:ca,playerSection:da,video:ua,videoHidden:ma,delayCanvas:ha,delayCanvasActive:ga,subtitleOverlay:pa,videoIframe:fa,retryButton:ba,sidebarSeason:va,mobileSeasonRow:ya,sidebarPosterCard:_a,sidebarPosterMeta:Sa,providerSelectWrap:Ca,genreRow:Ta,genreChip:ka,metaRow:Ea,detailGrid:xa,detailItem:Na,imdbLink:Ia},Ba=[],wa=[];function ir({error:a,onRetry:b}){return t("div",{className:`${v.statusMsg} ${v.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:a}),t("button",{className:v.retryButton,onClick:b,children:"Retry"})]})})}const Ha=()=>{const{id:a}=jr(),[b]=Vr(),W=I(b);W.current=b;const R=Wr(),Y=Hr(),A=b.get("type"),[r,N]=C(null),[i,ee]=C(()=>parseInt(b.get("s")||"1",10)||1),[G,P]=C([]),[g,z]=C(()=>parseInt(b.get("e")||"1",10)||1),[m,je]=C(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[L,Q]=C([]),[Le,Me]=C(""),{options:Ve,isFallback:We,isLoading:Qe}=Es(),le=Ae(()=>Ve.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.value,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[Ve]),K=We||le.length===0?Ba:le,T=K.filter(e=>e.tier==="direct"),te=K.filter(e=>e.tier==="embed"),[Se,X]=C(!1),[Ce,B]=C(""),[Re,He]=C([]),[fe,k]=C(0),[H,at]=C([]),[ce,$e]=C(-1),[Te,Oe]=C(0),[it,Dt]=C(""),[vt,de]=C(""),[be,yt]=C(()=>{try{return localStorage.getItem("tvServer")||""}catch{return""}}),lt=Ae(()=>K.find(e=>e.id===m),[K,m]),M=lt?.tier==="embed",[ct,_t]=C([]),ve=Ae(()=>ct.length>0?ct:lt?.servers??[],[ct,lt]),Ft=I([]);y(()=>{Ft.current=L},[L]);const jt=I(fe);y(()=>{jt.current=fe},[fe]);const St=I(ce);y(()=>{St.current=ce},[ce]);const _=es({skipIntervals:wa}),l=_.refs.videoRef,d=I(null),ne=I([]),re=I(null),Ct=I(null),{videoDelayMs:Tt,videoDelayEnabled:Xe,setDelayEnabled:ln,handleVideoDelayChange:kt,isCalibrating:Et,testClipActive:ue,stopCalibration:xt,openAvSyncCalibrator:Vt,cancelAvSyncCalibrator:Wt,applyAvSyncCalibrator:w,toggleTestClip:se,calibReturnRef:$,effectiveVideoDelayMs:dt}=ts(l),[Ue,Ht]=C(()=>{try{const e=Number(localStorage.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),ke=I(Ue);ke.current=Ue;const Ln=S(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(ke.current!==n){ke.current=n,Ht(n);try{localStorage.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]);ns({videoRef:l,canvasRef:re,delayMs:dt,enabled:Xe});const Nt=Xe,ae=Nt||Ue!==0,{settings:It,update:cn}=rs(),dn=I(ae);dn.current=ae;const un=S(()=>{if(!dn.current)return;const e=l.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[l]),{hasConsent:Bt,grant:cr}=Ur(),wt=I("");wt.current||(wt.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const p=A==="movie",Ut=a?xs(A||"tv",a):"",F=Ut,Mn=Ns(),zt=Is(),{toggle:Rn,bookmarkedIds:dr,pending:ur}=Bs(),{data:$n}=ws(r?Ut:void 0),Kt=$n?!!$n.inLibrary:Ut?dr.has(Ut):!1,mr=S(()=>{!r||!a||Rn({tmdbId:Number(a),mediaType:A||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,a,A,Rn]),{data:Je,isFetched:On,isPending:Dn}=As(F||void 0,i,g),qt=Ae(()=>G.map(e=>e.episode_number).sort((e,n)=>e-n),[G]),Ze=qt.indexOf(g),mn=Ze>0?qt[Ze-1]:null,E=Ze>=0&&Ze<qt.length-1?qt[Ze+1]:null,Yt=Ae(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),ye=Ae(()=>{if(p||E!=null)return null;const e=Yt.indexOf(i);return e>=0&&e<Yt.length-1?Yt[e+1]:(r?.number_of_seasons??0)>i?i+1:null},[p,E,Yt,i,r?.number_of_seasons]),Fn=Je?.currentTime??0,jn=Je?.duration??0,hn=Je?.completed===!0||Je?.completed===1||Nn(Fn,jn),[Ee,De]=C(!1),xe=I(!1),gn=I(null),At=I(null);y(()=>{xe.current=!1,At.current=null,De(!1)},[F,i,g]);const[Ne,Gt]=C(!1),[ut,Vn]=C(0),[et,Wn]=C(!1),[ze,tt]=C(!1),[hr,pn]=C(!1),[gr,Hn]=C(""),[Qt,pr]=C(!1),[fr,fn]=C(!1),{isTheaterMode:Ie,toggleTheaterMode:bn,handleLayoutClick:br}=ss();y(()=>{const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="t"&&bn()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[bn]),os(_,(L.length>0||vt!=="")&&!Ie&&!Ne&&!Ee&&!ze);const vr=Rs(),[mt,yr]=C(as),_r=S(e=>{yr(e),is(e)},[]),me=I(!1),nt=I(null),vn=I(0),Un=I(!1),zn=I(0),ie=I(null),Pt=I(""),Sr=or(Fn,jn),Lt=!me.current&&!xe.current&&(Ne||Ee||ze||hn||Sr),ht=I(Lt);ht.current=Lt;const gt=I(!1);y(()=>{gt.current=et},[et]);const Ke=S((e,n)=>{if(!F||!n||n<30)return;const s=Nn(e,n),c=s?n:e;Math.abs(c-vn.current)<10&&!s||(vn.current=c,Mn.mutate({mediaId:F,season:i,episode:g,currentTime:Math.floor(c),duration:Math.floor(n),completed:s,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:A||"tv",adult:r?.adult?1:0}))},[F,i,g,Mn,r,A]),Be=S((e,n)=>{xt();const s=new URLSearchParams(b);s.set("type",b.get("type")||"tv"),s.set("s",String(e)),s.set("e",String(n)),R(`${window.location.pathname}?${s.toString()}`)},[b,R,xt]),Mt=S(()=>{const e=l.current;if(!e||p||E==null){pn(!1);return}const n=e.duration||0,s=e.currentTime||0;pn(n>0&&s/n>=.8)},[p,E,l]),Xt=S((e,n)=>["tv-sources",m,p?"movie":"tv",a,e,n,be],[m,p,a,be]),Jt=S(async(e,n)=>{if(!r||!a||!m)return{valid:!1,sources:[]};const s=p?"movie":"tv",c=await bt.tv.sources.query({provider:m,type:s,tmdbId:String(a),season:e,episode:n,title:r.title||"",year:r.year||"",totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||"",...ve.length>0&&be?{server:be}:{}});return{valid:"valid"in c?c.valid:!1,error:"error"in c?c.error:void 0,sources:c.sources,referer:"referer"in c?c.referer:void 0,audioTracks:c.audioTracks,subtitles:"subtitles"in c?c.subtitles:void 0,servers:"servers"in c?c.servers:void 0}},[r,a,m,p,ve,be]),Kn=S(()=>{if(p||!r||!a||!m||M||E==null)return;const e=Xt(i,E);Y.getQueryState(e)?.status!=="success"&&Y.prefetchQuery({queryKey:e,queryFn:()=>Jt(i,E),staleTime:300*1e3,gcTime:1800*1e3})},[p,r,a,m,M,E,i,Y,Xt,Jt]),Cr=S(()=>{if(ue)return;Mt();const e=l.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&Kn(),nt.current&&clearTimeout(nt.current),nt.current=setTimeout(()=>{Ke(e.currentTime,e.duration||0)},5e3))},[Ke,l,ue,Mt,Kn]),Tr=S(()=>{const e=l.current;if(!e||!r)return;nt.current&&clearTimeout(nt.current),Ke(e.currentTime,e.duration||0),Un.current=!0;const n=ls({seekInduced:Date.now()-zn.current<cs,autoplayEnabled:mt,hasNext:!p&&E!=null,isFinal:p||E==null});n==="advance"&&E!=null?(z(E),Be(i,E)):n==="prompt-next"?(xe.current=!1,me.current=!0,De(!0)):n==="prompt-complete"&&(Hn(p?r.title:`${r.title} — Season ${i}`),tt(!0),xe.current=!0,me.current=!0)},[p,r,i,E,mt,Ke,Be,l]),kr=S(()=>{Un.current=!1,_.actions.onPlay()},[_.actions]),Er=S(()=>{_.actions.onPause();const e=l.current;e&&!e.ended&&Ke(e.currentTime,e.duration||0)},[_.actions,Ke,l]),xr=S(()=>{_.actions.onLoadedMetadata();const e=l.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(ie.current!=null&&ie.current>0){try{e.currentTime=ie.current}catch{}ie.current=null}Mt()}},[_.actions,l,Mt]),pt=S(()=>{const e=l.current;if(e&&ie.current!=null&&ie.current>0){try{e.currentTime=ie.current}catch{}ie.current=null}},[l]),Nr=S(()=>{ut>0&&(ie.current=ut);const e=l.current;if(e&&ut>0){try{e.currentTime=ut,ie.current=null}catch{}e.play().catch(()=>{})}Gt(!1),me.current=!0},[ut,l]),qn=S(()=>{ie.current=null;const e=l.current;e&&(e.currentTime=0,e.play().catch(()=>{})),Gt(!1),me.current=!0},[l]),Ir=S(()=>{xe.current=!0,De(!1),me.current=!0},[]),Br=S(()=>{xe.current=!0,De(!1),me.current=!0,ie.current=null;const e=l.current;if(e){try{e.currentTime=0}catch{}e.play().catch(()=>{})}},[l]),Yn=S(()=>{E!=null&&(xe.current=!0,De(!1),me.current=!0,z(E),Be(i,E))},[E,i,Be]),Gn=S(()=>{ye!=null&&(xe.current=!0,De(!1),tt(!1),me.current=!0,ee(ye),z(1),Be(ye,1))},[ye,Be]),wr=S(async()=>{if(F)try{await zt.mutateAsync({id:F,status:"Completed"}),tt(!1),De(!1),R("/")}catch{}},[F,zt,R]);y(()=>{me.current=!1,gn.current=null,Gt(!1),pn(!1),Vn(0),Wn(!1),gt.current=!1,ie.current=null,Pt.current=`${F}:${i}:${g}`,vn.current=0},[F,i,g]),y(()=>{On&&(Wn(!0),gt.current=!0)},[On,F,i,g]),y(()=>{if(!Je||me.current)return;const e=`${F}:${i}:${g}`;if(gn.current===e)return;gn.current=e;const n=Je,s=n.currentTime??0,c=n.duration??0;or(s,c)&&(Vn(s),Gt(!0))},[Je,F,i,g]),y(()=>{if(!et||me.current||xe.current||Ne||ze||Ee)return;const e=`${F}:${i}:${g}`;if(At.current!==e){if(!hn){Dn||(At.current=e);return}if(p){At.current=e,De(!0);return}if(!(!r||Ze<0||G.length===0)){if(At.current=e,E==null&&ye==null){r&&G.length>0&&(Hn(`${r.title} — Season ${i}`),tt(!0),xe.current=!0,me.current=!0);return}De(!0)}}},[et,hn,Dn,Ne,ze,Ee,p,E,ye,r,Ze,G.length,F,i,g]),y(()=>{(Ne||Ee)&&l.current&&l.current.pause()},[Ne,Ee,l]),y(()=>{const e=l.current;return()=>{nt.current&&clearTimeout(nt.current),e&&!e.ended&&Ke(e.currentTime,e.duration||0)}},[Ke,l]);const yn=S(e=>{let n=null,s=!0;try{n=localStorage.getItem("tvLastSubtitle"),s=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return An(e,{lastKey:n,enabled:s})},[]),_n=S(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),Qn=S(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const s=e.findIndex(q=>In(q)===n);if(s>=0)return s;const c=n.indexOf("|||"),u=c>=0?n.slice(0,c):n,f=c>=0?n.slice(c+3):n,h=e.findIndex(q=>q.language===u||q.label===f);if(h>=0)return h}return An(e,{lastKey:null,enabled:!0})},[]),{data:Xn}=Ps(F||void 0),Jn=Ae(()=>(Xn?.progress??[]).filter(n=>n.season===i&&(n.completed===!0||n.completed===1||Nn(n.currentTime,n.duration))).map(n=>String(n.episode)),[Xn,i]),Zn=Ae(()=>G.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})),[G]),er=Ae(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Sn=Ae(()=>[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]);y(()=>{if(K.length!==0&&!K.some(e=>e.id===m)){const e=K.find(n=>n.tier==="direct")?.id??K[0].id;je(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[K,m]),y(()=>{_t([])},[m]),y(()=>{if(ve.length!==0&&!ve.includes(be)){yt(ve[0]);try{localStorage.setItem("tvServer",ve[0])}catch{}}},[ve,be]),y(()=>{if(!a){N(null),Q([]),Me(""),B(""),de("");return}const e=Number(a),n=A||"tv";N(null),Q([]),Me(""),B(""),de("");const s=parseInt(W.current.get("s")||"",10),c=parseInt(W.current.get("e")||"",10);ee(isNaN(s)?1:s),z(isNaN(c)?1:c),Oe(0),bt.tv.details.query({type:n,id:String(e)}).then(u=>{const f={id:u.id,title:u.title||"",overview:u.overview||"",vote_average:u.vote_average,year:u.year,poster:u.poster,backdrop:u.backdrop,imdb_id:u.imdb_id||void 0,adult:u.adult,seasons:u.seasons,number_of_seasons:u.number_of_seasons};N(f),f.seasons&&f.seasons.length>0&&isNaN(s)&&ee(f.seasons[0].season_number)}).catch(()=>{})},[a,A]),y(()=>{if(!r||!a)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){P([]);return}const n=parseInt(b.get("e")||"",10);bt.tv.episodes.query({id:String(a),season:String(i)}).then(s=>{const c=(s.episodes||[]).map(u=>({episode_number:u.episode_number,name:u.name||"",vote_average:u.vote_average,overview:u.overview||"",still_path:u.still_path||""}));P(c),c.length!==0&&z(u=>!isNaN(n)&&c.some(f=>f.episode_number===n)?n:c.some(f=>f.episode_number===u)?u:c[0].episode_number)}).catch(()=>{})},[r,a,i,b]),y(()=>{if(!M||!r||!a)return;fetch(`/api/tv/embed/${m}/${p?"movie":"tv"}/${a}?season=${i}&episode=${g}`).then(n=>n.json()).then(n=>{if(n.url)return de(n.url),fetch(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(s=>s.json()).then(s=>{s.finalUrl&&de(s.finalUrl)})}).catch(()=>{})},[m,r,a,i,g,p,M]);const Zt=S(async()=>{if(!r||!a||!m||M||r.adult&&!Bt)return;const e=`${F}:${i}:${g}`;X(!0),B(""),Ft.current.length===0&&(Q([]),Oe(0),He([]),at([]));try{const n=await Y.fetchQuery({queryKey:Xt(i,g),queryFn:()=>Jt(i,g),staleTime:3e5,gcTime:18e5});if(Pt.current!==e)return;if(X(!1),!n.valid||!n.sources?.length){B(n.error?`${n.error}`:ve.length>0?`No streams from ${be}. Try another server.`:"No streams available.");return}Q(n.sources),Me(e),n.servers?.length&&_t(n.servers),Oe(0),n.referer&&Dt(n.referer);const s=n.audioTracks||[];He(s),k(s.length>0?Qn(s):0);const c=n.subtitles||[];if(at(c),c.length>0){const h=yn(c);$e(h),_n(h)}else $e(-1);const u=p?"movie":"tv",f=a;bt.tv.subtitles.query({type:u,tmdbId:String(f),season:String(i),episode:String(g)}).then(h=>{if(Pt.current!==e)return;const q=Array.isArray(h.subtitles)?h.subtitles:[];q.length!==0&&at(he=>{const J=[...he,...q.filter(x=>!he.some(U=>U.url===x.url))];if(he.length===0){const x=yn(J);$e(x),_n(x)}return J})}).catch(()=>{}),B("")}catch{if(Pt.current!==e)return;X(!1),B("Failed to load streams.")}},[r,a,m,i,g,p,M,Bt,ve,be,yn,_n,Qn,F,Y,Xt,Jt]),Ar=S(e=>{yt(e);try{localStorage.setItem("tvServer",e)}catch{}B("")},[]),Pr=S(e=>{je(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);y(()=>{m&&r&&!M&&Zt()},[m,r,Zt,M]),y(()=>{if(!l.current||(d.current&&(d.current.destroy(),d.current=null),M))return;let e=!1;if(ue){const f=l.current;return f&&(f.pause(),f.removeAttribute("src"),f.load(),f.src="/av-sync-test.mp4",ht.current||f.play().catch(()=>{})),()=>{e=!0}}const n=!Se&&Le===`${F}:${i}:${g}`&&L[Te]?.url||"";if(!n){try{l.current?.pause(),l.current?.removeAttribute("src"),l.current?.load()}catch{}return}const s=l.current;if(Pt.current===`${F}:${i}:${g}`&&ie.current==null&&!ht.current)try{!s.ended&&s.currentTime>1&&(ie.current=s.currentTime)}catch{}s.pause(),s.removeAttribute("src"),s.load(),_.actions.resetMediaState();const c=`/api/tv/stream-proxy?url=${encodeURIComponent(n)}&referer=${encodeURIComponent(it)}`;L[Te]?.type==="hls"?(async()=>{const f=await Ls();if(!e)if(f&&f.isSupported()){const h=new f({enableWorker:!0});d.current=h,h.on(f.Events.ERROR,(J,x)=>{x.fatal&&(B(`Stream failed (${x.details}). Try another source or reload.`),X(!1),h.destroy(),d.current=null)}),h.loadSource(c),h.attachMedia(s);const q=()=>{let J=!1,x=0;try{J=localStorage.getItem("tvSubtitlesEnabled")==="true";const U=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(U)&&U>=0&&(x=U)}catch{}return{enabled:J,index:x}},he=()=>{if(typeof h.subtitleTrack!="number")return;if(ne.current.length>0){h.subtitleTrack=-1;return}const J=Array.isArray(h.subtitleTracks)?h.subtitleTracks:[];if(J.length===0){h.subtitleTrack=-1;return}const x=q();if(x.enabled){const U=x.index<J.length?x.index:0;h.subtitleTrack=U,$e(U),un()}else h.subtitleTrack=-1};No(h,f.Events,{getWant:()=>jt.current,onResolve:J=>k(J)}),h.on(f.Events.MANIFEST_PARSED,()=>{he(),$.current!=null&&(s.currentTime=$.current,$.current=null),pt(),!ht.current&>.current&&s.play().catch(()=>{})}),h.on(f.Events.SUBTITLE_TRACKS_UPDATED,()=>{he()}),h.on(f.Events.SUBTITLE_TRACK_SWITCH,(J,x)=>{if(ne.current.length>0){if(x.id!==-1)try{h.subtitleTrack=-1}catch{}return}const U=Array.isArray(h.subtitleTracks)?h.subtitleTracks:[];if(U.length!==0){if(x.id===-1){const O=q();if(O.enabled){const Z=O.index<U.length?O.index:0;h.subtitleTrack=Z;return}}$e(x.id),un()}})}else Ms(s)&&(s.src=c,$.current!=null&&(s.currentTime=$.current,$.current=null),pt(),!ht.current&>.current&&s.play().catch(()=>{B("Failed to play stream. Try another source.")}))})():(s.src=c,$.current!=null&&(s.currentTime=$.current,$.current=null),pt(),!ht.current&>.current&&s.play().catch(()=>{B("Failed to play stream. Try another source.")}));const u=()=>{const q=s.error?.code===4?"Video source not supported or not found":"Failed to load video stream";B(`${q}. The source may be invalid or expired. Try switching source or reloading.`),X(!1)};return s.addEventListener("error",u),()=>{e=!0,s.removeEventListener("error",u)}},[L,Le,Se,Te,m,it,M,l,$,ue,F,i,g,pt,un,_.actions]),y(()=>{if(!et||Ne||Ee||ze||Lt||M||ue)return;const e=l.current;!e||!e.paused||e.ended||e.readyState<1||(pt(),e.play().catch(()=>{}))},[et,Ne,Ee,ze,Lt,M,ue,pt,l]),y(()=>{const e=d.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=fe)},[fe]),y(()=>{const e=d.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ne.current.length>0||(ce>=0?e.subtitleTrack=ce:e.subtitleTrack=-1)},[ce]),y(()=>{const e=l.current;if(!(!e||M)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ne.current=[],H.length!==0&&(H.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 c=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent(it)}`;s.src=c,s.addEventListener("load",()=>{const u=ne.current.indexOf(s),f=s.track;if(f&&u>=0){const h=u===St.current;f.mode=h&&!dn.current?"showing":"hidden"}}),e.appendChild(s),ne.current.push(s)}),H.length>0)))try{const n=d.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[H,it,M,m,l]),y(()=>{const e=l.current;if(!e||M)return;const n=d.current;ne.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const s=()=>{const f=Pn(_.state.subtitleFontSize,e.clientHeight||720),h=Math.max(0,Math.min(100,100-_.state.subtitlePosition)),q=()=>{const O=f*16,Z=e.videoHeight||e.clientHeight||720,oe=e.videoWidth||e.clientWidth||1280;return{step:O*1.3/Z*100,chars:Math.max(20,Math.floor(oe/(O*.55)))}},he=(O,Z)=>{const oe=O;oe.snapToLines=!1,oe.line=Z},J=O=>{if(!O.cues)return;Array.from(O.cues).forEach(ge=>he(ge,h));const Z=Array.from(O.activeCues??[]);if(Z.length<=1){Z.forEach(ge=>he(ge,h));return}const{step:oe,chars:j}=q();let rt=h;for(let ge=Z.length-1;ge>=0;ge--){const qe=String(Z[ge].text??"").replace(/<[^>]*>/g,"").split(`
|
|
3
|
+
`).reduce((nn,$t)=>nn+Math.max(1,Math.ceil($t.length/j)),0);rt=Math.max(0,rt-qe*oe),he(Z[ge],rt),rt-=oe*.4}},x=ne.current;if(x.length>0){x.forEach((O,Z)=>{const oe=O.track;if(!oe)return;const j=Z===ce;oe.mode=j&&!ae?"showing":"hidden",j&&!ae&&J(oe)});return}const U=Array.from(e.textTracks);U.length!==0&&U.forEach((O,Z)=>{const oe=Z===ce;O.mode=oe&&!ae?"showing":"hidden",oe&&!ae&&J(O)})};s();const c=()=>s();e.textTracks.addEventListener("addtrack",c),e.addEventListener("loadedmetadata",s,{once:!0});const u=window.setTimeout(s,600);return()=>{e.textTracks.removeEventListener("addtrack",c),e.removeEventListener("loadedmetadata",s),window.clearTimeout(u)}},[ce,H,M,m,l,ae,_.state.subtitleFontSize,_.state.subtitlePosition]),y(()=>{if(!ae)return;const e=l.current,n=Ct.current;if(!e||!n)return;const s=Ue/1e3,c=dt/1e3,u=new Set;let f=[],h=-1,q=-1,he=-1,J=-1,x=0,U=0,O=!1;const Z=()=>{const V=St.current;if(V<0)return null;const Ye=ne.current;return Ye.length>0?Ye[V]?.track??null:Array.from(e.textTracks)[V]??null},oe=(V,Ye)=>{const pe=V.cues;if(!pe||pe.length===0)return Array.from(V.activeCues??[]);let st=0,ot=pe.length;for(;st<ot;){const we=st+ot>>>1;pe[we].endTime+s<Ye?st=we+1:ot=we}const Ot=[];for(let we=st;we<pe.length;we++){const rn=pe[we];if(rn.startTime+s>Ye)break;rn.endTime+s>=Ye&&Ot.push(rn)}return Ot},j=()=>{const V=Z(),Ye=e.currentTime-c,pe=V?oe(V,Ye):[],st=e.clientWidth,ot=e.clientHeight,Ot=e.videoWidth,we=e.videoHeight;if(pe.length===f.length&&pe.every((Tn,kn)=>Tn===f[kn])&&st===h&&ot===q&&Ot===he&&we===J||(f=pe,h=st,q=ot,he=Ot,J=we,n.textContent="",pe.length===0))return;const rr={fontSize:Pn(_.state.subtitleFontSize,ot),position:_.state.subtitlePosition,bgOpacity:_.state.subtitleBgOpacity,bgColor:_.state.subtitleBgColor,textColor:_.state.subtitleTextColor,edge:_.state.subtitleEdge,bold:_.state.subtitleBold},$r=ds(rr),Or=us(e,rr.position);pe.forEach((Tn,kn)=>{const sr=String(Tn.text??"");if(!ms(sr).trim())return;const En=document.createElement("div"),Dr=(pe.length-1-kn)*1.7;En.style.cssText=`${$r}
|
|
4
|
+
bottom: calc(${Or}px + ${Dr}em);`,En.innerHTML=hs(sr),n.appendChild(En)})},rt=()=>{Array.from(e.textTracks).forEach(V=>{u.has(V)||(u.add(V),V.addEventListener("cuechange",j))})},ge=()=>{rt(),j()},Cn=()=>{if(O||U)return;const V=()=>{U=0,!(O||e.paused||e.ended)&&(j(),Cn())};U=window.requestAnimationFrame(V)},qe=e,nn=()=>{x=0,j(),!O&&qe.requestVideoFrameCallback&&(x=qe.requestVideoFrameCallback(nn))},$t=()=>{j(),qe.requestVideoFrameCallback?x||(x=qe.requestVideoFrameCallback(nn)):Cn()};rt(),e.textTracks.addEventListener("addtrack",ge),e.textTracks.addEventListener("removetrack",ge),e.addEventListener("timeupdate",j),e.addEventListener("seeked",j),e.addEventListener("loadedmetadata",j),e.addEventListener("play",$t);const tr=Array.from(e.querySelectorAll("track"));tr.forEach(V=>V.addEventListener("load",j));const nr=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>j());return nr?.observe(e),j(),$t(),()=>{O=!0,u.forEach(V=>V.removeEventListener("cuechange",j)),e.textTracks.removeEventListener("addtrack",ge),e.textTracks.removeEventListener("removetrack",ge),e.removeEventListener("timeupdate",j),e.removeEventListener("seeked",j),e.removeEventListener("loadedmetadata",j),e.removeEventListener("play",$t),tr.forEach(V=>V.removeEventListener("load",j)),nr?.disconnect(),U&&window.cancelAnimationFrame(U),x&&qe.cancelVideoFrameCallback&&qe.cancelVideoFrameCallback(x),n.textContent=""}},[ae,Ue,ce,H,dt,l,_.state.subtitleFontSize,_.state.subtitlePosition,_.state.subtitleBgOpacity,_.state.subtitleBgColor,_.state.subtitleTextColor,_.state.subtitleEdge,_.state.subtitleBold]);const en=()=>{N(null),Q([]),de(""),R(-1)},Lr=S(e=>{ee(e),z(1),Be(e,1)},[Be]),tn=!p&&r?.seasons&&r.seasons.length>1?t("label",{className:v.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:i,onChange:e=>Lr(parseInt(e.target.value,10)||1),className:v.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,ft=S(e=>{const n=parseInt(e,10);if(!isNaN(n)){try{l.current?.pause()}catch{}z(n),Be(i,n)}fn(!1)},[i,Be,l]);y(()=>{if(p)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(E!=null?ft(String(E)):zr.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[p,E,ft]);const Mr=e=>{k(e);try{const s=Re[e];s&&localStorage.setItem("tvLastAudio",In(s))}catch{}const n=d.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Rr=e=>{$e(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const u=H[e];u&&localStorage.setItem("tvLastSubtitle",In(u))}}catch{}const n=l.current,s=d.current;if(s&&typeof s.subtitleTrack=="number"&&Array.isArray(s.subtitleTracks)&&s.subtitleTracks.length>0&&(s.subtitleTrack=ne.current.length>0||e<0?-1:e),!n)return;const c=ne.current;if(c.length>0){c.forEach((u,f)=>{const h=u.track;if(!h)return;const q=f===e;h.mode=q&&!ae?"showing":"hidden"});return}Array.from(n.textTracks).forEach((u,f)=>{const h=f===e;u.mode=h&&!ae?"showing":"hidden"})},Rt=S(()=>{if(!r)return;const e=l.current,n=p?"":`S${String(i).padStart(2,"0")}E${String(g).padStart(2,"0")}`;bt.discord.tvPresence.mutate({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:wt.current}).catch(()=>{}),bt.discord.heartbeat.mutate({sessionId:wt.current}).catch(()=>{})},[r,p,i,g,l]);return y(()=>{if(!r)return;Rt();const e=window.setInterval(()=>{const n=l.current;(!n||!n.paused)&&Rt()},15e3);return()=>window.clearInterval(e)},[Rt,r,l]),y(()=>{if(!r||M||Se||Ce||L.length===0)return;const e=l.current;if(!e)return;const n=()=>Rt();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,M,Se,Ce,L,Rt,l]),y(()=>{const e=wt.current,n=()=>Kr(e),s=()=>n();return window.addEventListener("pagehide",s),window.addEventListener("beforeunload",s),()=>{window.removeEventListener("pagehide",s),window.removeEventListener("beforeunload",s),n()}},[]),y(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=p?`${r.title} - dango`:`${r.title} - Season ${i} Episode ${g} - dango`},[r,p,i,g]),y(()=>{if(!r||p)return;const e=new URLSearchParams(b),n=e.get("s"),s=e.get("e"),c=String(i),u=String(g);n===c&&s===u||(e.set("type",b.get("type")||"tv"),e.set("s",c),e.set("e",u),R(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,p,i,g,b,R]),t("div",{className:`${Ge.playerPageLayout} ${Ie?Ge.theaterMode:""}`,onClick:br,children:[Ie&&t(gs,{videoRef:l,active:It.enabled&&!M&&L.length>0&&!Ce&&!(r?.adult&&!Bt),settings:It}),!Ie&&t("aside",{className:Ge.episodeSidebar,children:r?p?t("div",{className:v.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:v.sidebarPosterMeta,children:[t("strong",{children:r.title}),t("span",{children:r.year})]})]}):t(ps,{episodes:Zn,currentEpisode:String(g),watchedEpisodes:Jn,onEpisodeClick:ft,header:tn}):p?t("div",{className:v.statusMsg,children:[t(D,{name:"spinner",className:v.spinner})," Loading..."]}):t(fs,{variant:"sidebar"})}),t("div",{className:Ge.playerMain,children:[r&&t("div",{className:v.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!Bt?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:M&&vt?t("iframe",{src:vt,className:v.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!M&&(L.length>0||Se)?t(Pe,{children:[Ce&&t(ir,{error:Ce,onRetry:Zt}),t(ko,{player:_,title:r.title,episodeLabel:p?void 0:`S${i} E${g}`,audioTracks:Re,selectedAudioTrack:fe,onAudioTrackChange:Mr,subtitles:H,selectedSubtitle:ce,onSubtitleChange:Rr,streams:L,resolutionIdx:Te,onResolutionChange:Oe,onBack:en,videoDelayEnabled:Xe,onVideoDelayToggle:ln,videoDelayMs:Tt,onVideoDelayChange:kt,onCalibrateAvSync:Vt,subtitleDelayMs:Ue,onSubtitleDelayChange:Ln,showNextEpisodeButton:hr&&!Ne&&!Ee&&!ze,onNextEpisode:Yn,isLoading:Se,isTheaterMode:Ie,onTheaterModeToggle:bn,ambientSettings:It,onAmbientChange:cn,children:[t("video",{ref:l,autoPlay:et&&!Lt,playsInline:!0,disablePictureInPicture:!0,className:`${v.video} ${Nt?v.videoHidden:""}`,onTimeUpdate:Cr,onEnded:()=>{ue||Tr()},onPlay:kr,onPause:Er,onSeeked:()=>{zn.current=Date.now(),Mt()},onLoadedMetadata:xr,onVolumeChange:_.actions.onVolumeChange,onWaiting:_.actions.onWaiting,onPlaying:_.actions.onPlaying,onCanPlay:_.actions.onCanPlay,onContextMenu:e=>e.preventDefault(),onError:()=>{B("Video failed to load. Try another server or reload."),X(!1)}}),t("canvas",{ref:re,className:`${v.delayCanvas} ${Nt?v.delayCanvasActive:""}`}),ae&&t("div",{ref:Ct,className:v.subtitleOverlay}),t(bs,{isOpen:Et,ms:Tt,onChange:kt,onApply:w,onClose:Wt,testClipActive:ue,onTestClip:se})]})]}):Ce&&!M?t(ir,{error:Ce,onRetry:Zt}):null}),!Ie&&r&&t(vs,{}),!Ie&&tn&&t("div",{className:v.mobileSeasonRow,children:tn}),!Ie&&r&&t("div",{className:v.providerSelectWrap,children:t("label",{className:v.controlLabel,children:["Source",t("select",{value:m,onChange:e=>Pr(e.target.value),className:v.select,disabled:K.length===0,children:Qe?t("option",{value:"",children:"Loading..."}):K.length===0?t("option",{value:"",children:"No providers available"}):t(Pe,{children:[T.length>0&&t("optgroup",{label:"Direct HLS",children:T.map(e=>t("option",{value:e.id,children:e.label},e.id))}),te.length>0&&t("optgroup",{label:"Embeds",children:te.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),!Ie&&r&&!M&&(Se?t("div",{className:v.sourceLoader,children:t("div",{className:v.ringSpinner})}):t(xo,{servers:ve,selectedServer:be,onServerSelect:Ar})),!Ie&&r&&t("div",{className:Ge.playerInfoContainer,children:[t("div",{className:Ge.playerInfoHeader,children:[t("div",{className:Ge.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:Ge.videoTitleSection,children:[t("div",{className:_e.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:v.meta,children:[t("span",{className:v.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:v.rating,children:[t(D,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${v.typeBadge} ${v[p?"movie":"tv"]}`,children:p?"Movie":"TV Show"})]}),er.length>0&&t("div",{className:v.genreRow,children:er.map(e=>t("span",{className:v.genreChip,children:e},e))}),Sn.length>0&&t("div",{className:v.metaRow,children:Sn.map((e,n)=>t("span",{children:[e,n<Sn.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:_e.controls,children:[t("button",{className:`${_e.watchlistBtn} ${Kt?_e.inList:""}`,onClick:mr,disabled:ur,type:"button",children:[Kt?t(D,{name:"check",size:14}):t(D,{name:"plus",size:14}),Kt?"In Watchlist":"Add to Watchlist"]}),!p&&t(Pe,{children:[t("button",{className:`${_e.watchlistBtn}`,onClick:()=>mn!=null&&ft(String(mn)),disabled:mn==null,type:"button",children:[t(D,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${_e.watchlistBtn}`,onClick:()=>E!=null&&ft(String(E)),disabled:E==null,type:"button",children:["Next EP",t(D,{name:"chevron-right",size:14})]}),!p&&t("button",{className:`${_e.watchlistBtn} ${_e.modeToggleBtn} ${mt?_e.modeToggleActive:""}`,onClick:()=>_r(!mt),type:"button","aria-pressed":mt,children:mt?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),vr&&t("button",{className:`${_e.watchlistBtn}`,onClick:()=>fn(!0),type:"button",children:[t(D,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:_e.descriptionSection,children:[t("h3",{children:"Synopsis"}),t($s,{text:r.overview,emptyText:"No description available."})]}),t("button",{className:_e.detailsToggleBtn,onClick:()=>pr(!Qt),type:"button",children:[Qt?t(D,{name:"chevron-up"}):t(D,{name:"chevron-down"}),Qt?"Hide Details":"Show Details"]}),Qt&&t("div",{className:v.detailGrid,children:[r.first_air_date&&t("div",{className:v.detailItem,children:[t("strong",{children:p?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:v.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:v.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:v.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:v.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:v.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:v.imdbLink,children:"View on IMDb"})]})]})]}),!p&&t(ys,{isOpen:fr,onClose:()=>fn(!1),episodes:Zn,currentEpisode:String(g),watchedEpisodes:Jn,onEpisodeClick:ft,header:tn}),r?.adult&&!Bt&&t(xn,{isOpen:!0,title:"Content Warning",onClose:en,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(Fe,{variant:"secondary",onClick:en,children:"Go Back"}),t(Fe,{onClick:cr,children:"I'm 18+, Continue"})]})]})}),t(_s,{isOpen:Ne,onClose:qn,title:"Resume Watching",message:t(Pe,{children:["You were at ",t("strong",{children:an(ut)})]}),restartLabel:"Start from Beginning",onResume:Nr,onRestart:qn}),t(xn,{isOpen:Ee,onClose:Ir,title:p?"Movie Completed":"Episode Completed",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:p?t(Pe,{children:"You've already watched this movie."}):t(Pe,{children:["You've already watched"," ",t("strong",{children:["Season ",i," Episode ",g]}),". Would you like to continue?"]})}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(Fe,{variant:"secondary",onClick:Br,children:"Replay"}),E!=null?t(Fe,{onClick:Yn,children:["Watch EP ",E]}):ye!=null?t(Fe,{onClick:Gn,children:["Start Season ",ye]}):null]})]})}),t(xn,{isOpen:ze,onClose:()=>tt(!1),title:p?"Movie Completed!":ye!=null?"Season Complete!":"Show Completed!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(D,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:gr}),t("p",{style:{color:"var(--text-secondary)"},children:p?"You finished this movie!":ye!=null?`You finished Season ${i}.`:"Congratulations! You finished all available episodes."}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(Fe,{variant:"secondary",onClick:()=>tt(!1),children:"Close"}),ye!=null?t(Fe,{onClick:Gn,children:["Start Season ",ye]}):t(Pe,{children:[t(Fe,{onClick:()=>{tt(!1),en()},children:"Back to Details"}),Kt&&t(Fe,{onClick:wr,disabled:zt.isPending,children:zt.isPending?"Saving...":"Move to Completed"})]})]})]})}),!r&&t("div",{className:v.statusMsg,children:[t(D,{name:"spinner",className:v.spinner})," Loading..."]})]})]})};export{Ha as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as R,a as q,p as E,d as l,h as C,T,u as e,g as F}from"./vendor-core-DfaOB3Rn.js";import{I as a}from"./vendor-icons-DrybRNxP.js";import{e as j,t as U,B as w}from"./index-
|
|
1
|
+
import{o as R,a as q,p as E,d as l,h as C,T,u as e,g as F}from"./vendor-core-DfaOB3Rn.js";import{I as a}from"./vendor-icons-DrybRNxP.js";import{e as j,t as U,B as w}from"./index-GAU-R8jU.js";import{n as H,d as J,e as K,f as Q,t as I}from"./useTvLibrary-B1csgiZ_.js";import"./vendor-query-BBT5_sHx.js";const X="_container_198yg_1",Y="_heroSection_198yg_11",Z="_bannerContainer_198yg_17",ee="_banner_198yg_17",ne="_bannerOverlay_198yg_37",te="_heroContent_198yg_49",se="_posterContainer_198yg_62",ae="_poster_198yg_62",oe="_infoGlass_198yg_86",ie="_title_198yg_100",re="_quickMeta_198yg_110",le="_metaItem_198yg_118",ce="_iconStar_198yg_126",de="_iconTv_198yg_130",me="_iconType_198yg_134",_e="_genres_198yg_139",he="_genre_198yg_139",ge="_metaRow_198yg_156",ve="_metaValue_198yg_164",pe="_metaDivider_198yg_168",ye="_synopsisSection_198yg_173",ue="_sectionTitleSmall_198yg_179",ke="_synopsis_198yg_173",be="_actions_198yg_196",Ne="_watchBtn_198yg_202",Se="_watchlistBtn_198yg_226",fe="_active_198yg_250",Ce="_seasonPickerLabel_198yg_256",Te="_seasonSelect_198yg_267",we="_detailsToggleBtn_198yg_286",Ie="_expandedContent_198yg_304",Be="_detailGrid_198yg_309",De="_detailItem_198yg_315",Me="_imdbLink_198yg_333",Le="_heroSkeleton_198yg_343",Pe="_skeletonBanner_198yg_347",$e="_skeletonContent_198yg_354",Ge="_skeletonPoster_198yg_365",xe="_skeletonInfo_198yg_373",Oe="_skeletonTitle_198yg_380",Ae="_skeletonMeta_198yg_388",Ve="_skeletonDesc_198yg_396",We="_skeletonActions_198yg_404",ze="_errorState_198yg_413",Re="_matureOverlay_198yg_434",qe="_matureContent_198yg_444",n={container:X,heroSection:Y,bannerContainer:Z,banner:ee,bannerOverlay:ne,heroContent:te,posterContainer:se,poster:ae,infoGlass:oe,title:ie,quickMeta:re,metaItem:le,iconStar:ce,iconTv:de,iconType:me,genres:_e,genre:he,metaRow:ge,metaValue:ve,metaDivider:pe,synopsisSection:ye,sectionTitleSmall:ue,synopsis:ke,actions:be,watchBtn:Ne,watchlistBtn:Se,active:fe,seasonPickerLabel:Ce,seasonSelect:Te,detailsToggleBtn:we,expandedContent:Ie,detailGrid:Be,detailItem:De,imdbLink:Me,heroSkeleton:Le,skeletonBanner:Pe,skeletonContent:$e,skeletonPoster:Ge,skeletonInfo:xe,skeletonTitle:Oe,skeletonMeta:Ae,skeletonDesc:Ve,skeletonActions:We,errorState:ze,matureOverlay:Re,matureContent:qe};function Je(){const{id:o}=R(),c=q(),[B]=E(),i=H(B.get("type")),{hasConsent:D}=j(),[t,M]=l(null),[L,_]=l(!0),[y,u]=l(""),[d,P]=l(!1),[h,$]=l(1),G=J(i,o),x=Number(o),{data:O}=K(t?G:void 0),g=!!O?.inLibrary,{toggle:A}=Q();C(()=>{o&&(_(!0),u(""),U.tv.details.query({type:i,id:String(o)}).then(s=>{const m={id:s.id,title:s.title||"",overview:s.overview||"",vote_average:s.vote_average,year:s.year,poster:s.poster,backdrop:s.backdrop,imdb_id:s.imdb_id||void 0,adult:s.adult,seasons:s.seasons?.map(z=>({...z,name:""})),number_of_seasons:s.number_of_seasons};M(m),_(!1)}).catch(s=>{u(s.message),_(!1)}))},[o,i]),C(()=>{document.title=t?.title?`${t.title} - dango`:"TV & Movies - dango"},[t?.title]);const V=()=>{!o||!t||c(r?I(i,o):I(i,o,h,1))},W=()=>{t&&A({tmdbId:x,mediaType:i,title:t.title,poster:t.poster,year:t.year,adult:t.adult})},r=i==="movie",v=!r,k=t?.backdrop?`https://image.tmdb.org/t/p/w1280${t.backdrop}`:"",b=t?.poster?`https://image.tmdb.org/t/p/w500${t.poster}`:"",N=T(()=>t?.genres?t.genres.map(s=>s.name).slice(0,5):[],[t?.genres]),S=T(()=>t?.seasons?t.seasons.filter(s=>s.season_number>0):[],[t?.seasons]),p=[t?.year,t?.status,v&&t?.number_of_seasons?`${t.number_of_seasons} Season${t.number_of_seasons>1?"s":""}`:null,v&&t?.number_of_episodes?`${t.number_of_episodes} Episodes`:null].filter(Boolean);if(L)return e("div",{className:n.container,children:e("div",{className:n.heroSkeleton,children:[e("div",{className:n.skeletonBanner}),e("div",{className:n.skeletonContent,children:[e("div",{className:n.skeletonPoster}),e("div",{className:n.skeletonInfo,children:[e("div",{className:n.skeletonTitle}),e("div",{className:n.skeletonMeta}),e("div",{className:n.skeletonDesc}),e("div",{className:n.skeletonActions})]})]})]})});if(y||!t)return e("div",{className:n.container,children:e("div",{className:n.errorState,children:[e(a,{name:"exclamation-triangle",size:48}),e("h2",{children:"Failed to load details"}),e("p",{children:y||"Something went wrong"}),e(w,{onClick:()=>c(-1),children:"Go Back"})]})});const f=t.adult&&!D;return e("div",{className:n.container,style:f?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:[e("div",{className:n.heroSection,children:[e("div",{className:n.bannerContainer,children:[k&&e("div",{className:n.banner,style:{backgroundImage:`url(${k})`}}),e("div",{className:n.bannerOverlay})]}),e("div",{className:n.heroContent,children:[e("div",{className:n.posterContainer,children:b&&e("img",{src:b,alt:t.title,className:n.poster,decoding:"async"})}),e("div",{className:n.infoGlass,children:[e("div",{className:n.topInfo,children:[e("h1",{className:n.title,children:t.title}),e("div",{className:n.quickMeta,children:[t.vote_average!=null&&t.vote_average>0&&e("div",{className:n.metaItem,children:[e(a,{name:"star",className:n.iconStar}),e("span",{children:Number(t.vote_average).toFixed(1)})]}),e("div",{className:n.metaItem,children:[e(a,{name:"tv",className:n.iconTv}),e("span",{children:r?"Movie":"TV Show"})]}),t.vote_count!=null&&e("div",{className:n.metaItem,children:[e(a,{name:"users",className:n.iconType}),e("span",{children:[t.vote_count.toLocaleString()," votes"]})]})]}),N.length>0&&e("div",{className:n.genres,children:N.map(s=>e("span",{className:n.genre,children:s},s))})]}),p.length>0&&e("div",{className:n.metaRow,children:p.map((s,m)=>e(F.Fragment,{children:[e("span",{className:n.metaValue,children:s}),m<p.length-1&&e("span",{className:n.metaDivider,children:"·"})]},m))}),t.overview&&e("div",{className:n.synopsisSection,children:[e("h2",{className:n.sectionTitleSmall,children:"Synopsis"}),e("p",{className:n.synopsis,children:t.overview})]}),e("div",{className:n.actions,children:[e("button",{className:n.watchBtn,onClick:V,children:[e(a,{name:"play",size:14}),r?"Watch Now":`Start S${h}`]}),e("button",{className:`${n.watchlistBtn} ${g?n.active:""}`,onClick:W,children:[g?e(a,{name:"check",size:14}):e(a,{name:"plus",size:14}),g?"In Watchlist":"Add to Watchlist"]})]}),v&&S.length>1&&e("label",{className:n.seasonPickerLabel,children:[e("span",{children:"Season"}),e("select",{value:h,onChange:s=>$(parseInt(s.target.value,10)||1),className:n.seasonSelect,children:S.map(s=>e("option",{value:s.season_number,children:["Season ",s.season_number," (",s.episode_count," Episodes)"]},s.season_number))})]}),e("button",{className:n.detailsToggleBtn,onClick:()=>P(!d),children:[d?e(a,{name:"chevron-up"}):e(a,{name:"chevron-down"}),d?"Hide Details":"Show Details"]}),d&&e("div",{className:n.expandedContent,children:e("div",{className:n.detailGrid,children:[t.first_air_date&&e("div",{className:n.detailItem,children:[e("strong",{children:r?"Release Date":"First Air Date"}),e("span",{children:t.first_air_date})]}),t.last_air_date&&e("div",{className:n.detailItem,children:[e("strong",{children:"Last Air Date"}),e("span",{children:t.last_air_date})]}),t.networks&&t.networks.length>0&&e("div",{className:n.detailItem,children:[e("strong",{children:"Networks"}),e("span",{children:t.networks.map(s=>s.name).join(", ")})]}),t.created_by&&t.created_by.length>0&&e("div",{className:n.detailItem,children:[e("strong",{children:"Created By"}),e("span",{children:t.created_by.map(s=>s.name).join(", ")})]}),t.episode_run_time&&t.episode_run_time.length>0&&e("div",{className:n.detailItem,children:[e("strong",{children:"Episode Runtime"}),e("span",{children:[t.episode_run_time[0]," min"]})]}),t.imdb_id&&e("div",{className:n.detailItem,children:[e("strong",{children:"IMDb"}),e("a",{href:`https://www.imdb.com/title/${t.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:n.imdbLink,children:"View on IMDb"})]})]})})]})]})]}),f&&e("div",{className:n.matureOverlay,children:e("div",{className:n.matureContent,children:[e(a,{name:"exclamation-triangle",size:48}),e("h2",{children:"Content Warning"}),e("p",{children:"This content may contain mature themes."}),e(w,{onClick:()=>c("/"),children:"Go Back"})]})})]})}export{Je as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as b,d as v,h as P,T as z,u as e,S,L as p}from"./vendor-core-DfaOB3Rn.js";import{I as i}from"./vendor-icons-DrybRNxP.js";import{f as W,d as B,c as D,t as L}from"./useTvLibrary-
|
|
1
|
+
import{A as b,d as v,h as P,T as z,u as e,S,L as p}from"./vendor-core-DfaOB3Rn.js";import{I as i}from"./vendor-icons-DrybRNxP.js";import{f as W,d as B,c as D,t as L}from"./useTvLibrary-B1csgiZ_.js";import{t as M}from"./index-GAU-R8jU.js";import{p as a,a as A}from"./MediaCard-BjnksiL1.js";const R=({item:s,anchorRect:m,onMouseEnter:u,onMouseLeave:g,onRequestClose:r})=>{const d=b(!1),[n,N]=v(null),[f,l]=v(!0),{toggle:y,bookmarkedIds:w}=W(),I=B(s.type,s.id),c=w.has(I);P(()=>{let t=!1;return l(!0),M.tv.details.query({type:s.type,id:String(s.id)}).then(o=>{t||(N({overview:o.overview,vote_average:o.vote_average,number_of_seasons:o.number_of_seasons}),l(!1))}).catch(()=>{t||l(!1)}),()=>{t=!0}},[s.id,s.type]);const h=z(()=>n?.genres?n.genres.slice(0,4).map(t=>t.name):[],[n?.genres]),k=D(s.type,s.id),T=L(s.type,s.id),_=t=>{t.preventDefault(),t.stopPropagation(),y({tmdbId:s.id,mediaType:s.type,title:s.title,poster:s.image,year:s.year})};return e(A,{anchorRect:m,onMouseEnter:()=>{d.current=!0,u()},onMouseLeave:()=>{d.current=!1,g()},onRequestClose:r,children:[e("div",{className:a.header,children:e("div",{className:a.title,children:s.title})}),e("div",{className:a.body,children:f?e("div",{className:a.loading,children:[e("div",{className:a.spinner}),e("span",{children:"Fetching details..."})]}):e(S,{children:[e("div",{className:a.metaRow,children:[n?.vote_average!=null&&n.vote_average>0&&e("div",{className:a.metaItem,children:[e(i,{name:"star",className:a.scoreIcon,size:14}),e("span",{children:Number(n.vote_average).toFixed(1)})]}),e("div",{className:a.metaItem,children:[e(i,{name:"tv",size:14}),e("span",{children:s.type==="tv"?"TV Show":"Movie"})]}),s.year&&e("div",{className:a.metaItem,children:e("span",{children:s.year})}),n?.status&&e("div",{className:a.metaItem,children:e("span",{children:n.status})})]}),h.length>0&&e("div",{className:a.genres,children:h.map(t=>e("span",{className:a.genre,children:t},t))}),n?.overview&&e("div",{className:a.synopsis,children:n.overview.length>200?n.overview.slice(0,200)+"...":n.overview})]})}),e("div",{className:a.footer,children:[e("div",{className:a.primaryAction,children:e(p,{to:T,className:a.watchBtn,onClick:r,children:[e(i,{name:"play",size:14}),"Watch now"]})}),e("div",{className:a.secondaryActions,children:[e("button",{className:`${a.watchlistBtn} ${c?a.active:""}`,onClick:_,children:[c?e(i,{name:"check",size:12}):e(i,{name:"plus",size:12}),e("span",{children:c?"Remove":"Watchlist"})]}),e(p,{to:k,className:a.detailsBtn,onClick:r,children:[e(i,{name:"info-circle",size:12}),e("span",{children:"Details"})]})]})]})]})};export{R as T};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as W,p as ae,A as re,d as o,T as z,q as A,u as t}from"./vendor-core-DfaOB3Rn.js";import{I as p}from"./vendor-icons-DrybRNxP.js";import{P as I,S as ne}from"./SkeletonGrid-
|
|
1
|
+
import{h as W,p as ae,A as re,d as o,T as z,q as A,u as t}from"./vendor-core-DfaOB3Rn.js";import{I as p}from"./vendor-icons-DrybRNxP.js";import{P as I,S as ne}from"./SkeletonGrid-D98PFdEd.js";import{a as se,T as le}from"./useTv-C0AAHhYE.js";import{u as ie,N as oe,B as x}from"./index-GAU-R8jU.js";import{E as ce}from"./ErrorMessage-DAxegITP.js";import{s as r}from"./Search.module-CMEai-B-.js";import"./MediaCard-BjnksiL1.js";import"./vendor-ui-3qrARCPr.js";import"./useIsMobile-Dvx1uJ82.js";import"./TvPopup-CuR-CXOg.js";import"./useTvLibrary-B1csgiZ_.js";import"./vendor-query-BBT5_sHx.js";const de=[{value:"multi",label:"All"},{value:"tv",label:"TV Shows"},{value:"movie",label:"Movies"}],me=[{value:"popularity.desc",label:"Popularity"},{value:"vote_average.desc",label:"Top Rated"},{value:"primary_release_date.desc",label:"Newest"},{value:"primary_release_date.asc",label:"Oldest"},{value:"vote_count.desc",label:"Most Voted"}],Y={10759:"Action & Adventure",16:"Animation",35:"Comedy",80:"Crime",99:"Documentary",18:"Drama",10751:"Family",10762:"Kids",9648:"Mystery",10765:"Sci-Fi & Fantasy",37:"Western"},H={28:"Action",12:"Adventure",16:"Animation",35:"Comedy",80:"Crime",99:"Documentary",18:"Drama",10751:"Family",14:"Fantasy",36:"History",27:"Horror",9648:"Mystery",10749:"Romance",878:"Sci-Fi",53:"Thriller",10752:"War",37:"Western"},O=new Date().getFullYear(),ue=[{value:"ALL",label:"All Years"},...Array.from({length:O-1980+1},(l,u)=>({value:String(O-u),label:String(O-u)}))];function Me(){W(()=>{document.title="Search TV & Movies - dango"},[]);const[l,u]=ae(),{lowEndMode:K}=ie(),C=re(null),[g,Q]=o(l.get("q")||""),[h,U]=o(l.get("q")||""),[m,v]=o(parseInt(l.get("page")||"1",10)||1),[i,J]=o(l.get("type")||"multi"),[$,k]=o(l.get("genre")||""),[y,F]=o(l.get("year")||"ALL"),[f,B]=o(l.get("sort_by")||"popularity.desc"),[b,X]=o(!1),[c,N]=o(()=>{const e={},a=l.get("genre")||"";return a&&(e[a]="include"),e}),M=z(()=>{if(i==="tv")return Object.entries(Y).map(([a,n])=>({id:a,name:n}));if(i==="movie")return Object.entries(H).map(([a,n])=>({id:a,name:n}));const e=new Map;for(const[a,n]of Object.entries(Y))e.set(a,n);for(const[a,n]of Object.entries(H))e.set(a,n);return Array.from(e.entries()).map(([a,n])=>({id:a,name:n}))},[i]),S=z(()=>Object.entries(c).filter(([,a])=>a==="include").map(([a])=>a).join(","),[c]),{data:P,isLoading:w,isError:Z,error:ee}=se({query:h,type:i,genre:S,year:y,sort_by:f,page:m}),T=P?.results||[],L=P?.total_pages||0,E=P?.total_results||0,R=m<Math.min(L,500),d=A((e={})=>{const a=new URLSearchParams,n=e.q!==void 0?e.q:h,s=e.type!==void 0?e.type:i,q=e.year!==void 0?e.year:y,G=e.sort!==void 0?e.sort:f,D=e.page!==void 0?e.page:String(m),V=e.genre!==void 0?e.genre:S;n.trim()&&a.set("q",n.trim()),s!=="multi"&&a.set("type",s),V&&a.set("genre",V),q!=="ALL"&&a.set("year",q),G!=="popularity.desc"&&a.set("sort_by",G),D!=="1"&&a.set("page",D),u(a,{replace:!0})},[h,i,y,f,m,S,u]),_=A(()=>{oe(),v(1),U(g),d({q:g,page:"1"}),window.scrollTo({top:0,behavior:"smooth"})},[g,d]),j=A(e=>{if(v(e),d({page:String(e)}),C.current){const a=C.current.getBoundingClientRect().top+window.scrollY-100;window.scrollTo({top:a,behavior:"smooth"})}},[d]),te=A(e=>{N(a=>{const n=a[e],s={...a};return n==="include"?s[e]="exclude":n==="exclude"?delete s[e]:s[e]="include",s}),v(1)},[]);return W(()=>{const a=Object.entries(c).filter(([,n])=>n==="include").map(([n])=>n).join(",");a!==$&&(k(a),d({genre:a,page:"1"}))},[c,$,k,d]),t("div",{className:"page-container",children:[t("div",{className:r.header,children:[t("h1",{className:r.pageTitle,children:"Search TV & Movies"}),t("p",{className:r.pageSubtitle,children:"Discover trending shows, movies, and more powered by TMDB"})]}),t("div",{className:r.filterContainer,children:[t("div",{className:r.searchBarWrapper,children:[t("div",{className:r.inputIconWrapper,children:[t(p,{name:"search",className:r.searchIcon}),t("input",{type:"text","data-virtual-keyboard":"true",className:r.searchInput,placeholder:"Search titles...",value:g,onInput:e=>Q(e.currentTarget.value),onKeyDown:e=>e.key==="Enter"&&_()})]}),t("div",{className:r.searchActions,children:[t("select",{value:i,onChange:e=>{J(e.target.value),N({})},className:r.providerSelect,"aria-label":"Media type",children:de.map(e=>t("option",{value:e.value,children:e.label},e.value))}),t(x,{onClick:_,className:r.searchBtn,children:"Search"}),t("button",{className:`${r.filterToggleBtn} ${b?r.active:""}`,onClick:()=>X(!b),children:[t(p,{name:"filter",size:14}),t("span",{children:"Filters"}),b?t(p,{name:"chevron-up",size:12}):t(p,{name:"chevron-down",size:12})]})]})]}),t("div",{className:`${r.advancedFilters} ${b?r.show:""}`,children:[t("div",{className:r.filterDivider}),t("div",{className:r.filterGrid,children:[t("div",{className:r.filterItem,children:[t("label",{children:"Sort By"}),t("select",{value:f,onChange:e=>B(e.currentTarget.value),children:me.map(e=>t("option",{value:e.value,children:e.label},e.value))})]}),t("div",{className:r.filterItem,children:[t("label",{children:"Year"}),t("select",{value:y,onChange:e=>F(e.currentTarget.value),children:ue.map(e=>t("option",{value:e.value,children:e.label},e.value))})]})]}),M.length>0&&t("div",{className:r.genreSection,children:[t("label",{className:r.genreLabel,children:"Genres"}),t("div",{className:r.genreContainer,children:M.map(e=>t("button",{className:`${r.genreButton} ${r[c[e.id]||""]}`,onClick:()=>te(e.id),children:e.name},e.id))})]}),t("div",{className:r.filterActions,children:[t(x,{variant:"secondary",onClick:()=>{N({}),F("ALL"),B("popularity.desc"),v(1),d({genre:"",year:"ALL",sort:"popularity.desc",page:"1"})},children:"Reset All"}),t(x,{onClick:_,className:r.searchBtn,children:"Apply Filters"})]})]})]}),Z&&t(ce,{message:ee?.message||"Search failed"}),Object.keys(c).length>0&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",marginBottom:"1.5rem"},children:[t("span",{style:{fontSize:"0.8rem",color:"var(--text-muted)",fontWeight:600},children:"Active Filters:"}),Object.entries(c).map(([e,a])=>{const n=M.find(s=>s.id===e)?.name||e;return t("span",{className:`badge ${a==="include"?"badge-primary":"badge-danger"}`,style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:[a==="include"?`+ ${n}`:`- ${n}`,t("button",{onClick:()=>{const s={...c};delete s[e],N(s)},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]},e)})]}),t("div",{className:r.resultsHeader,ref:C,children:[t("h2",{className:r.resultsTitle,children:[h?`Results for "${h}"`:S?"Browsing genres":i==="tv"?"Popular TV Shows":i==="movie"?"Popular Movies":"Trending",E>0&&t("span",{style:{fontWeight:400,color:"var(--text-tertiary)",fontSize:"0.85em",marginLeft:"0.5em"},children:["(",E.toLocaleString(),")"]})]}),T.length>0&&t(I,{page:m,totalPages:Math.max(1,Math.min(L,500)),canGoNext:R,onChange:j,isLoading:w})]}),t("div",{className:`${r.resultsGrid} ${K?r.lowEnd:""}`,children:w?t(ne,{}):T.map(e=>t(le,{item:{id:e.id,title:e.title,year:e.year,type:e.type,image:e.image,vote_average:e.vote_average,adult:e.adult}},`${e.type}-${e.id}`))}),!w&&T.length===0&&t("div",{className:r.noResults,children:[t(p,{name:"search",size:48,className:r.noResultsIcon}),t("h3",{children:"No results found"}),t("p",{children:"Try adjusting your search or filters to find what you're looking for."})]}),T.length>0&&t("div",{className:r.bottomPagination,children:t(I,{page:m,totalPages:Math.max(1,Math.min(L,500)),canGoNext:R,onChange:j,isLoading:w,variant:"labeled"})})]})}export{Me as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as U,d as v,h as y,T as x,u as l}from"./vendor-core-DfaOB3Rn.js";import{M as N}from"./MediaCard-
|
|
1
|
+
import{o as U,d as v,h as y,T as x,u as l}from"./vendor-core-DfaOB3Rn.js";import{M as N}from"./MediaCard-BjnksiL1.js";import{L as _}from"./LibraryListPage-C463kkiG.js";import{R as K}from"./ResetProgressModal-Cjzd8-mT.js";import{T as O}from"./TvPopup-CuR-CXOg.js";import{g as u}from"./index-GAU-R8jU.js";import{l as Q,u as Y,a as q,b as z,h as G,m as Z,o as j,p as D,t as S,i as I,T as k}from"./useTvLibrary-B1csgiZ_.js";import"./vendor-ui-3qrARCPr.js";import"./useIsMobile-Dvx1uJ82.js";import"./vendor-icons-DrybRNxP.js";import"./SkeletonGrid-D98PFdEd.js";import"./ErrorMessage-DAxegITP.js";import"./Watchlist.module-XGtVQr1d.js";import"./vendor-query-BBT5_sHx.js";const H=["All","Continue Watching",...k],P=24;function ce(){const{filter:d="All"}=U(),[T,g]=v(1),[s,p]=v(null),[h,c]=v(!1);y(()=>{document.title="TV Watchlist - dango"},[]),y(()=>{g(1)},[d]);const o=d==="Continue Watching",r=Q(o?"All":d,T,P),i=Y(100),b=q(),w=z(),C=G(),W=Z(),B=j(),E=D(),M=x(()=>o?(i.data?.data??[]).map(e=>{const a=e.currentTime??0,t=e.duration??0,f=e.season??e.lastSeason??1,R=e.episode??e.lastEpisode??1,n=e.mediaType==="movie",m=n?"Movie":`S${f} E${R}`,L=e.completed===!0||e.completed===1||t>0&&a>=t*.8;return{key:e.id,libId:e.id,tmdbId:e.tmdbId,mediaType:e.mediaType,title:e.title,poster:e.poster||"",year:e.year,adult:I({adult:e.adult===1}),status:e.status,badge:m,progressPercent:L?100:t>0?a/t*100:0,progressLabel:t>0?L?"Watched":n?`${u(a)} / ${u(t)}`:`${m} · ${u(a)} / ${u(t)}`:m,watchTarget:S(e.mediaType,e.tmdbId,n?void 0:f,n?void 0:R)}}):(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:I({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:S(e.mediaType,e.tmdbId,e.lastSeason??void 0,e.lastEpisode??void 0)})),[o,i.data,r.data]),A=o?i.data?.total??0:r.data?.total??0,V=o?i.isLoading:r.isLoading,$=o?i.error:r.error,F=()=>{s&&(w.mutate({mediaId:s.libId}),h&&b.mutate(s.libId),p(null),c(!1))};return l(_,{headerTitle:"My TV Watchlist",headerSubtitle:"Track and manage your movies and shows",filters:H,filterBy:d,filterBasePath:"/tv-watchlist",continueFilter:"Continue Watching",statusOptions:[...k],entries:M,total:A,isLoading:V,error:$,page:T,pageSize:P,onPageChange:g,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)=>W.mutate({ids:e,status:a}),onBulkRemove:e=>{o?E.mutate(e):B.mutate(e)},onStatusChange:(e,a)=>C.mutate({id:e,status:a}),onRemoveItem:e=>b.mutate(e),renderCard:e=>l(N,{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:o,metaRow:e.year?l("span",{style:{opacity:.75},children:e.year}):void 0,onRemove:o?()=>p(e):void 0,renderPopup:(a,t)=>l(O,{item:{id:e.tmdbId??0,title:e.title||"",year:e.year||"",type:e.mediaType||"tv",image:e.poster||""},anchorRect:a,onMouseEnter:t.onMouseEnter,onMouseLeave:t.onMouseLeave,onRequestClose:t.close})}),modals:l(K,{isOpen:!!s,itemName:s?.title,progressKind:"watch",listLabel:"my TV watchlist",alsoRemove:h,onAlsoRemoveChange:c,onClose:()=>{p(null),c(!1)},onConfirm:F})})}export{ce as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as ge,o as Ke,a as Qe,p as Ve,d as u,A as ve,T as R,u as t,S as He}from"./vendor-core-DfaOB3Rn.js";import{u as Ze,a as fe}from"./vendor-query-BBT5_sHx.js";import{h as Je,u as Xe,d as et,v as tt,w as ye,x as Se,z as at,t as nt,k as st,y as lt,A as rt,C as it,D as ct,E as ot,B as T,M as ae}from"./index-CZW1But9.js";import{I as p}from"./vendor-icons-DrybRNxP.js";import{A as dt}from"./AnimeCard-BVnAhrys.js";import{P as be,S as ut}from"./SkeletonGrid-ZN-kS9re.js";import{E as mt}from"./ErrorMessage-DAxegITP.js";import{s as a}from"./Watchlist.module-XGtVQr1d.js";import"./useAnimeInfoData-C9tOyy6E.js";import"./QueueOptionsButton-DjBOibpt.js";import"./vendor-ui-3qrARCPr.js";import"./MediaCard-GwFTnacn.js";import"./useIsMobile-Dvx1uJ82.js";const ht=(d,g)=>{const l=new URLSearchParams(g);return l.delete("page"),l.sort(),`${d}|${l.toString()}`},pt=(d,g)=>{const l=new Set(d);return g.forEach(N=>l.add(N)),l},gt=(d,g)=>{const l=new Set(d);return g.forEach(N=>l.delete(N)),l},Ae=["All","Continue Watching","Watching","Completed","On-Hold","Dropped","Planned"],Le=Ae.slice(2),vt=[{value:"ALL",label:"All Types"},{value:"TV",label:"TV Series"},{value:"Movie",label:"Movie"},{value:"OVA",label:"OVA"},{value:"ONA",label:"ONA"},{value:"TV_SHORT",label:"TV Short"},{value:"SPECIAL",label:"Special"},{value:"ADULT",label:"Adult (18+)"}],ft=[{value:"ALL",label:"All Seasons"},{value:"WINTER",label:"Winter"},{value:"SPRING",label:"Spring"},{value:"SUMMER",label:"Summer"},{value:"FALL",label:"Fall"}],Wt=()=>{ge(()=>{document.title="Watchlist - dango"},[]);const{filter:d="All"}=Ke(),g=Qe(),[l,N]=Ve(),q=Ze(),ne=Je(),[v,B]=u(parseInt(l.get("page")||"1")),[f,W]=u(l.get("query")||""),[C,K]=u(l.get("sortBy")||"last_added"),[y,P]=u(l.get("type")||"ALL"),[S,I]=u(l.get("season")||"ALL"),[b,$]=u(l.get("year")||"ALL"),[k,F]=u(()=>{const e={},n=l.get("genres")?.split(",").map(r=>r.trim()).filter(Boolean)||[],s=l.get("excludeGenres")?.split(",").map(r=>r.trim()).filter(Boolean)||[];return n.forEach(r=>r&&(e[r]="include")),s.forEach(r=>r&&(e[r]="exclude")),e}),[M,Ne]=u(()=>["type","season","year","genres","excludeGenres"].some(e=>l.has(e))),{lowEndMode:Ce}=Xe(),{titlePreference:O}=et(),{data:ke}=tt(),se=ke?.genres||[],Q=ve(null),[c,w]=u(null),[V,D]=u(!1),[le,E]=u(!1),[z,we]=u(!1),[h,L]=u(new Set),H=ve(null),i=d==="Continue Watching",G=R(()=>{const e=new URLSearchParams(l);return e.delete("page"),e.set("titlePreference",O),e.toString()},[l,O]),{data:_,isLoading:xe,error:Re}=ye(G,v,14),{data:U,isLoading:Te,error:Be}=Se(d,G,v,14),{data:We}=ye(G,v+1,14),{data:Pe}=Se(d,G,v+1,14),Z=R(()=>(i?_?.data:U?.data)||[],[i,_,U]),x=R(()=>(i?_?.total:U?.total)||0,[i,_,U]),Y=i?xe:Te,re=i?Re:Be,ie=i?We:Pe;ge(()=>{W(l.get("query")||""),K(l.get("sortBy")||"last_added"),P(l.get("type")||"ALL"),I(l.get("season")||"ALL"),$(l.get("year")||"ALL");const e={},n=l.get("genres")?.split(",").map(o=>o.trim()).filter(Boolean)||[],s=l.get("excludeGenres")?.split(",").map(o=>o.trim()).filter(Boolean)||[];n.forEach(o=>o&&(e[o]="include")),s.forEach(o=>o&&(e[o]="exclude")),F(e),B(parseInt(l.get("page")||"1"));const r=ht(d,l);H.current!==null&&H.current!==r&&L(new Set),H.current=r},[l,d]);const Ie=fe({mutationFn:async({id:e,status:n})=>{await nt.watchlist.setStatus.mutate({id:e,status:n})},onSuccess:()=>{q.invalidateQueries({queryKey:["watchlist"]}),at.success("Status updated")}}),$e=fe(ne.continueWatching.remove.mutationOptions({onSuccess:()=>{q.invalidateQueries(ne.continueWatching.pathFilter()),q.invalidateQueries({queryKey:["allContinueWatching"]})}})),J=st(),{data:ce}=lt("skipRemoveConfirmation"),Fe=rt(),X=R(()=>{const e=n=>n[O]||n.name||"";return[...Z].sort((n,s)=>C==="name_asc"?e(n).localeCompare(e(s)):C==="name_desc"?e(s).localeCompare(e(n)):0)},[Z,C,O]),ee=new Date().getFullYear(),Me=[{value:"ALL",label:"All Years"},...Array.from({length:ee-1980+1},(e,n)=>({value:String(ee-n),label:String(ee-n)}))],m=(e=C,n=1)=>{const s=new URLSearchParams;f.trim()&&s.set("query",f.trim()),e!=="last_added"&&s.set("sortBy",e),y!=="ALL"&&s.set("type",y),S!=="ALL"&&s.set("season",S),b!=="ALL"&&s.set("year",b);const r=Object.entries(k).filter(([,A])=>A==="include").map(([A])=>A),o=Object.entries(k).filter(([,A])=>A==="exclude").map(([A])=>A);r.length>0&&s.set("genres",r.join(",")),o.length>0&&s.set("excludeGenres",o.join(",")),n>1&&s.set("page",n.toString()),N(s),n!==v&&B(n)},oe=e=>{if(m(C,e),Q.current){const n=Q.current.getBoundingClientRect().top+window.scrollY-100;window.scrollTo({top:n,behavior:"smooth"})}},Oe=()=>{W(""),K("last_added"),P("ALL"),I("ALL"),$("ALL"),F({}),N(new URLSearchParams),B(1)},De=e=>{F(n=>{const s=n[e],r={...n};return s==="include"?r[e]="exclude":s==="exclude"?delete r[e]:r[e]="include",r})},de=(e,n)=>{if(i){w({id:e,name:n});return}String(ce)==="true"||String(ce)==="1"?J.mutate({id:e}):w({id:e,name:n})},Ee=()=>{if(c){if(c.ids){i?(ze.mutate({ids:c.ids}),V&&me.mutate({ids:c.ids})):me.mutate({ids:c.ids}),L(new Set),w(null),D(!1),E(!1);return}i?($e.mutate({showId:c.id}),V&&J.mutate({id:c.id})):J.mutate({id:c.id}),le&&Fe.mutate({key:"skipRemoveConfirmation",value:!0}),w(null),D(!1),E(!1)}},ue=()=>{w(null),D(!1),E(!1)},me=it(),ze=ct(),Ge=ot(),_e=()=>{we(e=>{const n=!e;return n||L(new Set),n})},Ue=e=>{L(n=>{const s=new Set(n);return s.has(e)?s.delete(e):s.add(e),s})},j=X.map(e=>e.id),te=j.length>0&&j.every(e=>h.has(e)),Ye=()=>{L(te?e=>gt(e,j):e=>pt(e,j))},je=e=>{h.size!==0&&(Ge.mutate({ids:[...h],status:e}),L(new Set))},qe=()=>{h.size!==0&&w({ids:[...h]})},he=Z.length>=14&&ie&&ie.data.length>0,pe=R(()=>Math.max(1,Math.ceil(x/14)),[x]);return t("div",{className:"page-container",children:[t("header",{className:a.header,children:[t("h2",{className:a.title,children:"My Watchlist"}),t("p",{className:a.subtitle,children:"Track and manage your anime collection"})]}),t("div",{className:a.controls,children:[t("div",{className:a.filters,children:Ae.map(e=>t("button",{className:`${a.filterBtn} ${d===e?a.active:""}`,onClick:()=>{const n=new URLSearchParams(l);n.delete("page"),g({pathname:`/watchlist/${e}`,search:n.toString()}),B(1)},children:e},e))}),t("div",{children:t("select",{className:a.sortSelect,value:C,onChange:e=>{const n=e.currentTarget.value;K(n),m(n,v)},children:[t("option",{value:"last_added",children:"Recently Added"}),t("option",{value:"name_asc",children:"Name (A-Z)"}),t("option",{value:"name_desc",children:"Name (Z-A)"})]})})]}),t("div",{className:a.filterContainer,children:[t("div",{className:a.searchBarWrapper,children:[t("div",{className:a.inputIconWrapper,children:[t(p,{name:"search",className:a.searchIcon}),t("input",{className:a.searchInput,placeholder:"Search your watchlist by title...",value:f,onInput:e=>W(e.currentTarget.value),onKeyDown:e=>e.key==="Enter"&&m()})]}),t("div",{className:a.searchActions,children:[t(T,{onClick:()=>m(),className:a.searchBtn,children:"Search"}),t("button",{className:`${a.filterToggleBtn} ${M?a.active:""}`,onClick:()=>Ne(!M),children:[t(p,{name:"filter",size:14}),t("span",{children:"Filters"}),M?t(p,{name:"chevron-up",size:12}):t(p,{name:"chevron-down",size:12})]})]})]}),t("div",{className:`${a.advancedFilters} ${M?a.show:""}`,children:[t("div",{className:a.filterDivider}),t("div",{className:a.filterGrid,children:[t("div",{className:a.filterItem,children:[t("label",{children:"Type"}),t("select",{value:y,onChange:e=>P(e.currentTarget.value),children:vt.map(e=>t("option",{value:e.value,children:e.label},e.value))})]}),t("div",{className:a.filterItem,children:[t("label",{children:"Season"}),t("select",{value:S,onChange:e=>I(e.currentTarget.value),children:ft.map(e=>t("option",{value:e.value,children:e.label},e.value))})]}),t("div",{className:a.filterItem,children:[t("label",{children:"Year"}),t("select",{value:b,onChange:e=>$(e.currentTarget.value),children:Me.map(e=>t("option",{value:e.value,children:e.label},e.value))})]})]}),se.length>0&&t("div",{className:a.genreSection,children:[t("label",{className:a.genreLabel,children:"Genres"}),t("div",{className:a.genreContainer,children:se.map(e=>t("button",{className:`${a.genreButton} ${a[k[e]||""]}`,onClick:()=>De(e),children:e},e))})]}),t("div",{className:a.filterActions,children:[t(T,{variant:"secondary",onClick:Oe,children:"Reset All"}),t(T,{onClick:()=>m(),className:a.applyBtn,children:"Apply Filters"})]})]})]}),t("div",{className:a.resultsHeader,ref:Q,children:[t("h3",{className:a.resultsTitle,children:[i?"Continue Watching":d,t("span",{className:a.itemCount,children:["(",x," items)"]})]}),t("div",{className:a.headerActions,children:[t("button",{className:`${a.manageBtn} ${z?a.active:""}`,onClick:_e,children:[t(p,{name:"pencil-alt",size:13}),t("span",{children:"Bulk Manage"})]}),x>0&&t(be,{page:v,totalPages:pe,canGoNext:he,onChange:oe,isLoading:Y})]})]}),z&&t("div",{className:a.manageBar,children:[t("button",{className:a.selectAllBtn,onClick:Ye,children:[t("span",{className:`${a.selectAllBox} ${te?a.selectAllBoxChecked:""}`,"aria-hidden":"true"}),t("span",{children:te?"Clear Page":"Select All"})]}),t("span",{className:a.manageCount,children:[h.size," selected"]}),t("div",{className:a.manageSpacer}),!i&&t("select",{className:a.manageStatusSelect,value:"",onChange:e=>{e.currentTarget.value&&je(e.currentTarget.value)},disabled:h.size===0,title:"Set status for selected items",children:[t("option",{value:"",children:"Set status…"}),Le.map(e=>t("option",{value:e,children:e},e))]}),t("button",{className:a.manageRemoveBtn,onClick:qe,disabled:h.size===0,children:[t(p,{name:"trash",size:13}),t("span",{children:"Remove Selected"})]})]}),Y?t(ut,{}):re?t(mt,{message:re.message}):t(He,{children:[(y!=="ALL"||S!=="ALL"||b!=="ALL"||Object.keys(k).length>0||f.trim())&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",alignItems:"center",marginBottom:"1.5rem"},children:[t("span",{style:{fontSize:"0.8rem",color:"var(--text-muted)",fontWeight:600},children:"Active Filters:"}),f.trim()&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Search: ",f,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),W(""),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),y!=="ALL"&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Type: ",y,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),P("ALL"),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),S!=="ALL"&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Season: ",S,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),I("ALL"),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),b!=="ALL"&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Year: ",b,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),$("ALL"),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),Object.entries(k).map(([e,n])=>t("span",{className:`badge ${n==="include"?"badge-primary":"badge-danger"}`,style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:[n==="include"?`+ ${e}`:`- ${e}`,t("button",{onClick:s=>{s.stopPropagation(),s.preventDefault(),F(r=>{const o={...r};return delete o[e],o}),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]},e))]}),t("div",{className:`${a.grid} ${Ce?a.lowEnd:""}`,children:X.map(e=>{const n=h.has(e.id);return t("div",{className:`${a.itemWrapper} ${n?a.selected:""}`,children:[z&&t("div",{className:a.selectOverlay,onClick:()=>Ue(e.id),title:n?"Deselect":"Select",children:t("span",{className:a.selectBadge,children:n?t(p,{name:"check",size:12}):null})}),t(dt,{anime:e,continueWatching:i,onRemove:()=>de(e.id,e.name),layout:"vertical"}),!i&&!z&&t("div",{className:a.cardActions,children:[t("select",{className:a.statusSelect,value:e.status,onChange:s=>Ie.mutate({id:e.id,status:s.currentTarget.value}),children:Le.map(s=>t("option",{value:s,children:s},s))}),t("button",{className:a.removeBtn,onClick:()=>de(e.id,e.name),title:"Remove from Watchlist","aria-label":"Remove from Watchlist",children:t(p,{name:"trash",size:12})})]})]},e._id)})})]}),!Y&&X.length===0&&t("div",{className:a.emptyState,children:[t("h3",{className:a.emptyTitle,children:"Your watchlist is looking a bit lonely"}),t("p",{className:a.emptyText,children:d!=="All"||f||y!=="ALL"||S!=="ALL"||b!=="ALL"||Object.keys(k).length>0?"No anime match these filters. Try adjusting them to see more titles.":"Let's find something to watch!"}),t("button",{className:a.emptyBtn,onClick:()=>g("/search"),children:[t(p,{name:"search",size:14}),t("span",{children:"Browse Anime"})]})]}),x>0&&t("div",{className:a.bottomPagination,children:t(be,{page:v,totalPages:pe,canGoNext:he,onChange:oe,isLoading:Y,variant:"labeled"})}),t(ae,{isOpen:!!c,onClose:ue,title:i?"Reset Progress":"Remove from Watchlist",children:[t(ae.Body,{children:[t("p",{children:c?.ids&&c.ids.length>1?i?`Are you sure you want to remove watch progress for ${c.ids.length} items?`:`Are you sure you want to remove ${c.ids.length} items from your watchlist?`:i?`Are you sure you want to remove your watch progress for "${c?.name}"?`:`Are you sure you want to remove "${c?.name}" from your watchlist?`}),i&&t("label",{children:[t("input",{type:"checkbox",checked:V,onChange:e=>D(e.target.checked)}),"Also remove from my watchlist"]}),!i&&!(c?.ids&&c.ids.length>1)&&t("label",{children:[t("input",{type:"checkbox",checked:le,onChange:e=>E(e.target.checked)}),"Remember my choice"]})]}),t(ae.Actions,{children:[t(T,{variant:"secondary",onClick:ue,children:"No"}),t(T,{variant:"danger",onClick:Ee,children:"Yes"})]})]})]})};export{Wt as default};
|
|
1
|
+
import{h as ge,o as Ke,a as Qe,p as Ve,d as u,A as ve,T as R,u as t,S as He}from"./vendor-core-DfaOB3Rn.js";import{u as Ze,a as fe}from"./vendor-query-BBT5_sHx.js";import{h as Je,u as Xe,d as et,v as tt,w as ye,x as Se,z as at,t as nt,k as st,y as lt,A as rt,C as it,D as ct,E as ot,B as T,M as ae}from"./index-GAU-R8jU.js";import{I as p}from"./vendor-icons-DrybRNxP.js";import{A as dt}from"./AnimeCard-Cw_PS4ev.js";import{P as be,S as ut}from"./SkeletonGrid-D98PFdEd.js";import{E as mt}from"./ErrorMessage-DAxegITP.js";import{s as a}from"./Watchlist.module-XGtVQr1d.js";import"./useAnimeInfoData-9eudX-hq.js";import"./QueueOptionsButton-iynUiGDS.js";import"./vendor-ui-3qrARCPr.js";import"./MediaCard-BjnksiL1.js";import"./useIsMobile-Dvx1uJ82.js";const ht=(d,g)=>{const l=new URLSearchParams(g);return l.delete("page"),l.sort(),`${d}|${l.toString()}`},pt=(d,g)=>{const l=new Set(d);return g.forEach(N=>l.add(N)),l},gt=(d,g)=>{const l=new Set(d);return g.forEach(N=>l.delete(N)),l},Ae=["All","Continue Watching","Watching","Completed","On-Hold","Dropped","Planned"],Le=Ae.slice(2),vt=[{value:"ALL",label:"All Types"},{value:"TV",label:"TV Series"},{value:"Movie",label:"Movie"},{value:"OVA",label:"OVA"},{value:"ONA",label:"ONA"},{value:"TV_SHORT",label:"TV Short"},{value:"SPECIAL",label:"Special"},{value:"ADULT",label:"Adult (18+)"}],ft=[{value:"ALL",label:"All Seasons"},{value:"WINTER",label:"Winter"},{value:"SPRING",label:"Spring"},{value:"SUMMER",label:"Summer"},{value:"FALL",label:"Fall"}],Wt=()=>{ge(()=>{document.title="Watchlist - dango"},[]);const{filter:d="All"}=Ke(),g=Qe(),[l,N]=Ve(),q=Ze(),ne=Je(),[v,B]=u(parseInt(l.get("page")||"1")),[f,W]=u(l.get("query")||""),[C,K]=u(l.get("sortBy")||"last_added"),[y,P]=u(l.get("type")||"ALL"),[S,I]=u(l.get("season")||"ALL"),[b,$]=u(l.get("year")||"ALL"),[k,F]=u(()=>{const e={},n=l.get("genres")?.split(",").map(r=>r.trim()).filter(Boolean)||[],s=l.get("excludeGenres")?.split(",").map(r=>r.trim()).filter(Boolean)||[];return n.forEach(r=>r&&(e[r]="include")),s.forEach(r=>r&&(e[r]="exclude")),e}),[M,Ne]=u(()=>["type","season","year","genres","excludeGenres"].some(e=>l.has(e))),{lowEndMode:Ce}=Xe(),{titlePreference:O}=et(),{data:ke}=tt(),se=ke?.genres||[],Q=ve(null),[c,w]=u(null),[V,D]=u(!1),[le,E]=u(!1),[z,we]=u(!1),[h,L]=u(new Set),H=ve(null),i=d==="Continue Watching",G=R(()=>{const e=new URLSearchParams(l);return e.delete("page"),e.set("titlePreference",O),e.toString()},[l,O]),{data:_,isLoading:xe,error:Re}=ye(G,v,14),{data:U,isLoading:Te,error:Be}=Se(d,G,v,14),{data:We}=ye(G,v+1,14),{data:Pe}=Se(d,G,v+1,14),Z=R(()=>(i?_?.data:U?.data)||[],[i,_,U]),x=R(()=>(i?_?.total:U?.total)||0,[i,_,U]),Y=i?xe:Te,re=i?Re:Be,ie=i?We:Pe;ge(()=>{W(l.get("query")||""),K(l.get("sortBy")||"last_added"),P(l.get("type")||"ALL"),I(l.get("season")||"ALL"),$(l.get("year")||"ALL");const e={},n=l.get("genres")?.split(",").map(o=>o.trim()).filter(Boolean)||[],s=l.get("excludeGenres")?.split(",").map(o=>o.trim()).filter(Boolean)||[];n.forEach(o=>o&&(e[o]="include")),s.forEach(o=>o&&(e[o]="exclude")),F(e),B(parseInt(l.get("page")||"1"));const r=ht(d,l);H.current!==null&&H.current!==r&&L(new Set),H.current=r},[l,d]);const Ie=fe({mutationFn:async({id:e,status:n})=>{await nt.watchlist.setStatus.mutate({id:e,status:n})},onSuccess:()=>{q.invalidateQueries({queryKey:["watchlist"]}),at.success("Status updated")}}),$e=fe(ne.continueWatching.remove.mutationOptions({onSuccess:()=>{q.invalidateQueries(ne.continueWatching.pathFilter()),q.invalidateQueries({queryKey:["allContinueWatching"]})}})),J=st(),{data:ce}=lt("skipRemoveConfirmation"),Fe=rt(),X=R(()=>{const e=n=>n[O]||n.name||"";return[...Z].sort((n,s)=>C==="name_asc"?e(n).localeCompare(e(s)):C==="name_desc"?e(s).localeCompare(e(n)):0)},[Z,C,O]),ee=new Date().getFullYear(),Me=[{value:"ALL",label:"All Years"},...Array.from({length:ee-1980+1},(e,n)=>({value:String(ee-n),label:String(ee-n)}))],m=(e=C,n=1)=>{const s=new URLSearchParams;f.trim()&&s.set("query",f.trim()),e!=="last_added"&&s.set("sortBy",e),y!=="ALL"&&s.set("type",y),S!=="ALL"&&s.set("season",S),b!=="ALL"&&s.set("year",b);const r=Object.entries(k).filter(([,A])=>A==="include").map(([A])=>A),o=Object.entries(k).filter(([,A])=>A==="exclude").map(([A])=>A);r.length>0&&s.set("genres",r.join(",")),o.length>0&&s.set("excludeGenres",o.join(",")),n>1&&s.set("page",n.toString()),N(s),n!==v&&B(n)},oe=e=>{if(m(C,e),Q.current){const n=Q.current.getBoundingClientRect().top+window.scrollY-100;window.scrollTo({top:n,behavior:"smooth"})}},Oe=()=>{W(""),K("last_added"),P("ALL"),I("ALL"),$("ALL"),F({}),N(new URLSearchParams),B(1)},De=e=>{F(n=>{const s=n[e],r={...n};return s==="include"?r[e]="exclude":s==="exclude"?delete r[e]:r[e]="include",r})},de=(e,n)=>{if(i){w({id:e,name:n});return}String(ce)==="true"||String(ce)==="1"?J.mutate({id:e}):w({id:e,name:n})},Ee=()=>{if(c){if(c.ids){i?(ze.mutate({ids:c.ids}),V&&me.mutate({ids:c.ids})):me.mutate({ids:c.ids}),L(new Set),w(null),D(!1),E(!1);return}i?($e.mutate({showId:c.id}),V&&J.mutate({id:c.id})):J.mutate({id:c.id}),le&&Fe.mutate({key:"skipRemoveConfirmation",value:!0}),w(null),D(!1),E(!1)}},ue=()=>{w(null),D(!1),E(!1)},me=it(),ze=ct(),Ge=ot(),_e=()=>{we(e=>{const n=!e;return n||L(new Set),n})},Ue=e=>{L(n=>{const s=new Set(n);return s.has(e)?s.delete(e):s.add(e),s})},j=X.map(e=>e.id),te=j.length>0&&j.every(e=>h.has(e)),Ye=()=>{L(te?e=>gt(e,j):e=>pt(e,j))},je=e=>{h.size!==0&&(Ge.mutate({ids:[...h],status:e}),L(new Set))},qe=()=>{h.size!==0&&w({ids:[...h]})},he=Z.length>=14&&ie&&ie.data.length>0,pe=R(()=>Math.max(1,Math.ceil(x/14)),[x]);return t("div",{className:"page-container",children:[t("header",{className:a.header,children:[t("h2",{className:a.title,children:"My Watchlist"}),t("p",{className:a.subtitle,children:"Track and manage your anime collection"})]}),t("div",{className:a.controls,children:[t("div",{className:a.filters,children:Ae.map(e=>t("button",{className:`${a.filterBtn} ${d===e?a.active:""}`,onClick:()=>{const n=new URLSearchParams(l);n.delete("page"),g({pathname:`/watchlist/${e}`,search:n.toString()}),B(1)},children:e},e))}),t("div",{children:t("select",{className:a.sortSelect,value:C,onChange:e=>{const n=e.currentTarget.value;K(n),m(n,v)},children:[t("option",{value:"last_added",children:"Recently Added"}),t("option",{value:"name_asc",children:"Name (A-Z)"}),t("option",{value:"name_desc",children:"Name (Z-A)"})]})})]}),t("div",{className:a.filterContainer,children:[t("div",{className:a.searchBarWrapper,children:[t("div",{className:a.inputIconWrapper,children:[t(p,{name:"search",className:a.searchIcon}),t("input",{className:a.searchInput,placeholder:"Search your watchlist by title...",value:f,onInput:e=>W(e.currentTarget.value),onKeyDown:e=>e.key==="Enter"&&m()})]}),t("div",{className:a.searchActions,children:[t(T,{onClick:()=>m(),className:a.searchBtn,children:"Search"}),t("button",{className:`${a.filterToggleBtn} ${M?a.active:""}`,onClick:()=>Ne(!M),children:[t(p,{name:"filter",size:14}),t("span",{children:"Filters"}),M?t(p,{name:"chevron-up",size:12}):t(p,{name:"chevron-down",size:12})]})]})]}),t("div",{className:`${a.advancedFilters} ${M?a.show:""}`,children:[t("div",{className:a.filterDivider}),t("div",{className:a.filterGrid,children:[t("div",{className:a.filterItem,children:[t("label",{children:"Type"}),t("select",{value:y,onChange:e=>P(e.currentTarget.value),children:vt.map(e=>t("option",{value:e.value,children:e.label},e.value))})]}),t("div",{className:a.filterItem,children:[t("label",{children:"Season"}),t("select",{value:S,onChange:e=>I(e.currentTarget.value),children:ft.map(e=>t("option",{value:e.value,children:e.label},e.value))})]}),t("div",{className:a.filterItem,children:[t("label",{children:"Year"}),t("select",{value:b,onChange:e=>$(e.currentTarget.value),children:Me.map(e=>t("option",{value:e.value,children:e.label},e.value))})]})]}),se.length>0&&t("div",{className:a.genreSection,children:[t("label",{className:a.genreLabel,children:"Genres"}),t("div",{className:a.genreContainer,children:se.map(e=>t("button",{className:`${a.genreButton} ${a[k[e]||""]}`,onClick:()=>De(e),children:e},e))})]}),t("div",{className:a.filterActions,children:[t(T,{variant:"secondary",onClick:Oe,children:"Reset All"}),t(T,{onClick:()=>m(),className:a.applyBtn,children:"Apply Filters"})]})]})]}),t("div",{className:a.resultsHeader,ref:Q,children:[t("h3",{className:a.resultsTitle,children:[i?"Continue Watching":d,t("span",{className:a.itemCount,children:["(",x," items)"]})]}),t("div",{className:a.headerActions,children:[t("button",{className:`${a.manageBtn} ${z?a.active:""}`,onClick:_e,children:[t(p,{name:"pencil-alt",size:13}),t("span",{children:"Bulk Manage"})]}),x>0&&t(be,{page:v,totalPages:pe,canGoNext:he,onChange:oe,isLoading:Y})]})]}),z&&t("div",{className:a.manageBar,children:[t("button",{className:a.selectAllBtn,onClick:Ye,children:[t("span",{className:`${a.selectAllBox} ${te?a.selectAllBoxChecked:""}`,"aria-hidden":"true"}),t("span",{children:te?"Clear Page":"Select All"})]}),t("span",{className:a.manageCount,children:[h.size," selected"]}),t("div",{className:a.manageSpacer}),!i&&t("select",{className:a.manageStatusSelect,value:"",onChange:e=>{e.currentTarget.value&&je(e.currentTarget.value)},disabled:h.size===0,title:"Set status for selected items",children:[t("option",{value:"",children:"Set status…"}),Le.map(e=>t("option",{value:e,children:e},e))]}),t("button",{className:a.manageRemoveBtn,onClick:qe,disabled:h.size===0,children:[t(p,{name:"trash",size:13}),t("span",{children:"Remove Selected"})]})]}),Y?t(ut,{}):re?t(mt,{message:re.message}):t(He,{children:[(y!=="ALL"||S!=="ALL"||b!=="ALL"||Object.keys(k).length>0||f.trim())&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",alignItems:"center",marginBottom:"1.5rem"},children:[t("span",{style:{fontSize:"0.8rem",color:"var(--text-muted)",fontWeight:600},children:"Active Filters:"}),f.trim()&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Search: ",f,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),W(""),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),y!=="ALL"&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Type: ",y,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),P("ALL"),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),S!=="ALL"&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Season: ",S,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),I("ALL"),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),b!=="ALL"&&t("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Year: ",b,t("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),$("ALL"),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),Object.entries(k).map(([e,n])=>t("span",{className:`badge ${n==="include"?"badge-primary":"badge-danger"}`,style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:[n==="include"?`+ ${e}`:`- ${e}`,t("button",{onClick:s=>{s.stopPropagation(),s.preventDefault(),F(r=>{const o={...r};return delete o[e],o}),m()},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]},e))]}),t("div",{className:`${a.grid} ${Ce?a.lowEnd:""}`,children:X.map(e=>{const n=h.has(e.id);return t("div",{className:`${a.itemWrapper} ${n?a.selected:""}`,children:[z&&t("div",{className:a.selectOverlay,onClick:()=>Ue(e.id),title:n?"Deselect":"Select",children:t("span",{className:a.selectBadge,children:n?t(p,{name:"check",size:12}):null})}),t(dt,{anime:e,continueWatching:i,onRemove:()=>de(e.id,e.name),layout:"vertical"}),!i&&!z&&t("div",{className:a.cardActions,children:[t("select",{className:a.statusSelect,value:e.status,onChange:s=>Ie.mutate({id:e.id,status:s.currentTarget.value}),children:Le.map(s=>t("option",{value:s,children:s},s))}),t("button",{className:a.removeBtn,onClick:()=>de(e.id,e.name),title:"Remove from Watchlist","aria-label":"Remove from Watchlist",children:t(p,{name:"trash",size:12})})]})]},e._id)})})]}),!Y&&X.length===0&&t("div",{className:a.emptyState,children:[t("h3",{className:a.emptyTitle,children:"Your watchlist is looking a bit lonely"}),t("p",{className:a.emptyText,children:d!=="All"||f||y!=="ALL"||S!=="ALL"||b!=="ALL"||Object.keys(k).length>0?"No anime match these filters. Try adjusting them to see more titles.":"Let's find something to watch!"}),t("button",{className:a.emptyBtn,onClick:()=>g("/search"),children:[t(p,{name:"search",size:14}),t("span",{children:"Browse Anime"})]})]}),x>0&&t("div",{className:a.bottomPagination,children:t(be,{page:v,totalPages:pe,canGoNext:he,onChange:oe,isLoading:Y,variant:"labeled"})}),t(ae,{isOpen:!!c,onClose:ue,title:i?"Reset Progress":"Remove from Watchlist",children:[t(ae.Body,{children:[t("p",{children:c?.ids&&c.ids.length>1?i?`Are you sure you want to remove watch progress for ${c.ids.length} items?`:`Are you sure you want to remove ${c.ids.length} items from your watchlist?`:i?`Are you sure you want to remove your watch progress for "${c?.name}"?`:`Are you sure you want to remove "${c?.name}" from your watchlist?`}),i&&t("label",{children:[t("input",{type:"checkbox",checked:V,onChange:e=>D(e.target.checked)}),"Also remove from my watchlist"]}),!i&&!(c?.ids&&c.ids.length>1)&&t("label",{children:[t("input",{type:"checkbox",checked:le,onChange:e=>E(e.target.checked)}),"Remember my choice"]})]}),t(ae.Actions,{children:[t(T,{variant:"secondary",onClick:ue,children:"No"}),t(T,{variant:"danger",onClick:Ee,children:"Yes"})]})]})]})};export{Wt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as n}from"./index-
|
|
1
|
+
import{_ as n}from"./index-GAU-R8jU.js";let a=null,e=null;async function r(){return a||(e||(e=n(()=>import("./hls-BOLXTnjL.js"),[]).then(l=>(a=l.default,a)).catch(()=>null)),e)}function c(l){return l.canPlayType("application/vnd.apple.mpegurl")!==""||l.canPlayType("application/x-mpegURL")!==""}export{c,r as l};
|