@serifpersia/dango 3.6.0 → 3.6.1

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 (75) hide show
  1. package/README.md +45 -13
  2. package/client/dist/assets/{AnimeCard-CEDL_2lC.js → AnimeCard-DbrG4Bo-.js} +1 -1
  3. package/client/dist/assets/AnimeInfo-BivVqWcB.css +1 -0
  4. package/client/dist/assets/AnimeInfo-CgSQGjef.js +1 -0
  5. package/client/dist/assets/{AnimeInfoPage-a1-1F_la.js → AnimeInfoPage-DSybdvf_.js} +2 -2
  6. package/client/dist/assets/{Asmr-CCMuiaoR.js → Asmr-DFFV-7y4.js} +1 -1
  7. package/client/dist/assets/{AsmrResetProgressModal-CiwgOhH2.js → AsmrResetProgressModal-Brdfu_22.js} +1 -1
  8. package/client/dist/assets/AvSyncCalibrator-DBBUzoHn.js +10 -0
  9. package/client/dist/assets/AvSyncCalibrator-ZSpMgUid.css +1 -0
  10. package/client/dist/assets/Home-DeY8zvfI.css +1 -0
  11. package/client/dist/assets/{Home-BmTp0Dx7.js → Home-DjGl-3os.js} +1 -1
  12. package/client/dist/assets/{Insights-C89oz_3z.js → Insights-4O52Z1t2.js} +1 -1
  13. package/client/dist/assets/{LibraryListPage-DOSPLTiR.js → LibraryListPage-Z0w_rmHP.js} +1 -1
  14. package/client/dist/assets/{ListeningList-IHSyufXX.js → ListeningList-DjbzDs1E.js} +1 -1
  15. package/client/dist/assets/{Manga-H4hG-3K8.js → Manga-BRIDluzF.js} +1 -1
  16. package/client/dist/assets/{MangaInfoPage-Bjz2NwLc.js → MangaInfoPage-Q4CjEGJH.js} +1 -1
  17. package/client/dist/assets/{MangaReadPage-DZakUml0.js → MangaReadPage-BbJK5FY6.js} +1 -1
  18. package/client/dist/assets/{MangaResetProgressModal-kbpad7Vl.js → MangaResetProgressModal-BCFPXDF6.js} +1 -1
  19. package/client/dist/assets/{Mature-DfODnRR8.js → Mature-DjQzs66p.js} +1 -1
  20. package/client/dist/assets/{MediaCard-fN3GQyTJ.js → MediaCard-DedwE5DX.js} +1 -1
  21. package/client/dist/assets/{Music-CFVwJyIo.js → Music-z2RkiMDf.js} +1 -1
  22. package/client/dist/assets/{OptionListMenu-BjoortST.js → OptionListMenu-CetjZizt.js} +1 -1
  23. package/client/dist/assets/Player-DCB994_8.css +1 -0
  24. package/client/dist/assets/{Player-DMeWl-5s.js → Player-DD-9SgWU.js} +6 -6
  25. package/client/dist/assets/PlayerSettings-BXGe3F5k.css +1 -0
  26. package/client/dist/assets/{PlayerSettings-DaG98x1K.js → PlayerSettings-ne_DQSTl.js} +1 -1
  27. package/client/dist/assets/{QueueOptionsButton-MpSKva6y.js → QueueOptionsButton-CIKT4YcD.js} +1 -1
  28. package/client/dist/assets/{QueueRail-CtLxXvR_.js → QueueRail-DPclldS0.js} +1 -1
  29. package/client/dist/assets/{Radio-D1zoU38z.js → Radio-aeqPTMht.js} +1 -1
  30. package/client/dist/assets/{ReadingList-C_oRyOHJ.js → ReadingList-p6G7NHtC.js} +1 -1
  31. package/client/dist/assets/{ResetProgressModal-CpbOV9Sk.js → ResetProgressModal-B7UuuL3X.js} +1 -1
  32. package/client/dist/assets/{Search-Cs8U1ZGO.js → Search-BzyHVByR.js} +1 -1
  33. package/client/dist/assets/Settings-DMmtLUsL.js +21 -0
  34. package/client/dist/assets/{SkeletonGrid-gCly-9x7.js → SkeletonGrid-B5JXhZO4.js} +1 -1
  35. package/client/dist/assets/Trackers-tLL1afjB.js +2 -0
  36. package/client/dist/assets/Tv-Bdruknna.css +1 -0
  37. package/client/dist/assets/Tv-CluLN4KA.js +4 -0
  38. package/client/dist/assets/{TvInfo-CfYJPE-C.js → TvInfo-DmrBLjgK.js} +1 -1
  39. package/client/dist/assets/{TvPopup-BBIe0fHF.js → TvPopup-D1mSlOZt.js} +1 -1
  40. package/client/dist/assets/{TvSearch-Bfp_r265.js → TvSearch-BGQRUq9E.js} +1 -1
  41. package/client/dist/assets/{TvWatchlist-DNcVUBXZ.js → TvWatchlist-DdLkpeQT.js} +1 -1
  42. package/client/dist/assets/{Watchlist-DnC7uDc4.js → Watchlist-BObmM6QB.js} +1 -1
  43. package/client/dist/assets/{hls-B9wsDt6U.js → hls-qCuNYJym.js} +1 -1
  44. package/client/dist/assets/index-B4AdKbhW.js +178 -0
  45. package/client/dist/assets/index-D0Haw_Zl.css +1 -0
  46. package/client/dist/assets/{useAnimeInfoData-Dpkjj68s.js → useAnimeInfoData-CSnwUBuU.js} +1 -1
  47. package/client/dist/assets/{useAsmr-QqLyjBbR.js → useAsmr-BKAaWEXn.js} +1 -1
  48. package/client/dist/assets/{useAsmrPopup-CnYAAhDj.js → useAsmrPopup-DDLRBLzz.js} +1 -1
  49. package/client/dist/assets/{useMangaLibrary-CxRsa2lr.js → useMangaLibrary-C6XEMuSr.js} +1 -1
  50. package/client/dist/assets/{useMangaPopup-CXnu2h4Y.js → useMangaPopup-wfCJubPD.js} +1 -1
  51. package/client/dist/assets/{useProviders-DDPMV3HX.js → useProviders-C7jrBgxf.js} +1 -1
  52. package/client/dist/assets/{useTv-BkZAFGaD.js → useTv-DM5KtzEc.js} +1 -1
  53. package/client/dist/assets/{useTvLibrary-CL3kMD_c.js → useTvLibrary-73NkS_5R.js} +1 -1
  54. package/client/dist/index.html +2 -2
  55. package/client/dist/repo_logo.svg +19 -39
  56. package/orchestrator.js +107 -8
  57. package/package.json +2 -2
  58. package/server/dist/app-hono.js +13 -8
  59. package/server/dist/config.js +3 -2
  60. package/server/dist/hono/auth.js +0 -7
  61. package/server/dist/trpc/routers/auth.js +16 -0
  62. package/server/package.json +1 -1
  63. package/client/dist/assets/AnimeInfo-BFWtHlPC.css +0 -1
  64. package/client/dist/assets/AnimeInfo-mVGUoF9q.js +0 -1
  65. package/client/dist/assets/AvSyncCalibrator-PqA6B5Ey.js +0 -10
  66. package/client/dist/assets/AvSyncCalibrator-ieaRTs3u.css +0 -1
  67. package/client/dist/assets/Home-B_q2l74h.css +0 -1
  68. package/client/dist/assets/Player-DBLl-bj_.css +0 -1
  69. package/client/dist/assets/PlayerSettings-Bj6SsmQ2.css +0 -1
  70. package/client/dist/assets/Settings-BgcOeTlE.js +0 -21
  71. package/client/dist/assets/Trackers-DoHHWI2D.js +0 -2
  72. package/client/dist/assets/Tv-BlVIanQL.css +0 -1
  73. package/client/dist/assets/Tv-DhLdh3WF.js +0 -4
  74. package/client/dist/assets/index-C6HMOCqo.css +0 -1
  75. package/client/dist/assets/index-CfgPGaUO.js +0 -178
