@serifpersia/dango 3.5.4 → 3.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +1 -1
  2. package/client/dist/assets/{AnimeCard-Cw_PS4ev.js → AnimeCard-DL4pRPH6.js} +1 -1
  3. package/client/dist/assets/{AnimeInfo-C_a0TTXe.js → AnimeInfo-CLewxbSs.js} +1 -1
  4. package/client/dist/assets/{AnimeInfoPage-BB2RY_yn.js → AnimeInfoPage-BikMjWpN.js} +2 -2
  5. package/client/dist/assets/{Asmr-oc1NaBzW.js → Asmr-BrmjfXIH.js} +1 -1
  6. package/client/dist/assets/{AsmrResetProgressModal-cYbhZUTn.js → AsmrResetProgressModal-DpzeJ2Rr.js} +1 -1
  7. package/client/dist/assets/{AvSyncCalibrator-DyT8IH_y.js → AvSyncCalibrator-DJAEqz-M.js} +1 -1
  8. package/client/dist/assets/{Home-D3BVXJ5-.js → Home-CilHItyY.js} +1 -1
  9. package/client/dist/assets/{Insights-BmBDfdDO.js → Insights-s8DVFPrC.js} +1 -1
  10. package/client/dist/assets/{LibraryListPage-C463kkiG.js → LibraryListPage-D_MD0Lhp.js} +1 -1
  11. package/client/dist/assets/{ListeningList--EcSwlrV.js → ListeningList-C4a0Ol9h.js} +1 -1
  12. package/client/dist/assets/{Manga-BhOs1yu_.js → Manga-CQoL5WSO.js} +1 -1
  13. package/client/dist/assets/{MangaInfoPage-BP-kWQoG.js → MangaInfoPage-DfeBy1k9.js} +1 -1
  14. package/client/dist/assets/{MangaReadPage-CWCo81Qx.js → MangaReadPage-Dv_xXU-Z.js} +1 -1
  15. package/client/dist/assets/{MangaResetProgressModal-DZGo5ZOV.js → MangaResetProgressModal-B5I9WY5s.js} +1 -1
  16. package/client/dist/assets/{Mature-2wFvZ1Ix.js → Mature-Bq6ALnj_.js} +1 -1
  17. package/client/dist/assets/{MediaCard-BjnksiL1.js → MediaCard-C6sSx_z5.js} +1 -1
  18. package/client/dist/assets/{Music-Bkz_ZyA4.js → Music-TZrbVAdg.js} +1 -1
  19. package/client/dist/assets/{OptionListMenu-DIEBUA77.js → OptionListMenu-DxXGdXOU.js} +1 -1
  20. package/client/dist/assets/{Player-BX_Skj8G.js → Player-D0mA2vaS.js} +2 -2
  21. package/client/dist/assets/{PlayerSettings-B5ebT96a.js → PlayerSettings-Ch7dW6WE.js} +1 -1
  22. package/client/dist/assets/{QueueOptionsButton-iynUiGDS.js → QueueOptionsButton-BZ5BUytu.js} +1 -1
  23. package/client/dist/assets/{QueueRail-D2RYa8Lf.js → QueueRail-C6IHy4CH.js} +1 -1
  24. package/client/dist/assets/{Radio-DuFCL4ru.js → Radio-CnEWiyV2.js} +1 -1
  25. package/client/dist/assets/{ReadingList-CTOkZdFF.js → ReadingList-Dz9vI26P.js} +1 -1
  26. package/client/dist/assets/{ResetProgressModal-Cjzd8-mT.js → ResetProgressModal-C7FNcb2X.js} +1 -1
  27. package/client/dist/assets/{Search-CY6kxAYD.js → Search-Cdw5UVEX.js} +1 -1
  28. package/client/dist/assets/{Settings-B2cCZBVq.js → Settings-BCAkVsGp.js} +1 -1
  29. package/client/dist/assets/{SkeletonGrid-D98PFdEd.js → SkeletonGrid-B3Pkkwtb.js} +1 -1
  30. package/client/dist/assets/{Trackers-CE2fejJC.js → Trackers-ukVLEBtx.js} +1 -1
  31. package/client/dist/assets/Tv-CpWQUSuu.js +4 -0
  32. package/client/dist/assets/{TvInfo-Dg_hN9lr.js → TvInfo-CSRGklYN.js} +1 -1
  33. package/client/dist/assets/{TvPopup-CuR-CXOg.js → TvPopup-DNQkT6qy.js} +1 -1
  34. package/client/dist/assets/{TvSearch-DertJ9Je.js → TvSearch-ZG7Q3kMG.js} +1 -1
  35. package/client/dist/assets/{TvWatchlist-DAp6XFbP.js → TvWatchlist-DnJfwYv0.js} +1 -1
  36. package/client/dist/assets/{Watchlist-C5eiD8Nw.js → Watchlist-DN8VKfef.js} +1 -1
  37. package/client/dist/assets/{hls-s6kEkfvo.js → hls-BIOzsLUy.js} +1 -1
  38. package/client/dist/assets/{index-GAU-R8jU.js → index-D46PzcOL.js} +2 -2
  39. package/client/dist/assets/{useAnimeInfoData-9eudX-hq.js → useAnimeInfoData-BF4WF2s4.js} +1 -1
  40. package/client/dist/assets/{useAsmr-Dj8QioSc.js → useAsmr-C2ttSbxb.js} +1 -1
  41. package/client/dist/assets/{useAsmrPopup-QhQCU1HG.js → useAsmrPopup-CZ6UNRJH.js} +1 -1
  42. package/client/dist/assets/{useMangaLibrary-B6HQI4jU.js → useMangaLibrary-ChwDhlyo.js} +1 -1
  43. package/client/dist/assets/{useMangaPopup-BC8Mg08o.js → useMangaPopup-Zxm1nSmS.js} +1 -1
  44. package/client/dist/assets/{useProviders-DoJoJR_4.js → useProviders-CguDlK81.js} +1 -1
  45. package/client/dist/assets/{useTv-C0AAHhYE.js → useTv-HLJmTVvH.js} +1 -1
  46. package/client/dist/assets/{useTvLibrary-B1csgiZ_.js → useTvLibrary-340c9BPM.js} +1 -1
  47. package/client/dist/index.html +1 -1
  48. package/package.json +2 -2
  49. package/server/package.json +1 -1
  50. package/client/dist/assets/Tv-BrwGG26Z.js +0 -4
