@serifpersia/dango 3.7.4 → 3.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +10 -6
  2. package/client/dist/assets/{AnimeCard-CBxkRKU-.js → AnimeCard-BxhPLWBG.js} +1 -1
  3. package/client/dist/assets/{AnimeInfo-D3LmqzJo.js → AnimeInfo-DcpKPBLS.js} +1 -1
  4. package/client/dist/assets/{AnimeInfoPage-CeJHVkQ0.js → AnimeInfoPage-jKNSPHbX.js} +2 -2
  5. package/client/dist/assets/{Asmr-CrHIKmJ4.js → Asmr-DlKBykO-.js} +1 -1
  6. package/client/dist/assets/{AsmrResetProgressModal-C13uw5lH.js → AsmrResetProgressModal-DPHPLqPo.js} +1 -1
  7. package/client/dist/assets/{Home-CC9XyO9O.js → Home-D7-FNOmo.js} +1 -1
  8. package/client/dist/assets/{Insights-BZGAhYrz.js → Insights-C9HufjGJ.js} +1 -1
  9. package/client/dist/assets/{LibraryListPage-DosBFeR_.js → LibraryListPage-BT_xDjEq.js} +1 -1
  10. package/client/dist/assets/{ListeningList-nq279J8O.js → ListeningList-DL1rdCRi.js} +1 -1
  11. package/client/dist/assets/{Manga-DiCcXa9I.js → Manga-BfFRq7eK.js} +1 -1
  12. package/client/dist/assets/{MangaInfoPage-sZn0qDxf.js → MangaInfoPage-wBJjn2FL.js} +1 -1
  13. package/client/dist/assets/{MangaReadPage-ChgW4VO8.js → MangaReadPage-BAgsRqxt.js} +1 -1
  14. package/client/dist/assets/{MangaResetProgressModal-BkNHdClw.js → MangaResetProgressModal-Br5zqZ-U.js} +1 -1
  15. package/client/dist/assets/{Mature-D7bJH6LQ.js → Mature-MO7ZwJVT.js} +1 -1
  16. package/client/dist/assets/{MatureConsentModal-B3u3RgAE.js → MatureConsentModal-Beq4JL0b.js} +1 -1
  17. package/client/dist/assets/{MediaCard-B1llLoho.js → MediaCard-lz7FdOe_.js} +1 -1
  18. package/client/dist/assets/{OptionListMenu-1QikgQ8d.js → OptionListMenu-BSUcso28.js} +1 -1
  19. package/client/dist/assets/Player-CnLC-x2S.js +56 -0
  20. package/client/dist/assets/{PlayerSettings-CWc5Tf-B.js → PlayerSettings-kqYmlLDl.js} +1 -1
  21. package/client/dist/assets/{QueueOptionsButton-Cpm6Jovo.js → QueueOptionsButton-B8xuoYlH.js} +1 -1
  22. package/client/dist/assets/{QueueRail-DpUQ2Ba2.js → QueueRail-D1FmM-GR.js} +1 -1
  23. package/client/dist/assets/{ReadingList-DMxkudSM.js → ReadingList-D8ZiOnWi.js} +1 -1
  24. package/client/dist/assets/{ResetProgressModal-6X8ciSFl.js → ResetProgressModal-0PvvM2XJ.js} +1 -1
  25. package/client/dist/assets/{Search-CbXvziWY.js → Search-D1T-PrGX.js} +1 -1
  26. package/client/dist/assets/{Settings-BEZZSWsj.js → Settings-DALBQcFc.js} +1 -1
  27. package/client/dist/assets/{SkeletonGrid-BDR-fKs1.js → SkeletonGrid-pA-dcLBM.js} +1 -1
  28. package/client/dist/assets/Trackers-CvO6aWVx.css +1 -0
  29. package/client/dist/assets/Trackers-D68sJf1y.js +2 -0
  30. package/client/dist/assets/{Tv-DP4rcV9T.js → Tv-DO-WeaMv.js} +1 -1
  31. package/client/dist/assets/{TvInfo-WNJynk-5.js → TvInfo-CpPIymn8.js} +1 -1
  32. package/client/dist/assets/{TvPopup-Q9_MFJdx.js → TvPopup-BwGJ1Tjg.js} +1 -1
  33. package/client/dist/assets/{TvSearch-C-RBZ1iq.js → TvSearch-D9SrfJjK.js} +1 -1
  34. package/client/dist/assets/{TvWatchlist-BXE6yUS0.js → TvWatchlist-25tpA8ln.js} +1 -1
  35. package/client/dist/assets/{Watchlist-7x__Rf-s.js → Watchlist-mlZQTcqR.js} +1 -1
  36. package/client/dist/assets/{hls-DIyfUbGZ.js → hls-qvAoYTJt.js} +1 -1
  37. package/client/dist/assets/index-DlcgJVM6.js +178 -0
  38. package/client/dist/assets/{index-B7katXv0.css → index-ZssheiHa.css} +1 -1
  39. package/client/dist/assets/{libraryInvalidation-BFqNv8Cx.js → libraryInvalidation-DdnIPcOQ.js} +1 -1
  40. package/client/dist/assets/{useAnimeInfoData-D_qedrui.js → useAnimeInfoData-tcGkDs2b.js} +1 -1
  41. package/client/dist/assets/{useAsmr-CrshwDPO.js → useAsmr-B-FYJW2L.js} +1 -1
  42. package/client/dist/assets/{useAsmrPopup-HwNC-ZRo.js → useAsmrPopup-Ct9jC6X6.js} +1 -1
  43. package/client/dist/assets/{useMangaLibrary-BPSi9vcc.js → useMangaLibrary-BacTdrw2.js} +1 -1
  44. package/client/dist/assets/{useMangaPopup-DdueqAi5.js → useMangaPopup-B_wRaMyP.js} +1 -1
  45. package/client/dist/assets/{usePlaybackEnd-DjZq1szR.js → usePlaybackEnd-DuEfjKb8.js} +1 -1
  46. package/client/dist/assets/{useProviders-_ilIsyde.js → useProviders-D0XOHCsj.js} +1 -1
  47. package/client/dist/assets/{useTv-C558DPdT.js → useTv-IidbSQU4.js} +1 -1
  48. package/client/dist/assets/{useTvLibrary-CNQcDI7O.js → useTvLibrary-DiCSdUOj.js} +1 -1
  49. package/client/dist/index.html +2 -2
  50. package/package.json +2 -2
  51. package/server/dist/server.js +251 -246
  52. package/server/dist/shipped-defaults.js +1 -1
  53. package/server/package.json +1 -1
  54. package/client/dist/assets/Player-hVrgi0J1.js +0 -56
  55. package/client/dist/assets/Trackers-D5XBOCDp.css +0 -1
  56. package/client/dist/assets/Trackers-DO0mA01O.js +0 -2
  57. package/client/dist/assets/index-D0DdVatn.js +0 -178
@@ -1 +1 @@
1
- const t={GITHUB_CLIENT_ID:"Ov23liT1ZtPk7XtN9PZk",GOOGLE_AUTH_WORKER_URL:"https://google-auth-client.ramiserifpersia.workers.dev",DISCORD_CLIENT_ID:"1512253778022367426",PROVIDER_REPO_URL:"https://raw.githubusercontent.com/serifpersia/dango-providers/main/registry.json"};export{t as SHIPPED_DEFAULTS};
1
+ const r={GITHUB_CLIENT_ID:"Ov23liT1ZtPk7XtN9PZk",GOOGLE_AUTH_WORKER_URL:"https://google-auth-client.ramiserifpersia.workers.dev",DISCORD_CLIENT_ID:"1512253778022367426",MAL_AUTH_WORKER_URL:"https://dango-mal-auth.ramiserifpersia.workers.dev/",PROVIDER_REPO_URL:"https://raw.githubusercontent.com/serifpersia/dango-providers/main/registry.json"};export{r as SHIPPED_DEFAULTS};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dango-server",
3
3
  "private": true,
4
- "version": "3.7.4",
4
+ "version": "3.7.5",
5
5
  "type": "module",