@@ -1 +1 @@
1
- import{h as R,p as me,a as ge,d as o,A as ve,g as fe,u as a}from"./vendor-core-DfaOB3Rn.js";import{I as L}from"./vendor-icons-DrybRNxP.js";import{P as ee,S as Le}from"./SkeletonGrid-gCly-9x7.js";import{A as Ae}from"./AnimeCard-CEDL_2lC.js";import{t as be,u as ye,v as Se,L as ae,B as w,N as Ne}from"./index-CfgPGaUO.js";import{E as Ce}from"./ErrorMessage-DAxegITP.js";import{s as t}from"./Search.module-CMEai-B-.js";import"./useAnimeInfoData-Dpkjj68s.js";import"./vendor-query-BBT5_sHx.js";import"./QueueOptionsButton-MpSKva6y.js";import"./vendor-ui-3qrARCPr.js";import"./MediaCard-fN3GQyTJ.js";import"./useIsMobile-Dvx1uJ82.js";const Te=[{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:"Mature"}],Ee=[{value:"ALL",label:"All Seasons"},{value:"Winter",label:"Winter"},{value:"Spring",label:"Spring"},{value:"Summer",label:"Summer"},{value:"Fall",label:"Fall"}],Ie=[{value:"ALL",label:"All Countries"},{value:"JP",label:"Japan"},{value:"CN",label:"China"}],De=[{value:"POPULARITY_DESC",label:"Popularity"},{value:"TRENDING_DESC",label:"Trending"},{value:"SCORE_DESC",label:"Score"},{value:"START_DATE_DESC",label:"Newest"},{value:"START_DATE_ASC",label:"Oldest"},{value:"EPISODES_DESC",label:"Most Episodes"},{value:"FAVOURITES_DESC",label:"Favourites"}],Pe=[{value:"RELEASING",label:"Currently Airing"},{value:"FINISHED",label:"Finished"},{value:"NOT_YET_RELEASED",label:"Not Yet Released"},{value:"CANCELLED",label:"Cancelled"},{value:"HIATUS",label:"Hiatus"}];function Ve(){R(()=>{document.title="Search - dango"},[]);const[r,te]=me(),le=ge(),[h,k]=o(r.get("query")||""),[p,_]=o(parseInt(r.get("page")||"1")),[u,A]=o(r.get("type")||"ALL"),[m,b]=o(r.get("season")||"ALL"),[g,y]=o(r.get("year")||"ALL"),[B,E]=o(r.get("country")||"ALL"),[G,ne]=o(r.get("provider")||"anilist"),[Y,I]=o(r.get("sortBy")||"POPULARITY_DESC"),[U,D]=o(r.get("status")||""),[S,re]=o(!1),[se,F]=o(null);R(()=>{let e=!1;return be.data.anilistStatus.query().then(n=>{e||F(n.available)}).catch(()=>{e||F(!0)}),()=>{e=!0}},[]);const{lowEndMode:ie}=ye(),P=ve(null),{data:oe}=Se(),M=oe?.genres||[],[v,N]=o(()=>{const e={},n=r.get("genres")?.split(",").map(l=>l.trim()).filter(Boolean)||[],s=r.get("excludeGenres")?.split(",").map(l=>l.trim()).filter(Boolean)||[];return n.forEach(l=>l&&(e[l]="include")),s.forEach(l=>l&&(e[l]="exclude")),e}),$=new URLSearchParams(r);$.delete("page");const V=$.toString(),{data:f=[],isLoading:C,isError:ce,error:ue}=ae(V,p,14),{data:j}=ae(V,p+1,14),[x,de]=o(!1),T=fe.useMemo(()=>G==="anilist"&&u==="ADULT"||x?f:f.filter(e=>!(e.isAdult||e.rating==="R+"||e.rating==="Rx"||e.rating?.includes("17+"))),[f,x,G,u]);R(()=>{k(r.get("query")||""),A(r.get("type")||"ALL"),b(r.get("season")||"ALL"),y(r.get("year")||"ALL"),E(r.get("country")||"ALL"),ne(r.get("provider")||"anilist"),I(r.get("sortBy")||"POPULARITY_DESC"),D(r.get("status")||""),_(parseInt(r.get("page")||"1"));const e={},n=r.get("genres")?.split(",").map(l=>l.trim()).filter(Boolean)||[],s=r.get("excludeGenres")?.split(",").map(l=>l.trim()).filter(Boolean)||[];n.forEach(l=>l&&(e[l]="include")),s.forEach(l=>l&&(e[l]="exclude")),N(e)},[r]);const c=(e=1,n={})=>{Ne();const s=n.type??u,l=n.status??U,q=n.season??m,H=n.year??g,J=n.country??B,K=n.sort??Y,Q=n.genreState??v,pe=n.showMature??x,i=new URLSearchParams;h.trim()&&i.set("query",h.trim()),s!=="ALL"&&i.set("type",s),l&&i.set("status",l),q!=="ALL"&&i.set("season",q),H!=="ALL"&&i.set("year",H),J!=="ALL"&&i.set("country",J),K!=="POPULARITY_DESC"&&i.set("sortBy",K);const X=Object.entries(Q).filter(([,d])=>d==="include").map(([d])=>d),Z=Object.entries(Q).filter(([,d])=>d==="exclude").map(([d])=>d);X.length>0&&i.set("genres",X.join(",")),Z.length>0&&i.set("excludeGenres",Z.join(",")),s!=="ADULT"&&!pe&&i.set("adult","false"),i.set("provider","anilist"),e>1&&i.set("page",e.toString()),te(i),e!==p&&_(e)},W=e=>{if(c(e),P.current){const n=P.current.getBoundingClientRect().top+window.scrollY-100;window.scrollTo({top:n,behavior:"smooth"})}},O=new Date().getFullYear(),he=[{value:"ALL",label:"All Years"},...Array.from({length:O-1980+1},(e,n)=>({value:String(O-n),label:String(O-n)}))],z=f.length>=14&&j&&j.length>0;return a("div",{className:"page-container",children:[a("div",{className:t.header,children:[a("h1",{className:t.pageTitle,children:"Search Anime"}),a("p",{className:t.pageSubtitle,children:"Search through thousands of titles and discover your next favorite"})]}),a("div",{className:t.filterContainer,children:[a("div",{className:t.searchBarWrapper,children:[a("div",{className:t.inputIconWrapper,children:[a(L,{name:"search",className:t.searchIcon}),a("input",{type:"text","data-virtual-keyboard":"true",className:t.searchInput,placeholder:"Search by title, character, or studio...",value:h,onInput:e=>k(e.currentTarget.value),onKeyDown:e=>e.key==="Enter"&&c()})]}),a("div",{className:t.searchActions,children:[a(w,{onClick:()=>c(),className:t.searchBtn,children:"Search"}),a("button",{className:`${t.filterToggleBtn} ${S?t.active:""}`,onClick:()=>re(!S),children:[a(L,{name:"filter",size:14}),a("span",{children:"Filters"}),S?a(L,{name:"chevron-up",size:12}):a(L,{name:"chevron-down",size:12})]})]})]}),a("div",{className:`${t.advancedFilters} ${S?t.show:""}`,children:[a("div",{className:t.filterDivider}),a("div",{className:t.filterGrid,children:[a("div",{className:t.filterItem,children:[a("label",{children:"Type"}),a("select",{value:u,onChange:e=>{if(e.currentTarget.value==="ADULT"){le("/mature?provider=mal");return}A(e.currentTarget.value)},children:Te.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Status"}),a("select",{value:U,onChange:e=>D(e.currentTarget.value),children:[a("option",{value:"",children:"All Status"}),Pe.map(e=>a("option",{value:e.value,children:e.label},e.value))]})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Season"}),a("select",{value:m,onChange:e=>b(e.currentTarget.value),children:Ee.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Year"}),a("select",{value:g,onChange:e=>y(e.currentTarget.value),children:he.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:["Country",se===!1&&a("span",{style:{display:"block",fontSize:"0.75rem",color:"var(--text-muted)",fontWeight:400},children:"AniList only — ignored by fallback providers"})]}),a("select",{value:B,onChange:e=>E(e.currentTarget.value),children:Ie.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Sort By"}),a("select",{value:Y,onChange:e=>I(e.currentTarget.value),children:De.map(e=>a("option",{value:e.value,children:e.label},e.value))})]})]}),M.length>0&&a("div",{className:t.genreSection,children:[a("label",{className:t.genreLabel,children:"Genres"}),a("div",{className:t.genreContainer,children:M.map(e=>a("button",{className:`${t.genreButton} ${t[v[e]||""]}`,onClick:()=>{N(n=>{const s=n[e],l={...n};return s==="include"?l[e]="exclude":s==="exclude"?delete l[e]:l[e]="include",l})},children:e},e))})]}),a("div",{className:t.filterActions,children:[a(w,{variant:"secondary",onClick:()=>{N({}),A("ALL"),b("ALL"),y("ALL"),E("ALL"),I("POPULARITY_DESC"),D(""),de(!1),c(1,{type:"ALL",status:"",season:"ALL",year:"ALL",country:"ALL",sort:"POPULARITY_DESC",genreState:{},showMature:!1})},children:"Reset All"}),a(w,{onClick:()=>c(),className:t.applyBtn,children:"Apply Filters"})]})]})]}),ce&&a(Ce,{message:ue?.message||"Error"}),(u!=="ALL"||m!=="ALL"||g!=="ALL"||Object.keys(v).length>0)&&a("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",alignItems:"center",marginBottom:"1.5rem"},children:[a("span",{style:{fontSize:"0.8rem",color:"var(--text-muted)",fontWeight:600},children:"Active Filters:"}),u!=="ALL"&&a("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Type: ",u,a("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),A("ALL"),c(1,{type:"ALL"})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),m!=="ALL"&&a("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Season: ",m,a("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),b("ALL"),c(1,{season:"ALL"})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),g!=="ALL"&&a("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Year: ",g,a("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),y("ALL"),c(1,{year:"ALL"})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),Object.entries(v).map(([e,n])=>a("span",{className:`badge ${n==="include"?"badge-primary":"badge-danger"}`,style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:[n==="include"?`+ ${e}`:`- ${e}`,a("button",{onClick:s=>{s.stopPropagation(),s.preventDefault();const l={...v};delete l[e],N(l),c(1,{genreState:l})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]},e))]}),a("div",{className:t.resultsHeader,ref:P,children:[a("h2",{className:t.resultsTitle,children:h?`Search Results for "${h}"`:"Discover Anime"}),T.length>0&&a(ee,{page:p,canGoNext:z,onChange:W,isLoading:C})]}),a("div",{className:`${t.resultsGrid} ${ie?t.lowEnd:""}`,children:C?a(Le,{}):T.map(e=>a(Ae,{anime:e},e._id))}),!C&&T.length===0&&a("div",{className:t.noResults,children:[a(L,{name:"search",size:48,className:t.noResultsIcon}),a("h3",{children:"No results found"}),a("p",{children:"Try adjusting your search or filters to find what you're looking for."})]}),T.length>0&&a("div",{className:t.bottomPagination,children:a(ee,{page:p,canGoNext:z,onChange:W,isLoading:C,variant:"labeled"})})]})}export{Ve as default};
1
+ import{h as R,p as me,a as ge,d as o,A as ve,g as fe,u as a}from"./vendor-core-DfaOB3Rn.js";import{I as L}from"./vendor-icons-DrybRNxP.js";import{P as ee,S as Le}from"./SkeletonGrid-B5JXhZO4.js";import{A as Ae}from"./AnimeCard-DbrG4Bo-.js";import{t as be,u as ye,v as Se,L as ae,B as w,N as Ne}from"./index-B4AdKbhW.js";import{E as Ce}from"./ErrorMessage-DAxegITP.js";import{s as t}from"./Search.module-CMEai-B-.js";import"./useAnimeInfoData-CSnwUBuU.js";import"./vendor-query-BBT5_sHx.js";import"./QueueOptionsButton-CIKT4YcD.js";import"./vendor-ui-3qrARCPr.js";import"./MediaCard-DedwE5DX.js";import"./useIsMobile-Dvx1uJ82.js";const Te=[{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:"Mature"}],Ee=[{value:"ALL",label:"All Seasons"},{value:"Winter",label:"Winter"},{value:"Spring",label:"Spring"},{value:"Summer",label:"Summer"},{value:"Fall",label:"Fall"}],Ie=[{value:"ALL",label:"All Countries"},{value:"JP",label:"Japan"},{value:"CN",label:"China"}],De=[{value:"POPULARITY_DESC",label:"Popularity"},{value:"TRENDING_DESC",label:"Trending"},{value:"SCORE_DESC",label:"Score"},{value:"START_DATE_DESC",label:"Newest"},{value:"START_DATE_ASC",label:"Oldest"},{value:"EPISODES_DESC",label:"Most Episodes"},{value:"FAVOURITES_DESC",label:"Favourites"}],Pe=[{value:"RELEASING",label:"Currently Airing"},{value:"FINISHED",label:"Finished"},{value:"NOT_YET_RELEASED",label:"Not Yet Released"},{value:"CANCELLED",label:"Cancelled"},{value:"HIATUS",label:"Hiatus"}];function Ve(){R(()=>{document.title="Search - dango"},[]);const[r,te]=me(),le=ge(),[h,k]=o(r.get("query")||""),[p,_]=o(parseInt(r.get("page")||"1")),[u,A]=o(r.get("type")||"ALL"),[m,b]=o(r.get("season")||"ALL"),[g,y]=o(r.get("year")||"ALL"),[B,E]=o(r.get("country")||"ALL"),[G,ne]=o(r.get("provider")||"anilist"),[Y,I]=o(r.get("sortBy")||"POPULARITY_DESC"),[U,D]=o(r.get("status")||""),[S,re]=o(!1),[se,F]=o(null);R(()=>{let e=!1;return be.data.anilistStatus.query().then(n=>{e||F(n.available)}).catch(()=>{e||F(!0)}),()=>{e=!0}},[]);const{lowEndMode:ie}=ye(),P=ve(null),{data:oe}=Se(),M=oe?.genres||[],[v,N]=o(()=>{const e={},n=r.get("genres")?.split(",").map(l=>l.trim()).filter(Boolean)||[],s=r.get("excludeGenres")?.split(",").map(l=>l.trim()).filter(Boolean)||[];return n.forEach(l=>l&&(e[l]="include")),s.forEach(l=>l&&(e[l]="exclude")),e}),$=new URLSearchParams(r);$.delete("page");const V=$.toString(),{data:f=[],isLoading:C,isError:ce,error:ue}=ae(V,p,14),{data:j}=ae(V,p+1,14),[x,de]=o(!1),T=fe.useMemo(()=>G==="anilist"&&u==="ADULT"||x?f:f.filter(e=>!(e.isAdult||e.rating==="R+"||e.rating==="Rx"||e.rating?.includes("17+"))),[f,x,G,u]);R(()=>{k(r.get("query")||""),A(r.get("type")||"ALL"),b(r.get("season")||"ALL"),y(r.get("year")||"ALL"),E(r.get("country")||"ALL"),ne(r.get("provider")||"anilist"),I(r.get("sortBy")||"POPULARITY_DESC"),D(r.get("status")||""),_(parseInt(r.get("page")||"1"));const e={},n=r.get("genres")?.split(",").map(l=>l.trim()).filter(Boolean)||[],s=r.get("excludeGenres")?.split(",").map(l=>l.trim()).filter(Boolean)||[];n.forEach(l=>l&&(e[l]="include")),s.forEach(l=>l&&(e[l]="exclude")),N(e)},[r]);const c=(e=1,n={})=>{Ne();const s=n.type??u,l=n.status??U,q=n.season??m,H=n.year??g,J=n.country??B,K=n.sort??Y,Q=n.genreState??v,pe=n.showMature??x,i=new URLSearchParams;h.trim()&&i.set("query",h.trim()),s!=="ALL"&&i.set("type",s),l&&i.set("status",l),q!=="ALL"&&i.set("season",q),H!=="ALL"&&i.set("year",H),J!=="ALL"&&i.set("country",J),K!=="POPULARITY_DESC"&&i.set("sortBy",K);const X=Object.entries(Q).filter(([,d])=>d==="include").map(([d])=>d),Z=Object.entries(Q).filter(([,d])=>d==="exclude").map(([d])=>d);X.length>0&&i.set("genres",X.join(",")),Z.length>0&&i.set("excludeGenres",Z.join(",")),s!=="ADULT"&&!pe&&i.set("adult","false"),i.set("provider","anilist"),e>1&&i.set("page",e.toString()),te(i),e!==p&&_(e)},W=e=>{if(c(e),P.current){const n=P.current.getBoundingClientRect().top+window.scrollY-100;window.scrollTo({top:n,behavior:"smooth"})}},O=new Date().getFullYear(),he=[{value:"ALL",label:"All Years"},...Array.from({length:O-1980+1},(e,n)=>({value:String(O-n),label:String(O-n)}))],z=f.length>=14&&j&&j.length>0;return a("div",{className:"page-container",children:[a("div",{className:t.header,children:[a("h1",{className:t.pageTitle,children:"Search Anime"}),a("p",{className:t.pageSubtitle,children:"Search through thousands of titles and discover your next favorite"})]}),a("div",{className:t.filterContainer,children:[a("div",{className:t.searchBarWrapper,children:[a("div",{className:t.inputIconWrapper,children:[a(L,{name:"search",className:t.searchIcon}),a("input",{type:"text","data-virtual-keyboard":"true",className:t.searchInput,placeholder:"Search by title, character, or studio...",value:h,onInput:e=>k(e.currentTarget.value),onKeyDown:e=>e.key==="Enter"&&c()})]}),a("div",{className:t.searchActions,children:[a(w,{onClick:()=>c(),className:t.searchBtn,children:"Search"}),a("button",{className:`${t.filterToggleBtn} ${S?t.active:""}`,onClick:()=>re(!S),children:[a(L,{name:"filter",size:14}),a("span",{children:"Filters"}),S?a(L,{name:"chevron-up",size:12}):a(L,{name:"chevron-down",size:12})]})]})]}),a("div",{className:`${t.advancedFilters} ${S?t.show:""}`,children:[a("div",{className:t.filterDivider}),a("div",{className:t.filterGrid,children:[a("div",{className:t.filterItem,children:[a("label",{children:"Type"}),a("select",{value:u,onChange:e=>{if(e.currentTarget.value==="ADULT"){le("/mature?provider=mal");return}A(e.currentTarget.value)},children:Te.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Status"}),a("select",{value:U,onChange:e=>D(e.currentTarget.value),children:[a("option",{value:"",children:"All Status"}),Pe.map(e=>a("option",{value:e.value,children:e.label},e.value))]})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Season"}),a("select",{value:m,onChange:e=>b(e.currentTarget.value),children:Ee.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Year"}),a("select",{value:g,onChange:e=>y(e.currentTarget.value),children:he.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:["Country",se===!1&&a("span",{style:{display:"block",fontSize:"0.75rem",color:"var(--text-muted)",fontWeight:400},children:"AniList only — ignored by fallback providers"})]}),a("select",{value:B,onChange:e=>E(e.currentTarget.value),children:Ie.map(e=>a("option",{value:e.value,children:e.label},e.value))})]}),a("div",{className:t.filterItem,children:[a("label",{children:"Sort By"}),a("select",{value:Y,onChange:e=>I(e.currentTarget.value),children:De.map(e=>a("option",{value:e.value,children:e.label},e.value))})]})]}),M.length>0&&a("div",{className:t.genreSection,children:[a("label",{className:t.genreLabel,children:"Genres"}),a("div",{className:t.genreContainer,children:M.map(e=>a("button",{className:`${t.genreButton} ${t[v[e]||""]}`,onClick:()=>{N(n=>{const s=n[e],l={...n};return s==="include"?l[e]="exclude":s==="exclude"?delete l[e]:l[e]="include",l})},children:e},e))})]}),a("div",{className:t.filterActions,children:[a(w,{variant:"secondary",onClick:()=>{N({}),A("ALL"),b("ALL"),y("ALL"),E("ALL"),I("POPULARITY_DESC"),D(""),de(!1),c(1,{type:"ALL",status:"",season:"ALL",year:"ALL",country:"ALL",sort:"POPULARITY_DESC",genreState:{},showMature:!1})},children:"Reset All"}),a(w,{onClick:()=>c(),className:t.applyBtn,children:"Apply Filters"})]})]})]}),ce&&a(Ce,{message:ue?.message||"Error"}),(u!=="ALL"||m!=="ALL"||g!=="ALL"||Object.keys(v).length>0)&&a("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px",alignItems:"center",marginBottom:"1.5rem"},children:[a("span",{style:{fontSize:"0.8rem",color:"var(--text-muted)",fontWeight:600},children:"Active Filters:"}),u!=="ALL"&&a("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Type: ",u,a("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),A("ALL"),c(1,{type:"ALL"})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),m!=="ALL"&&a("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Season: ",m,a("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),b("ALL"),c(1,{season:"ALL"})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),g!=="ALL"&&a("span",{className:"badge badge-secondary",style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:["Year: ",g,a("button",{onClick:e=>{e.stopPropagation(),e.preventDefault(),y("ALL"),c(1,{year:"ALL"})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]}),Object.entries(v).map(([e,n])=>a("span",{className:`badge ${n==="include"?"badge-primary":"badge-danger"}`,style:{display:"inline-flex",alignItems:"center",gap:"6px"},children:[n==="include"?`+ ${e}`:`- ${e}`,a("button",{onClick:s=>{s.stopPropagation(),s.preventDefault();const l={...v};delete l[e],N(l),c(1,{genreState:l})},style:{background:"none",border:"none",color:"inherit",cursor:"pointer"},children:"✕"})]},e))]}),a("div",{className:t.resultsHeader,ref:P,children:[a("h2",{className:t.resultsTitle,children:h?`Search Results for "${h}"`:"Discover Anime"}),T.length>0&&a(ee,{page:p,canGoNext:z,onChange:W,isLoading:C})]}),a("div",{className:`${t.resultsGrid} ${ie?t.lowEnd:""}`,children:C?a(Le,{}):T.map(e=>a(Ae,{anime:e},e._id))}),!C&&T.length===0&&a("div",{className:t.noResults,children:[a(L,{name:"search",size:48,className:t.noResultsIcon}),a("h3",{children:"No results found"}),a("p",{children:"Try adjusting your search or filters to find what you're looking for."})]}),T.length>0&&a("div",{className:t.bottomPagination,children:a(ee,{page:p,canGoNext:z,onChange:W,isLoading:C,variant:"labeled"})})]})}export{Ve as default};
@@ -0,0 +1,21 @@
1
+ import{d as s,A as H,h as A,u as e,q as ie,S as ke,T as Ce,p as Se,g as ce,_ as _e}from"./vendor-core-DfaOB3Rn.js";import{d as Ne,t as C,B as T,M as $,j as he,h as Te,z as de,F as te,G as Ie,T as Re,u as xe,e as Le,H as Pe,y as ae,A as De,V as Ae,I as Oe}from"./index-B4AdKbhW.js";import{u as oe}from"./vendor-query-BBT5_sHx.js";import{T as q}from"./ToggleSwitch-CN_ppEc9.js";import{I as Y}from"./vendor-icons-DrybRNxP.js";const ne={"title-preference-container":"_title-preference-container_sdqgs_1","toggle-button":"_toggle-button_sdqgs_21","toggle-label":"_toggle-label_sdqgs_51"},se=["name","nativeName","englishName"],re={name:"Default (Romaji)",nativeName:"Native",englishName:"English"},Ge=()=>{const{titlePreference:t,setTitlePreference:r,loading:o}=Ne(),[d,l]=s(re[t]),[v,w]=s(!1),c=H(null);A(()=>{o||l(re[t])},[t,o]);const a=async()=>{if(v)return;w(!0);const u=(se.indexOf(t)+1)%se.length,p=se[u],h=re[p];c.current&&(c.current.style.transform="translateX(-100%)",c.current.style.opacity="0"),setTimeout(async()=>{l(h),r(p),c.current&&(c.current.style.transition="none",c.current.style.transform="translateX(100%)",c.current.style.opacity="0",c.current.offsetWidth,c.current.style.transition="transform 0.3s ease-out, opacity 0.3s ease-out",c.current.style.transform="translateX(0)",c.current.style.opacity="1");try{await C.settings.set.mutate({key:"titlePreference",value:p})}catch(_){console.error("Error saving title preference:",_)}finally{w(!1)}},300)};return o?e("p",{children:"Loading title preference..."}):e("div",{className:ne["title-preference-container"],children:[e("h4",{children:"Anime Title Display Preference"}),e("button",{onClick:a,className:ne["toggle-button"],disabled:v,children:e("span",{ref:c,className:ne["toggle-label"],children:d})})]})},Me="_settingsHeader_14a5d_1",Ue="_pageTitle_14a5d_6",Ee="_pageSubtitle_14a5d_14",ze="_settingsLayout_14a5d_20",$e="_sidebar_14a5d_27",Fe="_sidebarIndicator_14a5d_35",qe="_sidebarItem_14a5d_50",Ke="_active_14a5d_72",je="_mainContent_14a5d_80",He="_tabContent_14a5d_85",We="_sectionCard_14a5d_103",Be="_settingItem_14a5d_127",Ve="_settingRow_14a5d_132",Qe="_controls_14a5d_145",Ye="_status_14a5d_151",m={settingsHeader:Me,pageTitle:Ue,pageSubtitle:Ee,settingsLayout:ze,sidebar:$e,sidebarIndicator:Fe,sidebarItem:qe,active:Ke,mainContent:je,tabContent:He,sectionCard:We,settingItem:Be,settingRow:Ve,controls:Qe,status:Ye},Je="_sectionCard_wt900_12",Xe="_title_wt900_22",Ze="_signIn_wt900_29",et="_userInfo_wt900_36",tt="_warning_wt900_58",at="_formGroup_wt900_65",nt="_label_wt900_69",st="_inputWrapper_wt900_79",rt="_input_wt900_79",it="_select_wt900_103",ot="_actions_wt900_140",lt="_hr_wt900_148",g={sectionCard:Je,title:Xe,signIn:Ze,userInfo:et,warning:tt,formGroup:at,label:nt,inputWrapper:st,input:rt,select:it,actions:ot,hr:lt},ct=()=>{const[t,r]=s(!0),[o,d]=s(!1),[l,v]=s(!1),[w,c]=s(null),[a,i]=s({status:"idle"}),[u,p]=s(!1),[h,_]=s(""),[y,k]=s(!1),R=H(null),[x,L]=s({show:!1,message:"",type:"info"}),P=()=>{R.current&&(window.clearInterval(R.current),R.current=null)},b=ie(f=>{v(f.authenticated),c(f.user||f.device.user||null),i(f.device),p(!!f.hasCustomClientId)},[]),S=ie(async()=>{const f=await C.auth.githubStatus.query();b(f)},[b]),O=async()=>{try{const f=await C.auth.githubPoll.query();i(f),f.status==="success"?(P(),await S(),L({show:!0,message:"GitHub authentication complete. Sync has been initialized.",type:"success"})):f.status==="error"&&(P(),L({show:!0,message:f.error||"GitHub authentication failed.",type:"error"}))}catch{P(),L({show:!0,message:"Failed to poll GitHub authentication status.",type:"error"})}},U=(f=5)=>{P(),R.current=window.setInterval(O,Math.max(f,5)*1e3)};A(()=>(S().catch(()=>{L({show:!0,message:"Failed to load GitHub sync status.",type:"error"})}).finally(()=>r(!1)),P),[S]);const N=async()=>{d(!0);try{const f=await C.auth.githubStart.mutate();i(f),U(f.verification?.interval)}catch(f){L({show:!0,message:f instanceof Error?f.message:"Failed to start GitHub authentication.",type:"error"})}finally{d(!1)}},G=async()=>{try{await C.auth.githubLogout.mutate(),v(!1),c(null),i({status:"idle"}),L({show:!0,message:"Signed out of GitHub sync.",type:"success"})}catch{L({show:!0,message:"Failed to sign out of GitHub.",type:"error"})}},E=async()=>{k(!0);try{await C.auth.saveGithubAuth.mutate({clientId:h}),_(""),await S(),L({show:!0,message:"Custom GitHub auth saved.",type:"success"})}catch{L({show:!0,message:"Failed to save override.",type:"error"})}finally{k(!1)}},K=async()=>{k(!0);try{await C.auth.saveGithubAuth.mutate({clientId:""}),_(""),await S(),L({show:!0,message:"Custom auth cleared. Using dango defaults.",type:"success"})}catch{L({show:!0,message:"Failed to clear override.",type:"error"})}finally{k(!1)}};return t?e("div",{style:{color:"var(--text-secondary)",padding:"1.5rem"},children:"Loading..."}):e("div",{className:g.sectionCard,children:[e("h3",{className:g.title,children:"GitHub Cloud Sync"}),e("p",{className:g.signIn,children:"Sync local data through a private GitHub repository named dango-sync-data."}),l&&w?e("div",{className:g.userInfo,children:[e("p",{children:["Signed in as: ",e("strong",{children:w.name||w.login})]}),e(T,{variant:"danger",onClick:G,children:"Sign Out"})]}):e("div",{className:g.signIn,children:e(T,{onClick:N,disabled:o||a.status==="pending",children:o||a.status==="pending"?"Waiting for GitHub...":"Sign in with GitHub"})}),a.status==="pending"&&a.verification&&e(ke,{children:[e("hr",{className:g.hr}),e("div",{className:g.formGroup,children:[e("label",{className:g.label,children:"Verification URL"}),e("div",{className:g.inputWrapper,children:[e("input",{className:g.input,value:a.verification.verification_uri,readOnly:!0}),e(T,{onClick:()=>{const f=a.verification?.verification_uri;f&&/^https?:\/\//i.test(f)&&window.open(f,"_blank","noopener,noreferrer")},children:"Open"})]})]}),e("div",{className:g.formGroup,children:[e("label",{className:g.label,children:"Device Code"}),e("input",{className:g.input,value:a.verification.user_code,readOnly:!0})]})]}),a.status==="error"&&e("p",{className:g.warning,children:a.error}),e("details",{style:{marginTop:"1rem",fontSize:"var(--font-size-sm)"},children:[e("summary",{style:{cursor:"pointer",color:"var(--text-secondary)"},children:["Advanced: use your own auth ",u?"(override active)":""]}),e("div",{className:g.formGroup,style:{marginTop:"0.75rem"},children:[e("label",{className:g.label,children:"Client ID (optional)"}),e("input",{className:g.input,value:h,onChange:f=>_(f.currentTarget.value),placeholder:"Your GitHub OAuth app ID"})]}),e("div",{className:g.actions,children:[e(T,{onClick:E,disabled:y,children:"Save override"}),e(T,{variant:"secondary",onClick:K,disabled:y,children:"Use dango defaults"})]})]}),e($,{isOpen:x.show,onClose:()=>L(f=>({...f,show:!1})),width:"sm",children:[e($.Body,{children:e("p",{children:x.message})}),e($.Actions,{children:e(T,{onClick:()=>L(f=>({...f,show:!1})),children:"OK"})})]})]})},dt=()=>{const[t,r]=s(!0),[o,d]=s(null),[l,v]=s(!1),[w,c]=s(!1),[a,i]=s(""),[u,p]=s(""),[h,_]=s(""),[y,k]=s(!1),[R,x]=s({show:!1,message:"",type:"info"}),L=async()=>{try{const N=await C.auth.user.query();d(N?.email?N:null)}catch{d(null)}},P=async()=>{try{const[N,G]=await Promise.all([C.auth.configStatus.query(),C.auth.googleAuth.query()]);v(!!N.hasConfig),c(!!(G.hasCustomWorkerUrl||G.hasCustomClientId||G.hasClientSecret))}catch(N){console.error("Failed to fetch config status",N)}};A(()=>{(async()=>{r(!0),await Promise.all([L(),P()]);try{new URLSearchParams(window.location.search).get("google_auth")==="success"&&(await L(),window.history.replaceState(null,"",window.location.pathname))}catch{}r(!1)})();const G=E=>{E.origin===window.location.origin&&typeof E.data=="object"&&E.data!==null&&E.data.type==="GOOGLE_AUTH_SUCCESS"&&(d(E.data.user),window.location.reload())};return window.addEventListener("message",G),()=>window.removeEventListener("message",G)},[]);const b=async()=>{try{const N=await C.auth.googleLogin.mutate();if(N.authenticated){window.location.reload();return}if(N.url){if(typeof window.DangoBridge<"u"){window.location.href=N.url;return}const E=600,K=700,f=window.innerWidth/2-E/2,J=window.innerHeight/2-K/2;window.open(N.url,"GoogleAuth",`width=${E},height=${K},top=${J},left=${f}`)}else throw new Error("Auth URL not available")}catch{x({show:!0,message:"Authentication failed. Ensure server is configured correctly.",type:"error"})}},S=async()=>{try{await C.auth.logout.mutate(),d(null),x({show:!0,message:"Successfully signed out.",type:"success"}),window.location.reload()}catch(N){console.error("Sign out failed",N),x({show:!0,message:"Failed to sign out.",type:"error"})}},O=async()=>{k(!0);try{await C.auth.saveGoogleAuth.mutate({workerUrl:a,clientId:u,clientSecret:h}),i(""),p(""),_(""),await P(),x({show:!0,message:"Custom auth saved. Restart may be required.",type:"success"})}catch{x({show:!0,message:"Failed to save override.",type:"error"})}finally{k(!1)}},U=async()=>{k(!0);try{await C.auth.saveGoogleAuth.mutate({workerUrl:"",clientId:"",clientSecret:""}),i(""),p(""),_(""),await P(),x({show:!0,message:"Custom auth cleared. Using dango defaults.",type:"success"})}catch{x({show:!0,message:"Failed to clear override.",type:"error"})}finally{k(!1)}};return t?e("div",{style:{color:"var(--text-secondary)",padding:"1.5rem"},children:"Loading..."}):e("div",{className:g.sectionCard,children:[e("h3",{className:g.title,children:"Google Drive Sync"}),o?e("div",{className:g.userInfo,children:[e("p",{children:["Signed in as: ",e("strong",{children:o.name})," (",o.email,")"]}),e(T,{variant:"danger",onClick:S,children:"Sign Out"})]}):e("div",{className:g.signIn,children:[e("p",{children:"Sign in with your Google account to enable synchronization features."}),e(T,{onClick:b,disabled:!l,children:"Sign in with Google"}),!l&&e("p",{className:g.warning,children:"Google sync is not configured on the server."})]}),e("details",{style:{marginTop:"1rem",fontSize:"var(--font-size-sm)"},children:[e("summary",{style:{cursor:"pointer",color:"var(--text-secondary)"},children:["Advanced: use your own auth ",w?"(override active)":""]}),e("div",{className:g.formGroup,style:{marginTop:"0.75rem"},children:[e("label",{className:g.label,children:"Worker URL (optional)"}),e("input",{className:g.input,value:a,onChange:N=>i(N.currentTarget.value),placeholder:"https://your-worker.workers.dev"})]}),e("div",{className:g.formGroup,children:[e("label",{className:g.label,children:"Client ID (optional)"}),e("input",{className:g.input,value:u,onChange:N=>p(N.currentTarget.value),placeholder:"Your Google OAuth client ID"})]}),e("div",{className:g.formGroup,children:[e("label",{className:g.label,children:"Client Secret (optional)"}),e("input",{type:"password",className:g.input,value:h,onChange:N=>_(N.currentTarget.value),placeholder:"Your Google OAuth secret"})]}),e("div",{className:g.actions,children:[e(T,{onClick:O,disabled:y,children:"Save override"}),e(T,{variant:"secondary",onClick:U,disabled:y,children:"Use dango defaults"})]})]}),e($,{isOpen:R.show,onClose:()=>x(N=>({...N,show:!1})),width:"sm",children:[e($.Body,{children:e("p",{children:R.message})}),e($.Actions,{children:e(T,{onClick:()=>x(N=>({...N,show:!1})),children:"OK"})})]})]})},ut="_sectionCard_1pqo4_1",ht="_settingItem_1pqo4_26",gt="_settingRow_1pqo4_31",mt="_modalOverlay_1pqo4_38",pt="_modal_1pqo4_38",yt="_modalActions_1pqo4_73",ft="_modalSecondary_1pqo4_79",vt="_modalPrimary_1pqo4_89",z={sectionCard:ut,settingItem:ht,settingRow:gt,modalOverlay:mt,modal:pt,modalActions:yt,modalSecondary:ft,modalPrimary:vt},wt={anime:{heading:"Watchlist Preferences",blurb:"Customize your experience when managing your watchlist and series entries.",skipKey:"skipRemoveConfirmation",ignoreKey:"ignoreAdultContent",listOnlyKey:"cwWatchlistOnly",skipLabel:"Skip confirmation when removing from watchlist",ignoreLabel:"Hide adult content from continue watching",listOnlyLabel:"Only show continue watching for shows in watchlist",listNoun:"watchlist",continueNoun:"continue watching",adultCountUrl:"/api/continue-watching/adult-count",purgeUrl:"/api/continue-watching/purge-adult",purgeDoneText:t=>`Removed ${t??0} entries from continue watching`,invalidateKeys:[["allContinueWatching"]]},manga:{heading:"Reading List Preferences",blurb:"Customize your experience when managing your reading list and manga entries.",skipKey:"mangaSkipRemoveConfirmation",ignoreKey:"mangaIgnoreAdultContent",listOnlyKey:"mangaCwWatchlistOnly",skipLabel:"Skip confirmation when removing from reading list",ignoreLabel:"Hide adult content from continue reading",listOnlyLabel:"Only show continue reading for manga in reading list",listNoun:"reading list",continueNoun:"continue reading",adultCountUrl:"/api/manga/continue-reading/adult-count",purgeUrl:"/api/manga/continue-reading/purge-adult",purgeDoneText:t=>`Removed ${t??0} entries from continue reading`,invalidateKeys:[["manga-continue-reading"]]},tv:{heading:"TV Watchlist Preferences",blurb:"Customize your experience when managing your TV watchlist and series entries.",skipKey:"tvSkipRemoveConfirmation",ignoreKey:"tvIgnoreAdultContent",listOnlyKey:"tvCwWatchlistOnly",skipLabel:"Skip confirmation when removing from TV watchlist",ignoreLabel:"Hide adult content from continue watching",listOnlyLabel:"Only show continue watching for shows in TV watchlist",listNoun:"TV watchlist",continueNoun:"continue watching",adultCountUrl:"/api/tv/continue-watching/adult-count",purgeUrl:"/api/tv/continue-watching/purge-adult",purgeDoneText:t=>`Removed ${t??0} entries from continue watching`,invalidateKeys:[["tv-continue-watching"]]},asmr:{heading:"Listening List Preferences",blurb:"Customize your experience when managing your listening list and work entries.",skipKey:"asmrSkipRemoveConfirmation",ignoreKey:"asmrIgnoreAdultContent",listOnlyKey:"asmrCwWatchlistOnly",skipLabel:"Skip confirmation when removing from listening list",ignoreLabel:"Hide adult content from continue listening",listOnlyLabel:"Only show continue listening for works in listening list",listNoun:"listening list",continueNoun:"continue listening",adultCountUrl:"/api/asmr/continue-listening/adult-count",purgeUrl:"/api/asmr/continue-listening/purge-adult",purgeDoneText:t=>`Removed ${t??0} entries from continue listening`,invalidateKeys:[["asmr-continue-listening"]]}},bt=(t,r)=>{if(t==null)return r;const o=String(t);return o==="true"||o==="1"?!0:o==="false"||o==="0"?!1:r},ue=(t,r,o)=>{const[d,l]=s(r),[v,w]=s(!1),c=oe();return A(()=>{(async()=>{try{const u=await C.settings.getByKey.query({key:t});l(bt(u.value,r))}catch(u){console.error("Failed to fetch setting",u)}})()},[t,r]),{value:d,setValue:l,isUpdating:v,toggle:async()=>{if(v)return;w(!0);const i=!d;l(i);try{await C.settings.set.mutate({key:t,value:i});for(const u of o)c.invalidateQueries({queryKey:u})}catch(u){console.error("Error saving setting:",u),l(!i)}finally{w(!1)}}}},kt=()=>{const{contentType:t}=he(),r=wt[t],[o,d]=s(!1),[l,v]=s(!0),[w,c]=s(!1),a=ue(r.ignoreKey,!0,r.invalidateKeys),i=ue(r.listOnlyKey,!1,r.invalidateKeys),[u,p]=s(null),[h,_]=s(!1),y=oe(),k=Te();A(()=>{v(!0),(async()=>{try{const S=await C.settings.getByKey.query({key:r.skipKey});String(S.value)==="true"||String(S.value)==="1"?d(!0):d(!1)}catch(S){console.error("Failed to fetch setting",S)}finally{v(!1)}})()},[r.skipKey]);const R=async()=>{if(w)return;c(!0);const b=!o;d(b);try{await C.settings.set.mutate({key:r.skipKey,value:b})}catch(S){console.error("Error saving setting:",S),d(!b)}finally{c(!1)}},x=async()=>{if(!a.isUpdating){if(a.value)try{let b;if(t==="anime"?b=(await C.continueWatching.adultCount.query()).count:t==="manga"?b=(await C.mangaProgress.adultCount.query()).count:t==="asmr"?b=(await C.asmrProgress.adultCount.query()).count:b=(await C.tvProgress.adultCount.query()).count,typeof b=="number"&&b>0){p(b);return}}catch(b){console.error("Failed to fetch adult count",b)}a.toggle()}},L=()=>{p(null),a.toggle()},P=async()=>{if(!h){_(!0);try{let b;t==="anime"?b=(await C.continueWatching.purgeAdult.mutate()).removed:t==="manga"?b=(await C.mangaProgress.purgeAdult.mutate()).removed:t==="asmr"?b=(await C.asmrProgress.purgeAdult.mutate()).removed:b=(await C.tvProgress.purgeAdult.mutate()).removed,de.success(r.purgeDoneText(b??0));for(const S of r.invalidateKeys)y.invalidateQueries({queryKey:S});t==="anime"&&y.invalidateQueries(k.continueWatching.pathFilter()),t==="manga"&&y.invalidateQueries(k.mangaProgress.pathFilter()),t==="asmr"&&y.invalidateQueries(k.asmrProgress.pathFilter()),t==="tv"&&y.invalidateQueries(k.tvProgress.pathFilter())}catch(b){console.error("Failed to purge adult entries",b),de.error("Failed to remove adult entries")}finally{_(!1),p(null)}a.toggle()}};return l?e("div",{children:"Loading settings..."}):e("div",{className:z.sectionCard,children:[e("h3",{children:r.heading}),e("p",{children:r.blurb}),e("div",{className:z.settingItem,children:e("div",{className:z.settingRow,children:[e("label",{htmlFor:"skip-confirmation-toggle",children:r.skipLabel}),e(q,{isChecked:o,onChange:R,id:"skip-confirmation-toggle",disabled:w})]})}),e("div",{className:z.settingItem,children:e("div",{className:z.settingRow,children:[e("label",{htmlFor:"ignore-adult-toggle",children:r.ignoreLabel}),e(q,{isChecked:a.value,onChange:x,id:"ignore-adult-toggle",disabled:a.isUpdating})]})}),e("div",{className:z.settingItem,children:e("div",{className:z.settingRow,children:[e("label",{htmlFor:"cw-watchlist-only-toggle",children:r.listOnlyLabel}),e(q,{isChecked:i.value,onChange:i.toggle,id:"cw-watchlist-only-toggle",disabled:i.isUpdating})]})}),u!==null&&e("div",{className:z.modalOverlay,onClick:()=>p(null),children:e("div",{className:z.modal,onClick:b=>b.stopPropagation(),children:[e("h4",{children:"Show adult entries?"}),e("p",{children:[u," adult ",u===1?"entry":"entries"," not in your"," ",r.listNoun," ",u===1?"is":"are"," currently hidden from"," ",r.continueNoun,". You can purge ",u===1?"it":"them"," from the database instead of showing ",u===1?"it":"them","."]}),e("div",{className:z.modalActions,children:[e("button",{type:"button",className:z.modalSecondary,onClick:L,disabled:h,children:"Show them"}),e("button",{type:"button",className:z.modalPrimary,onClick:P,disabled:h,children:h?"Purging...":`Purge ${u}`})]})]})})]})},Ct="_sectionCard_jkggs_1",St="_statsGrid_jkggs_26",_t="_statCard_jkggs_33",Nt="_statLabel_jkggs_43",Tt="_statValue_jkggs_51",It="_statMeta_jkggs_57",Rt="_statusBanner_jkggs_63",xt="_statusSuccess_jkggs_74",Lt="_statusUpdating_jkggs_80",Pt="_statusError_jkggs_86",Dt="_sha_jkggs_92",At="_settingItem_jkggs_99",Ot="_settingRow_jkggs_104",Gt="_settingTitle_jkggs_111",Mt="_settingSubtitle_jkggs_117",Ut="_actionsRow_jkggs_124",I={sectionCard:Ct,statsGrid:St,statCard:_t,statLabel:Nt,statValue:Tt,statMeta:It,statusBanner:Rt,statusSuccess:xt,statusUpdating:Lt,statusError:Pt,sha:Dt,settingItem:At,settingRow:Ot,settingTitle:Gt,settingSubtitle:Mt,actionsRow:Ut},Et=()=>{const[t,r]=s(null),[o,d]=s(!0),[l,v]=s(!1),[w,c]=s(!1),a=H(null),i=async()=>{try{const y=await C.settings.offlineDbInfo.query();return r(y),y}catch(y){console.error("Failed to fetch offline DB info:",y)}finally{d(!1)}return null};A(()=>(i(),()=>{a.current&&window.clearInterval(a.current)}),[]),A(()=>{t?.isRefreshing?a.current||(a.current=window.setInterval(async()=>{const y=await i();y&&!y.isRefreshing&&a.current&&(window.clearInterval(a.current),a.current=null)},2e3)):a.current&&(window.clearInterval(a.current),a.current=null)},[t?.isRefreshing]);const u=async()=>{if(!t||l)return;const y=!t.autoUpdateEnabled;v(!0),r({...t,autoUpdateEnabled:y});try{await C.settings.setOfflineDbAutoUpdate.mutate({enabled:y})}catch(k){console.error("Failed to update auto update setting:",k),r({...t,autoUpdateEnabled:!y})}finally{v(!1)}},p=async()=>{if(!(t?.isRefreshing||w)){c(!0);try{await C.settings.triggerOfflineDbUpdate.mutate(),r(y=>y?{...y,isRefreshing:!0,lastStatus:"updating",lastMessage:"Downloading database..."}:null)}catch(y){console.error("Failed to trigger offline DB update:",y)}finally{c(!1)}}},h=y=>{if(!y)return"Never";try{return new Date(y).toLocaleString(void 0,{dateStyle:"medium",timeStyle:"short"})}catch{return y}},_=t?.isRefreshing||w;return e("div",{className:I.sectionCard,children:[e("h3",{children:"Offline Metadata Database"}),e("p",{children:"Local MAL to AniList ID map used for instant imports and metadata enrichment without hitting rate-limited APIs. Updates automatically every Saturday in the background."}),e("div",{className:I.statsGrid,children:[e("div",{className:I.statCard,children:[e("span",{className:I.statLabel,children:"MAL Mapped"}),e("span",{className:I.statValue,children:o?"—":(t?.totalMalMapped??0).toLocaleString()})]}),e("div",{className:I.statCard,children:[e("span",{className:I.statLabel,children:"Release"}),e("span",{className:I.statMeta,children:o?"—":t?.releaseTag??"Never"})]}),e("div",{className:I.statCard,children:[e("span",{className:I.statLabel,children:"Last Checked"}),e("span",{className:I.statMeta,children:o?"—":h(t?.lastCheckedAt??null)})]}),e("div",{className:I.statCard,children:[e("span",{className:I.statLabel,children:"Last Updated"}),e("span",{className:I.statMeta,children:o?"—":h(t?.lastUpdatedAt??null)})]})]}),t?.lastMessage&&e("div",{className:`${I.statusBanner} ${t.lastStatus==="failed"?I.statusError:t.lastStatus==="updating"?I.statusUpdating:I.statusSuccess}`,children:[e("span",{children:t.lastMessage}),t.contentSha256&&e("span",{className:I.sha,children:["sha:",t.contentSha256.slice(0,12)]})]}),e("div",{className:I.settingItem,children:e("div",{className:I.settingRow,children:[e("div",{children:[e("span",{className:I.settingTitle,children:"Weekly Automatic Updates (Saturdays)"}),e("div",{className:I.settingSubtitle,children:"Download and index new database releases in the background. Catches up on startup if the server was offline."})]}),e(q,{id:"offline-db-auto-update-toggle",isChecked:t?t.autoUpdateEnabled:!0,onChange:u,disabled:o||l})]})}),e("div",{className:I.actionsRow,children:e(T,{onClick:p,disabled:o||_,children:_?"Updating Database...":"Update Offline Database Now"})})]})},zt="_sectionCard_1g4qx_1",$t="_dangerCard_1g4qx_26",Ft="_status_1g4qx_34",qt="_warningText_1g4qx_40",Kt="_ackLabel_1g4qx_44",Q={sectionCard:zt,dangerCard:$t,status:Ft,warningText:qt,ackLabel:Kt},jt=()=>{const t=oe(),[r,o]=s(!1),[d,l]=s(!1),[v,w]=s(!1),[c,a]=s(""),i=()=>{l(!1),a(""),o(!0)},u=()=>{v||(o(!1),l(!1))},p=async()=>{if(!(!d||v)){w(!0),a("");try{const h=await fetch("/api/database/clear",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirm:!0})}),_=await h.json();if(!h.ok)throw new Error(_.error||"Failed to clear database");const y=_.deleted,k=_.deletedManga,R=_.deletedTv,x=_.deletedAsmr,L=Object.values(y).reduce((O,U)=>O+(U||0),0)+Object.values(k??{}).reduce((O,U)=>O+(U||0),0)+Object.values(R??{}).reduce((O,U)=>O+(U||0),0)+Object.values(x??{}).reduce((O,U)=>O+(U||0),0),P=(k?.manga_library??0)+(k?.manga_progress??0),b=(R?.tv_library??0)+(R?.tv_progress??0),S=(x?.asmr_library??0)+(x?.asmr_progress??0);a(`Library cleared — ${y.watchlist??0} watchlist entries, ${P} manga rows, ${b} TV rows, ${S} ASMR rows and ${L} total rows removed.`),t.invalidateQueries({queryKey:["watchlist"]}),t.invalidateQueries({queryKey:["allContinueWatching"]}),t.invalidateQueries({queryKey:["manga-library"]}),t.invalidateQueries({queryKey:["manga-continue-reading"]}),t.invalidateQueries({queryKey:["tv-library"]}),t.invalidateQueries({queryKey:["tv-continue-watching"]}),t.invalidateQueries({queryKey:["asmr-library"]}),t.invalidateQueries({queryKey:["asmr-continue-listening"]}),o(!1)}catch(h){a(h.message)}finally{w(!1),l(!1)}}};return e("div",{className:`${Q.sectionCard} ${Q.dangerCard}`,children:[e("h3",{children:"Danger Zone"}),e("p",{children:"Permanently delete your library (watchlist, watched episodes, queue, cached show metadata, manga reading list and reading progress, TV watchlist and watch progress, ASMR listening list and listening progress) to start fresh. Your settings, sync state and the offline metadata cache are preserved."}),e(T,{variant:"danger",onClick:i,children:"Clear Library Data"}),c&&e("p",{className:Q.status,children:c}),e($,{isOpen:r,onClose:u,title:"Clear library data?",width:"sm",children:[e($.Body,{children:[e("p",{className:Q.warningText,children:"This permanently deletes everything in your library. It acts on the active database (dev or prod, per server config) and cannot be undone. Settings, sync state and the offline metadata cache are kept."}),e("label",{className:Q.ackLabel,children:[e("input",{type:"checkbox",checked:d,onChange:h=>l(h.target.checked),disabled:v}),e("span",{children:"I understand this permanently deletes my library"})]})]}),e($.Actions,{children:[e(T,{variant:"secondary",onClick:u,disabled:v,children:"Cancel"}),e(T,{variant:"danger",onClick:p,disabled:!d||v,children:v?"Clearing...":"Yes, delete everything"})]})]})]})},Ht=()=>{const[t,r]=s(""),[o,d]=s([]),[l,v]=s(null),[w,c]=s(!0),[a,i]=s({show:!1,message:"",type:"info"}),u=async()=>{try{c(!0);const _=await(await fetch("/api/auth/settings/rclone")).json();r(_.remote||""),d(_.availableRemotes||[]),v(_.activeRemote||null)}catch(h){console.error("Failed to fetch Rclone settings",h)}finally{c(!1)}};A(()=>{u()},[]);const p=async()=>{try{if((await fetch("/api/auth/settings/rclone",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({remote:t})})).ok)i({show:!0,message:"Rclone configuration saved successfully. You must restart the server for these changes to take effect.",type:"success"}),u();else throw new Error("Failed to save")}catch{i({show:!0,message:"Failed to save Rclone configuration.",type:"error"})}};return w?e("div",{style:{color:"var(--text-secondary)",padding:"1.5rem"},children:"Loading..."}):e("div",{className:g.sectionCard,children:[e("h3",{className:g.title,children:"Rclone Cloud Sync"}),e("p",{className:g.signIn,children:"Configure which Rclone remote to use for database synchronization."}),l?e("div",{className:g.userInfo,children:e("p",{children:["Current Active Remote: ",e("strong",{children:l})]})}):e("p",{className:g.warning,style:{marginBottom:"1.5rem"},children:"Rclone sync is not currently active. Ensure rclone is installed and a remote is configured."}),e("div",{className:g.formGroup,children:[e("label",{className:g.label,children:"Remote Name"}),e("div",{className:g.inputWrapper,children:e("select",{className:g.select,value:t,onChange:h=>r(h.target.value),children:[e("option",{value:"",children:"(Disabled / None)"}),o.map(h=>e("option",{value:h,children:h},h)),t&&!o.includes(t)&&e("option",{value:t,children:[t," (Manual)"]})]})}),e("p",{className:g.warning,style:{marginTop:"12px"},children:[e("strong",{children:"Note:"})," You can choose which provider is active using the selector at the top of the page."]})]}),e("div",{className:g.actions,children:e(T,{onClick:p,children:"Save Rclone Settings"})}),e($,{isOpen:a.show,onClose:()=>i(h=>({...h,show:!1})),width:"sm",children:[e($.Body,{children:e("p",{children:a.message})}),e($.Actions,{children:e(T,{onClick:()=>i(h=>({...h,show:!1})),children:"OK"})})]})]})},Wt=()=>{const[t,r]=s(null),[o,d]=s(!0),l=async()=>{try{const i=await(await fetch("/api/auth/settings/sync")).json();r(i)}catch(a){console.error("Failed to fetch sync settings",a)}finally{d(!1)}};A(()=>{l()},[]);const v=async a=>{const i=a.target.value;try{const u=await fetch("/api/auth/settings/sync",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:i})});if(u.ok){const p=await u.json();r(h=>h?{...h,activeProvider:p.activeProvider}:null),await l(),te.success(`Sync provider updated to ${i==="default"?"Default Order":i}`)}else te.error("Failed to update sync provider")}catch{te.error("Error updating sync provider")}};if(o||!t)return null;const w=[{value:"default",label:"Default (Priority Based)"}];t.authenticatedProviders.github&&w.push({value:"github",label:"GitHub"}),t.authenticatedProviders.google&&w.push({value:"google",label:"Google Drive"}),t.authenticatedProviders.rclone&&w.push({value:"rclone",label:"Rclone"}),w.push({value:"none",label:"None (Local Only)"});const c=a=>a==="none"?"Local Only (No Sync)":a==="google"?"Google Drive":a==="github"?"GitHub":a==="rclone"?"Rclone":a;return e("div",{className:m.sectionCard,children:[e("h3",{children:"Active Sync Provider"}),e("p",{children:'Choose which provider to use for synchronization. "Default" uses the first available provider you are logged into.'}),e("div",{style:{marginBottom:"1.5rem",padding:"0.75rem",background:"rgba(255, 255, 255, 0.03)",borderRadius:"var(--radius-md)",borderLeft:"4px solid var(--accent)",fontSize:"var(--font-size-sm)"},children:["Current Status:"," ",e("strong",{style:{color:"var(--accent-light)",textTransform:"capitalize"},children:c(t.actualActiveProvider)})]}),e("div",{className:m.settingRow,children:[e("label",{htmlFor:"sync-provider-select",children:"Selected Preference"}),e("select",{id:"sync-provider-select",value:t.activeProvider,onChange:v,style:{padding:"0.5rem",borderRadius:"var(--radius-md)",background:"rgba(255, 255, 255, 0.05)",color:"var(--text-primary)",border:"1px solid var(--glass-border)",fontSize:"var(--font-size-sm)",minWidth:"220px",outline:"none",cursor:"pointer"},children:w.map(a=>e("option",{value:a.value,children:a.label},a.value))})]})]})};function Bt(){return"javascript:"+encodeURIComponent(`(function(){
2
+ if(!/(^|\\.)discord\\.com$/.test(location.hostname)){alert('Dango: use this bookmarklet while on discord.com');return}
3
+ var t=null;
4
+ try{
5
+ window.webpackChunkdiscord_app.push([[Symbol()],{},function(req){
6
+ if(!req.c)return;
7
+ var ms=Object.values(req.c);
8
+ for(var i=0;i<ms.length;i++){var m=ms[i];
9
+ try{
10
+ if(!m.exports||m.exports===window)continue;
11
+ if(typeof m.exports.getToken==='function'){var x=m.exports.getToken();if(x){t=x;return}}
12
+ for(var k in m.exports){try{var ex=m.exports[k];if(ex&&typeof ex.getToken==='function'&&ex[Symbol.toStringTag]!=='IntlMessagesProxy'){var y=ex.getToken();if(y){t=y;return}}}catch(e1){}}
13
+ }catch(e2){}}
14
+ }]);
15
+ window.webpackChunkdiscord_app.pop();
16
+ }catch(e3){}
17
+ if(!t){alert('Dango: could not grab your token. Make sure you are logged in to Discord in this tab, then run the bookmarklet again.');return}
18
+ function copyFallback(){var a=document.createElement('textarea');a.value=t;a.style.position='fixed';a.style.opacity='0';document.body.appendChild(a);a.select();try{document.execCommand('copy')}catch(e4){}document.body.removeChild(a)}
19
+ var done=function(){window.close();setTimeout(function(){if(!window.closed){alert('Dango: token copied to clipboard! Could not close this tab, so just close it, go back to Dango Settings, paste the token and press Save.')}},250)};
20
+ if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(t).then(done,function(){copyFallback();done()})}else{copyFallback();done()}
21
+ })()`)}const Vt=()=>{const t=Ce(Bt,[]);return e("div",{style:{marginTop:"0.9rem",paddingTop:"0.9rem",borderTop:"1px dashed var(--border-color)"},children:[e("h4",{style:{margin:"0 0 0.35rem",fontSize:"0.95rem"},children:"Grab the token automatically (bookmarklet)"}),e("p",{style:{margin:"0 0 0.6rem",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Set this up once and you never have to dig through DevTools: the bookmarklet copies your Discord token to the clipboard and closes the Discord tab — then you just paste it above and press Save."}),e("ol",{style:{margin:"0 0 0.75rem",paddingLeft:"1.25rem",fontSize:"0.85rem",color:"var(--text-secondary)",display:"grid",gap:"0.3rem"},children:[e("li",{children:["Drag the ",e("strong",{style:{color:"var(--text-primary)"},children:"Dango Token Grabber"})," ","button below onto your bookmarks bar (press ",e("kbd",{children:"Ctrl"}),"+",e("kbd",{children:"Shift"}),"+",e("kbd",{children:"B"})," ","first if the bar is hidden)."]}),e("li",{children:["Click ",e("strong",{style:{color:"var(--text-primary)"},children:"Open Discord"})," and log in (skip this if you are already logged in)."]}),e("li",{children:["On the Discord tab, click the"," ",e("strong",{style:{color:"var(--text-primary)"},children:"Dango Token Grabber"})," bookmark. The token lands in your clipboard and the tab closes on its own — come back here, paste it above and press ",e("strong",{children:"Save"}),"."]})]}),e("div",{style:{display:"flex",gap:"0.5rem",alignItems:"center",flexWrap:"wrap"},children:[e("a",{href:t,onClick:d=>{d.preventDefault(),alert("Drag this button onto your bookmarks bar instead of clicking it, then click it while you are on discord.com.")},title:"Drag me to your bookmarks bar",draggable:!0,style:{display:"inline-flex",alignItems:"center",padding:"0.4rem 0.8rem",borderRadius:"999px",border:"1px dashed var(--accent)",background:"var(--bg-secondary)",color:"var(--text-primary)",fontSize:"0.85rem",textDecoration:"none",cursor:"grab",userSelect:"none"},children:[e(Y,{name:"bookmark",style:{marginRight:"0.45rem",color:"var(--accent)"}}),"Dango Token Grabber"]}),e("a",{className:"btn btn-secondary btn-sm",href:"https://discord.com/channels/@me",target:"_blank",rel:"noopener noreferrer",children:"Open Discord"}),e(T,{variant:"ghost",size:"sm",onClick:async()=>{try{await navigator.clipboard.writeText(t),alert('Bookmarklet code copied. Create a new bookmark on your bookmarks bar, name it "Dango Token" and paste the code as its URL.')}catch{alert(`Could not copy automatically. Right-click the "Dango Token Grabber" button and choose "Copy link address" instead, then paste that into a new bookmark's URL.`)}},children:"Copy code"})]}),e("p",{style:{margin:"0.5rem 0 0",fontSize:"0.75rem",color:"var(--text-tertiary)"},children:`"Copy code" is a fallback for browsers that won't drag bookmarklets: create any bookmark, then paste the copied code as its URL.`})]})},Qt="_sectionCard_1ag4p_1",Yt="_settingItem_1ag4p_25",Jt="_field_1ag4p_30",Xt="_input_1ag4p_43",Zt="_actions_1ag4p_63",ea="_status_1ag4p_69",D={sectionCard:Qt,settingItem:Yt,field:Jt,input:Xt,actions:Zt,status:ea},ta=()=>{const[t,r]=s(!1),[o,d]=s(""),[l,v]=s(""),[w,c]=s(!0),[a,i]=s(!1),[u,p]=s("");A(()=>{(async()=>{try{const x=await(await fetch("/api/auth/app-status")).json();r(x.hasPassword)}catch{console.error("Failed to fetch LAN auth status")}finally{c(!1)}})()},[]);const h=async()=>{if(p(""),o!==l){p("Passwords do not match");return}if(o.length<4){p("Password must be at least 4 characters");return}i(!0);try{const k=await fetch("/api/auth/app-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:o})}),R=await k.json();if(!k.ok){p(R.error||"Failed to update password");return}r(R.hasPassword),d(""),v(""),p(R.hasPassword?"Password set successfully":"Password removed")}catch{p("Network error")}finally{i(!1)}},_=async()=>{i(!0);try{const k=await fetch("/api/auth/app-setup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:""})}),R=await k.json();if(!k.ok){p(R.error||"Failed to remove password");return}r(!1),d(""),v(""),p("Password removed")}catch{p("Network error")}finally{i(!1)}},y=async()=>{i(!0);try{await fetch("/api/auth/app-logout",{method:"POST"}),p("Logged out"),window.location.reload()}catch{p("Logout failed")}finally{i(!1)}};return w?e("div",{className:D.sectionCard,children:e("p",{children:"Loading..."})}):e("div",{className:D.sectionCard,children:[e("h3",{children:"LAN Lock"}),e("p",{children:"Require a password to access this instance from any device, including this one. Sessions persist across server restarts until logout or password change."}),e("div",{className:D.settingItem,children:[e("div",{className:D.field,children:[e("label",{htmlFor:"lan-password",children:"New Password"}),e("input",{id:"lan-password",type:"password",value:o,onChange:k=>d(k.target.value),placeholder:t?"Leave empty to keep current password":"Enter a password...",className:D.input})]}),e("div",{className:D.field,children:[e("label",{htmlFor:"lan-confirm-password",children:"Confirm Password"}),e("input",{id:"lan-confirm-password",type:"password",value:l,onChange:k=>v(k.target.value),placeholder:"Confirm password...",className:D.input})]}),e("div",{className:D.actions,children:[e(T,{variant:"primary",onClick:h,loading:a,disabled:a,children:t?"Update Password":"Set Password"}),t&&e(T,{variant:"danger",onClick:y,loading:a,disabled:a,children:"Logout"}),t&&e(T,{variant:"secondary",onClick:_,loading:a,disabled:a,children:"Remove Password"})]}),u&&e("p",{className:D.status,children:u})]})]})},aa=()=>{const[t,r]=s(""),[o,d]=s(!0),[l,v]=s(!1),[w,c]=s("");A(()=>{fetch("/api/auth/app-status").then(i=>i.json()).then(i=>r(String(i.port??3e3))).catch(()=>c("Failed to load current port")).finally(()=>d(!1))},[]);const a=async()=>{const i=Number(t);if(!Number.isInteger(i)||i<1||i>65535){c("Enter a port between 1 and 65535");return}v(!0),c("");try{await C.auth.setServerPort.mutate({port:i}),c(`Saved. Restart dango, then open http://localhost:${i} — this overrides the PORT environment variable.`)}catch(u){c(u.message)}finally{v(!1)}};return o?e("div",{className:D.sectionCard,children:e("p",{children:"Loading..."})}):e("div",{className:D.sectionCard,children:[e("h3",{children:"Server Port"}),e("p",{children:"Port the backend listens on. Takes effect after a restart. Google and AniList sign-in need the matching redirect URI registered with the provider."}),e("div",{className:D.settingItem,children:[e("div",{className:D.field,children:[e("label",{htmlFor:"server-port",children:"Port"}),e("input",{id:"server-port",type:"number",min:1,max:65535,value:t,onChange:i=>r(i.target.value),className:D.input})]}),e("div",{className:D.actions,children:e(T,{variant:"primary",onClick:a,loading:l,disabled:l,children:"Save Port"})}),w&&e("p",{className:D.status,children:w})]})]})},na=()=>{const{theme:t,setTheme:r,loading:o}=Ie();return e("div",{children:[e("h4",{style:{margin:"0 0 0.25rem",fontSize:"1rem"},children:"Palette"}),e("p",{style:{margin:"0 0 0.75rem",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Taro is the default. Pick a palette that suits you."}),e("div",{role:"radiogroup","aria-label":"Palette",style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(150px, 1fr))",gap:"0.6rem"},children:Re.map(d=>{const l=t===d.id;return e("button",{role:"radio","aria-checked":l,disabled:o,onClick:()=>r(d.id),style:{display:"flex",gap:"0.6rem",alignItems:"center",textAlign:"left",padding:"0.65rem 0.75rem",borderRadius:"10px",cursor:"pointer",background:l?"var(--accent-subtle)":"var(--bg-tertiary)",border:l?"1px solid var(--accent)":"1px solid var(--border-primary)",color:"var(--text-primary)"},children:[e("span",{"aria-hidden":!0,style:{width:26,height:26,borderRadius:"50%",flex:"none",background:d.swatch,border:"1px solid rgba(0,0,0,0.35)"}}),e("span",{style:{minWidth:0},children:[e("span",{style:{display:"block",fontSize:"0.85rem",fontWeight:700},children:d.label}),e("span",{style:{display:"block",fontSize:"0.75rem",color:"var(--text-secondary)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:d.blurb})]})]},d.id)})})]})};function sa({variant:t="info",children:r,className:o=""}){return e("div",{className:`alert alert-${t} ${o}`,children:r})}const ra={anime:"Watchlist",manga:"Reading List",tv:"TV Watchlist",asmr:"Listening List"},ua=()=>{const[t,r]=Se(),{contentType:o}=he(),d=t.get("tab"),[l,v]=s(d&&["general","sync","watchlist","database"].includes(d)?d:"general"),[w,c]=s(""),a=H(null),i=H(null),u=H(new Map),[p,h]=s({top:0,height:0,left:0,width:0}),{lowEndMode:_,setLowEndMode:y}=xe(),{hasConsent:k,revoke:R}=Le(),[x,L]=s(Pe),[P,b]=s(!0),{data:S}=ae("discordRPCEnabled"),O=De(),[U,N]=s(!0),{data:G}=ae("dangoGaze"),[E,K]=s(!0),{data:f}=ae("discordRPCHideMature"),[J,X]=s(""),[W,ee]=s(null);A(()=>{C.discord.gatewayStatus.query().then(n=>{ee(n),n.masked&&n.masked!=="none"&&X(n.masked)}).catch(()=>{})},[]),A(()=>{S!==void 0&&b(S==="true"||S===!0||S===null)},[S]),A(()=>{f!==void 0&&K(f==="true"||f===!0||f===null)},[f]);const ge=n=>{b(n),O.mutate({key:"discordRPCEnabled",value:String(n)})};A(()=>{G!==void 0&&N(G!=="false"&&G!==!1)},[G]);const me=n=>{N(n),O.mutate({key:"dangoGaze",value:String(n)})},pe=n=>{K(n),O.mutate({key:"discordRPCHideMature",value:String(n)})},ye=n=>{L(n),localStorage.setItem(Ae,String(n)),window.dispatchEvent(new CustomEvent(Oe))};ce.useEffect(()=>{document.title="Settings - dango"},[]),ce.useEffect(()=>{const n=t.get("tab");n&&["general","sync","watchlist","database"].includes(n)&&v(n)},[t]);const Z=n=>{v(n),r(n==="general"?{}:{tab:n})},B=ie(()=>{const n=u.current.get(l),M=i.current;if(n&&M){const j=M.getBoundingClientRect(),F=n.getBoundingClientRect(),V=window.matchMedia("(max-width: 900px)").matches;h(V?{top:F.top-j.top,height:F.height,left:F.left-j.left,width:F.width}:{top:F.top-j.top,height:F.height,left:0,width:0})}},[l]);_e(()=>{B()},[l,B]),A(()=>{const n=()=>B();window.addEventListener("resize",n);let M=!1;return document.fonts?.ready&&document.fonts.ready.then(()=>{M||B()}),()=>{M=!0,window.removeEventListener("resize",n)}},[l,B]);const fe=()=>{c("Exporting databases...");const n=window.DangoBridge;if(n?.downloadFile){n.downloadFile("/api/backup-db","dango-backup.json"),setTimeout(()=>{c("Databases exported successfully!")},1500);return}const M=document.createElement("a");M.href="/api/backup-db",M.download="dango-backup.json",document.body.appendChild(M),M.click(),M.remove(),setTimeout(()=>{c("Databases exported successfully!")},1500)},ve=async n=>{const M=n.target.files?.[0];if(!M)return;c("Importing databases...");const j=new FormData;j.append("dbfile",M);try{const F=await fetch("/api/restore-db",{method:"POST",body:j}),V=await F.json();if(F.ok){const le=Array.isArray(V.restored)?V.restored.join(", "):null;c(le?`Databases imported successfully (${le})!`:"Database imported successfully!"),setTimeout(()=>window.location.reload(),2e3)}else c(`Import failed: ${V.error}`)}catch{c("Import failed: An unexpected error occurred.")}finally{n.target.value=""}},we=()=>{a.current?.click()},be=()=>{switch(l){case"general":return e("div",{className:m.tabContent,children:e("div",{className:m.sectionCard,children:[e("h3",{children:"Appearance & Preferences"}),e("p",{children:"Configure how titles are displayed and other general preferences."}),e("div",{className:m.settingItem,children:e(Ge,{})}),e("div",{className:m.settingItem,style:{marginTop:"1.5rem"},children:e(na,{})}),e("div",{className:m.settingItem,style:{marginTop:"1.5rem"},children:e("div",{className:m.settingRow,children:[e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Low End Mode"}),e("p",{style:{margin:"0.25rem 0 0",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Disables animations and heavy visual effects for better performance on older hardware."})]}),e(q,{isChecked:_,onChange:n=>y(n.target.checked),id:"low-end-mode"})]})}),e("div",{className:m.settingItem,style:{marginTop:"1.5rem"},children:e("div",{className:m.settingRow,children:[e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Dango Animations"}),e("p",{style:{margin:"0.25rem 0 0",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Lets the dango logo look around, blink and react when you pet it. Always off in Low End Mode."})]}),e(q,{isChecked:U,onChange:n=>me(n.target.checked),id:"dango-gaze"})]})}),e("div",{className:m.settingItem,style:{marginTop:"1.5rem"},children:e("div",{className:m.settingRow,children:[e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Virtual Keyboard"}),e("p",{style:{margin:"0.25rem 0 0",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Shows an on-screen keyboard when text search fields are focused."})]}),e(q,{isChecked:x,onChange:n=>ye(n.target.checked),id:"virtual-keyboard-enabled"})]})}),e("div",{className:m.settingItem,style:{marginTop:"1.5rem"},children:e("div",{className:m.settingRow,children:[e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Discord Rich Presence"}),e("p",{style:{margin:"0.25rem 0 0",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Show your current anime and watch progress on your Discord profile status."})]}),e(q,{isChecked:P,onChange:n=>ge(n.target.checked),id:"discord-rpc-enabled"})]})}),e("div",{style:{marginTop:"2rem"},children:e(ta,{})}),e("div",{style:{marginTop:"2rem"},children:e(aa,{})}),P&&e("div",{className:m.settingItem,style:{marginTop:"1rem"},children:e("div",{className:m.settingRow,children:[e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Hide Mature Content"}),e("p",{style:{margin:"0.25rem 0 0",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Hide mature content (18+) from Discord Rich Presence."})]}),e(q,{isChecked:E,onChange:n=>pe(n.target.checked),id:"discord-hide-mature"})]})}),e("div",{className:m.settingItem,style:{marginTop:"1.5rem",background:"var(--bg-tertiary)",padding:"1rem",borderRadius:"8px",border:"1px solid var(--border-color)"},children:[e("div",{className:m.settingRow,children:e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Discord Mobile Presence (Gateway)"}),e("p",{style:{margin:"0.25rem 0 0.75rem",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"Paste your Discord authentication token to enable presence on mobile devices. If no token is saved, the default desktop Rich Presence is used. The token is stored locally in your configuration and never shared."})]})}),e(sa,{variant:"warning",style:{marginTop:"1.25rem",paddingTop:"1.25rem"},children:[e("strong",{children:"Use at your own risk."})," This feature uses the Discord Gateway API with your user token, which violates Discord's Terms of Service. Discord may detect this usage and take action against your account, including phone number locks, temporary suspensions, or permanent bans. While the risk is generally low, it is not zero. Only use this if you understand and accept the risks."]}),e("div",{style:{marginTop:"0.75rem",display:"flex",gap:"0.5rem",alignItems:"center",flexWrap:"wrap"},children:[e("input",{type:"password",value:J,onChange:n=>X(n.target.value),placeholder:"Paste Discord token here...",style:{flex:"1 1 200px",padding:"0.5rem",borderRadius:"4px",border:"1px solid var(--border-color)",background:"var(--bg-primary)",color:"var(--text-primary)",fontFamily:"monospace",minWidth:0}}),e(T,{variant:"primary",size:"sm",onClick:async()=>{try{const n=await C.discord.gatewaySave.mutate({token:J});ee({hasToken:!0,masked:n.masked,enabled:!0}),X(n.masked)}catch(n){alert(n instanceof Error?n.message:"Failed to save token")}},children:"Save"}),e(T,{variant:"secondary",size:"sm",onClick:async()=>{await C.discord.gatewayRemove.mutate().catch(()=>{}),X(""),ee({hasToken:!1,masked:null,enabled:!1})},children:"Remove"})]}),W&&e("p",{style:{marginTop:"0.5rem",fontSize:"0.8rem",color:W.hasToken?"green":"var(--text-secondary)"},children:["Status:"," ",W.hasToken?`Token saved (${W.masked})`:"No token saved",W.enabled?" - Gateway active":""]}),e(Vt,{})]}),k&&e("div",{className:m.settingItem,style:{marginTop:"1.5rem"},children:e("div",{className:m.settingRow,children:[e("div",{style:{minWidth:0},children:[e("h4",{style:{margin:0,fontSize:"1rem"},children:"Mature Content"}),e("p",{style:{margin:"0.25rem 0 0",fontSize:"0.85rem",color:"var(--text-secondary)"},children:"You have previously agreed to view 18+ content. Toggle this off to re-enable the blur gate and filtering."})]}),e(q,{isChecked:!0,onChange:n=>{n.target.checked||(R(),window.location.reload())},id:"mature-content-enabled"})]})})]})});case"sync":return e("div",{className:m.tabContent,children:[e(Wt,{}),e(ct,{}),e(dt,{}),e(Ht,{})]});case"watchlist":return e("div",{className:m.tabContent,children:e(kt,{})});case"database":return e("div",{className:m.tabContent,children:[e("div",{className:m.sectionCard,children:[e("h3",{children:"Database Management"}),e("p",{children:"Download a backup of all databases (anime, manga, TV and ASMR) or restore from a backup file. Legacy single-file anime (.db) backups can still be restored."}),e("div",{className:m.controls,children:[e(T,{onClick:fe,children:"Backup Database"}),e(T,{variant:"secondary",onClick:we,children:"Restore Database"})]}),e("input",{type:"file",ref:a,onChange:ve,style:{position:"absolute",width:1,height:1,opacity:0,overflow:"hidden"},accept:".json,.db,application/octet-stream"}),w&&e("p",{className:m.status,children:w})]}),e(Et,{}),e(jt,{})]});default:return null}};return e("div",{className:"page-container",children:[e("div",{className:m.settingsHeader,children:[e("h1",{className:m.pageTitle,children:"Settings"}),e("p",{className:m.pageSubtitle,children:"Manage your preferences and data synchronization"})]}),e("div",{className:m.settingsLayout,children:[e("aside",{className:m.sidebar,ref:i,children:[e("div",{className:m.sidebarIndicator,style:{top:p.top,height:p.height,left:p.left,...p.width?{width:p.width}:{}}}),e("button",{ref:n=>{n&&u.current.set("general",n)},className:`${m.sidebarItem} ${l==="general"?m.active:""}`,onClick:()=>Z("general"),children:[e(Y,{name:"cog"})," ",e("span",{children:"General"})]}),e("button",{ref:n=>{n&&u.current.set("sync",n)},className:`${m.sidebarItem} ${l==="sync"?m.active:""}`,onClick:()=>Z("sync"),children:[e(Y,{name:"cloud"})," ",e("span",{children:"Synchronization"})]}),e("button",{ref:n=>{n&&u.current.set("watchlist",n)},className:`${m.sidebarItem} ${l==="watchlist"?m.active:""}`,onClick:()=>Z("watchlist"),children:[e(Y,{name:"list"})," ",e("span",{children:ra[o]})]}),e("button",{ref:n=>{n&&u.current.set("database",n)},className:`${m.sidebarItem} ${l==="database"?m.active:""}`,onClick:()=>Z("database"),children:[e(Y,{name:"database"})," ",e("span",{children:"Database"})]})]}),e("main",{className:m.mainContent,children:e("div",{className:m.tabContent,children:be()},l)})]})]})};export{ua as default};
@@ -1 +1 @@
1
- import{d as _,A as v,h as E,T as R,u as e,g as A}from"./vendor-core-DfaOB3Rn.js";import{I as P}from"./vendor-icons-DrybRNxP.js";import{u as L}from"./index-CfgPGaUO.js";const x="_pagination_zelsc_1",M="_pageBtn_zelsc_7",S="_pageInfo_zelsc_38",G="_pagePicker_zelsc_48",F="_dropdown_zelsc_52",K="_flipDown_zelsc_68",T="_jumpRow_zelsc_73",W="_jumpInput_zelsc_79",q="_jumpGo_zelsc_90",J="_optionList_zelsc_105",O="_optionBtn_zelsc_113",H="_current_zelsc_132",s={pagination:x,pageBtn:M,pageInfo:S,pagePicker:G,dropdown:F,flipDown:K,jumpRow:T,jumpInput:W,jumpGo:q,optionList:J,optionBtn:O,current:H},cn=({page:t,totalPages:d,canGoNext:m,onChange:p,isLoading:f=!1,variant:g="compact"})=>{const[l,u]=_(!1),[b,h]=_(""),[k,N]=_(0),[$,z]=_(!1),w=v(null),y=v(null),j=v(null);E(()=>{if(!l)return;const n=o=>{w.current&&!w.current.contains(o.target)&&u(!1)},r=o=>{o.key==="Escape"&&u(!1)};return document.addEventListener("pointerdown",n),document.addEventListener("keydown",r),()=>{document.removeEventListener("pointerdown",n),document.removeEventListener("keydown",r)}},[l]),E(()=>{if(!l)return;N(0),z(!1);const n=requestAnimationFrame(()=>{const r=j.current?.getBoundingClientRect(),o=y.current?.getBoundingClientRect();if(!r)return;let c=0;r.right>window.innerWidth-8?c=window.innerWidth-8-r.right:r.left<8&&(c=8-r.left),N(Math.round(c)),o&&o.top<r.height+24&&z(!0)});return()=>cancelAnimationFrame(n)},[l]);const i=d,C=R(()=>{if(i!==void 0){if(i<=100)return Array.from({length:i},(o,c)=>c+1);const r=new Set([1,i]);for(let o=t-10;o<=t+10;o++)o>=1&&o<=i&&r.add(o);return[...r].sort((o,c)=>o-c)}const n=m?t+1:t;return Array.from({length:n},(r,o)=>o+1)},[i,t,m]),B=n=>{const r=i!==void 0?Math.min(Math.max(1,n),i):Math.max(1,n);u(!1),h(""),r!==t&&p(r)},D=()=>{const n=parseInt(b,10);Number.isNaN(n)||B(n)},I=f||(i!==void 0?t>=i:!m);return e("div",{className:s.pagination,ref:w,children:[e("button",{className:s.pageBtn,onClick:()=>p(t-1),disabled:t<=1||f,"aria-label":"Previous page",children:[e(P,{name:"chevron-left",size:14}),g==="labeled"&&e("span",{children:"Previous"})]}),e("div",{className:s.pagePicker,ref:y,children:[e("button",{className:s.pageBtn,onClick:()=>{h(""),u(n=>!n)},disabled:f,"aria-label":"Jump to page","aria-expanded":l,children:e("span",{className:s.pageInfo,children:["Page ",e("strong",{children:t}),i!==void 0&&` of ${i}`]})}),l&&e("div",{ref:j,className:`${s.dropdown} ${$?s.flipDown:""}`,style:k!==0?{marginLeft:k}:void 0,children:[e("div",{className:s.jumpRow,children:[e("input",{className:s.jumpInput,type:"number",inputMode:"numeric",min:1,max:i,value:b,placeholder:"Page #",onChange:n=>h(n.currentTarget.value),onKeyDown:n=>{n.key==="Enter"&&D()}}),e("button",{className:s.jumpGo,onClick:D,children:"Go"})]}),e("div",{className:s.optionList,children:C.map(n=>e("button",{className:`${s.optionBtn} ${n===t?s.current:""}`,onClick:()=>B(n),disabled:n===t,children:n},n))})]})]}),e("button",{className:s.pageBtn,onClick:()=>p(t+1),disabled:I,"aria-label":"Next page",children:[g==="labeled"&&e("span",{children:"Next"}),e(P,{name:"chevron-right",size:14})]})]})},Q="_skeletonCard_1b0hr_1",U="_poster_1b0hr_11",V="_line_1b0hr_20",X="_info_1b0hr_38",Y="_short_1b0hr_54",Z="_horizontal_1b0hr_60",nn="_vertical_1b0hr_78",en="_lowEnd_1b0hr_97",a={skeletonCard:Q,poster:U,line:V,"skeleton-wave":"_skeleton-wave_1b0hr_1",info:X,short:Y,horizontal:Z,vertical:nn,lowEnd:en},tn=({layout:t="vertical"})=>{const{lowEndMode:d}=L();return e("div",{className:`${a.skeletonCard} ${a[t]} ${d?a.lowEnd:""}`,children:[e("div",{className:a.poster}),e("div",{className:a.info,children:[e("div",{className:a.line}),e("div",{className:`${a.line} ${a.short}`})]})]})},on=({count:t=14,layout:d="vertical"})=>e("div",{className:"grid-container",children:Array.from({length:t}).map((m,p)=>e(tn,{layout:d},p))}),ln=A.memo(on);export{tn as A,cn as P,ln as S};
1
+ import{d as _,A as v,h as E,T as R,u as e,g as A}from"./vendor-core-DfaOB3Rn.js";import{I as P}from"./vendor-icons-DrybRNxP.js";import{u as L}from"./index-B4AdKbhW.js";const x="_pagination_zelsc_1",M="_pageBtn_zelsc_7",S="_pageInfo_zelsc_38",G="_pagePicker_zelsc_48",F="_dropdown_zelsc_52",K="_flipDown_zelsc_68",T="_jumpRow_zelsc_73",W="_jumpInput_zelsc_79",q="_jumpGo_zelsc_90",J="_optionList_zelsc_105",O="_optionBtn_zelsc_113",H="_current_zelsc_132",s={pagination:x,pageBtn:M,pageInfo:S,pagePicker:G,dropdown:F,flipDown:K,jumpRow:T,jumpInput:W,jumpGo:q,optionList:J,optionBtn:O,current:H},cn=({page:t,totalPages:d,canGoNext:m,onChange:p,isLoading:f=!1,variant:g="compact"})=>{const[l,u]=_(!1),[b,h]=_(""),[k,N]=_(0),[$,z]=_(!1),w=v(null),y=v(null),j=v(null);E(()=>{if(!l)return;const n=o=>{w.current&&!w.current.contains(o.target)&&u(!1)},r=o=>{o.key==="Escape"&&u(!1)};return document.addEventListener("pointerdown",n),document.addEventListener("keydown",r),()=>{document.removeEventListener("pointerdown",n),document.removeEventListener("keydown",r)}},[l]),E(()=>{if(!l)return;N(0),z(!1);const n=requestAnimationFrame(()=>{const r=j.current?.getBoundingClientRect(),o=y.current?.getBoundingClientRect();if(!r)return;let c=0;r.right>window.innerWidth-8?c=window.innerWidth-8-r.right:r.left<8&&(c=8-r.left),N(Math.round(c)),o&&o.top<r.height+24&&z(!0)});return()=>cancelAnimationFrame(n)},[l]);const i=d,C=R(()=>{if(i!==void 0){if(i<=100)return Array.from({length:i},(o,c)=>c+1);const r=new Set([1,i]);for(let o=t-10;o<=t+10;o++)o>=1&&o<=i&&r.add(o);return[...r].sort((o,c)=>o-c)}const n=m?t+1:t;return Array.from({length:n},(r,o)=>o+1)},[i,t,m]),B=n=>{const r=i!==void 0?Math.min(Math.max(1,n),i):Math.max(1,n);u(!1),h(""),r!==t&&p(r)},D=()=>{const n=parseInt(b,10);Number.isNaN(n)||B(n)},I=f||(i!==void 0?t>=i:!m);return e("div",{className:s.pagination,ref:w,children:[e("button",{className:s.pageBtn,onClick:()=>p(t-1),disabled:t<=1||f,"aria-label":"Previous page",children:[e(P,{name:"chevron-left",size:14}),g==="labeled"&&e("span",{children:"Previous"})]}),e("div",{className:s.pagePicker,ref:y,children:[e("button",{className:s.pageBtn,onClick:()=>{h(""),u(n=>!n)},disabled:f,"aria-label":"Jump to page","aria-expanded":l,children:e("span",{className:s.pageInfo,children:["Page ",e("strong",{children:t}),i!==void 0&&` of ${i}`]})}),l&&e("div",{ref:j,className:`${s.dropdown} ${$?s.flipDown:""}`,style:k!==0?{marginLeft:k}:void 0,children:[e("div",{className:s.jumpRow,children:[e("input",{className:s.jumpInput,type:"number",inputMode:"numeric",min:1,max:i,value:b,placeholder:"Page #",onChange:n=>h(n.currentTarget.value),onKeyDown:n=>{n.key==="Enter"&&D()}}),e("button",{className:s.jumpGo,onClick:D,children:"Go"})]}),e("div",{className:s.optionList,children:C.map(n=>e("button",{className:`${s.optionBtn} ${n===t?s.current:""}`,onClick:()=>B(n),disabled:n===t,children:n},n))})]})]}),e("button",{className:s.pageBtn,onClick:()=>p(t+1),disabled:I,"aria-label":"Next page",children:[g==="labeled"&&e("span",{children:"Next"}),e(P,{name:"chevron-right",size:14})]})]})},Q="_skeletonCard_1b0hr_1",U="_poster_1b0hr_11",V="_line_1b0hr_20",X="_info_1b0hr_38",Y="_short_1b0hr_54",Z="_horizontal_1b0hr_60",nn="_vertical_1b0hr_78",en="_lowEnd_1b0hr_97",a={skeletonCard:Q,poster:U,line:V,"skeleton-wave":"_skeleton-wave_1b0hr_1",info:X,short:Y,horizontal:Z,vertical:nn,lowEnd:en},tn=({layout:t="vertical"})=>{const{lowEndMode:d}=L();return e("div",{className:`${a.skeletonCard} ${a[t]} ${d?a.lowEnd:""}`,children:[e("div",{className:a.poster}),e("div",{className:a.info,children:[e("div",{className:a.line}),e("div",{className:`${a.line} ${a.short}`})]})]})},on=({count:t=14,layout:d="vertical"})=>e("div",{className:"grid-container",children:Array.from({length:t}).map((m,p)=>e(tn,{layout:d},p))}),ln=A.memo(on);export{tn as A,cn as P,ln as S};
@@ -0,0 +1,2 @@
1
+ import{d as t,h as Re,g as Be,A as De,q as Fe,u as e,S as d}from"./vendor-core-DfaOB3Rn.js";import{u as qe,b as $e,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-B4AdKbhW.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",cn="_pageSubtitle_j1lbh_14",on="_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",vn="_checkboxCustom_j1lbh_141",wn="_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",Fn="_progressTitle_j1lbh_271",$n="_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",ca="_actionSection_j1lbh_524",oa="_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:cn,importCard:on,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:vn,optionText:wn,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:Fn,sourceBadge:$n,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:ca,inputGroup:oa,input:da,syncSummary:ma,syncErrors:pa,spin:ha,radioGroup:ua,radioLabel:ga,syncHint:ya,importLoading:ba},ce="tracker_anilist_client_id",Ue="49887".trim(),va=()=>{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),[_,oe]=t(""),[M,de]=t(!1),Ke=tn(),{data:me,isLoading:pe}=$e({queryKey:["trackerStatus"],queryFn:async()=>await h.tracker.status.query()}),{data:C}=$e({queryKey:["anilistClientId"],queryFn:async()=>(await h.settings.getByKey.query({key:ce})).value||""}),he=De(!1);Be.useEffect(()=>{he.current||C!==void 0&&(C&&oe(C),he.current=!0)},[C]);const v=me?.anilist?.connected??!1;Re(()=>{v&&x("sync")},[v]);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(ce,a):V&&Oe&&await N(ce,""),s.invalidateQueries({queryKey:["anilistClientId"]})}catch(A){i.error(A.message);return}const c=window.location.origin+window.location.pathname,U=encodeURIComponent(c);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"),[o,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),[ve,ne]=t(""),[we,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=Fe(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}),c=await N.json().catch(()=>({}));if(!N.ok)throw new Error(c.error||"Import failed");Ne({imported:c.imported??0,skipped:c.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:w})).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)}),[w,xe]=t(!1),[D,ze]=t(!0),[F,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=Fe(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 c=new FormData;c.append("xmlfile",r),c.append("erase",String(w)),c.append("useOfflineDb",String(D)),c.append("skipFallback",String(F));const U=await fetch("/api/import/mal-xml",{method:"POST",body:c,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
+ `);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(c){c instanceof DOMException&&c.name==="AbortError"?X("Import cancelled."):X(c.message)}finally{Le(!1),te.current=null}},[w,D,F,s]),Ve=()=>{te.current?.abort(),h.settings.malImportCancel.mutate().catch(()=>{})},Ze=p?Math.round(p.current/p.total*100):0,[$,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:v?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),v&&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=>oe(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.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.origin}/api/tracker/anilist/callback`}),", then paste the ",e("strong",{children:"Client ID"})," above."]})})]}),v&&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:w,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:v?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),v?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"]}),o&&e(d,{children:[e("div",{className:n.syncSummary,children:["Pushed: ",o.pushed," · Pulled: ",o.pulled," · Merged: ",o.merged," · Unchanged:"," ",o.unchanged,(o.skipped??0)>0&&e("span",{children:[" · Skipped: ",o.skipped]}),o.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",o.errors.length," error",o.errors.length>1?"s":""]})]}),(o.warnings?.length??0)>0&&e("div",{className:n.syncErrors,style:{marginTop:"8px"},children:[(o.warnings??[]).slice(0,5).map((a,r)=>e("div",{children:["⚠ ",a]},r)),(o.warnings?.length??0)>5&&e("div",{children:["+",(o.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:$==="username",onChange:()=>je("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMode",value:"xml",checked:$==="xml",onChange:()=>je("xml")}),e("span",{children:"XML File"})]})]}),$==="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:w,useOfflineDb:D,skipFallback:F})}})}),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:w,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:F,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."})]})]})]}),$==="username"?e("button",{className:n.syncBtn,onClick:()=>u.mutate({erase:w,useOfflineDb:D,skipFallback:F}),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"]})}),$==="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:we||"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||!we,children:[e(l,{name:"upload"})," ",z?"Importing...":"Start Import"]})}),f.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:f.error.message}),ve&&e("div",{className:`${n.statusMessage} ${n.error}`,children:ve}),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{va as default};
@@ -0,0 +1 @@
1
+ ._fullscreenFlat_1d0oj_1,._fullscreenFlat_1d0oj_1 ._video_1d0oj_2,._fullscreenFlat_1d0oj_1 ._delayCanvas_1d0oj_3,._fullscreenFlat_1d0oj_1 ._subtitleOverlay_1d0oj_4{border-radius:0}@media(max-width:900px)and (orientation:landscape){._fullscreenFlat_1d0oj_1{border-radius:0}}@container (max-width: 26rem){._timeDisplay_1d0oj_15{display:none}._bottomControls_1d0oj_19{padding:0 .75rem .75rem}._leftControls_1d0oj_23,._rightControls_1d0oj_24{gap:.2rem}._controlBtn_1d0oj_28{padding:5px;min-width:2.125rem;min-height:2.125rem}}._video_1d0oj_2{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;display:block;background:#000;border:none}._controlsOverlay_1d0oj_47{position:absolute;inset:0;opacity:1;transition:opacity .4s cubic-bezier(.4,0,.2,1);z-index:50;pointer-events:none;display:flex;flex-direction:column;justify-content:space-between;background:radial-gradient(circle,transparent 20%,rgba(0,0,0,.4) 100%)}._controlsOverlay_1d0oj_47>*{pointer-events:auto}._controlsOverlay_1d0oj_47._hidden_1d0oj_67{opacity:0;pointer-events:none;cursor:none}._topControls_1d0oj_73{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;gap:var(--space-6);background:linear-gradient(to bottom,rgba(0,0,0,.85) 0%,rgba(0,0,0,.45) 60%,transparent 100%);padding:var(--space-8) var(--space-10);transition:transform .4s cubic-bezier(.2,.8,.2,1);z-index:10;pointer-events:auto}._backBtn_1d0oj_93{background:transparent;border:none;color:#ffffffd9;font-size:1.6rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition-fast);padding:8px;border-radius:50%}._backBtn_1d0oj_93:hover{background:#0f0f1199;color:#fff;transform:scale(1.1)}._videoTitleInfo_1d0oj_113{display:flex;flex-direction:column;gap:.25rem}._animeTitle_1d0oj_119{font-size:1.4rem;font-weight:800;color:#fff;letter-spacing:-.01em;text-shadow:0 2px 4px rgba(0,0,0,.5)}._episodeLabel_1d0oj_127{font-size:.85rem;font-weight:600;color:#ffffffbf;text-shadow:0 2px 4px rgba(0,0,0,.5)}._speedBoostBadge_1d0oj_134{position:absolute;top:1.5rem;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:.7rem;padding:.65rem 1rem;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:var(--radius-md);background:#121216eb;color:#f5f3ff;font-size:.85rem;font-weight:800;letter-spacing:.06em;z-index:11;pointer-events:none}._speedBoostBadge_1d0oj_134 span{line-height:1}._speedBoostBadge_1d0oj_134 svg{display:block;flex-shrink:0}._bottomControls_1d0oj_19{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(to top,rgba(0,0,0,.85) 0%,rgba(0,0,0,.45) 60%,transparent 100%);padding:0 clamp(.5rem,1.5cqw,.75rem) clamp(.75rem,2.5cqw,1.5rem);z-index:10;pointer-events:auto;transition:transform .4s cubic-bezier(.2,.8,.2,1)}._progressBarContainer_1d0oj_180{width:100%;height:20px;display:flex;align-items:center;cursor:pointer;position:relative;touch-action:none}@media(pointer:coarse){._progressBarContainer_1d0oj_180{height:28px}._progressBarContainer_1d0oj_180 ._progressBar_1d0oj_180{height:6px}._progressBarContainer_1d0oj_180 ._thumb_1d0oj_199{opacity:1}}._progressBar_1d0oj_180{width:100%;height:4px;background:#fff3;border-radius:2px;position:relative;transition:height .15s ease}._progressBarContainer_1d0oj_180:hover ._progressBar_1d0oj_180{height:6px}._bufferedBar_1d0oj_217{position:absolute;top:0;left:0;height:100%;background:#ffffff4d;border-radius:2px;pointer-events:none}._watchedBar_1d0oj_227{position:absolute;top:0;left:0;height:100%;background:var(--accent);border-radius:2px;pointer-events:none}._thumb_1d0oj_199{position:absolute;top:50%;width:12px;height:12px;background:#fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 4px #0006;pointer-events:none;opacity:0;transition:opacity .15s ease}._progressBarContainer_1d0oj_180:hover ._thumb_1d0oj_199,._progressBarContainer_1d0oj_180._scrubbing_1d0oj_252 ._thumb_1d0oj_199{opacity:1}._timeBubble_1d0oj_256{position:absolute;bottom:24px;background:#000000d9;color:#fff;padding:4px 8px;border-radius:4px;font-size:.8rem;font-weight:500;transform:translate(-50%);pointer-events:none;white-space:nowrap}._bottomControlsRow_1d0oj_270{display:flex;align-items:center;justify-content:space-between;gap:.75rem;margin-top:8px}._leftControls_1d0oj_23{display:flex;align-items:center;gap:1rem;gap:clamp(.5rem,2.5cqw,1rem);min-width:0}._rightControls_1d0oj_24{display:flex;align-items:center;gap:.75rem;gap:clamp(.5rem,2cqw,.75rem)}._nextEpisodeBtn_1d0oj_293{background:#ffffff0f;border:1px solid rgba(255,255,255,.12);border-radius:var(--radius-md);padding:.45rem .8rem;color:#fffc;font-weight:600;font-size:.9rem;display:inline-flex;align-items:center;gap:.5rem;cursor:pointer;transition:all var(--transition-fast);white-space:nowrap}._nextEpisodeBtn_1d0oj_293:hover{background:#ffffff1a;color:#fff;transform:translateY(-1px);border-color:#fff3}._controlBtn_1d0oj_28{background:transparent;border:none;color:#ffffffd9;font-size:1.1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:8px;border-radius:4px;transition:all var(--transition-fast);min-width:2.125rem;min-height:2.125rem;flex:0 0 auto}@media(pointer:coarse){._controlBtn_1d0oj_28{padding:10px;min-width:2.75rem;min-height:2.75rem}}._controlBtn_1d0oj_28:hover{color:#fff;background:#ffffff1a}._controlBtn_1d0oj_28:focus{outline:none}._controlBtn_1d0oj_28:focus-visible{outline:2px solid var(--accent-light);outline-offset:2px}._controlBtn_1d0oj_28._active_1d0oj_355{color:var(--accent)}._volumeContainer_1d0oj_359{display:flex;align-items:center;position:relative}._volumeSlider_1d0oj_365{width:0;opacity:0;transform:scaleX(0);transform-origin:left;transition:all .3s cubic-bezier(.4,0,.2,1);cursor:pointer;margin-left:8px;-webkit-appearance:none;appearance:none;background:transparent;height:20px}._volumeContainer_1d0oj_359:hover ._volumeSlider_1d0oj_365,._volumeSlider_1d0oj_365:focus{width:80px;opacity:1;transform:scaleX(1)}._volumeSlider_1d0oj_365::-webkit-slider-runnable-track{width:100%;height:4px;background:linear-gradient(to right,var(--accent) 0%,var(--accent) var(--volume-percent, 0%),rgba(255,255,255,.2) var(--volume-percent, 0%),rgba(255,255,255,.2) 100%);border-radius:4px}._volumeSlider_1d0oj_365::-moz-range-track{width:100%;height:4px;background:#fff3;border-radius:4px}._volumeSlider_1d0oj_365::-moz-range-progress{height:4px;background:var(--accent);border-radius:4px}._volumeSlider_1d0oj_365::-webkit-slider-thumb{-webkit-appearance:none;height:12px;width:12px;border-radius:50%;background:#fff;margin-top:-4px;box-shadow:0 0 5px #00000080}._timeDisplay_1d0oj_15{color:#fffc;font-size:.85rem;font-weight:500;font-variant-numeric:tabular-nums;min-width:100px}._settingsPanel_1d0oj_430{position:absolute;bottom:clamp(6rem,15vh,8rem);right:clamp(1rem,3vw,2rem);background:#141418f2;border:1px solid var(--border-secondary);border-radius:var(--radius-md);width:max-content;min-width:12rem;max-width:min(19rem,calc(100vw - 1.5rem));font-size:.85rem;z-index:60;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 8px 32px #00000080;display:flex;flex-direction:column;overflow:hidden}._settingsHeader_1d0oj_449{display:flex;align-items:center;padding:.55rem .75rem;border-bottom:1px solid var(--border-secondary);gap:.625rem}._settingsBackBtn_1d0oj_457{background:transparent;border:none;color:#ffffffd9;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;border-radius:4px;transition:all var(--transition-fast)}._settingsBackBtn_1d0oj_457:hover{background:#ffffff1a;color:#fff}._settingsTitle_1d0oj_475{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._settingsContent_1d0oj_486{overflow-y:auto;padding:.375rem;display:flex;flex-direction:column;gap:.125rem;max-height:min(56vh,22rem)}._currentValue_1d0oj_495{color:var(--text-tertiary);font-size:.8rem;font-weight:500}._settingsLabel_1d0oj_501{padding:var(--space-2) var(--space-4);font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}._menuItem_1d0oj_510{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;min-height:2rem;padding:.5rem .75rem;background:transparent;border:none;color:var(--text-primary);font-size:.85rem;cursor:pointer;border-radius:var(--radius-sm);transition:background-color var(--transition-fast);text-align:left;white-space:nowrap}._menuItem_1d0oj_510:hover{background:var(--bg-tertiary)}._menuItem_1d0oj_510._active_1d0oj_355{background:color-mix(in srgb,var(--accent) 18%,transparent);color:var(--accent-lighter)}._currentValue_1d0oj_495{color:var(--text-secondary);font-size:.85rem}._menuNote_1d0oj_543{padding:.5rem .75rem;font-size:.7rem;line-height:1.5;color:var(--text-tertiary);white-space:normal;overflow-wrap:break-word}._spin_1d0oj_552{animation:_spin_1d0oj_552 1s linear infinite}._loadingOverlay_1d0oj_556{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;z-index:10;background:#00000080;border-radius:inherit}._loadingDots_1d0oj_567{display:flex;gap:10px}._dot_1d0oj_572{width:12px;height:12px;border-radius:50%;background-color:var(--accent);animation:_bounce_1d0oj_1 1.4s infinite ease-in-out both;box-shadow:0 0 10px var(--accent-glow)}._dot_1d0oj_572:nth-child(1){animation-delay:-.32s}._dot_1d0oj_572:nth-child(2){animation-delay:-.16s}@keyframes _bounce_1d0oj_1{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}._bufferingOverlay_1d0oj_601{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:20}._bufferingSpinner_1d0oj_610{width:50px;height:50px;border:4px solid rgba(255,255,255,.3);border-radius:50%;border-top-color:var(--accent);animation:_spin_1d0oj_552 1s ease-in-out infinite}@keyframes _spin_1d0oj_552{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media(pointer:coarse){._settingsPanel_1d0oj_430{font-size:.9rem;bottom:calc(env(safe-area-inset-bottom,0px) + 7rem);right:max(.75rem,env(safe-area-inset-right,0px))}._menuItem_1d0oj_510{min-height:2.75rem}._settingsContent_1d0oj_486{max-height:52vh}}@media(max-width:480px){._settingsPanel_1d0oj_430{min-width:9rem;max-width:calc(100vw - 2rem);font-size:.75rem;bottom:calc(env(safe-area-inset-bottom,0px) + 6rem)}._settingsHeader_1d0oj_449{padding:.4rem .625rem}._settingsTitle_1d0oj_475{font-size:.64rem}._menuItem_1d0oj_510{min-height:2.25rem;padding:.45rem .625rem;font-size:.75rem;gap:.5rem}._settingsContent_1d0oj_486{max-height:min(40vh,15rem)}}@media(max-height:500px)and (orientation:landscape){._settingsPanel_1d0oj_430{bottom:7.25rem;right:2rem;min-width:10rem;max-width:min(15rem,calc(100vw - 1.5rem));font-size:.8rem}._menuItem_1d0oj_510{min-height:2.5rem;font-size:.8rem}._settingsContent_1d0oj_486{max-height:50vh;overflow-y:auto}}._page_f7wlz_1{max-width:1200px;margin:0 auto;padding:1.5rem}._header_f7wlz_7{margin-bottom:1.5rem}._pageTitle_f7wlz_11{font-size:1.75rem;font-weight:700;margin:0 0 1rem;display:flex;align-items:center;gap:.5rem;color:var(--text-primary)}._searchForm_f7wlz_21{display:flex;gap:.5rem;max-width:600px}._searchInput_f7wlz_27{flex:1;padding:.6rem 1rem;border-radius:8px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);font-size:.95rem;outline:none}._searchInput_f7wlz_27:focus{border-color:var(--accent)}._searchBtn_f7wlz_42{padding:.6rem 1rem;border-radius:8px;border:none;background:var(--accent);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center}._searchBtn_f7wlz_42:hover{opacity:.9}._suggestions_f7wlz_58{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem}._suggestionPill_f7wlz_65{padding:.4rem .8rem;border-radius:20px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-secondary);cursor:pointer;font-size:.85rem;transition:all .15s ease}._suggestionPill_f7wlz_65:hover{border-color:var(--accent);color:var(--text-primary)}._statusMsg_f7wlz_81{padding:1rem;text-align:center;color:var(--text-secondary)}._statusMsg_f7wlz_81._error_f7wlz_87{color:#f87171}._statusMsg_f7wlz_81._textOnly_f7wlz_91{background:none;padding:.5rem}._spinner_f7wlz_96{animation:_spin_f7wlz_96 1s linear infinite;margin-right:.5rem}._sourceLoader_f7wlz_101{padding:.75rem;display:flex;justify-content:center}._ringSpinner_f7wlz_107{width:40px;height:40px;border:4px solid rgba(255,255,255,.1);border-left-color:var(--accent);border-radius:50%;animation:_spin_f7wlz_96 1s linear infinite}@keyframes _spin_f7wlz_96{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._grid_f7wlz_125{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:1rem}._skeletonCard_f7wlz_131{border-radius:8px;overflow:hidden}._skeletonThumb_f7wlz_136{aspect-ratio:2 / 3;background:var(--bg-secondary);border-radius:8px}._skeletonLine_f7wlz_142{height:12px;background:var(--bg-secondary);border-radius:4px;margin-top:.5rem}._shimmer_f7wlz_149{background:linear-gradient(90deg,var(--bg-secondary) 25%,var(--bg-elevated) 50%,var(--bg-secondary) 75%);background-size:200% 100%;animation:_shimmer_f7wlz_149 1.5s infinite}@keyframes _shimmer_f7wlz_149{0%{background-position:200% 0}to{background-position:-200% 0}}._backBtn_f7wlz_169{display:inline-flex;align-items:center;gap:.4rem;padding:.4rem .8rem;border-radius:6px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;font-size:.85rem;margin-bottom:1rem}._backBtn_f7wlz_169:hover{border-color:var(--accent)}._meta_f7wlz_187{display:flex;align-items:center;gap:.75rem;margin:.5rem 0;flex-wrap:wrap}._headerActions_f7wlz_195{display:flex;gap:.5rem;margin:.75rem 0 0;flex-wrap:wrap}._watchlistBtn_f7wlz_202{display:inline-flex;align-items:center;gap:.4rem;padding:.5rem 1rem;border-radius:6px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;font-size:.85rem;font-weight:600}._watchlistBtn_f7wlz_202:hover:not(:disabled){border-color:var(--accent)}._watchlistBtn_f7wlz_202._active_f7wlz_220{border-color:var(--color-success);color:var(--color-success)}._watchlistBtn_f7wlz_202:disabled{opacity:.6;cursor:default}._year_f7wlz_230{color:var(--text-secondary);font-size:.9rem}._rating_f7wlz_235{display:inline-flex;align-items:center;gap:4px;color:var(--accent-lighter);font-weight:600;font-size:.9rem}._typeBadge_f7wlz_244{padding:2px 10px;border-radius:4px;font-size:.75rem;font-weight:600;text-transform:uppercase}._typeBadge_f7wlz_244._tv_f7wlz_252{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}._typeBadge_f7wlz_244._movie_f7wlz_257{background:color-mix(in srgb,var(--accent-lighter) 20%,transparent);color:var(--accent-lighter)}._typeBadge_f7wlz_244._tvSeries_f7wlz_262,._typeBadge_f7wlz_244._tvMiniSeries_f7wlz_267{background:color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent)}._overview_f7wlz_272{color:var(--text-secondary);line-height:1.6;margin:.5rem 0 0;max-width:800px}._controls_f7wlz_279{display:flex;flex-wrap:wrap;gap:1rem;margin:1rem 0;align-items:flex-end}._controlLabel_f7wlz_287{display:flex;flex-direction:column;gap:.3rem;font-size:.8rem;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.05em}._select_f7wlz_297{height:42px;padding:0 1rem;border-radius:var(--radius-md);border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);font-size:.9rem;cursor:pointer;min-width:160px}._playerSection_f7wlz_309{margin:0;border-radius:0;overflow:hidden;overflow:clip;isolation:isolate;background:#000;position:relative}._video_f7wlz_313{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;display:block;background:#000;border:none;border-radius:inherit}._videoHidden_f7wlz_335{opacity:0;pointer-events:none}._delayCanvas_f7wlz_340{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;opacity:0;pointer-events:none;z-index:2;border-radius:inherit}._delayCanvasActive_f7wlz_353{opacity:1}._subtitleOverlay_f7wlz_357{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;pointer-events:none;overflow:hidden;border-radius:inherit}@media(max-width:900px)and (orientation:landscape){._playerSection_f7wlz_309{margin:0;border-radius:0}}._videoIframe_f7wlz_376{width:100%;aspect-ratio:16 / 9;min-height:400px;border:none;background:#000}._retryButton_f7wlz_384{margin-left:8px;padding:4px 10px;border-radius:4px;border:1px solid var(--border-primary);background:var(--bg-elevated);color:var(--text-primary);cursor:pointer;font-size:.8rem}._retryButton_f7wlz_384:hover{border-color:var(--accent)}._sidebarSeason_f7wlz_399{display:flex;flex-direction:column;gap:.4rem;font-size:.75rem;font-weight:700;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.1em;margin-bottom:var(--space-4)}._sidebarSeason_f7wlz_399 ._select_f7wlz_297{width:100%}._mobileSeasonRow_f7wlz_415{display:none}@media(max-width:768px){._mobileSeasonRow_f7wlz_415{display:block}._mobileSeasonRow_f7wlz_415 ._sidebarSeason_f7wlz_399{margin-bottom:0}}._providerSelectWrap_f7wlz_429{display:flex;align-items:flex-end;gap:1rem;flex-wrap:wrap;min-width:0}._providerSelectWrap_f7wlz_429 ._backBtn_f7wlz_169{margin-bottom:0}._genreRow_f7wlz_441{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.6rem}._genreChip_f7wlz_448{padding:.2rem .7rem;border-radius:20px;border:1px solid var(--glass-border);background:#ffffff0d;color:var(--text-secondary);font-size:.78rem;font-weight:600}._metaRow_f7wlz_458{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.6rem;color:var(--text-secondary);font-size:.9rem}._detailGrid_f7wlz_467{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:1.1rem 1.25rem;align-content:start;min-width:0}._detailItem_f7wlz_475{display:flex;flex-direction:column;gap:.2rem;padding:0;border-radius:0;border:0;background:none}._detailItem_f7wlz_475 strong{font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary)}._detailItem_f7wlz_475 span{color:var(--text-primary);font-size:.9rem}._imdbLink_f7wlz_497{color:var(--accent-light);font-size:.9rem;text-decoration:none}._imdbLink_f7wlz_497:hover{text-decoration:underline}
@@ -0,0 +1,4 @@
1
+ import{u as t,d as _,A,h as v,S as Me,g as Yr,o as Gr,p as Qr,a as Xr,T as Ee,q as S}from"./vendor-core-DfaOB3Rn.js";import{u as Zr}from"./vendor-query-BBT5_sHx.js";import{g as an,e as Jr,t as _t,z as es,O as ts,M as Ln,B as We}from"./index-B4AdKbhW.js";import{I as j}from"./vendor-icons-DrybRNxP.js";import{S as ns,U as rs,p as zn,M as ss,D as fr,m as Dn,k as os,C as as,a as is,b as ls,c as sn,u as cs,d as ds,e as us,j as ms,f as hs,h as fs,l as gs,B as ps,i as Mn,F as bs,G as vs,H as ur,s as Pn,n as ys,o as _s,q as Ss,r as Ts,t as Le,A as Cs,v as ks,E as Es,y as ws,P as Ns,w as ue,z as xs,R as Is}from"./AvSyncCalibrator-DBBUzoHn.js";import{S as Bs,O as Rn,a as As,A as Ls,b as Ms}from"./OptionListMenu-CetjZizt.js";import{u as Ps}from"./useProviders-C7jrBgxf.js";import{d as Rs,g as $s,h as zs,f as Ds,e as Os,j as Fs,k as Vs}from"./useTvLibrary-73NkS_5R.js";import{l as js,c as Us}from"./hls-qCuNYJym.js";import{u as Ws}from"./useIsMobile-Dvx1uJ82.js";import{S as Hs}from"./SynopsisText-B3Sa5pRv.js";const Ks="_fullscreenFlat_1d0oj_1",qs="_timeDisplay_1d0oj_15",Ys="_bottomControls_1d0oj_19",Gs="_leftControls_1d0oj_23",Qs="_rightControls_1d0oj_24",Xs="_controlBtn_1d0oj_28",Zs="_controlsOverlay_1d0oj_47",Js="_hidden_1d0oj_67",eo="_topControls_1d0oj_73",to="_backBtn_1d0oj_93",no="_videoTitleInfo_1d0oj_113",ro="_animeTitle_1d0oj_119",so="_episodeLabel_1d0oj_127",oo="_speedBoostBadge_1d0oj_134",ao="_progressBarContainer_1d0oj_180",io="_progressBar_1d0oj_180",lo="_thumb_1d0oj_199",co="_bufferedBar_1d0oj_217",uo="_watchedBar_1d0oj_227",mo="_scrubbing_1d0oj_252",ho="_timeBubble_1d0oj_256",fo="_bottomControlsRow_1d0oj_270",go="_nextEpisodeBtn_1d0oj_293",po="_active_1d0oj_355",bo="_settingsPanel_1d0oj_430",vo="_settingsHeader_1d0oj_449",yo="_settingsBackBtn_1d0oj_457",_o="_settingsTitle_1d0oj_475",So="_settingsContent_1d0oj_486",To="_currentValue_1d0oj_495",Co="_menuItem_1d0oj_510",ko="_menuNote_1d0oj_543",Eo="_loadingOverlay_1d0oj_556",wo="_loadingDots_1d0oj_567",No="_dot_1d0oj_572",xo="_bufferingOverlay_1d0oj_601",Io="_bufferingSpinner_1d0oj_610",a={fullscreenFlat:Ks,timeDisplay:qs,bottomControls:Ys,leftControls:Gs,rightControls:Qs,controlBtn:Xs,controlsOverlay:Zs,hidden:Js,topControls:eo,backBtn:to,videoTitleInfo:no,animeTitle:ro,episodeLabel:so,speedBoostBadge:oo,progressBarContainer:ao,progressBar:io,thumb:lo,bufferedBar:co,watchedBar:uo,scrubbing:mo,timeBubble:ho,bottomControlsRow:fo,nextEpisodeBtn:go,active:po,settingsPanel:bo,settingsHeader:vo,settingsBackBtn:yo,settingsTitle:_o,settingsContent:So,currentValue:To,menuItem:Co,menuNote:ko,loadingOverlay:Eo,loadingDots:wo,dot:No,bufferingOverlay:xo,bufferingSpinner:Io},Bo=({player:o,visible:p,settingsOpen:U,onOpenSettings:O,onCloseSettings:G,hasSubtitles:R,isSubtitleActive:r,subtitles:I,onSubtitleChange:i,showNextEpisodeButton:te,onNextEpisode:Q,isTheaterMode:$,onTheaterModeToggle:f,timeLabelRef:K})=>{const{state:h,refs:He,actions:z}=o,X=He.videoRef,Pe=T=>{const ne=X.current;!ne||isNaN(h.duration)||h.duration===0||(ne.currentTime=T*h.duration)},Re=()=>{X.current&&(z.setIsScrubbing(!0),z.wasPlayingBeforeScrub.current=!X.current.paused,X.current.pause())},Ke=T=>{const ne=X.current;ne&&h.duration&&(ne.currentTime=T*h.duration)},qe=()=>{z.setIsScrubbing(!1),z.wasPlayingBeforeScrub.current&&X.current?.play().catch(()=>{})},Je=T=>{const ne=X.current;ne&&(ne.volume=T,ne.muted=T===0)},ae=()=>{if(r){i(-1);return}let T=null;try{T=localStorage.getItem("tvLastSubtitle")}catch{}i(zn(I,{lastKey:T,enabled:!0}))},q=h.isMuted?t(j,{name:"volume-mute"}):h.volume<.5?t(j,{name:"volume-down"}):t(j,{name:"volume-up"});return t("div",{className:`${a.controlsOverlay} ${p?"":a.hidden}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:a.bottomControls,onClick:T=>T.stopPropagation(),children:[t(ns,{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:an,isScrubbing:h.isScrubbing,buffered:"full",onSeek:Pe,onScrubStart:Re,onScrubMove:Ke,onScrubEnd:qe,timeLabelRef:K}),t("div",{className:a.bottomControlsRow,children:[t("div",{className:a.leftControls,children:[t("button",{className:a.controlBtn,onClick:z.togglePlay,"aria-label":h.isPlaying?"Pause":"Play",children:h.isPlaying?t(j,{name:"pause"}):t(j,{name:"play"})}),t(rs,{muted:h.isMuted,volume:h.volume,volumeIcon:q,buttonClassName:a.controlBtn,onToggleMute:z.toggleMute,onVolumeChange:Je,onExpandedChange:T=>z.setShowVolumeSlider(T)}),t("span",{className:a.timeDisplay,ref:K,children:[an(0)," / ",an(h.duration)]})]}),t("div",{className:a.rightControls,children:[te&&t("button",{className:a.nextEpisodeBtn,onClick:Q,title:"Play next episode",children:"Next EP"}),R&&t("button",{className:`${a.controlBtn} ${r?a.active:""}`,onClick:ae,"aria-label":r?"Turn subtitles off":"Turn subtitles on",children:t(j,{name:"closed-captioning"})}),t("button",{className:`${a.controlBtn} ${U?a.active:""}`,onClick:()=>U?G():O(),"aria-label":"Settings",children:t(j,{name:"cog"})}),t("button",{className:`${a.controlBtn} ${$?a.active:""}`,onClick:T=>{T.stopPropagation(),f()},title:$?"Exit Theater Mode":"Theater Mode","aria-label":$?"Exit Theater Mode":"Theater Mode",children:t(j,{name:"tv"})}),t("button",{className:a.controlBtn,onClick:z.toggleFullscreen,"aria-label":h.isFullscreen?"Exit Fullscreen":"Fullscreen",children:h.isFullscreen?t(j,{name:"compress"}):t(j,{name:"expand"})})]})]})]})})},on=-6e4,$n=6e4,mr=500,Ao=({classes:o,delayMs:p,onDelayChange:U})=>{const[O,G]=_(null),R=O??p,r=A(U);r.current=U;const I=A(p);I.current=p;const i=A(null);i.current=O,v(()=>{G(null)},[p]),v(()=>()=>{const $=i.current;$!==null&&$!==I.current&&r.current($)},[]);const te=$=>{I.current=$,i.current=null,r.current($),G(null)},Q=$=>{const f=i.current??I.current,K=Math.max(on,Math.min($n,f+$));te(K)};return t(Me,{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(-mr),"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(mr),"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:()=>te(0),disabled:R===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(ss,{label:"Subtitle timing",display:fr(R),min:on,max:$n,step:100,value:R,percent:(R-on)/($n-on)*100,onChange:$=>{const f=Math.round($);i.current=f,G(f)},onCommit:()=>{const $=i.current;$!==null&&te($)}}),t("div",{className:o.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},Lo=({view:o,onSelectView:p,onClose:U,player:O,onSubtitleStyleChange:G,streams:R,resolutionIdx:r,onResolutionChange:I,hasSubtitles:i,subtitles:te,selectedSubtitle:Q,isSubtitleActive:$,onSubtitleChange:f,audioTracks:K,selectedAudioTrack:h,onAudioTrackChange:He,videoDelayEnabled:z,onVideoDelayToggle:X,videoDelayMs:Pe,onVideoDelayChange:Re,onCalibrate:Ke,subtitleDelayMs:qe,onSubtitleDelayChange:Je,ambientSettings:ae,onAmbientChange:q})=>{const{state:T}=O,ne=()=>t(Me,{children:[R.length>1&&t("button",{className:a.menuItem,onClick:()=>p("resolution"),children:[t("span",{children:"Resolution"}),t("span",{className:a.currentValue,children:R[r]?.quality||"Auto"})]}),i&&t("button",{className:a.menuItem,onClick:()=>p("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:a.currentValue,children:$?te[Q]?.label||te[Q]?.language:"Off"})]}),i&&t("button",{className:a.menuItem,onClick:()=>p("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:a.currentValue,children:[T.subtitleFontSize.toFixed(1),"x · ",T.subtitlePosition]})]}),i&&t("button",{className:a.menuItem,onClick:()=>p("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:a.currentValue,children:fr(qe)})]}),K.length>0&&t("button",{className:a.menuItem,onClick:()=>p("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:()=>p("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:a.currentValue,children:z?`${Pe}ms`:"Off"})]}),ae&&q&&t("button",{className:a.menuItem,onClick:()=>p("ambient"),children:[t("span",{children:"Ambient Light"}),t("span",{className:a.currentValue,children:ae.enabled?"On":"Off"})]})]}),Te=()=>t(Rn,{classes:{item:a.menuItem,active:a.active},options:R.map((C,W)=>({key:String(W),label:C.quality,selected:W===r})),onSelect:C=>I(Number(C))}),Y=()=>t(Rn,{classes:{item:a.menuItem,active:a.active},options:[{key:"off",label:"Off",selected:!$},...te.map((C,W)=>({key:String(W),label:C.label||C.language,selected:W===Q}))],onSelect:C=>f(C==="off"?-1:Number(C))}),Ce=()=>t(As,{classes:{item:a.menuItem,active:a.active},values:{fontSize:T.subtitleFontSize,position:T.subtitlePosition,bgOpacity:T.subtitleBgOpacity,bgColor:T.subtitleBgColor,textColor:T.subtitleTextColor,edge:T.subtitleEdge,bold:T.subtitleBold},onChange:G}),L=()=>t(Ao,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},delayMs:qe,onDelayChange:C=>Je?.(C)}),$e=()=>t(Rn,{classes:{item:a.menuItem,active:a.active},options:K.map((C,W)=>({key:String(W),label:C.label||C.language,selected:W===h})),onSelect:C=>He(Number(C))}),Ye=()=>t(Ls,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},enabled:z,delayMs:Pe,onToggle:C=>X?.(C),onDelayChange:C=>Re?.(C),onCalibrate:Ke}),be=()=>ae&&q?t(Ms,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},values:ae,onChange:q}):null;return t("div",{"data-speed-boost-ignore":"true",onClick:C=>C.stopPropagation(),children:t(Bs,{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"?U():p("main"),children:[o==="main"&&ne(),o==="resolution"&&Te(),o==="subtitles"&&Y(),o==="subtitle-style"&&Ce(),o==="subtitle-timing"&&L(),o==="audio"&&$e(),o==="av-sync"&&Ye(),o==="ambient"&&be()]})})},Mo=({player:o,title:p,episodeLabel:U,audioTracks:O,selectedAudioTrack:G,onAudioTrackChange:R,subtitles:r,selectedSubtitle:I,onSubtitleChange:i,streams:te,resolutionIdx:Q,onResolutionChange:$,onBack:f,children:K,videoDelayEnabled:h=!1,onVideoDelayToggle:He,videoDelayMs:z=0,onVideoDelayChange:X,onCalibrateAvSync:Pe,subtitleDelayMs:Re=0,onSubtitleDelayChange:Ke,showNextEpisodeButton:qe=!1,onNextEpisode:Je,isLoading:ae=!1,isTheaterMode:q,onTheaterModeToggle:T,ambientSettings:ne,onAmbientChange:Te})=>{const{state:Y,refs:Ce,actions:L}=o,$e=Ce.videoRef,{subtitleFontSize:Ye,subtitlePosition:be,subtitleBgOpacity:C,subtitleBgColor:W,subtitleTextColor:it,subtitleEdge:ie,subtitleBold:ze}=Y,[we,De]=_(null),lt=A(null),[Ft,St]=_(0);v(()=>{const le=$e.current;if(!le)return;const u=()=>St(le.clientHeight||0);u();const ut=new ResizeObserver(u);return ut.observe(le),()=>ut.disconnect()},[$e]);const me=(le,u)=>{try{localStorage.setItem(le,String(u))}catch{}},ve=(le,u)=>{switch(le){case"fontSize":typeof u=="number"&&(L.setSubtitleFontSize(u),me("subtitleFontSize",u));break;case"position":typeof u=="number"&&(L.setSubtitlePosition(u),me("subtitlePosition",u));break;case"bgOpacity":typeof u=="number"&&(L.setSubtitleBgOpacity(u),me("subtitleBgOpacity",u));break;case"bgColor":typeof u=="string"&&(L.setSubtitleBgColor(u),me("subtitleBgColor",u));break;case"textColor":typeof u=="string"&&(L.setSubtitleTextColor(u),me("subtitleTextColor",u));break;case"edge":(u==="shadow"||u==="outline"||u==="none")&&(L.setSubtitleEdge(u),me("subtitleEdge",u));break;case"bold":typeof u=="boolean"&&(L.setSubtitleBold(u),me("subtitleBold",u));break}};v(()=>{const le="tv-player-subtitle-style";let u=document.getElementById(le);u||(u=document.createElement("style"),u.id=le,document.head.appendChild(u));const ut={fontSize:Ye,position:be,bgOpacity:C,bgColor:W,textColor:it,edge:ie,bold:ze},Z=$e.current,Et=Dn(Ye,Ft||Z?.clientHeight||720);if(u.textContent=os({...ut,fontSize:Et}),Z){const wt=()=>{const B=Number(be);return isNaN(B)?0:Math.max(0,Math.min(100,B))},mt=(B,J)=>{try{const de=B;de.snapToLines=!1,de.line=J}catch{}},Nt=()=>{const B=Et*16,J=Z.videoHeight||Z.clientHeight||720,de=Z.videoWidth||Z.clientWidth||1280;return{step:B*1.3/J*100,chars:Math.max(20,Math.floor(de/(B*.55)))}},y=B=>{const J=Math.max(0,Math.min(100,100-wt())),de=Array.from(B.activeCues??[]);if(de.length<=1){de.forEach(Fe=>mt(Fe,J));return}const{step:Bt,chars:cn}=Nt();let ke=J;for(let Fe=de.length-1;Fe>=0;Fe--){const dn=String(de[Fe].text??"").replace(/<[^>]*>/g,"").split(`
2
+ `).reduce((un,ye)=>un+Math.max(1,Math.ceil(ye.length/cn)),0),Ut=ke-dn*Bt;mt(de[Fe],Math.max(0,Ut)),ke=Ut-Bt*.4}},c=()=>{const B=Math.max(0,Math.min(100,100-wt()));Array.from(Z.textTracks).forEach(J=>{J.cues&&(Array.from(J.cues).forEach(de=>mt(de,B)),J.mode==="showing"&&y(J))})};c();const re=B=>{const J=B.target;J.mode==="showing"&&y(J)},ce=()=>{Array.from(Z.textTracks).forEach(B=>{B.removeEventListener("cuechange",re),B.addEventListener("cuechange",re)}),c()};Array.from(Z.textTracks).forEach(B=>{B.addEventListener("cuechange",re)}),Z.textTracks.addEventListener("addtrack",ce);const xt=Array.from(Z.querySelectorAll("track")),It=()=>c();return xt.forEach(B=>B.addEventListener("load",It)),()=>{Array.from(Z.textTracks).forEach(B=>{B.removeEventListener("cuechange",re)}),Z.textTracks.removeEventListener("addtrack",ce),xt.forEach(B=>B.removeEventListener("load",It))}}},[Ye,be,C,W,it,ie,ze,I,r,$e,Ft]);const Tt=r.length>0,ct=I>=0,M=()=>{De("main"),L.setShowControls(!0)},dt=()=>{De(null)},Ct=Y.showControls||!!we,Oe=t(ls,{visible:Ct,title:p,episode:U,onBack:f,classes:{overlay:a.controlsOverlay,hidden:a.hidden,top:a.topControls,backBtn:a.backBtn,titleInfo:a.videoTitleInfo,title:a.animeTitle,episode:a.episodeLabel}}),Vt=!ae&&!Y.isBuffering&&Y.duration>0?t(as,{isPlaying:Y.isPlaying,onTogglePlay:L.togglePlay,onSkipBack:()=>L.seek(-10),onSkipForward:()=>L.seek(10)}):null,ln=t(Bo,{player:o,visible:Ct,settingsOpen:!!we,onOpenSettings:M,onCloseSettings:dt,hasSubtitles:Tt,isSubtitleActive:ct,subtitles:r,onSubtitleChange:i,showNextEpisodeButton:qe,onNextEpisode:Je,isTheaterMode:q,onTheaterModeToggle:T,timeLabelRef:lt}),kt=we?t(Lo,{view:we,onSelectView:De,onClose:dt,player:o,onSubtitleStyleChange:ve,streams:te,resolutionIdx:Q,onResolutionChange:$,hasSubtitles:Tt,subtitles:r,selectedSubtitle:I,isSubtitleActive:ct,onSubtitleChange:i,audioTracks:O,selectedAudioTrack:G,onAudioTrackChange:R,videoDelayEnabled:h,onVideoDelayToggle:He,videoDelayMs:z,onVideoDelayChange:X,onCalibrate:()=>{De(null),Pe?.()},subtitleDelayMs:Re,onSubtitleDelayChange:Ke,ambientSettings:ne,onAmbientChange:Te}):null,jt=t(Me,{children:[ae&&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&&!ae&&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(j,{name:"forward",size:12})]})]});return t(is,{player:o,topBar:Oe,centerControls:Vt,bottomBar:!ae&&Y.duration>0?ln:null,settingsPanel:kt,overlays:jt,isInteracting:!!we,className:Y.isFullscreen?a.fullscreenFlat:"",children:K})},Po=({servers:o,selectedServer:p,onServerSelect:U})=>o.length===0?null:t("div",{className:sn.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:sn.sourceButtons,children:o.map(O=>t("button",{className:`${sn.sourceButton} ${p===O?sn.active:""}`,onClick:()=>U(O),children:O},O))})]}),Ro=Yr.memo(Po);function $o(o,p,U){const O=()=>{const R=Array.isArray(o.audioTracks)?o.audioTracks.length:0,r=U.getWant(),I=R>0?Math.min(Math.max(0,r),R-1):r;o.audioTrack=I,I!==r&&U.onResolve(I)},G=(R,r)=>{const I=U.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}U.onResolve(r.id)};return o.on(p.MANIFEST_PARSED,O),o.on(p.AUDIO_TRACK_SWITCHED,G),()=>{o.off(p.MANIFEST_PARSED,O),o.off(p.AUDIO_TRACK_SWITCHED,G)}}const zo=/\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 Do(){try{if(zo.test(navigator.userAgent||""))return!0;const o=navigator.deviceMemory;if(typeof o=="number"&&o>0&&o<2)return!0}catch{}return!1}const Oo="_page_f7wlz_1",Fo="_header_f7wlz_7",Vo="_pageTitle_f7wlz_11",jo="_searchForm_f7wlz_21",Uo="_searchInput_f7wlz_27",Wo="_searchBtn_f7wlz_42",Ho="_suggestions_f7wlz_58",Ko="_suggestionPill_f7wlz_65",qo="_statusMsg_f7wlz_81",Yo="_error_f7wlz_87",Go="_textOnly_f7wlz_91",Qo="_spinner_f7wlz_96",Xo="_spin_f7wlz_96",Zo="_sourceLoader_f7wlz_101",Jo="_ringSpinner_f7wlz_107",ea="_grid_f7wlz_125",ta="_skeletonCard_f7wlz_131",na="_skeletonThumb_f7wlz_136",ra="_skeletonLine_f7wlz_142",sa="_shimmer_f7wlz_149",oa="_backBtn_f7wlz_169",aa="_meta_f7wlz_187",ia="_headerActions_f7wlz_195",la="_watchlistBtn_f7wlz_202",ca="_active_f7wlz_220",da="_year_f7wlz_230",ua="_rating_f7wlz_235",ma="_typeBadge_f7wlz_244",ha="_tv_f7wlz_252",fa="_movie_f7wlz_257",ga="_tvSeries_f7wlz_262",pa="_tvMiniSeries_f7wlz_267",ba="_overview_f7wlz_272",va="_controls_f7wlz_279",ya="_controlLabel_f7wlz_287",_a="_select_f7wlz_297",Sa="_playerSection_f7wlz_309",Ta="_video_f7wlz_313",Ca="_videoHidden_f7wlz_335",ka="_delayCanvas_f7wlz_340",Ea="_delayCanvasActive_f7wlz_353",wa="_subtitleOverlay_f7wlz_357",Na="_videoIframe_f7wlz_376",xa="_retryButton_f7wlz_384",Ia="_sidebarSeason_f7wlz_399",Ba="_mobileSeasonRow_f7wlz_415",Aa="_providerSelectWrap_f7wlz_429",La="_genreRow_f7wlz_441",Ma="_genreChip_f7wlz_448",Pa="_metaRow_f7wlz_458",Ra="_detailGrid_f7wlz_467",$a="_detailItem_f7wlz_475",za="_imdbLink_f7wlz_497",b={page:Oo,header:Fo,pageTitle:Vo,searchForm:jo,searchInput:Uo,searchBtn:Wo,suggestions:Ho,suggestionPill:Ko,statusMsg:qo,error:Yo,textOnly:Go,spinner:Qo,spin:Xo,sourceLoader:Zo,ringSpinner:Jo,grid:ea,skeletonCard:ta,skeletonThumb:na,skeletonLine:ra,shimmer:sa,backBtn:oa,meta:aa,headerActions:ia,watchlistBtn:la,active:ca,year:da,rating:ua,typeBadge:ma,tv:ha,movie:fa,tvSeries:ga,tvMiniSeries:pa,overview:ba,controls:va,controlLabel:ya,select:_a,playerSection:Sa,video:Ta,videoHidden:Ca,delayCanvas:ka,delayCanvasActive:Ea,subtitleOverlay:wa,videoIframe:Na,retryButton:xa,sidebarSeason:Ia,mobileSeasonRow:Ba,providerSelectWrap:Aa,genreRow:La,genreChip:Ma,metaRow:Pa,detailGrid:Ra,detailItem:$a,imdbLink:za},Da=[],Oa=[];function hr({error:o,onRetry:p}){return t("div",{className:`${b.statusMsg} ${b.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:b.retryButton,onClick:p,children:"Retry"})]})})}const Za=()=>{const{id:o}=Gr(),[p]=Qr(),U=A(p);U.current=p;const O=Xr(),G=Zr(),R=p.get("type"),[r,I]=_(null),[i,te]=_(()=>parseInt(p.get("s")||"1",10)||1),[Q,$]=_([]),[f,K]=_(()=>parseInt(p.get("e")||"1",10)||1),[h,He]=_(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[z,X]=_([]),[Pe,Re]=_(""),{options:Ke,isFallback:qe,isLoading:Je}=Ps(),ae=Ee(()=>Ke.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.value,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[Ke]),q=qe||ae.length===0?Da:ae,T=q.filter(e=>e.tier==="direct"),ne=q.filter(e=>e.tier==="embed"),[Te,Y]=_(!1),[Ce,L]=_(""),[$e,Ye]=_([]),[be,C]=_(0),[W,it]=_([]),[ie,ze]=_(-1),[we,De]=_(0),[lt,Ft]=_(""),[St,me]=_(""),[ve,Tt]=_(()=>{try{return localStorage.getItem("tvServer")||""}catch{return""}}),ct=Ee(()=>q.find(e=>e.id===h),[q,h]),M=ct?.tier==="embed",[dt,Ct]=_([]),[Oe,Vt]=_(""),[ln,kt]=_(""),[jt,le]=_(!1),u=Ee(()=>dt.length>0?dt:ct?.servers??[],[dt,ct]),ut=Ee(()=>Oe?["Embed",...u]:u,[u,Oe]),Z=jt&&!!Oe,Et=Z?ln||Oe:"";v(()=>{if(!Oe){kt("");return}let e=!1;return fetch(`/api/resolve?url=${encodeURIComponent(Oe)}`).then(n=>n.json()).then(n=>{!e&&n.finalUrl&&kt(n.finalUrl)}).catch(()=>{}),()=>{e=!0}},[Oe]);const wt=A([]);v(()=>{wt.current=z},[z]);const mt=A(be);v(()=>{mt.current=be},[be]);const Nt=A(ie);v(()=>{Nt.current=ie},[ie]);const y=cs({skipIntervals:Oa}),c=y.refs.videoRef,re=A(null),ce=A([]),xt=A(null),It=A(null),{videoDelayMs:B,videoDelayEnabled:J,setDelayEnabled:de,handleVideoDelayChange:Bt,isCalibrating:cn,testClipActive:ke,stopCalibration:Fe,openAvSyncCalibrator:On,cancelAvSyncCalibrator:dn,applyAvSyncCalibrator:Ut,toggleTestClip:un,calibReturnRef:ye,effectiveVideoDelayMs:mn}=ds(c),[ht,gr]=_(()=>{try{const e=Number(localStorage.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),hn=A(ht);hn.current=ht;const pr=S(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(hn.current!==n){hn.current=n,gr(n);try{localStorage.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]);us({videoRef:c,canvasRef:xt,delayMs:mn,enabled:J});const fn=J,_e=fn||ht!==0,{settings:gn,update:br}=ms(),pn=A(_e);pn.current=_e;const bn=S(()=>{if(!pn.current)return;const e=c.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[c]),{hasConsent:At,grant:vr}=Jr(),Lt=A("");Lt.current||(Lt.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const g=R==="movie",Wt=o?Rs(R||"tv",o):"",F=Wt,Fn=$s(),Ht=zs(),{toggle:Vn,bookmarkedIds:yr,pending:_r}=Ds(),{data:jn}=Os(r?Wt:void 0),Kt=jn?!!jn.inLibrary:Wt?yr.has(Wt):!1,Sr=S(()=>{!r||!o||Vn({tmdbId:Number(o),mediaType:R||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,o,R,Vn]),{data:et,isFetched:Un,isPending:Wn}=Fs(F||void 0,i,f),qt=Ee(()=>Q.map(e=>e.episode_number).sort((e,n)=>e-n),[Q]),tt=qt.indexOf(f),vn=tt>0?qt[tt-1]:null,w=tt>=0&&tt<qt.length-1?qt[tt+1]:null,Yt=Ee(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),Se=Ee(()=>{if(g||w!=null)return null;const e=Yt.indexOf(i);return e>=0&&e<Yt.length-1?Yt[e+1]:(r?.number_of_seasons??0)>i?i+1:null},[g,w,Yt,i,r?.number_of_seasons]),Hn=et?.currentTime??0,Kn=et?.duration??0,yn=et?.completed===!0||et?.completed===1||Mn(Hn,Kn),[Ne,Ve]=_(!1),xe=A(!1),_n=A(null),Mt=A(null);v(()=>{xe.current=!1,Mt.current=null,Ve(!1)},[F,i,f]);const[Ie,Gt]=_(!1),[ft,qn]=_(0),[nt,Yn]=_(!1),[Ge,rt]=_(!1),[Tr,Sn]=_(!1),[Cr,Gn]=_(""),[Qt,kr]=_(!1),[Er,Tn]=_(!1),{isTheaterMode:je,toggleTheaterMode:Cn,handleLayoutClick:wr}=hs();v(()=>{const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="t"&&Cn()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[Cn]),fs(y,(z.length>0||St!=="")&&!je&&!Ie&&!Ne&&!Ge);const Nr=Ws(),[gt,xr]=_(gs),Ir=S(e=>{xr(e),ps(e)},[]),he=A(!1),st=A(null),kn=A(0),Qn=A(!1),Xn=A(0),se=A(null),Pt=A(""),Br=ur(Hn,Kn),Rt=!he.current&&!xe.current&&(Ie||Ne||Ge||yn||Br),pt=A(Rt);pt.current=Rt;const bt=A(!1);v(()=>{bt.current=nt},[nt]);const Qe=S((e,n)=>{if(!F||!n||n<30)return;const s=Mn(e,n),l=s?n:e;Math.abs(l-kn.current)<10&&!s||(kn.current=l,Fn.mutate({mediaId:F,season:i,episode:f,currentTime:Math.floor(l),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}))},[F,i,f,Fn,r,R]),Be=S((e,n)=>{Fe();const s=new URLSearchParams(p);s.set("type",p.get("type")||"tv"),s.set("s",String(e)),s.set("e",String(n)),O(`${window.location.pathname}?${s.toString()}`)},[p,O,Fe]),$t=S(()=>{const e=c.current;if(!e||g||w==null){Sn(!1);return}const n=e.duration||0,s=e.currentTime||0;Sn(n>0&&s/n>=.8)},[g,w,c]),Xt=S((e,n)=>["tv-sources",h,g?"movie":"tv",o,e,n,ve],[h,g,o,ve]),Zt=S(async(e,n)=>{if(!r||!o||!h)return{valid:!1,sources:[]};const s=g?"movie":"tv",l=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||"",...u.length>0&&ve?{server:ve}:{}});return{valid:"valid"in l?l.valid:!1,error:"error"in l?l.error:void 0,sources:l.sources,referer:"referer"in l?l.referer:void 0,audioTracks:l.audioTracks,subtitles:"subtitles"in l?l.subtitles:void 0,servers:"servers"in l?l.servers:void 0,embedUrl:"embedUrl"in l?l.embedUrl:void 0}},[r,o,h,g,u,ve]),Zn=S(()=>{if(g||!r||!o||!h||M||w==null)return;const e=Xt(i,w);G.getQueryState(e)?.status!=="success"&&G.prefetchQuery({queryKey:e,queryFn:()=>Zt(i,w),staleTime:300*1e3,gcTime:1800*1e3})},[g,r,o,h,M,w,i,G,Xt,Zt]),Ar=S(()=>{if(ke)return;$t();const e=c.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&Zn(),st.current&&clearTimeout(st.current),st.current=setTimeout(()=>{Qe(e.currentTime,e.duration||0)},5e3))},[Qe,c,ke,$t,Zn]),Lr=S(()=>{const e=c.current;if(!e||!r)return;st.current&&clearTimeout(st.current),Qe(e.currentTime,e.duration||0),Qn.current=!0;const n=bs({seekInduced:Date.now()-Xn.current<vs,autoplayEnabled:gt,hasNext:!g&&w!=null,isFinal:g||w==null});n==="advance"&&w!=null?(K(w),Be(i,w)):n==="prompt-next"?(xe.current=!1,he.current=!0,Ve(!0)):n==="prompt-complete"&&(Gn(g?r.title:`${r.title} — Season ${i}`),rt(!0),xe.current=!0,he.current=!0)},[g,r,i,w,gt,Qe,Be,c]),Mr=S(()=>{Qn.current=!1,y.actions.onPlay()},[y.actions]),Pr=S(()=>{y.actions.onPause();const e=c.current;e&&!e.ended&&Qe(e.currentTime,e.duration||0)},[y.actions,Qe,c]),Rr=S(()=>{y.actions.onLoadedMetadata();const e=c.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(se.current!=null&&se.current>0){try{e.currentTime=se.current}catch{}se.current=null}$t()}},[y.actions,c,$t]),vt=S(()=>{const e=c.current;if(e&&se.current!=null&&se.current>0){try{e.currentTime=se.current}catch{}se.current=null}},[c]),$r=S(()=>{ft>0&&(se.current=ft);const e=c.current;if(e&&ft>0){try{e.currentTime=ft,se.current=null}catch{}e.play().catch(()=>{})}Gt(!1),he.current=!0},[ft,c]),Jn=S(()=>{se.current=null;const e=c.current;e&&(e.currentTime=0,e.play().catch(()=>{})),Gt(!1),he.current=!0},[c]),zr=S(()=>{xe.current=!0,Ve(!1),he.current=!0},[]),Dr=S(()=>{xe.current=!0,Ve(!1),he.current=!0,se.current=null;const e=c.current;if(e){try{e.currentTime=0}catch{}e.play().catch(()=>{})}},[c]),er=S(()=>{w!=null&&(xe.current=!0,Ve(!1),he.current=!0,K(w),Be(i,w))},[w,i,Be]),tr=S(()=>{Se!=null&&(xe.current=!0,Ve(!1),rt(!1),he.current=!0,te(Se),K(1),Be(Se,1))},[Se,Be]),Or=S(async()=>{if(F)try{await Ht.mutateAsync({id:F,status:"Completed"}),rt(!1),Ve(!1),O("/")}catch{}},[F,Ht,O]);v(()=>{he.current=!1,_n.current=null,Gt(!1),Sn(!1),qn(0),Yn(!1),bt.current=!1,se.current=null,Pt.current=`${F}:${i}:${f}`,kn.current=0},[F,i,f]),v(()=>{Un&&(Yn(!0),bt.current=!0)},[Un,F,i,f]),v(()=>{if(!et||he.current)return;const e=`${F}:${i}:${f}`;if(_n.current===e)return;_n.current=e;const n=et,s=n.currentTime??0,l=n.duration??0;ur(s,l)&&(qn(s),Gt(!0))},[et,F,i,f]),v(()=>{if(!nt||he.current||xe.current||Ie||Ge||Ne)return;const e=`${F}:${i}:${f}`;if(Mt.current!==e){if(!yn){Wn||(Mt.current=e);return}if(g){Mt.current=e,Ve(!0);return}if(!(!r||tt<0||Q.length===0)){if(Mt.current=e,w==null&&Se==null){r&&Q.length>0&&(Gn(`${r.title} — Season ${i}`),rt(!0),xe.current=!0,he.current=!0);return}Ve(!0)}}},[nt,yn,Wn,Ie,Ge,Ne,g,w,Se,r,tt,Q.length,F,i,f]),v(()=>{(Ie||Ne)&&c.current&&c.current.pause()},[Ie,Ne,c]),v(()=>{const e=c.current;return()=>{st.current&&clearTimeout(st.current),e&&!e.ended&&Qe(e.currentTime,e.duration||0)}},[Qe,c]);const En=S(e=>{let n=null,s=!0;try{n=localStorage.getItem("tvLastSubtitle"),s=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return zn(e,{lastKey:n,enabled:s})},[]),wn=S(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),nr=S(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const s=e.findIndex(H=>Pn(H)===n);if(s>=0)return s;const l=n.indexOf("|||"),m=l>=0?n.slice(0,l):n,N=l>=0?n.slice(l+3):n,d=e.findIndex(H=>H.language===m||H.label===N);if(d>=0)return d}return zn(e,{lastKey:null,enabled:!0})},[]),{data:rr}=Vs(F||void 0),sr=Ee(()=>(rr?.progress??[]).filter(n=>n.season===i&&(n.completed===!0||n.completed===1||Mn(n.currentTime,n.duration))).map(n=>String(n.episode)),[rr,i]),or=Ee(()=>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]),ar=Ee(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Nn=Ee(()=>[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;He(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[q,h]),v(()=>{Ct([]),Vt(""),kt(""),le(!1)},[h]),v(()=>{if(u.length!==0&&!u.includes(ve)){Tt(u[0]);try{localStorage.setItem("tvServer",u[0])}catch{}}},[u,ve]),v(()=>{if(!o){I(null),X([]),Re(""),L(""),me("");return}const e=Number(o),n=R||"tv";I(null),X([]),Re(""),L(""),me("");const s=parseInt(U.current.get("s")||"",10),l=parseInt(U.current.get("e")||"",10);te(isNaN(s)?1:s),K(isNaN(l)?1:l),De(0),_t.tv.details.query({type:n,id:String(e)}).then(m=>{const N={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(N),N.seasons&&N.seasons.length>0&&isNaN(s)&&te(N.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(p.get("e")||"",10);_t.tv.episodes.query({id:String(o),season:String(i)}).then(s=>{const l=(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||""}));$(l),l.length!==0&&K(m=>!isNaN(n)&&l.some(N=>N.episode_number===n)?n:l.some(N=>N.episode_number===m)?m:l[0].episode_number)}).catch(()=>{})},[r,o,i,p]),v(()=>{if(!M||!r||!o)return;fetch(`/api/tv/embed/${h}/${g?"movie":"tv"}/${o}?season=${i}&episode=${f}`).then(n=>n.json()).then(n=>{if(n.url)return me(n.url),fetch(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(s=>s.json()).then(s=>{s.finalUrl&&me(s.finalUrl)})}).catch(()=>{})},[h,r,o,i,f,g,M]);const Jt=S(async()=>{if(!r||!o||!h||M||r.adult&&!At)return;const e=`${F}:${i}:${f}`;Y(!0),L(""),wt.current.length===0&&(X([]),De(0),Ye([]),it([]));try{const n=await G.fetchQuery({queryKey:Xt(i,f),queryFn:()=>Zt(i,f),staleTime:3e5,gcTime:18e5});if(Pt.current!==e){Y(!1);return}if(Y(!1),!n.valid||!n.sources?.length){L(n.error?`${n.error}`:u.length>0?`No streams from ${ve}. Try another server.`:"No streams available.");return}X(n.sources),Re(e),n.servers?.length&&Ct(n.servers),n.embedUrl&&Vt(n.embedUrl),De(0),n.referer&&Ft(n.referer);const s=n.audioTracks||[];Ye(s),C(s.length>0?nr(s):0);const l=n.subtitles||[];if(it(l),l.length>0){const d=En(l);ze(d),wn(d)}else ze(-1);const m=g?"movie":"tv",N=o;_t.tv.subtitles.query({type:m,tmdbId:String(N),season:String(i),episode:String(f)}).then(d=>{if(Pt.current!==e)return;const H=Array.isArray(d.subtitles)?d.subtitles:[];H.length!==0&&it(oe=>{const k=[...oe,...H.filter(ee=>!oe.some(fe=>fe.url===ee.url))];if(oe.length===0){const ee=En(k);ze(ee),wn(ee)}return k})}).catch(()=>{}),L("")}catch{if(Pt.current!==e)return;Y(!1),L("Failed to load streams.")}},[r,o,h,i,f,g,M,At,u,ve,En,wn,nr,F,G,Xt,Zt]),Fr=S(e=>{if(e==="Embed"){le(!0);return}le(!1),Tt(e);try{localStorage.setItem("tvServer",e)}catch{}L("")},[]),Vr=S(e=>{He(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);v(()=>{h&&r&&!M&&Jt()},[h,r,Jt,M]),v(()=>{if(!c.current)return;if(re.current&&(re.current.destroy(),re.current=null),M||Z){const d=c.current;d&&(d.pause(),d.removeAttribute("src"),d.load());return}let e=!1;if(ke){const d=c.current;return d&&(d.pause(),d.removeAttribute("src"),d.load(),d.src="/av-sync-test.mp4",pt.current||d.play().catch(()=>{})),()=>{e=!0}}if(Pt.current===`${F}:${i}:${f}`&&se.current==null&&!pt.current)try{const d=c.current;d&&!d.ended&&d.currentTime>1&&(se.current=d.currentTime)}catch{}const s=!Te&&Pe===`${F}:${i}:${f}`?Z?"":z[we]?.url||"":"";if(!s){try{c.current?.pause(),c.current?.removeAttribute("src"),c.current?.load()}catch{}return}const l=c.current;l.pause(),l.removeAttribute("src"),l.load(),y.actions.resetMediaState();const m=`/api/tv/stream-proxy?url=${encodeURIComponent(s)}&referer=${encodeURIComponent(lt)}`;z[we]?.type==="hls"?(async()=>{const d=await js();if(!e)if(d&&d.isSupported()){const H=Do()||document.body.classList.contains("low-end"),oe=H?60:180,k=new d({enableWorker:!0,lowLatencyMode:!1,maxBufferLength:oe,maxMaxBufferLength:oe+(H?30:60),backBufferLength:H?30:60,maxBufferSize:(H?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}}}});re.current=k,k.on(d.Events.ERROR,(x,E)=>{E.fatal&&(L(`Stream failed (${E.details}). Try another source or reload.`),Y(!1),k.destroy(),re.current=null)}),k.loadSource(m),k.attachMedia(l);const ee=()=>{let x=!1,E=0;try{x=localStorage.getItem("tvSubtitlesEnabled")==="true";const P=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(P)&&P>=0&&(E=P)}catch{}return{enabled:x,index:E}},fe=()=>{if(typeof k.subtitleTrack!="number")return;if(ce.current.length>0){k.subtitleTrack=-1;return}const x=Array.isArray(k.subtitleTracks)?k.subtitleTracks:[];if(x.length===0){k.subtitleTrack=-1;return}const E=ee();if(E.enabled){const P=E.index<x.length?E.index:0;k.subtitleTrack=P,ze(P),bn()}else k.subtitleTrack=-1};$o(k,d.Events,{getWant:()=>mt.current,onResolve:x=>C(x)}),k.on(d.Events.MANIFEST_PARSED,()=>{fe(),ye.current!=null&&(l.currentTime=ye.current,ye.current=null),vt(),!pt.current&&bt.current&&l.play().catch(()=>{})}),k.on(d.Events.SUBTITLE_TRACKS_UPDATED,()=>{fe()}),k.on(d.Events.SUBTITLE_TRACK_SWITCH,(x,E)=>{if(ce.current.length>0){if(E.id!==-1)try{k.subtitleTrack=-1}catch{}return}const P=Array.isArray(k.subtitleTracks)?k.subtitleTracks:[];if(P.length!==0){if(E.id===-1){const D=ee();if(D.enabled){const Ue=D.index<P.length?D.index:0;k.subtitleTrack=Ue;return}}ze(E.id),bn()}})}else Us(l)&&(l.src=m,ye.current!=null&&(l.currentTime=ye.current,ye.current=null),vt(),!pt.current&&bt.current&&l.play().catch(()=>{L("Failed to play stream. Try another source.")}))})():(l.src=m,ye.current!=null&&(l.currentTime=ye.current,ye.current=null),vt(),!pt.current&&bt.current&&l.play().catch(()=>{L("Failed to play stream. Try another source.")}));const N=()=>{const oe=l.error?.code===4?"Video source not supported or not found":"Failed to load video stream";L(`${oe}. The source may be invalid or expired. Try switching source or reloading.`),Y(!1)};return l.addEventListener("error",N),()=>{e=!0,l.removeEventListener("error",N)}},[z,Pe,Te,we,h,lt,M,Z,c,ye,ke,F,i,f,vt,bn,y.actions]),v(()=>{if(!nt||Ie||Ne||Ge||Rt||M||ke)return;const e=c.current;!e||!e.paused||e.ended||e.readyState<1||(vt(),e.play().catch(()=>{}))},[nt,Ie,Ne,Ge,Rt,M,ke,vt,c]),v(()=>{const e=re.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=be)},[be]),v(()=>{const e=re.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ce.current.length>0||(ie>=0?e.subtitleTrack=ie:e.subtitleTrack=-1)},[ie]),v(()=>{const e=c.current;if(!(!e||M)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ce.current=[],W.length!==0&&(W.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 l=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent(lt)}`;s.src=l,s.addEventListener("load",()=>{const m=ce.current.indexOf(s),N=s.track;if(N&&m>=0){const d=m===Nt.current;N.mode=d&&!pn.current?"showing":"hidden"}}),e.appendChild(s),ce.current.push(s)}),W.length>0)))try{const n=re.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[W,lt,M,h,c]),v(()=>{const e=c.current;if(!e||M)return;const n=re.current;ce.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const s=()=>{const N=Dn(y.state.subtitleFontSize,e.clientHeight||720),d=Math.max(0,Math.min(100,100-y.state.subtitlePosition)),H=()=>{const x=N*16,E=e.videoHeight||e.clientHeight||720,P=e.videoWidth||e.clientWidth||1280;return{step:x*1.3/E*100,chars:Math.max(20,Math.floor(P/(x*.55)))}},oe=(x,E)=>{const P=x;P.snapToLines=!1,P.line=E},k=x=>{if(!x.cues)return;Array.from(x.cues).forEach(ge=>oe(ge,d));const E=Array.from(x.activeCues??[]);if(E.length<=1){E.forEach(ge=>oe(ge,d));return}const{step:P,chars:D}=H();let Ue=d;for(let ge=E.length-1;ge>=0;ge--){const Xe=String(E[ge].text??"").replace(/<[^>]*>/g,"").split(`
3
+ `).reduce((nn,Dt)=>nn+Math.max(1,Math.ceil(Dt.length/D)),0);Ue=Math.max(0,Ue-Xe*P),oe(E[ge],Ue),Ue-=P*.4}},ee=ce.current;if(ee.length>0){ee.forEach((x,E)=>{const P=x.track;if(!P)return;const D=E===ie;P.mode=D&&!_e?"showing":"hidden",D&&!_e&&k(P)});return}const fe=Array.from(e.textTracks);fe.length!==0&&fe.forEach((x,E)=>{const P=E===ie;x.mode=P&&!_e?"showing":"hidden",P&&!_e&&k(x)})};s();const l=()=>s();e.textTracks.addEventListener("addtrack",l),e.addEventListener("loadedmetadata",s,{once:!0});const m=window.setTimeout(s,600);return()=>{e.textTracks.removeEventListener("addtrack",l),e.removeEventListener("loadedmetadata",s),window.clearTimeout(m)}},[ie,W,M,h,c,_e,y.state.subtitleFontSize,y.state.subtitlePosition]),v(()=>{if(!_e)return;const e=c.current,n=It.current;if(!e||!n)return;const s=ht/1e3,l=mn/1e3,m=new Set;let N=[],d=-1,H=-1,oe=-1,k=-1,ee=0,fe=0,x=!1;const E=()=>{const V=Nt.current;if(V<0)return null;const Ze=ce.current;return Ze.length>0?Ze[V]?.track??null:Array.from(e.textTracks)[V]??null},P=(V,Ze)=>{const pe=V.cues;if(!pe||pe.length===0)return Array.from(V.activeCues??[]);let ot=0,at=pe.length;for(;ot<at;){const Ae=ot+at>>>1;pe[Ae].endTime+s<Ze?ot=Ae+1:at=Ae}const Ot=[];for(let Ae=ot;Ae<pe.length;Ae++){const rn=pe[Ae];if(rn.startTime+s>Ze)break;rn.endTime+s>=Ze&&Ot.push(rn)}return Ot},D=()=>{const V=E(),Ze=e.currentTime-l,pe=V?P(V,Ze):[],ot=e.clientWidth,at=e.clientHeight,Ot=e.videoWidth,Ae=e.videoHeight;if(pe.length===N.length&&pe.every((In,Bn)=>In===N[Bn])&&ot===d&&at===H&&Ot===oe&&Ae===k||(N=pe,d=ot,H=at,oe=Ot,k=Ae,n.textContent="",pe.length===0))return;const cr={fontSize:Dn(y.state.subtitleFontSize,at),position:y.state.subtitlePosition,bgOpacity:y.state.subtitleBgOpacity,bgColor:y.state.subtitleBgColor,textColor:y.state.subtitleTextColor,edge:y.state.subtitleEdge,bold:y.state.subtitleBold},Hr=ys(cr),Kr=_s(e,cr.position);pe.forEach((In,Bn)=>{const dr=String(In.text??"");if(!Ss(dr).trim())return;const An=document.createElement("div"),qr=(pe.length-1-Bn)*1.7;An.style.cssText=`${Hr}
4
+ bottom: calc(${Kr}px + ${qr}em);`,An.innerHTML=Ts(dr),n.appendChild(An)})},Ue=()=>{Array.from(e.textTracks).forEach(V=>{m.has(V)||(m.add(V),V.addEventListener("cuechange",D))})},ge=()=>{Ue(),D()},xn=()=>{if(x||fe)return;const V=()=>{fe=0,!(x||e.paused||e.ended)&&(D(),xn())};fe=window.requestAnimationFrame(V)},Xe=e,nn=()=>{ee=0,D(),!x&&Xe.requestVideoFrameCallback&&(ee=Xe.requestVideoFrameCallback(nn))},Dt=()=>{D(),Xe.requestVideoFrameCallback?ee||(ee=Xe.requestVideoFrameCallback(nn)):xn()};Ue(),e.textTracks.addEventListener("addtrack",ge),e.textTracks.addEventListener("removetrack",ge),e.addEventListener("timeupdate",D),e.addEventListener("seeked",D),e.addEventListener("loadedmetadata",D),e.addEventListener("play",Dt);const ir=Array.from(e.querySelectorAll("track"));ir.forEach(V=>V.addEventListener("load",D));const lr=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>D());return lr?.observe(e),D(),Dt(),()=>{x=!0,m.forEach(V=>V.removeEventListener("cuechange",D)),e.textTracks.removeEventListener("addtrack",ge),e.textTracks.removeEventListener("removetrack",ge),e.removeEventListener("timeupdate",D),e.removeEventListener("seeked",D),e.removeEventListener("loadedmetadata",D),e.removeEventListener("play",Dt),ir.forEach(V=>V.removeEventListener("load",D)),lr?.disconnect(),fe&&window.cancelAnimationFrame(fe),ee&&Xe.cancelVideoFrameCallback&&Xe.cancelVideoFrameCallback(ee),n.textContent=""}},[_e,ht,ie,W,mn,c,y.state.subtitleFontSize,y.state.subtitlePosition,y.state.subtitleBgOpacity,y.state.subtitleBgColor,y.state.subtitleTextColor,y.state.subtitleEdge,y.state.subtitleBold]);const en=()=>{I(null),X([]),me(""),O(-1)},jr=S(e=>{te(e),K(1),Be(e,1)},[Be]),tn=!g&&r?.seasons&&r.seasons.length>1?t("label",{className:b.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:i,onChange:e=>jr(parseInt(e.target.value,10)||1),className:b.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=S(e=>{const n=parseInt(e,10);if(!isNaN(n)){try{c.current?.pause()}catch{}K(n),Be(i,n)}Tn(!1)},[i,Be,c]);v(()=>{if(g)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(w!=null?yt(String(w)):es.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[g,w,yt]);const Ur=e=>{C(e);try{const s=$e[e];s&&localStorage.setItem("tvLastAudio",Pn(s))}catch{}const n=re.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Wr=e=>{ze(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const m=W[e];m&&localStorage.setItem("tvLastSubtitle",Pn(m))}}catch{}const n=c.current,s=re.current;if(s&&typeof s.subtitleTrack=="number"&&Array.isArray(s.subtitleTracks)&&s.subtitleTracks.length>0&&(s.subtitleTrack=ce.current.length>0||e<0?-1:e),!n)return;const l=ce.current;if(l.length>0){l.forEach((m,N)=>{const d=m.track;if(!d)return;const H=N===e;d.mode=H&&!_e?"showing":"hidden"});return}Array.from(n.textTracks).forEach((m,N)=>{const d=N===e;m.mode=d&&!_e?"showing":"hidden"})},zt=S(()=>{if(!r)return;const e=c.current,n=g?"":`S${String(i).padStart(2,"0")}E${String(f).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:Lt.current}).catch(()=>{}),_t.discord.heartbeat.mutate({sessionId:Lt.current}).catch(()=>{})},[r,g,i,f,c]);return v(()=>{if(!r)return;zt();const e=window.setInterval(()=>{const n=c.current;(!n||!n.paused)&&zt()},15e3);return()=>window.clearInterval(e)},[zt,r,c]),v(()=>{if(!r||M||Te||Ce||z.length===0)return;const e=c.current;if(!e)return;const n=()=>zt();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,Te,Ce,z,zt,c]),v(()=>{const e=Lt.current,n=()=>ts(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=g?`${r.title} - dango`:`${r.title} - Season ${i} Episode ${f} - dango`},[r,g,i,f]),v(()=>{if(!r||g)return;const e=new URLSearchParams(p),n=e.get("s"),s=e.get("e"),l=String(i),m=String(f);n===l&&s===m||(e.set("type",p.get("type")||"tv"),e.set("s",l),e.set("e",m),O(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,g,i,f,p,O]),t("div",{className:`${Le.playerPageLayout} ${je?Le.theaterMode:""} ${g?Le.noSidebar:""}`,onClick:wr,children:[je&&t(Cs,{videoRef:c,active:gn.enabled&&!M&&z.length>0&&!Ce&&!(r?.adult&&!At),settings:gn}),!je&&!g&&t("aside",{className:Le.episodeSidebar,children:r?t(ks,{episodes:or,currentEpisode:String(f),watchedEpisodes:sr,onEpisodeClick:yt,header:tn}):t(Es,{variant:"sidebar"})}),t("div",{className:Le.playerMain,children:[r&&t("div",{className:b.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!At?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:M&&St?t("iframe",{src:St,className:b.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!M&&Et?t("iframe",{src:Et,className:b.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!M&&(z.length>0||Te)?t(Me,{children:[Ce&&t(hr,{error:Ce,onRetry:Jt}),t(Mo,{player:y,title:r.title,episodeLabel:g?void 0:`S${i} E${f}`,audioTracks:$e,selectedAudioTrack:be,onAudioTrackChange:Ur,subtitles:W,selectedSubtitle:ie,onSubtitleChange:Wr,streams:z,resolutionIdx:we,onResolutionChange:De,onBack:en,videoDelayEnabled:J,onVideoDelayToggle:de,videoDelayMs:B,onVideoDelayChange:Bt,onCalibrateAvSync:On,subtitleDelayMs:ht,onSubtitleDelayChange:pr,showNextEpisodeButton:Tr&&!Ie&&!Ne&&!Ge,onNextEpisode:er,isLoading:Te,isTheaterMode:je,onTheaterModeToggle:Cn,ambientSettings:gn,onAmbientChange:br,children:[t("video",{ref:c,autoPlay:nt&&!Rt,playsInline:!0,disablePictureInPicture:!0,className:`${b.video} ${fn?b.videoHidden:""}`,onTimeUpdate:Ar,onEnded:()=>{ke||Lr()},onPlay:Mr,onPause:Pr,onSeeked:()=>{Xn.current=Date.now(),$t()},onLoadedMetadata:Rr,onVolumeChange:y.actions.onVolumeChange,onWaiting:y.actions.onWaiting,onPlaying:y.actions.onPlaying,onCanPlay:y.actions.onCanPlay,onContextMenu:e=>e.preventDefault(),onError:()=>{L("Video failed to load. Try another server or reload."),Y(!1)}}),t("canvas",{ref:xt,className:`${b.delayCanvas} ${fn?b.delayCanvasActive:""}`}),_e&&t("div",{ref:It,className:b.subtitleOverlay}),t(ws,{isOpen:cn,ms:B,onChange:Bt,onApply:Ut,onClose:dn,testClipActive:ke,onTestClip:un})]})]}):Ce&&!M?t(hr,{error:Ce,onRetry:Jt}):null}),!je&&r&&t(Ns,{}),!je&&tn&&t("div",{className:b.mobileSeasonRow,children:tn}),!je&&r&&t("div",{className:ue.streamPanel,children:[t("div",{className:b.providerSelectWrap,children:t("label",{className:b.controlLabel,children:["Provider",t("select",{value:h,onChange:e=>Vr(e.target.value),className:b.select,disabled:q.length===0,children:Je?t("option",{value:"",children:"Loading..."}):q.length===0?t("option",{value:"",children:"No providers available"}):t(Me,{children:[T.length>0&&t("optgroup",{label:"Direct HLS",children:T.map(e=>t("option",{value:e.id,children:e.label},e.id))}),ne.length>0&&t("optgroup",{label:"Embeds",children:ne.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),!M&&(Te?t("div",{className:b.sourceLoader,children:t("div",{className:b.ringSpinner})}):t(Ro,{servers:ut,selectedServer:jt?"Embed":ve,onServerSelect:Fr}))]}),!je&&r&&t("div",{className:Le.playerInfoContainer,children:[t("div",{className:Le.playerInfoHeader,children:[t("div",{className:Le.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:Le.videoTitleSection,children:[t("div",{className:ue.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:b.meta,children:[t("span",{className:b.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:b.rating,children:[t(j,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${b.typeBadge} ${b[g?"movie":"tv"]}`,children:g?"Movie":"TV Show"})]}),ar.length>0&&t("div",{className:b.genreRow,children:ar.map(e=>t("span",{className:b.genreChip,children:e},e))}),Nn.length>0&&t("div",{className:b.metaRow,children:Nn.map((e,n)=>t("span",{children:[e,n<Nn.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:ue.controls,children:[t("button",{className:`${ue.watchlistBtn} ${Kt?ue.inList:""}`,onClick:Sr,disabled:_r,type:"button",children:[Kt?t(j,{name:"check",size:14}):t(j,{name:"plus",size:14}),Kt?"In Watchlist":"Add to Watchlist"]}),!g&&t(Me,{children:[t("button",{className:`${ue.watchlistBtn}`,onClick:()=>vn!=null&&yt(String(vn)),disabled:vn==null,type:"button",children:[t(j,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${ue.watchlistBtn}`,onClick:()=>w!=null&&yt(String(w)),disabled:w==null,type:"button",children:["Next EP",t(j,{name:"chevron-right",size:14})]}),!g&&t("button",{className:`${ue.watchlistBtn} ${ue.modeToggleBtn} ${gt?ue.modeToggleActive:""}`,onClick:()=>Ir(!gt),type:"button","aria-pressed":gt,children:gt?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),Nr&&t("button",{className:`${ue.watchlistBtn}`,onClick:()=>Tn(!0),type:"button",children:[t(j,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:Le.infoColumns,children:[t("div",{className:`${ue.descriptionSection} ${ue.synopsisFlat}`,children:[t("h3",{children:"Synopsis"}),t(Hs,{text:r.overview,emptyText:"No description available."}),t("button",{className:ue.detailsToggleBtn,onClick:()=>kr(!Qt),type:"button",children:[Qt?t(j,{name:"chevron-up"}):t(j,{name:"chevron-down"}),Qt?"Hide Details":"Show Details"]})]}),Qt&&t("div",{className:b.detailGrid,children:[r.first_air_date&&t("div",{className:b.detailItem,children:[t("strong",{children:g?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:b.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:b.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:b.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:b.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:b.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:b.imdbLink,children:"View on IMDb"})]})]})]})]}),!g&&t(xs,{isOpen:Er,onClose:()=>Tn(!1),episodes:or,currentEpisode:String(f),watchedEpisodes:sr,onEpisodeClick:yt,header:tn}),r?.adult&&!At&&t(Ln,{isOpen:!0,title:"Content Warning",onClose:en,children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:"This title contains mature content intended for adult audiences."}),t("p",{children:["By proceeding, you confirm that you are ",t("strong",{children:"18 years of age or older"})," ","(or the age of majority in your jurisdiction) and wish to view this content."]}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(We,{variant:"secondary",onClick:en,children:"Go Back"}),t(We,{onClick:vr,children:"I'm 18+, Continue"})]})]})}),t(Is,{isOpen:Ie,onClose:Jn,title:"Resume Watching",message:t(Me,{children:["You were at ",t("strong",{children:an(ft)})]}),restartLabel:"Start from Beginning",onResume:$r,onRestart:Jn}),t(Ln,{isOpen:Ne,onClose:zr,title:g?"Movie Completed":"Episode Completed",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:g?t(Me,{children:"You've already watched this movie."}):t(Me,{children:["You've already watched"," ",t("strong",{children:["Season ",i," Episode ",f]}),". Would you like to continue?"]})}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(We,{variant:"secondary",onClick:Dr,children:"Replay"}),w!=null?t(We,{onClick:er,children:["Watch EP ",w]}):Se!=null?t(We,{onClick:tr,children:["Start Season ",Se]}):null]})]})}),t(Ln,{isOpen:Ge,onClose:()=>rt(!1),title:g?"Movie Completed!":Se!=null?"Season Complete!":"Show Completed!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(j,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:Cr}),t("p",{style:{color:"var(--text-secondary)"},children:g?"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(We,{variant:"secondary",onClick:()=>rt(!1),children:"Close"}),Se!=null?t(We,{onClick:tr,children:["Start Season ",Se]}):t(Me,{children:[t(We,{onClick:()=>{rt(!1),en()},children:"Back to Details"}),Kt&&t(We,{onClick:Or,disabled:Ht.isPending,children:Ht.isPending?"Saving...":"Move to Completed"})]})]})]})}),!r&&t("div",{className:b.statusMsg,children:[t(j,{name:"spinner",className:b.spinner})," Loading..."]})]})]})};export{Za 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-CfgPGaUO.js";import{n as H,d as J,e as K,f as Q,t as I}from"./useTvLibrary-CL3kMD_c.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-B4AdKbhW.js";import{n as H,d as J,e as K,f as Q,t as I}from"./useTvLibrary-73NkS_5R.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};