@@ -1,2 +1,2 @@
1
- import{d as t,h as Re,g as Be,A as De,q as $e,u as e,S as d}from"./vendor-core-DfaOB3Rn.js";import{u as qe,b as Fe,a as I}from"./vendor-query-BBT5_sHx.js";import{z as i,t as h,W as nn,j as an,B as le}from"./index-GAU-R8jU.js";import{I as l}from"./vendor-icons-DrybRNxP.js";function tn(){const K=qe(),[Y,k]=t(!1);return Re(()=>{const s=new URLSearchParams(window.location.search),b=s.get("anilist");if(b){const m=s.get("user"),_=s.get("reason");window.history.replaceState(null,"",window.location.pathname),b==="success"?(i.success(m?`Connected to AniList as ${decodeURIComponent(m)}`:"Connected to AniList"),K.invalidateQueries({queryKey:["trackerStatus"]})):i.error(_?decodeURIComponent(_):"AniList authentication failed");return}const j=new URLSearchParams(window.location.hash.substring(1)),y=j.get("access_token"),x=s.get("code");if(!y&&!x){const m=j.get("error");m&&(i.error(`AniList error: ${m}`),window.history.replaceState(null,"",window.location.pathname));return}const g=window.location.origin+window.location.pathname;window.history.replaceState(null,"",window.location.pathname),k(!0),i("Connecting to AniList..."),h.tracker.anilistAuth.mutate(y?{token:y}:{code:x,redirectUri:g}).then(async m=>{const _=m.user;i.success(`Connected to AniList as ${_?.name??"AniList user"}`),K.invalidateQueries({queryKey:["trackerStatus"]})}).catch(m=>{i.error(m instanceof Error?m.message:"Failed to authenticate with AniList")}).finally(()=>{k(!1)})},[K]),Y}const sn="_header_j1lbh_1",rn="_fadeIn_j1lbh_1",ln="_pageTitle_j1lbh_6",on="_pageSubtitle_j1lbh_14",cn="_importCard_j1lbh_20",dn="_slideUpIn_j1lbh_1",mn="_cardHeader_j1lbh_37",pn="_uploadArea_j1lbh_55",hn="_fileInputWrapper_j1lbh_59",un="_fileInput_j1lbh_59",gn="_fileDisplay_j1lbh_87",yn="_fileIcon_j1lbh_95",bn="_fileName_j1lbh_100",_n="_browseButton_j1lbh_109",fn="_optionsArea_j1lbh_120",Nn="_checkboxLabel_j1lbh_128",kn="_checkbox_j1lbh_128",wn="_checkboxCustom_j1lbh_141",vn="_optionText_j1lbh_169",In="_optionTitle_j1lbh_175",xn="_optionDesc_j1lbh_181",Mn="_actions_j1lbh_187",Cn="_importBtn_j1lbh_195",Ln="_cancelBtn_j1lbh_201",Sn="_statusMessage_j1lbh_215",Tn="_success_j1lbh_225",An="_error_j1lbh_231",jn="_progressSection_j1lbh_237",Pn="_progressBar_j1lbh_242",En="_progressFill_j1lbh_250",Bn="_progressInfo_j1lbh_257",Dn="_progressCount_j1lbh_264",$n="_progressTitle_j1lbh_271",Fn="_sourceBadge_j1lbh_289",Un="_anilist_j1lbh_301",Rn="_kitsu_j1lbh_307",qn="_offline_j1lbh_313",Kn="_skipped_j1lbh_319",On="_cardTitleRow_j1lbh_324",Qn="_anilistIcon_j1lbh_334",Gn="_malIcon_j1lbh_340",Hn="_badgeOnline_j1lbh_346",Wn="_badgeOffline_j1lbh_358",zn="_connectedProfile_j1lbh_370",Xn="_avatar_j1lbh_379",Jn="_connectedInfo_j1lbh_386",Yn="_connectedName_j1lbh_394",Vn="_connectedHint_j1lbh_400",Zn="_loginPrompt_j1lbh_405",ea="_loginSection_j1lbh_413",na="_fieldLabel_j1lbh_419",aa="_helpText_j1lbh_438",ta="_loginText_j1lbh_455",sa="_primaryBtn_j1lbh_464",ia="_secondaryBtn_j1lbh_465",ra="_syncBtn_j1lbh_466",la="_divider_j1lbh_518",oa="_actionSection_j1lbh_524",ca="_inputGroup_j1lbh_538",da="_input_j1lbh_538",ma="_syncSummary_j1lbh_559",pa="_syncErrors_j1lbh_565",ha="_spin_j1lbh_569",ua="_radioGroup_j1lbh_598",ga="_radioLabel_j1lbh_604",ya="_syncHint_j1lbh_642",ba="_importLoading_j1lbh_649",n={header:sn,fadeIn:rn,pageTitle:ln,pageSubtitle:on,importCard:cn,slideUpIn:dn,cardHeader:mn,uploadArea:pn,fileInputWrapper:hn,fileInput:un,fileDisplay:gn,fileIcon:yn,fileName:bn,browseButton:_n,optionsArea:fn,checkboxLabel:Nn,checkbox:kn,checkboxCustom:wn,optionText:vn,optionTitle:In,optionDesc:xn,actions:Mn,importBtn:Cn,cancelBtn:Ln,statusMessage:Sn,success:Tn,error:An,progressSection:jn,progressBar:Pn,progressFill:En,progressInfo:Bn,progressCount:Dn,progressTitle:$n,sourceBadge:Fn,anilist:Un,kitsu:Rn,offline:qn,skipped:Kn,cardTitleRow:On,anilistIcon:Qn,malIcon:Gn,badgeOnline:Hn,badgeOffline:Wn,connectedProfile:zn,avatar:Xn,connectedInfo:Jn,connectedName:Yn,connectedHint:Vn,loginPrompt:Zn,loginSection:ea,fieldLabel:na,helpText:aa,loginText:ta,primaryBtn:sa,secondaryBtn:ia,syncBtn:ra,divider:la,actionSection:oa,inputGroup:ca,input:da,syncSummary:ma,syncErrors:pa,spin:ha,radioGroup:ua,radioLabel:ga,syncHint:ya,importLoading:ba},oe="tracker_anilist_client_id",Ue="49887".trim(),wa=()=>{const{setIsOpen:K}=nn(),{contentType:Y}=an(),k=Y==="manga",s=qe();Be.useEffect(()=>{document.title="Trackers - dango"},[]);const[b,j]=t(""),[y,x]=t("username"),[g,m]=t(null),[_,ce]=t(""),[M,de]=t(!1),Ke=tn(),{data:me,isLoading:pe}=Fe({queryKey:["trackerStatus"],queryFn:async()=>await h.tracker.status.query()}),{data:C}=Fe({queryKey:["anilistClientId"],queryFn:async()=>(await h.settings.getByKey.query({key:oe})).value||""}),he=De(!1);Be.useEffect(()=>{he.current||C!==void 0&&(C&&ce(C),he.current=!0)},[C]);const w=me?.anilist?.connected??!1;Re(()=>{w&&x("sync")},[w]);const O=me?.anilist?.user??null,V=!!Ue,Oe=(C||"").trim(),Qe=async()=>{const a=_.trim(),r=a||Ue;if(!r){i.error("Enter your AniList client ID first");return}const N=async(A,se)=>{await h.settings.set.mutate({key:A,value:se})};try{a?a!==C&&await N(oe,a):V&&Oe&&await N(oe,""),s.invalidateQueries({queryKey:["anilistClientId"]})}catch(A){i.error(A.message);return}const o=window.location.origin+window.location.pathname,U=encodeURIComponent(o);window.location.href=`https://anilist.co/api/v2/oauth/authorize?client_id=${encodeURIComponent(r)}&response_type=token&state=${U}`},ue=I({mutationFn:async()=>h.tracker.anilistDisconnect.mutate(),onSuccess:()=>{s.invalidateQueries({queryKey:["trackerStatus"]}),i.success("Disconnected from AniList")},onError:a=>i.error(a.message)}),Q=I({mutationFn:async()=>(await h.tracker.sync.mutate({provider:"anilist"})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),m(a),i.success(`Sync complete — pushed ${a.pushed}, pulled ${a.pulled}, merged ${a.merged}, unchanged ${a.unchanged}`,{duration:6e3})},onError:a=>i.error(a.message)}),[P,ge]=t(""),[G,ye]=t("sync"),[Z,be]=t("two-way"),[c,Ge]=t(null),H=I({mutationFn:async()=>(await h.tracker.mangaSync.mutate({direction:Z})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),Ge(a);const r=(a.warnings?.length??0)>0?`, ${a.warnings.length} warning(s)`:"";i.success(`Manga sync complete — pushed ${a.pushed}, pulled ${a.pulled}, merged ${a.merged}, unchanged ${a.unchanged}${r}`,{duration:6e3})},onError:a=>i.error(a.message)}),L=I({mutationFn:async()=>{if(!P.trim())throw new Error("Please enter a username");return(await h.tracker.mangaImport.mutate({username:P.trim(),erase:M})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),i.success(`Imported ${a} manga entries from AniList`),ge("")},onError:a=>i.error(a.message)}),[E,_e]=t(""),[W,fe]=t("username"),[ee,Ne]=t(null),[z,ke]=t(!1),[we,ne]=t(""),[ve,He]=t(""),f=I({mutationFn:async()=>{if(!E.trim())throw new Error("Please enter a MAL username");const a=await h.tracker.mangaMalImport.mutate({username:E.trim(),erase:M});return{imported:a.imported??0,skipped:a.skipped??0}},onSuccess:({imported:a,skipped:r})=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),i.success(`Imported ${a} manga entries from MAL${r>0?`, skipped ${r}`:""}`),_e("")},onError:a=>i.error(a.message)}),We=$e(async()=>{const a=document.getElementById("malMangaFile");if(!a.files||a.files.length===0){ne("Please select a file first.");return}ke(!0),ne(""),Ne(null);try{const r=new FormData;r.append("xmlfile",a.files[0]),r.append("erase",String(M));const N=await fetch("/api/import/mal-xml-manga",{method:"POST",body:r}),o=await N.json().catch(()=>({}));if(!N.ok)throw new Error(o.error||"Import failed");Ne({imported:o.imported??0,skipped:o.skipped??0}),s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]})}catch(r){ne(r.message)}finally{ke(!1)}},[M,s]),S=I({mutationFn:async()=>{if(!b.trim())throw new Error("Please enter a username");return(await h.tracker.anilistImport.mutate({username:b.trim(),erase:v})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),i.success(`Imported ${a} anime entries from AniList`),j("")},onError:a=>i.error(a.message)}),[B,Ie]=t(""),u=I({mutationFn:async a=>{if(!B.trim())throw new Error("Please enter a MAL username");return(await h.tracker.malImport.mutate({username:B.trim(),erase:a.erase,useOfflineDb:a.useOfflineDb,skipFallback:a.skipFallback})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),i.success(`Imported ${a} anime entries from MAL`),Ie("")},onError:a=>i.error(a.message)}),[v,xe]=t(!1),[D,ze]=t(!0),[$,Xe]=t(!1),[Me,Ce]=t(""),[T,Le]=t(!1),[p,Se]=t(null),[ae,Te]=t(null),[Ae,X]=t(""),te=De(null),Je=a=>{a.target.files&&a.target.files.length>0?Ce(a.target.files[0].name):Ce("")},Ye=$e(async()=>{const a=document.getElementById("malFile");if(!a.files||a.files.length===0){X("Please select a file first.");return}const r=a.files[0];Le(!0),Se(null),Te(null),X("");const N=new AbortController;te.current=N;try{const o=new FormData;o.append("xmlfile",r),o.append("erase",String(v)),o.append("useOfflineDb",String(D)),o.append("skipFallback",String($));const U=await fetch("/api/import/mal-xml",{method:"POST",body:o,signal:N.signal});if(!U.ok){const re=await U.text();let R="Failed to import";try{R=JSON.parse(re).error||R}catch{}throw new Error(R)}const A=U.body?.getReader();if(!A)throw new Error("No response stream");const se=new TextDecoder;let ie="",J="";for(;;){const{done:re,value:R}=await A.read();if(re)break;ie+=se.decode(R,{stream:!0});const Pe=ie.split(`
1
+ import{d as t,h as Re,g as Be,A as De,q as $e,u as e,S as d}from"./vendor-core-DfaOB3Rn.js";import{u as qe,b as Fe,a as I}from"./vendor-query-BBT5_sHx.js";import{z as i,t as h,W as nn,j as an,B as le}from"./index-D46PzcOL.js";import{I as l}from"./vendor-icons-DrybRNxP.js";function tn(){const K=qe(),[Y,k]=t(!1);return Re(()=>{const s=new URLSearchParams(window.location.search),b=s.get("anilist");if(b){const m=s.get("user"),_=s.get("reason");window.history.replaceState(null,"",window.location.pathname),b==="success"?(i.success(m?`Connected to AniList as ${decodeURIComponent(m)}`:"Connected to AniList"),K.invalidateQueries({queryKey:["trackerStatus"]})):i.error(_?decodeURIComponent(_):"AniList authentication failed");return}const j=new URLSearchParams(window.location.hash.substring(1)),y=j.get("access_token"),x=s.get("code");if(!y&&!x){const m=j.get("error");m&&(i.error(`AniList error: ${m}`),window.history.replaceState(null,"",window.location.pathname));return}const g=window.location.origin+window.location.pathname;window.history.replaceState(null,"",window.location.pathname),k(!0),i("Connecting to AniList..."),h.tracker.anilistAuth.mutate(y?{token:y}:{code:x,redirectUri:g}).then(async m=>{const _=m.user;i.success(`Connected to AniList as ${_?.name??"AniList user"}`),K.invalidateQueries({queryKey:["trackerStatus"]})}).catch(m=>{i.error(m instanceof Error?m.message:"Failed to authenticate with AniList")}).finally(()=>{k(!1)})},[K]),Y}const sn="_header_j1lbh_1",rn="_fadeIn_j1lbh_1",ln="_pageTitle_j1lbh_6",on="_pageSubtitle_j1lbh_14",cn="_importCard_j1lbh_20",dn="_slideUpIn_j1lbh_1",mn="_cardHeader_j1lbh_37",pn="_uploadArea_j1lbh_55",hn="_fileInputWrapper_j1lbh_59",un="_fileInput_j1lbh_59",gn="_fileDisplay_j1lbh_87",yn="_fileIcon_j1lbh_95",bn="_fileName_j1lbh_100",_n="_browseButton_j1lbh_109",fn="_optionsArea_j1lbh_120",Nn="_checkboxLabel_j1lbh_128",kn="_checkbox_j1lbh_128",wn="_checkboxCustom_j1lbh_141",vn="_optionText_j1lbh_169",In="_optionTitle_j1lbh_175",xn="_optionDesc_j1lbh_181",Mn="_actions_j1lbh_187",Cn="_importBtn_j1lbh_195",Ln="_cancelBtn_j1lbh_201",Sn="_statusMessage_j1lbh_215",Tn="_success_j1lbh_225",An="_error_j1lbh_231",jn="_progressSection_j1lbh_237",Pn="_progressBar_j1lbh_242",En="_progressFill_j1lbh_250",Bn="_progressInfo_j1lbh_257",Dn="_progressCount_j1lbh_264",$n="_progressTitle_j1lbh_271",Fn="_sourceBadge_j1lbh_289",Un="_anilist_j1lbh_301",Rn="_kitsu_j1lbh_307",qn="_offline_j1lbh_313",Kn="_skipped_j1lbh_319",On="_cardTitleRow_j1lbh_324",Qn="_anilistIcon_j1lbh_334",Gn="_malIcon_j1lbh_340",Hn="_badgeOnline_j1lbh_346",Wn="_badgeOffline_j1lbh_358",zn="_connectedProfile_j1lbh_370",Xn="_avatar_j1lbh_379",Jn="_connectedInfo_j1lbh_386",Yn="_connectedName_j1lbh_394",Vn="_connectedHint_j1lbh_400",Zn="_loginPrompt_j1lbh_405",ea="_loginSection_j1lbh_413",na="_fieldLabel_j1lbh_419",aa="_helpText_j1lbh_438",ta="_loginText_j1lbh_455",sa="_primaryBtn_j1lbh_464",ia="_secondaryBtn_j1lbh_465",ra="_syncBtn_j1lbh_466",la="_divider_j1lbh_518",oa="_actionSection_j1lbh_524",ca="_inputGroup_j1lbh_538",da="_input_j1lbh_538",ma="_syncSummary_j1lbh_559",pa="_syncErrors_j1lbh_565",ha="_spin_j1lbh_569",ua="_radioGroup_j1lbh_598",ga="_radioLabel_j1lbh_604",ya="_syncHint_j1lbh_642",ba="_importLoading_j1lbh_649",n={header:sn,fadeIn:rn,pageTitle:ln,pageSubtitle:on,importCard:cn,slideUpIn:dn,cardHeader:mn,uploadArea:pn,fileInputWrapper:hn,fileInput:un,fileDisplay:gn,fileIcon:yn,fileName:bn,browseButton:_n,optionsArea:fn,checkboxLabel:Nn,checkbox:kn,checkboxCustom:wn,optionText:vn,optionTitle:In,optionDesc:xn,actions:Mn,importBtn:Cn,cancelBtn:Ln,statusMessage:Sn,success:Tn,error:An,progressSection:jn,progressBar:Pn,progressFill:En,progressInfo:Bn,progressCount:Dn,progressTitle:$n,sourceBadge:Fn,anilist:Un,kitsu:Rn,offline:qn,skipped:Kn,cardTitleRow:On,anilistIcon:Qn,malIcon:Gn,badgeOnline:Hn,badgeOffline:Wn,connectedProfile:zn,avatar:Xn,connectedInfo:Jn,connectedName:Yn,connectedHint:Vn,loginPrompt:Zn,loginSection:ea,fieldLabel:na,helpText:aa,loginText:ta,primaryBtn:sa,secondaryBtn:ia,syncBtn:ra,divider:la,actionSection:oa,inputGroup:ca,input:da,syncSummary:ma,syncErrors:pa,spin:ha,radioGroup:ua,radioLabel:ga,syncHint:ya,importLoading:ba},oe="tracker_anilist_client_id",Ue="49887".trim(),wa=()=>{const{setIsOpen:K}=nn(),{contentType:Y}=an(),k=Y==="manga",s=qe();Be.useEffect(()=>{document.title="Trackers - dango"},[]);const[b,j]=t(""),[y,x]=t("username"),[g,m]=t(null),[_,ce]=t(""),[M,de]=t(!1),Ke=tn(),{data:me,isLoading:pe}=Fe({queryKey:["trackerStatus"],queryFn:async()=>await h.tracker.status.query()}),{data:C}=Fe({queryKey:["anilistClientId"],queryFn:async()=>(await h.settings.getByKey.query({key:oe})).value||""}),he=De(!1);Be.useEffect(()=>{he.current||C!==void 0&&(C&&ce(C),he.current=!0)},[C]);const w=me?.anilist?.connected??!1;Re(()=>{w&&x("sync")},[w]);const O=me?.anilist?.user??null,V=!!Ue,Oe=(C||"").trim(),Qe=async()=>{const a=_.trim(),r=a||Ue;if(!r){i.error("Enter your AniList client ID first");return}const N=async(A,se)=>{await h.settings.set.mutate({key:A,value:se})};try{a?a!==C&&await N(oe,a):V&&Oe&&await N(oe,""),s.invalidateQueries({queryKey:["anilistClientId"]})}catch(A){i.error(A.message);return}const o=window.location.origin+window.location.pathname,U=encodeURIComponent(o);window.location.href=`https://anilist.co/api/v2/oauth/authorize?client_id=${encodeURIComponent(r)}&response_type=token&state=${U}`},ue=I({mutationFn:async()=>h.tracker.anilistDisconnect.mutate(),onSuccess:()=>{s.invalidateQueries({queryKey:["trackerStatus"]}),i.success("Disconnected from AniList")},onError:a=>i.error(a.message)}),Q=I({mutationFn:async()=>(await h.tracker.sync.mutate({provider:"anilist"})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),m(a),i.success(`Sync complete — pushed ${a.pushed}, pulled ${a.pulled}, merged ${a.merged}, unchanged ${a.unchanged}`,{duration:6e3})},onError:a=>i.error(a.message)}),[P,ge]=t(""),[G,ye]=t("sync"),[Z,be]=t("two-way"),[c,Ge]=t(null),H=I({mutationFn:async()=>(await h.tracker.mangaSync.mutate({direction:Z})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),Ge(a);const r=(a.warnings?.length??0)>0?`, ${a.warnings.length} warning(s)`:"";i.success(`Manga sync complete — pushed ${a.pushed}, pulled ${a.pulled}, merged ${a.merged}, unchanged ${a.unchanged}${r}`,{duration:6e3})},onError:a=>i.error(a.message)}),L=I({mutationFn:async()=>{if(!P.trim())throw new Error("Please enter a username");return(await h.tracker.mangaImport.mutate({username:P.trim(),erase:M})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),i.success(`Imported ${a} manga entries from AniList`),ge("")},onError:a=>i.error(a.message)}),[E,_e]=t(""),[W,fe]=t("username"),[ee,Ne]=t(null),[z,ke]=t(!1),[we,ne]=t(""),[ve,He]=t(""),f=I({mutationFn:async()=>{if(!E.trim())throw new Error("Please enter a MAL username");const a=await h.tracker.mangaMalImport.mutate({username:E.trim(),erase:M});return{imported:a.imported??0,skipped:a.skipped??0}},onSuccess:({imported:a,skipped:r})=>{s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]}),i.success(`Imported ${a} manga entries from MAL${r>0?`, skipped ${r}`:""}`),_e("")},onError:a=>i.error(a.message)}),We=$e(async()=>{const a=document.getElementById("malMangaFile");if(!a.files||a.files.length===0){ne("Please select a file first.");return}ke(!0),ne(""),Ne(null);try{const r=new FormData;r.append("xmlfile",a.files[0]),r.append("erase",String(M));const N=await fetch("/api/import/mal-xml-manga",{method:"POST",body:r}),o=await N.json().catch(()=>({}));if(!N.ok)throw new Error(o.error||"Import failed");Ne({imported:o.imported??0,skipped:o.skipped??0}),s.invalidateQueries({queryKey:["manga-library"]}),s.invalidateQueries({queryKey:["manga-continue-reading"]})}catch(r){ne(r.message)}finally{ke(!1)}},[M,s]),S=I({mutationFn:async()=>{if(!b.trim())throw new Error("Please enter a username");return(await h.tracker.anilistImport.mutate({username:b.trim(),erase:v})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),i.success(`Imported ${a} anime entries from AniList`),j("")},onError:a=>i.error(a.message)}),[B,Ie]=t(""),u=I({mutationFn:async a=>{if(!B.trim())throw new Error("Please enter a MAL username");return(await h.tracker.malImport.mutate({username:B.trim(),erase:a.erase,useOfflineDb:a.useOfflineDb,skipFallback:a.skipFallback})).count},onSuccess:a=>{s.invalidateQueries({queryKey:["watchlist"]}),s.invalidateQueries({queryKey:["allContinueWatching"]}),i.success(`Imported ${a} anime entries from MAL`),Ie("")},onError:a=>i.error(a.message)}),[v,xe]=t(!1),[D,ze]=t(!0),[$,Xe]=t(!1),[Me,Ce]=t(""),[T,Le]=t(!1),[p,Se]=t(null),[ae,Te]=t(null),[Ae,X]=t(""),te=De(null),Je=a=>{a.target.files&&a.target.files.length>0?Ce(a.target.files[0].name):Ce("")},Ye=$e(async()=>{const a=document.getElementById("malFile");if(!a.files||a.files.length===0){X("Please select a file first.");return}const r=a.files[0];Le(!0),Se(null),Te(null),X("");const N=new AbortController;te.current=N;try{const o=new FormData;o.append("xmlfile",r),o.append("erase",String(v)),o.append("useOfflineDb",String(D)),o.append("skipFallback",String($));const U=await fetch("/api/import/mal-xml",{method:"POST",body:o,signal:N.signal});if(!U.ok){const re=await U.text();let R="Failed to import";try{R=JSON.parse(re).error||R}catch{}throw new Error(R)}const A=U.body?.getReader();if(!A)throw new Error("No response stream");const se=new TextDecoder;let ie="",J="";for(;;){const{done:re,value:R}=await A.read();if(re)break;ie+=se.decode(R,{stream:!0});const Pe=ie.split(`
2
2
  `);ie=Pe.pop()||"";for(const q of Pe)if(q.startsWith("event: "))J=q.slice(7).trim();else if(q.startsWith("data: ")){const en=q.slice(6);try{const Ee=JSON.parse(en);J==="progress"?Se(Ee):J==="complete"&&Te(Ee)}catch{}}else q===""&&(J="")}s.invalidateQueries({queryKey:["watchlist"]})}catch(o){o instanceof DOMException&&o.name==="AbortError"?X("Import cancelled."):X(o.message)}finally{Le(!1),te.current=null}},[v,D,$,s]),Ve=()=>{te.current?.abort(),h.settings.malImportCancel.mutate().catch(()=>{})},Ze=p?Math.round(p.current/p.total*100):0,[F,je]=t("username");return e("div",{className:"page-container",children:[e("div",{className:n.header,children:[e("h1",{className:n.pageTitle,children:"Trackers"}),e("p",{className:n.pageSubtitle,children:"Import & sync your anime watchlists and manga reading lists with tracking services"})]}),e("div",{style:{marginBottom:"16px",padding:"10px 14px",borderRadius:"8px",fontSize:"0.85rem",background:"color-mix(in srgb, var(--color-warning) 8%, transparent)",border:"1px solid color-mix(in srgb, var(--color-warning) 25%, transparent)",color:"var(--text-secondary)"},children:"⚠ Syncing writes directly to your AniList entries, and dango may not always handle anime/manga lists correctly — always keep a backup of your lists before syncing."}),!k&&e(d,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"anilist",className:n.anilistIcon}),e("h3",{children:"AniList"}),pe?null:w?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),w&&O?e("div",{className:n.connectedProfile,children:[O.avatar&&e("img",{src:O.avatar,alt:"Avatar",className:n.avatar,loading:"lazy",decoding:"async"}),e("div",{className:n.connectedInfo,children:[e("span",{className:n.connectedName,children:O.name}),e("span",{className:n.connectedHint,children:"2-way sync is ready"})]}),e("button",{className:n.secondaryBtn,onClick:()=>ue.mutate(),disabled:ue.isPending,children:[e(l,{name:"sign-out-alt"})," Disconnect"]})]}):e("div",{className:n.loginSection,children:[e("p",{className:n.loginText,children:["Log in with AniList to enable bidirectional progress & status synchronization.",Ke&&e("span",{style:{marginLeft:8,color:"var(--accent)"},children:"Finishing login…"})]}),e("div",{className:n.fieldLabel,children:["AniList client ID — defaults to Dango's app"," ",e("a",{href:"https://anilist.co/settings/developer",target:"_blank",rel:"noopener noreferrer",children:["create your own app ",e(l,{name:"external-link-alt",size:9})]})]}),e("div",{className:n.inputGroup,children:[e("input",{type:"text",placeholder:"Client ID",value:_,onChange:a=>ce(a.target.value),className:n.input}),e("button",{className:n.primaryBtn,onClick:Qe,disabled:!(_.trim()||V),children:[e(l,{name:"external-link-alt"})," Connect"]})]}),e("p",{className:n.helpText,children:V?e(d,{children:["By default uses Dango's client. To use your own AniList app: create it at"," ",e("a",{href:"https://anilist.co/settings/developer",target:"_blank",rel:"noopener noreferrer",children:"anilist.co/settings/developer"}),", set its ",e("strong",{children:"Redirect URL"})," to"," ",e("code",{children:window.location.port==="5173"?`${window.location.protocol}//${window.location.hostname}:3000/api/tracker/anilist/callback`:`${window.location.origin}/api/tracker/anilist/callback`}),", then paste only the ",e("strong",{children:"Client ID"})," above (leave empty to use Dango's)."]}):e(d,{children:["No shipped client in this build — create your own app at"," ",e("a",{href:"https://anilist.co/settings/developer",target:"_blank",rel:"noopener noreferrer",children:"anilist.co/settings/developer"}),", set ",e("strong",{children:"Redirect URL"})," to"," ",e("code",{children:window.location.port==="5173"?`${window.location.protocol}//${window.location.hostname}:3000/api/tracker/anilist/callback`:`${window.location.origin}/api/tracker/anilist/callback`}),", then paste the ",e("strong",{children:"Client ID"})," above."]})})]}),w&&e(d,{children:[e("hr",{className:n.divider}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"anilistMode",value:"username",checked:y==="username",onChange:()=>x("username")}),e("span",{children:"Quick Import"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"anilistMode",value:"sync",checked:y==="sync",onChange:()=>x("sync")}),e("span",{children:"Two-way Sync"})]})]}),y==="username"?e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter AniList username",value:b,onChange:a=>j(a.target.value),className:n.input,disabled:S.isPending,onKeyDown:a=>{a.key==="Enter"&&b.trim()&&S.mutate()}})}):e("p",{className:n.syncHint,children:"Merges progress non-destructively: pushes shows and episodes you watched on dango to AniList, and pulls anything you updated on AniList into dango."}),y==="username"&&e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:v,onChange:a=>xe(a.target.checked),className:n.checkbox,disabled:S.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Erase current watchlist"}),e("span",{className:n.optionDesc,children:"Delete existing watchlist before importing."})]})]})}),y==="username"?e("button",{className:n.syncBtn,onClick:()=>S.mutate(),disabled:!b.trim()||S.isPending,children:[e(l,{name:"download"}),S.isPending?"Importing...":"Start Import"]}):e(d,{children:[e("button",{className:n.syncBtn,onClick:()=>Q.mutate(),disabled:Q.isPending,children:[e(l,{name:"sync-alt",className:Q.isPending?n.spin:""}),Q.isPending?"Syncing...":"Start Sync"]}),g&&e("div",{className:n.syncSummary,children:["Pushed: ",g.pushed," · Pulled: ",g.pulled," · Merged:"," ",g.merged," · Unchanged: ",g.unchanged,g.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",g.errors.length," error",g.errors.length>1?"s":""]})]})]}),e("p",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"8px"},children:["AniList ",e("code",{children:"Rewatching (REPEATING)"})," is not tracked — entries with this status are ignored."]})]})]})}),k&&e(d,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"anilist",className:n.anilistIcon}),e("h3",{children:"AniList Manga"}),pe?null:w?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),w?e(d,{children:[e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaMode",value:"username",checked:G==="username",onChange:()=>ye("username")}),e("span",{children:"Quick Import"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaMode",value:"sync",checked:G==="sync",onChange:()=>ye("sync")}),e("span",{children:"Two-way Sync"})]})]}),G==="username"?e(d,{children:[e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter AniList username",value:P,onChange:a=>ge(a.target.value),className:n.input,disabled:L.isPending,onKeyDown:a=>{a.key==="Enter"&&P.trim()&&L.mutate()}})}),e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:M,onChange:a=>de(a.target.checked),className:n.checkbox,disabled:L.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Replace AniList-linked manga"}),e("span",{className:n.optionDesc,children:"Clears previously imported (anilist:) entries before importing. Your provider bookmarks are never touched."})]})]})})]}):e(d,{children:[e("p",{className:n.syncHint,children:"Merges chapter progress non-destructively: pushes manga and chapters you read on dango to AniList, and pulls anything you updated on AniList into dango. Local titles are linked only on exact title matches, and bookmarks with no chapters read are never pushed."}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaDirection",value:"two-way",checked:Z==="two-way",onChange:()=>be("two-way")}),e("span",{children:"Two-way"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaDirection",value:"pull-only",checked:Z==="pull-only",onChange:()=>be("pull-only")}),e("span",{children:"Pull only (never writes to AniList)"})]})]})]}),G==="username"?e("button",{className:n.syncBtn,onClick:()=>L.mutate(),disabled:!P.trim()||L.isPending,children:[e(l,{name:"download"}),L.isPending?"Importing...":"Start Import"]}):e(d,{children:[e("button",{className:n.syncBtn,onClick:()=>H.mutate(),disabled:H.isPending,children:[e(l,{name:"sync-alt",className:H.isPending?n.spin:""}),H.isPending?"Syncing...":"Start Manga Sync"]}),c&&e(d,{children:[e("div",{className:n.syncSummary,children:["Pushed: ",c.pushed," · Pulled: ",c.pulled," · Merged: ",c.merged," · Unchanged:"," ",c.unchanged,(c.skipped??0)>0&&e("span",{children:[" · Skipped: ",c.skipped]}),c.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",c.errors.length," error",c.errors.length>1?"s":""]})]}),(c.warnings?.length??0)>0&&e("div",{className:n.syncErrors,style:{marginTop:"8px"},children:[(c.warnings??[]).slice(0,5).map((a,r)=>e("div",{children:["⚠ ",a]},r)),(c.warnings?.length??0)>5&&e("div",{children:["+",(c.warnings?.length??0)-5," more warning(s)"]})]})]})]}),e("p",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"8px"},children:["AniList ",e("code",{children:"Rereading (REPEATING)"})," is not tracked — entries with this status are ignored."]})]}):e("p",{className:n.loginText,children:"Connect your AniList account above to sync your manga reading list."})]})}),!k&&e(d,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"myanimelist",className:n.malIcon}),e("h3",{children:"MyAnimeList"})]})}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMode",value:"username",checked:F==="username",onChange:()=>je("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMode",value:"xml",checked:F==="xml",onChange:()=>je("xml")}),e("span",{children:"XML File"})]})]}),F==="username"?e(d,{children:[e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter MAL username",value:B,onChange:a=>Ie(a.target.value),className:n.input,disabled:u.isPending,onKeyDown:a=>{a.key==="Enter"&&B.trim()&&u.mutate({erase:v,useOfflineDb:D,skipFallback:$})}})}),u.isPending&&e("div",{className:n.importLoading,children:[e(l,{name:"sync-alt",className:n.spin}),e("span",{children:"Importing from MAL..."})]})]}):e("div",{className:n.uploadArea,children:e("div",{className:n.fileInputWrapper,children:[e("input",{type:"file",id:"malFile",accept:".xml,application/xml",className:n.fileInput,onChange:Je,disabled:T}),e("div",{className:n.fileDisplay,children:[e(l,{name:"file-alt",className:n.fileIcon}),e("span",{className:n.fileName,children:Me||"Choose XML file..."})]}),e("label",{htmlFor:"malFile",className:n.browseButton,children:"Browse"})]})}),e("div",{className:n.optionsArea,children:[e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:v,onChange:a=>xe(a.target.checked),className:n.checkbox,disabled:T||u.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Erase current watchlist"}),e("span",{className:n.optionDesc,children:"Delete existing watchlist before importing."})]})]}),e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:D,onChange:a=>ze(a.target.checked),className:n.checkbox,disabled:T||u.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Use offline database (fast)"}),e("span",{className:n.optionDesc,children:"Match by MAL ID locally first — instant and avoids AniList rate limits."})]})]}),e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:$,onChange:a=>Xe(a.target.checked),className:n.checkbox,disabled:T||u.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Skip online fallback"}),e("span",{className:n.optionDesc,children:"Only import offline matches. Unmatched titles are skipped without API calls."})]})]})]}),F==="username"?e("button",{className:n.syncBtn,onClick:()=>u.mutate({erase:v,useOfflineDb:D,skipFallback:$}),disabled:!B.trim()||u.isPending,children:[e(l,{name:"download"}),u.isPending?"Importing...":"Start Import"]}):e("div",{className:n.actions,children:T?e(le,{onClick:Ve,className:n.cancelBtn,children:"Cancel Import"}):e(le,{onClick:Ye,className:n.importBtn,disabled:!Me,children:[e(l,{name:"upload"})," Start Import"]})}),F==="username"&&u.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:u.error.message}),T&&p&&e("div",{className:n.progressSection,children:[e("div",{className:n.progressBar,children:e("div",{className:n.progressFill,style:{width:`${Ze}%`}})}),e("div",{className:n.progressInfo,children:[e("span",{className:n.progressCount,children:[p.current," / ",p.total]}),e("span",{className:n.progressTitle,children:p.found?e(d,{children:[p.matchedTitle,e("span",{className:`${n.sourceBadge} ${n[p.source||"anilist"]}`,children:p.source==="kitsu"?"Kitsu":p.source==="offline"?"Offline DB":"AniList"})]}):e("span",{className:n.skipped,children:["Skipped: ",p.title]})})]})]}),ae&&e("div",{className:`${n.statusMessage} ${n.success}`,children:["Import complete! Imported: ",ae.imported,", Skipped: ",ae.skipped,"."]}),Ae&&e("div",{className:`${n.statusMessage} ${n.error}`,children:Ae})]})}),k&&e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(l,{name:"myanimelist",className:n.malIcon}),e("h3",{children:"MyAnimeList Manga"})]})}),e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMangaMode",value:"username",checked:W==="username",onChange:()=>fe("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMangaMode",value:"xml",checked:W==="xml",onChange:()=>fe("xml")}),e("span",{children:"XML File"})]})]}),W==="username"?e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter MAL username",value:E,onChange:a=>_e(a.target.value),className:n.input,disabled:f.isPending,onKeyDown:a=>{a.key==="Enter"&&E.trim()&&f.mutate()}})}):e("div",{className:n.uploadArea,children:e("div",{className:n.fileInputWrapper,children:[e("input",{type:"file",id:"malMangaFile",accept:".xml,application/xml",className:n.fileInput,onChange:a=>He(a.target.files?.[0]?.name??""),disabled:z}),e("div",{className:n.fileDisplay,children:[e(l,{name:"file-alt",className:n.fileIcon}),e("span",{className:n.fileName,children:ve||"Choose XML file..."})]}),e("label",{htmlFor:"malMangaFile",className:n.browseButton,children:"Browse"})]})}),e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:M,onChange:a=>de(a.target.checked),className:n.checkbox,disabled:f.isPending||z}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Replace AniList-linked manga"}),e("span",{className:n.optionDesc,children:"Clears previously imported (anilist:) entries before importing. Your provider bookmarks are never touched."})]})]})}),W==="username"?e("button",{className:n.syncBtn,onClick:()=>f.mutate(),disabled:!E.trim()||f.isPending,children:[e(l,{name:"download"}),f.isPending?"Importing...":"Start Import"]}):e("div",{className:n.actions,children:e(le,{onClick:We,className:n.importBtn,disabled:z||!ve,children:[e(l,{name:"upload"})," ",z?"Importing...":"Start Import"]})}),f.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:f.error.message}),we&&e("div",{className:`${n.statusMessage} ${n.error}`,children:we}),ee&&e("div",{className:`${n.statusMessage} ${n.success}`,children:["Import complete! Imported: ",ee.imported,", Skipped:"," ",ee.skipped,"."]}),e("p",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)",marginTop:"8px"},children:"MAL manga is matched to AniList by MAL ID with a title fallback. Unmatched titles are skipped. Imports land as AniList-linked entries alongside your provider bookmarks."})]})]})};export{wa as default};
@@ -0,0 +1,4 @@
1
+ import{u as t,d as _,A as w,h as v,S as Le,g as jr,o as Wr,p as zr,a as Hr,T as Me,q as y}from"./vendor-core-DfaOB3Rn.js";import{u as Ur}from"./vendor-query-BBT5_sHx.js";import{g as cn,e as Kr,t as _t,z as qr,O as Yr,M as Nn,B as je}from"./index-D46PzcOL.js";import{I as V}from"./vendor-icons-DrybRNxP.js";import{S as Gr,U as Qr,p as Mn,M as Xr,D as cr,m as Ln,k as Zr,C as Jr,a as es,b as ts,c as an,u as ns,d as rs,e as ss,j as os,f as as,h as is,l as ls,B as cs,i as In,F as ds,G as us,H as ar,s as Bn,n as ms,o as hs,q as gs,r as fs,t as Qe,A as ps,v as bs,E as vs,y as ys,P as _s,w as Te,z as Ss,R as Ts}from"./AvSyncCalibrator-DJAEqz-M.js";import{S as Cs,O as wn,a as ks,A as xs,b as Es}from"./OptionListMenu-DxXGdXOU.js";import{u as Ns}from"./useProviders-CguDlK81.js";import{d as Is,g as Bs,h as ws,f as As,e as Ms,j as Ls,k as Ps}from"./useTvLibrary-340c9BPM.js";import{l as Rs,c as $s}from"./hls-BIOzsLUy.js";import{u as Ds}from"./useIsMobile-Dvx1uJ82.js";import{S as Os}from"./SynopsisText-B3Sa5pRv.js";const Fs="_fullscreenFlat_1xij1_1",Vs="_timeDisplay_1xij1_15",js="_bottomControls_1xij1_19",Ws="_leftControls_1xij1_23",zs="_rightControls_1xij1_24",Hs="_controlBtn_1xij1_28",Us="_controlsOverlay_1xij1_47",Ks="_hidden_1xij1_67",qs="_topControls_1xij1_73",Ys="_backBtn_1xij1_93",Gs="_videoTitleInfo_1xij1_113",Qs="_animeTitle_1xij1_119",Xs="_episodeLabel_1xij1_127",Zs="_speedBoostBadge_1xij1_134",Js="_progressBarContainer_1xij1_180",eo="_progressBar_1xij1_180",to="_thumb_1xij1_199",no="_bufferedBar_1xij1_217",ro="_watchedBar_1xij1_227",so="_scrubbing_1xij1_252",oo="_timeBubble_1xij1_256",ao="_bottomControlsRow_1xij1_270",io="_nextEpisodeBtn_1xij1_293",lo="_active_1xij1_346",co="_settingsPanel_1xij1_421",uo="_settingsHeader_1xij1_440",mo="_settingsBackBtn_1xij1_448",ho="_settingsTitle_1xij1_466",go="_settingsContent_1xij1_477",fo="_currentValue_1xij1_486",po="_menuItem_1xij1_501",bo="_menuNote_1xij1_534",vo="_loadingOverlay_1xij1_547",yo="_loadingDots_1xij1_558",_o="_dot_1xij1_563",So="_bufferingOverlay_1xij1_592",To="_bufferingSpinner_1xij1_601",a={fullscreenFlat:Fs,timeDisplay:Vs,bottomControls:js,leftControls:Ws,rightControls:zs,controlBtn:Hs,controlsOverlay:Us,hidden:Ks,topControls:qs,backBtn:Ys,videoTitleInfo:Gs,animeTitle:Qs,episodeLabel:Xs,speedBoostBadge:Zs,progressBarContainer:Js,progressBar:eo,thumb:to,bufferedBar:no,watchedBar:ro,scrubbing:so,timeBubble:oo,bottomControlsRow:ao,nextEpisodeBtn:io,active:lo,settingsPanel:co,settingsHeader:uo,settingsBackBtn:mo,settingsTitle:ho,settingsContent:go,currentValue:fo,menuItem:po,menuNote:bo,loadingOverlay:vo,loadingDots:yo,dot:_o,bufferingOverlay:So,bufferingSpinner:To},Co=({player:o,visible:b,settingsOpen:z,onOpenSettings:F,onCloseSettings:G,hasSubtitles:R,isSubtitleActive:r,subtitles:I,onSubtitleChange:i,showNextEpisodeButton:J,onNextEpisode:Q,isTheaterMode:$,onTheaterModeToggle:g,timeLabelRef:K})=>{const{state:h,refs:We,actions:B}=o,X=We.videoRef,Pe=S=>{const ee=X.current;!ee||isNaN(h.duration)||h.duration===0||(ee.currentTime=S*h.duration)},Re=()=>{X.current&&(B.setIsScrubbing(!0),B.wasPlayingBeforeScrub.current=!X.current.paused,X.current.pause())},ze=S=>{const ee=X.current;ee&&h.duration&&(ee.currentTime=S*h.duration)},He=()=>{B.setIsScrubbing(!1),B.wasPlayingBeforeScrub.current&&X.current?.play().catch(()=>{})},Xe=S=>{const ee=X.current;ee&&(ee.volume=S,ee.muted=S===0)},se=()=>{if(r){i(-1);return}let S=null;try{S=localStorage.getItem("tvLastSubtitle")}catch{}i(Mn(I,{lastKey:S,enabled:!0}))},q=h.isMuted?t(V,{name:"volume-mute"}):h.volume<.5?t(V,{name:"volume-down"}):t(V,{name:"volume-up"});return t("div",{className:`${a.controlsOverlay} ${b?"":a.hidden}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:a.bottomControls,onClick:S=>S.stopPropagation(),children:[t(Gr,{classes:{container:a.progressBarContainer,scrubbing:a.scrubbing,timeBubble:a.timeBubble,bar:a.progressBar,buffered:a.bufferedBar,watched:a.watchedBar,thumb:a.thumb},videoRef:X,duration:h.duration,formatTime:cn,isScrubbing:h.isScrubbing,buffered:"full",onSeek:Pe,onScrubStart:Re,onScrubMove:ze,onScrubEnd:He,timeLabelRef:K}),t("div",{className:a.bottomControlsRow,children:[t("div",{className:a.leftControls,children:[t("button",{className:a.controlBtn,onClick:B.togglePlay,"aria-label":h.isPlaying?"Pause":"Play",children:h.isPlaying?t(V,{name:"pause"}):t(V,{name:"play"})}),t(Qr,{muted:h.isMuted,volume:h.volume,volumeIcon:q,buttonClassName:a.controlBtn,onToggleMute:B.toggleMute,onVolumeChange:Xe,onExpandedChange:S=>B.setShowVolumeSlider(S)}),t("span",{className:a.timeDisplay,ref:K,children:[cn(0)," / ",cn(h.duration)]})]}),t("div",{className:a.rightControls,children:[J&&t("button",{className:a.nextEpisodeBtn,onClick:Q,title:"Play next episode",children:"Next EP"}),R&&t("button",{className:`${a.controlBtn} ${r?a.active:""}`,onClick:se,"aria-label":r?"Turn subtitles off":"Turn subtitles on",children:t(V,{name:"closed-captioning"})}),t("button",{className:`${a.controlBtn} ${z?a.active:""}`,onClick:()=>z?G():F(),"aria-label":"Settings",children:t(V,{name:"cog"})}),t("button",{className:`${a.controlBtn} ${$?a.active:""}`,onClick:S=>{S.stopPropagation(),g()},title:$?"Exit Theater Mode":"Theater Mode","aria-label":$?"Exit Theater Mode":"Theater Mode",children:t(V,{name:"tv"})}),t("button",{className:a.controlBtn,onClick:B.toggleFullscreen,"aria-label":h.isFullscreen?"Exit Fullscreen":"Fullscreen",children:h.isFullscreen?t(V,{name:"compress"}):t(V,{name:"expand"})})]})]})]})})},ln=-6e4,An=6e4,ir=500,ko=({classes:o,delayMs:b,onDelayChange:z})=>{const[F,G]=_(null),R=F??b,r=w(z);r.current=z;const I=w(b);I.current=b;const i=w(null);i.current=F,v(()=>{G(null)},[b]),v(()=>()=>{const $=i.current;$!==null&&$!==I.current&&r.current($)},[]);const J=$=>{I.current=$,i.current=null,r.current($),G(null)},Q=$=>{const g=i.current??I.current,K=Math.max(ln,Math.min(An,g+$));J(K)};return t(Le,{children:[t("div",{style:{display:"flex",gap:6,padding:"0.5rem 0.75rem 0.25rem"},children:[t("button",{type:"button",className:o.item,onClick:()=>Q(-ir),"aria-label":"Show subtitles 0.5 seconds earlier",style:{flex:1,justifyContent:"center"},children:t("span",{children:"-0.5s"})}),t("button",{type:"button",className:o.item,onClick:()=>Q(ir),"aria-label":"Show subtitles 0.5 seconds later",style:{flex:1,justifyContent:"center"},children:t("span",{children:"+0.5s"})}),t("button",{type:"button",className:o.item,onClick:()=>J(0),disabled:R===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(Xr,{label:"Subtitle timing",display:cr(R),min:ln,max:An,step:100,value:R,percent:(R-ln)/(An-ln)*100,onChange:$=>{const g=Math.round($);i.current=g,G(g)},onCommit:()=>{const $=i.current;$!==null&&J($)}}),t("div",{className:o.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},xo=({view:o,onSelectView:b,onClose:z,player:F,onSubtitleStyleChange:G,streams:R,resolutionIdx:r,onResolutionChange:I,hasSubtitles:i,subtitles:J,selectedSubtitle:Q,isSubtitleActive:$,onSubtitleChange:g,audioTracks:K,selectedAudioTrack:h,onAudioTrackChange:We,videoDelayEnabled:B,onVideoDelayToggle:X,videoDelayMs:Pe,onVideoDelayChange:Re,onCalibrate:ze,subtitleDelayMs:He,onSubtitleDelayChange:Xe,ambientSettings:se,onAmbientChange:q})=>{const{state:S}=F,ee=()=>t(Le,{children:[R.length>1&&t("button",{className:a.menuItem,onClick:()=>b("resolution"),children:[t("span",{children:"Resolution"}),t("span",{className:a.currentValue,children:R[r]?.quality||"Auto"})]}),i&&t("button",{className:a.menuItem,onClick:()=>b("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:a.currentValue,children:$?J[Q]?.label||J[Q]?.language:"Off"})]}),i&&t("button",{className:a.menuItem,onClick:()=>b("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:a.currentValue,children:[S.subtitleFontSize.toFixed(1),"x · ",S.subtitlePosition]})]}),i&&t("button",{className:a.menuItem,onClick:()=>b("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:a.currentValue,children:cr(He)})]}),K.length>0&&t("button",{className:a.menuItem,onClick:()=>b("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:a.currentValue,children:K[h]?.label||K[h]?.language})]}),t("button",{className:a.menuItem,onClick:()=>b("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:a.currentValue,children:B?`${Pe}ms`:"Off"})]}),se&&q&&t("button",{className:a.menuItem,onClick:()=>b("ambient"),children:[t("span",{children:"Ambient Light"}),t("span",{className:a.currentValue,children:se.enabled?"On":"Off"})]})]}),Ce=()=>t(wn,{classes:{item:a.menuItem,active:a.active},options:R.map((T,H)=>({key:String(H),label:T.quality,selected:H===r})),onSelect:T=>I(Number(T))}),Y=()=>t(wn,{classes:{item:a.menuItem,active:a.active},options:[{key:"off",label:"Off",selected:!$},...J.map((T,H)=>({key:String(H),label:T.label||T.language,selected:H===Q}))],onSelect:T=>g(T==="off"?-1:Number(T))}),ke=()=>t(ks,{classes:{item:a.menuItem,active:a.active},values:{fontSize:S.subtitleFontSize,position:S.subtitlePosition,bgOpacity:S.subtitleBgOpacity,bgColor:S.subtitleBgColor,textColor:S.subtitleTextColor,edge:S.subtitleEdge,bold:S.subtitleBold},onChange:G}),A=()=>t(ko,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},delayMs:He,onDelayChange:T=>Xe?.(T)}),$e=()=>t(wn,{classes:{item:a.menuItem,active:a.active},options:K.map((T,H)=>({key:String(H),label:T.label||T.language,selected:H===h})),onSelect:T=>We(Number(T))}),Ue=()=>t(xs,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},enabled:B,delayMs:Pe,onToggle:T=>X?.(T),onDelayChange:T=>Re?.(T),onCalibrate:ze}),pe=()=>se&&q?t(Es,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},values:se,onChange:q}):null;return t("div",{"data-speed-boost-ignore":"true",onClick:T=>T.stopPropagation(),children:t(Cs,{classes:{panel:a.settingsPanel,header:a.settingsHeader,backBtn:a.settingsBackBtn,title:a.settingsTitle,content:a.settingsContent},title:o==="main"?"Settings":o==="subtitle-style"?"Subtitle Style":o==="subtitle-timing"?"Subtitle Timing":o==="audio"?"Audio Track":o==="resolution"?"Resolution":o==="av-sync"?"A/V Sync":o==="ambient"?"Ambient Light":o.charAt(0).toUpperCase()+o.slice(1),onBack:()=>o==="main"?z():b("main"),children:[o==="main"&&ee(),o==="resolution"&&Ce(),o==="subtitles"&&Y(),o==="subtitle-style"&&ke(),o==="subtitle-timing"&&A(),o==="audio"&&$e(),o==="av-sync"&&Ue(),o==="ambient"&&pe()]})})},Eo=({player:o,title:b,episodeLabel:z,audioTracks:F,selectedAudioTrack:G,onAudioTrackChange:R,subtitles:r,selectedSubtitle:I,onSubtitleChange:i,streams:J,resolutionIdx:Q,onResolutionChange:$,onBack:g,children:K,videoDelayEnabled:h=!1,onVideoDelayToggle:We,videoDelayMs:B=0,onVideoDelayChange:X,onCalibrateAvSync:Pe,subtitleDelayMs:Re=0,onSubtitleDelayChange:ze,showNextEpisodeButton:He=!1,onNextEpisode:Xe,isLoading:se=!1,isTheaterMode:q,onTheaterModeToggle:S,ambientSettings:ee,onAmbientChange:Ce})=>{const{state:Y,refs:ke,actions:A}=o,$e=ke.videoRef,{subtitleFontSize:Ue,subtitlePosition:pe,subtitleBgOpacity:T,subtitleBgColor:H,subtitleTextColor:at,subtitleEdge:oe,subtitleBold:De}=Y,[be,Oe]=_(null),it=w(null),[Ot,St]=_(0);v(()=>{const ae=$e.current;if(!ae)return;const l=()=>St(ae.clientHeight||0);l();const d=new ResizeObserver(l);return d.observe(ae),()=>d.disconnect()},[$e]);const de=(ae,l)=>{try{localStorage.setItem(ae,String(l))}catch{}},ve=(ae,l)=>{switch(ae){case"fontSize":typeof l=="number"&&(A.setSubtitleFontSize(l),de("subtitleFontSize",l));break;case"position":typeof l=="number"&&(A.setSubtitlePosition(l),de("subtitlePosition",l));break;case"bgOpacity":typeof l=="number"&&(A.setSubtitleBgOpacity(l),de("subtitleBgOpacity",l));break;case"bgColor":typeof l=="string"&&(A.setSubtitleBgColor(l),de("subtitleBgColor",l));break;case"textColor":typeof l=="string"&&(A.setSubtitleTextColor(l),de("subtitleTextColor",l));break;case"edge":(l==="shadow"||l==="outline"||l==="none")&&(A.setSubtitleEdge(l),de("subtitleEdge",l));break;case"bold":typeof l=="boolean"&&(A.setSubtitleBold(l),de("subtitleBold",l));break}};v(()=>{const ae="tv-player-subtitle-style";let l=document.getElementById(ae);l||(l=document.createElement("style"),l.id=ae,document.head.appendChild(l));const d={fontSize:Ue,position:pe,bgOpacity:T,bgColor:H,textColor:at,edge:oe,bold:De},D=$e.current,ie=Ln(Ue,Ot||D?.clientHeight||720);if(l.textContent=Zr({...d,fontSize:ie}),D){const kt=()=>{const L=Number(pe);return isNaN(L)?0:Math.max(0,Math.min(100,L))},ut=(L,te)=>{try{const le=L;le.snapToLines=!1,le.line=te}catch{}},Wt=()=>{const L=ie*16,te=D.videoHeight||D.clientHeight||720,le=D.videoWidth||D.clientWidth||1280;return{step:L*1.3/te*100,chars:Math.max(20,Math.floor(le/(L*.55)))}},mt=L=>{const te=Math.max(0,Math.min(100,100-kt())),le=Array.from(L.activeCues??[]);if(le.length<=1){le.forEach(ue=>ut(ue,te));return}const{step:Ht,chars:_e}=Wt();let ht=te;for(let ue=le.length-1;ue>=0;ue--){const Nt=String(le[ue].text??"").replace(/<[^>]*>/g,"").split(`
2
+ `).reduce((It,ce)=>It+Math.max(1,Math.ceil(ce.length/_e)),0),Ut=ht-Nt*Ht;ut(le[ue],Math.max(0,Ut)),ht=Ut-Ht*.4}},xt=()=>{const L=Math.max(0,Math.min(100,100-kt()));Array.from(D.textTracks).forEach(te=>{te.cues&&(Array.from(te.cues).forEach(le=>ut(le,L)),te.mode==="showing"&&mt(te))})};xt();const Ze=L=>{const te=L.target;te.mode==="showing"&&mt(te)},zt=()=>{Array.from(D.textTracks).forEach(L=>{L.removeEventListener("cuechange",Ze),L.addEventListener("cuechange",Ze)}),xt()};Array.from(D.textTracks).forEach(L=>{L.addEventListener("cuechange",Ze)}),D.textTracks.addEventListener("addtrack",zt);const xe=Array.from(D.querySelectorAll("track")),Et=()=>xt();return xe.forEach(L=>L.addEventListener("load",Et)),()=>{Array.from(D.textTracks).forEach(L=>{L.removeEventListener("cuechange",Ze)}),D.textTracks.removeEventListener("addtrack",zt),xe.forEach(L=>L.removeEventListener("load",Et))}}},[Ue,pe,T,H,at,oe,De,I,r,$e,Ot]);const Tt=r.length>0,lt=I>=0,M=()=>{Oe("main"),A.setShowControls(!0)},ct=()=>{Oe(null)},Ct=Y.showControls||!!be,ye=t(ts,{visible:Ct,title:b,episode:z,onBack:g,classes:{overlay:a.controlsOverlay,hidden:a.hidden,top:a.topControls,backBtn:a.backBtn,titleInfo:a.videoTitleInfo,title:a.animeTitle,episode:a.episodeLabel}}),dt=!se&&!Y.isBuffering&&Y.duration>0?t(Jr,{isPlaying:Y.isPlaying,onTogglePlay:A.togglePlay,onSkipBack:()=>A.seek(-10),onSkipForward:()=>A.seek(10)}):null,Ft=t(Co,{player:o,visible:Ct,settingsOpen:!!be,onOpenSettings:M,onCloseSettings:ct,hasSubtitles:Tt,isSubtitleActive:lt,subtitles:r,onSubtitleChange:i,showNextEpisodeButton:He,onNextEpisode:Xe,isTheaterMode:q,onTheaterModeToggle:S,timeLabelRef:it}),Vt=be?t(xo,{view:be,onSelectView:Oe,onClose:ct,player:o,onSubtitleStyleChange:ve,streams:J,resolutionIdx:Q,onResolutionChange:$,hasSubtitles:Tt,subtitles:r,selectedSubtitle:I,isSubtitleActive:lt,onSubtitleChange:i,audioTracks:F,selectedAudioTrack:G,onAudioTrackChange:R,videoDelayEnabled:h,onVideoDelayToggle:We,videoDelayMs:B,onVideoDelayChange:X,onCalibrate:()=>{Oe(null),Pe?.()},subtitleDelayMs:Re,onSubtitleDelayChange:ze,ambientSettings:ee,onAmbientChange:Ce}):null,jt=t(Le,{children:[se&&t("div",{className:a.loadingOverlay,"aria-hidden":"true",children:t("div",{className:a.loadingDots,children:[t("div",{className:a.dot}),t("div",{className:a.dot}),t("div",{className:a.dot})]})}),Y.isBuffering&&!se&&t("div",{className:a.bufferingOverlay,"aria-hidden":"true",children:t("div",{className:a.bufferingSpinner})}),Y.isSpeedBoostActive&&t("div",{className:a.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(V,{name:"forward",size:12})]})]});return t(es,{player:o,topBar:ye,centerControls:dt,bottomBar:!se&&Y.duration>0?Ft:null,settingsPanel:Vt,overlays:jt,isInteracting:!!be,className:Y.isFullscreen?a.fullscreenFlat:"",children:K})},No=({servers:o,selectedServer:b,onServerSelect:z})=>o.length===0?null:t("div",{className:an.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:an.sourceButtons,children:o.map(F=>t("button",{className:`${an.sourceButton} ${b===F?an.active:""}`,onClick:()=>z(F),children:F},F))})]}),Io=jr.memo(No);function Bo(o,b,z){const F=()=>{const R=Array.isArray(o.audioTracks)?o.audioTracks.length:0,r=z.getWant(),I=R>0?Math.min(Math.max(0,r),R-1):r;o.audioTrack=I,I!==r&&z.onResolve(I)},G=(R,r)=>{const I=z.getWant(),i=Array.isArray(o.audioTracks)?o.audioTracks.length:0;if(r.id!==I&&I>=0&&I<i){o.audioTrack!==I&&(o.audioTrack=I);return}z.onResolve(r.id)};return o.on(b.MANIFEST_PARSED,F),o.on(b.AUDIO_TRACK_SWITCHED,G),()=>{o.off(b.MANIFEST_PARSED,F),o.off(b.AUDIO_TRACK_SWITCHED,G)}}const wo=/\b(SmartTV|SMART-TV|Tizen|Web0S|webOS|NetCast|HbbTV|AppleTV|CrKey|BRAVIA|AFT[A-Za-z]|Fire\s?TV|GoogleTV|Roku|VIDAA|DTV|PlayStation|Xbox|Opera TV|POV_TV)\b/i;function Ao(){try{if(wo.test(navigator.userAgent||""))return!0;const o=navigator.deviceMemory;if(typeof o=="number"&&o>0&&o<2)return!0}catch{}return!1}const Mo="_page_y9mr4_1",Lo="_header_y9mr4_7",Po="_pageTitle_y9mr4_11",Ro="_searchForm_y9mr4_21",$o="_searchInput_y9mr4_27",Do="_searchBtn_y9mr4_42",Oo="_suggestions_y9mr4_58",Fo="_suggestionPill_y9mr4_65",Vo="_statusMsg_y9mr4_81",jo="_error_y9mr4_87",Wo="_textOnly_y9mr4_91",zo="_spinner_y9mr4_96",Ho="_spin_y9mr4_96",Uo="_sourceLoader_y9mr4_101",Ko="_ringSpinner_y9mr4_107",qo="_grid_y9mr4_125",Yo="_skeletonCard_y9mr4_131",Go="_skeletonThumb_y9mr4_136",Qo="_skeletonLine_y9mr4_142",Xo="_shimmer_y9mr4_149",Zo="_backBtn_y9mr4_169",Jo="_meta_y9mr4_187",ea="_headerActions_y9mr4_195",ta="_watchlistBtn_y9mr4_202",na="_active_y9mr4_220",ra="_year_y9mr4_230",sa="_rating_y9mr4_235",oa="_typeBadge_y9mr4_244",aa="_tv_y9mr4_252",ia="_movie_y9mr4_257",la="_tvSeries_y9mr4_262",ca="_tvMiniSeries_y9mr4_267",da="_overview_y9mr4_272",ua="_controls_y9mr4_279",ma="_controlLabel_y9mr4_287",ha="_select_y9mr4_297",ga="_playerSection_y9mr4_308",fa="_video_y9mr4_312",pa="_videoHidden_y9mr4_334",ba="_delayCanvas_y9mr4_339",va="_delayCanvasActive_y9mr4_352",ya="_subtitleOverlay_y9mr4_356",_a="_videoIframe_y9mr4_375",Sa="_retryButton_y9mr4_383",Ta="_sidebarSeason_y9mr4_398",Ca="_mobileSeasonRow_y9mr4_414",ka="_sidebarPosterCard_y9mr4_428",xa="_sidebarPosterMeta_y9mr4_443",Ea="_providerSelectWrap_y9mr4_460",Na="_genreRow_y9mr4_472",Ia="_genreChip_y9mr4_479",Ba="_metaRow_y9mr4_489",wa="_detailGrid_y9mr4_498",Aa="_detailItem_y9mr4_505",Ma="_imdbLink_y9mr4_527",p={page:Mo,header:Lo,pageTitle:Po,searchForm:Ro,searchInput:$o,searchBtn:Do,suggestions:Oo,suggestionPill:Fo,statusMsg:Vo,error:jo,textOnly:Wo,spinner:zo,spin:Ho,sourceLoader:Uo,ringSpinner:Ko,grid:qo,skeletonCard:Yo,skeletonThumb:Go,skeletonLine:Qo,shimmer:Xo,backBtn:Zo,meta:Jo,headerActions:ea,watchlistBtn:ta,active:na,year:ra,rating:sa,typeBadge:oa,tv:aa,movie:ia,tvSeries:la,tvMiniSeries:ca,overview:da,controls:ua,controlLabel:ma,select:ha,playerSection:ga,video:fa,videoHidden:pa,delayCanvas:ba,delayCanvasActive:va,subtitleOverlay:ya,videoIframe:_a,retryButton:Sa,sidebarSeason:Ta,mobileSeasonRow:Ca,sidebarPosterCard:ka,sidebarPosterMeta:xa,providerSelectWrap:Ea,genreRow:Na,genreChip:Ia,metaRow:Ba,detailGrid:wa,detailItem:Aa,imdbLink:Ma},La=[],Pa=[];function lr({error:o,onRetry:b}){return t("div",{className:`${p.statusMsg} ${p.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:o}),t("button",{className:p.retryButton,onClick:b,children:"Retry"})]})})}const qa=()=>{const{id:o}=Wr(),[b]=zr(),z=w(b);z.current=b;const F=Hr(),G=Ur(),R=b.get("type"),[r,I]=_(null),[i,J]=_(()=>parseInt(b.get("s")||"1",10)||1),[Q,$]=_([]),[g,K]=_(()=>parseInt(b.get("e")||"1",10)||1),[h,We]=_(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[B,X]=_([]),[Pe,Re]=_(""),{options:ze,isFallback:He,isLoading:Xe}=Ns(),se=Me(()=>ze.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.value,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[ze]),q=He||se.length===0?La:se,S=q.filter(e=>e.tier==="direct"),ee=q.filter(e=>e.tier==="embed"),[Ce,Y]=_(!1),[ke,A]=_(""),[$e,Ue]=_([]),[pe,T]=_(0),[H,at]=_([]),[oe,De]=_(-1),[be,Oe]=_(0),[it,Ot]=_(""),[St,de]=_(""),[ve,Tt]=_(()=>{try{return localStorage.getItem("tvServer")||""}catch{return""}}),lt=Me(()=>q.find(e=>e.id===h),[q,h]),M=lt?.tier==="embed",[ct,Ct]=_([]),ye=Me(()=>ct.length>0?ct:lt?.servers??[],[ct,lt]),dt=B[be]?.type==="iframe",Ft=dt&&B[be]?.url||"",Vt=w([]);v(()=>{Vt.current=B},[B]);const jt=w(pe);v(()=>{jt.current=pe},[pe]);const ae=w(oe);v(()=>{ae.current=oe},[oe]);const l=ns({skipIntervals:Pa}),d=l.refs.videoRef,D=w(null),ie=w([]),kt=w(null),ut=w(null),{videoDelayMs:Wt,videoDelayEnabled:mt,setDelayEnabled:xt,handleVideoDelayChange:Ze,isCalibrating:zt,testClipActive:xe,stopCalibration:Et,openAvSyncCalibrator:L,cancelAvSyncCalibrator:te,applyAvSyncCalibrator:le,toggleTestClip:Ht,calibReturnRef:_e,effectiveVideoDelayMs:ht}=rs(d),[ue,Pn]=_(()=>{try{const e=Number(localStorage.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),Nt=w(ue);Nt.current=ue;const Ut=y(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(Nt.current!==n){Nt.current=n,Pn(n);try{localStorage.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]);ss({videoRef:d,canvasRef:kt,delayMs:ht,enabled:mt});const It=mt,ce=It||ue!==0,{settings:dn,update:dr}=os(),un=w(ce);un.current=ce;const mn=y(()=>{if(!un.current)return;const e=d.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[d]),{hasConsent:Bt,grant:ur}=Kr(),wt=w("");wt.current||(wt.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const f=R==="movie",Kt=o?Is(R||"tv",o):"",j=Kt,Rn=Bs(),qt=ws(),{toggle:$n,bookmarkedIds:mr,pending:hr}=As(),{data:Dn}=Ms(r?Kt:void 0),Yt=Dn?!!Dn.inLibrary:Kt?mr.has(Kt):!1,gr=y(()=>{!r||!o||$n({tmdbId:Number(o),mediaType:R||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,o,R,$n]),{data:Je,isFetched:On,isPending:Fn}=Ls(j||void 0,i,g),Gt=Me(()=>Q.map(e=>e.episode_number).sort((e,n)=>e-n),[Q]),et=Gt.indexOf(g),hn=et>0?Gt[et-1]:null,x=et>=0&&et<Gt.length-1?Gt[et+1]:null,Qt=Me(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),Se=Me(()=>{if(f||x!=null)return null;const e=Qt.indexOf(i);return e>=0&&e<Qt.length-1?Qt[e+1]:(r?.number_of_seasons??0)>i?i+1:null},[f,x,Qt,i,r?.number_of_seasons]),Vn=Je?.currentTime??0,jn=Je?.duration??0,gn=Je?.completed===!0||Je?.completed===1||In(Vn,jn),[Ee,Fe]=_(!1),Ne=w(!1),fn=w(null),At=w(null);v(()=>{Ne.current=!1,At.current=null,Fe(!1)},[j,i,g]);const[Ie,Xt]=_(!1),[gt,Wn]=_(0),[tt,zn]=_(!1),[Ke,nt]=_(!1),[fr,pn]=_(!1),[pr,Hn]=_(""),[Zt,br]=_(!1),[vr,bn]=_(!1),{isTheaterMode:Be,toggleTheaterMode:vn,handleLayoutClick:yr}=as();v(()=>{const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="t"&&vn()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[vn]),is(l,(B.length>0||St!=="")&&!Be&&!Ie&&!Ee&&!Ke);const _r=Ds(),[ft,Sr]=_(ls),Tr=y(e=>{Sr(e),cs(e)},[]),me=w(!1),rt=w(null),yn=w(0),Un=w(!1),Kn=w(0),ne=w(null),Mt=w(""),Cr=ar(Vn,jn),Lt=!me.current&&!Ne.current&&(Ie||Ee||Ke||gn||Cr),pt=w(Lt);pt.current=Lt;const bt=w(!1);v(()=>{bt.current=tt},[tt]);const qe=y((e,n)=>{if(!j||!n||n<30)return;const s=In(e,n),c=s?n:e;Math.abs(c-yn.current)<10&&!s||(yn.current=c,Rn.mutate({mediaId:j,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:R||"tv",adult:r?.adult?1:0}))},[j,i,g,Rn,r,R]),we=y((e,n)=>{Et();const s=new URLSearchParams(b);s.set("type",b.get("type")||"tv"),s.set("s",String(e)),s.set("e",String(n)),F(`${window.location.pathname}?${s.toString()}`)},[b,F,Et]),Pt=y(()=>{const e=d.current;if(!e||f||x==null){pn(!1);return}const n=e.duration||0,s=e.currentTime||0;pn(n>0&&s/n>=.8)},[f,x,d]),Jt=y((e,n)=>["tv-sources",h,f?"movie":"tv",o,e,n,ve],[h,f,o,ve]),en=y(async(e,n)=>{if(!r||!o||!h)return{valid:!1,sources:[]};const s=f?"movie":"tv",c=await _t.tv.sources.query({provider:h,type:s,tmdbId:String(o),season:e,episode:n,title:r.title||"",year:r.year||"",totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||"",...ye.length>0&&ve?{server:ve}:{}});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,o,h,f,ye,ve]),qn=y(()=>{if(f||!r||!o||!h||M||x==null)return;const e=Jt(i,x);G.getQueryState(e)?.status!=="success"&&G.prefetchQuery({queryKey:e,queryFn:()=>en(i,x),staleTime:300*1e3,gcTime:1800*1e3})},[f,r,o,h,M,x,i,G,Jt,en]),kr=y(()=>{if(xe)return;Pt();const e=d.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&qn(),rt.current&&clearTimeout(rt.current),rt.current=setTimeout(()=>{qe(e.currentTime,e.duration||0)},5e3))},[qe,d,xe,Pt,qn]),xr=y(()=>{const e=d.current;if(!e||!r)return;rt.current&&clearTimeout(rt.current),qe(e.currentTime,e.duration||0),Un.current=!0;const n=ds({seekInduced:Date.now()-Kn.current<us,autoplayEnabled:ft,hasNext:!f&&x!=null,isFinal:f||x==null});n==="advance"&&x!=null?(K(x),we(i,x)):n==="prompt-next"?(Ne.current=!1,me.current=!0,Fe(!0)):n==="prompt-complete"&&(Hn(f?r.title:`${r.title} — Season ${i}`),nt(!0),Ne.current=!0,me.current=!0)},[f,r,i,x,ft,qe,we,d]),Er=y(()=>{Un.current=!1,l.actions.onPlay()},[l.actions]),Nr=y(()=>{l.actions.onPause();const e=d.current;e&&!e.ended&&qe(e.currentTime,e.duration||0)},[l.actions,qe,d]),Ir=y(()=>{l.actions.onLoadedMetadata();const e=d.current;if(e){try{const n=parseFloat(localStorage.getItem("playerVolume")||"");isNaN(n)||(e.volume=Math.max(0,Math.min(1,n))),e.muted=localStorage.getItem("playerMuted")==="true"}catch{}if(ne.current!=null&&ne.current>0){try{e.currentTime=ne.current}catch{}ne.current=null}Pt()}},[l.actions,d,Pt]),vt=y(()=>{const e=d.current;if(e&&ne.current!=null&&ne.current>0){try{e.currentTime=ne.current}catch{}ne.current=null}},[d]),Br=y(()=>{gt>0&&(ne.current=gt);const e=d.current;if(e&&gt>0){try{e.currentTime=gt,ne.current=null}catch{}e.play().catch(()=>{})}Xt(!1),me.current=!0},[gt,d]),Yn=y(()=>{ne.current=null;const e=d.current;e&&(e.currentTime=0,e.play().catch(()=>{})),Xt(!1),me.current=!0},[d]),wr=y(()=>{Ne.current=!0,Fe(!1),me.current=!0},[]),Ar=y(()=>{Ne.current=!0,Fe(!1),me.current=!0,ne.current=null;const e=d.current;if(e){try{e.currentTime=0}catch{}e.play().catch(()=>{})}},[d]),Gn=y(()=>{x!=null&&(Ne.current=!0,Fe(!1),me.current=!0,K(x),we(i,x))},[x,i,we]),Qn=y(()=>{Se!=null&&(Ne.current=!0,Fe(!1),nt(!1),me.current=!0,J(Se),K(1),we(Se,1))},[Se,we]),Mr=y(async()=>{if(j)try{await qt.mutateAsync({id:j,status:"Completed"}),nt(!1),Fe(!1),F("/")}catch{}},[j,qt,F]);v(()=>{me.current=!1,fn.current=null,Xt(!1),pn(!1),Wn(0),zn(!1),bt.current=!1,ne.current=null,Mt.current=`${j}:${i}:${g}`,yn.current=0},[j,i,g]),v(()=>{On&&(zn(!0),bt.current=!0)},[On,j,i,g]),v(()=>{if(!Je||me.current)return;const e=`${j}:${i}:${g}`;if(fn.current===e)return;fn.current=e;const n=Je,s=n.currentTime??0,c=n.duration??0;ar(s,c)&&(Wn(s),Xt(!0))},[Je,j,i,g]),v(()=>{if(!tt||me.current||Ne.current||Ie||Ke||Ee)return;const e=`${j}:${i}:${g}`;if(At.current!==e){if(!gn){Fn||(At.current=e);return}if(f){At.current=e,Fe(!0);return}if(!(!r||et<0||Q.length===0)){if(At.current=e,x==null&&Se==null){r&&Q.length>0&&(Hn(`${r.title} — Season ${i}`),nt(!0),Ne.current=!0,me.current=!0);return}Fe(!0)}}},[tt,gn,Fn,Ie,Ke,Ee,f,x,Se,r,et,Q.length,j,i,g]),v(()=>{(Ie||Ee)&&d.current&&d.current.pause()},[Ie,Ee,d]),v(()=>{const e=d.current;return()=>{rt.current&&clearTimeout(rt.current),e&&!e.ended&&qe(e.currentTime,e.duration||0)}},[qe,d]);const _n=y(e=>{let n=null,s=!0;try{n=localStorage.getItem("tvLastSubtitle"),s=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return Mn(e,{lastKey:n,enabled:s})},[]),Sn=y(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),Xn=y(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const s=e.findIndex(U=>Bn(U)===n);if(s>=0)return s;const c=n.indexOf("|||"),m=c>=0?n.slice(0,c):n,E=c>=0?n.slice(c+3):n,u=e.findIndex(U=>U.language===m||U.label===E);if(u>=0)return u}return Mn(e,{lastKey:null,enabled:!0})},[]),{data:Zn}=Ps(j||void 0),Jn=Me(()=>(Zn?.progress??[]).filter(n=>n.season===i&&(n.completed===!0||n.completed===1||In(n.currentTime,n.duration))).map(n=>String(n.episode)),[Zn,i]),er=Me(()=>Q.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})),[Q]),tr=Me(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Tn=Me(()=>[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]);v(()=>{if(q.length!==0&&!q.some(e=>e.id===h)){const e=q.find(n=>n.tier==="direct")?.id??q[0].id;We(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[q,h]),v(()=>{Ct([])},[h]),v(()=>{if(ye.length!==0&&!ye.includes(ve)){Tt(ye[0]);try{localStorage.setItem("tvServer",ye[0])}catch{}}},[ye,ve]),v(()=>{if(!o){I(null),X([]),Re(""),A(""),de("");return}const e=Number(o),n=R||"tv";I(null),X([]),Re(""),A(""),de("");const s=parseInt(z.current.get("s")||"",10),c=parseInt(z.current.get("e")||"",10);J(isNaN(s)?1:s),K(isNaN(c)?1:c),Oe(0),_t.tv.details.query({type:n,id:String(e)}).then(m=>{const E={id:m.id,title:m.title||"",overview:m.overview||"",vote_average:m.vote_average,year:m.year,poster:m.poster,backdrop:m.backdrop,imdb_id:m.imdb_id||void 0,adult:m.adult,seasons:m.seasons,number_of_seasons:m.number_of_seasons};I(E),E.seasons&&E.seasons.length>0&&isNaN(s)&&J(E.seasons[0].season_number)}).catch(()=>{})},[o,R]),v(()=>{if(!r||!o)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){$([]);return}const n=parseInt(b.get("e")||"",10);_t.tv.episodes.query({id:String(o),season:String(i)}).then(s=>{const c=(s.episodes||[]).map(m=>({episode_number:m.episode_number,name:m.name||"",vote_average:m.vote_average,overview:m.overview||"",still_path:m.still_path||""}));$(c),c.length!==0&&K(m=>!isNaN(n)&&c.some(E=>E.episode_number===n)?n:c.some(E=>E.episode_number===m)?m:c[0].episode_number)}).catch(()=>{})},[r,o,i,b]),v(()=>{if(!M||!r||!o)return;fetch(`/api/tv/embed/${h}/${f?"movie":"tv"}/${o}?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(()=>{})},[h,r,o,i,g,f,M]);const tn=y(async()=>{if(!r||!o||!h||M||r.adult&&!Bt)return;const e=`${j}:${i}:${g}`;Y(!0),A(""),Vt.current.length===0&&(X([]),Oe(0),Ue([]),at([]));try{const n=await G.fetchQuery({queryKey:Jt(i,g),queryFn:()=>en(i,g),staleTime:3e5,gcTime:18e5});if(Mt.current!==e){Y(!1);return}if(Y(!1),!n.valid||!n.sources?.length){A(n.error?`${n.error}`:ye.length>0?`No streams from ${ve}. Try another server.`:"No streams available.");return}X(n.sources),Re(e),n.servers?.length&&Ct(n.servers),Oe(0),n.referer&&Ot(n.referer);const s=n.audioTracks||[];Ue(s),T(s.length>0?Xn(s):0);const c=n.subtitles||[];if(at(c),c.length>0){const u=_n(c);De(u),Sn(u)}else De(-1);const m=f?"movie":"tv",E=o;_t.tv.subtitles.query({type:m,tmdbId:String(E),season:String(i),episode:String(g)}).then(u=>{if(Mt.current!==e)return;const U=Array.isArray(u.subtitles)?u.subtitles:[];U.length!==0&&at(re=>{const C=[...re,...U.filter(Z=>!re.some(he=>he.url===Z.url))];if(re.length===0){const Z=_n(C);De(Z),Sn(Z)}return C})}).catch(()=>{}),A("")}catch{if(Mt.current!==e)return;Y(!1),A("Failed to load streams.")}},[r,o,h,i,g,f,M,Bt,ye,ve,_n,Sn,Xn,j,G,Jt,en]),Lr=y(e=>{Tt(e);try{localStorage.setItem("tvServer",e)}catch{}A("")},[]),Pr=y(e=>{We(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);v(()=>{h&&r&&!M&&tn()},[h,r,tn,M]),v(()=>{if(!d.current)return;if(D.current&&(D.current.destroy(),D.current=null),M||dt){const u=d.current;u&&(u.pause(),u.removeAttribute("src"),u.load());return}let e=!1;if(xe){const u=d.current;return u&&(u.pause(),u.removeAttribute("src"),u.load(),u.src="/av-sync-test.mp4",pt.current||u.play().catch(()=>{})),()=>{e=!0}}if(Mt.current===`${j}:${i}:${g}`&&ne.current==null&&!pt.current)try{const u=d.current;u&&!u.ended&&u.currentTime>1&&(ne.current=u.currentTime)}catch{}const s=!Ce&&Pe===`${j}:${i}:${g}`?dt?"":B[be]?.url||"":"";if(!s){try{d.current?.pause(),d.current?.removeAttribute("src"),d.current?.load()}catch{}return}const c=d.current;c.pause(),c.removeAttribute("src"),c.load(),l.actions.resetMediaState();const m=`/api/tv/stream-proxy?url=${encodeURIComponent(s)}&referer=${encodeURIComponent(it)}`;B[be]?.type==="hls"?(async()=>{const u=await Rs();if(!e)if(u&&u.isSupported()){const U=Ao()||document.body.classList.contains("low-end"),re=U?60:180,C=new u({enableWorker:!0,lowLatencyMode:!1,maxBufferLength:re,maxMaxBufferLength:re+(U?30:60),backBufferLength:U?30:60,maxBufferSize:(U?120:360)*1e3*1e3,fragLoadPolicy:{default:{maxTimeToFirstByteMs:15e3,maxLoadTimeMs:45e3,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:3,retryDelayMs:800,maxRetryDelayMs:6e3}}},manifestLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:25e3,timeoutRetry:{maxNumRetry:1,retryDelayMs:500,maxRetryDelayMs:2e3},errorRetry:{maxNumRetry:2,retryDelayMs:800,maxRetryDelayMs:4e3}}}});D.current=C,C.on(u.Events.ERROR,(N,k)=>{k.fatal&&(A(`Stream failed (${k.details}). Try another source or reload.`),Y(!1),C.destroy(),D.current=null)}),C.loadSource(m),C.attachMedia(c);const Z=()=>{let N=!1,k=0;try{N=localStorage.getItem("tvSubtitlesEnabled")==="true";const P=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(P)&&P>=0&&(k=P)}catch{}return{enabled:N,index:k}},he=()=>{if(typeof C.subtitleTrack!="number")return;if(ie.current.length>0){C.subtitleTrack=-1;return}const N=Array.isArray(C.subtitleTracks)?C.subtitleTracks:[];if(N.length===0){C.subtitleTrack=-1;return}const k=Z();if(k.enabled){const P=k.index<N.length?k.index:0;C.subtitleTrack=P,De(P),mn()}else C.subtitleTrack=-1};Bo(C,u.Events,{getWant:()=>jt.current,onResolve:N=>T(N)}),C.on(u.Events.MANIFEST_PARSED,()=>{he(),_e.current!=null&&(c.currentTime=_e.current,_e.current=null),vt(),!pt.current&&bt.current&&c.play().catch(()=>{})}),C.on(u.Events.SUBTITLE_TRACKS_UPDATED,()=>{he()}),C.on(u.Events.SUBTITLE_TRACK_SWITCH,(N,k)=>{if(ie.current.length>0){if(k.id!==-1)try{C.subtitleTrack=-1}catch{}return}const P=Array.isArray(C.subtitleTracks)?C.subtitleTracks:[];if(P.length!==0){if(k.id===-1){const O=Z();if(O.enabled){const Ve=O.index<P.length?O.index:0;C.subtitleTrack=Ve;return}}De(k.id),mn()}})}else $s(c)&&(c.src=m,_e.current!=null&&(c.currentTime=_e.current,_e.current=null),vt(),!pt.current&&bt.current&&c.play().catch(()=>{A("Failed to play stream. Try another source.")}))})():(c.src=m,_e.current!=null&&(c.currentTime=_e.current,_e.current=null),vt(),!pt.current&&bt.current&&c.play().catch(()=>{A("Failed to play stream. Try another source.")}));const E=()=>{const re=c.error?.code===4?"Video source not supported or not found":"Failed to load video stream";A(`${re}. The source may be invalid or expired. Try switching source or reloading.`),Y(!1)};return c.addEventListener("error",E),()=>{e=!0,c.removeEventListener("error",E)}},[B,Pe,Ce,be,h,it,M,dt,d,_e,xe,j,i,g,vt,mn,l.actions]),v(()=>{if(!tt||Ie||Ee||Ke||Lt||M||xe)return;const e=d.current;!e||!e.paused||e.ended||e.readyState<1||(vt(),e.play().catch(()=>{}))},[tt,Ie,Ee,Ke,Lt,M,xe,vt,d]),v(()=>{const e=D.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=pe)},[pe]),v(()=>{const e=D.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ie.current.length>0||(oe>=0?e.subtitleTrack=oe:e.subtitleTrack=-1)},[oe]),v(()=>{const e=d.current;if(!(!e||M)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ie.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 m=ie.current.indexOf(s),E=s.track;if(E&&m>=0){const u=m===ae.current;E.mode=u&&!un.current?"showing":"hidden"}}),e.appendChild(s),ie.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,h,d]),v(()=>{const e=d.current;if(!e||M)return;const n=D.current;ie.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const s=()=>{const E=Ln(l.state.subtitleFontSize,e.clientHeight||720),u=Math.max(0,Math.min(100,100-l.state.subtitlePosition)),U=()=>{const N=E*16,k=e.videoHeight||e.clientHeight||720,P=e.videoWidth||e.clientWidth||1280;return{step:N*1.3/k*100,chars:Math.max(20,Math.floor(P/(N*.55)))}},re=(N,k)=>{const P=N;P.snapToLines=!1,P.line=k},C=N=>{if(!N.cues)return;Array.from(N.cues).forEach(ge=>re(ge,u));const k=Array.from(N.activeCues??[]);if(k.length<=1){k.forEach(ge=>re(ge,u));return}const{step:P,chars:O}=U();let Ve=u;for(let ge=k.length-1;ge>=0;ge--){const Ye=String(k[ge].text??"").replace(/<[^>]*>/g,"").split(`
3
+ `).reduce((sn,$t)=>sn+Math.max(1,Math.ceil($t.length/O)),0);Ve=Math.max(0,Ve-Ye*P),re(k[ge],Ve),Ve-=P*.4}},Z=ie.current;if(Z.length>0){Z.forEach((N,k)=>{const P=N.track;if(!P)return;const O=k===oe;P.mode=O&&!ce?"showing":"hidden",O&&!ce&&C(P)});return}const he=Array.from(e.textTracks);he.length!==0&&he.forEach((N,k)=>{const P=k===oe;N.mode=P&&!ce?"showing":"hidden",P&&!ce&&C(N)})};s();const c=()=>s();e.textTracks.addEventListener("addtrack",c),e.addEventListener("loadedmetadata",s,{once:!0});const m=window.setTimeout(s,600);return()=>{e.textTracks.removeEventListener("addtrack",c),e.removeEventListener("loadedmetadata",s),window.clearTimeout(m)}},[oe,H,M,h,d,ce,l.state.subtitleFontSize,l.state.subtitlePosition]),v(()=>{if(!ce)return;const e=d.current,n=ut.current;if(!e||!n)return;const s=ue/1e3,c=ht/1e3,m=new Set;let E=[],u=-1,U=-1,re=-1,C=-1,Z=0,he=0,N=!1;const k=()=>{const W=ae.current;if(W<0)return null;const Ge=ie.current;return Ge.length>0?Ge[W]?.track??null:Array.from(e.textTracks)[W]??null},P=(W,Ge)=>{const fe=W.cues;if(!fe||fe.length===0)return Array.from(W.activeCues??[]);let st=0,ot=fe.length;for(;st<ot;){const Ae=st+ot>>>1;fe[Ae].endTime+s<Ge?st=Ae+1:ot=Ae}const Dt=[];for(let Ae=st;Ae<fe.length;Ae++){const on=fe[Ae];if(on.startTime+s>Ge)break;on.endTime+s>=Ge&&Dt.push(on)}return Dt},O=()=>{const W=k(),Ge=e.currentTime-c,fe=W?P(W,Ge):[],st=e.clientWidth,ot=e.clientHeight,Dt=e.videoWidth,Ae=e.videoHeight;if(fe.length===E.length&&fe.every((kn,xn)=>kn===E[xn])&&st===u&&ot===U&&Dt===re&&Ae===C||(E=fe,u=st,U=ot,re=Dt,C=Ae,n.textContent="",fe.length===0))return;const sr={fontSize:Ln(l.state.subtitleFontSize,ot),position:l.state.subtitlePosition,bgOpacity:l.state.subtitleBgOpacity,bgColor:l.state.subtitleBgColor,textColor:l.state.subtitleTextColor,edge:l.state.subtitleEdge,bold:l.state.subtitleBold},Or=ms(sr),Fr=hs(e,sr.position);fe.forEach((kn,xn)=>{const or=String(kn.text??"");if(!gs(or).trim())return;const En=document.createElement("div"),Vr=(fe.length-1-xn)*1.7;En.style.cssText=`${Or}
4
+ bottom: calc(${Fr}px + ${Vr}em);`,En.innerHTML=fs(or),n.appendChild(En)})},Ve=()=>{Array.from(e.textTracks).forEach(W=>{m.has(W)||(m.add(W),W.addEventListener("cuechange",O))})},ge=()=>{Ve(),O()},Cn=()=>{if(N||he)return;const W=()=>{he=0,!(N||e.paused||e.ended)&&(O(),Cn())};he=window.requestAnimationFrame(W)},Ye=e,sn=()=>{Z=0,O(),!N&&Ye.requestVideoFrameCallback&&(Z=Ye.requestVideoFrameCallback(sn))},$t=()=>{O(),Ye.requestVideoFrameCallback?Z||(Z=Ye.requestVideoFrameCallback(sn)):Cn()};Ve(),e.textTracks.addEventListener("addtrack",ge),e.textTracks.addEventListener("removetrack",ge),e.addEventListener("timeupdate",O),e.addEventListener("seeked",O),e.addEventListener("loadedmetadata",O),e.addEventListener("play",$t);const nr=Array.from(e.querySelectorAll("track"));nr.forEach(W=>W.addEventListener("load",O));const rr=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>O());return rr?.observe(e),O(),$t(),()=>{N=!0,m.forEach(W=>W.removeEventListener("cuechange",O)),e.textTracks.removeEventListener("addtrack",ge),e.textTracks.removeEventListener("removetrack",ge),e.removeEventListener("timeupdate",O),e.removeEventListener("seeked",O),e.removeEventListener("loadedmetadata",O),e.removeEventListener("play",$t),nr.forEach(W=>W.removeEventListener("load",O)),rr?.disconnect(),he&&window.cancelAnimationFrame(he),Z&&Ye.cancelVideoFrameCallback&&Ye.cancelVideoFrameCallback(Z),n.textContent=""}},[ce,ue,oe,H,ht,d,l.state.subtitleFontSize,l.state.subtitlePosition,l.state.subtitleBgOpacity,l.state.subtitleBgColor,l.state.subtitleTextColor,l.state.subtitleEdge,l.state.subtitleBold]);const nn=()=>{I(null),X([]),de(""),F(-1)},Rr=y(e=>{J(e),K(1),we(e,1)},[we]),rn=!f&&r?.seasons&&r.seasons.length>1?t("label",{className:p.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:i,onChange:e=>Rr(parseInt(e.target.value,10)||1),className:p.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,yt=y(e=>{const n=parseInt(e,10);if(!isNaN(n)){try{d.current?.pause()}catch{}K(n),we(i,n)}bn(!1)},[i,we,d]);v(()=>{if(f)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(x!=null?yt(String(x)):qr.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[f,x,yt]);const $r=e=>{T(e);try{const s=$e[e];s&&localStorage.setItem("tvLastAudio",Bn(s))}catch{}const n=D.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Dr=e=>{De(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const m=H[e];m&&localStorage.setItem("tvLastSubtitle",Bn(m))}}catch{}const n=d.current,s=D.current;if(s&&typeof s.subtitleTrack=="number"&&Array.isArray(s.subtitleTracks)&&s.subtitleTracks.length>0&&(s.subtitleTrack=ie.current.length>0||e<0?-1:e),!n)return;const c=ie.current;if(c.length>0){c.forEach((m,E)=>{const u=m.track;if(!u)return;const U=E===e;u.mode=U&&!ce?"showing":"hidden"});return}Array.from(n.textTracks).forEach((m,E)=>{const u=E===e;m.mode=u&&!ce?"showing":"hidden"})},Rt=y(()=>{if(!r)return;const e=d.current,n=f?"":`S${String(i).padStart(2,"0")}E${String(g).padStart(2,"0")}`;_t.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(()=>{}),_t.discord.heartbeat.mutate({sessionId:wt.current}).catch(()=>{})},[r,f,i,g,d]);return v(()=>{if(!r)return;Rt();const e=window.setInterval(()=>{const n=d.current;(!n||!n.paused)&&Rt()},15e3);return()=>window.clearInterval(e)},[Rt,r,d]),v(()=>{if(!r||M||Ce||ke||B.length===0)return;const e=d.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,Ce,ke,B,Rt,d]),v(()=>{const e=wt.current,n=()=>Yr(e),s=()=>n();return window.addEventListener("pagehide",s),window.addEventListener("beforeunload",s),()=>{window.removeEventListener("pagehide",s),window.removeEventListener("beforeunload",s),n()}},[]),v(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=f?`${r.title} - dango`:`${r.title} - Season ${i} Episode ${g} - dango`},[r,f,i,g]),v(()=>{if(!r||f)return;const e=new URLSearchParams(b),n=e.get("s"),s=e.get("e"),c=String(i),m=String(g);n===c&&s===m||(e.set("type",b.get("type")||"tv"),e.set("s",c),e.set("e",m),F(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,f,i,g,b,F]),t("div",{className:`${Qe.playerPageLayout} ${Be?Qe.theaterMode:""}`,onClick:yr,children:[Be&&t(ps,{videoRef:d,active:dn.enabled&&!M&&B.length>0&&!ke&&!(r?.adult&&!Bt),settings:dn}),!Be&&t("aside",{className:Qe.episodeSidebar,children:r?f?t("div",{className:p.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:p.sidebarPosterMeta,children:[t("strong",{children:r.title}),t("span",{children:r.year})]})]}):t(bs,{episodes:er,currentEpisode:String(g),watchedEpisodes:Jn,onEpisodeClick:yt,header:rn}):f?t("div",{className:p.statusMsg,children:[t(V,{name:"spinner",className:p.spinner})," Loading..."]}):t(vs,{variant:"sidebar"})}),t("div",{className:Qe.playerMain,children:[r&&t("div",{className:p.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!Bt?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:M&&St?t("iframe",{src:St,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!M&&Ft?t("iframe",{src:Ft,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!M&&(B.length>0||Ce)?t(Le,{children:[ke&&t(lr,{error:ke,onRetry:tn}),t(Eo,{player:l,title:r.title,episodeLabel:f?void 0:`S${i} E${g}`,audioTracks:$e,selectedAudioTrack:pe,onAudioTrackChange:$r,subtitles:H,selectedSubtitle:oe,onSubtitleChange:Dr,streams:B,resolutionIdx:be,onResolutionChange:Oe,onBack:nn,videoDelayEnabled:mt,onVideoDelayToggle:xt,videoDelayMs:Wt,onVideoDelayChange:Ze,onCalibrateAvSync:L,subtitleDelayMs:ue,onSubtitleDelayChange:Ut,showNextEpisodeButton:fr&&!Ie&&!Ee&&!Ke,onNextEpisode:Gn,isLoading:Ce,isTheaterMode:Be,onTheaterModeToggle:vn,ambientSettings:dn,onAmbientChange:dr,children:[t("video",{ref:d,autoPlay:tt&&!Lt,playsInline:!0,disablePictureInPicture:!0,className:`${p.video} ${It?p.videoHidden:""}`,onTimeUpdate:kr,onEnded:()=>{xe||xr()},onPlay:Er,onPause:Nr,onSeeked:()=>{Kn.current=Date.now(),Pt()},onLoadedMetadata:Ir,onVolumeChange:l.actions.onVolumeChange,onWaiting:l.actions.onWaiting,onPlaying:l.actions.onPlaying,onCanPlay:l.actions.onCanPlay,onContextMenu:e=>e.preventDefault(),onError:()=>{A("Video failed to load. Try another server or reload."),Y(!1)}}),t("canvas",{ref:kt,className:`${p.delayCanvas} ${It?p.delayCanvasActive:""}`}),ce&&t("div",{ref:ut,className:p.subtitleOverlay}),t(ys,{isOpen:zt,ms:Wt,onChange:Ze,onApply:le,onClose:te,testClipActive:xe,onTestClip:Ht})]})]}):ke&&!M?t(lr,{error:ke,onRetry:tn}):null}),!Be&&r&&t(_s,{}),!Be&&rn&&t("div",{className:p.mobileSeasonRow,children:rn}),!Be&&r&&t("div",{className:p.providerSelectWrap,children:t("label",{className:p.controlLabel,children:["Source",t("select",{value:h,onChange:e=>Pr(e.target.value),className:p.select,disabled:q.length===0,children:Xe?t("option",{value:"",children:"Loading..."}):q.length===0?t("option",{value:"",children:"No providers available"}):t(Le,{children:[S.length>0&&t("optgroup",{label:"Direct HLS",children:S.map(e=>t("option",{value:e.id,children:e.label},e.id))}),ee.length>0&&t("optgroup",{label:"Embeds",children:ee.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),!Be&&r&&!M&&(Ce?t("div",{className:p.sourceLoader,children:t("div",{className:p.ringSpinner})}):t(Io,{servers:ye,selectedServer:ve,onServerSelect:Lr})),!Be&&r&&t("div",{className:Qe.playerInfoContainer,children:[t("div",{className:Qe.playerInfoHeader,children:[t("div",{className:Qe.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:Qe.videoTitleSection,children:[t("div",{className:Te.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:p.meta,children:[t("span",{className:p.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:p.rating,children:[t(V,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${p.typeBadge} ${p[f?"movie":"tv"]}`,children:f?"Movie":"TV Show"})]}),tr.length>0&&t("div",{className:p.genreRow,children:tr.map(e=>t("span",{className:p.genreChip,children:e},e))}),Tn.length>0&&t("div",{className:p.metaRow,children:Tn.map((e,n)=>t("span",{children:[e,n<Tn.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:Te.controls,children:[t("button",{className:`${Te.watchlistBtn} ${Yt?Te.inList:""}`,onClick:gr,disabled:hr,type:"button",children:[Yt?t(V,{name:"check",size:14}):t(V,{name:"plus",size:14}),Yt?"In Watchlist":"Add to Watchlist"]}),!f&&t(Le,{children:[t("button",{className:`${Te.watchlistBtn}`,onClick:()=>hn!=null&&yt(String(hn)),disabled:hn==null,type:"button",children:[t(V,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${Te.watchlistBtn}`,onClick:()=>x!=null&&yt(String(x)),disabled:x==null,type:"button",children:["Next EP",t(V,{name:"chevron-right",size:14})]}),!f&&t("button",{className:`${Te.watchlistBtn} ${Te.modeToggleBtn} ${ft?Te.modeToggleActive:""}`,onClick:()=>Tr(!ft),type:"button","aria-pressed":ft,children:ft?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),_r&&t("button",{className:`${Te.watchlistBtn}`,onClick:()=>bn(!0),type:"button",children:[t(V,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:Te.descriptionSection,children:[t("h3",{children:"Synopsis"}),t(Os,{text:r.overview,emptyText:"No description available."})]}),t("button",{className:Te.detailsToggleBtn,onClick:()=>br(!Zt),type:"button",children:[Zt?t(V,{name:"chevron-up"}):t(V,{name:"chevron-down"}),Zt?"Hide Details":"Show Details"]}),Zt&&t("div",{className:p.detailGrid,children:[r.first_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:f?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:p.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:p.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:p.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:p.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:p.imdbLink,children:"View on IMDb"})]})]})]}),!f&&t(Ss,{isOpen:vr,onClose:()=>bn(!1),episodes:er,currentEpisode:String(g),watchedEpisodes:Jn,onEpisodeClick:yt,header:rn}),r?.adult&&!Bt&&t(Nn,{isOpen:!0,title:"Content Warning",onClose:nn,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(je,{variant:"secondary",onClick:nn,children:"Go Back"}),t(je,{onClick:ur,children:"I'm 18+, Continue"})]})]})}),t(Ts,{isOpen:Ie,onClose:Yn,title:"Resume Watching",message:t(Le,{children:["You were at ",t("strong",{children:cn(gt)})]}),restartLabel:"Start from Beginning",onResume:Br,onRestart:Yn}),t(Nn,{isOpen:Ee,onClose:wr,title:f?"Movie Completed":"Episode Completed",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:f?t(Le,{children:"You've already watched this movie."}):t(Le,{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(je,{variant:"secondary",onClick:Ar,children:"Replay"}),x!=null?t(je,{onClick:Gn,children:["Watch EP ",x]}):Se!=null?t(je,{onClick:Qn,children:["Start Season ",Se]}):null]})]})}),t(Nn,{isOpen:Ke,onClose:()=>nt(!1),title:f?"Movie Completed!":Se!=null?"Season Complete!":"Show Completed!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(V,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:pr}),t("p",{style:{color:"var(--text-secondary)"},children:f?"You finished this movie!":Se!=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(je,{variant:"secondary",onClick:()=>nt(!1),children:"Close"}),Se!=null?t(je,{onClick:Qn,children:["Start Season ",Se]}):t(Le,{children:[t(je,{onClick:()=>{nt(!1),nn()},children:"Back to Details"}),Yt&&t(je,{onClick:Mr,disabled:qt.isPending,children:qt.isPending?"Saving...":"Move to Completed"})]})]})]})}),!r&&t("div",{className:p.statusMsg,children:[t(V,{name:"spinner",className:p.spinner})," Loading..."]})]})]})};export{qa 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-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
+ 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-D46PzcOL.js";import{n as H,d as J,e as K,f as Q,t as I}from"./useTvLibrary-340c9BPM.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-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
+ 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-340c9BPM.js";import{t as M}from"./index-D46PzcOL.js";import{p as a,a as A}from"./MediaCard-C6sSx_z5.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-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
+ 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-B3Pkkwtb.js";import{a as se,T as le}from"./useTv-HLJmTVvH.js";import{u as ie,N as oe,B as x}from"./index-D46PzcOL.js";import{E as ce}from"./ErrorMessage-DAxegITP.js";import{s as r}from"./Search.module-CMEai-B-.js";import"./MediaCard-C6sSx_z5.js";import"./vendor-ui-3qrARCPr.js";import"./useIsMobile-Dvx1uJ82.js";import"./TvPopup-DNQkT6qy.js";import"./useTvLibrary-340c9BPM.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-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
+ 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-C6sSx_z5.js";import{L as _}from"./LibraryListPage-D_MD0Lhp.js";import{R as K}from"./ResetProgressModal-C7FNcb2X.js";import{T as O}from"./TvPopup-DNQkT6qy.js";import{g as u}from"./index-D46PzcOL.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-340c9BPM.js";import"./vendor-ui-3qrARCPr.js";import"./useIsMobile-Dvx1uJ82.js";import"./vendor-icons-DrybRNxP.js";import"./SkeletonGrid-B3Pkkwtb.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-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
+ 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-D46PzcOL.js";import{I as p}from"./vendor-icons-DrybRNxP.js";import{A as dt}from"./AnimeCard-DL4pRPH6.js";import{P as be,S as ut}from"./SkeletonGrid-B3Pkkwtb.js";import{E as mt}from"./ErrorMessage-DAxegITP.js";import{s as a}from"./Watchlist.module-XGtVQr1d.js";import"./useAnimeInfoData-BF4WF2s4.js";import"./QueueOptionsButton-BZ5BUytu.js";import"./vendor-ui-3qrARCPr.js";import"./MediaCard-C6sSx_z5.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-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};
1
+ import{_ as n}from"./index-D46PzcOL.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};