6
6
  "engines": {
7
7
  "node": ">=22.12.0"
@@ -1,56 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PlayerSettings-CWc5Tf-B.js","assets/vendor-core-DfaOB3Rn.js","assets/vendor-icons-DrybRNxP.js","assets/OptionListMenu-1QikgQ8d.js","assets/usePlaybackEnd-DjZq1szR.js","assets/index-D0DdVatn.js","assets/vendor-query-BBT5_sHx.js","assets/index-B7katXv0.css","assets/playbackCompletion-IPHm9fp5.js","assets/usePlaybackEnd-DLFOYx3Q.css","assets/PlayerSettings-BXGe3F5k.css"])))=>i.map(i=>d[i]);
2
- import{u as t,g as dt,h as V,P as zt,z as jt,d as ie,A as P,q as Q,y as Ht,T as Me,o as Yt,a as Xt,c as Jt,_ as Zt,S as ct}from"./vendor-core-DfaOB3Rn.js";import{u as Rt,b as Tt,a as yt}from"./vendor-query-BBT5_sHx.js";import{S as er,U as tr,p as St,s as rr,C as nr,a as or,b as sr,c as Ie,d as Ct,f as Nt,e as ar,g as ir,h as lr,r as cr,u as ur,i as dr,j as mr,k as fr,l as hr,m as pr,n as vr,o as be,A as gr,q as yr,R as br,E as Sr,t as Er,v as T,w as wr,x as kr,P as Tr,y as Cr}from"./usePlaybackEnd-DjZq1szR.js";import{I as Y}from"./vendor-icons-DrybRNxP.js";import{_ as Pt,S as Ye,i as Mr,q as ae,t as me,A as we,O as Rr,P as Ve,M as mt,e as Nr,m as Pr,n as Ar,o as _r,p as xr,d as Br,u as Lr,B as ut,Q as Dr,f as $r}from"./index-D0DdVatn.js";import{l as Ir,i as Fr,s as Or}from"./playbackCompletion-IPHm9fp5.js";import{M as Wr}from"./MatureConsentModal-B3u3RgAE.js";import{u as Ur}from"./useIsMobile-Dvx1uJ82.js";import{s as Ee,Q as Vr}from"./QueueRail-DpUQ2Ba2.js";import{u as Qr,Q as Gr}from"./QueueOptionsButton-Cpm6Jovo.js";import{u as At}from"./useProviders-_ilIsyde.js";import{l as qr}from"./hls-DIyfUbGZ.js";import{A as Kr}from"./AnimeMetaDetails-D8WIiO4b.js";import{S as zr}from"./SynopsisText-B3Sa5pRv.js";import"./vendor-ui-3qrARCPr.js";const jr="_controlsOverlay_cejny_1",Hr="_hidden_cejny_21",Yr="_topControls_cejny_27",Xr="_backBtn_cejny_47",Jr="_videoTitleInfo_cejny_67",Zr="_animeTitle_cejny_73",en="_episodeNumber_cejny_83",tn="_bottomControls_cejny_91",rn="_progressBarContainer_cejny_110",nn="_progressBar_cejny_110",on="_thumb_cejny_129",sn="_scrubbing_cejny_144",an="_watchedBar_cejny_148",ln="_bufferedBar_cejny_149",cn="_timeBubble_cejny_187",un="_skipSegment_cejny_221",dn="_bottomControlsRow_cejny_231",mn="_leftControls_cejny_239",fn="_rightControls_cejny_240",hn="_controlBtn_cejny_247",pn="_theaterBtn_cejny_288",vn="_nextEpisodeBtn_cejny_292",gn="_active_cejny_313",yn="_timeDisplay_cejny_317",bn="_skipControls_cejny_325",D={controlsOverlay:jr,hidden:Hr,topControls:Yr,backBtn:Xr,videoTitleInfo:Jr,animeTitle:Zr,episodeNumber:en,bottomControls:tn,progressBarContainer:rn,progressBar:nn,thumb:on,scrubbing:sn,watchedBar:an,bufferedBar:ln,timeBubble:cn,skipSegment:un,bottomControlsRow:dn,leftControls:mn,rightControls:fn,controlBtn:hn,theaterBtn:pn,nextEpisodeBtn:vn,active:gn,timeDisplay:yn,skipControls:bn},Sn=({player:r,handlers:n,visible:a,skipIntervals:u,showNextEpisodeButton:l,onNextEpisode:i,isTheaterMode:s,onTheaterModeToggle:d,settingsBtnRef:c,timeDisplayRef:v})=>{const{state:g,refs:e,actions:o}=r,{showSettings:N}=g,f=()=>g.isMuted||g.volume===0?t(Y,{name:"volume-mute"}):g.volume<.5?t(Y,{name:"volume-down"}):t(Y,{name:"volume-up"});return t("div",{className:`${D.controlsOverlay} ${a?"":D.hidden} `,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:D.bottomControls,"data-speed-boost-ignore":"true",onClick:S=>S.stopPropagation(),children:[t(er,{classes:{container:D.progressBarContainer,scrubbing:D.scrubbing,timeBubble:D.timeBubble,bar:D.progressBar,buffered:D.bufferedBar,watched:D.watchedBar,thumb:D.thumb},videoRef:e.videoRef,duration:g.duration,formatTime:o.formatTime,isScrubbing:g.isScrubbing,onSeek:n.handleSeek,onScrubStart:n.handleScrubStart,onScrubMove:n.handleScrubMove,onScrubEnd:n.handleScrubEnd,timeLabelRef:v,children:[g.duration>0&&r.state.currentSkipInterval&&t("div",{className:`${D.skipSegment} ${D[r.state.currentSkipInterval.skip_type]} `,style:{left:`${r.state.currentSkipInterval.start_time/g.duration*100}% `,width:`${(r.state.currentSkipInterval.end_time-r.state.currentSkipInterval.start_time)/g.duration*100}% `}}),u.map(S=>{const _=S.start_time/g.duration*100,E=(S.end_time-S.start_time)/g.duration*100;return t("div",{className:`${D.skipSegment} ${D[S.skip_type]} `,style:{left:`${_}% `,width:`${E}% `},title:S.skip_type.toUpperCase()},S.skip_id)})]}),t("div",{className:D.bottomControlsRow,children:[t("div",{className:D.leftControls,children:[t("button",{className:D.controlBtn,onClick:o.togglePlay,"aria-label":g.isPlaying?"Pause":"Play",children:g.isPlaying?t(Y,{name:"pause"}):t(Y,{name:"play"})}),t(tr,{muted:g.isMuted,volume:g.volume,volumeIcon:f(),buttonClassName:D.controlBtn,onToggleMute:o.toggleMute,onVolumeChange:n.handleVolumeChange,onExpandedChange:S=>o.setShowVolumeSlider(S)}),t("span",{className:D.timeDisplay,ref:v,children:[o.formatTime(0)," / ",o.formatTime(g.duration)]}),g.currentSkipInterval&&!g.isAutoSkipEnabled&&t("button",{className:D.controlBtn,onClick:()=>{e.videoRef.current&&g.currentSkipInterval&&(e.videoRef.current.currentTime=g.currentSkipInterval.end_time,o.setCurrentSkipInterval(null))},children:["Skip ",g.currentSkipInterval.skip_type==="op"?"Opening":"Ending"]})]}),t("div",{className:D.rightControls,children:[t("div",{className:D.skipControls,children:l&&t("button",{className:D.nextEpisodeBtn,onClick:i,title:"Play next episode",children:"Next EP"})}),t("button",{className:`${D.controlBtn} ${n.isSubtitleActive?D.active:""}`,onClick:n.handleCCToggle,title:n.isSubtitleActive?"Disable Subtitles":"Enable Subtitles","aria-label":"Toggle Subtitles",children:t(Y,{name:"closed-captioning",size:22})}),t("button",{ref:c,className:`${D.controlBtn} ${N?D.active:""} `,onClick:()=>o.setShowSettings(!N),"aria-label":"Settings",children:t(Y,{name:"cog"})}),t("button",{className:`${D.controlBtn} ${D.theaterBtn} ${s?D.active:""} `,onClick:S=>{S.stopPropagation(),d()},title:s?"Exit Theater Mode":"Theater Mode","aria-label":s?"Exit Theater Mode":"Theater Mode",children:t(Y,{name:"tv"})}),t("button",{className:D.controlBtn,onClick:o.toggleFullscreen,"aria-label":g.isFullscreen?"Exit Fullscreen":"Fullscreen",children:g.isFullscreen?t(Y,{name:"compress"}):t(Y,{name:"expand"})})]})]})]})})};function En(r){const{state:n,refs:a,actions:u}=r,l=o=>{a.videoRef.current&&(a.videoRef.current.volume=o,a.videoRef.current.muted=o===0)},i=o=>{!a.videoRef.current||isNaN(n.duration)||n.duration===0||(a.videoRef.current.currentTime=o*n.duration,u.sendProgressUpdate(!1,!0))},s=()=>{a.videoRef.current&&(u.setIsScrubbing(!0),u.wasPlayingBeforeScrub.current=!a.videoRef.current.paused,a.videoRef.current.pause())},d=o=>{!a.videoRef.current||!n.duration||(a.videoRef.current.currentTime=o*n.duration)},c=()=>{u.setIsScrubbing(!1),u.wasPlayingBeforeScrub.current&&a.videoRef.current?.play()},v=o=>{if(!a.videoRef.current)return;u.setActiveSubtitleTrack(o);try{if(o===null||o==="off")localStorage.setItem("playerSubtitlesEnabled","false");else{localStorage.setItem("playerSubtitlesEnabled","true");const f=n.availableSubtitles.find(S=>S.label===o||S.lang===o);f?localStorage.setItem("playerLastSubtitle",rr(f)):localStorage.setItem("playerLastSubtitle",o)}}catch{}let N=!1;Array.from(a.videoRef.current.textTracks).forEach(f=>{const _=o!==null&&o!=="off"&&(f.language===o||f.label===o)&&!N;f.mode=_?"showing":"hidden",_&&(N=!0)})},g=n.activeSubtitleTrack!==null&&n.activeSubtitleTrack!=="off";return{handleVolumeChange:l,handleSeek:i,handleScrubStart:s,handleScrubMove:d,handleScrubEnd:c,handleSubtitleSelection:v,isSubtitleActive:g,handleCCToggle:()=>{if(!a.videoRef.current)return;if(g){v("off");return}if(n.availableSubtitles.length===0)return;let o=null;try{o=localStorage.getItem("playerLastSubtitle")}catch{}const N=St(n.availableSubtitles,{lastKey:o,enabled:!0});if(N<0)return;const f=n.availableSubtitles[N];v(f.label||f.lang)}}}const wn=jt(()=>Pt(()=>import("./PlayerSettings-CWc5Tf-B.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]))),kn=({player:r,isAutoplayEnabled:n,onAutoplayChange:a,showNextEpisodeButton:u,onNextEpisode:l,videoSources:i,selectedSource:s,selectedLink:d,onSourceChange:c,loadingVideo:v,skipIntervals:g,animeTitle:e,episodeNumber:o,isTheaterMode:N,onTheaterModeToggle:f,anime4kEnabled:S,onAnime4kToggle:_,anime4kSupported:E,anime4kProfile:R,onAnime4kProfileChange:w,anime4kInitializing:C,anime4kError:x,videoDelayEnabled:h,onVideoDelayToggle:b,videoDelayMs:B,onVideoDelayChange:X,onCalibrateAvSync:$,fallbackChoice:G,onFallbackChoiceChange:I,ambientSettings:L,onAmbientChange:A,children:F,overlays:O,isInteractingExtra:y=!1,className:m,hideChrome:M=!1})=>{const{state:k,actions:q}=r,{showSettings:J}=k,{setShowSettings:H}=q,K=En(r),ee=dt.useRef(null),Se=dt.useRef(null),Ae=dt.useRef(null);V(()=>{const j=ve=>{ee.current&&!ee.current.contains(ve.target)&&Se.current&&!Se.current.contains(ve.target)&&J&&H(!1)};return J&&document.addEventListener("mousedown",j),()=>{document.removeEventListener("mousedown",j)}},[J,H]);const Re=k.showControls||J||k.isScrubbing,te=t(sr,{visible:Re,title:e,episode:o?`Episode ${o}`:void 0,onBack:()=>window.history.back(),classes:{overlay:D.controlsOverlay,hidden:D.hidden,top:D.topControls,backBtn:D.backBtn,titleInfo:D.videoTitleInfo,title:D.animeTitle,episode:D.episodeNumber}}),z=!v&&!k.isBuffering&&k.duration>0?t(nr,{isPlaying:k.isPlaying,onTogglePlay:q.togglePlay,onSkipBack:()=>q.seek(-10),onSkipForward:()=>q.seek(10)}):null,ke=t(Sn,{player:r,handlers:K,visible:Re,skipIntervals:g,showNextEpisodeButton:u,onNextEpisode:l,isTheaterMode:N,onTheaterModeToggle:f,settingsBtnRef:Se,timeDisplayRef:Ae}),_e=t(zt,{fallback:null,children:t(wn,{ref:ee,isOpen:J,onClose:()=>H(!1),videoSources:i,currentSource:s,currentLink:d,onSourceChange:c,subtitles:k.availableSubtitles,activeSubtitleTrack:k.activeSubtitleTrack,onSubtitleChange:K.handleSubtitleSelection,subtitleSettings:{fontSize:k.subtitleFontSize,position:k.subtitlePosition,bgOpacity:k.subtitleBgOpacity,bgColor:k.subtitleBgColor,textColor:k.subtitleTextColor,edge:k.subtitleEdge,bold:k.subtitleBold},onSubtitleSettingsChange:q.setSubtitleStyle,useNativeControls:k.useNativeControls,onNativeControlsToggle:q.setUseNativeControls,anime4kEnabled:S,onAnime4kToggle:_,anime4kSupported:E,anime4kProfile:R,onAnime4kProfileChange:w,anime4kInitializing:C,anime4kError:x,videoDelayEnabled:h,onVideoDelayToggle:b,videoDelayMs:B,onVideoDelayChange:X,onCalibrateAvSync:$,isAutoSkipEnabled:k.isAutoSkipEnabled,onAutoSkipChange:j=>{q.setIsAutoSkipEnabled(j);try{localStorage.setItem("autoSkipEnabled",j.toString())}catch{}},isAutoplayEnabled:n,onAutoplayChange:a,fallbackChoice:G,onFallbackChoiceChange:I,isTheaterMode:N,ambientSettings:L,onAmbientChange:A})}),re=J?t("div",{"data-speed-boost-ignore":"true",onClick:j=>j.stopPropagation(),children:_e}):null;return t(or,{player:r,topBar:te,centerControls:z,bottomBar:!v&&k.duration>0?ke:null,settingsPanel:re,overlays:O,isInteracting:y,className:m,chromeDisabled:M,children:F})},Tn=({count:r=3})=>t("section",{className:Ee.section,children:[t("div",{className:Ee.header,children:t("button",{className:Ee.headerToggle,disabled:!0,children:[t("span",{className:Ee.title,children:t(Ye,{width:"60px",height:"1.2rem",variant:"text"})}),t(Y,{name:"chevron-down",style:{opacity:.3}})]})}),t("div",{className:Ee.list,children:Array.from({length:r}).map((n,a)=>t("div",{className:Ee.item,style:{pointerEvents:"none"},children:[t("div",{className:Ee.dragHandle,style:{opacity:.2},children:t(Ye,{width:"16px",height:"16px",variant:"rectangular"})}),t("div",{className:Ee.thumbnail,style:{overflow:"hidden",background:"transparent"},children:t(Ye,{width:"100%",height:"100%",variant:"rectangular"})}),t("div",{className:Ee.meta,children:[t(Ye,{width:"80%",height:"1.2rem",variant:"text",className:Ee.metaGap}),t(Ye,{width:"40%",height:"0.8rem",variant:"rectangular",style:{borderRadius:"var(--radius-sm)"}})]})]},a))})]}),Cn={soft:"Softsub",hard:"Hardsub",mixed:"Mixed"},Mn={direct:"Direct",embed:"Embed",cookie:"Needs cookie"},Rn=["direct","cookie","embed"],Nn=({selectedProvider:r,onProviderChange:n,isAdult:a,options:u})=>{const i=(u&&u.length>0?u:[]).filter(s=>s.mature===(a===!0));return t("div",{className:Ie.providerSelectContainer,children:[t("h4",{children:"Provider"}),t("select",{className:Ie.providerSelect,value:r,onChange:s=>n(s.currentTarget.value),children:Rn.map(s=>{const d=i.filter(c=>(c.tier??"direct")===s);return d.length===0?null:t("optgroup",{label:Mn[s],children:d.map(c=>t("option",{value:c.id,children:c.sub?`${c.label} (${Cn[c.sub]})`:c.label},c.id))},s)})})]})},Pn=({videoSources:r,selectedSource:n,selectedLink:a,onSourceChange:u,onLinkChange:l})=>{const i=Array.isArray(r)?r:[];if(i.length===0)return null;const s=n?.type==="iframe"&&(n.links?.length??0)>1;return t("div",{className:Ie.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:Ie.sourceButtons,children:i.map((d,c)=>t("button",{className:`${Ie.sourceButton} ${n?.sourceName===d.sourceName?Ie.active:""} `,onClick:()=>u(d),children:d.sourceName},`${d.sourceName}-${c}`))}),s&&t("select",{className:Ie.sourceSelect,"aria-label":"Fallback embed quality",value:a?.link??n.links[0]?.link??"",onChange:d=>{const c=n.links.find(v=>v.link===d.currentTarget.value);c&&l(c)},children:n.links.map(d=>t("option",{value:d.link,children:d.resolutionStr},d.link))})]})},An=dt.memo(Pn,(r,n)=>r.selectedSource?.sourceName===n.selectedSource?.sourceName&&r.selectedLink?.link===n.selectedLink?.link&&r.videoSources===n.videoSources),_n={low:{sd:1.5,hd:1.3,fhd:1.25},balanced:{sd:2,hd:1.5,fhd:1.25},high:{sd:2.5,hd:2,fhd:1.5},denoise:{sd:1.5,hd:1.5,fhd:1.5}},xn={low:"ModeB",balanced:"ModeA",high:"ModeAA",denoise:"ModeC"},Bn=5,Ln=15e3,Dn=`
3
- @group(0) @binding(0) var extTex: texture_external;
4
- @group(0) @binding(1) var extSamp: sampler;
5
- struct VSOut {
6
- @builtin(position) pos: vec4f,
7
- @location(0) uv: vec2f,
8
- };
9
- @vertex
10
- fn vs(@builtin(vertex_index) idx: u32) -> VSOut {
11
- var positions = array<vec2f, 6>(
12
- vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),
13
- vec2f(-1.0, 1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0)
14
- );
15
- var uvs = array<vec2f, 6>(
16
- vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(0.0, 0.0),
17
- vec2f(0.0, 0.0), vec2f(1.0, 1.0), vec2f(1.0, 0.0)
18
- );
19
- var out: VSOut;
20
- out.pos = vec4f(positions[idx], 0.0, 1.0);
21
- out.uv = uvs[idx];
22
- return out;
23
- }
24
- @fragment
25
- fn fs(@location(0) uv: vec2f) -> @location(0) vec4f {
26
- return textureSampleBaseClampToEdge(extTex, extSamp, uv);
27
- }
28
- `;function $n({videoRef:r,canvasRef:n,profile:a="balanced",delayMs:u=0}){const[l,i]=ie(!1),[s,d]=ie(()=>{try{return localStorage.getItem("anime4kEnabled")==="true"}catch{return!1}}),[c,v]=ie(!1),[g,e]=ie(null),[o,N]=ie(0),f=P(0),S=P(null),_=P(null),E=P(null),R=P(null),w=P(null),C=P(null),x=P(null),h=P(null),b=P(null),B=P(!1),X=P(-1),$=P(0),G=P(u);G.current=u;const I=P([]),L=P(!1),A=P(!1),F=P(!1),O=P(null),y=P(-1),m=P(-1),M=P(!1),k=P(0);V(()=>{async function H(){if(typeof navigator>"u"||!navigator.gpu){i(!1);return}try{const K=await navigator.gpu.requestAdapter();i(!!K)}catch{i(!1)}}H()},[]),V(()=>{if(!s||!l)return;let H=!1;const K=++f.current,ee=z=>{if(z)try{z.close()}catch{}},Se=()=>{for(const z of I.current)ee(z.bitmap);I.current=[]},Ae=z=>Math.max(8,Math.min(40,Math.ceil(z/16.7)+4));function Re(){b.current!==null&&(cancelAnimationFrame(b.current),b.current=null)}async function te(){let z=r.current;const ke=n.current;if(!z||!ke||f.current!==K)return;const _e=performance.now()+Ln;for(;(!z||z.videoWidth===0)&&performance.now()<_e;){if(await new Promise(ce=>requestAnimationFrame(ce)),H||f.current!==K)return;z=r.current}if(!z||z.videoWidth===0){!H&&f.current===K&&(e("Timed out waiting for video metadata"),v(!1),d(!1));return}const re=z.videoWidth,j=z.videoHeight,ve=Math.max(re,j),ft=window.innerWidth,xe=window.innerHeight,Je=Math.max(ft,xe),Ze=ve<Je?Je/ve:1,Qe=_n[a],ht=ve<=480?Qe.sd:ve<=720?Qe.hd:ve<=1080?Qe.fhd:1,le=Math.min(ht,Ze);ke.width=Math.round(re*le),ke.height=Math.round(j*le),v(!0),e(null),$.current=0,X.current=-1,y.current=-1,m.current=-1,M.current=!1,k.current=0,Se(),B.current=!1;try{let ce=function(){H||f.current!==K||(Re(),b.current=requestAnimationFrame(()=>{at()}))};const{ModeA:pt,ModeB:Te,ModeC:et,ModeAA:Ge}=await Pt(async()=>{const{ModeA:U,ModeB:ne,ModeC:he,ModeAA:ue}=await import("./index-BOKlZEHq.js").then(de=>de.i);return{ModeA:U,ModeB:ne,ModeC:he,ModeAA:ue}},[]);if(!navigator.gpu)throw new Error("WebGPU not available");const tt=await navigator.gpu.requestAdapter();if(!tt)throw new Error("No GPU adapter found");const W=await tt.requestDevice();if(!W)throw new Error("Failed to get GPU device");const Ne=ke.getContext("webgpu");if(!Ne)throw new Error("Failed to get WebGPU context");const qe=navigator.gpu.getPreferredCanvasFormat();Ne.configure({device:W,format:qe,alphaMode:"premultiplied"});const fe=W.createTexture({size:[re,j],format:"rgba16float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),rt=xn[a],Fe=Math.round(re*le),Oe=Math.round(j*le),Ke=(()=>{switch(rt){case"ModeB":return new Te({device:W,inputTexture:fe,nativeDimensions:{width:re,height:j},targetDimensions:{width:Fe,height:Oe}});case"ModeC":return new et({device:W,inputTexture:fe,nativeDimensions:{width:re,height:j},targetDimensions:{width:Fe,height:Oe}});case"ModeAA":return new Ge({device:W,inputTexture:fe,nativeDimensions:{width:re,height:j},targetDimensions:{width:Fe,height:Oe}});default:return new pt({device:W,inputTexture:fe,nativeDimensions:{width:re,height:j},targetDimensions:{width:Fe,height:Oe}})}})(),Be=Ke.getOutputTexture(),ze=W.createSampler({magFilter:"linear",minFilter:"linear"}),nt=W.createShaderModule({code:`
29
- @group(0) @binding(0) var tex: texture_2d<f32>;
30
- @group(0) @binding(1) var samp: sampler;
31
- struct VertexOutput {
32
- @builtin(position) pos: vec4f,
33
- @location(0) uv: vec2f,
34
- }
35
- @vertex
36
- fn vs(@builtin(vertex_index) idx: u32) -> VertexOutput {
37
- var positions = array<vec2f, 6>(
38
- vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),
39
- vec2f(-1.0, 1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0)
40
- );
41
- var uvs = array<vec2f, 6>(
42
- vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(0.0, 0.0),
43
- vec2f(0.0, 0.0), vec2f(1.0, 1.0), vec2f(1.0, 0.0)
44
- );
45
- var out: VertexOutput;
46
- out.pos = vec4f(positions[idx], 0.0, 1.0);
47
- out.uv = uvs[idx];
48
- return out;
49
- }
50
- @fragment
51
- fn fs(@location(0) uv: vec2f) -> @location(0) vec4f {
52
- return textureSample(tex, samp, uv);
53
- }
54
- `}),Le=W.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),De=W.createRenderPipeline({layout:W.createPipelineLayout({bindGroupLayouts:[Le]}),vertex:{module:nt,entryPoint:"vs"},fragment:{module:nt,entryPoint:"fs",targets:[{format:qe}]},primitive:{topology:"triangle-list"}}),ot=W.createBindGroup({layout:Le,entries:[{binding:0,resource:Be.createView()},{binding:1,resource:ze}]});try{const U=W.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,externalTexture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),ne=W.createShaderModule({code:Dn}),he=W.createRenderPipeline({layout:W.createPipelineLayout({bindGroupLayouts:[U]}),vertex:{module:ne,entryPoint:"vs"},fragment:{module:ne,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-list"}});O.current={pipeline:he,layout:U,inputView:fe.createView()}}catch{O.current=null}if(f.current!==K){fe.destroy(),W.destroy();return}S.current=W,_.current=Ne,E.current=Ke,R.current=fe,w.current=Be,C.current=De,x.current=ze,h.current=Le,A.current=!1,F.current=!1;async function st(){const U=O.current;if(!U||A.current)return!1;const ne=r.current;if(!ne)return!1;const he=!F.current;he&&W.pushErrorScope("validation");try{const ue=W.importExternalTexture({source:ne}),de=W.createBindGroup({layout:U.layout,entries:[{binding:0,resource:ue},{binding:1,resource:ze}]}),pe=W.createCommandEncoder(),ge=pe.beginRenderPass({colorAttachments:[{view:U.inputView,loadOp:"load",storeOp:"store"}]});ge.setPipeline(U.pipeline),ge.setBindGroup(0,de),ge.draw(6),ge.end(),W.queue.submit([pe.finish()])}catch{return A.current=!0,O.current=null,!1}if(he){const ue=await W.popErrorScope().catch(()=>null);if(ue)return console.warn("[anime4k] blit probe failed:",ue.message),A.current=!0,O.current=null,!1;F.current=!0}return!0}v(!1);async function at(){if(H||f.current!==K||!Ne)return;const U=r.current;if(!U||U.videoWidth===0){ce();return}if(U!==z||U.videoWidth!==re||U.videoHeight!==j){N(de=>de+1);return}if(U.paused||U.ended||document.hidden||U.readyState<HTMLMediaElement.HAVE_CURRENT_DATA){ce();return}const ne=U.getVideoPlaybackQuality().totalVideoFrames;if(ne===m.current){ce();return}if(B.current){ce();return}const he=U.currentTime;(U.seeking||y.current>=0&&Math.abs(he-y.current)>.5)&&(Se(),M.current=!1,k.current=0,m.current=-1),y.current=he;const ue=Math.max(0,G.current||0);ue>k.current&&(M.current=!1),B.current=!0;try{const de=performance.now();let pe=null,ge=!1;if(ue<=0){I.current.length>0&&Se(),M.current=!1,k.current=0;let ye=!1;if(!L.current)try{W.queue.copyExternalImageToTexture({source:U},{texture:fe},[re,j]),m.current=ne,ye=!0}catch(oe){if(oe instanceof TypeError)L.current=!0;else throw oe}if(!ye&&!A.current&&O.current&&await st()&&(m.current=ne,ye=!0),!ye){const oe=await createImageBitmap(U);m.current=ne,W.queue.copyExternalImageToTexture({source:oe},{texture:fe},[re,j]),ee(oe)}}else{const ye=await createImageBitmap(U);m.current=ne;const oe=I.current;oe.push({bitmap:ye,capture:de});const it=Ae(ue);for(;oe.length>it;)ee(oe.shift()?.bitmap);let Ue=-1;for(let se=oe.length-1;se>=0;se--)if(de-oe[se].capture>=ue){Ue=se;break}if(Ue!==-1){for(let He=0;He<Ue;He++)ee(oe.shift()?.bitmap);const se=oe.shift();se?(pe=se.bitmap,M.current=!0,k.current=ue):(pe=ye,ge=!0)}else if(!M.current)pe=ye,ge=!0;else{const se=oe.shift();pe=se?se.bitmap:ye,se||(ge=!0)}if(!pe){B.current=!1,ce();return}W.queue.copyExternalImageToTexture({source:pe},{texture:fe},[re,j]),ge||ee(pe)}const je=W.createCommandEncoder();await Ke.pass(je);const We=je.beginRenderPass({colorAttachments:[{view:Ne.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});We.setPipeline(De),We.setBindGroup(0,ot),We.draw(6),We.end(),W.queue.submit([je.finish()]),X.current=ne,$.current=0,W.queue.onSubmittedWorkDone().then(()=>{f.current===K&&(B.current=!1)})}catch(de){if(B.current=!1,$.current+=1,$.current>=Bn&&!H&&f.current===K){console.error(de),e(de instanceof Error?de.message:"Render error"),d(!1);return}}ce()}ce()}catch(ce){!H&&f.current===K&&(e(ce instanceof Error?ce.message:"Failed to initialize upscaler"),v(!1),d(!1))}}return te(),()=>{H=!0,f.current+=1,Re(),Se(),R.current&&(R.current.destroy(),R.current=null),w.current&&(w.current.destroy(),w.current=null),S.current&&(S.current.destroy(),S.current=null),E.current=null,C.current=null,x.current=null,h.current=null,O.current=null,_.current=null,B.current=!1}},[s,l,r,n,a,o]);const q=Q(H=>{d(H);try{localStorage.setItem("anime4kEnabled",String(H))}catch{}},[]),J=Q(()=>{d(H=>{const K=!H;try{localStorage.setItem("anime4kEnabled",String(K))}catch{}return K})},[]);return{isWebGPUSupported:l,isEnabled:s,isInitializing:c,error:g,toggle:J,setEnabled:q}}function In({videoRef:r,episodeKey:n,isEnabled:a,isSupported:u,mediaReady:l,isIframeSource:i,setEnabled:s}){const d=P(null),c=P(!1),v=P(!1),g=P(s);g.current=s,V(()=>{const e=d.current;d.current=n,!(e===null||e===n)&&(!a||!u||(c.current=!0,v.current=!1,g.current(!1)))},[n,a,u]),V(()=>{if(!c.current)return;if(a){v.current&&(c.current=!1);return}if(v.current=!0,!l)return;if(i){c.current=!1,g.current(!0);return}const e=r.current;if(!e)return;let o,N=!1;const f=()=>{N||(N=!0,c.current=!1,g.current(!0))};if(e.readyState>=2)return o=window.setTimeout(f,500),()=>window.clearTimeout(o);const S=()=>{window.setTimeout(f,500)};return e.addEventListener("canplay",S,{once:!0}),e.addEventListener("playing",S,{once:!0}),o=window.setTimeout(f,5e3),()=>{window.clearTimeout(o),e.removeEventListener("canplay",S),e.removeEventListener("playing",S)}},[a,l,i,r])}const Fn=()=>localStorage.getItem("preferredMode")==="dub"?"dub":"sub",On=/^[a-z0-9-]+$/i,_t=r=>r?"preferredProviderMature":"preferredProvider",xt=r=>{const n=localStorage.getItem(_t(r));return n&&On.test(n)?n:null},Bt=(r,n)=>{localStorage.setItem(_t(n),r)},Wn=()=>xt(!1)??"megaplay",Un=()=>({showMeta:{},episodes:[],watchedEpisodes:[],watchlistStatus:null,showCombinedDetails:!1,currentMode:Fn(),inWatchlist:!1,videoSources:[],selectedSource:null,selectedLink:null,isAutoplayEnabled:Ir(),showResumeModal:!0,resumeTime:0,resumeDuration:0,skipIntervals:[],selectedProvider:Wn(),loadingShowData:!0,loadingVideo:!1,error:null,showCookieModal:!1,cookieProvider:null});function Vn(r,n){switch(n.type){case"SET_STATE":return{...r,...n.payload};case"SET_MODE":return{...r,currentMode:n.payload,videoSources:[],selectedSource:null,selectedLink:null};case"SET_PROVIDER":return{...r,selectedProvider:n.payload};default:return r}}async function Mt(r,n,a,u,l=!1){if(!r||!n)throw new Error("Missing params");try{const[i,s,d,c]=await Promise.all([me.data.video.query({showId:r,episodeNumber:n,mode:a.currentMode,provider:a.selectedProvider}).catch(R=>{const w=R.data?.cause;return R.message==="AUTH_REQUIRED"&&w?.provider==="mkissa"&&u({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:"mkissa"}}),null}),me.progress.getEpisode.query({showId:r,episodeNumber:n}).catch(()=>null),me.settings.getByKey.query({key:"preferredSource"}).catch(()=>null),me.data.skipTimes.query({showId:r,episodeNumber:n}).catch(()=>[])]),v=d?.value,g=i?.filter(R=>{const w=R.sourceName.toLowerCase();return a.currentMode==="dub"?w.includes("eng")||w.includes("dub"):w.includes("jpn")||w.includes("sub")||!w.includes("eng")&&!w.includes("dub")})??[],e=g.length>0?g:i??[];let o=e.length>0?e[0]:null;if(v){const R=e.find(w=>w.sourceName===v);R&&(o=R)}const N=o&&o.links.length>0?o.links.sort((R,w)=>(parseInt(w.resolutionStr)||0)-(parseInt(R.resolutionStr)||0))[0]:null,f=s?.currentTime||0,S=s?.duration||0,E=(Array.isArray(c)?c:c?.results||[]).map(R=>({skip_id:R.skip_id||"",skip_type:R.skip_type||"",start_time:R.interval?.start_time??R.start_time??0,end_time:R.interval?.end_time??R.end_time??0})).filter(R=>R.end_time>0);return(!i||i.length===0)&&(l||we.error(`No video sources found for ${a.selectedProvider}`)),{videoSources:i,selectedSource:o,selectedLink:N,resumeTime:f,resumeDuration:S,showResumeModal:f>5&&o?.type!=="iframe",skipIntervals:E,fetchedEpisodeNumber:n}}catch(i){const s=i;if(s.message==="AUTH_REQUIRED")return u({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:s.provider}}),{videoSources:[],selectedSource:null,selectedLink:null,resumeTime:0,resumeDuration:0,showResumeModal:!1,skipIntervals:[],fetchedEpisodeNumber:n};throw i}}const Qn=(r,n,a,u)=>{const[l,i]=Ht(Vn,a,y=>({...Un(),showMeta:y?.name?{name:y.name,thumbnail:y.thumbnail,nativeName:y.nativeName,englishName:y.englishName,names:{romaji:y.name||y.englishName,english:y.englishName||y.name,native:y.nativeName}}:{}})),s=Rt(),d=Mr(),c=P(null),v=P(null),{options:g}=At(),e=Me(()=>g.filter(y=>(y.kind??"anime")==="anime"),[g]),o=n||l.initialEpisode,N=P(o);V(()=>{N.current!==o&&(N.current=o,i({type:"SET_STATE",payload:{selectedSource:null,selectedLink:null}}))},[o,i]),V(()=>{r&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(r)&&l.selectedProvider!=="animepahe"&&c.current!==r&&(c.current=r,i({type:"SET_PROVIDER",payload:"animepahe"}))},[r,l.selectedProvider]);const{data:f,isLoading:S,error:_}=Qr(r),{data:E}=Tt({queryKey:[ae.playerData,r,l.currentMode,l.selectedProvider],queryFn:async()=>{if(!r)throw new Error("No showId");const y=async()=>{try{const J=await me.data.episodes.query({showId:r,mode:l.currentMode,provider:l.selectedProvider}).catch(()=>null);if(J?.episodes?.length)return J}catch{}return null},[m,M,k]=await Promise.all([y(),me.watchlist.check.query({showId:r}).catch(()=>({inWatchlist:!1,status:null})),me.progress.getWatchedEpisodes.query({showId:r}).catch(()=>[])]),q=m?.episodes?m.episodes.sort((J,H)=>parseFloat(J)-parseFloat(H)):[];return{description:m?.description||"",episodes:q,inWatchlist:M.inWatchlist,watchlistStatus:M.status??null,watchedEpisodes:k}},enabled:!!r});V(()=>{!n&&E?.episodes&&E.episodes.length>0&&!n&&i({type:"SET_STATE",payload:{initialEpisode:E.episodes[0]}})},[E,n]),V(()=>{if(f?.isAdult===void 0||v.current===r)return;const y=f.isAdult===!0,m=e.filter(k=>k.mature===y);if(m.length===0||e.find(k=>k.id===l.selectedProvider)?.mature===y)return;const M=xt(y);v.current=r??null,i({type:"SET_PROVIDER",payload:m.find(k=>k.id===M)?.id??m[0].id})},[f?.isAdult,l.selectedProvider,r,e]),V(()=>{if(!r||!/^dango-mt-\d+$/.test(r)||v.current===`temp:${r}`)return;const y=f?.provider;y&&(v.current=`temp:${r}`,y!==l.selectedProvider&&i({type:"SET_PROVIDER",payload:y}))},[r,f,l.selectedProvider]);const{data:R,isLoading:w,error:C}=Tt({queryKey:[ae.videoSources,r,o,l.selectedProvider,l.currentMode],queryFn:()=>Mt(r,o,l,i),enabled:!!r&&!!o&&!(l.showMeta?.isAdult===!0&&!u?.hasMatureConsent)}),{mutateAsync:x}=yt({mutationFn:async({wasIn:y,showMeta:m})=>{if(!r)throw new Error("Missing showId");if(y)await me.watchlist.remove.mutate({id:r});else{const M=m.name||m.names?.romaji;if(!M)throw new Error("Missing show name");await me.watchlist.add.mutate({id:r,name:M,thumbnail:m.thumbnail,nativeName:m.names?.native,englishName:m.names?.english,type:m.type,isAdult:m.isAdult})}return!y},onSuccess:y=>{we.success(y?"Added to watchlist":"Removed from watchlist"),s.invalidateQueries({queryKey:[ae.playerData,r]}),s.invalidateQueries({queryKey:[ae.showData,r]}),s.invalidateQueries({queryKey:[ae.watchlist]})},onError:y=>we.error(y instanceof Error?y.message:"Failed to update watchlist")}),h=Q(async()=>{!r||!f||await x({wasIn:!!E?.inWatchlist,showMeta:f})},[r,f,E?.inWatchlist,x]),b=Q(async y=>{try{await me.settings.set.mutate({key:"preferredSource",value:y})}catch(m){console.error(m)}},[]),{mutateAsync:B,isPending:X}=yt({mutationFn:async({status:y})=>{if(!r)throw new Error("Missing showId");if(E?.inWatchlist)return await me.watchlist.setStatus.mutate({id:r,status:y}),y;const m=f,M=m?.name||m?.names?.romaji;if(!m||!M)throw new Error("Missing show name");return await me.watchlist.add.mutate({id:r,name:M,thumbnail:m.thumbnail,nativeName:m.names?.native,englishName:m.names?.english,type:m.type,isAdult:m.isAdult,status:y}),y},onSuccess:y=>{i({type:"SET_STATE",payload:{inWatchlist:!0,watchlistStatus:y}}),we.success(`Moved to ${y}`),s.invalidateQueries({queryKey:[ae.showData,r]}),s.invalidateQueries({queryKey:[ae.watchlist]}),s.invalidateQueries({queryKey:[ae.continueWatching]})},onError:()=>we.error("Failed to update watchlist status")}),$=Q(async()=>{await B({status:"Completed"})},[B]),{mutateAsync:G,isPending:I}=yt({mutationFn:async({episodeNumber:y,duration:m,showMeta:M,episodes:k})=>{await me.progress.updateProgress.mutate({showId:r??"",episodeNumber:y,currentTime:m,duration:m,showName:M.name,showThumbnail:M.thumbnail,nativeName:M.names?.native,englishName:M.names?.english,genres:M.genres?.map(q=>q.name),popularityScore:Rr(M.score)??void 0,type:M.type,status:M.status,episodeCount:k.length,isAdult:M.isAdult})},onSuccess:(y,m)=>{we.success(`Episode ${m.episodeNumber} marked as watched`),s.invalidateQueries({queryKey:[ae.playerData,r]}),s.invalidateQueries({queryKey:[ae.showMeta,r]}),s.invalidateQueries({queryKey:[ae.videoSources,r,m.episodeNumber]}),s.invalidateQueries({queryKey:[ae.continueWatching]}),s.invalidateQueries({queryKey:[ae.thisWeekSchedule]}),s.invalidateQueries(d.continueWatching.pathFilter())},onError:()=>we.error("Failed to mark episode as watched")}),L=Q(async(y,m)=>{!r||!f||await G({episodeNumber:y,duration:m,showMeta:f,episodes:E?.episodes||[]})},[r,f,E?.episodes,G]),A=Q(async()=>{i({type:"SET_STATE",payload:{showCombinedDetails:!l.showCombinedDetails}})},[l.showCombinedDetails]),F=Me(()=>{const y=_||C,m=y?y.message:null,M=m==="AUTH_REQUIRED"?null:m,k=R&&R.fetchedEpisodeNumber===o?R:null,q=!!R&&!k;return{...l,currentEpisode:o,showMeta:{...l.showMeta||{},...f||{}},episodes:E?.episodes||[],watchedEpisodes:E?.watchedEpisodes||[],inWatchlist:!!E?.inWatchlist,watchlistStatus:E?.watchlistStatus??l.watchlistStatus??null,videoSources:k?.videoSources||[],selectedSource:l.selectedSource||k?.selectedSource||null,selectedLink:l.selectedLink||k?.selectedLink||null,resumeTime:k?.resumeTime||0,resumeDuration:k?.resumeDuration||0,showResumeModal:l.showResumeModal&&(k?.showResumeModal??!1),skipIntervals:k?.skipIntervals||[],loadingShowData:S,loadingVideo:w||q,error:M,fetchedEpisodeNumber:k?.fetchedEpisodeNumber}},[l,f,E,R,S,w,_,C,o]),O=Q((y,m)=>{const M=m||r;if(!M||!y||M===r&&y===o)return;const q=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(M)&&l.selectedProvider!=="animepahe"?"animepahe":l.selectedProvider,J=["video-sources",M,y,q,l.currentMode];s.getQueryState(J)?.status!=="success"&&s.prefetchQuery({queryKey:J,queryFn:()=>Mt(M,y,{selectedProvider:q,currentMode:l.currentMode},i,!0),staleTime:300*1e3,gcTime:1800*1e3})},[r,o,s,l,i]);return{state:F,dispatch:i,toggleWatchlist:h,moveToCompleted:$,setPreferredSource:b,handleToggleDetails:A,markEpisodeWatched:L,prefetchEpisodeSources:O,isMarkingWatched:I,isUpdatingWatchlistStatus:X}};function Gn({onNext:r,onToggleTheater:n,flashControls:a}){V(()=>{const u=l=>{l.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||(["arrowup","arrowdown","arrowleft","arrowright"].includes(l.key.toLowerCase())&&a(),l.key.toLowerCase()==="n"&&r(),l.key.toLowerCase()==="t"&&n())};return document.addEventListener("keydown",u),()=>{document.removeEventListener("keydown",u)}},[a,r,n])}const Xe=(r,n,a)=>r.showId===n||!!a&&r.showId===a;function qn({testClipActive:r,selectedSourceType:n,onEnded:a,queue:u,removeFromQueue:l,showId:i,showMetaId:s,currentEpisode:d,isAutoplayEnabled:c,nextEpisode:v,previousEpisode:g,navigate:e,invalidateContinueWatching:o,dispatch:N}){const[f,S]=ie(!1),[_,E]=ie(null),[R,w]=ie(null),C=P(l);C.current=l;const x=P(!1);V(()=>{x.current=!1,S(!1)},[i,d]);const h=Q(()=>{if(r||x.current)return;x.current=!0,a();const L=u.find(A=>Xe(A,i,s)&&A.episodeNumber===d);if(u.length>0){const A=u.findIndex(O=>Xe(O,i,s)&&O.episodeNumber===d),F=A>=0?u[A+1]||null:u[0];w({nextItem:F,playedItem:L||null}),E(2);return}if(L&&C.current({showId:L.showId,episodeNumber:L.episodeNumber}),c&&v){o(),e(`/watch/${i}/${v}`);return}v||S(!0)},[a,e,u,i,s,d,v,c,o,r]),b=Q(()=>{if(u.length===0)return;a();const L=u.find(O=>Xe(O,i,s)&&O.episodeNumber===d),A=u.findIndex(O=>Xe(O,i,s)&&O.episodeNumber===d),F=A>=0?u[A+1]||null:u[0];L&&l({showId:L.showId,episodeNumber:L.episodeNumber}),F?e(`/watch/${F.showId}/${F.episodeNumber}`):v||S(!0)},[a,e,u,l,i,s,d,v]),B=Q(()=>{v&&(o(),e(`/watch/${i}/${v}`)),S(!1),N({type:"SET_STATE",payload:{showResumeModal:!1}})},[v,e,i,N,o]),X=Q(()=>{u.length>0?b():v?B():we.error("No next episode available")},[u.length,b,B,v]),$=Q(()=>S(!1),[]),G=Q(()=>{w(null),E(null)},[]),I=Q(()=>{g&&e(`/watch/${i}/${g}`)},[g,e,i]);return V(()=>{const L=A=>{A.origin===window.location.origin&&n==="iframe"&&A.data?.type==="ANI_WEB_MEDIA_ENDED"&&h()};return window.addEventListener("message",L),()=>window.removeEventListener("message",L)},[h,n]),V(()=>{if(!R||_===null)return;if(_<=0){const{nextItem:A,playedItem:F}=R;w(null),E(null),F&&C.current({showId:F.showId,episodeNumber:F.episodeNumber}),A?e(`/watch/${A.showId}/${A.episodeNumber}`):v||S(!0);return}const L=window.setTimeout(()=>{E(A=>A===null?null:A-1)},1e3);return()=>window.clearTimeout(L)},[R,_,e,v]),{showCompleteModal:f,queueCountdown:_,pendingQueueTransition:R,handleQueueTransition:b,handleNextEpisode:B,handleNShortcut:X,handlePreviousEpisode:I,handlePlaybackFinished:h,closeCompleteModal:$,cancelQueueTransition:G}}function Kn({videoRef:r,queue:n,showId:a,showMetaId:u,currentEpisode:l,selectedSource:i,hasNextEpisode:s,nextEpisode:d,prefetchEpisodeSources:c,matchesQueueItem:v}){const[g,e]=ie(!1),o=P(c);o.current=c;const N=P("");V(()=>{e(!1)},[l]);const f=Q(()=>{const S=r.current;if(!S||i?.type==="iframe")return;const _=S.duration,E=S.currentTime;if(!_||Number.isNaN(_)){e(!1);return}if(_-E<=60){const R=n.findIndex(x=>v(x,a,u)&&x.episodeNumber===l),w=n.length>0?R>=0?n[R+1]||null:n[0]:null,C=w?`${w.showId}:${w.episodeNumber}`:s?`${a}:${d}`:"";C&&N.current!==C&&(N.current=C,w?o.current(w.episodeNumber,w.showId):o.current(d??""))}e(s&&Fr(E,_))},[r,i,n,a,u,l,s,d,v]);return{showNextEpisodePrompt:g,handleThresholds:f}}const bt="fallbackChoice";function zn(){try{const r=localStorage.getItem(bt);return r==="iframe"||r==="retry"?r:null}catch{return null}}function jn(r){try{r===null?localStorage.removeItem(bt):localStorage.setItem(bt,r)}catch{}}function Hn({showId:r,episodeNumber:n,currentMode:a,selectedProvider:u,selectedSourceType:l,videoSources:i,isAdult:s,providerOrder:d,matureProviders:c,setPreferredSource:v,dispatch:g,showControls:e}){const o=P(!1),N=P([]),f=P(!1),[S,_]=ie(null),[E,R]=ie(!1),[w,C]=ie(!1),[x,h]=ie(()=>zn()??"ask"),b=Q(m=>{h(m),jn(m==="ask"?null:m)},[]),B=P(x);V(()=>{B.current=x},[x]);const X=P(i);X.current=i;const $=Q(()=>{o.current=!1,N.current=[],f.current=!1,_(null),R(!1)},[]);V(()=>{$()},[$,r,n]);const G=Q(m=>{if(o.current)return;o.current=!0;const M=m.links[0];v(m.sourceName),g({type:"SET_STATE",payload:{selectedSource:m,selectedLink:M}}),_(null)},[g,v]),I=Q(()=>{const M=X.current.find(k=>k.type==="iframe");return M?.links?.length?M:null},[]),L=Q(async()=>{const m=d.filter(M=>{if(N.current.includes(M))return!1;const k=c.has(M);return s===void 0?!0:k===s});R(!0);try{for(const M of m){N.current.push(M);let k=null;try{k=await me.data.video.query({showId:r,episodeNumber:n,mode:a,provider:M})}catch{continue}const q=(k??[]).filter(K=>{const ee=K.sourceName.toLowerCase();return a==="dub"?ee.includes("eng")||ee.includes("dub"):ee.includes("jpn")||ee.includes("sub")||!ee.includes("eng")&&!ee.includes("dub")});if((q.length>0?q:k??[]).find(K=>K.type!=="iframe"&&K.links?.length)){N.current=[u],f.current=!1,g({type:"SET_STATE",payload:{selectedProvider:M,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),Bt(M,s===!0),_(null),we.success(`Switched to ${M} (direct stream)`);return}}_({retryFailed:!0}),we.error("No working direct stream found on other providers")}finally{R(!1)}},[r,n,a,s,u,g,d,c]),A=Q(()=>{if(o.current||f.current||l!=="player")return;const m=I();if(!m)return;N.current.includes(u)||N.current.push(u);const M=B.current;if(M==="iframe"){G(m);return}if(M==="retry"){L();return}e(!0),_({retryFailed:!1})},[l,u,I,G,L,e]),F=Q(()=>{f.current=!0,_(null),C(!1)},[]),O=Q(()=>{w&&b("iframe");const m=I();m?G(m):_(null)},[w,b,I,G]),y=Q(()=>{w&&b("retry"),L()},[w,b,L]);return{fallbackPrompt:S,isRetryingProvider:E,rememberFallbackChoice:w,setRememberFallbackChoice:C,fallbackChoice:x,updateFallbackChoice:b,dismissFallbackPrompt:F,chooseIframeFallback:O,chooseProviderRetry:y,handleVideoSourceError:A,resetFallback:$}}function Yn({videoRef:r,selectedSource:n,selectedLink:a,loadingVideo:u,testClipActive:l,resumeTime:i,showResumeModal:s,calibReturnRef:d,setAvailableSubtitles:c,setActiveSubtitleTrack:v,showControls:g,onFatalError:e}){const o=P(null),N=P(0),f=P(i),S=P(s),_=P(e);return _.current=e,V(()=>{f.current=i,S.current=s},[i,s]),V(()=>{const E=r.current;if(!E)return;let R=!1;for(o.current&&(o.current.destroy(),o.current=null),(u||n)&&(E.pause(),E.removeAttribute("src"),E.load());E.firstChild;)E.removeChild(E.firstChild);if(l)return E.src="/av-sync-test.mp4",E.play().catch(()=>{g(!0)}),()=>{R=!0};if(!n||!a)return;if(n.type==="iframe"){N.current=0;return}d.current!=null?(N.current=d.current,d.current=null):f.current>5&&!S.current?N.current=f.current:S.current&&(N.current=0);let w=a.link;if(w.startsWith("/api/proxy")||(w=`/api/proxy?url=${encodeURIComponent(w)}`,a.headers?.Referer&&(w+=`&referer=${encodeURIComponent(a.headers.Referer)}`)),n.subtitles){const $=localStorage.getItem("playerSubtitlesEnabled")!=="false";let G=null;try{G=localStorage.getItem("playerLastSubtitle")}catch{}const I=St(n.subtitles,{lastKey:G,enabled:$}),L=I>=0?n.subtitles[I]:null;n.subtitles.forEach(A=>{const F=document.createElement("track");F.kind="subtitles",F.label=A.label,F.srclang=A.lang;const O=A.src??A.url;if(O){let y=`/api/subtitle-proxy?url=${encodeURIComponent(O)}`;const m=a.headers?.Referer;m&&(y+=`&referer=${encodeURIComponent(m)}`),F.src=y}L&&A.label===L.label&&A.lang===L.lang&&(F.default=!0),E.appendChild(F)}),$||v("off"),c(n.subtitles)}const C=N.current;N.current=0;const x=()=>{C>0&&(E.currentTime=C)};E.addEventListener("loadedmetadata",x,{once:!0});const h=!(S.current&&f.current>5),b=()=>{h&&E.play().catch(()=>{g(!0)})};a.hls?(async()=>{const $=await qr();if(R)return;if(!$||!$.isSupported()){E.src=w,b();return}const G=document.body.classList.contains("low-end"),I=new $({maxBufferLength:G?15:30,maxMaxBufferLength:G?30:60,maxBufferSize:G?25*1e3*1e3:60*1e3*1e3,startLevel:-1,enableWorker:!0});o.current=I,I.on($.Events.ERROR,(F,O)=>{O.fatal&&_.current()});const L=(n.subtitles?.length??0)>0,A=()=>{try{L&&typeof I.subtitleTrack=="number"&&I.subtitleTrack!==-1&&(I.subtitleTrack=-1)}catch{}};I.on($.Events.SUBTITLE_TRACK_SWITCH,(F,O)=>{O?.id!==-1&&A()}),A(),I.loadSource(w),I.attachMedia(E),I.once($.Events.MANIFEST_PARSED,()=>{R||b()})})():(E.src=w,b());const B=localStorage.getItem("playerVolume"),X=localStorage.getItem("playerMuted");return B!==null&&(E.volume=parseFloat(B)),X!==null&&(E.muted=X==="true"),()=>{R=!0,E.removeEventListener("loadedmetadata",x),o.current&&(o.current.destroy(),o.current=null)}},[n,a,r,d,u,l,v,c,g]),{seekToTimeRef:N}}function Xn({videoRef:r,availableSubtitles:n,activeSubtitleTrack:a,setAvailableSubtitles:u,setActiveSubtitleTrack:l}){V(()=>{const i=r.current;if(!i)return;const s=()=>{const d=Array.from(i.textTracks).map(c=>({label:c.label,lang:c.language,src:void 0,mode:c.mode}));u(d)};return i.textTracks.addEventListener("addtrack",s),i.textTracks.addEventListener("removetrack",s),s(),()=>{i.textTracks.removeEventListener("addtrack",s),i.textTracks.removeEventListener("removetrack",s)}},[r,u]),V(()=>{if(a===null&&n.length>0&&localStorage.getItem("playerSubtitlesEnabled")!=="false"){let i=null;try{i=localStorage.getItem("playerLastSubtitle")}catch{}const s=St(n,{lastKey:i,enabled:!0});if(s<0){l("off");return}const d=n[s];l(d.lang||d.label)}},[a,n,l]),V(()=>{const i=r.current;if(!i||n.length===0)return;const s=a;if(!(localStorage.getItem("playerSubtitlesEnabled")!=="false")||s==="off"||s===null){Array.from(i.textTracks).forEach(v=>{v.mode="hidden"});return}let c=!1;if(Array.from(i.textTracks).forEach(v=>{const e=(v.language===s||v.label===s)&&!c;v.mode=e?"showing":"hidden",e&&(c=!0)}),!c&&i.textTracks.length>0){const v=Array.from(i.textTracks).find(g=>g.language==="en"||g.label==="English")||i.textTracks[0];v&&(v.mode="showing")}},[a,n,r])}function Jn({videoRef:r,videoBoxH:n,style:a,sourceKey:u,activeSubtitleTrack:l,availableSubtitles:i}){V(()=>{const s="dynamic-subtitle-styles";let d=document.getElementById(s);d||(d=document.createElement("style"),d.id=s,document.head.appendChild(d)),d.textContent=Ct(a);const c=r.current;if(!c)return;const v=Nt(a.fontSize,n||c.clientHeight||720);d.textContent=Ct({...a,fontSize:v});const g=()=>{const C=Number(a.position),x=isNaN(C)?0:Math.max(0,Math.min(100,C));return Math.max(0,Math.min(100,100-x))},e=(C,x)=>{try{const h=C;h.snapToLines=!1,h.line=x}catch{}},o=()=>{const C=v*16,x=c.videoHeight||c.clientHeight||720,h=c.videoWidth||c.clientWidth||1280;return{step:C*1.3/x*100,chars:Math.max(20,Math.floor(h/(C*.55)))}},N=C=>{const x=g(),h=Array.from(C.activeCues??[]);if(h.length<=1){h.forEach($=>e($,x));return}const{step:b,chars:B}=o();let X=x;for(let $=h.length-1;$>=0;$--){const I=String(h[$].text??"").replace(/<[^>]*>/g,"").split(`
55
- `).reduce((A,F)=>A+Math.max(1,Math.ceil(F.length/B)),0),L=X-I*b;e(h[$],Math.max(0,L)),X=L-b*.4}},f=C=>{if(!C.cues)return;const x=g();Array.from(C.cues).forEach(h=>e(h,x)),C.mode==="showing"&&N(C)},S=()=>{Array.from(c.textTracks).forEach(f)};S();const _=C=>{const x=C.target;x.mode==="showing"&&N(x)};Array.from(c.textTracks).forEach(C=>{C.addEventListener("cuechange",_)});const E=()=>{Array.from(c.textTracks).forEach(C=>{C.removeEventListener("cuechange",_),C.addEventListener("cuechange",_)}),S()};c.textTracks.addEventListener("addtrack",E),c.textTracks.addEventListener("removetrack",E);const R=Array.from(c.querySelectorAll("track")),w=()=>{S()};return R.forEach(C=>{C.addEventListener("load",w)}),()=>{Array.from(c.textTracks).forEach(C=>{C.removeEventListener("cuechange",_)}),c.textTracks.removeEventListener("addtrack",E),c.textTracks.removeEventListener("removetrack",E),R.forEach(C=>{C.removeEventListener("load",w)})}},[a,n,r,u,l,i])}function Zn({videoRef:r,overlayRef:n,style:a,activeSubtitleTrack:u,delayMs:l,enabled:i}){V(()=>{if(!i)return;const s=r.current,d=n.current;if(!s||!d)return;const c=localStorage.getItem("playerSubtitlesEnabled")!=="false",v=()=>{if(d.innerHTML="",!c||u==="off"||u===null)return;const o=Array.from(s.textTracks).find(w=>w.language===u||w.label===u);if(!o||o.mode!=="showing")return;const N=l/1e3;let f;if(N>0&&o.cues){const w=s.currentTime-N;f=Array.from(o.cues).filter(C=>C.startTime<=w&&w<=C.endTime)}else f=Array.from(o.activeCues??[]);if(f.length===0)return;const S={...a,fontSize:Nt(a.fontSize,s.clientHeight||0)},_=ar(S),E=ir(s,S.position),R=Array.from(f);R.forEach((w,C)=>{const x=String(w.text??"");if(!lr(x).trim())return;const h=document.createElement("div"),b=(R.length-1-C)*1.7;h.style.cssText=`${_}
56
- bottom: calc(${E}px + ${b}em);`,h.innerHTML=cr(x),d.appendChild(h)})},g=()=>v(),e=()=>v();return Array.from(s.textTracks).forEach(o=>{o.addEventListener("cuechange",g)}),s.addEventListener("timeupdate",e),v(),()=>{Array.from(s.textTracks).forEach(o=>{o.removeEventListener("cuechange",g)}),s.removeEventListener("timeupdate",e),d.innerHTML=""}},[u,l,i,n,a,r])}const eo=({isOpen:r,onClose:n,onSuccess:a})=>{const u=()=>{a?.(),n()};return t(mt,{isOpen:r,onClose:n,title:"MKissa Browser Verification",children:t("div",{className:Ve.container,children:[t("p",{children:"Open MKissa in this browser, play an anime episode, and complete any Cloudflare verification it shows. Once playback works there, return to Dango and click Refresh."}),t("div",{className:Ve.actions,children:t("a",{className:Ve.link,href:"https://mkissa.to/anime",target:"_blank",rel:"noreferrer",children:"Open MKissa anime"})}),t("div",{className:Ve.actions,children:[t("button",{className:Ve.secondaryButton,onClick:n,children:"Cancel"}),t("button",{className:Ve.button,onClick:u,children:"Refresh Dango"})]})]})})},yo=()=>{const{id:r,episodeNumber:n}=Yt(),a=Xt(),u=Rt(),l=Jt(),{hasConsent:i,grant:s}=Nr(),{options:d}=At(),c=Me(()=>d.filter(p=>(p.kind??"anime")==="anime"),[d]),v=Me(()=>c.map(p=>p.id),[c]),g=Me(()=>new Set(c.filter(p=>p.mature).map(p=>p.id)),[c]),{state:e,dispatch:o,toggleWatchlist:N,moveToCompleted:f,setPreferredSource:S,handleToggleDetails:_,markEpisodeWatched:E,prefetchEpisodeSources:R,isMarkingWatched:w,isUpdatingWatchlistStatus:C}=Qn(r,n,l.state||null,{hasMatureConsent:i});V(()=>{if(r&&e.showMeta?.id&&e.showMeta.id!==r){const p=n?`/watch/${e.showMeta.id}/${n}${window.location.search}`:`/watch/${e.showMeta.id}${window.location.search}`;a(p,{replace:!0})}},[r,e.showMeta?.id,n,a]);const x=Me(()=>{if(e.showMeta.name)return{name:e.showMeta.name,thumbnail:e.showMeta.thumbnail,names:e.showMeta.names,genres:e.showMeta.genres,score:e.showMeta.score,isAdult:e.showMeta.isAdult}},[e.showMeta.name,e.showMeta.thumbnail,e.showMeta.names,e.showMeta.genres,e.showMeta.score,e.showMeta.isAdult]),h=ur({skipIntervals:e.skipIntervals,showId:r,episodeNumber:e.currentEpisode?.toString(),episodeCount:e.episodes.length||void 0,sourceType:e.selectedSource?.type,showMeta:x}),{refs:b,actions:B}=h,X=Ur(),$=P(null),G=P(null),I=P(null),[L,A]=ie(()=>{try{const p=localStorage.getItem("anime4kProfile");return["low","balanced","high","denoise"].includes(p)?p:"balanced"}catch{return"balanced"}}),{videoDelayMs:F,videoDelayEnabled:O,setDelayEnabled:y,handleVideoDelayChange:m,isCalibrating:M,testClipActive:k,stopCalibration:q,openAvSyncCalibrator:J,cancelAvSyncCalibrator:H,applyAvSyncCalibrator:K,toggleTestClip:ee,calibReturnRef:Se,effectiveVideoDelayMs:Ae}=dr(b.videoRef,()=>B.setShowSettings(!1)),Re=P(null),te=$n({videoRef:b.videoRef,canvasRef:G,profile:L,delayMs:Ae}),z=te.isEnabled&&te.isWebGPUSupported;In({videoRef:b.videoRef,episodeKey:`${r??""}:${e.currentEpisode??""}`,isEnabled:te.isEnabled,isSupported:te.isWebGPUSupported,mediaReady:!e.loadingVideo&&!!e.selectedLink,isIframeSource:e.selectedSource?.type==="iframe",setEnabled:te.setEnabled}),mr({videoRef:b.videoRef,canvasRef:Re,delayMs:Ae,enabled:O&&!z});const ke=O&&!z,_e=z||ke,[re,j]=ie(!1),ve=P(n);V(()=>{ve.current!==n&&(ve.current=n,q())},[n,q]);const ft=Q(()=>{u.invalidateQueries({queryKey:[ae.continueWatching]})},[u]),{data:xe=[],isLoading:Je}=Pr(),Ze=Ar(),Qe=_r(),ht=xr(),{isTheaterMode:le,toggleTheaterMode:ce,handleLayoutClick:pt}=fr();Zt(()=>{if(h.state.isFullscreen||le)return;const p=b.playerContainerRef.current,Z=$.current;if(!p||!Z)return;const $e=()=>{const gt=p.getBoundingClientRect().height;Z.style.height=`${gt}px`};$e();const lt=new ResizeObserver($e);return lt.observe(p),()=>lt.disconnect()},[h.state.isFullscreen,le,b.playerContainerRef]);const Te=Me(()=>e.episodes.findIndex(p=>p===e.currentEpisode),[e.episodes,e.currentEpisode]),et=Te>0?e.episodes[Te-1]:null,Ge=Te>=0&&Te<e.episodes.length-1?e.episodes[Te+1]:null,tt=Te>-1&&Te<e.episodes.length-1,{showCompleteModal:W,queueCountdown:Ne,pendingQueueTransition:qe,handleQueueTransition:fe,handleNextEpisode:rt,handleNShortcut:Fe,handlePreviousEpisode:Oe,handlePlaybackFinished:Ke,closeCompleteModal:Be,cancelQueueTransition:ze}=qn({testClipActive:k,selectedSourceType:e.selectedSource?.type,onEnded:B.onEnded,queue:xe,removeFromQueue:Ze.mutate,showId:r,showMetaId:e.showMeta?.id,currentEpisode:e.currentEpisode,isAutoplayEnabled:e.isAutoplayEnabled,nextEpisode:Ge,previousEpisode:et,navigate:a,invalidateContinueWatching:ft,dispatch:o}),{showNextEpisodePrompt:nt,handleThresholds:Le}=Kn({videoRef:b.videoRef,queue:xe,showId:r,showMetaId:e.showMeta?.id,currentEpisode:e.currentEpisode,selectedSource:e.selectedSource,hasNextEpisode:tt,nextEpisode:Ge,prefetchEpisodeSources:R,matchesQueueItem:Xe}),{checkEnd:De,logDuration:ot}=hr({videoRef:b.videoRef,sourceType:e.selectedSource?.type,resetKey:`${r}:${e.currentEpisode}`,onEnd:Ke}),st=e.showResumeModal,at=W,U=st||at;pr(h,!!e.selectedLink&&!le&&!U);const{fallbackPrompt:ne,isRetryingProvider:he,rememberFallbackChoice:ue,setRememberFallbackChoice:de,fallbackChoice:pe,updateFallbackChoice:ge,dismissFallbackPrompt:je,chooseIframeFallback:We,chooseProviderRetry:ye,handleVideoSourceError:oe,resetFallback:it}=Hn({showId:r,episodeNumber:e.currentEpisode??void 0,currentMode:e.currentMode,selectedProvider:e.selectedProvider,selectedSourceType:e.selectedSource?.type,videoSources:e.videoSources,isAdult:e.showMeta?.isAdult,providerOrder:v,matureProviders:g,setPreferredSource:S,dispatch:o,showControls:B.setShowControls}),{seekToTimeRef:Ue}=Yn({videoRef:b.videoRef,selectedSource:e.selectedSource,selectedLink:e.selectedLink,loadingVideo:e.loadingVideo,testClipActive:k,resumeTime:e.resumeTime,showResumeModal:e.showResumeModal,calibReturnRef:Se,setAvailableSubtitles:B.setAvailableSubtitles,setActiveSubtitleTrack:B.setActiveSubtitleTrack,showControls:B.setShowControls,onFatalError:oe});V(()=>{U&&h.state.isFullscreen&&h.actions.toggleFullscreen()},[U,h.state.isFullscreen,h.actions]),V(()=>{U&&b.videoRef.current&&b.videoRef.current.pause()},[U,b.videoRef]);const{titlePreference:se}=Br(),{lowEndMode:He}=Lr(),{settings:vt,update:Lt}=vr(),Dt=le&&vt.enabled&&!He&&e.selectedSource?.type!=="iframe"&&!!e.selectedLink,Pe=Me(()=>{if(!e.showMeta||e.loadingShowData)return"Loading...";const{name:p,names:Z}=e.showMeta;return se==="name"?p||"Loading...":se==="nativeName"?Z?.native||p||"Loading...":se==="englishName"?Z?.english||p||"Loading...":p||"Loading..."},[e.showMeta,se,e.loadingShowData]);V(()=>{Pe&&Pe!=="Loading..."&&e.currentEpisode&&(document.title=`► ${Pe} Episode ${e.currentEpisode} - dango`)},[Pe,e.currentEpisode]),Gn({onNext:Fe,onToggleTheater:ce,flashControls:h.actions.flashControls});const{setAvailableSubtitles:$t,setActiveSubtitleTrack:It}=B,Et=Me(()=>({fontSize:h.state.subtitleFontSize,position:h.state.subtitlePosition,bgOpacity:h.state.subtitleBgOpacity,bgColor:h.state.subtitleBgColor,textColor:h.state.subtitleTextColor,edge:h.state.subtitleEdge,bold:h.state.subtitleBold}),[h.state.subtitleFontSize,h.state.subtitlePosition,h.state.subtitleBgOpacity,h.state.subtitleBgColor,h.state.subtitleTextColor,h.state.subtitleEdge,h.state.subtitleBold]);Xn({videoRef:b.videoRef,availableSubtitles:h.state.availableSubtitles,activeSubtitleTrack:h.state.activeSubtitleTrack,setAvailableSubtitles:$t,setActiveSubtitleTrack:It});const[Ft,Ot]=ie(0);V(()=>{const p=b.videoRef.current;if(!p)return;const Z=()=>Ot(p.clientHeight||0);Z();const $e=new ResizeObserver(Z);return $e.observe(p),()=>$e.disconnect()},[b.videoRef,e.selectedSource,e.selectedLink]),Jn({videoRef:b.videoRef,videoBoxH:Ft,style:Et,sourceKey:`${e.selectedSource?.sourceName??""}:${e.selectedLink?.link??""}`,activeSubtitleTrack:h.state.activeSubtitleTrack,availableSubtitles:h.state.availableSubtitles}),Zn({videoRef:b.videoRef,overlayRef:I,style:Et,activeSubtitleTrack:h.state.activeSubtitleTrack,delayMs:Ae,enabled:_e}),V(()=>{try{localStorage.setItem("anime4kProfile",L)}catch{}},[L]);const Wt=()=>{b.videoRef.current&&(b.videoRef.current.currentTime=e.resumeTime,b.videoRef.current.play()),o({type:"SET_STATE",payload:{showResumeModal:!1}})},Ut=()=>{b.videoRef.current&&(b.videoRef.current.currentTime=0,b.videoRef.current.play()),o({type:"SET_STATE",payload:{showResumeModal:!1}})},Vt=Q(()=>{o({type:"SET_STATE",payload:{showResumeModal:!1}})},[o]),Qt=Q(async()=>{try{await f(),Be(),o({type:"SET_STATE",payload:{showResumeModal:!1}}),a("/")}catch{}},[f,Be,o,a]),wt=(p,Z)=>t("div",{className:p,children:[t("button",{className:`${T.episodeNavBtn} ${T.secondary}`,onClick:Oe,disabled:!et,type:"button",children:[t(Y,{name:"chevron-left",size:12}),"Prev EP"]}),t("button",{className:`${T.episodeNavBtn} ${T.primary}`,onClick:rt,disabled:!Ge,type:"button",children:["Next EP",t(Y,{name:"chevron-right",size:12})]}),Z==="mobile"&&X&&t("button",{className:`${T.episodeNavBtn} ${T.episodePickerBtn}`,onClick:()=>j(!0),type:"button",children:[t(Y,{name:"list-ul",size:12}),"Episodes"]})]}),Gt=p=>{o({type:"SET_STATE",payload:{isAutoplayEnabled:p}}),Or(p)},kt=!!(e.currentEpisode&&e.watchedEpisodes.includes(e.currentEpisode)),qt=e.selectedProvider!=="megaplay"||e.selectedSource?.type==="iframe",Kt=Q(async()=>{if(!r||!e.currentEpisode||!e.showMeta.name||w)return;const p=b.videoRef.current?.duration,Z=Math.max(p||0,e.resumeDuration||0,Number(e.showMeta.episodeDuration||0)*60,1);await E(e.currentEpisode,Z)},[r,e.currentEpisode,e.showMeta,e.resumeDuration,E,w,b.videoRef]);if(e.error&&!e.showMeta.name&&e.videoSources.length===0&&e.episodes.length===0)return t("p",{className:"error-message",children:["Error: ",e.error]});const Ce=e.loadingShowData||e.loadingVideo;return e.showMeta?.isAdult===!0&&!i?t("div",{className:be.playerPageLayout,children:t(Wr,{isOpen:!0,onClose:()=>a("/home"),onGrant:s})}):t("div",{className:`${be.playerPageLayout} ${le?be.theaterMode:""}`,onClick:pt,children:[le&&t(gr,{videoRef:b.videoRef,active:Dt,settings:vt}),t(yr,{isOpen:at,onClose:Be,title:"Show Completed!",heading:Pe,message:"Congratulations! You finished all available episodes.",children:[t(ut,{variant:"secondary",onClick:Be,children:"Close"}),t(ut,{onClick:Qt,disabled:C,children:C?"Saving...":"Move to Completed"})]}),t(br,{isOpen:st,onClose:Vt,title:"Resume Playback?",message:t(ct,{children:["You were watching at ",t("strong",{children:h.actions.formatTime(e.resumeTime)}),". Would you like to continue?"]}),onResume:Wt,onRestart:Ut}),t(mt,{isOpen:!!ne,onClose:je,title:"Direct stream failed",width:"sm",children:[t(mt.Body,{children:[t("p",{children:[t("strong",{children:e.selectedProvider}),"'s direct stream failed for this episode."]}),ne?.retryFailed&&t("p",{children:"No working direct stream was found on the other providers either."}),t("p",{children:["You can continue with the embedded (iframe) player, but embedded players may show"," ",t("strong",{children:"ads and pop-ups"}),"."]}),t("label",{style:{display:"flex",alignItems:"center",gap:"8px",marginTop:"0.75rem",cursor:"pointer"},children:[t("input",{type:"checkbox",checked:ue,onChange:p=>de(p.currentTarget.checked)}),"Remember my choice"]})]}),t(mt.Actions,{children:[t(ut,{variant:"secondary",onClick:We,children:"Continue with iframe"}),t(ut,{onClick:ye,disabled:he,children:he?"Searching…":"Try another provider"})]})]}),t(Dr,{isOpen:!!e.showCookieModal&&e.cookieProvider!=="mkissa",onClose:()=>o({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{u.invalidateQueries({queryKey:[ae.videoSources,r,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),t(eo,{isOpen:!!e.showCookieModal&&e.cookieProvider==="mkissa",onClose:()=>o({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{u.invalidateQueries({queryKey:[ae.videoSources,r,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),!le&&t("aside",{ref:$,className:be.episodeSidebar,children:e.loadingShowData?t(Sr,{variant:"sidebar"}):t(Er,{episodes:e.episodes,currentEpisode:e.currentEpisode??void 0,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:p=>a(`/watch/${r}/${p}`)})}),t("div",{className:be.playerMain,children:[t("div",{className:`${T.videoContainer} ${h.state.isFullscreen?"":be.videoPlayerWrapper} ${h.state.isFullscreen?T.fullscreenActive:""}`,style:{...U?{visibility:"hidden"}:{}},onContextMenu:p=>p.preventDefault(),children:t(kn,{player:h,isAutoplayEnabled:e.isAutoplayEnabled,onAutoplayChange:Gt,fallbackChoice:pe,onFallbackChoiceChange:ge,ambientSettings:vt,onAmbientChange:Lt,showNextEpisodeButton:!U&&nt&&xe.length===0,onNextEpisode:rt,videoSources:e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:(p,Z)=>{b.videoRef.current&&!isNaN(b.videoRef.current.currentTime)&&(Ue.current=b.videoRef.current.currentTime),S(p.sourceName),o({type:"SET_STATE",payload:{selectedSource:p,selectedLink:Z,showResumeModal:e.showResumeModal&&p.type!=="iframe"}})},loadingVideo:Ce,skipIntervals:e.skipIntervals,animeTitle:Pe,episodeNumber:e.currentEpisode??void 0,isTheaterMode:le,onTheaterModeToggle:ce,anime4kEnabled:te.isEnabled,onAnime4kToggle:te.toggle,anime4kSupported:te.isWebGPUSupported,anime4kProfile:L,onAnime4kProfileChange:A,anime4kInitializing:te.isInitializing,anime4kError:te.error,videoDelayEnabled:O,onVideoDelayToggle:y,videoDelayMs:F,onVideoDelayChange:m,onCalibrateAvSync:J,isInteractingExtra:re||M,className:wr.shellFill,hideChrome:e.selectedSource?.type==="iframe",overlays:t(ct,{children:[h.state.isSpeedBoostActive&&t("div",{className:T.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(Y,{name:"forward",size:12})]}),Ne!==null&&qe?.nextItem&&t("div",{className:T.queueCountdown,children:["Queue next in ",Ne,"s"]})]}),children:[Ce&&t("div",{className:T.loadingOverlay,children:t("div",{className:T.loadingDots,children:[t("div",{className:T.dot}),t("div",{className:T.dot}),t("div",{className:T.dot})]})}),h.state.isBuffering&&!Ce&&e.selectedSource?.type!=="iframe"&&t("div",{className:T.bufferingOverlay,children:t("div",{className:T.bufferingSpinner})}),e.selectedSource?.type==="iframe"?!Ce&&t("iframe",{src:e.selectedLink?.link,className:T.videoIframe,allow:"autoplay; fullscreen; picture-in-picture",allowFullScreen:!0,sandbox:e.selectedSource.sandbox?`${e.selectedSource.sandbox} allow-fullscreen allow-popups allow-popups-to-escape-sandbox`:void 0}):t(ct,{children:[!Ce&&e.videoSources.length===0&&t("div",{className:T.errorOverlay,children:[t("p",{children:["No sources found for this episode with ",e.selectedProvider,"."]}),t("p",{className:T.errorSubtext,children:"Please try selecting a different provider below."}),t("button",{className:T.retryButton,onClick:()=>window.location.reload(),"data-speed-boost-ignore":"true",style:{marginTop:8},children:"Retry"})]}),!Ce&&e.videoSources.length>0&&t("video",{ref:b.videoRef,controls:h.state.useNativeControls,playsInline:!0,"webkit-playsinline":"true",disablePictureInPicture:!0,disableRemotePlayback:!0,onPlay:B.onPlay,onPause:B.onPause,onEnded:()=>{k||De(!0)},onDurationChange:()=>{B.onDurationChange(),ot()},onSeeked:()=>{k||(Le(),De())},onLoadedMetadata:()=>{B.onLoadedMetadata(),Le(),ot(),k||De()},onTimeUpdate:()=>{k||(B.onTimeUpdate(),Le(),De(),qe&&b.videoRef.current&&b.videoRef.current.currentTime<b.videoRef.current.duration-1&&ze())},onVolumeChange:B.onVolumeChange,onWaiting:B.onWaiting,onPlaying:B.onPlaying,onCanPlay:B.onCanPlay,onError:oe,onContextMenu:p=>p.preventDefault(),className:_e?T.videoElementHidden:""}),te.isWebGPUSupported&&!Ce&&e.videoSources.length>0&&t("canvas",{ref:G,className:`${T.upscalerCanvas} ${z?T.upscalerActive:""}`}),!z&&!Ce&&e.videoSources.length>0&&t("canvas",{ref:Re,className:`${T.upscalerCanvas} ${ke?T.upscalerActive:""}`}),te.isEnabled&&te.isWebGPUSupported&&te.isInitializing&&t("div",{className:T.upscalerStatusBadge,children:"Preparing upscaler…"}),_e&&t("div",{ref:I,className:T.subtitleOverlay}),t(kr,{isOpen:M,ms:F,onChange:m,onApply:K,onClose:H,testClipActive:k,onTestClip:ee})]})]})}),!le&&t(Tr,{}),!le&&t(ct,{children:[Je&&xe.length===0?t(Tn,{count:3}):t(Vr,{title:"Queue",items:xe,currentShowId:r,currentEpisode:e.currentEpisode??void 0,onNextQueue:fe,onRemove:p=>Ze.mutate({showId:p.showId,episodeNumber:p.episodeNumber}),onClear:()=>Qe.mutate(),showClearAll:!0,onReorder:p=>ht.mutate(p.map(Z=>({id:Z.id,showId:Z.showId,episodeNumber:Z.episodeNumber})))}),t("div",{className:T.streamPanel,children:[t(Nn,{selectedProvider:e.selectedProvider,isAdult:e.showMeta?.isAdult,options:c,onProviderChange:p=>{it(),o({type:"SET_STATE",payload:{selectedProvider:p,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),Bt(p,e.showMeta?.isAdult===!0)}}),wt(`${T.episodeActions} ${T.desktopEpisodeActions}`,"desktop"),Ce?t("div",{className:T.sourceLoader,children:t("div",{className:T.spinner})}):t(An,{videoSources:e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:p=>{b.videoRef.current&&!isNaN(b.videoRef.current.currentTime)&&(Ue.current=b.videoRef.current.currentTime);const $e=(p.links||[]).sort((lt,gt)=>(parseInt(gt.resolutionStr)||0)-(parseInt(lt.resolutionStr)||0))[0]||null;S(p.sourceName),o({type:"SET_STATE",payload:{selectedSource:p,selectedLink:$e,showResumeModal:e.showResumeModal&&p.type!=="iframe"}})},onLinkChange:p=>{e.selectedSource&&(S(e.selectedSource.sourceName),o({type:"SET_STATE",payload:{selectedLink:p}}))}})]}),t("div",{className:be.playerInfoContainer,children:[t("div",{className:be.playerInfoHeader,children:[t("div",{className:be.playerAnimeCard,children:t("img",{src:$r(e.showMeta.thumbnail||""),alt:Pe,loading:"lazy",decoding:"async",onError:p=>{p.target.src="/placeholder.svg"}})}),t("div",{className:be.videoTitleSection,children:[t("div",{className:T.titleContainer,children:[t("h1",{children:Pe}),t("div",{className:T.scheduleInfo,children:[e.showMeta.status&&t("span",{className:T.status,children:e.showMeta.status}),e.showMeta.nextEpisodeAirDate&&t("span",{className:T.nextEpisode,children:["Next episode: ",e.showMeta.nextEpisodeAirDate]})]})]}),t("div",{className:T.controls,children:[t("button",{className:`${T.watchlistBtn} ${e.inWatchlist?T.inList:""}`,onClick:N,children:[e.inWatchlist?t(Y,{name:"check",size:14}):t(Y,{name:"plus",size:14}),e.inWatchlist?"In Watchlist":"Add to Watchlist"]}),t(Gr,{showId:r,showName:e.showMeta.name||e.showMeta.names?.romaji,showThumbnail:e.showMeta.thumbnail,nativeName:e.showMeta.names?.native,englishName:e.showMeta.names?.english,showType:e.showMeta.type,className:`${T.watchlistBtn} ${T.queueBtn}`,activeClassName:T.queueActive}),qt&&t("button",{className:`${T.watchlistBtn} ${T.markWatchedBtn} ${kt?T.markWatchedDone:""}`,onClick:Kt,disabled:w||!e.currentEpisode,children:[t(Y,{name:"check",size:14}),w?"Saving...":kt?"Watched":"Mark Watched"]}),t("button",{className:`${T.watchlistBtn} ${T.modeToggleBtn} ${e.currentMode==="dub"?T.modeToggleActive:""}`,onClick:()=>{const p=e.currentMode==="dub"?"sub":"dub";it(),o({type:"SET_MODE",payload:p}),localStorage.setItem("preferredMode",p)},type:"button","aria-pressed":e.currentMode==="dub",children:e.currentMode==="dub"?"DUB":"SUB"}),He&&t("button",{className:`${T.watchlistBtn} ${T.modeToggleBtn} ${h.state.useNativeControls?T.modeToggleActive:""}`,onClick:()=>{const p=!h.state.useNativeControls;h.actions.setUseNativeControls(p),localStorage.setItem("playerUseNativeControls",p.toString())},type:"button",children:h.state.useNativeControls?"NATIVE: ON":"NATIVE: OFF"})]})]})]}),wt(`${T.episodeActions} ${T.mobileEpisodeActions}`,"mobile"),t("div",{className:be.infoColumns,children:[t("div",{className:`${T.descriptionSection} ${T.synopsisFlat}`,children:[t("h3",{children:"Synopsis"}),t(zr,{text:e.showMeta.description?e.showMeta.description.replace(/<[^>]*>?/gm,""):"",emptyText:"No description available."}),t("button",{className:T.detailsToggleBtn,onClick:_,children:[e.showCombinedDetails?t(Y,{name:"chevron-up"}):t(Y,{name:"chevron-down"}),e.showCombinedDetails?"Hide Details":"Show Details"]})]}),e.showCombinedDetails&&t(Kr,{showMeta:e.showMeta,styles:T})]})]})]})]}),t(Cr,{isOpen:re,onClose:()=>j(!1),episodes:e.episodes,currentEpisode:e.currentEpisode??void 0,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:p=>{j(!1),a(`/watch/${r}/${p}`)}})]})};export{yo as default};
@@ -1 +0,0 @@
1
- ._header_j1lbh_1{margin-bottom:var(--space-8);animation:_fadeIn_j1lbh_1 .8s var(--ease-smooth)}._pageTitle_j1lbh_6{font-size:var(--font-size-xl);font-weight:800;color:var(--text-primary);margin:0 0 var(--space-2);letter-spacing:-.02em}._pageSubtitle_j1lbh_14{color:var(--text-tertiary);font-size:var(--font-size-sm);margin:0}._importCard_j1lbh_20{background:var(--glass-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);padding:var(--space-8);border-radius:var(--radius-xl);box-shadow:var(--glass-shadow);max-width:600px;margin:0 auto;animation:_slideUpIn_j1lbh_1 .8s var(--ease-smooth)}._importCard_j1lbh_20+._importCard_j1lbh_20{margin-top:var(--space-6)}._cardHeader_j1lbh_37{margin-bottom:var(--space-6)}._cardHeader_j1lbh_37 h3{margin:0 0 var(--space-2);font-size:var(--font-size-lg);font-weight:700;color:var(--text-primary)}._cardHeader_j1lbh_37 p{color:var(--text-secondary);font-size:var(--font-size-sm);margin:0;line-height:1.6}._uploadArea_j1lbh_55{margin-bottom:var(--space-6)}._fileInputWrapper_j1lbh_59{position:relative;display:flex;align-items:center;gap:var(--space-4);background:var(--bg-tertiary);border:1px dashed var(--border-secondary);border-radius:var(--radius-lg);padding:var(--space-4);transition:all var(--transition-fast)}._fileInputWrapper_j1lbh_59:hover{border-color:var(--accent);background:var(--bg-elevated)}._fileInput_j1lbh_59{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;z-index:2}._fileDisplay_j1lbh_87{flex:1;display:flex;align-items:center;gap:var(--space-3);overflow:hidden}._fileIcon_j1lbh_95{color:var(--text-tertiary);font-size:1.5rem}._fileName_j1lbh_100{color:var(--text-primary);font-size:var(--font-size-sm);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._browseButton_j1lbh_109{background:#ffffff0d;border:1px solid var(--border-primary);color:var(--text-secondary);padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-weight:600;pointer-events:none}._optionsArea_j1lbh_120{margin-bottom:var(--space-6);padding:var(--space-4);background:color-mix(in srgb,var(--color-warning) 5%,transparent);border:1px solid color-mix(in srgb,var(--color-warning) 10%,transparent);border-radius:var(--radius-lg)}._checkboxLabel_j1lbh_128{display:flex;align-items:flex-start;gap:var(--space-3);cursor:pointer;position:relative}._checkbox_j1lbh_128{opacity:0;position:absolute}._checkboxCustom_j1lbh_141{width:20px;height:20px;border:2px solid var(--border-secondary);border-radius:4px;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:2px;transition:all var(--transition-fast)}._checkbox_j1lbh_128:checked+._checkboxCustom_j1lbh_141{background:var(--color-warning);border-color:var(--color-warning)}._checkbox_j1lbh_128:checked+._checkboxCustom_j1lbh_141:after{content:"";width:5px;height:10px;border:solid var(--color-warning-text);border-width:0 2px 2px 0;transform:rotate(45deg);margin-bottom:2px}._optionText_j1lbh_169{display:flex;flex-direction:column;gap:4px}._optionTitle_j1lbh_175{color:var(--color-warning);font-weight:600;font-size:var(--font-size-sm)}._optionDesc_j1lbh_181{color:var(--text-tertiary);font-size:.8rem;line-height:1.4}._actions_j1lbh_187{display:flex;justify-content:flex-end;gap:var(--space-3);border-top:1px solid var(--border-primary);padding-top:var(--space-6)}._importBtn_j1lbh_195{display:flex;align-items:center;gap:var(--space-2)}._cancelBtn_j1lbh_201{display:flex;align-items:center;gap:var(--space-2);background:color-mix(in srgb,var(--color-danger) 15%,transparent);border-color:color-mix(in srgb,var(--color-danger) 30%,transparent);color:var(--color-danger)}._cancelBtn_j1lbh_201:hover{background:color-mix(in srgb,var(--color-danger) 25%,transparent);border-color:color-mix(in srgb,var(--color-danger) 50%,transparent)}._statusMessage_j1lbh_215{margin-top:var(--space-6);padding:var(--space-4);border-radius:var(--radius-md);font-size:var(--font-size-sm);font-weight:500;text-align:center;animation:_fadeIn_j1lbh_1 .3s ease}._statusMessage_j1lbh_215._success_j1lbh_225{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success);border:1px solid color-mix(in srgb,var(--color-success) 20%,transparent)}._statusMessage_j1lbh_215._error_j1lbh_231{background:color-mix(in srgb,var(--color-danger) 10%,transparent);color:var(--color-danger);border:1px solid color-mix(in srgb,var(--color-danger) 20%,transparent)}._progressSection_j1lbh_237{margin-top:var(--space-6);animation:_fadeIn_j1lbh_1 .3s ease}._progressBar_j1lbh_242{height:6px;background:var(--bg-tertiary);border-radius:3px;overflow:hidden;margin-bottom:var(--space-3)}._progressFill_j1lbh_250{height:100%;background:linear-gradient(90deg,#6366f1,#8b5cf6);border-radius:3px;transition:width .3s ease}._progressInfo_j1lbh_257{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}._progressCount_j1lbh_264{font-size:var(--font-size-sm);color:var(--text-tertiary);font-weight:500;white-space:nowrap}._progressTitle_j1lbh_271{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--text-primary);font-weight:500;text-align:right;overflow:hidden}._progressTitle_j1lbh_271>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:300px}._sourceBadge_j1lbh_289{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;flex-shrink:0}._sourceBadge_j1lbh_289._anilist_j1lbh_301{background:#6366f126;color:#818cf8;border:1px solid rgba(99,102,241,.3)}._sourceBadge_j1lbh_289._kitsu_j1lbh_307{background:#ec489926;color:#f472b6;border:1px solid rgba(236,72,153,.3)}._sourceBadge_j1lbh_289._offline_j1lbh_313{background:#22c55e26;color:#4ade80;border:1px solid rgba(34,197,94,.3)}._skipped_j1lbh_319{color:var(--text-tertiary);font-style:italic}._cardTitleRow_j1lbh_324{display:flex;align-items:center;gap:var(--space-3)}._cardTitleRow_j1lbh_324 h3{margin:0}._anilistIcon_j1lbh_334{font-size:1.5rem;color:#818cf8;flex-shrink:0}._malIcon_j1lbh_340{font-size:1.5rem;color:#2e51a2;flex-shrink:0}._badgeOnline_j1lbh_346{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:3px 10px;border-radius:var(--radius-full);background:color-mix(in srgb,var(--color-success) 12%,transparent);color:var(--color-success);border:1px solid color-mix(in srgb,var(--color-success) 25%,transparent)}._badgeOffline_j1lbh_358{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:3px 10px;border-radius:var(--radius-full);background:var(--bg-tertiary);color:var(--text-tertiary);border:1px solid var(--border-primary)}._connectedProfile_j1lbh_370{display:flex;align-items:center;gap:var(--space-4);padding:var(--space-4);background:var(--bg-tertiary);border-radius:var(--radius-lg)}._avatar_j1lbh_379{width:48px;height:48px;border-radius:50%;flex-shrink:0}._connectedInfo_j1lbh_386{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}._connectedName_j1lbh_394{color:var(--text-primary);font-weight:700;font-size:var(--font-size-sm)}._connectedHint_j1lbh_400{color:var(--color-success);font-size:.8rem}._loginPrompt_j1lbh_405{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);flex-wrap:wrap}._loginSection_j1lbh_413{display:flex;flex-direction:column;gap:var(--space-3)}._fieldLabel_j1lbh_419{font-size:var(--font-size-sm);font-weight:600;color:var(--text-primary)}._fieldLabel_j1lbh_419 a{color:var(--accent);text-decoration:none;display:inline-flex;align-items:center;gap:4px;margin-left:6px}._fieldLabel_j1lbh_419 a:hover{text-decoration:underline}._helpText_j1lbh_438{margin:0;font-size:.8rem;color:var(--text-tertiary);line-height:1.6}._helpText_j1lbh_438 code{background:var(--bg-tertiary);border:1px solid var(--border-primary);border-radius:4px;padding:1px 6px;font-size:.75rem;color:var(--text-secondary);word-break:break-all}._loginText_j1lbh_455{color:var(--text-secondary);font-size:var(--font-size-sm);margin:0;line-height:1.6;flex:1;min-width:220px}._primaryBtn_j1lbh_464,._secondaryBtn_j1lbh_465,._syncBtn_j1lbh_466{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);padding:var(--space-2-5) var(--space-4);border-radius:var(--radius-md);font-weight:600;font-size:var(--font-size-sm);cursor:pointer;border:1px solid transparent;transition:all var(--transition-fast);flex-shrink:0}._primaryBtn_j1lbh_464{background:var(--accent);color:var(--accent-text)}._primaryBtn_j1lbh_464:hover{filter:brightness(1.1)}._secondaryBtn_j1lbh_465{background:#ffffff0d;border-color:var(--border-primary);color:var(--text-primary)}._secondaryBtn_j1lbh_465:hover:not(:disabled){background:var(--bg-elevated);border-color:var(--border-secondary)}._syncBtn_j1lbh_466{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;padding:var(--space-3) var(--space-6)}._syncBtn_j1lbh_466:hover:not(:disabled){filter:brightness(1.1)}._primaryBtn_j1lbh_464:disabled,._secondaryBtn_j1lbh_465:disabled,._syncBtn_j1lbh_466:disabled{opacity:.5;cursor:not-allowed}._divider_j1lbh_518{border:0;border-top:1px solid var(--border-primary);margin:var(--space-6) 0}._actionSection_j1lbh_524 h4{margin:0 0 var(--space-1);color:var(--text-primary);font-size:var(--font-size-sm);font-weight:700}._actionSection_j1lbh_524 p{color:var(--text-secondary);font-size:var(--font-size-sm);margin:0 0 var(--space-4);line-height:1.6}._inputGroup_j1lbh_538{display:flex;gap:var(--space-2)}._input_j1lbh_538{flex:1;min-width:0;padding:var(--space-2-5) var(--space-3);border-radius:var(--radius-md);border:1px solid var(--border-primary);background:var(--bg-tertiary);color:var(--text-primary);font-size:var(--font-size-sm)}._input_j1lbh_538:focus{outline:none;border-color:var(--accent)}._syncSummary_j1lbh_559{margin-top:var(--space-3);font-size:.8rem;color:var(--text-tertiary)}._syncErrors_j1lbh_565{color:var(--color-danger)}._spin_j1lbh_569{animation:_spin_j1lbh_569 1s linear infinite}@keyframes _spin_j1lbh_569{to{transform:rotate(360deg)}}@keyframes _fadeIn_j1lbh_1{0%{opacity:0}to{opacity:1}}@keyframes _slideUpIn_j1lbh_1{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}._radioGroup_j1lbh_598{display:flex;gap:var(--space-4);margin-bottom:var(--space-4)}._radioLabel_j1lbh_604{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none}._radioLabel_j1lbh_604 input[type=radio]{appearance:none;-webkit-appearance:none;width:16px;height:16px;border:2px solid var(--border-secondary);border-radius:50%;background:transparent;cursor:pointer;position:relative;flex-shrink:0}._radioLabel_j1lbh_604 input[type=radio]:checked{border-color:var(--accent)}._radioLabel_j1lbh_604 input[type=radio]:checked:after{content:"";position:absolute;top:3px;left:3px;width:6px;height:6px;border-radius:50%;background:var(--accent)}._syncHint_j1lbh_642{color:var(--text-secondary);font-size:var(--font-size-sm);margin:0 0 var(--space-4);line-height:1.6}._importLoading_j1lbh_649{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--text-secondary);margin-top:var(--space-3)}@media(max-width:600px){._importCard_j1lbh_20{padding:var(--space-6)}._fileInputWrapper_j1lbh_59{flex-direction:column;align-items:stretch;text-align:center}._fileDisplay_j1lbh_87{flex-direction:column}._browseButton_j1lbh_109{text-align:center}}
@@ -1,2 +0,0 @@
1
- import{d as t,h as Ke,g as De,A as Fe,q as $e,u as e,S as m}from"./vendor-core-DfaOB3Rn.js";import{u as Oe,b as Re,a as x}from"./vendor-query-BBT5_sHx.js";import{A as i,q as r,t as h,Z as tn,k as sn,H as Ue,B as ce}from"./index-D0DdVatn.js";import{I as c}from"./vendor-icons-DrybRNxP.js";function rn(){const O=Oe(),[Z,v]=t(!1);return Ke(()=>{const s=new URLSearchParams(window.location.search),_=s.get("anilist");if(_){const p=s.get("user"),f=s.get("reason");window.history.replaceState(null,"",window.location.pathname),_==="success"?(i.success(p?`Connected to AniList as ${decodeURIComponent(p)}`:"Connected to AniList"),O.invalidateQueries({queryKey:[r.trackerStatus]})):i.error(f?decodeURIComponent(f):"AniList authentication failed");return}const P=new URLSearchParams(window.location.hash.substring(1)),b=P.get("access_token"),L=s.get("code");if(!b&&!L){const p=P.get("error");p&&(i.error(`AniList error: ${p}`),window.history.replaceState(null,"",window.location.pathname));return}const y=window.location.origin+window.location.pathname;window.history.replaceState(null,"",window.location.pathname),v(!0),i("Connecting to AniList..."),h.tracker.anilistAuth.mutate(b?{token:b}:{code:L,redirectUri:y}).then(async p=>{const f=p.user;i.success(`Connected to AniList as ${f?.name??"AniList user"}`),O.invalidateQueries({queryKey:[r.trackerStatus]})}).catch(p=>{i.error(p instanceof Error?p.message:"Failed to authenticate with AniList")}).finally(()=>{v(!1)})},[O]),Z}const ln="_header_j1lbh_1",cn="_fadeIn_j1lbh_1",on="_pageTitle_j1lbh_6",dn="_pageSubtitle_j1lbh_14",mn="_importCard_j1lbh_20",pn="_slideUpIn_j1lbh_1",un="_cardHeader_j1lbh_37",hn="_uploadArea_j1lbh_55",gn="_fileInputWrapper_j1lbh_59",yn="_fileInput_j1lbh_59",bn="_fileDisplay_j1lbh_87",_n="_fileIcon_j1lbh_95",fn="_fileName_j1lbh_100",Nn="_browseButton_j1lbh_109",kn="_optionsArea_j1lbh_120",vn="_checkboxLabel_j1lbh_128",wn="_checkbox_j1lbh_128",In="_checkboxCustom_j1lbh_141",xn="_optionText_j1lbh_169",Ln="_optionTitle_j1lbh_175",Cn="_optionDesc_j1lbh_181",Mn="_actions_j1lbh_187",Sn="_importBtn_j1lbh_195",Tn="_cancelBtn_j1lbh_201",An="_statusMessage_j1lbh_215",jn="_success_j1lbh_225",Pn="_error_j1lbh_231",En="_progressSection_j1lbh_237",Bn="_progressBar_j1lbh_242",Dn="_progressFill_j1lbh_250",Fn="_progressInfo_j1lbh_257",$n="_progressCount_j1lbh_264",Rn="_progressTitle_j1lbh_271",Un="_sourceBadge_j1lbh_289",qn="_anilist_j1lbh_301",Kn="_kitsu_j1lbh_307",On="_offline_j1lbh_313",Qn="_skipped_j1lbh_319",Gn="_cardTitleRow_j1lbh_324",Hn="_anilistIcon_j1lbh_334",Wn="_malIcon_j1lbh_340",Xn="_badgeOnline_j1lbh_346",zn="_badgeOffline_j1lbh_358",Jn="_connectedProfile_j1lbh_370",Yn="_avatar_j1lbh_379",Zn="_connectedInfo_j1lbh_386",Vn="_connectedName_j1lbh_394",ea="_connectedHint_j1lbh_400",na="_loginPrompt_j1lbh_405",aa="_loginSection_j1lbh_413",ta="_fieldLabel_j1lbh_419",sa="_helpText_j1lbh_438",ia="_loginText_j1lbh_455",ra="_primaryBtn_j1lbh_464",la="_secondaryBtn_j1lbh_465",ca="_syncBtn_j1lbh_466",oa="_divider_j1lbh_518",da="_actionSection_j1lbh_524",ma="_inputGroup_j1lbh_538",pa="_input_j1lbh_538",ua="_syncSummary_j1lbh_559",ha="_syncErrors_j1lbh_565",ga="_spin_j1lbh_569",ya="_radioGroup_j1lbh_598",ba="_radioLabel_j1lbh_604",_a="_syncHint_j1lbh_642",fa="_importLoading_j1lbh_649",n={header:ln,fadeIn:cn,pageTitle:on,pageSubtitle:dn,importCard:mn,slideUpIn:pn,cardHeader:un,uploadArea:hn,fileInputWrapper:gn,fileInput:yn,fileDisplay:bn,fileIcon:_n,fileName:fn,browseButton:Nn,optionsArea:kn,checkboxLabel:vn,checkbox:wn,checkboxCustom:In,optionText:xn,optionTitle:Ln,optionDesc:Cn,actions:Mn,importBtn:Sn,cancelBtn:Tn,statusMessage:An,success:jn,error:Pn,progressSection:En,progressBar:Bn,progressFill:Dn,progressInfo:Fn,progressCount:$n,progressTitle:Rn,sourceBadge:Un,anilist:qn,kitsu:Kn,offline:On,skipped:Qn,cardTitleRow:Gn,anilistIcon:Hn,malIcon:Wn,badgeOnline:Xn,badgeOffline:zn,connectedProfile:Jn,avatar:Yn,connectedInfo:Zn,connectedName:Vn,connectedHint:ea,loginPrompt:na,loginSection:aa,fieldLabel:ta,helpText:sa,loginText:ia,primaryBtn:ra,secondaryBtn:la,syncBtn:ca,divider:oa,actionSection:da,inputGroup:ma,input:pa,syncSummary:ua,syncErrors:ha,spin:ga,radioGroup:ya,radioLabel:ba,syncHint:_a,importLoading:fa},oe="tracker_anilist_client_id",qe="49887".trim(),Ia=()=>{const{setIsOpen:O}=tn(),{contentType:Z}=sn(),v=Z==="manga",s=Oe();De.useEffect(()=>{document.title="Trackers - dango"},[]);const[_,P]=t(""),[b,L]=t("username"),[y,p]=t(null),[f,de]=t(""),[C,me]=t(!1),Qe=rn(),{data:pe,isLoading:ue}=Re({queryKey:[r.trackerStatus],queryFn:async()=>await h.tracker.status.query()}),{data:M}=Re({queryKey:[r.anilistClientId],queryFn:async()=>(await h.settings.getByKey.query({key:oe})).value||""}),he=Fe(!1);De.useEffect(()=>{he.current||M!==void 0&&(M&&de(M),he.current=!0)},[M]);const w=pe?.anilist?.connected??!1;Ke(()=>{w&&L("sync")},[w]);const Q=pe?.anilist?.user??null,V=!!qe,Ge=(M||"").trim(),He=async()=>{const a=f.trim(),l=a||qe;if(!l){i.error("Enter your AniList client ID first");return}const k=async(j,ie)=>{await h.settings.set.mutate({key:j,value:ie})};try{a?a!==M&&await k(oe,a):V&&Ge&&await k(oe,""),s.invalidateQueries({queryKey:[r.anilistClientId]})}catch(j){i.error(j.message);return}const o=window.location.origin+window.location.pathname,U=encodeURIComponent(o);window.location.href=`https://anilist.co/api/v2/oauth/authorize?client_id=${encodeURIComponent(l)}&response_type=token&state=${U}`},ge=x({mutationFn:async()=>h.tracker.anilistDisconnect.mutate(),onSuccess:()=>{s.invalidateQueries({queryKey:[r.trackerStatus]}),i.success("Disconnected from AniList")},onError:a=>i.error(a.message)}),G=x({mutationFn:async()=>(await h.tracker.sync.mutate({provider:"anilist"})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:[r.watchlist]}),s.invalidateQueries({queryKey:[r.continueWatching]}),p(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)}),[E,ye]=t(""),[H,be]=t("sync"),[ee,_e]=t("two-way"),[d,We]=t(null),W=x({mutationFn:async()=>(await h.tracker.mangaSync.mutate({direction:ee})).summary,onSuccess:a=>{s.invalidateQueries({queryKey:[r.mangaLibrary]}),s.invalidateQueries({queryKey:[r.mangaContinueReading]}),We(a);const l=(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}${l}`,{duration:6e3})},onError:a=>i.error(a.message)}),S=x({mutationFn:async()=>{if(!E.trim())throw new Error("Please enter a username");return(await h.tracker.mangaImport.mutate({username:E.trim(),erase:C})).count},onSuccess:a=>{s.invalidateQueries({queryKey:[r.mangaLibrary]}),s.invalidateQueries({queryKey:[r.mangaContinueReading]}),i.success(`Imported ${a} manga entries from AniList`),ye("")},onError:a=>i.error(a.message)}),[B,fe]=t(""),[X,Ne]=t("username"),[ne,ke]=t(null),[z,ve]=t(!1),[we,ae]=t(""),[Ie,Xe]=t(""),N=x({mutationFn:async()=>{if(!B.trim())throw new Error("Please enter a MAL username");const a=await h.tracker.mangaMalImport.mutate({username:B.trim(),erase:C});return{imported:a.imported??0,skipped:a.skipped??0}},onSuccess:({imported:a,skipped:l})=>{s.invalidateQueries({queryKey:[r.mangaLibrary]}),s.invalidateQueries({queryKey:[r.mangaContinueReading]}),i.success(`Imported ${a} manga entries from MAL${l>0?`, skipped ${l}`:""}`),fe("")},onError:a=>i.error(a.message)}),ze=$e(async()=>{const a=document.getElementById("malMangaFile");if(!a.files||a.files.length===0){ae("Please select a file first.");return}ve(!0),ae(""),ke(null);try{const l=new FormData;l.append("xmlfile",a.files[0]),l.append("erase",String(C));const k=await Ue("/api/import/mal-xml-manga",{method:"POST",body:l}),o=await k.json().catch(()=>({}));if(!k.ok)throw new Error(o.error||"Import failed");ke({imported:o.imported??0,skipped:o.skipped??0}),s.invalidateQueries({queryKey:[r.mangaLibrary]}),s.invalidateQueries({queryKey:[r.mangaContinueReading]})}catch(l){ae(l.message)}finally{ve(!1)}},[C,s]),T=x({mutationFn:async()=>{if(!_.trim())throw new Error("Please enter a username");return(await h.tracker.anilistImport.mutate({username:_.trim(),erase:I})).count},onSuccess:a=>{s.invalidateQueries({queryKey:[r.watchlist]}),s.invalidateQueries({queryKey:[r.continueWatching]}),i.success(`Imported ${a} anime entries from AniList`),P("")},onError:a=>i.error(a.message)}),[D,xe]=t(""),g=x({mutationFn:async a=>{if(!D.trim())throw new Error("Please enter a MAL username");return(await h.tracker.malImport.mutate({username:D.trim(),erase:a.erase,useOfflineDb:a.useOfflineDb,skipFallback:a.skipFallback})).count},onSuccess:a=>{s.invalidateQueries({queryKey:[r.watchlist]}),s.invalidateQueries({queryKey:[r.continueWatching]}),i.success(`Imported ${a} anime entries from MAL`),xe("")},onError:a=>i.error(a.message)}),[I,Le]=t(!1),[F,Je]=t(!0),[$,Ye]=t(!1),[Ce,Me]=t(""),[A,Se]=t(!1),[u,Te]=t(null),[te,Ae]=t(null),[je,J]=t(""),se=Fe(null),Ze=a=>{a.currentTarget.files&&a.currentTarget.files.length>0?Me(a.currentTarget.files[0].name):Me("")},Ve=$e(async()=>{const a=document.getElementById("malFile");if(!a.files||a.files.length===0){J("Please select a file first.");return}const l=a.files[0];Se(!0),Te(null),Ae(null),J("");const k=new AbortController;se.current=k;try{const o=new FormData;o.append("xmlfile",l),o.append("erase",String(I)),o.append("useOfflineDb",String(F)),o.append("skipFallback",String($));const U=await Ue("/api/import/mal-xml",{method:"POST",body:o,signal:k.signal});if(!U.ok){const le=await U.text();let q="Failed to import";try{q=JSON.parse(le).error||q}catch{}throw new Error(q)}const j=U.body?.getReader();if(!j)throw new Error("No response stream");const ie=new TextDecoder;let re="",Y="";for(;;){const{done:le,value:q}=await j.read();if(le)break;re+=ie.decode(q,{stream:!0});const Ee=re.split(`
2
- `);re=Ee.pop()||"";for(const K of Ee)if(K.startsWith("event: "))Y=K.slice(7).trim();else if(K.startsWith("data: ")){const an=K.slice(6);try{const Be=JSON.parse(an);Y==="progress"?Te(Be):Y==="complete"&&Ae(Be)}catch{}}else K===""&&(Y="")}s.invalidateQueries({queryKey:[r.watchlist]})}catch(o){o instanceof DOMException&&o.name==="AbortError"?J("Import cancelled."):J(o.message)}finally{Se(!1),se.current=null}},[I,F,$,s]),en=()=>{se.current?.abort(),h.settings.malImportCancel.mutate().catch(()=>{})},nn=u?Math.round(u.current/u.total*100):0,[R,Pe]=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."}),!v&&e(m,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(c,{name:"anilist",className:n.anilistIcon}),e("h3",{children:"AniList"}),ue?null:w?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),w&&Q?e("div",{className:n.connectedProfile,children:[Q.avatar&&e("img",{src:Q.avatar,alt:"Avatar",className:n.avatar,loading:"lazy",decoding:"async"}),e("div",{className:n.connectedInfo,children:[e("span",{className:n.connectedName,children:Q.name}),e("span",{className:n.connectedHint,children:"2-way sync is ready"})]}),e("button",{className:n.secondaryBtn,onClick:()=>ge.mutate(),disabled:ge.isPending,children:[e(c,{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.",Qe&&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(c,{name:"external-link-alt",size:9})]})]}),e("div",{className:n.inputGroup,children:[e("input",{type:"text",placeholder:"Client ID",value:f,onChange:a=>de(a.currentTarget.value),className:n.input}),e("button",{className:n.primaryBtn,onClick:He,disabled:!(f.trim()||V),children:[e(c,{name:"external-link-alt"})," Connect"]})]}),e("p",{className:n.helpText,children:V?e(m,{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(m,{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."]})})]}),w&&e(m,{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:b==="username",onChange:()=>L("username")}),e("span",{children:"Quick Import"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"anilistMode",value:"sync",checked:b==="sync",onChange:()=>L("sync")}),e("span",{children:"Two-way Sync"})]})]}),b==="username"?e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter AniList username",value:_,onChange:a=>P(a.currentTarget.value),className:n.input,disabled:T.isPending,onKeyDown:a=>{a.key==="Enter"&&_.trim()&&T.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."}),b==="username"&&e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:I,onChange:a=>Le(a.currentTarget.checked),className:n.checkbox,disabled:T.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."})]})]})}),b==="username"?e("button",{className:n.syncBtn,onClick:()=>T.mutate(),disabled:!_.trim()||T.isPending,children:[e(c,{name:"download"}),T.isPending?"Importing...":"Start Import"]}):e(m,{children:[e("button",{className:n.syncBtn,onClick:()=>G.mutate(),disabled:G.isPending,children:[e(c,{name:"sync-alt",className:G.isPending?n.spin:""}),G.isPending?"Syncing...":"Start Sync"]}),y&&e("div",{className:n.syncSummary,children:["Pushed: ",y.pushed," · Pulled: ",y.pulled," · Merged:"," ",y.merged," · Unchanged: ",y.unchanged,y.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",y.errors.length," error",y.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."]})]})]})}),v&&e(m,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(c,{name:"anilist",className:n.anilistIcon}),e("h3",{children:"AniList Manga"}),ue?null:w?e("span",{className:n.badgeOnline,children:"Connected"}):e("span",{className:n.badgeOffline,children:"Not connected"})]})}),w?e(m,{children:[e("div",{className:n.radioGroup,children:[e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaMode",value:"username",checked:H==="username",onChange:()=>be("username")}),e("span",{children:"Quick Import"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaMode",value:"sync",checked:H==="sync",onChange:()=>be("sync")}),e("span",{children:"Two-way Sync"})]})]}),H==="username"?e(m,{children:[e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter AniList username",value:E,onChange:a=>ye(a.currentTarget.value),className:n.input,disabled:S.isPending,onKeyDown:a=>{a.key==="Enter"&&E.trim()&&S.mutate()}})}),e("div",{className:n.optionsArea,children:e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:C,onChange:a=>me(a.currentTarget.checked),className:n.checkbox,disabled:S.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(m,{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:ee==="two-way",onChange:()=>_e("two-way")}),e("span",{children:"Two-way"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"mangaDirection",value:"pull-only",checked:ee==="pull-only",onChange:()=>_e("pull-only")}),e("span",{children:"Pull only (never writes to AniList)"})]})]})]}),H==="username"?e("button",{className:n.syncBtn,onClick:()=>S.mutate(),disabled:!E.trim()||S.isPending,children:[e(c,{name:"download"}),S.isPending?"Importing...":"Start Import"]}):e(m,{children:[e("button",{className:n.syncBtn,onClick:()=>W.mutate(),disabled:W.isPending,children:[e(c,{name:"sync-alt",className:W.isPending?n.spin:""}),W.isPending?"Syncing...":"Start Manga Sync"]}),d&&e(m,{children:[e("div",{className:n.syncSummary,children:["Pushed: ",d.pushed," · Pulled: ",d.pulled," · Merged: ",d.merged," · Unchanged:"," ",d.unchanged,(d.skipped??0)>0&&e("span",{children:[" · Skipped: ",d.skipped]}),d.errors.length>0&&e("span",{className:n.syncErrors,children:[" ","· ",d.errors.length," error",d.errors.length>1?"s":""]})]}),(d.warnings?.length??0)>0&&e("div",{className:n.syncErrors,style:{marginTop:"8px"},children:[(d.warnings??[]).slice(0,5).map((a,l)=>e("div",{children:["⚠ ",a]},l)),(d.warnings?.length??0)>5&&e("div",{children:["+",(d.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."})]})}),!v&&e(m,{children:e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(c,{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:R==="username",onChange:()=>Pe("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMode",value:"xml",checked:R==="xml",onChange:()=>Pe("xml")}),e("span",{children:"XML File"})]})]}),R==="username"?e(m,{children:[e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter MAL username",value:D,onChange:a=>xe(a.currentTarget.value),className:n.input,disabled:g.isPending,onKeyDown:a=>{a.key==="Enter"&&D.trim()&&g.mutate({erase:I,useOfflineDb:F,skipFallback:$})}})}),g.isPending&&e("div",{className:n.importLoading,children:[e(c,{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:Ze,disabled:A}),e("div",{className:n.fileDisplay,children:[e(c,{name:"file-alt",className:n.fileIcon}),e("span",{className:n.fileName,children:Ce||"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:I,onChange:a=>Le(a.currentTarget.checked),className:n.checkbox,disabled:A||g.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:F,onChange:a=>Je(a.currentTarget.checked),className:n.checkbox,disabled:A||g.isPending}),e("span",{className:n.checkboxCustom}),e("div",{className:n.optionText,children:[e("span",{className:n.optionTitle,children:"Use offline database (fast)"}),e("span",{className:n.optionDesc,children:"Match by MAL ID locally first - instant and avoids AniList rate limits."})]})]}),e("label",{className:n.checkboxLabel,children:[e("input",{type:"checkbox",checked:$,onChange:a=>Ye(a.currentTarget.checked),className:n.checkbox,disabled:A||g.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."})]})]})]}),R==="username"?e("button",{className:n.syncBtn,onClick:()=>g.mutate({erase:I,useOfflineDb:F,skipFallback:$}),disabled:!D.trim()||g.isPending,children:[e(c,{name:"download"}),g.isPending?"Importing...":"Start Import"]}):e("div",{className:n.actions,children:A?e(ce,{onClick:en,className:n.cancelBtn,children:"Cancel Import"}):e(ce,{onClick:Ve,className:n.importBtn,disabled:!Ce,children:[e(c,{name:"upload"})," Start Import"]})}),R==="username"&&g.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:g.error.message}),A&&u&&e("div",{className:n.progressSection,children:[e("div",{className:n.progressBar,children:e("div",{className:n.progressFill,style:{width:`${nn}%`}})}),e("div",{className:n.progressInfo,children:[e("span",{className:n.progressCount,children:[u.current," / ",u.total]}),e("span",{className:n.progressTitle,children:u.found?e(m,{children:[u.matchedTitle,e("span",{className:`${n.sourceBadge} ${n[u.source||"anilist"]}`,children:u.source==="kitsu"?"Kitsu":u.source==="offline"?"Offline DB":"AniList"})]}):e("span",{className:n.skipped,children:["Skipped: ",u.title]})})]})]}),te&&e("div",{className:`${n.statusMessage} ${n.success}`,children:["Import complete! Imported: ",te.imported,", Skipped: ",te.skipped,"."]}),je&&e("div",{className:`${n.statusMessage} ${n.error}`,children:je})]})}),v&&e("div",{className:n.importCard,children:[e("div",{className:n.cardHeader,children:e("div",{className:n.cardTitleRow,children:[e(c,{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:X==="username",onChange:()=>Ne("username")}),e("span",{children:"Username"})]}),e("label",{className:n.radioLabel,children:[e("input",{type:"radio",name:"malMangaMode",value:"xml",checked:X==="xml",onChange:()=>Ne("xml")}),e("span",{children:"XML File"})]})]}),X==="username"?e("div",{className:n.inputGroup,children:e("input",{type:"text",placeholder:"Enter MAL username",value:B,onChange:a=>fe(a.currentTarget.value),className:n.input,disabled:N.isPending,onKeyDown:a=>{a.key==="Enter"&&B.trim()&&N.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=>Xe(a.currentTarget.files?.[0]?.name??""),disabled:z}),e("div",{className:n.fileDisplay,children:[e(c,{name:"file-alt",className:n.fileIcon}),e("span",{className:n.fileName,children:Ie||"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:C,onChange:a=>me(a.currentTarget.checked),className:n.checkbox,disabled:N.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."})]})]})}),X==="username"?e("button",{className:n.syncBtn,onClick:()=>N.mutate(),disabled:!B.trim()||N.isPending,children:[e(c,{name:"download"}),N.isPending?"Importing...":"Start Import"]}):e("div",{className:n.actions,children:e(ce,{onClick:ze,className:n.importBtn,disabled:z||!Ie,children:[e(c,{name:"upload"})," ",z?"Importing...":"Start Import"]})}),N.isError&&e("div",{className:`${n.statusMessage} ${n.error}`,children:N.error.message}),we&&e("div",{className:`${n.statusMessage} ${n.error}`,children:we}),ne&&e("div",{className:`${n.statusMessage} ${n.success}`,children:["Import complete! Imported: ",ne.imported,", Skipped:"," ",ne.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{Ia as default};