@serifpersia/dango 3.9.7 → 3.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -4
- package/client/dist/assets/{AnimeCard-q5F_tD6Q.js → AnimeCard-BryQpsfk.js} +1 -1
- package/client/dist/assets/{AnimeInfo-Y4TzTq4q.js → AnimeInfo-CwpctGn0.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-Bu8q7_fN.js → AnimeInfoPage-Bio8K71O.js} +2 -2
- package/client/dist/assets/{Asmr-DuW_Jtwk.js → Asmr-HIu-8L7Z.js} +1 -1
- package/client/dist/assets/{AsmrPopup-DmXAjIpT.js → AsmrPopup-DDIRUtND.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-YlpGKOw-.js → AsmrResetProgressModal-G--_5hi6.js} +1 -1
- package/client/dist/assets/{Home-B2O7RdNh.js → Home-BWkEQ5Tc.js} +1 -1
- package/client/dist/assets/{Insights-CT77CDrU.js → Insights-CQqjy_kF.js} +1 -1
- package/client/dist/assets/{LibraryListPage-AJ6hG1L-.js → LibraryListPage-P3ThNbJF.js} +1 -1
- package/client/dist/assets/{ListeningList-GOx1Ir_v.js → ListeningList-3qKM0AC8.js} +1 -1
- package/client/dist/assets/{Manga-CQKVrxz_.js → Manga-BwegzU0m.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-BB5cQkBO.js → MangaInfoPage-BH9xCU6N.js} +1 -1
- package/client/dist/assets/{MangaReadPage-BDpps3lc.js → MangaReadPage-DrOb1D_A.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-CaJT2NHH.js → MangaResetProgressModal-tm1SKBh0.js} +1 -1
- package/client/dist/assets/{Mature-BMXpX3iD.js → Mature-cilbtt-T.js} +1 -1
- package/client/dist/assets/{MatureConsentModal-C5vPRV5i.js → MatureConsentModal-C3JQ0hOC.js} +1 -1
- package/client/dist/assets/{MediaCard-MAnVN0Zz.js → MediaCard-CX1R88mG.js} +1 -1
- package/client/dist/assets/{OptionListMenu-CcJ9TOV5.js → OptionListMenu-Dk6O2_c7.js} +1 -1
- package/client/dist/assets/Player-DvxvINN3.js +56 -0
- package/client/dist/assets/{PlayerProvider-BpSlL46d.js → PlayerProvider-BToIPjV4.js} +1 -1
- package/client/dist/assets/{PlayerSettings-delaSmdG.js → PlayerSettings-ChgEMzSz.js} +1 -1
- package/client/dist/assets/{QueueOptionsButton-DzBTJGGX.js → QueueOptionsButton-Dr3K6INy.js} +1 -1
- package/client/dist/assets/{QueueRail-BT1sLDAw.js → QueueRail-B0TC6DCX.js} +1 -1
- package/client/dist/assets/{ReadingList-DmbVYPKy.js → ReadingList-DCZ23sG0.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-BDobxv1I.js → ResetProgressModal-BvZead5B.js} +1 -1
- package/client/dist/assets/{Search-CxUcaFfI.js → Search-B73ke5YU.js} +1 -1
- package/client/dist/assets/{Settings-CoTHeSKq.js → Settings-SEe-k3OG.js} +2 -2
- package/client/dist/assets/{SkeletonGrid-9Q4VuO4S.js → SkeletonGrid-BRXDEtGD.js} +1 -1
- package/client/dist/assets/{Trackers-DC4EDgyt.js → Trackers-DMmvYK4c.js} +1 -1
- package/client/dist/assets/Tv-3vWq7Hty.js +4 -0
- package/client/dist/assets/TvInfo-DUKI6aoL.js +1 -0
- package/client/dist/assets/{TvPopup-DkLU-7pw.js → TvPopup-BCguPlm4.js} +1 -1
- package/client/dist/assets/{TvSearch-BwEGJcbq.js → TvSearch-BCZ1Bt5O.js} +1 -1
- package/client/dist/assets/{TvWatchlist-CP92PPZB.js → TvWatchlist-CgOxUdL1.js} +1 -1
- package/client/dist/assets/{VirtualKeyboard-CsmRu3E6.js → VirtualKeyboard-DW59v_31.js} +1 -1
- package/client/dist/assets/{WatchAlong-CpfZx3Le.js → WatchAlong-Det8BqIA.js} +1 -1
- package/client/dist/assets/{WatchAlongPanel-Bhu29HGV.js → WatchAlongPanel-B5laz8Xh.js} +1 -1
- package/client/dist/assets/{Watchlist-9ikxJknw.js → Watchlist-itrgSH3A.js} +1 -1
- package/client/dist/assets/index-CANVdkPZ.js +178 -0
- package/client/dist/assets/index-DmkNa-gz.css +1 -0
- package/client/dist/assets/{libraryInvalidation-DGrdMoRs.js → libraryInvalidation-DbrKjF5Q.js} +1 -1
- package/client/dist/assets/{playbackCompletion-Z40dSXOE.js → playbackCompletion-BXXM0PH1.js} +1 -1
- package/client/dist/assets/{useAnimeInfoData-CD7YsaT8.js → useAnimeInfoData-6HMof-NV.js} +1 -1
- package/client/dist/assets/{useMangaLibrary--4Q_E3hs.js → useMangaLibrary-DFCgqpvO.js} +1 -1
- package/client/dist/assets/{useMangaPopup-E_GgQXOf.js → useMangaPopup-BS54vMe3.js} +1 -1
- package/client/dist/assets/{useProviders-jAVzdvgi.js → useProviders-DX0JCmk2.js} +1 -1
- package/client/dist/assets/{useTv-C5QkCKNu.js → useTv-CTuS47dN.js} +1 -1
- package/client/dist/assets/{useTvLibrary-DPJOHbp1.js → useTvLibrary-DHDmFDvV.js} +1 -1
- package/client/dist/assets/{useWatchAlongPlayer-CGkmzN8r.js → useWatchAlongPlayer-BdOwe0vN.js} +1 -1
- package/client/dist/favicon.svg +4 -10
- package/client/dist/index.html +3 -3
- package/client/dist/logo.svg +6 -0
- package/package.json +2 -2
- package/server/dist/server.js +247 -247
- package/server/package.json +1 -1
- package/client/dist/assets/Player-BTtTwYJ2.js +0 -56
- package/client/dist/assets/Tv-DCnM78Kk.js +0 -4
- package/client/dist/assets/TvInfo-foHQYICS.js +0 -1
- package/client/dist/assets/index-COFMCQUU.css +0 -1
- package/client/dist/assets/index-CipsDH5j.js +0 -178
- package/client/dist/repo_logo.svg +0 -33
package/server/package.json
CHANGED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PlayerSettings-delaSmdG.js","assets/vendor-core-DfaOB3Rn.js","assets/index-CipsDH5j.js","assets/vendor-query-BBT5_sHx.js","assets/vendor-icons-C1Pj_eSX.js","assets/index-COFMCQUU.css","assets/OptionListMenu-CcJ9TOV5.js","assets/useWatchAlongPlayer-CGkmzN8r.js","assets/PlayerProvider-BpSlL46d.js","assets/PlayerProvider-ZeplRma-.css","assets/playbackCompletion-Z40dSXOE.js","assets/useWatchAlongPlayer-Dk7zB7P4.css","assets/PlayerSettings-CbGkvNJq.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{u as t,g as yt,h as V,P as wr,z as Er,d as se,A as N,q,y as kr,T as xe,o as Tr,a as Cr,c as Rr,_ as Mr,S as ot}from"./vendor-core-DfaOB3Rn.js";import{p as ee,a2 as qt,a3 as it,o as Pr,q as ie,t as de,J as ke,a4 as Nr,a5 as Ze,Q as bt,a6 as _r,e as xr,x as Ar,y as Lr,z as Br,A as Dr,d as $r,u as Fr,B as Ne,h as Wt,a7 as Ir,a8 as Or,f as Wr}from"./index-CipsDH5j.js";import{P as Ur,a as Qr,b as Vr,F as Kr,s as qr,c as Gr}from"./PlayerProvider-BpSlL46d.js";import{u as Gt,b as Ut,a as gt}from"./vendor-query-BBT5_sHx.js";import{p as Nt,s as zr,C as Hr,a as jr,P as Yr,b as ze,c as Qt,f as zt,d as Xr,e as Jr,g as Zr,r as en,u as tn,h as rn,i as nn,j as sn,k as on,l as an,m as ln,n as cn,o as _e,A as un,q as Vt,R as dn,E as mn,t as pn,v as S,w as hn,x as fn,y as vn}from"./useWatchAlongPlayer-CGkmzN8r.js";import{I as ye}from"./vendor-icons-C1Pj_eSX.js";import{a as gn,i as lt,b as Ht,l as yn,c as bn}from"./playbackCompletion-Z40dSXOE.js";import{M as Sn}from"./MatureConsentModal-C5vPRV5i.js";import{u as wn}from"./useIsMobile-Dvx1uJ82.js";import{s as Ae,Q as En}from"./QueueRail-BT1sLDAw.js";import{u as kn,Q as Tn}from"./QueueOptionsButton-DzBTJGGX.js";import{u as jt}from"./useProviders-jAVzdvgi.js";import{A as Cn}from"./AnimeMetaDetails-B3-A7O5H.js";import{S as Rn}from"./SynopsisText-B3Sa5pRv.js";import{W as Mn}from"./WatchAlongPanel-Bhu29HGV.js";import"./vendor-ui-3qrARCPr.js";const Pn="_controlsOverlay_6uapd_1",Nn="_hidden_6uapd_21",_n="_topControls_6uapd_27",xn="_backBtn_6uapd_47",An="_videoTitleInfo_6uapd_67",Ln="_animeTitle_6uapd_73",Bn="_episodeNumber_6uapd_83",Dn="_bottomControls_6uapd_91",$n="_progressBarContainer_6uapd_110",Fn="_progressBar_6uapd_110",In="_thumb_6uapd_129",On="_scrubbing_6uapd_144",Wn="_watchedBar_6uapd_148",Un="_bufferedBar_6uapd_149",Qn="_timeBubble_6uapd_191",Vn="_skipSegment_6uapd_225",Kn="_op_6uapd_235",qn="_mixed_op_6uapd_236",Gn="_ed_6uapd_240",zn="_mixed_ed_6uapd_241",Hn="_recap_6uapd_245",jn="_mixed_recap_6uapd_246",Yn="_bottomControlsRow_6uapd_250",Xn="_leftControls_6uapd_258",Jn="_rightControls_6uapd_259",Zn="_controlBtn_6uapd_266",es="_theaterBtn_6uapd_307",ts="_nextEpisodeBtn_6uapd_311",rs="_active_6uapd_332",ns="_timeDisplay_6uapd_336",ss="_skipControls_6uapd_344",$={controlsOverlay:Pn,hidden:Nn,topControls:_n,backBtn:xn,videoTitleInfo:An,animeTitle:Ln,episodeNumber:Bn,bottomControls:Dn,progressBarContainer:$n,progressBar:Fn,thumb:In,scrubbing:On,watchedBar:Wn,bufferedBar:Un,timeBubble:Qn,skipSegment:Vn,op:Kn,mixed_op:qn,ed:Gn,mixed_ed:zn,recap:Hn,mixed_recap:jn,bottomControlsRow:Yn,leftControls:Xn,rightControls:Jn,controlBtn:Zn,theaterBtn:es,nextEpisodeBtn:ts,active:rs,timeDisplay:ns,skipControls:ss},os=({player:r,handlers:o,visible:l,skipIntervals:d,showNextEpisodeButton:C,onNextEpisode:i,isTheaterMode:s,onTheaterModeToggle:n,settingsBtnRef:a,timeDisplayRef:g})=>{const{state:p,actions:v}=r,{showSettings:w}=p;return t("div",{className:`${$.controlsOverlay} ${l?"":$.hidden} `,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:$.bottomControls,"data-speed-boost-ignore":"true",onClick:k=>k.stopPropagation(),children:[t(Ur,{classes:{container:$.progressBarContainer,scrubbing:$.scrubbing,timeBubble:$.timeBubble,bar:$.progressBar,buffered:$.bufferedBar,watched:$.watchedBar,thumb:$.thumb},timeLabelRef:g,children:[p.duration>0&&r.state.currentSkipInterval&&t("div",{className:`${$.skipSegment} ${$[r.state.currentSkipInterval.skip_type]} `,style:{left:`${r.state.currentSkipInterval.start_time/p.duration*100}% `,width:`${(r.state.currentSkipInterval.end_time-r.state.currentSkipInterval.start_time)/p.duration*100}% `}}),d.map(k=>{const e=k.start_time/p.duration*100,E=(k.end_time-k.start_time)/p.duration*100;return t("div",{className:`${$.skipSegment} ${$[k.skip_type]} `,style:{left:`${e}% `,width:`${E}% `},title:k.skip_type.toUpperCase()},k.skip_id)})]}),t("div",{className:$.bottomControlsRow,children:[t("div",{className:$.leftControls,children:[t(Qr,{className:$.controlBtn}),t(Vr,{buttonClassName:$.controlBtn,onExpandedChange:v.setShowVolumeSlider}),t("span",{className:$.timeDisplay,ref:g,children:[v.formatTime(0)," / ",v.formatTime(p.duration)]}),p.currentSkipInterval&&!p.isAutoSkipEnabled&&!p.playbackLocked&&t("button",{className:$.controlBtn,onClick:()=>{p.currentSkipInterval&&(r.engine.seek(p.currentSkipInterval.end_time),v.setCurrentSkipInterval(null))},children:["Skip ",p.currentSkipInterval.skip_type==="op"?"Opening":"Ending"]})]}),t("div",{className:$.rightControls,children:[t("div",{className:$.skipControls,children:C&&t("button",{className:$.nextEpisodeBtn,onClick:i,title:"Play next episode",children:"Next EP"})}),t("button",{className:`${$.controlBtn} ${o.isSubtitleActive?$.active:""}`,onClick:o.handleCCToggle,title:o.isSubtitleActive?"Disable Subtitles":"Enable Subtitles","aria-label":"Toggle Subtitles",children:t(ye,{name:"closed-captioning",size:22})}),t("button",{ref:a,className:`${$.controlBtn} ${w?$.active:""} `,onClick:()=>v.setShowSettings(!w),"aria-label":"Settings",children:t(ye,{name:"cog"})}),t("button",{className:`${$.controlBtn} ${$.theaterBtn} ${s?$.active:""} `,onClick:k=>{k.stopPropagation(),n()},title:s?"Exit Theater Mode":"Theater Mode","aria-label":s?"Exit Theater Mode":"Theater Mode",children:t(ye,{name:"tv"})}),t(Kr,{className:$.controlBtn})]})]})]})})};function is(r){const{state:o,refs:l,actions:d}=r,C=n=>{if(!l.videoRef.current)return;d.setActiveSubtitleTrack(n);try{if(n===null||n==="off")ee.setItem("playerSubtitlesEnabled","false");else{ee.setItem("playerSubtitlesEnabled","true");const g=o.availableSubtitles.find(p=>p.label===n||p.lang===n);g?ee.setItem("playerLastSubtitle",zr(g)):ee.setItem("playerLastSubtitle",n)}}catch{}let a=!1;Array.from(l.videoRef.current.textTracks).forEach(g=>{const v=n!==null&&n!=="off"&&(g.language===n||g.label===n)&&!a;g.mode=v?"showing":"hidden",v&&(a=!0)})},i=o.activeSubtitleTrack!==null&&o.activeSubtitleTrack!=="off";return{handleSubtitleSelection:C,isSubtitleActive:i,handleCCToggle:()=>{if(!l.videoRef.current)return;if(i){C("off");return}if(o.availableSubtitles.length===0)return;let n=null;try{n=ee.getItem("playerLastSubtitle")}catch{}const a=Nt(o.availableSubtitles,{lastKey:n,enabled:!0});if(a<0)return;const g=o.availableSubtitles[a];C(g.label||g.lang)}}}const as=Er(()=>qt(()=>import("./PlayerSettings-delaSmdG.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))),ls=({player:r,isAutoplayEnabled:o,onAutoplayChange:l,showNextEpisodeButton:d,onNextEpisode:C,videoSources:i,selectedSource:s,selectedLink:n,onSourceChange:a,loadingVideo:g,skipIntervals:p,animeTitle:v,episodeNumber:w,mode:k,isTheaterMode:e,onTheaterModeToggle:E,anime4kEnabled:T,onAnime4kToggle:_,anime4kSupported:A,anime4kProfile:M,onAnime4kProfileChange:h,anime4kInitializing:P,anime4kError:y,videoDelayEnabled:R,onVideoDelayToggle:O,videoDelayMs:G,onVideoDelayChange:m,onCalibrateAvSync:f,fallbackChoice:B,onFallbackChoiceChange:Y,ambientSettings:F,onAmbientChange:W,children:L,overlays:Z,isInteractingExtra:x=!1,className:K,hideChrome:oe=!1})=>{const{state:I,actions:be}=r,{showSettings:H}=I,{setShowSettings:z}=be,u=is(r),b=yt.useRef(null),D=yt.useRef(null),X=yt.useRef(null);V(()=>{const me=Ue=>{b.current&&!b.current.contains(Ue.target)&&D.current&&!D.current.contains(Ue.target)&&H&&z(!1)};return H&&document.addEventListener("mousedown",me),()=>{document.removeEventListener("mousedown",me)}},[H,z]);const fe=I.showControls||H||I.isScrubbing,U=I.activeSubtitleTrack!=="off"?I.availableSubtitles.find(me=>me.lang===I.activeSubtitleTrack||me.label===I.activeSubtitleTrack):void 0,Te=t(Hr,{visible:fe,title:v,episode:w?`Episode ${w}`:void 0,mode:k,server:g?void 0:s?.sourceName,subtitles:g?void 0:U?.label||U?.lang,onBack:()=>window.history.back(),classes:{overlay:$.controlsOverlay,hidden:$.hidden,top:$.topControls,backBtn:$.backBtn,titleInfo:$.videoTitleInfo,title:$.animeTitle,episode:$.episodeNumber}}),We=!g&&!I.isBuffering&&I.duration>0?t(jr,{}):null,j=t(os,{player:r,handlers:u,visible:fe,skipIntervals:p,showNextEpisodeButton:d,onNextEpisode:C,isTheaterMode:e,onTheaterModeToggle:E,settingsBtnRef:D,timeDisplayRef:X}),ne=t(wr,{fallback:null,children:t(as,{ref:b,isOpen:H,onClose:()=>z(!1),videoSources:i,currentSource:s,currentLink:n,onSourceChange:a,subtitles:I.availableSubtitles,activeSubtitleTrack:I.activeSubtitleTrack,onSubtitleChange:u.handleSubtitleSelection,subtitleSettings:{fontSize:I.subtitleFontSize,position:I.subtitlePosition,bgOpacity:I.subtitleBgOpacity,bgColor:I.subtitleBgColor,textColor:I.subtitleTextColor,edge:I.subtitleEdge,bold:I.subtitleBold},onSubtitleSettingsChange:be.setSubtitleStyle,useNativeControls:!I.playbackLocked&&I.useNativeControls,onNativeControlsToggle:be.setUseNativeControls,anime4kEnabled:T,onAnime4kToggle:_,anime4kSupported:A,anime4kProfile:M,onAnime4kProfileChange:h,anime4kInitializing:P,anime4kError:y,videoDelayEnabled:R,onVideoDelayToggle:O,videoDelayMs:G,onVideoDelayChange:m,onCalibrateAvSync:f,isAutoSkipEnabled:I.isAutoSkipEnabled,onAutoSkipChange:me=>{be.setIsAutoSkipEnabled(me);try{ee.setItem("autoSkipEnabled",me.toString())}catch{}},isAutoplayEnabled:o,onAutoplayChange:l,fallbackChoice:B,onFallbackChoiceChange:Y,isTheaterMode:e,ambientSettings:F,onAmbientChange:W})}),Ce=H?t("div",{"data-speed-boost-ignore":"true",onClick:me=>me.stopPropagation(),children:ne}):null;return t(Yr,{engine:r.engine,topBar:Te,centerControls:We,bottomBar:!g&&I.duration>0?j:null,settingsPanel:Ce,overlays:Z,isInteracting:x||I.showSettings||I.showVolumeSlider,nativeControls:!I.playbackLocked&&I.useNativeControls,className:K,chromeDisabled:oe,children:L})},cs=({count:r=3})=>t("section",{className:Ae.section,children:[t("div",{className:Ae.header,children:t("button",{className:Ae.headerToggle,disabled:!0,children:[t("span",{className:Ae.title,children:t(it,{width:"60px",height:"1.2rem",variant:"text"})}),t(ye,{name:"chevron-down",style:{opacity:.3}})]})}),t("div",{className:Ae.list,children:Array.from({length:r}).map((o,l)=>t("div",{className:Ae.item,style:{pointerEvents:"none"},children:[t("div",{className:Ae.dragHandle,style:{opacity:.2},children:t(it,{width:"16px",height:"16px",variant:"rectangular"})}),t("div",{className:Ae.thumbnail,style:{overflow:"hidden",background:"transparent"},children:t(it,{width:"100%",height:"100%",variant:"rectangular"})}),t("div",{className:Ae.meta,children:[t(it,{width:"80%",height:"1.2rem",variant:"text",className:Ae.metaGap}),t(it,{width:"40%",height:"0.8rem",variant:"rectangular",style:{borderRadius:"var(--radius-sm)"}})]})]},l))})]}),us={soft:"Softsub",hard:"Hardsub",mixed:"Mixed"},ds={direct:"Direct",embed:"Embed",cookie:"Needs cookie"},ms=["direct","cookie","embed"],ps=({selectedProvider:r,onProviderChange:o,isAdult:l,options:d})=>{const i=(d&&d.length>0?d:[]).filter(s=>s.mature===(l===!0));return t("div",{className:ze.providerSelectContainer,children:[t("h4",{children:"Provider"}),t("select",{className:ze.providerSelect,value:r,onChange:s=>o(s.currentTarget.value),children:ms.map(s=>{const n=i.filter(a=>(a.tier??"direct")===s);return n.length===0?null:t("optgroup",{label:ds[s],children:n.map(a=>t("option",{value:a.id,children:a.sub?`${a.label} (${us[a.sub]})`:a.label},a.id))},s)})})]})},hs=({videoSources:r,selectedSource:o,selectedLink:l,onSourceChange:d,onLinkChange:C})=>{const i=Array.isArray(r)?r:[];if(i.length===0)return null;const s=o?.type==="iframe"&&(o.links?.length??0)>1;return t("div",{className:ze.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:ze.sourceButtons,children:i.map((n,a)=>t("button",{className:`${ze.sourceButton} ${o?.sourceName===n.sourceName?ze.active:""} `,onClick:()=>d(n),children:n.sourceName},`${n.sourceName}-${a}`))}),s&&t("select",{className:ze.sourceSelect,"aria-label":"Fallback embed quality",value:l?.link??o.links[0]?.link??"",onChange:n=>{const a=o.links.find(g=>g.link===n.currentTarget.value);a&&C(a)},children:o.links.map(n=>t("option",{value:n.link,children:n.resolutionStr},n.link))})]})},fs=yt.memo(hs,(r,o)=>r.selectedSource?.sourceName===o.selectedSource?.sourceName&&r.selectedLink?.link===o.selectedLink?.link&&r.videoSources===o.videoSources),vs={low:{sd:1.5,hd:1.3,fhd:1.25},balanced:{sd:2,hd:1.5,fhd:1.25},high:{sd:2.5,hd:2,fhd:1.5},denoise:{sd:1.5,hd:1.5,fhd:1.5}},gs={low:"ModeB",balanced:"ModeA",high:"ModeAA",denoise:"ModeC"},ys=5,bs=15e3,Ss=`
|
|
3
|
-
@group(0) @binding(0) var extTex: texture_external;
|
|
4
|
-
@group(0) @binding(1) var extSamp: sampler;
|
|
5
|
-
struct VSOut {
|
|
6
|
-
@builtin(position) pos: vec4f,
|
|
7
|
-
@location(0) uv: vec2f,
|
|
8
|
-
};
|
|
9
|
-
@vertex
|
|
10
|
-
fn vs(@builtin(vertex_index) idx: u32) -> VSOut {
|
|
11
|
-
var positions = array<vec2f, 6>(
|
|
12
|
-
vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(-1.0, 1.0),
|
|
13
|
-
vec2f(-1.0, 1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0)
|
|
14
|
-
);
|
|
15
|
-
var uvs = array<vec2f, 6>(
|
|
16
|
-
vec2f(0.0, 1.0), vec2f(1.0, 1.0), vec2f(0.0, 0.0),
|
|
17
|
-
vec2f(0.0, 0.0), vec2f(1.0, 1.0), vec2f(1.0, 0.0)
|
|
18
|
-
);
|
|
19
|
-
var out: VSOut;
|
|
20
|
-
out.pos = vec4f(positions[idx], 0.0, 1.0);
|
|
21
|
-
out.uv = uvs[idx];
|
|
22
|
-
return out;
|
|
23
|
-
}
|
|
24
|
-
@fragment
|
|
25
|
-
fn fs(@location(0) uv: vec2f) -> @location(0) vec4f {
|
|
26
|
-
return textureSampleBaseClampToEdge(extTex, extSamp, uv);
|
|
27
|
-
}
|
|
28
|
-
`;function ws({videoRef:r,canvasRef:o,profile:l="balanced",delayMs:d=0}){const[C,i]=se(!1),[s,n]=se(()=>{try{return ee.getItem("anime4kEnabled")==="true"}catch{return!1}}),[a,g]=se(!1),[p,v]=se(null),[w,k]=se(0),e=N(0),E=N(null),T=N(null),_=N(null),A=N(null),M=N(null),h=N(null),P=N(null),y=N(null),R=N(null),O=N(!1),G=N(-1),m=N(0),f=N(d);f.current=d;const B=N([]),Y=N(!1),F=N(!1),W=N(!1),L=N(null),Z=N(-1),x=N(-1),K=N(!1),oe=N(0);V(()=>{async function H(){if(typeof navigator>"u"||!navigator.gpu){i(!1);return}try{const z=await navigator.gpu.requestAdapter();i(!!z)}catch{i(!1)}}H()},[]),V(()=>{if(!s||!C)return;let H=!1;const z=++e.current,u=U=>{if(U)try{U.close()}catch{}},b=()=>{for(const U of B.current)u(U.bitmap);B.current=[]},D=U=>Math.max(8,Math.min(40,Math.ceil(U/16.7)+4));function X(){R.current!==null&&(cancelAnimationFrame(R.current),R.current=null)}async function fe(){let U=r.current;const Te=o.current;if(!U||!Te||e.current!==z)return;const We=performance.now()+bs;for(;(!U||U.videoWidth===0)&&performance.now()<We;){if(await new Promise(ae=>requestAnimationFrame(ae)),H||e.current!==z)return;U=r.current}if(!U||U.videoWidth===0){!H&&e.current===z&&(v("Timed out waiting for video metadata"),g(!1),n(!1));return}const j=U.videoWidth,ne=U.videoHeight,Ce=Math.max(j,ne),me=window.innerWidth,Ue=window.innerHeight,He=Math.max(me,Ue),je=Ce<He?He/Ce:1,Ye=vs[l],St=Ce<=480?Ye.sd:Ce<=720?Ye.hd:Ce<=1080?Ye.fhd:1,Xe=Math.min(St,je);Te.width=Math.round(j*Xe),Te.height=Math.round(ne*Xe),g(!0),v(null),m.current=0,G.current=-1,Z.current=-1,x.current=-1,K.current=!1,oe.current=0,b(),O.current=!1;try{let ae=function(){H||e.current!==z||(X(),R.current=requestAnimationFrame(()=>{we()}))};const{ModeA:wt,ModeB:ct,ModeC:ut,ModeAA:Be}=await qt(async()=>{const{ModeA:J,ModeB:pe,ModeC:ce,ModeAA:ge}=await import("./index-BOKlZEHq.js").then(re=>re.i);return{ModeA:J,ModeB:pe,ModeC:ce,ModeAA:ge}},[]);if(H||e.current!==z)return;if(!navigator.gpu)throw new Error("WebGPU not available");const Je=await navigator.gpu.requestAdapter();if(H||e.current!==z)return;if(!Je)throw new Error("No GPU adapter found");const Q=await Je.requestDevice();if(!Q)throw new Error("Failed to get GPU device");if(H||e.current!==z){Q.destroy();return}E.current=Q;const De=Te.getContext("webgpu");if(!De)throw new Error("Failed to get WebGPU context");T.current=De;const le=navigator.gpu.getPreferredCanvasFormat();De.configure({device:Q,format:le,alphaMode:"premultiplied"});const ve=Q.createTexture({size:[j,ne],format:"rgba16float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),dt=gs[l],$e=Math.round(j*Xe),Qe=Math.round(ne*Xe),Ve=(()=>{switch(dt){case"ModeB":return new ct({device:Q,inputTexture:ve,nativeDimensions:{width:j,height:ne},targetDimensions:{width:$e,height:Qe}});case"ModeC":return new ut({device:Q,inputTexture:ve,nativeDimensions:{width:j,height:ne},targetDimensions:{width:$e,height:Qe}});case"ModeAA":return new Be({device:Q,inputTexture:ve,nativeDimensions:{width:j,height:ne},targetDimensions:{width:$e,height:Qe}});default:return new wt({device:Q,inputTexture:ve,nativeDimensions:{width:j,height:ne},targetDimensions:{width:$e,height:Qe}})}})(),et=Ve.getOutputTexture(),tt=Q.createSampler({magFilter:"linear",minFilter:"linear"}),Fe=Q.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
|
-
`}),rt=Q.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),nt=Q.createRenderPipeline({layout:Q.createPipelineLayout({bindGroupLayouts:[rt]}),vertex:{module:Fe,entryPoint:"vs"},fragment:{module:Fe,entryPoint:"fs",targets:[{format:le}]},primitive:{topology:"triangle-list"}}),Et=Q.createBindGroup({layout:rt,entries:[{binding:0,resource:et.createView()},{binding:1,resource:tt}]});try{const J=Q.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,externalTexture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),pe=Q.createShaderModule({code:Ss}),ce=Q.createRenderPipeline({layout:Q.createPipelineLayout({bindGroupLayouts:[J]}),vertex:{module:pe,entryPoint:"vs"},fragment:{module:pe,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-list"}});L.current={pipeline:ce,layout:J,inputView:ve.createView()}}catch{L.current=null}_.current=Ve,A.current=ve,M.current=et,h.current=nt,P.current=tt,y.current=rt,F.current=!1,W.current=!1;async function kt(){const J=L.current;if(!J||F.current)return!1;const pe=r.current;if(!pe)return!1;const ce=!W.current;ce&&Q.pushErrorScope("validation");try{const ge=Q.importExternalTexture({source:pe}),re=Q.createBindGroup({layout:J.layout,entries:[{binding:0,resource:ge},{binding:1,resource:tt}]}),Ee=Q.createCommandEncoder(),Re=Ee.beginRenderPass({colorAttachments:[{view:J.inputView,loadOp:"load",storeOp:"store"}]});Re.setPipeline(J.pipeline),Re.setBindGroup(0,re),Re.draw(6),Re.end(),Q.queue.submit([Ee.finish()])}catch{return F.current=!0,L.current=null,!1}if(ce){const ge=await Q.popErrorScope().catch(()=>null);if(ge)return console.warn("[anime4k] blit probe failed:",ge.message),F.current=!0,L.current=null,!1;W.current=!0}return!0}g(!1);async function we(){if(H||e.current!==z||!De)return;const J=r.current;if(!J||J.videoWidth===0){ae();return}if(J!==U||J.videoWidth!==j||J.videoHeight!==ne){k(re=>re+1);return}if(J.paused||J.ended||document.hidden||J.readyState<HTMLMediaElement.HAVE_CURRENT_DATA){ae();return}const pe=J.getVideoPlaybackQuality().totalVideoFrames;if(pe===x.current){ae();return}if(O.current){ae();return}const ce=J.currentTime;(J.seeking||Z.current>=0&&Math.abs(ce-Z.current)>.5)&&(b(),K.current=!1,oe.current=0,x.current=-1),Z.current=ce;const ge=Math.max(0,f.current||0);ge>oe.current&&(K.current=!1),O.current=!0;try{const re=performance.now();let Ee=null,Re=!1;if(ge<=0){B.current.length>0&&b(),K.current=!1,oe.current=0;let Se=!1;if(!Y.current)try{Q.queue.copyExternalImageToTexture({source:J},{texture:ve},[j,ne]),x.current=pe,Se=!0}catch(ue){if(ue instanceof TypeError)Y.current=!0;else throw ue}if(!Se&&!F.current&&L.current&&await kt()&&(x.current=pe,Se=!0),!Se){const ue=await createImageBitmap(J);x.current=pe,Q.queue.copyExternalImageToTexture({source:ue},{texture:ve},[j,ne]),u(ue)}}else{const Se=await createImageBitmap(J);x.current=pe;const ue=B.current;ue.push({bitmap:Se,capture:re});const mt=D(ge);for(;ue.length>mt;)u(ue.shift()?.bitmap);let st=-1;for(let he=ue.length-1;he>=0;he--)if(re-ue[he].capture>=ge){st=he;break}if(st!==-1){for(let pt=0;pt<st;pt++)u(ue.shift()?.bitmap);const he=ue.shift();he?(Ee=he.bitmap,K.current=!0,oe.current=ge):(Ee=Se,Re=!0)}else if(!K.current)Ee=Se,Re=!0;else{const he=ue.shift();Ee=he?he.bitmap:Se,he||(Re=!0)}if(!Ee){O.current=!1,ae();return}Q.queue.copyExternalImageToTexture({source:Ee},{texture:ve},[j,ne]),Re||u(Ee)}const Me=Q.createCommandEncoder();await Ve.pass(Me);const Ke=Me.beginRenderPass({colorAttachments:[{view:De.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});Ke.setPipeline(nt),Ke.setBindGroup(0,Et),Ke.draw(6),Ke.end(),Q.queue.submit([Me.finish()]),G.current=pe,m.current=0,Q.queue.onSubmittedWorkDone().then(()=>{e.current===z&&(O.current=!1)})}catch(re){if(O.current=!1,m.current+=1,m.current>=ys&&!H&&e.current===z){console.error(re),v(re instanceof Error?re.message:"Render error"),n(!1);return}}ae()}ae()}catch(ae){!H&&e.current===z&&(T.current?.unconfigure(),E.current?.destroy(),E.current=null,T.current=null,v(ae instanceof Error?ae.message:"Failed to initialize upscaler"),g(!1),n(!1))}}return fe(),()=>{H=!0,e.current+=1,X(),b(),T.current?.unconfigure(),A.current&&(A.current.destroy(),A.current=null),M.current&&(M.current.destroy(),M.current=null),E.current&&(E.current.destroy(),E.current=null),_.current=null,h.current=null,P.current=null,y.current=null,L.current=null,T.current=null,O.current=!1}},[s,C,r,o,l,w]);const I=q(H=>{n(H);try{ee.setItem("anime4kEnabled",String(H))}catch{}},[]),be=q(()=>{n(H=>{const z=!H;try{ee.setItem("anime4kEnabled",String(z))}catch{}return z})},[]);return{isWebGPUSupported:C,isEnabled:s,isInitializing:a,error:p,toggle:be,setEnabled:I}}function Es({videoRef:r,episodeKey:o,isEnabled:l,isSupported:d,mediaReady:C,isIframeSource:i,setEnabled:s}){const n=N(null),a=N(!1),g=N(!1),p=N(s);p.current=s,V(()=>{const v=n.current;n.current=o,!(v===null||v===o)&&(!l||!d||(a.current=!0,g.current=!1,p.current(!1)))},[o,l,d]),V(()=>{if(!a.current)return;if(l){g.current&&(a.current=!1);return}if(g.current=!0,!C)return;if(i){a.current=!1,p.current(!0);return}const v=r.current;if(!v)return;let w,k=!1;const e=()=>{k||(k=!0,a.current=!1,p.current(!0))};if(v.readyState>=2)return w=window.setTimeout(e,500),()=>window.clearTimeout(w);const E=()=>{window.setTimeout(e,500)};return v.addEventListener("canplay",E,{once:!0}),v.addEventListener("playing",E,{once:!0}),w=window.setTimeout(e,5e3),()=>{window.clearTimeout(w),v.removeEventListener("canplay",E),v.removeEventListener("playing",E)}},[l,C,i,r])}const ks=()=>ee.getItem("preferredMode")==="dub"?"dub":"sub",Ts=/^[a-z0-9-]+$/i,Yt=r=>r?"preferredProviderMature":"preferredProvider",Xt=r=>{const o=ee.getItem(Yt(r));return o&&Ts.test(o)?o:null},Jt=(r,o)=>{ee.setItem(Yt(o),r)},Cs=()=>Xt(!1)??"megaplay",Rs=()=>({showMeta:{},episodes:[],watchedEpisodes:[],watchlistStatus:null,showCombinedDetails:!1,currentMode:ks(),inWatchlist:!1,videoSources:[],selectedSource:null,selectedLink:null,isAutoplayEnabled:gn(),showResumeModal:!0,resumeProgressPending:!0,resumeTime:0,resumeDuration:0,skipIntervals:[],selectedProvider:Cs(),loadingShowData:!0,loadingVideo:!1,error:null,showCookieModal:!1,cookieProvider:null});function Ms(r,o){switch(o.type){case"SET_STATE":return{...r,...o.payload};case"SET_MODE":return{...r,currentMode:o.payload,videoSources:[],selectedSource:null,selectedLink:null};case"SET_PROVIDER":return{...r,selectedProvider:o.payload};default:return r}}async function Kt(r,o,l,d,C=!1){if(!r||!o)throw new Error("Missing params");try{const[i,s,n,a,g]=await Promise.all([de.data.video.query({showId:r,episodeNumber:o,mode:l.currentMode,provider:l.selectedProvider}).catch(y=>{const R=y.data?.cause;return y.message==="AUTH_REQUIRED"&&R?.provider==="mkissa"&&d({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:"mkissa"}}),null}),de.progress.getEpisode.query({showId:r,episodeNumber:o}).catch(()=>null),de.settings.getByKey.query({key:"preferredSource"}).catch(()=>null),de.settings.getByKey.query({key:"preferredLink"}).catch(()=>null),de.data.skipTimes.query({showId:r,episodeNumber:o}).catch(()=>[])]),p=n?.value,v=i?.filter(y=>{const R=y.sourceName.toLowerCase();return l.currentMode==="dub"?R.includes("eng")||R.includes("dub"):R.includes("jpn")||R.includes("sub")||!R.includes("eng")&&!R.includes("dub")})??[],w=v.length>0?v:i??[];let k=w.length>0?w[0]:null;if(p){const y=w.find(R=>R.sourceName===p);y&&(k=y)}const e=a?.value,E=y=>{const R=/(\d{3,4})/.exec(y||"");return R?parseInt(R[1],10):0},T=k&&k.links.length>0?(e?k.links.find(y=>y.resolutionStr===e):null)??(()=>{const y=E(e);if(!y)return null;let R=null,O=1/0;for(const G of k.links){const m=E(G.resolutionStr),f=Math.abs(m-y);m>0&&f<O&&(O=f,R=G)}return R})()??[...k.links].sort((y,R)=>(parseInt(R.resolutionStr)||0)-(parseInt(y.resolutionStr)||0))[0]:null,_=s?.currentTime||0,A=s?.duration||0,M=_,P=(Array.isArray(g)?g:g?.results||[]).map(y=>({skip_id:y.skip_id||"",skip_type:y.skip_type||"",start_time:y.interval?.start_time??y.start_time??0,end_time:y.interval?.end_time??y.end_time??0})).filter(y=>y.end_time>0);return(!i||i.length===0)&&(C||ke.error(`No video sources found for ${l.selectedProvider}`)),{videoSources:i,selectedSource:k,selectedLink:T,resumeTime:M,resumeDuration:A,showResumeModal:M>5&&!lt(M,A)&&k?.type!=="iframe",skipIntervals:P,fetchedEpisodeNumber:o}}catch(i){const s=i;if(s.message==="AUTH_REQUIRED")return d({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:s.provider}}),{videoSources:[],selectedSource:null,selectedLink:null,resumeTime:0,resumeDuration:0,showResumeModal:!1,skipIntervals:[],fetchedEpisodeNumber:o};throw i}}const Ps=(r,o,l,d)=>{const[C,i]=kr(Ms,l,u=>({...Rs(),showMeta:u?.name?{name:u.name,thumbnail:u.thumbnail,nativeName:u.nativeName,englishName:u.englishName,names:{romaji:u.name||u.englishName,english:u.englishName||u.name,native:u.nativeName}}:{}})),s=d?.watchSelection,n=xe(()=>s?{...C,selectedProvider:s.provider,currentMode:s.mode}:C,[C,s]),a=Gt(),g=Pr(),p=N(null),v=N(null),{options:w}=jt(),k=xe(()=>w.filter(u=>(u.kind??"anime")==="anime"),[w]),e=o||n.initialEpisode,E=`${r}:${e}`,T=N(E);V(()=>{T.current!==E&&(T.current=E,i({type:"SET_STATE",payload:{selectedSource:null,selectedLink:null}}))},[E,i]),V(()=>{!s&&r&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(r)&&n.selectedProvider!=="animepahe"&&p.current!==r&&(p.current=r,i({type:"SET_PROVIDER",payload:"animepahe"}))},[r,n.selectedProvider,s]);const{data:_,isLoading:A,error:M}=kn(r),{data:h}=Ut({queryKey:[ie.playerData,r,n.currentMode,n.selectedProvider],queryFn:async()=>{if(!r)throw new Error("No showId");const u=async()=>{try{const U=await de.data.episodes.query({showId:r,mode:n.currentMode,provider:n.selectedProvider}).catch(()=>null);if(U?.episodes?.length)return U}catch{}return null},[b,D,X]=await Promise.all([u(),de.watchlist.check.query({showId:r}).catch(()=>({inWatchlist:!1,status:null})),de.progress.getWatchedEpisodes.query({showId:r}).catch(()=>[])]),fe=b?.episodes?b.episodes.sort((U,Te)=>parseFloat(U)-parseFloat(Te)):[];return{description:b?.description||"",episodes:fe,inWatchlist:D.inWatchlist,watchlistStatus:D.status??null,watchedEpisodes:X}},enabled:!!r});V(()=>{!o&&h?.episodes&&h.episodes.length>0&&!o&&i({type:"SET_STATE",payload:{initialEpisode:h.episodes[0]}})},[h,o]),V(()=>{if(s||_?.isAdult===void 0||v.current===r)return;const u=_.isAdult===!0,b=k.filter(X=>X.mature===u);if(b.length===0||k.find(X=>X.id===n.selectedProvider)?.mature===u)return;const D=Xt(u);v.current=r??null,i({type:"SET_PROVIDER",payload:b.find(X=>X.id===D)?.id??b[0].id})},[_?.isAdult,n.selectedProvider,r,k,s]),V(()=>{if(s||!r||!/^dango-mt-\d+$/.test(r)||v.current===`temp:${r}`)return;const u=_?.provider;u&&(v.current=`temp:${r}`,u!==n.selectedProvider&&i({type:"SET_PROVIDER",payload:u}))},[r,_,n.selectedProvider,s]);const{data:P,isLoading:y,isFetching:R,error:O}=Ut({queryKey:[ie.videoSources,r,e,n.selectedProvider,n.currentMode],queryFn:()=>Kt(r,e,n,i),enabled:!!r&&!!e&&!(n.showMeta?.isAdult===!0&&!d?.hasMatureConsent)}),{mutateAsync:G}=gt({mutationFn:async({wasIn:u,showMeta:b})=>{if(!r)throw new Error("Missing showId");if(u)await de.watchlist.remove.mutate({id:r});else{const D=b.name||b.names?.romaji;if(!D)throw new Error("Missing show name");await de.watchlist.add.mutate({id:r,name:D,thumbnail:b.thumbnail,nativeName:b.names?.native,englishName:b.names?.english,type:b.type,isAdult:b.isAdult})}return!u},onSuccess:u=>{ke.success(u?"Added to watchlist":"Removed from watchlist"),a.invalidateQueries({queryKey:[ie.playerData,r]}),a.invalidateQueries({queryKey:[ie.showData,r]}),a.invalidateQueries({queryKey:[ie.watchlist]})},onError:u=>ke.error(u instanceof Error?u.message:"Failed to update watchlist")}),m=q(async()=>{!r||!_||await G({wasIn:!!h?.inWatchlist,showMeta:_})},[r,_,h?.inWatchlist,G]),f=q(async u=>{try{await de.settings.set.mutate({key:"preferredSource",value:u})}catch(b){console.error(b)}},[]),B=q(async u=>{try{await de.settings.set.mutate({key:"preferredLink",value:u})}catch(b){console.error(b)}},[]),{mutateAsync:Y,isPending:F}=gt({mutationFn:async({status:u})=>{if(!r)throw new Error("Missing showId");if(h?.inWatchlist)return await de.watchlist.setStatus.mutate({id:r,status:u}),u;const b=_,D=b?.name||b?.names?.romaji;if(!b||!D)throw new Error("Missing show name");return await de.watchlist.add.mutate({id:r,name:D,thumbnail:b.thumbnail,nativeName:b.names?.native,englishName:b.names?.english,type:b.type,isAdult:b.isAdult,status:u}),u},onSuccess:u=>{i({type:"SET_STATE",payload:{inWatchlist:!0,watchlistStatus:u}}),ke.success(`Moved to ${u}`),a.invalidateQueries({queryKey:[ie.showData,r]}),a.invalidateQueries({queryKey:[ie.watchlist]}),a.invalidateQueries({queryKey:[ie.continueWatching]})},onError:()=>ke.error("Failed to update watchlist status")}),W=q(async()=>{await Y({status:"Completed"})},[Y]),{mutateAsync:L,isPending:Z}=gt({mutationFn:async({episodeNumber:u,duration:b,showMeta:D,episodes:X})=>{await de.progress.updateProgress.mutate({showId:r??"",episodeNumber:u,currentTime:b,duration:b,showName:D.name,showThumbnail:D.thumbnail,nativeName:D.names?.native,englishName:D.names?.english,genres:D.genres?.map(fe=>fe.name),popularityScore:Nr(D.score)??void 0,type:D.type,status:D.status,episodeCount:X.length,isAdult:D.isAdult})},onSuccess:(u,b)=>{ke.success(`Episode ${b.episodeNumber} marked as watched`),a.invalidateQueries({queryKey:[ie.playerData,r]}),a.invalidateQueries({queryKey:[ie.showMeta,r]}),a.invalidateQueries({queryKey:[ie.videoSources,r,b.episodeNumber]}),a.invalidateQueries({queryKey:[ie.continueWatching]}),a.invalidateQueries({queryKey:[ie.thisWeekSchedule]}),a.invalidateQueries(g.continueWatching.pathFilter())},onError:()=>ke.error("Failed to mark episode as watched")}),x=q(async(u,b)=>{!r||!_||await L({episodeNumber:u,duration:b,showMeta:_,episodes:h?.episodes||[]})},[r,_,h?.episodes,L]),{mutateAsync:K,isPending:oe}=gt({mutationFn:async({episodeNumber:u})=>{await de.progress.resetProgress.mutate({showId:r??"",episodeNumber:u})},onSuccess:()=>{ke.success("Episode progress reset"),a.invalidateQueries({queryKey:[ie.playerData,r]}),a.invalidateQueries({queryKey:[ie.showMeta,r]}),a.invalidateQueries({queryKey:[ie.continueWatching]})},onError:()=>ke.error("Failed to reset progress")}),I=q(async u=>{r&&await K({episodeNumber:u})},[r,K]),be=q(async()=>{i({type:"SET_STATE",payload:{showCombinedDetails:!n.showCombinedDetails}})},[n.showCombinedDetails]),H=xe(()=>{const u=M||O,b=u?u.message:null,D=b==="AUTH_REQUIRED"?null:b,X=P&&P.fetchedEpisodeNumber===e?P:null,fe=!!P&&!X,U=s?X?.videoSources?.find(j=>j.sourceName===s.source&&j.type!=="iframe"&&j.links.some(ne=>ne.hls))??null:null,We=(n.selectedSource?.sourceName===U?.sourceName?U?.links.find(j=>j.hls&&j.link===n.selectedLink?.link):null)??U?.links.filter(j=>j.hls).slice().sort((j,ne)=>(parseInt(ne.resolutionStr)||0)-(parseInt(j.resolutionStr)||0))[0]??null;return{...n,currentEpisode:e,showMeta:{...n.showMeta||{},..._||{}},episodes:h?.episodes||[],watchedEpisodes:h?.watchedEpisodes||[],inWatchlist:!!h?.inWatchlist,watchlistStatus:h?.watchlistStatus??n.watchlistStatus??null,videoSources:X?.videoSources||[],selectedSource:s?U:n.selectedSource||X?.selectedSource||null,selectedLink:s?We:n.selectedLink||X?.selectedLink||null,resumeTime:s?0:X?.resumeTime||0,resumeDuration:X?.resumeDuration||0,resumeProgressPending:R,showResumeModal:!s&&n.showResumeModal&&(X?.showResumeModal??!1),skipIntervals:X?.skipIntervals||[],loadingShowData:A,loadingVideo:y||fe,error:D,fetchedEpisodeNumber:X?.fetchedEpisodeNumber}},[n,_,h,P,A,y,R,M,O,e,s]),z=q((u,b)=>{const D=b||r;if(!D||!u||D===r&&u===e)return;const fe=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(D)&&n.selectedProvider!=="animepahe"?"animepahe":n.selectedProvider,U=["video-sources",D,u,fe,n.currentMode];a.getQueryState(U)?.status!=="success"&&a.prefetchQuery({queryKey:U,queryFn:()=>Kt(D,u,{selectedProvider:fe,currentMode:n.currentMode},i,!0),staleTime:300*1e3,gcTime:1800*1e3})},[r,e,a,n,i]);return{state:H,dispatch:i,toggleWatchlist:m,moveToCompleted:W,setPreferredSource:f,setPreferredLink:B,handleToggleDetails:be,markEpisodeWatched:x,resetEpisodeProgress:I,prefetchEpisodeSources:z,isMarkingWatched:Z,isResettingProgress:oe,isUpdatingWatchlistStatus:F}};function Ns({onPrevious:r,onNext:o,onToggleTheater:l,flashControls:d}){V(()=>{const C=i=>{i.defaultPrevented||i.ctrlKey||i.metaKey||i.altKey||i.repeat||i.target.closest('input, textarea, button, select, a, [role="button"], [role="slider"], [contenteditable="true"]')||(["arrowup","arrowdown","arrowleft","arrowright"].includes(i.key.toLowerCase())&&d(),i.key.toLowerCase()==="n"&&o(),i.key.toLowerCase()==="p"&&r(),i.key.toLowerCase()==="t"&&l())};return document.addEventListener("keydown",C),()=>{document.removeEventListener("keydown",C)}},[d,o,r,l])}const at=(r,o,l)=>r.showId===o||!!l&&r.showId===l;function _s({testClipActive:r,selectedSourceType:o,onEnded:l,queue:d,removeFromQueue:C,showId:i,showMetaId:s,showStatus:n,currentEpisode:a,isAutoplayEnabled:g,nextEpisode:p,previousEpisode:v,navigate:w,invalidateContinueWatching:k,dispatch:e}){const[E,T]=se(!1),[_,A]=se(null),[M,h]=se(null),P=N(C);P.current=C;const y=N(!1),R=Ht(n);V(()=>{y.current=!1,T(!1)},[i,a]);const O=q(()=>{if(r||y.current)return;y.current=!0,l();const W=d.find(L=>at(L,i,s)&&L.episodeNumber===a);if(d.length>0){const L=d.findIndex(x=>at(x,i,s)&&x.episodeNumber===a),Z=L>=0?d[L+1]||null:d[0];h({nextItem:Z,playedItem:W||null}),A(2);return}if(W&&P.current({showId:W.showId,episodeNumber:W.episodeNumber}),g&&p){k(),w(`/watch/${i}/${p}`);return}!p&&R&&T(!0)},[l,w,d,i,s,a,p,g,k,r,R]),G=q(()=>{if(d.length===0)return;l();const W=d.find(x=>at(x,i,s)&&x.episodeNumber===a),L=d.findIndex(x=>at(x,i,s)&&x.episodeNumber===a),Z=L>=0?d[L+1]||null:d[0];W&&C({showId:W.showId,episodeNumber:W.episodeNumber}),Z?w(`/watch/${Z.showId}/${Z.episodeNumber}`):!p&&R&&T(!0)},[l,w,d,C,i,s,a,p,R]),m=q(()=>{p&&(k(),w(`/watch/${i}/${p}`)),T(!1),e({type:"SET_STATE",payload:{showResumeModal:!1}})},[p,w,i,e,k]),f=q(()=>{d.length>0?G():p?m():ke.error("No next episode available")},[d.length,G,m,p]),B=q(()=>T(!1),[]),Y=q(()=>{h(null),A(null)},[]),F=q(()=>{v&&w(`/watch/${i}/${v}`)},[v,w,i]);return V(()=>{const W=L=>{L.origin===window.location.origin&&o==="iframe"&&L.data?.type==="ANI_WEB_MEDIA_ENDED"&&O()};return window.addEventListener("message",W),()=>window.removeEventListener("message",W)},[O,o]),V(()=>{if(!M||_===null)return;if(_<=0){const{nextItem:L,playedItem:Z}=M;h(null),A(null),Z&&P.current({showId:Z.showId,episodeNumber:Z.episodeNumber}),L?w(`/watch/${L.showId}/${L.episodeNumber}`):!p&&R&&T(!0);return}const W=window.setTimeout(()=>{A(L=>L===null?null:L-1)},1e3);return()=>window.clearTimeout(W)},[M,_,w,p,R]),{showCompleteModal:E,queueCountdown:_,pendingQueueTransition:M,handleQueueTransition:G,handleNextEpisode:m,handleNShortcut:f,handlePreviousEpisode:F,handlePlaybackFinished:O,closeCompleteModal:B,cancelQueueTransition:Y}}function xs({videoRef:r,queue:o,showId:l,showMetaId:d,currentEpisode:C,selectedSource:i,hasNextEpisode:s,nextEpisode:n,prefetchEpisodeSources:a,matchesQueueItem:g}){const[p,v]=se(!1),w=N(a);w.current=a;const k=N("");V(()=>{v(!1)},[C]);const e=q(()=>{const E=r.current;if(!E||i?.type==="iframe")return;const T=E.duration,_=E.currentTime;if(!T||Number.isNaN(T)){v(!1);return}if(T-_<=60){const A=o.findIndex(P=>g(P,l,d)&&P.episodeNumber===C),M=o.length>0?A>=0?o[A+1]||null:o[0]:null,h=M?`${M.showId}:${M.episodeNumber}`:s?`${l}:${n}`:"";h&&k.current!==h&&(k.current=h,M?w.current(M.episodeNumber,M.showId):w.current(n??""))}v(s&<(_,T))},[r,i,o,l,d,C,s,n,g]);return{showNextEpisodePrompt:p,handleThresholds:e}}const Pt="fallbackChoice";function As(){try{const r=ee.getItem(Pt);return r==="iframe"||r==="retry"?r:null}catch{return null}}function Ls(r){try{r===null?ee.removeItem(Pt):ee.setItem(Pt,r)}catch{}}function Bs({showId:r,episodeNumber:o,currentMode:l,selectedProvider:d,selectedSourceType:C,videoSources:i,isAdult:s,providerOrder:n,matureProviders:a,setPreferredSource:g,dispatch:p,showControls:v}){const w=N(!1),k=N([]),e=N(!1),[E,T]=se(null),[_,A]=se(!1),[M,h]=se(!1),[P,y]=se(()=>As()??"ask"),R=q(x=>{y(x),Ls(x==="ask"?null:x)},[]),O=N(P);V(()=>{O.current=P},[P]);const G=N(i);G.current=i;const m=q(()=>{w.current=!1,k.current=[],e.current=!1,T(null),A(!1)},[]);V(()=>{m()},[m,r,o]);const f=q(x=>{if(w.current)return;w.current=!0;const K=x.links[0];g(x.sourceName),p({type:"SET_STATE",payload:{selectedSource:x,selectedLink:K}}),T(null)},[p,g]),B=q(()=>{const K=G.current.find(oe=>oe.type==="iframe");return K?.links?.length?K:null},[]),Y=q(async()=>{const x=n.filter(K=>{if(k.current.includes(K))return!1;const oe=a.has(K);return s===void 0?!0:oe===s});A(!0);try{for(const K of x){k.current.push(K);let oe=null;try{oe=await de.data.video.query({showId:r,episodeNumber:o,mode:l,provider:K})}catch{continue}const I=(oe??[]).filter(z=>{const u=z.sourceName.toLowerCase();return l==="dub"?u.includes("eng")||u.includes("dub"):u.includes("jpn")||u.includes("sub")||!u.includes("eng")&&!u.includes("dub")});if((I.length>0?I:oe??[]).find(z=>z.type!=="iframe"&&z.links?.length)){k.current=[d],e.current=!1,p({type:"SET_STATE",payload:{selectedProvider:K,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),Jt(K,s===!0),T(null),ke.success(`Switched to ${K} (direct stream)`);return}}T({retryFailed:!0}),ke.error("No working direct stream found on other providers")}finally{A(!1)}},[r,o,l,s,d,p,n,a]),F=q(()=>{if(w.current||e.current||C!=="player")return;const x=B();if(!x)return;k.current.includes(d)||k.current.push(d);const K=O.current;if(K==="iframe"){f(x);return}if(K==="retry"){Y();return}v(!0),T({retryFailed:!1})},[C,d,B,f,Y,v]),W=q(()=>{e.current=!0,T(null),h(!1)},[]),L=q(()=>{M&&R("iframe");const x=B();x?f(x):T(null)},[M,R,B,f]),Z=q(()=>{M&&R("retry"),Y()},[M,R,Y]);return{fallbackPrompt:E,isRetryingProvider:_,rememberFallbackChoice:M,setRememberFallbackChoice:h,fallbackChoice:P,updateFallbackChoice:R,dismissFallbackPrompt:W,chooseIframeFallback:L,chooseProviderRetry:Z,handleVideoSourceError:F,resetFallback:m}}function Ds({engine:r,videoRef:o,selectedSource:l,selectedLink:d,loadingVideo:C,testClipActive:i,resumeTime:s,resumeDuration:n=0,showResumeModal:a,disabled:g=!1,startOver:p=!1,resumeAt:v=null,calibReturnRef:w,setAvailableSubtitles:k,setActiveSubtitleTrack:e,onFatalError:E}){const T=N(null),_=N(s),A=N(n),M=N(a),h=N(E);return h.current=E,V(()=>{_.current=s,A.current=n,M.current=a},[s,n,a]),V(()=>{if(g){r.unload();return}const P=o.current;if(!P)return;for(;P.firstChild;)P.removeChild(P.firstChild);if(i)return r.loadSource({url:"/av-sync-test.mp4"},{autoPlay:!0});if(C||!l||!d||l.type==="iframe"){r.unload();return}p?T.current=0:w.current!=null?(T.current=w.current,w.current=null):T.current===null&&v!=null?T.current=v:T.current===null&&_.current>5&&!M.current&&!lt(_.current,A.current)?T.current=_.current:T.current===null&&M.current&&(T.current=0);let y=d.link;if(y.startsWith("/api/proxy")||(y=`/api/proxy?url=${encodeURIComponent(y)}`,d.headers?.Referer&&(y+=`&referer=${encodeURIComponent(d.headers.Referer)}`)),l.subtitles){const G=ee.getItem("playerSubtitlesEnabled")!=="false";let m=null;try{m=ee.getItem("playerLastSubtitle")}catch{}const f=l.subtitles.map(F=>({...F,lang:F.lang||F.language||F.label||"en",label:F.label||F.lang||F.language||"en"})),B=Nt(f,{lastKey:m,enabled:G}),Y=B>=0?f[B]:null;f.forEach(F=>{const W=document.createElement("track");W.kind="subtitles",W.label=F.label,W.srclang=F.lang||"en";const L=F.src??F.url;if(L){let Z=`/api/subtitle-proxy?url=${encodeURIComponent(L)}`;const x=d.headers?.Referer;x&&(Z+=`&referer=${encodeURIComponent(x)}`),W.src=Z}Y&&F.label===Y.label&&F.lang===Y.lang&&(W.default=!0),P.appendChild(W)}),G||e("off"),k(f)}const R=T.current??0;T.current=null;const O=document.body.classList.contains("low-end");return r.loadSource({url:y,hls:d.hls,dash:d.dash},{initialTime:R,autoPlay:p||v!=null||!(M.current&&_.current>5)&&!lt(_.current,A.current),hlsConfig:{maxBufferLength:O?15:30,maxMaxBufferLength:O?30:60,maxBufferSize:(O?25:60)*1e3*1e3,startLevel:-1},onHls:(G,m)=>{if(!l.subtitles?.length)return;const f=()=>{G.subtitleTrack!==-1&&(G.subtitleTrack=-1)};G.on(m.Events.SUBTITLE_TRACK_SWITCH,f),f()},onDash:G=>{const m=d.headers?.Referer;m&&G.addRequestInterceptor(f=>{const B=f?.url??"";if(!B||B.includes("/api/proxy?")||B.includes("/api/subtitle-proxy?")||B.includes("/api/tv/stream-proxy?"))return f;try{const F=new URL(B);if(F.protocol!=="http:"&&F.protocol!=="https:")return f}catch{return f}const Y=`/api/proxy?url=${encodeURIComponent(B)}&referer=${encodeURIComponent(m)}`;return{...f,url:Y}})},onError:()=>h.current()})},[r,l,d,o,w,C,i,g,p,v,e,k]),{seekToTimeRef:T}}function $s({videoRef:r,availableSubtitles:o,activeSubtitleTrack:l,setAvailableSubtitles:d,setActiveSubtitleTrack:C}){V(()=>{const i=r.current;if(!i)return;const s=()=>{const n=Array.from(i.textTracks).map(a=>({label:a.label,lang:a.language==="undefined"?"":a.language,src:void 0,mode:a.mode}));d(n)};return i.textTracks.addEventListener("addtrack",s),i.textTracks.addEventListener("removetrack",s),s(),()=>{i.textTracks.removeEventListener("addtrack",s),i.textTracks.removeEventListener("removetrack",s)}},[r,d]),V(()=>{if(l===null&&o.length>0&&ee.getItem("playerSubtitlesEnabled")!=="false"){let i=null;try{i=ee.getItem("playerLastSubtitle")}catch{}const s=Nt(o,{lastKey:i,enabled:!0});if(s<0){C("off");return}const n=o[s];C(n.label||n.lang)}},[l,o,C]),V(()=>{const i=r.current;if(!i||o.length===0)return;const s=l;if(!(ee.getItem("playerSubtitlesEnabled")!=="false")||s==="off"||s===null){Array.from(i.textTracks).forEach(g=>{g.mode="hidden"});return}let a=!1;if(Array.from(i.textTracks).forEach(g=>{const v=(g.language===s||g.label===s)&&!a;g.mode=v?"showing":"hidden",v&&(a=!0)}),!a&&i.textTracks.length>0){const g=Array.from(i.textTracks).find(p=>p.language==="en"||p.label==="English")||i.textTracks[0];g&&(g.mode="showing")}},[l,o,r])}function Fs({videoRef:r,videoBoxH:o,style:l,sourceKey:d,activeSubtitleTrack:C,availableSubtitles:i}){V(()=>{const s="dynamic-subtitle-styles";let n=document.getElementById(s);n||(n=document.createElement("style"),n.id=s,document.head.appendChild(n)),n.textContent=Qt(l);const a=r.current;if(!a)return;const g=zt(l.fontSize,o||a.clientHeight||720);n.textContent=Qt({...l,fontSize:g});const p=()=>{const h=Number(l.position),P=isNaN(h)?0:Math.max(0,Math.min(100,h));return Math.max(0,Math.min(100,100-P))},v=(h,P)=>{try{const y=h;y.snapToLines=!1,y.line=P}catch{}},w=()=>{const h=g*16,P=a.videoHeight||a.clientHeight||720,y=a.videoWidth||a.clientWidth||1280;return{step:h*1.3/P*100,chars:Math.max(20,Math.floor(y/(h*.55)))}},k=h=>{const P=p(),y=Array.from(h.activeCues??[]);if(y.length<=1){y.forEach(m=>v(m,P));return}const{step:R,chars:O}=w();let G=P;for(let m=y.length-1;m>=0;m--){const B=String(y[m].text??"").replace(/<[^>]*>/g,"").split(`
|
|
55
|
-
`).reduce((F,W)=>F+Math.max(1,Math.ceil(W.length/O)),0),Y=G-B*R;v(y[m],Math.max(0,Y)),G=Y-R*.4}},e=h=>{if(!h.cues)return;const P=p();Array.from(h.cues).forEach(y=>v(y,P)),h.mode==="showing"&&k(h)},E=()=>{Array.from(a.textTracks).forEach(e)};E();const T=h=>{const P=h.target;P.mode==="showing"&&k(P)};Array.from(a.textTracks).forEach(h=>{h.addEventListener("cuechange",T)});const _=()=>{Array.from(a.textTracks).forEach(h=>{h.removeEventListener("cuechange",T),h.addEventListener("cuechange",T)}),E()};a.textTracks.addEventListener("addtrack",_),a.textTracks.addEventListener("removetrack",_);const A=Array.from(a.querySelectorAll("track")),M=()=>{E()};return A.forEach(h=>{h.addEventListener("load",M)}),()=>{Array.from(a.textTracks).forEach(h=>{h.removeEventListener("cuechange",T)}),a.textTracks.removeEventListener("addtrack",_),a.textTracks.removeEventListener("removetrack",_),A.forEach(h=>{h.removeEventListener("load",M)})}},[l,o,r,d,C,i])}function Is({videoRef:r,overlayRef:o,style:l,activeSubtitleTrack:d,delayMs:C,enabled:i}){V(()=>{if(!i)return;const s=r.current,n=o.current;if(!s||!n)return;const a=ee.getItem("playerSubtitlesEnabled")!=="false",g=()=>{if(n.innerHTML="",!a||d==="off"||d===null)return;const w=Array.from(s.textTracks).find(M=>M.language===d||M.label===d);if(!w||w.mode!=="showing")return;const k=C/1e3;let e;if(k>0&&w.cues){const M=s.currentTime-k;e=Array.from(w.cues).filter(h=>h.startTime<=M&&M<=h.endTime)}else e=Array.from(w.activeCues??[]);if(e.length===0)return;const E={...l,fontSize:zt(l.fontSize,s.clientHeight||0)},T=Xr(E),_=Jr(s,E.position),A=Array.from(e);A.forEach((M,h)=>{const P=String(M.text??"");if(!Zr(P).trim())return;const y=document.createElement("div"),R=(A.length-1-h)*1.7;y.style.cssText=`${T}
|
|
56
|
-
bottom: calc(${_}px + ${R}em);`,y.innerHTML=en(P),n.appendChild(y)})},p=()=>g(),v=()=>g();return Array.from(s.textTracks).forEach(w=>{w.addEventListener("cuechange",p)}),s.addEventListener("timeupdate",v),g(),()=>{Array.from(s.textTracks).forEach(w=>{w.removeEventListener("cuechange",p)}),s.removeEventListener("timeupdate",v),n.innerHTML=""}},[d,C,i,o,l,r])}const Os=({isOpen:r,onClose:o,onSuccess:l})=>{const d=()=>{l?.(),o()};return t(bt,{isOpen:r,onClose:o,title:"MKissa Browser Verification",children:t("div",{className:Ze.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:Ze.actions,children:t("a",{className:Ze.link,href:"https://mkissa.to/anime",target:"_blank",rel:"noreferrer",children:"Open MKissa anime"})}),t("div",{className:Ze.actions,children:[t("button",{className:Ze.secondaryButton,onClick:o,children:"Cancel"}),t("button",{className:Ze.button,onClick:d,children:"Refresh Dango"})]})]})})},no=()=>{const{id:r,episodeNumber:o}=Tr(),l=Cr(),d=Gt(),C=Rr(),i=_r(),s=!!i.session,n=s&&!i.session?.host,{hasConsent:a,grant:g}=xr(),{options:p}=jt(),v=xe(()=>p.filter(c=>(c.kind??"anime")==="anime"),[p]),w=xe(()=>v.map(c=>c.id),[v]),k=xe(()=>new Set(v.filter(c=>c.mature).map(c=>c.id)),[v]),{state:e,dispatch:E,toggleWatchlist:T,moveToCompleted:_,setPreferredSource:A,setPreferredLink:M,handleToggleDetails:h,resetEpisodeProgress:P,prefetchEpisodeSources:y,isResettingProgress:R,isUpdatingWatchlistStatus:O}=Ps(r,o,C.state||null,{hasMatureConsent:a,watchSelection:n?i.room?.selection:null});V(()=>{if(r&&e.showMeta?.id&&e.showMeta.id!==r){const c=o?`/watch/${e.showMeta.id}/${o}${window.location.search}`:`/watch/${e.showMeta.id}${window.location.search}`;l(c,{replace:!0})}},[r,e.showMeta?.id,o,l]);const G=xe(()=>{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]),m=tn({skipIntervals:e.skipIntervals,showId:r,episodeNumber:e.currentEpisode?.toString(),episodeCount:e.episodes.length||void 0,sourceType:e.selectedSource?.type,showMeta:G}),{refs:f,actions:B}=m,Y=xe(()=>!r||r.startsWith("dango-mt-")||!e.currentEpisode||e.selectedSource?.type==="iframe"||!e.selectedLink?.hls||!e.selectedSource?null:{showId:r,episode:e.currentEpisode,provider:e.selectedProvider,mode:e.currentMode,source:e.selectedSource.sourceName,title:e.showMeta.name||r},[r,e.currentEpisode,e.selectedProvider,e.currentMode,e.selectedSource,e.selectedLink,e.showMeta.name]),F=rn(m.engine,Y,e.loadingVideo||e.loadingShowData),W=wn(),L=N(null),Z=N(null),x=N(null),[K,oe]=se(()=>{try{const c=ee.getItem("anime4kProfile");return["low","balanced","high","denoise"].includes(c)?c:"balanced"}catch{return"balanced"}}),{videoDelayMs:I,videoDelayEnabled:be,setDelayEnabled:H,handleVideoDelayChange:z,isCalibrating:u,testClipActive:b,stopCalibration:D,openAvSyncCalibrator:X,cancelAvSyncCalibrator:fe,applyAvSyncCalibrator:U,toggleTestClip:Te,calibReturnRef:We,effectiveVideoDelayMs:j}=nn(f.videoRef,()=>B.setShowSettings(!1)),ne=N(null),[Ce,me]=se(!1),[Ue,He]=se(null);V(()=>{me(!1),He(null)},[r,e.currentEpisode]);const je=`${r??""}:${e.currentEpisode??""}`,[Ye,St]=se(null);V(()=>{e.loadingVideo||e.videoSources.length===0||St(c=>c?.key===je?c:{key:je,watched:lt(e.resumeTime,e.resumeDuration)})},[je,e.loadingVideo,e.videoSources.length,e.resumeTime,e.resumeDuration]);const Xe=Ye?.key===je&&Ye.watched,[ae]=se(yn),[wt,ct]=se(!1);V(()=>{ct(!1)},[r,e.currentEpisode]);const ut=!s&&!b&&Xe&&e.videoSources.length>0&&!Ce,Be=ut&&ae,Je=ut&&!ae&&!wt,Q=q(()=>{He(null),me(!0)},[]),De=q(()=>{He(e.resumeTime),me(!0)},[e.resumeTime]),le=ws({videoRef:f.videoRef,canvasRef:Z,profile:K,delayMs:j}),ve=le.isEnabled&&le.isWebGPUSupported;Es({videoRef:f.videoRef,episodeKey:`${r??""}:${e.currentEpisode??""}`,isEnabled:le.isEnabled,isSupported:le.isWebGPUSupported,mediaReady:!e.loadingVideo&&!!e.selectedLink,isIframeSource:e.selectedSource?.type==="iframe",setEnabled:le.setEnabled}),sn({videoRef:f.videoRef,canvasRef:ne,delayMs:j,enabled:be&&!ve});const dt=be&&!ve,$e=ve||dt,[Qe,Ve]=se(!1),et=N(o);V(()=>{et.current!==o&&(et.current=o,D())},[o,D]);const tt=q(()=>{d.invalidateQueries({queryKey:[ie.continueWatching]})},[d]),{data:Fe=[],isLoading:rt}=Ar(),nt=Lr(),Et=Br(),kt=Dr(),{isTheaterMode:we,toggleTheaterMode:J,handleLayoutClick:pe}=on();Mr(()=>{if(m.state.isFullscreen||we)return;const c=f.playerContainerRef.current,te=L.current;if(!c||!te)return;const Ge=()=>{const Mt=c.getBoundingClientRect().height;te.style.height=`${Mt}px`};Ge();const Oe=new ResizeObserver(Ge);return Oe.observe(c),()=>Oe.disconnect()},[m.state.isFullscreen,we,f.playerContainerRef]);const ce=xe(()=>e.episodes.findIndex(c=>c===e.currentEpisode),[e.episodes,e.currentEpisode]),ge=ce>0?e.episodes[ce-1]:null,re=ce>=0&&ce<e.episodes.length-1?e.episodes[ce+1]:null,Ee=ce>-1&&ce<e.episodes.length-1,Re=Ht(e.showMeta?.status),Me=!re&&Re,Ke=!re&&!Me,{showCompleteModal:Se,queueCountdown:ue,pendingQueueTransition:mt,handleQueueTransition:st,handleNextEpisode:he,handleNShortcut:pt,handlePreviousEpisode:_t,handlePlaybackFinished:Zt,closeCompleteModal:ht,cancelQueueTransition:er}=_s({testClipActive:b,selectedSourceType:e.selectedSource?.type,onEnded:B.onEnded,queue:Fe,removeFromQueue:nt.mutate,showId:r,showMetaId:e.showMeta?.id,showStatus:e.showMeta?.status,currentEpisode:e.currentEpisode,isAutoplayEnabled:!n&&e.isAutoplayEnabled,nextEpisode:re,previousEpisode:ge,navigate:l,invalidateContinueWatching:tt,dispatch:E}),{showNextEpisodePrompt:tr,handleThresholds:Tt}=xs({videoRef:f.videoRef,queue:Fe,showId:r,showMetaId:e.showMeta?.id,currentEpisode:e.currentEpisode,selectedSource:e.selectedSource,hasNextEpisode:Ee,nextEpisode:re,prefetchEpisodeSources:y,matchesQueueItem:at}),{checkEnd:ft,logDuration:xt}=an({videoRef:f.videoRef,sourceType:e.selectedSource?.type,resetKey:`${r}:${e.currentEpisode}:${Ce}`,onEnd:n?B.onEnded:Zt}),At=!s&&e.showResumeModal&&!e.resumeProgressPending,Ie=Se&&ae,rr=Se&&!ae,qe=At||Se||Je;ln(m,!!e.selectedLink&&!we&&!qe&&!Be&&!Ie&&!Je);const{fallbackPrompt:Lt,isRetryingProvider:Bt,rememberFallbackChoice:nr,setRememberFallbackChoice:sr,fallbackChoice:or,updateFallbackChoice:ir,dismissFallbackPrompt:ar,chooseIframeFallback:lr,chooseProviderRetry:cr,handleVideoSourceError:Dt,resetFallback:$t}=Bs({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:w,matureProviders:k,setPreferredSource:A,showControls:B.setShowControls,dispatch:E}),{seekToTimeRef:Ft}=Ds({engine:m.engine,videoRef:f.videoRef,selectedSource:e.selectedSource,selectedLink:e.selectedLink,loadingVideo:e.loadingVideo,testClipActive:!s&&b,resumeTime:s?0:e.resumeTime,resumeDuration:e.resumeDuration,showResumeModal:!s&&e.showResumeModal,disabled:Be||Ie,startOver:Ce&&Ue==null,resumeAt:Ue,calibReturnRef:We,setAvailableSubtitles:B.setAvailableSubtitles,setActiveSubtitleTrack:B.setActiveSubtitleTrack,onFatalError:s?()=>{}:Dt});V(()=>{(qe||Be||Ie)&&m.state.isFullscreen&&m.actions.toggleFullscreen()},[qe,Be,Ie,m.state.isFullscreen,m.actions]),V(()=>{qe&&f.videoRef.current&&f.videoRef.current.pause()},[qe,f.videoRef]);const{titlePreference:vt}=$r(),{lowEndMode:ur}=Fr(),{settings:Ct,update:dr}=cn(),mr=we&&Ct.enabled&&!ur&&e.selectedSource?.type!=="iframe"&&!!e.selectedLink,Le=xe(()=>{if(!e.showMeta||e.loadingShowData)return"Loading...";const{name:c,names:te}=e.showMeta;return vt==="name"?c||"Loading...":vt==="nativeName"?te?.native||c||"Loading...":vt==="englishName"?te?.english||c||"Loading...":c||"Loading..."},[e.showMeta,vt,e.loadingShowData]);V(()=>{Le&&Le!=="Loading..."&&e.currentEpisode&&(document.title=`► ${Le} Episode ${e.currentEpisode} - dango`)},[Le,e.currentEpisode]),Ns({onPrevious:n?()=>{}:_t,onNext:n?()=>{}:pt,onToggleTheater:J,flashControls:m.actions.flashControls});const{setAvailableSubtitles:pr,setActiveSubtitleTrack:hr}=B,It=xe(()=>({fontSize:m.state.subtitleFontSize,position:m.state.subtitlePosition,bgOpacity:m.state.subtitleBgOpacity,bgColor:m.state.subtitleBgColor,textColor:m.state.subtitleTextColor,edge:m.state.subtitleEdge,bold:m.state.subtitleBold}),[m.state.subtitleFontSize,m.state.subtitlePosition,m.state.subtitleBgOpacity,m.state.subtitleBgColor,m.state.subtitleTextColor,m.state.subtitleEdge,m.state.subtitleBold]);$s({videoRef:f.videoRef,availableSubtitles:m.state.availableSubtitles,activeSubtitleTrack:m.state.activeSubtitleTrack,setAvailableSubtitles:pr,setActiveSubtitleTrack:hr});const[fr,vr]=se(0);V(()=>{const c=f.videoRef.current;if(!c)return;const te=()=>vr(c.clientHeight||0);te();const Ge=new ResizeObserver(te);return Ge.observe(c),()=>Ge.disconnect()},[f.videoRef,e.selectedSource,e.selectedLink]),Fs({videoRef:f.videoRef,videoBoxH:fr,style:It,sourceKey:`${e.selectedSource?.sourceName??""}:${e.selectedLink?.link??""}`,activeSubtitleTrack:m.state.activeSubtitleTrack,availableSubtitles:m.state.availableSubtitles}),Is({videoRef:f.videoRef,overlayRef:x,style:It,activeSubtitleTrack:m.state.activeSubtitleTrack,delayMs:j,enabled:$e}),V(()=>{try{ee.setItem("anime4kProfile",K)}catch{}},[K]);const gr=()=>{f.videoRef.current&&(f.videoRef.current.currentTime=e.resumeTime,f.videoRef.current.play()),E({type:"SET_STATE",payload:{showResumeModal:!1}})},yr=()=>{f.videoRef.current&&(f.videoRef.current.currentTime=0,f.videoRef.current.play()),E({type:"SET_STATE",payload:{showResumeModal:!1}})},br=q(()=>{E({type:"SET_STATE",payload:{showResumeModal:!1}})},[E]),Rt=q(async()=>{try{await _(),ht(),E({type:"SET_STATE",payload:{showResumeModal:!1}}),l("/")}catch{}},[_,ht,E,l]),Ot=(c,te)=>t("div",{className:c,children:[t("button",{className:`${S.episodeNavBtn} ${S.secondary}`,onClick:_t,disabled:n||!ge,type:"button",children:[t(ye,{name:"chevron-left",size:12}),"Prev EP"]}),t("button",{className:`${S.episodeNavBtn} ${S.primary}`,onClick:he,disabled:n||!re,type:"button",children:["Next EP",t(ye,{name:"chevron-right",size:12})]}),te==="mobile"&&W&&t("button",{className:`${S.episodeNavBtn} ${S.episodePickerBtn}`,onClick:()=>Ve(!0),type:"button",children:[t(ye,{name:"list-ul",size:12}),"Episodes"]})]}),Sr=c=>{E({type:"SET_STATE",payload:{isAutoplayEnabled:c}}),bn(c)};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 Pe=e.loadingShowData||e.loadingVideo;return e.showMeta?.isAdult===!0&&!a?t("div",{className:_e.playerPageLayout,children:t(Sn,{isOpen:!0,onClose:()=>l("/home"),onGrant:g})}):t("div",{className:`${_e.playerPageLayout} ${we?_e.theaterMode:""}`,onClick:pe,children:[we&&t(un,{videoRef:f.videoRef,active:mr,settings:Ct}),t(Vt,{isOpen:rr,onClose:ht,title:"Show Completed!",heading:Le,message:"Congratulations! You finished all available episodes.",children:t(Ne,{onClick:Rt,disabled:O,children:O?"Saving...":"Move to Completed"})}),t(Vt,{isOpen:Je,onClose:()=>ct(!0),title:Me?"Show Completed!":"Episode Completed",heading:e.currentEpisode?`Episode ${e.currentEpisode}`:Le,message:Me?"Congratulations! You finished all available episodes.":"You've already watched this episode. Resume where you left off, replay it, or continue with the next episode.",children:[e.resumeTime>5&&t(Ne,{variant:Ke?void 0:"secondary",onClick:De,children:`Resume ${Wt(e.resumeTime)}`}),t(Ne,{variant:"secondary",onClick:Q,children:"Replay"}),re&&t(Ne,{onClick:he,children:`Watch EP ${re}`}),Me&&t(Ne,{onClick:Rt,disabled:O,children:O?"Saving...":"Move to Completed"})]}),t(dn,{isOpen:At,onClose:br,title:"Resume Playback?",message:t(ot,{children:["You were watching at ",t("strong",{children:m.actions.formatTime(e.resumeTime)}),". Would you like to continue?"]}),onResume:gr,onRestart:yr}),t(bt,{isOpen:!!Lt,onClose:ar,title:"Direct stream failed",width:"sm",children:[t(bt.Body,{children:[t("p",{children:[t("strong",{children:e.selectedProvider}),"'s direct stream failed for this episode."]}),Lt?.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:nr,onChange:c=>sr(c.currentTarget.checked)}),"Remember my choice"]})]}),t(bt.Actions,{children:[t(Ne,{variant:"secondary",onClick:lr,children:"Continue with iframe"}),t(Ne,{onClick:cr,disabled:Bt,children:Bt?"Searching…":"Try another provider"})]})]}),t(Ir,{isOpen:!!e.showCookieModal&&e.cookieProvider!=="mkissa",onClose:()=>E({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{d.invalidateQueries({queryKey:[ie.videoSources,r,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),t(Os,{isOpen:!!e.showCookieModal&&e.cookieProvider==="mkissa",onClose:()=>E({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{d.invalidateQueries({queryKey:[ie.videoSources,r,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),!we&&t("aside",{ref:L,className:_e.episodeSidebar,children:e.loadingShowData?t(mn,{variant:"sidebar"}):t(pn,{episodes:e.episodes,currentEpisode:e.currentEpisode??void 0,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:c=>{n||l(`/watch/${r}/${c}`)}})}),t("div",{className:_e.playerMain,children:[t("div",{className:`${S.videoContainer} ${m.state.isFullscreen?"":_e.videoPlayerWrapper} ${m.state.isFullscreen?S.fullscreenActive:""}`,style:{...qe?{visibility:"hidden"}:{}},onContextMenu:c=>c.preventDefault(),children:t(ls,{player:m,isAutoplayEnabled:e.isAutoplayEnabled,onAutoplayChange:Sr,fallbackChoice:or,onFallbackChoiceChange:ir,ambientSettings:Ct,onAmbientChange:dr,showNextEpisodeButton:!n&&!qe&&tr&&Fe.length===0,onNextEpisode:he,videoSources:n?[]:s?e.videoSources.filter(c=>c.type!=="iframe"&&c.links.some(te=>te.hls)):e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:(c,te)=>{n&&c.sourceName!==i.room?.selection.source||s&&(c.type==="iframe"||!te.hls)||(f.videoRef.current&&!isNaN(f.videoRef.current.currentTime)&&(Ft.current=f.videoRef.current.currentTime),A(c.sourceName),M(te.resolutionStr),E({type:"SET_STATE",payload:{selectedSource:c,selectedLink:te,showResumeModal:e.showResumeModal&&c.type!=="iframe"}}))},loadingVideo:Pe,skipIntervals:e.skipIntervals,animeTitle:Le,episodeNumber:e.currentEpisode??void 0,mode:e.currentMode,isTheaterMode:we,onTheaterModeToggle:J,anime4kEnabled:le.isEnabled,onAnime4kToggle:le.toggle,anime4kSupported:le.isWebGPUSupported,anime4kProfile:K,onAnime4kProfileChange:oe,anime4kInitializing:le.isInitializing,anime4kError:le.error,videoDelayEnabled:be,onVideoDelayToggle:H,videoDelayMs:I,onVideoDelayChange:z,onCalibrateAvSync:s?()=>{}:X,isInteractingExtra:Qe||u,className:qr.shellFill,hideChrome:Be||Ie||e.selectedSource?.type==="iframe",overlays:t(ot,{children:[m.state.isSpeedBoostActive&&t("div",{className:S.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(ye,{name:"forward",size:12})]}),ue!==null&&mt?.nextItem&&t("div",{className:S.queueCountdown,children:["Queue next in ",ue,"s"]})]}),children:t(ot,{children:[Pe&&t("div",{className:S.loadingOverlay,children:t("div",{className:S.loadingDots,children:[t("div",{className:S.dot}),t("div",{className:S.dot}),t("div",{className:S.dot})]})}),m.state.isBuffering&&!Pe&&e.selectedSource?.type!=="iframe"&&t("div",{className:S.bufferingOverlay,children:t("div",{className:S.bufferingSpinner})}),e.selectedSource?.type==="iframe"&&!s?!Pe&&t("iframe",{src:e.selectedLink?.link,className:S.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(ot,{children:[!Pe&&e.videoSources.length===0&&t("div",{className:S.errorOverlay,children:[t("p",{children:["No sources found for this episode with ",e.selectedProvider,"."]}),t("p",{className:S.errorSubtext,children:"Please try selecting a different provider below."}),t("button",{className:S.retryButton,onClick:()=>window.location.reload(),"data-speed-boost-ignore":"true",style:{marginTop:8},children:"Retry"})]}),!Pe&&e.videoSources.length>0&&t(Gr,{controls:!m.state.playbackLocked&&m.state.useNativeControls,playsInline:!0,"webkit-playsinline":"true",disablePictureInPicture:!0,disableRemotePlayback:!0,onPlay:B.onPlay,onPause:B.onPause,onEnded:()=>{b||ft(!0)},onDurationChange:()=>{xt()},onSeeked:()=>{b||(Tt(),ft())},onLoadedMetadata:()=>{Tt(),xt(),b||ft()},onTimeUpdate:()=>{b||(B.onTimeUpdate(),Tt(),ft(),mt&&f.videoRef.current&&f.videoRef.current.currentTime<f.videoRef.current.duration-1&&er())},onError:s?void 0:Dt,onContextMenu:c=>c.preventDefault(),className:$e?S.videoElementHidden:""}),le.isWebGPUSupported&&!Pe&&e.videoSources.length>0&&t("canvas",{ref:Z,className:`${S.upscalerCanvas} ${ve?S.upscalerActive:""}`}),!ve&&!Pe&&e.videoSources.length>0&&t("canvas",{ref:ne,className:`${S.upscalerCanvas} ${dt?S.upscalerActive:""}`}),le.isEnabled&&le.isWebGPUSupported&&le.isInitializing&&t("div",{className:S.upscalerStatusBadge,children:"Preparing upscaler…"}),$e&&t("div",{ref:x,className:S.subtitleOverlay}),t(hn,{isOpen:u,ms:I,onChange:z,onApply:U,onClose:fe,testClipActive:b,onTestClip:Te})]}),(Be||Ie)&&t("div",{className:S.watchedOverlay,children:[t(ye,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)"}}),t("p",{className:S.watchedTitle,children:Me?"Show Completed!":e.currentEpisode?`Episode ${e.currentEpisode} watched`:"Watched"}),t("p",{className:S.watchedSubtext,children:Me?"Congratulations! You finished all available episodes.":"Resume where you left off, replay from the beginning, or continue with the next episode."}),t("div",{className:`${S.watchedActions} ${Ie?S.watchedActionsCentered:""}`,children:[t("div",{children:e.resumeTime>5&&!Ie&&t(Ne,{variant:Ke?void 0:"secondary",onClick:De,children:`Resume ${Wt(e.resumeTime)}`})}),t("div",{children:[re&&t(Ne,{onClick:he,children:`Watch EP ${re}`}),Me&&t(Ne,{onClick:Rt,disabled:O,children:O?"Saving...":"Move to Completed"})]}),t("div",{children:t(Ne,{variant:"secondary",onClick:()=>{ht(),Q()},children:"Replay"})})]})]})]})})}),t(Mn,{playback:Y&&!Pe?{selection:Y,position:f.videoRef.current?.currentTime||0,playing:!1,rate:m.engine.getState().playbackRate}:null,onCreate:()=>{D(),m.engine.pause()},needsPlayback:F.needsPlayback,onEnablePlayback:F.enablePlayback}),s&&!Pe&&!Y&&t("p",{role:"alert",children:"This room requires the host's direct HLS source. It is unavailable here. Retry the episode or leave the room to use another source."}),!we&&t(fn,{}),!we&&t(ot,{children:[rt&&Fe.length===0?t(cs,{count:3}):t(En,{title:"Queue",items:Fe,currentShowId:r,currentEpisode:e.currentEpisode??void 0,onNextQueue:n?()=>{}:st,onRemove:c=>nt.mutate({showId:c.showId,episodeNumber:c.episodeNumber}),onClear:()=>Et.mutate(),showClearAll:!0,onReorder:c=>kt.mutate(c.map(te=>({id:te.id,showId:te.showId,episodeNumber:te.episodeNumber})))}),t("div",{className:S.streamPanel,children:[!n&&t(ps,{selectedProvider:e.selectedProvider,isAdult:e.showMeta?.isAdult,options:v,onProviderChange:c=>{$t(),E({type:"SET_STATE",payload:{selectedProvider:c,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),Jt(c,e.showMeta?.isAdult===!0)}}),Ot(`${S.episodeActions} ${S.desktopEpisodeActions}`,"desktop"),Pe?t("div",{className:S.sourceLoader,children:t("div",{className:S.spinner})}):n?t("p",{children:["Provider: ",e.selectedProvider," · Source: ",i.room?.selection.source," ·"," ",e.currentMode]}):t(fs,{videoSources:s?e.videoSources.filter(c=>c.type!=="iframe"&&c.links.some(te=>te.hls)):e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:c=>{if(s&&(c.type==="iframe"||!c.links.some(Oe=>Oe.hls)))return;f.videoRef.current&&!isNaN(f.videoRef.current.currentTime)&&(Ft.current=f.videoRef.current.currentTime);const Ge=(s?c.links.filter(Oe=>Oe.hls):c.links||[]).sort((Oe,Mt)=>(parseInt(Mt.resolutionStr)||0)-(parseInt(Oe.resolutionStr)||0))[0]||null;A(c.sourceName),E({type:"SET_STATE",payload:{selectedSource:c,selectedLink:Ge,showResumeModal:e.showResumeModal&&c.type!=="iframe"}})},onLinkChange:c=>{e.selectedSource&&(A(e.selectedSource.sourceName),M(c.resolutionStr),E({type:"SET_STATE",payload:{selectedLink:c}}))}})]}),t("div",{className:_e.playerInfoContainer,children:[t("div",{className:_e.playerInfoHeader,children:[t("div",{className:_e.playerAnimeCard,children:t(Or,{src:Wr(e.showMeta.thumbnail||""),alt:Le,loading:"lazy",decoding:"async",onError:c=>{c.target.src="/placeholder.svg"}})}),t("div",{className:_e.videoTitleSection,children:[t("div",{className:S.titleContainer,children:[t("h1",{children:Le}),t("div",{className:S.scheduleInfo,children:[e.showMeta.status&&t("span",{className:S.status,children:e.showMeta.status}),e.showMeta.nextEpisodeAirDate&&t("span",{className:S.nextEpisode,children:["Next episode: ",e.showMeta.nextEpisodeAirDate]})]})]}),t("div",{className:S.controls,children:[t("button",{className:`${S.watchlistBtn} ${e.inWatchlist?S.inList:""}`,onClick:T,children:[e.inWatchlist?t(ye,{name:"check",size:14}):t(ye,{name:"plus",size:14}),e.inWatchlist?"In Watchlist":"Add to Watchlist"]}),t(Tn,{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:`${S.watchlistBtn} ${S.queueBtn}`,activeClassName:S.queueActive}),t("button",{className:`${S.watchlistBtn} ${S.modeToggleBtn} ${e.currentMode==="dub"?S.modeToggleActive:""}`,disabled:n,onClick:()=>{const c=e.currentMode==="dub"?"sub":"dub";$t(),E({type:"SET_MODE",payload:c}),ee.setItem("preferredMode",c)},type:"button","aria-pressed":e.currentMode==="dub",children:e.currentMode==="dub"?"DUB":"SUB"}),t("button",{className:`${S.watchlistBtn} ${S.modeToggleBtn}`,onClick:()=>e.currentEpisode&&P(e.currentEpisode),disabled:R||!e.currentEpisode,type:"button",children:[t(ye,{name:"undo",size:14}),R?"Resetting...":"Reset Progress"]})]})]})]}),Ot(`${S.episodeActions} ${S.mobileEpisodeActions}`,"mobile"),t("div",{className:_e.infoColumns,children:[t("div",{className:`${S.descriptionSection} ${S.synopsisFlat}`,children:[t("h3",{children:"Synopsis"}),t(Rn,{text:e.showMeta.description?e.showMeta.description.replace(/<[^>]*>?/gm,""):"",emptyText:"No description available."}),t("button",{className:S.detailsToggleBtn,onClick:h,children:[e.showCombinedDetails?t(ye,{name:"chevron-up"}):t(ye,{name:"chevron-down"}),e.showCombinedDetails?"Hide Details":"Show Details"]})]}),e.showCombinedDetails&&t(Cn,{showMeta:e.showMeta,styles:S})]})]})]})]}),t(vn,{isOpen:Qe,onClose:()=>Ve(!1),episodes:e.episodes,currentEpisode:e.currentEpisode??void 0,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:c=>{Ve(!1),l(`/watch/${r}/${c}`)}})]})};export{no as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{u as t,d as g,A as U,h as b,S as tt,g as Ns,q as _,o as ws,p as As,a as Is,T as Ce}from"./vendor-core-DfaOB3Rn.js";import{h as jt,p as $,t as kt,ac as Ps,a6 as xs,S as tr,e as Rs,ak as Ls,J as Br,B as fe,a8 as Bs}from"./index-CipsDH5j.js";import{P as Ms,a as $s,b as Ds,F as Os,f as zs,c as Fs}from"./PlayerProvider-BpSlL46d.js";import{u as Vs}from"./vendor-query-BBT5_sHx.js";import{I as ie}from"./vendor-icons-C1Pj_eSX.js";import{p as or,M as Us,z as zr,f as ar,c as Ws,C as Hs,a as qs,P as Ks,b as _n,u as Ys,i as Qs,j as js,n as Gs,h as Xs,k as Js,m as Zs,l as eo,s as nr,d as to,e as no,g as ro,r as so,o as Re,A as oo,t as ao,E as io,w as lo,x as co,v as Z,y as uo,R as mo,q as Mr}from"./useWatchAlongPlayer-CGkmzN8r.js";import{S as ho,O as rr,a as vo,A as po,b as fo}from"./OptionListMenu-CcJ9TOV5.js";import{M as bo}from"./MatureConsentModal-C5vPRV5i.js";import{u as go}from"./useProviders-jAVzdvgi.js";import{e as yo,b as So,f as _o,g as Co,d as To,c as ko,h as Eo,i as No}from"./useTvLibrary-DPJOHbp1.js";import{b as wo,i as Qt,l as Ao,a as Io,c as Po,h as $r}from"./playbackCompletion-Z40dSXOE.js";import{u as xo}from"./useIsMobile-Dvx1uJ82.js";import{S as Ro}from"./SynopsisText-B3Sa5pRv.js";import{W as Lo}from"./WatchAlongPanel-Bhu29HGV.js";import"./libraryInvalidation-DGrdMoRs.js";const Bo="_fullscreenFlat_n2elb_1",Mo="_timeDisplay_n2elb_12",$o="_bottomControls_n2elb_16",Do="_leftControls_n2elb_20",Oo="_rightControls_n2elb_21",zo="_controlBtn_n2elb_25",Fo="_controlsOverlay_n2elb_32",Vo="_hidden_n2elb_52",Uo="_topControls_n2elb_58",Wo="_backBtn_n2elb_78",Ho="_videoTitleInfo_n2elb_98",qo="_animeTitle_n2elb_104",Ko="_episodeLabel_n2elb_112",Yo="_speedBoostBadge_n2elb_119",Qo="_progressBarContainer_n2elb_165",jo="_progressBar_n2elb_165",Go="_thumb_n2elb_184",Xo="_bufferedBar_n2elb_202",Jo="_watchedBar_n2elb_212",Zo="_scrubbing_n2elb_237",ea="_timeBubble_n2elb_241",ta="_bottomControlsRow_n2elb_255",na="_nextEpisodeBtn_n2elb_278",ra="_active_n2elb_340",sa="_settingsPanel_n2elb_352",oa="_settingsHeader_n2elb_371",aa="_settingsBackBtn_n2elb_379",ia="_settingsTitle_n2elb_397",la="_settingsContent_n2elb_408",ca="_currentValue_n2elb_417",da="_menuItem_n2elb_423",ua="_menuNote_n2elb_456",ma="_loadingOverlay_n2elb_465",ha="_loadingDots_n2elb_476",va="_dot_n2elb_481",pa="_bufferingOverlay_n2elb_510",fa="_bufferingSpinner_n2elb_519",o={fullscreenFlat:Bo,timeDisplay:Mo,bottomControls:$o,leftControls:Do,rightControls:Oo,controlBtn:zo,controlsOverlay:Fo,hidden:Vo,topControls:Uo,backBtn:Wo,videoTitleInfo:Ho,animeTitle:qo,episodeLabel:Ko,speedBoostBadge:Yo,progressBarContainer:Qo,progressBar:jo,thumb:Go,bufferedBar:Xo,watchedBar:Jo,scrubbing:Zo,timeBubble:ea,bottomControlsRow:ta,nextEpisodeBtn:na,active:ra,settingsPanel:sa,settingsHeader:oa,settingsBackBtn:aa,settingsTitle:ia,settingsContent:la,currentValue:ca,menuItem:da,menuNote:ua,loadingOverlay:ma,loadingDots:ha,dot:va,bufferingOverlay:pa,bufferingSpinner:fa},ba=({player:s,visible:f,settingsOpen:z,onOpenSettings:x,onCloseSettings:M,hasSubtitles:k,isSubtitleActive:w,subtitles:d,onSubtitleChange:c,showNextEpisodeButton:C,onNextEpisode:r,isTheaterMode:R,onTheaterModeToggle:be,timeLabelRef:te})=>{const{state:u,actions:Ne}=s,Le=()=>{if(w){c(-1);return}let ge=null;try{ge=$.getItem("tvLastSubtitle")}catch{}c(or(d,{lastKey:ge,enabled:!0}))};return t("div",{className:`${o.controlsOverlay} ${f?"":o.hidden}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:o.bottomControls,onClick:ge=>ge.stopPropagation(),children:[t(Ms,{classes:{container:o.progressBarContainer,scrubbing:o.scrubbing,timeBubble:o.timeBubble,bar:o.progressBar,buffered:o.bufferedBar,watched:o.watchedBar,thumb:o.thumb},timeLabelRef:te}),t("div",{className:o.bottomControlsRow,children:[t("div",{className:o.leftControls,children:[t($s,{className:o.controlBtn}),t(Ds,{buttonClassName:o.controlBtn,onExpandedChange:Ne.setShowVolumeSlider}),t("span",{className:o.timeDisplay,ref:te,children:[jt(0)," / ",jt(u.duration)]})]}),t("div",{className:o.rightControls,children:[C&&t("button",{className:o.nextEpisodeBtn,onClick:r,title:"Play next episode",children:"Next EP"}),k&&t("button",{className:`${o.controlBtn} ${w?o.active:""}`,onClick:Le,"aria-label":w?"Turn subtitles off":"Turn subtitles on",children:t(ie,{name:"closed-captioning"})}),t("button",{className:`${o.controlBtn} ${z?o.active:""}`,onClick:()=>z?M():x(),"aria-label":"Settings",children:t(ie,{name:"cog"})}),t("button",{className:`${o.controlBtn} ${R?o.active:""}`,onClick:ge=>{ge.stopPropagation(),be()},title:R?"Exit Theater Mode":"Theater Mode","aria-label":R?"Exit Theater Mode":"Theater Mode",children:t(ie,{name:"tv"})}),t(Os,{className:o.controlBtn})]})]})]})})},Cn=-6e4,sr=6e4,Dr=500,ga=({classes:s,delayMs:f,onDelayChange:z})=>{const[x,M]=g(null),k=x??f,w=U(z);w.current=z;const d=U(f);d.current=f;const c=U(null);c.current=x,b(()=>{M(null)},[f]),b(()=>()=>{const R=c.current;R!==null&&R!==d.current&&w.current(R)},[]);const C=R=>{d.current=R,c.current=null,w.current(R),M(null)},r=R=>{const be=c.current??d.current,te=Math.max(Cn,Math.min(sr,be+R));C(te)};return t(tt,{children:[t("div",{style:{display:"flex",gap:6,padding:"0.5rem 0.75rem 0.25rem"},children:[t("button",{type:"button",className:s.item,onClick:()=>r(-Dr),"aria-label":"Show subtitles 0.5 seconds earlier",style:{flex:1,justifyContent:"center"},children:t("span",{children:"-0.5s"})}),t("button",{type:"button",className:s.item,onClick:()=>r(Dr),"aria-label":"Show subtitles 0.5 seconds later",style:{flex:1,justifyContent:"center"},children:t("span",{children:"+0.5s"})}),t("button",{type:"button",className:s.item,onClick:()=>C(0),disabled:k===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(Us,{label:"Subtitle timing",display:zr(k),min:Cn,max:sr,step:100,value:k,percent:(k-Cn)/(sr-Cn)*100,onChange:R=>{const be=Math.round(R);c.current=be,M(be)},onCommit:()=>{const R=c.current;R!==null&&C(R)}}),t("div",{className:s.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},ya=({view:s,onSelectView:f,onClose:z,player:x,onSubtitleStyleChange:M,streams:k,resolutionIdx:w,onResolutionChange:d,hasSubtitles:c,subtitles:C,selectedSubtitle:r,isSubtitleActive:R,onSubtitleChange:be,audioTracks:te,selectedAudioTrack:u,onAudioTrackChange:Ne,videoDelayEnabled:Le,onVideoDelayToggle:ge,videoDelayMs:ye,onVideoDelayChange:S,onCalibrate:Et,subtitleDelayMs:nt,onSubtitleDelayChange:E,ambientSettings:W,onAmbientChange:Y})=>{const{state:de}=x,Nt=()=>t(tt,{children:[k.length>1&&t("button",{className:o.menuItem,onClick:()=>f("resolution"),children:[t("span",{children:"Resolution"}),t("span",{className:o.currentValue,children:k[w]?.quality||"Auto"})]}),c&&t("button",{className:o.menuItem,onClick:()=>f("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:o.currentValue,children:R?C[r]?.label||C[r]?.language:"Off"})]}),c&&t("button",{className:o.menuItem,onClick:()=>f("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:o.currentValue,children:[de.subtitleFontSize.toFixed(1),"x · ",de.subtitlePosition]})]}),c&&t("button",{className:o.menuItem,onClick:()=>f("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:o.currentValue,children:zr(nt)})]}),te.length>0&&t("button",{className:o.menuItem,onClick:()=>f("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:o.currentValue,children:te[u]?.label||te[u]?.language})]}),t("button",{className:o.menuItem,onClick:()=>f("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:o.currentValue,children:Le?`${ye}ms`:"Off"})]}),W&&Y&&t("button",{className:o.menuItem,onClick:()=>f("ambient"),children:[t("span",{children:"Ambient Light"}),t("span",{className:o.currentValue,children:W.enabled?"On":"Off"})]})]}),Be=()=>t(rr,{classes:{item:o.menuItem,active:o.active},options:k.map((A,re)=>({key:String(re),label:A.quality,selected:re===w})),onSelect:A=>d(Number(A))}),rt=()=>t(rr,{classes:{item:o.menuItem,active:o.active},options:[{key:"off",label:"Off",selected:!R},...C.map((A,re)=>({key:String(re),label:A.label||A.language,selected:re===r}))],onSelect:A=>be(A==="off"?-1:Number(A))}),pt=()=>t(vo,{classes:{item:o.menuItem,active:o.active},values:{fontSize:de.subtitleFontSize,position:de.subtitlePosition,bgOpacity:de.subtitleBgOpacity,bgColor:de.subtitleBgColor,textColor:de.subtitleTextColor,edge:de.subtitleEdge,bold:de.subtitleBold},onChange:M}),le=()=>t(ga,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},delayMs:nt,onDelayChange:A=>E?.(A)}),wt=()=>t(rr,{classes:{item:o.menuItem,active:o.active},options:te.map((A,re)=>({key:String(re),label:A.label||A.language,selected:re===u})),onSelect:A=>Ne(Number(A))}),st=()=>t(po,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},enabled:Le,delayMs:ye,onToggle:A=>ge?.(A),onDelayChange:A=>S?.(A),onCalibrate:Et}),Q=()=>W&&Y?t(fo,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},values:W,onChange:Y}):null;return t("div",{"data-speed-boost-ignore":"true",onClick:A=>A.stopPropagation(),children:t(ho,{classes:{panel:o.settingsPanel,header:o.settingsHeader,backBtn:o.settingsBackBtn,title:o.settingsTitle,content:o.settingsContent},title:s==="main"?"Settings":s==="subtitle-style"?"Subtitle Style":s==="subtitle-timing"?"Subtitle Timing":s==="audio"?"Audio Track":s==="resolution"?"Resolution":s==="av-sync"?"A/V Sync":s==="ambient"?"Ambient Light":s.charAt(0).toUpperCase()+s.slice(1),onBack:()=>s==="main"?z():f("main"),children:[s==="main"&&Nt(),s==="resolution"&&Be(),s==="subtitles"&&rt(),s==="subtitle-style"&&pt(),s==="subtitle-timing"&&le(),s==="audio"&&wt(),s==="av-sync"&&st(),s==="ambient"&&Q()]})})},Sa=({player:s,title:f,episodeLabel:z,server:x,audioTracks:M,selectedAudioTrack:k,onAudioTrackChange:w,subtitles:d,selectedSubtitle:c,onSubtitleChange:C,streams:r,resolutionIdx:R,onResolutionChange:be,onBack:te,children:u,videoDelayEnabled:Ne=!1,onVideoDelayToggle:Le,videoDelayMs:ge=0,onVideoDelayChange:ye,onCalibrateAvSync:S,subtitleDelayMs:Et=0,onSubtitleDelayChange:nt,showNextEpisodeButton:E=!1,onNextEpisode:W,isLoading:Y=!1,isTheaterMode:de,onTheaterModeToggle:Nt,ambientSettings:Be,onAmbientChange:rt,hideChrome:pt=!1})=>{const{state:le,refs:wt,actions:st}=s,Q=wt.videoRef,{subtitleFontSize:A,subtitlePosition:re,subtitleBgOpacity:ue,subtitleBgColor:Me,subtitleTextColor:$e,subtitleEdge:se,subtitleBold:At}=le,[Ue,Te]=g(null),It=U(null),[ke,Pt]=g(0);b(()=>{const he=Q.current;if(!he)return;const ne=()=>Pt(he.clientHeight||0);ne();const at=new ResizeObserver(ne);return at.observe(he),()=>at.disconnect()},[Q]);const me=st.setSubtitleStyle;b(()=>{const he="tv-player-subtitle-style";let ne=document.getElementById(he);ne||(ne=document.createElement("style"),ne.id=he,document.head.appendChild(ne));const at={fontSize:A,position:re,bgOpacity:ue,bgColor:Me,textColor:$e,edge:se,bold:At},oe=Q.current,gt=ar(A,ke||oe?.clientHeight||720);if(ne.textContent=Ws({...at,fontSize:gt}),oe){const Lt=()=>{const i=Number(re);return isNaN(i)?0:Math.max(0,Math.min(100,i))},it=(i,l)=>{try{const F=i;F.snapToLines=!1,F.line=l}catch{}},Se=()=>{const i=gt*16,l=oe.videoHeight||oe.clientHeight||720,F=oe.videoWidth||oe.clientWidth||1280;return{step:i*1.3/l*100,chars:Math.max(20,Math.floor(F/(i*.55)))}},Jt=i=>{const l=Math.max(0,Math.min(100,100-Lt())),F=Array.from(i.activeCues??[]);if(F.length<=1){F.forEach(Oe=>it(Oe,l));return}const{step:ce,chars:Zt}=Se();let $t=l;for(let Oe=F.length-1;Oe>=0;Oe--){const Tn=String(F[Oe].text??"").replace(/<[^>]*>/g,"").split(`
|
|
2
|
-
`).reduce((kn,ve)=>kn+Math.max(1,Math.ceil(ve.length/Zt)),0),Dt=$t-Tn*ce;it(F[Oe],Math.max(0,Dt)),$t=Dt-ce*.4}},Ae=()=>{const i=Math.max(0,Math.min(100,100-Lt()));Array.from(oe.textTracks).forEach(l=>{l.cues&&(Array.from(l.cues).forEach(F=>it(F,i)),l.mode==="showing"&&Jt(l))})};Ae();const lt=i=>{const l=i.target;l.mode==="showing"&&Jt(l)},Bt=()=>{Array.from(oe.textTracks).forEach(i=>{i.removeEventListener("cuechange",lt),i.addEventListener("cuechange",lt)}),Ae()};Array.from(oe.textTracks).forEach(i=>{i.addEventListener("cuechange",lt)}),oe.textTracks.addEventListener("addtrack",Bt);const Mt=Array.from(oe.querySelectorAll("track")),yt=()=>Ae();return Mt.forEach(i=>i.addEventListener("load",yt)),()=>{Array.from(oe.textTracks).forEach(i=>{i.removeEventListener("cuechange",lt)}),oe.textTracks.removeEventListener("addtrack",Bt),Mt.forEach(i=>i.removeEventListener("load",yt))}}},[A,re,ue,Me,$e,se,At,c,d,Q,ke]);const De=d.length>0,we=c>=0,ft=()=>{Te("main"),st.setShowControls(!0)},We=()=>{Te(null)},Gt=le.showControls||!!Ue,ot=zs(s.engine),He=ot.audioTracks.find(he=>he.id===ot.activeAudioTrack)??M[k],Xt=c>=0?d[c]??ot.subtitleTracks.find(he=>he.id===c):void 0,xt=t(Hs,{visible:Gt,title:f,episode:z,server:Y?void 0:x,audio:Y?void 0:He?.label||He?.language,subtitles:Y?void 0:Xt?.label||Xt?.language,onBack:te,classes:{overlay:o.controlsOverlay,hidden:o.hidden,top:o.topControls,backBtn:o.backBtn,titleInfo:o.videoTitleInfo,title:o.animeTitle,episode:o.episodeLabel}}),K=!Y&&!le.isBuffering&&le.duration>0?t(qs,{}):null,bt=t(ba,{player:s,visible:Gt,settingsOpen:!!Ue,onOpenSettings:ft,onCloseSettings:We,hasSubtitles:De,isSubtitleActive:we,subtitles:d,onSubtitleChange:C,showNextEpisodeButton:E,onNextEpisode:W,isTheaterMode:de,onTheaterModeToggle:Nt,timeLabelRef:It}),I=Ue?t(ya,{view:Ue,onSelectView:Te,onClose:We,player:s,onSubtitleStyleChange:me,streams:r,resolutionIdx:R,onResolutionChange:be,hasSubtitles:De,subtitles:d,selectedSubtitle:c,isSubtitleActive:we,onSubtitleChange:C,audioTracks:M,selectedAudioTrack:k,onAudioTrackChange:w,videoDelayEnabled:Ne,onVideoDelayToggle:Le,videoDelayMs:ge,onVideoDelayChange:ye,onCalibrate:()=>{Te(null),S?.()},subtitleDelayMs:Et,onSubtitleDelayChange:nt,ambientSettings:Be,onAmbientChange:rt}):null,Rt=t(tt,{children:[Y&&t("div",{className:o.loadingOverlay,"aria-hidden":"true",children:t("div",{className:o.loadingDots,children:[t("div",{className:o.dot}),t("div",{className:o.dot}),t("div",{className:o.dot})]})}),le.isBuffering&&!Y&&t("div",{className:o.bufferingOverlay,"aria-hidden":"true",children:t("div",{className:o.bufferingSpinner})}),le.isSpeedBoostActive&&t("div",{className:o.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(ie,{name:"forward",size:12})]})]});return t(Ks,{engine:s.engine,topBar:xt,centerControls:K,bottomBar:!Y&&le.duration>0?bt:null,settingsPanel:I,overlays:Rt,isInteracting:!!Ue||le.showVolumeSlider,nativeControls:le.useNativeControls,onStageClick:We,className:le.isFullscreen?o.fullscreenFlat:"",chromeDisabled:pt,children:u})},_a=({servers:s,selectedServer:f,onServerSelect:z})=>s.length===0?null:t("div",{className:_n.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:_n.sourceButtons,children:s.map(x=>t("button",{className:`${_n.sourceButton} ${f===x?_n.active:""}`,onClick:()=>z(x),children:x},x))})]}),Ca=Ns.memo(_a);function Ta({details:s,isMovie:f,season:z,episode:x,videoRef:M,active:k}){const w=U("");w.current||(w.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const d=_(()=>{if(!s)return;const c=M.current,C=f?"":`S${String(z).padStart(2,"0")}E${String(x).padStart(2,"0")}`;kt.discord.tvPresence.mutate({title:s.title,episodeLabel:C,isPlaying:c?!c.paused&&!c.ended:!0,thumbnail:s.poster,currentTime:c?c.currentTime:0,duration:c&&c.duration||0,isAdult:s.adult===!0,sessionId:w.current}).catch(()=>{}),kt.discord.heartbeat.mutate({sessionId:w.current}).catch(()=>{})},[s,f,z,x,M]);return b(()=>{if(!s)return;d();const c=window.setInterval(()=>{const C=M.current;(!C||!C.paused)&&d()},15e3);return()=>window.clearInterval(c)},[d,s,M]),b(()=>{if(!s||!k)return;const c=M.current;if(!c)return;const C=()=>d();return c.addEventListener("play",C),c.addEventListener("pause",C),c.addEventListener("seeked",C),()=>{c.removeEventListener("play",C),c.removeEventListener("pause",C),c.removeEventListener("seeked",C)}},[s,k,d,M]),b(()=>{const c=w.current,C=()=>Ps(c),r=()=>C();return window.addEventListener("pagehide",r),window.addEventListener("beforeunload",r),()=>{window.removeEventListener("pagehide",r),window.removeEventListener("beforeunload",r),C()}},[]),{sendPresence:d}}function ka(s,f,z){const x=()=>{const k=Array.isArray(s.audioTracks)?s.audioTracks.length:0,w=z.getWant(),d=k>0?Math.min(Math.max(0,w),k-1):w;s.audioTrack=d,d!==w&&z.onResolve(d)},M=(k,w)=>{const d=z.getWant(),c=Array.isArray(s.audioTracks)?s.audioTracks.length:0;if(w.id!==d&&d>=0&&d<c){s.audioTrack!==d&&(s.audioTrack=d);return}z.onResolve(w.id)};return s.on(f.MANIFEST_PARSED,x),s.on(f.AUDIO_TRACK_SWITCHED,M),()=>{s.off(f.MANIFEST_PARSED,x),s.off(f.AUDIO_TRACK_SWITCHED,M)}}const Ea=/\b(SmartTV|SMART-TV|Tizen|Web0S|webOS|NetCast|HbbTV|AppleTV|CrKey|BRAVIA|AFT[A-Za-z]|Fire\s?TV|GoogleTV|Roku|VIDAA|DTV|PlayStation|Xbox|Opera TV|POV_TV)\b/i;function Na(){try{if(Ea.test(navigator.userAgent||""))return!0;const s=navigator.deviceMemory;if(typeof s=="number"&&s>0&&s<2)return!0}catch{}return!1}const wa="_statusMsg_vmhzm_1",Aa="_error_vmhzm_7",Ia="_spinner_vmhzm_11",Pa="_spin_vmhzm_11",xa="_sourceLoader_vmhzm_16",Ra="_ringSpinner_vmhzm_22",La="_meta_vmhzm_40",Ba="_year_vmhzm_48",Ma="_rating_vmhzm_53",$a="_typeBadge_vmhzm_62",Da="_tv_vmhzm_70",Oa="_movie_vmhzm_75",za="_controlLabel_vmhzm_80",Fa="_select_vmhzm_90",Va="_playerSection_vmhzm_102",Ua="_video_vmhzm_106",Wa="_videoHidden_vmhzm_128",Ha="_delayCanvas_vmhzm_133",qa="_delayCanvasActive_vmhzm_146",Ka="_subtitleOverlay_vmhzm_150",Ya="_videoIframe_vmhzm_169",Qa="_retryButton_vmhzm_177",ja="_sidebarSeason_vmhzm_192",Ga="_mobileSeasonRow_vmhzm_208",Xa="_providerActions_vmhzm_221",Ja="_providerRow_vmhzm_228",Za="_autoplayActive_vmhzm_247",ei="_genreRow_vmhzm_258",ti="_genreChip_vmhzm_265",ni="_metaRow_vmhzm_275",ri="_detailGrid_vmhzm_284",si="_detailItem_vmhzm_292",oi="_imdbLink_vmhzm_314",ai="_watchedOverlay_vmhzm_324",ii="_watchedTitle_vmhzm_346",li="_watchedSubtext_vmhzm_352",ci="_watchedActions_vmhzm_358",di="_watchedActionsCentered_vmhzm_376",p={statusMsg:wa,error:Aa,spinner:Ia,spin:Pa,sourceLoader:xa,ringSpinner:Ra,meta:La,year:Ba,rating:Ma,typeBadge:$a,tv:Da,movie:Oa,controlLabel:za,select:Fa,playerSection:Va,video:Ua,videoHidden:Wa,delayCanvas:Ha,delayCanvasActive:qa,subtitleOverlay:Ka,videoIframe:Ya,retryButton:Qa,sidebarSeason:ja,mobileSeasonRow:Ga,providerActions:Xa,providerRow:Ja,autoplayActive:Za,genreRow:ei,genreChip:ti,metaRow:ni,detailGrid:ri,detailItem:si,imdbLink:oi,watchedOverlay:ai,watchedTitle:ii,watchedSubtext:li,watchedActions:ci,watchedActionsCentered:di},ui=[],mi=[];function Or({error:s,onRetry:f}){return t("div",{className:`${p.statusMsg} ${p.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:s}),t("button",{className:p.retryButton,onClick:f,children:"Retry"})]})})}const Ai=()=>{const{id:s}=ws(),[f]=As(),z=U(f);z.current=f;const x=Is(),M=Vs(),k=f.get("type"),w=xs(),d=!!w.session,c=d&&!w.session?.host,C=c&&["tv","movie"].includes(w.room?.selection.kind||"")?w.room?.selection:null,[r,R]=g(null),[be,te]=g(()=>parseInt(f.get("s")||"1",10)||1),u=C?.season??be,[Ne,Le]=g([]),[ge,ye]=g(()=>parseInt(f.get("e")||"1",10)||1),S=C?Number(C.episode):ge,[Et,nt]=g(()=>{try{return $.getItem("tvProvider")||""}catch{return""}}),E=C?.provider??Et,[W,Y]=g([]),[de,Nt]=g(""),[Be,rt]=g(""),{options:pt,isFallback:le,isLoading:wt}=go(),st=Ce(()=>pt.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.id,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[pt]),Q=le||st.length===0?ui:st,A=Q.filter(e=>e.tier==="direct"),re=Q.filter(e=>e.tier==="embed"),[ue,Me]=g(!1),[$e,se]=g(""),[At,Ue]=g([]),[Te,It]=g(0),[ke,Pt]=g([]),[me,De]=g(-1),[we,ft]=g(0),[We,Gt]=g(""),[ot,He]=g(""),[Xt,xt]=g(()=>{try{return $.getItem("tvServer")||""}catch{return""}}),K=C?.source??Xt,bt=Ce(()=>Q.find(e=>e.id===E),[Q,E]),I=bt?.tier==="embed",[Rt,he]=g([]),[ne,at]=g(""),[oe,gt]=g(""),[Lt,it]=g(!1),Se=Ce(()=>Rt.length>0?Rt:bt?.servers??[],[Rt,bt]),Jt=Ce(()=>ne&&!d?["Embed",...Se]:Se,[Se,ne,d]),Ae=Lt&&!!ne,lt=Ae?oe||ne:"";b(()=>{if(!ne){gt("");return}let e=!1;return tr(`/api/resolve?url=${encodeURIComponent(ne)}`).then(n=>{!e&&n.finalUrl&>(n.finalUrl)}).catch(()=>{}),()=>{e=!0}},[ne]);const Bt=U([]);b(()=>{Bt.current=W},[W]);const Mt=U(Te);b(()=>{Mt.current=Te},[Te]);const yt=U(me);b(()=>{yt.current=me},[me]);const i=Ys({skipIntervals:mi}),l=i.refs.videoRef,F=U(null),ce=U([]),Zt=U(null),$t=U(null),{videoDelayMs:Oe,videoDelayEnabled:en,setDelayEnabled:Tn,handleVideoDelayChange:Dt,isCalibrating:kn,testClipActive:ve,stopCalibration:En,openAvSyncCalibrator:Fr,cancelAvSyncCalibrator:Vr,applyAvSyncCalibrator:Ur,toggleTestClip:Wr,calibReturnRef:tn,effectiveVideoDelayMs:Nn}=Qs(l),[St,Hr]=g(()=>{try{const e=Number($.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),wn=U(St);wn.current=St;const qr=_(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(wn.current!==n){wn.current=n,Hr(n);try{$.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]);js({videoRef:l,canvasRef:Zt,delayMs:Nn,enabled:en});const An=en,_e=An||St!==0,{settings:In,update:Kr}=Gs(),Pn=U(_e);Pn.current=_e;const xn=_(()=>{if(!Pn.current)return;const e=l.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[l]),{hasConsent:Ot,grant:Yr}=Rs(),v=k==="movie";Ta({details:r,isMovie:v,season:u,episode:S,videoRef:l,active:!I&&!ue&&!$e&&W.length>0});const nn=s?Ls(k||"tv",s):"",j=nn,ze=`${j}:${u}:${S}:${E}:${K}`,rn=Ce(()=>!s||!r||I||Ae||ue||Be!==ze||W[we]?.type!=="hls"?null:{kind:v?"movie":"tv",...v?{}:{season:u},showId:s,episode:String(v?1:S),provider:E,source:K,mode:"sub",title:r.title},[s,r,I,Ae,ue,Be,ze,W,we,v,u,S,E,K]),ir=Xs(i.engine,rn,ue||!r),lr=yo(),Rn=So(),qe=_o(),Ke=Co(),{toggle:cr,bookmarkedIds:Qr,pending:jr}=To(),{data:dr}=ko(r?nn:void 0),zt=dr?!!dr.inLibrary:nn?Qr.has(nn):!1,Gr=_(()=>{!r||!s||cr({tmdbId:Number(s),mediaType:k||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,s,k,cr]),{data:Ye,isFetched:Ft,isFetching:Ln}=Eo(j||void 0,u,S),sn=Ce(()=>Ne.map(e=>e.episode_number).sort((e,n)=>e-n),[Ne]),Vt=sn.indexOf(S),Bn=Vt>0?sn[Vt-1]:null,P=Vt>=0&&Vt<sn.length-1?sn[Vt+1]:null,on=Ce(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),G=Ce(()=>{if(v||P!=null)return null;const e=on.indexOf(u);return e>=0&&e<on.length-1?on[e+1]:(r?.number_of_seasons??0)>u?u+1:null},[v,P,on,u,r?.number_of_seasons]),Mn=wo(r?.status),ct=v||P==null&&G==null&&Mn,ur=P==null&&G==null&&!ct,Ie=Ye?.currentTime??0,an=U(null),[Qe,ln]=g(!1),[_t,mr]=g(0),[Ut,hr]=g(!1),[dt,ut]=g(!1),[Xr,$n]=g(!1),[Jr,Zr]=g(""),[cn,es]=g(!1),[ts,Dn]=g(!1),[On,zn]=g(!1),{isTheaterMode:Fe,toggleTheaterMode:Fn,handleLayoutClick:ns}=Js(),vr=Ye?.duration??0,pr=Ye?.completed===1,Wt=`${j}:${u}:${S}`,[fr,rs]=g(null);b(()=>{Ft&&rs(e=>e?.key===Wt?e:{key:Wt,watched:pr||Qt(Ie,vr)})},[Ft,Wt,pr,Ie,vr]);const ss=Ft&&fr?.key===Wt&&fr.watched,[dn]=g(Ao),[os,br]=g(!1);b(()=>{br(!1)},[Wt]);const gr=!d&&!ve&&ss&&!On,je=gr&&dn,mt=gr&&!dn&&!os,Ge=dt&&dn,as=dt&&!dn,yr=_(()=>{zn(!0),ut(!1)},[]);b(()=>{const e=n=>{n.defaultPrevented||n.ctrlKey||n.metaKey||n.altKey||n.repeat||n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="t"&&Fn()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[Fn]),Zs(i,(W.length>0||ot!=="")&&!Fe&&!Qe&&!dt&&!je&&!mt);const is=xo(),[Ct,ls]=g(Io),cs=_(e=>{ls(e),Po(e)},[]),ds=e=>t("div",{className:e,children:[t("button",{className:`${Z.episodeNavBtn} ${Z.secondary} ${Ct?p.autoplayActive:""}`,onClick:()=>cs(!Ct),type:"button","aria-pressed":Ct,children:Ct?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),t("button",{className:`${Z.episodeNavBtn} ${Z.secondary}`,onClick:()=>Rn.mutate({mediaId:j??"",season:u,episode:S}),disabled:Rn.isPending,type:"button",children:[t(ie,{name:"undo",size:14}),Rn.isPending?"Resetting...":"Reset Progress"]}),t("button",{className:`${Z.episodeNavBtn} ${Z.secondary}`,onClick:()=>Bn!=null&&Tt(String(Bn)),disabled:c||Bn==null,type:"button",children:[t(ie,{name:"chevron-left",size:12}),"Prev EP"]}),t("button",{className:`${Z.episodeNavBtn} ${Z.primary}`,onClick:()=>P!=null&&Tt(String(P)),disabled:c||P==null,type:"button",children:["Next EP",t(ie,{name:"chevron-right",size:12})]}),is&&t("button",{className:`${Z.episodeNavBtn} ${Z.episodePickerBtn}`,onClick:()=>Dn(!0),type:"button",children:[t(ie,{name:"list-ul",size:12}),"Episodes"]})]}),Xe=U(!1),Ve=U(null),Vn=U(0),X=U(null),Sr=_(()=>{X.current=Ie,zn(!0),ut(!1)},[Ie]),un=U(""),us=$r(Ie),Ht=!d&&!Xe.current&&!On&&(Qe||dt||us||je||mt),mn=U(Ht);mn.current=Ht;const hn=U(!1);b(()=>{hn.current=Ut},[Ut]);const Je=_((e,n)=>{if(!j||!n||n<30)return;const a=Qt(e,n);Math.abs(e-Vn.current)<10&&!a||(Vn.current=e,lr.mutate({mediaId:j,season:u,episode:S,currentTime:Math.floor(e),duration:Math.floor(n),completed:a,title:r?.title??null,poster:r?.poster??null,backdrop:r?.backdrop??null,year:r?.year??null,overview:r?.overview??null,tmdbId:r?.id??null,mediaType:k||"tv",adult:r?.adult?1:0}))},[j,u,S,lr,r,k]),Pe=_((e,n)=>{En();const a=new URLSearchParams(f);a.set("type",f.get("type")||"tv"),a.set("s",String(e)),a.set("e",String(n)),x(`${window.location.pathname}?${a.toString()}`)},[f,x,En]),qt=_(()=>{const e=l.current;if(!e||v||P==null){$n(!1);return}const n=e.duration||0,a=e.currentTime||0;$n(n>0&&a/n>=.8)},[v,P,l]),vn=_((e,n)=>["tv-sources",E,v?"movie":"tv",s,e,n,K],[E,v,s,K]),pn=_(async(e,n)=>{if(!r||!s||!E)return{valid:!1,sources:[]};const a=v?"movie":"tv",m=await kt.tv.sources.query({provider:E,type:a,tmdbId:String(s),season:e,episode:n,title:r.title||"",year:r.year||"",totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||"",...K?{server:K}:{}});return{valid:"valid"in m?m.valid:!1,error:"error"in m?m.error:void 0,sources:m.sources,referer:"referer"in m?m.referer:void 0,audioTracks:m.audioTracks,subtitles:"subtitles"in m?m.subtitles:void 0,servers:"servers"in m?m.servers:void 0,server:"server"in m?m.server:void 0,embedUrl:"embedUrl"in m?m.embedUrl:void 0}},[r,s,E,v,K]),_r=_(()=>{if(v||!r||!s||!E||I||P==null)return;const e=vn(u,P);M.getQueryState(e)?.status!=="success"&&M.prefetchQuery({queryKey:e,queryFn:()=>pn(u,P),staleTime:300*1e3,gcTime:1800*1e3})},[v,r,s,E,I,P,u,M,vn,pn]),ms=_(()=>{if(ve)return;qt();const e=l.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&_r(),!Ve.current&&(Ve.current=setTimeout(()=>{Ve.current=null,Je(e.currentTime,e.duration||0)},5e3)))},[Je,l,ve,qt,_r]),hs=_(()=>{const e=l.current;if(!(!e||!r)&&(Ve.current&&clearTimeout(Ve.current),Ve.current=null,Je(e.currentTime,e.duration||0),!c)){if(P!=null){Ct&&(ye(P),Pe(u,P));return}!v&&G==null&&!Mn||(Zr(v?r.title:`${r.title} - Season ${u}`),ut(!0),Xe.current=!0)}},[v,r,u,P,G,Mn,Ct,Je,Pe,l,c]),{checkEnd:fn,logDuration:Cr}=eo({videoRef:l,sourceType:I?"iframe":void 0,resetKey:`${j}:${u}:${S}:${On}`,onEnd:hs}),vs=_(()=>{i.actions.onPlay()},[i.actions]),ps=_(()=>{i.actions.onPause();const e=l.current;e&&!e.ended&&Je(e.currentTime,e.duration||0)},[i.actions,Je,l]),fs=_(()=>{const e=l.current;if(e){try{const n=parseFloat($.getItem("playerVolume")||"");isNaN(n)||(e.volume=Math.max(0,Math.min(1,n))),e.muted=$.getItem("playerMuted")==="true"}catch{}if(X.current!=null&&X.current>0){try{e.currentTime=X.current}catch{}X.current=null}qt()}},[l,qt]),Un=_(()=>{const e=l.current;if(e&&X.current!=null&&X.current>0){try{e.currentTime=X.current}catch{}X.current=null}},[l]),bs=_(()=>{_t>0&&(X.current=_t);const e=l.current;if(e&&_t>0){try{e.currentTime=_t,X.current=null}catch{}e.play().catch(()=>{})}ln(!1),Xe.current=!0},[_t,l]),Tr=_(()=>{X.current=null;const e=l.current;e&&(e.currentTime=0,e.play().catch(()=>{})),ln(!1),Xe.current=!0},[l]),Wn=_(()=>{P!=null&&(Xe.current=!0,ye(P),Pe(u,P))},[P,u,Pe]),Hn=_(()=>{G!=null&&(ut(!1),Xe.current=!0,te(G),ye(1),Pe(G,1))},[G,Pe]),qn=_(async()=>{if(j)try{zt?await qe.mutateAsync({id:j,status:"Completed"}):r&&s&&(await Ke.mutateAsync({tmdbId:Number(s),mediaType:k||"tv",title:r.title,poster:r.poster,backdrop:r.backdrop,year:r.year,overview:r.overview,adult:r.adult,status:"Completed",silent:!0}),Br.success("Moved to Completed")),ut(!1),x("/")}catch{}},[j,zt,qe,Ke,r,s,k,x]);b(()=>{Xe.current=!1,an.current=null,ln(!1),$n(!1),mr(0),hr(!1),zn(!1),hn.current=!1,X.current=null,Vn.current=0},[j,u,S]),b(()=>{un.current=ze},[ze]),b(()=>{Ft&&(hr(!0),hn.current=!0)},[Ft,j,u,S]),b(()=>{if(d||Ln||!Ye||Xe.current)return;const e=`${j}:${u}:${S}`;if(an.current===e)return;an.current=e;const n=Ye,a=n.currentTime??0;$r(a)&&n.completed!==1&&!Qt(a,n.duration??0)&&(mr(a),ln(!0))},[Ye,Ln,j,u,S,d]),b(()=>{!d&&Qe&&l.current&&l.current.pause()},[Qe,l,d]),b(()=>{!d&&mt&&l.current&&l.current.pause()},[mt,l,d]),b(()=>{(je||mt||Ge)&&i.state.isFullscreen&&i.actions.toggleFullscreen()},[je,mt,Ge,i.state.isFullscreen,i.actions]),b(()=>{const e=l.current;return()=>{Ve.current&&clearTimeout(Ve.current),Ve.current=null,!e?.ended&&i.engine.getState().duration>0&&Je(i.engine.getTimeline().currentTime,i.engine.getState().duration)}},[i.engine,Je,l]);const Kn=_(e=>{let n=null,a=!0;try{n=$.getItem("tvLastSubtitle"),a=$.getItem("tvSubtitlesEnabled")!=="false"}catch{}return or(e,{lastKey:n,enabled:a})},[]),Yn=_(e=>{if(!(e<0))try{$.setItem("tvSubtitlesEnabled","true"),$.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),kr=_(e=>{if(e.length===0)return 0;let n=null;try{n=$.getItem("tvLastAudio")}catch{}if(n){const a=e.findIndex(L=>nr(L)===n);if(a>=0)return a;const m=n.indexOf("|||"),h=m>=0?n.slice(0,m):n,T=m>=0?n.slice(m+3):n,D=e.findIndex(L=>L.language===h||L.label===T);if(D>=0)return D}return or(e,{lastKey:null,enabled:!0})},[]),Er=_(e=>{let n=null;try{n=$.getItem("tvLastQuality")}catch{}if(!n||e.length===0)return 0;const a=e.findIndex(L=>(L.quality||"")===n);if(a>=0)return a;const m=L=>{const ee=/(\d{3,4})/.exec(L||"");return ee?parseInt(ee[1],10):0},h=m(n);if(!h)return 0;let T=0,D=1/0;return e.forEach((L,ee)=>{const y=m(L.quality),H=Math.abs(y-h);y>0&&H<D&&(D=H,T=ee)}),T},[]),{data:Nr}=No(j||void 0),wr=Ce(()=>(Nr?.progress??[]).filter(n=>n.season===u&&(n.completed===1||Qt(n.currentTime,n.duration))).map(n=>String(n.episode)),[Nr,u]),Ar=Ce(()=>Ne.map(e=>({id:String(e.episode_number),label:`Episode ${e.episode_number}`,sublabel:e.name||void 0,thumbnail:e.still_path?`https://image.tmdb.org/t/p/w185${e.still_path}`:void 0})),[Ne]),Ir=Ce(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Qn=Ce(()=>[r?.year,r?.status,r?.number_of_seasons?`${r.number_of_seasons} Season${r.number_of_seasons>1?"s":""}`:null,r?.number_of_episodes?`${r.number_of_episodes} Episodes`:null].filter(Boolean),[r]);b(()=>{if(!c&&Q.length!==0&&!Q.some(e=>e.id===E)){const e=Q.find(n=>n.tier==="direct")?.id??Q[0].id;nt(e);try{$.setItem("tvProvider",e)}catch{}}},[Q,E,c]),b(()=>{he([]),at(""),gt(""),it(!1)},[E]),b(()=>{if(!c&&Se.length!==0&&!Se.includes(K)){xt(Se[0]);try{$.setItem("tvServer",Se[0])}catch{}}},[Se,K,c]),b(()=>{if(!s){R(null),Y([]),rt(""),se(""),He("");return}const e=Number(s),n=k||"tv";R(null),Y([]),rt(""),se(""),He("");const a=parseInt(z.current.get("s")||"",10),m=parseInt(z.current.get("e")||"",10);te(isNaN(a)?1:a),ye(isNaN(m)?1:m),ft(0),kt.tv.details.query({type:n,id:String(e)}).then(h=>{const T={id:h.id,title:h.title||"",overview:h.overview||"",vote_average:h.vote_average,year:h.year,poster:h.poster,backdrop:h.backdrop,imdb_id:h.imdb_id||void 0,adult:h.adult,status:h.status,seasons:h.seasons,number_of_seasons:h.number_of_seasons};R(T),T.seasons&&T.seasons.length>0&&isNaN(a)&&te(T.seasons[0].season_number)}).catch(()=>{})},[s,k]),b(()=>{if(!r||!s)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){Le([]);return}const n=parseInt(f.get("e")||"",10);kt.tv.episodes.query({id:String(s),season:String(u)}).then(a=>{const m=(a.episodes||[]).map(h=>({episode_number:h.episode_number,name:h.name||"",vote_average:h.vote_average,overview:h.overview||"",still_path:h.still_path||""}));Le(m),m.length!==0&&ye(h=>!isNaN(n)&&m.some(T=>T.episode_number===n)?n:m.some(T=>T.episode_number===h)?h:m[0].episode_number)}).catch(()=>{})},[r,s,u,f]),b(()=>{if(!I||!r||!s)return;tr(`/api/tv/embed/${E}/${v?"movie":"tv"}/${s}?season=${u}&episode=${S}`).then(n=>{if(n.url)return He(n.url),tr(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(a=>{a.finalUrl&&He(a.finalUrl)})}).catch(()=>{})},[E,r,s,u,S,v,I]);const bn=_(async()=>{if(!r||!s||!E||I||r.adult&&!Ot)return;const e=ze;Me(!0),se(""),Bt.current.length===0&&(Y([]),ft(0),Ue([]),Pt([]));try{const n=await M.fetchQuery({queryKey:vn(u,S),queryFn:()=>pn(u,S),staleTime:3e5,gcTime:18e5});if(un.current!==e)return;if(Me(!1),!n.valid||!n.sources?.length){se(n.error?`${n.error}`:Se.length>0?`No streams from ${K}. Try another server.`:"No streams available.");return}if(d&&K&&n.server&&n.server!==K){Y([]),se("The host's selected server is unavailable. Automatic source switching is disabled in watch-along rooms.");return}!c&&!K&&n.server&&xt(n.server);const a=d?n.sources.filter(L=>L.type==="hls"):n.sources;if(d&&a.length===0){Y([]),se("The room requires a direct HLS source. No compatible stream is available here.");return}Y(a),Nt(n.server||K),rt(e),n.servers?.length&&he(n.servers),n.embedUrl&&at(n.embedUrl),ft(Er(a)),n.referer&&Gt(n.referer);const m=n.audioTracks||[];Ue(m),It(m.length>0?kr(m):0);const h=n.subtitles||[];if(Pt(h),h.length>0){const L=Kn(h);De(L),Yn(L)}else De(-1);const T=v?"movie":"tv",D=s;kt.tv.subtitles.query({type:T,tmdbId:String(D),season:String(u),episode:String(S)}).then(L=>{if(un.current!==e)return;const ee=Array.isArray(L.subtitles)?L.subtitles:[];ee.length!==0&&Pt(y=>{const H=[...y,...ee.filter(J=>!y.some(V=>V.url===J.url))];if(y.length===0){const J=Kn(H);De(J),Yn(J)}return H})}).catch(()=>{}),se("")}catch(n){if(un.current!==e)return;Me(!1),se(n instanceof Error?n.message:"Failed to load streams.")}},[r,s,E,u,S,v,I,Ot,Se,K,Kn,Yn,kr,Er,M,vn,pn,ze,d,c]),jn=_(()=>{const e=l.current;e&&!isNaN(e.currentTime)&&(X.current=e.currentTime)},[l]),gs=_(e=>{if(!(c||d&&e==="Embed")){if(e==="Embed"){it(!0);return}jn(),it(!1),xt(e);try{$.setItem("tvServer",e)}catch{}se("")}},[jn,c,d]),ys=_(e=>{nt(e);try{$.setItem("tvProvider",e)}catch{}},[]);b(()=>{E&&r&&!I&&bn()},[E,r,bn,I]),b(()=>{if(je){i.engine.unload();return}if(!l.current)return;if(F.current=null,I||Ae||d&&W[we]?.type!=="hls"){i.engine.unload();return}if(ve&&!d)return i.engine.loadSource({url:"/av-sync-test.mp4"},{autoPlay:!mn.current});if(tn.current!=null&&(X.current=tn.current,tn.current=null),Be===ze&&X.current==null&&!mn.current)try{const y=l.current;y&&!y.ended&&y.currentTime>1&&(X.current=y.currentTime)}catch{}const n=X.current??0,a=!ue&&Be===ze?Ae?"":W[we]?.url||"":"";if(!a){try{l.current?.pause(),l.current?.removeAttribute("src"),l.current?.load()}catch{}return}const m=l.current;m.pause(),m.removeAttribute("src"),m.load(),i.actions.resetMediaState();const h=`/api/tv/stream-proxy?url=${encodeURIComponent(a)}&referer=${encodeURIComponent(We)}&provider=${encodeURIComponent(E)}`,T=Na()||document.body.classList.contains("low-end"),D=T?60:180,L=i.engine.loadSource({url:h,hls:W[we]?.type==="hls"},{hlsConfig:{enableWorker:!0,lowLatencyMode:!1,startPosition:n>0?n:-1,maxBufferLength:D,maxMaxBufferLength:D+(T?30:60),backBufferLength:T?30:60,maxBufferSize:(T?120:360)*1e3*1e3,fragLoadPolicy:{default:{maxTimeToFirstByteMs:15e3,maxLoadTimeMs:45e3,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:3,retryDelayMs:800,maxRetryDelayMs:6e3}}},manifestLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:25e3,timeoutRetry:{maxNumRetry:1,retryDelayMs:500,maxRetryDelayMs:2e3},errorRetry:{maxNumRetry:2,retryDelayMs:800,maxRetryDelayMs:4e3}}}},onHls:(y,H)=>{F.current=y;const J=()=>{let O=!1,B=0;try{O=$.getItem("tvSubtitlesEnabled")==="true";const N=parseInt($.getItem("tvSelectedSubtitle")||"0",10);!isNaN(N)&&N>=0&&(B=N)}catch{}return{enabled:O,index:B}},V=()=>{if(typeof y.subtitleTrack!="number")return;if(ce.current.length>0){y.subtitleTrack=-1;return}const O=Array.isArray(y.subtitleTracks)?y.subtitleTracks:[];if(O.length===0){y.subtitleTrack=-1;return}const B=J();if(B.enabled){const N=B.index<O.length?B.index:0;y.subtitleTrack=N,De(N),xn()}else y.subtitleTrack=-1};ka(y,H.Events,{getWant:()=>Mt.current,onResolve:O=>It(O)}),y.on(H.Events.MANIFEST_PARSED,V),y.on(H.Events.SUBTITLE_TRACKS_UPDATED,()=>{V()}),y.on(H.Events.SUBTITLE_TRACK_SWITCH,(O,B)=>{if(ce.current.length>0){if(B.id!==-1)try{y.subtitleTrack=-1}catch{}return}const N=Array.isArray(y.subtitleTracks)?y.subtitleTracks:[];if(N.length!==0){if(B.id===-1){const Ee=J();if(Ee.enabled){const ae=Ee.index<N.length?Ee.index:0;y.subtitleTrack=ae;return}}De(B.id),xn()}})},onReady:()=>{(n>0||!mn.current&&hn.current)&&i.engine.play()},onError:y=>{se(y.message),Me(!1),F.current=null}}),ee=()=>{const J=m.error?.code===4?"Video source not supported or not found":"Failed to load video stream";se(`${J}. The source may be invalid or expired. Try switching source or reloading.`),Me(!1)};return m.addEventListener("error",ee),()=>{L(),F.current=null,m.removeEventListener("error",ee)}},[W,Be,ue,we,E,We,I,Ae,l,tn,ve,j,u,S,Un,xn,i.actions,i.engine,ze,d,je]),b(()=>{if(c||!Ut||Qe||dt||Ht||I||ve)return;const e=l.current;!e||!e.paused||e.ended||e.readyState<1||(Un(),i.engine.play())},[Ut,Qe,dt,Ht,I,ve,Un,l,c,i.engine]),b(()=>{const e=F.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=Te)},[Te]),b(()=>{const e=F.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ce.current.length>0||(me>=0?e.subtitleTrack=me:e.subtitleTrack=-1)},[me]),b(()=>{const e=l.current;if(!(!e||I)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ce.current=[],ke.length!==0&&(ke.forEach(n=>{const a=document.createElement("track");a.kind="subtitles",a.label=n.label||n.language||"Unknown",a.srclang=n.language||n.label||"en";const m=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent(We)}`;a.src=m,a.addEventListener("load",()=>{const h=ce.current.indexOf(a),T=a.track;if(T&&h>=0){const D=h===yt.current;T.mode=D&&!Pn.current?"showing":"hidden"}}),e.appendChild(a),ce.current.push(a)}),ke.length>0)))try{const n=F.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[ke,We,I,E,K,l]),b(()=>{const e=l.current;if(!e||I)return;const n=F.current;ce.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const a=()=>{const T=ar(i.state.subtitleFontSize,e.clientHeight||720),D=Math.max(0,Math.min(100,100-i.state.subtitlePosition)),L=()=>{const V=T*16,O=e.videoHeight||e.clientHeight||720,B=e.videoWidth||e.clientWidth||1280;return{step:V*1.3/O*100,chars:Math.max(20,Math.floor(B/(V*.55)))}},ee=(V,O)=>{const B=V;B.snapToLines=!1,B.line=O},y=V=>{if(!V.cues)return;Array.from(V.cues).forEach(ae=>ee(ae,D));const O=Array.from(V.activeCues??[]);if(O.length<=1){O.forEach(ae=>ee(ae,D));return}const{step:B,chars:N}=L();let Ee=D;for(let ae=O.length-1;ae>=0;ae--){const Ze=String(O[ae].text??"").replace(/<[^>]*>/g,"").split(`
|
|
3
|
-
`).reduce((yn,Kt)=>yn+Math.max(1,Math.ceil(Kt.length/N)),0);Ee=Math.max(0,Ee-Ze*B),ee(O[ae],Ee),Ee-=B*.4}},H=ce.current;if(H.length>0){H.forEach((V,O)=>{const B=V.track;if(!B)return;const N=O===me;B.mode=N&&!_e?"showing":"hidden",N&&!_e&&y(B)});return}const J=Array.from(e.textTracks);J.length!==0&&J.forEach((V,O)=>{const B=O===me;V.mode=B&&!_e?"showing":"hidden",B&&!_e&&y(V)})};a();const m=()=>a();e.textTracks.addEventListener("addtrack",m),e.addEventListener("loadedmetadata",a,{once:!0});const h=window.setTimeout(a,600);return()=>{e.textTracks.removeEventListener("addtrack",m),e.removeEventListener("loadedmetadata",a),window.clearTimeout(h)}},[me,ke,I,E,l,_e,i.state.subtitleFontSize,i.state.subtitlePosition]),b(()=>{if(!_e)return;const e=l.current,n=$t.current;if(!e||!n)return;const a=St/1e3,m=Nn/1e3,h=new Set;let T=[],D=-1,L=-1,ee=-1,y=-1,H=0,J=0,V=!1;const O=()=>{const q=yt.current;if(q<0)return null;const et=ce.current;return et.length>0?et[q]?.track??null:Array.from(e.textTracks)[q]??null},B=(q,et)=>{const pe=q.cues;if(!pe||pe.length===0)return Array.from(q.activeCues??[]);let ht=0,vt=pe.length;for(;ht<vt;){const xe=ht+vt>>>1;pe[xe].endTime+a<et?ht=xe+1:vt=xe}const Yt=[];for(let xe=ht;xe<pe.length;xe++){const Sn=pe[xe];if(Sn.startTime+a>et)break;Sn.endTime+a>=et&&Yt.push(Sn)}return Yt},N=()=>{const q=O(),et=e.currentTime-m,pe=q?B(q,et):[],ht=e.clientWidth,vt=e.clientHeight,Yt=e.videoWidth,xe=e.videoHeight;if(pe.length===T.length&&pe.every((Jn,Zn)=>Jn===T[Zn])&&ht===D&&vt===L&&Yt===ee&&xe===y||(T=pe,D=ht,L=vt,ee=Yt,y=xe,n.textContent="",pe.length===0))return;const Rr={fontSize:ar(i.state.subtitleFontSize,vt),position:i.state.subtitlePosition,bgOpacity:i.state.subtitleBgOpacity,bgColor:i.state.subtitleBgColor,textColor:i.state.subtitleTextColor,edge:i.state.subtitleEdge,bold:i.state.subtitleBold},Ts=to(Rr),ks=no(e,Rr.position);pe.forEach((Jn,Zn)=>{const Lr=String(Jn.text??"");if(!ro(Lr).trim())return;const er=document.createElement("div"),Es=(pe.length-1-Zn)*1.7;er.style.cssText=`${Ts}
|
|
4
|
-
bottom: calc(${ks}px + ${Es}em);`,er.innerHTML=so(Lr),n.appendChild(er)})},Ee=()=>{Array.from(e.textTracks).forEach(q=>{h.has(q)||(h.add(q),q.addEventListener("cuechange",N))})},ae=()=>{Ee(),N()},Xn=()=>{if(V||J)return;const q=()=>{J=0,!(V||e.paused||e.ended)&&(N(),Xn())};J=window.requestAnimationFrame(q)},Ze=e,yn=()=>{H=0,N(),!V&&Ze.requestVideoFrameCallback&&(H=Ze.requestVideoFrameCallback(yn))},Kt=()=>{N(),Ze.requestVideoFrameCallback?H||(H=Ze.requestVideoFrameCallback(yn)):Xn()};Ee(),e.textTracks.addEventListener("addtrack",ae),e.textTracks.addEventListener("removetrack",ae),e.addEventListener("timeupdate",N),e.addEventListener("seeked",N),e.addEventListener("loadedmetadata",N),e.addEventListener("play",Kt);const Pr=Array.from(e.querySelectorAll("track"));Pr.forEach(q=>q.addEventListener("load",N));const xr=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>N());return xr?.observe(e),N(),Kt(),()=>{V=!0,h.forEach(q=>q.removeEventListener("cuechange",N)),e.textTracks.removeEventListener("addtrack",ae),e.textTracks.removeEventListener("removetrack",ae),e.removeEventListener("timeupdate",N),e.removeEventListener("seeked",N),e.removeEventListener("loadedmetadata",N),e.removeEventListener("play",Kt),Pr.forEach(q=>q.removeEventListener("load",N)),xr?.disconnect(),J&&window.cancelAnimationFrame(J),H&&Ze.cancelVideoFrameCallback&&Ze.cancelVideoFrameCallback(H),n.textContent=""}},[_e,St,me,ke,Nn,l,i.state.subtitleFontSize,i.state.subtitlePosition,i.state.subtitleBgOpacity,i.state.subtitleBgColor,i.state.subtitleTextColor,i.state.subtitleEdge,i.state.subtitleBold]);const Gn=()=>{R(null),Y([]),He(""),x(-1)},Ss=_(e=>{c||(te(e),ye(1),Pe(e,1))},[Pe,c]),gn=!v&&r?.seasons&&r.seasons.length>1?t("label",{className:p.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{disabled:c,value:u,onChange:e=>Ss(parseInt(e.currentTarget.value,10)||1),className:p.select,children:r.seasons.map(e=>t("option",{value:e.season_number,children:["Season ",e.season_number," (",e.episode_count," ep)"]},e.season_number))})]}):null,Tt=_(e=>{if(c)return;const n=parseInt(e,10);if(!isNaN(n)){try{l.current?.pause()}catch{}ye(n),Pe(u,n)}Dn(!1)},[u,Pe,l,c]);b(()=>{if(v)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(P!=null?Tt(String(P)):Br.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[v,P,Tt]);const _s=e=>{It(e);try{const a=At[e];a&&$.setItem("tvLastAudio",nr(a))}catch{}const n=F.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Cs=e=>{De(e);try{if(e===-1)$.setItem("tvSubtitlesEnabled","false");else{$.setItem("tvSubtitlesEnabled","true"),$.setItem("tvSelectedSubtitle",String(e));const h=ke[e];h&&$.setItem("tvLastSubtitle",nr(h))}}catch{}const n=l.current,a=F.current;if(a&&typeof a.subtitleTrack=="number"&&Array.isArray(a.subtitleTracks)&&a.subtitleTracks.length>0&&(a.subtitleTrack=ce.current.length>0||e<0?-1:e),!n)return;const m=ce.current;if(m.length>0){m.forEach((h,T)=>{const D=h.track;if(!D)return;const L=T===e;D.mode=L&&!_e?"showing":"hidden"});return}Array.from(n.textTracks).forEach((h,T)=>{const D=T===e;h.mode=D&&!_e?"showing":"hidden"})};return b(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=v?`${r.title} - dango`:`${r.title} - Season ${u} Episode ${S} - dango`},[r,v,u,S]),b(()=>{if(!r||v)return;const e=new URLSearchParams(f),n=e.get("s"),a=e.get("e"),m=String(u),h=String(S);n===m&&a===h||(e.set("type",f.get("type")||"tv"),e.set("s",m),e.set("e",h),x(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,v,u,S,f,x]),t("div",{className:`${Re.playerPageLayout} ${Fe?Re.theaterMode:""} ${v?Re.noSidebar:""}`,onClick:ns,children:[Fe&&t(oo,{videoRef:l,active:In.enabled&&!I&&W.length>0&&!$e&&!(r?.adult&&!Ot),settings:In}),!Fe&&!v&&t("aside",{className:Re.episodeSidebar,children:r?t(ao,{episodes:Ar,currentEpisode:String(S),watchedEpisodes:wr,onEpisodeClick:Tt,header:gn}):t(io,{variant:"sidebar"})}),t("div",{className:Re.playerMain,children:[r&&t("div",{className:p.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!Ot?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:I&&ot&&!d?t("iframe",{src:ot,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!I&<&&!d?t("iframe",{src:lt,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!I&&(W.length>0||ue)?t(tt,{children:[$e&&t(Or,{error:$e,onRetry:bn}),t(Sa,{player:i,title:r.title,episodeLabel:v?void 0:`S${u} E${S}`,server:de||bt?.label||E,audioTracks:At,selectedAudioTrack:Te,onAudioTrackChange:_s,subtitles:ke,selectedSubtitle:me,onSubtitleChange:Cs,streams:W,resolutionIdx:we,onResolutionChange:e=>{jn(),ft(e);try{const n=W[e]?.quality;n&&$.setItem("tvLastQuality",n)}catch{}},onBack:Gn,videoDelayEnabled:en,onVideoDelayToggle:Tn,videoDelayMs:Oe,onVideoDelayChange:Dt,onCalibrateAvSync:d?void 0:Fr,subtitleDelayMs:St,onSubtitleDelayChange:qr,showNextEpisodeButton:!c&&Xr&&!Qe&&!dt,onNextEpisode:Wn,isLoading:ue,isTheaterMode:Fe,onTheaterModeToggle:Fn,ambientSettings:In,onAmbientChange:Kr,hideChrome:je||Ge,children:t(tt,{children:[t(Fs,{autoPlay:!d&&Ut&&!Ht,playsInline:!0,disablePictureInPicture:!0,className:`${p.video} ${An?p.videoHidden:""}`,onTimeUpdate:()=>{ve||(ms(),fn())},onEnded:()=>{ve||fn(!0)},onPlay:vs,onPause:ps,onSeeked:()=>{ve||(qt(),fn())},onLoadedMetadata:()=>{fs(),Cr(),fn()},onDurationChange:()=>{Cr()},onContextMenu:e=>e.preventDefault(),onError:()=>{se("Video failed to load. Try another server or reload."),Me(!1)}}),t("canvas",{ref:Zt,className:`${p.delayCanvas} ${An?p.delayCanvasActive:""}`}),_e&&t("div",{ref:$t,className:p.subtitleOverlay}),t(lo,{isOpen:kn,ms:Oe,onChange:Dt,onApply:Ur,onClose:Vr,testClipActive:ve,onTestClip:Wr}),(je||Ge)&&t("div",{className:p.watchedOverlay,children:[t(ie,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)"}}),t("p",{className:p.watchedTitle,children:Ge||ct?G!=null?"Season Complete!":v?"Movie Completed!":"Show Completed!":v?"Movie watched":`S${u} E${S} watched`}),t("p",{className:p.watchedSubtext,children:Ge||ct?G!=null?`You finished Season ${u}.`:v?"You finished this movie!":"Congratulations! You finished all available episodes.":"Resume where you left off, replay from the beginning, or continue with the next episode."}),t("div",{className:`${p.watchedActions} ${Ge?p.watchedActionsCentered:""}`,children:[t("div",{children:Ie>5&&!Ge&&t(fe,{variant:ur?void 0:"secondary",onClick:Sr,children:`Resume ${jt(Ie)}`})}),t("div",{children:P!=null?t(fe,{onClick:Wn,children:`Watch EP ${P}`}):G!=null?t(fe,{onClick:Hn,children:`Start Season ${G}`}):null}),t("div",{children:[t(fe,{variant:"secondary",onClick:yr,children:"Replay"}),ct&&t(fe,{onClick:qn,disabled:qe.isPending||Ke.isPending,children:qe.isPending||Ke.isPending?"Saving...":"Move to Completed"})]})]})]})]})})]}):$e&&!I?t(Or,{error:$e,onRetry:bn}):null}),t(Lo,{playback:rn?{selection:rn,position:l.current?.currentTime||0,playing:!1,rate:i.engine.getState().playbackRate}:null,onCreate:()=>{En(),i.engine.pause()},needsPlayback:ir.needsPlayback,onEnablePlayback:ir.enablePlayback}),d&&!ue&&r&&!rn&&t("p",{role:"alert",children:"The host's direct HLS source is unavailable here. Retry or leave the room to use another source."}),!Fe&&r&&t(co,{}),!Fe&&gn&&t("div",{className:p.mobileSeasonRow,children:gn}),!Fe&&r&&t("div",{className:Z.streamPanel,children:[t("div",{className:p.providerRow,children:[t("label",{className:p.controlLabel,children:["Provider",t("select",{value:E,onChange:e=>ys(e.currentTarget.value),className:p.select,disabled:c||Q.length===0,children:wt?t("option",{value:"",children:"Loading..."}):Q.length===0?t("option",{value:"",children:"No providers available"}):t(tt,{children:[A.length>0&&t("optgroup",{label:"Direct HLS",children:A.map(e=>t("option",{value:e.id,children:e.label},e.id))}),re.length>0&&t("optgroup",{label:"Embeds",children:re.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]}),!v&&ds(p.providerActions)]}),!c&&!I&&(ue?t("div",{className:p.sourceLoader,children:t("div",{className:p.ringSpinner})}):t(Ca,{servers:Jt,selectedServer:Lt?"Embed":K,onServerSelect:gs}))]}),!Fe&&r&&t("div",{className:Re.playerInfoContainer,children:[t("div",{className:Re.playerInfoHeader,children:[t("div",{className:Re.playerAnimeCard,children:r.poster&&t(Bs,{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"})}),t("div",{className:Re.videoTitleSection,children:[t("div",{className:Z.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:p.meta,children:[t("span",{className:p.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:p.rating,children:[t(ie,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${p.typeBadge} ${p[v?"movie":"tv"]}`,children:v?"Movie":"TV Show"})]}),Ir.length>0&&t("div",{className:p.genreRow,children:Ir.map(e=>t("span",{className:p.genreChip,children:e},e))}),Qn.length>0&&t("div",{className:p.metaRow,children:Qn.map((e,n)=>t("span",{children:[e,n<Qn.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:Z.controls,children:t("button",{className:`${Z.watchlistBtn} ${zt?Z.inList:""}`,onClick:Gr,disabled:jr,type:"button",children:[zt?t(ie,{name:"check",size:14}):t(ie,{name:"plus",size:14}),zt?"In Watchlist":"Add to Watchlist"]})})]})]}),t("div",{className:Re.infoColumns,children:[t("div",{className:`${Z.descriptionSection} ${Z.synopsisFlat}`,children:[t("h3",{children:"Synopsis"}),t(Ro,{text:r.overview,emptyText:"No description available."}),t("button",{className:Z.detailsToggleBtn,onClick:()=>es(!cn),type:"button",children:[cn?t(ie,{name:"chevron-up"}):t(ie,{name:"chevron-down"}),cn?"Hide Details":"Show Details"]})]}),cn&&t("div",{className:p.detailGrid,children:[r.first_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:v?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Networks"}),t("span",{children:r.networks.map(e=>e.name).join(", ")})]}),r.created_by&&r.created_by.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Created By"}),t("span",{children:r.created_by.map(e=>e.name).join(", ")})]}),r.episode_run_time&&r.episode_run_time.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:p.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:p.imdbLink,children:"View on IMDb"})]})]})]})]}),!v&&t(uo,{isOpen:ts,onClose:()=>Dn(!1),episodes:Ar,currentEpisode:String(S),watchedEpisodes:wr,onEpisodeClick:Tt,header:gn}),r?.adult&&!Ot&&t(bo,{isOpen:!0,onClose:Gn,onGrant:Yr}),t(mo,{isOpen:!d&&Qe&&!Ln&&an.current===`${j}:${u}:${S}`&&Ye?.completed!==1&&!Qt(Ie,Ye?.duration??0),onClose:Tr,title:"Resume Watching",message:t(tt,{children:["You were at ",t("strong",{children:jt(_t)})]}),restartLabel:"Start from Beginning",onResume:bs,onRestart:Tr}),t(Mr,{isOpen:mt,onClose:()=>br(!0),title:ct?v?"Movie Completed!":"Show Completed!":"Episode Completed",heading:v?r?.title??"Movie":`S${u} E${S}`,message:ct?v?"You finished this movie!":"Congratulations! You finished all available episodes.":v?"You've already watched this movie. Resume where you left off or replay it.":"You've already watched this episode. Resume where you left off, replay it, or continue with the next episode.",children:[Ie>5&&t(fe,{variant:ur?void 0:"secondary",onClick:Sr,children:`Resume ${jt(Ie)}`}),t(fe,{variant:"secondary",onClick:yr,children:"Replay"}),P!=null?t(fe,{onClick:Wn,children:["Watch EP ",P]}):G!=null?t(fe,{onClick:Hn,children:["Start Season ",G]}):ct?t(fe,{onClick:qn,disabled:qe.isPending||Ke.isPending,children:qe.isPending||Ke.isPending?"Saving...":"Move to Completed"}):null]}),t(Mr,{isOpen:as,onClose:()=>ut(!1),title:v?"Movie Completed!":G!=null?"Season Complete!":"Show Completed!",heading:Jr,message:v?"You finished this movie!":G!=null?`You finished Season ${u}.`:"Congratulations! You finished all available episodes.",children:G!=null?t(fe,{onClick:Hn,children:["Start Season ",G]}):t(tt,{children:[t(fe,{onClick:()=>{ut(!1),Gn()},children:"Back to Details"}),t(fe,{onClick:qn,disabled:qe.isPending||Ke.isPending,children:qe.isPending||Ke.isPending?"Saving...":"Move to Completed"})]})}),!r&&t("div",{className:p.statusMsg,children:[t(ie,{name:"spinner",className:p.spinner})," Loading..."]})]})]})};export{Ai as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as R,a as q,p as E,d as l,h as C,T,u as e,g as F}from"./vendor-core-DfaOB3Rn.js";import{I as a}from"./vendor-icons-C1Pj_eSX.js";import{aj as j,e as U,ak as H,t as J,B as w,a8 as K,i as I}from"./index-CipsDH5j.js";import{c as Q,d as X}from"./useTvLibrary-DPJOHbp1.js";import"./vendor-query-BBT5_sHx.js";import"./libraryInvalidation-DGrdMoRs.js";const Y="_container_198yg_1",Z="_heroSection_198yg_11",ee="_bannerContainer_198yg_17",ne="_banner_198yg_17",te="_bannerOverlay_198yg_37",se="_heroContent_198yg_49",ae="_posterContainer_198yg_62",oe="_poster_198yg_62",ie="_infoGlass_198yg_86",re="_title_198yg_100",le="_quickMeta_198yg_110",ce="_metaItem_198yg_118",de="_iconStar_198yg_126",me="_iconTv_198yg_130",_e="_iconType_198yg_134",he="_genres_198yg_139",ge="_genre_198yg_139",ve="_metaRow_198yg_156",pe="_metaValue_198yg_164",ue="_metaDivider_198yg_168",ye="_synopsisSection_198yg_173",ke="_sectionTitleSmall_198yg_179",be="_synopsis_198yg_173",Ne="_actions_198yg_196",Se="_watchBtn_198yg_202",fe="_watchlistBtn_198yg_226",Ce="_active_198yg_250",Te="_seasonPickerLabel_198yg_256",we="_seasonSelect_198yg_267",Ie="_detailsToggleBtn_198yg_286",Be="_expandedContent_198yg_304",De="_detailGrid_198yg_309",Me="_detailItem_198yg_315",Le="_imdbLink_198yg_333",Pe="_heroSkeleton_198yg_343",$e="_skeletonBanner_198yg_347",Ge="_skeletonContent_198yg_354",xe="_skeletonPoster_198yg_365",Oe="_skeletonInfo_198yg_373",Ae="_skeletonTitle_198yg_380",Ve="_skeletonMeta_198yg_388",We="_skeletonDesc_198yg_396",ze="_skeletonActions_198yg_404",Re="_errorState_198yg_413",qe="_matureOverlay_198yg_434",Ee="_matureContent_198yg_444",n={container:Y,heroSection:Z,bannerContainer:ee,banner:ne,bannerOverlay:te,heroContent:se,posterContainer:ae,poster:oe,infoGlass:ie,title:re,quickMeta:le,metaItem:ce,iconStar:de,iconTv:me,iconType:_e,genres:he,genre:ge,metaRow:ve,metaValue:pe,metaDivider:ue,synopsisSection:ye,sectionTitleSmall:ke,synopsis:be,actions:Ne,watchBtn:Se,watchlistBtn:fe,active:Ce,seasonPickerLabel:Te,seasonSelect:we,detailsToggleBtn:Ie,expandedContent:Be,detailGrid:De,detailItem:Me,imdbLink:Le,heroSkeleton:Pe,skeletonBanner:$e,skeletonContent:Ge,skeletonPoster:xe,skeletonInfo:Oe,skeletonTitle:Ae,skeletonMeta:Ve,skeletonDesc:We,skeletonActions:ze,errorState:Re,matureOverlay:qe,matureContent:Ee};function Qe(){const{id:o}=R(),c=q(),[B]=E(),i=j(B.get("type")),{hasConsent:D}=U(),[t,M]=l(null),[L,_]=l(!0),[u,y]=l(""),[d,P]=l(!1),[h,$]=l(1),G=H(i,o??""),x=Number(o),{data:O}=Q(t?G:void 0),g=!!O?.inLibrary,{toggle:A}=X();C(()=>{o&&(_(!0),y(""),J.tv.details.query({type:i,id:String(o)}).then(s=>{const m={id:s.id,title:s.title||"",overview:s.overview||"",vote_average:s.vote_average,year:s.year,poster:s.poster,backdrop:s.backdrop,imdb_id:s.imdb_id||void 0,adult:s.adult,seasons:s.seasons?.map(z=>({...z,name:""})),number_of_seasons:s.number_of_seasons};M(m),_(!1)}).catch(s=>{y(s.message),_(!1)}))},[o,i]),C(()=>{document.title=t?.title?`${t.title} - dango`:"TV & Movies - dango"},[t?.title]);const V=()=>{!o||!t||c(r?I(i,o):I(i,o,h,1))},W=()=>{t&&A({tmdbId:x,mediaType:i,title:t.title,poster:t.poster,year:t.year,adult:t.adult})},r=i==="movie",v=!r,k=t?.backdrop?`https://image.tmdb.org/t/p/w1280${t.backdrop}`:"",b=t?.poster?`https://image.tmdb.org/t/p/w500${t.poster}`:"",N=T(()=>t?.genres?t.genres.map(s=>s.name).slice(0,5):[],[t?.genres]),S=T(()=>t?.seasons?t.seasons.filter(s=>s.season_number>0):[],[t?.seasons]),p=[t?.year,t?.status,v&&t?.number_of_seasons?`${t.number_of_seasons} Season${t.number_of_seasons>1?"s":""}`:null,v&&t?.number_of_episodes?`${t.number_of_episodes} Episodes`:null].filter(Boolean);if(L)return e("div",{className:n.container,children:e("div",{className:n.heroSkeleton,children:[e("div",{className:n.skeletonBanner}),e("div",{className:n.skeletonContent,children:[e("div",{className:n.skeletonPoster}),e("div",{className:n.skeletonInfo,children:[e("div",{className:n.skeletonTitle}),e("div",{className:n.skeletonMeta}),e("div",{className:n.skeletonDesc}),e("div",{className:n.skeletonActions})]})]})]})});if(u||!t)return e("div",{className:n.container,children:e("div",{className:n.errorState,children:[e(a,{name:"exclamation-triangle",size:48}),e("h2",{children:"Failed to load details"}),e("p",{children:u||"Something went wrong"}),e(w,{onClick:()=>c(-1),children:"Go Back"})]})});const f=t.adult&&!D;return e("div",{className:n.container,style:f?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:[e("div",{className:n.heroSection,children:[e("div",{className:n.bannerContainer,children:[k&&e("div",{className:n.banner,style:{backgroundImage:`url(${k})`}}),e("div",{className:n.bannerOverlay})]}),e("div",{className:n.heroContent,children:[e("div",{className:n.posterContainer,children:b&&e(K,{src:b,alt:t.title,className:n.poster,decoding:"async"})}),e("div",{className:n.infoGlass,children:[e("div",{children:[e("h1",{className:n.title,children:t.title}),e("div",{className:n.quickMeta,children:[t.vote_average!=null&&t.vote_average>0&&e("div",{className:n.metaItem,children:[e(a,{name:"star",className:n.iconStar}),e("span",{children:Number(t.vote_average).toFixed(1)})]}),e("div",{className:n.metaItem,children:[e(a,{name:"tv",className:n.iconTv}),e("span",{children:r?"Movie":"TV Show"})]}),t.vote_count!=null&&e("div",{className:n.metaItem,children:[e(a,{name:"users",className:n.iconType}),e("span",{children:[t.vote_count.toLocaleString()," votes"]})]})]}),N.length>0&&e("div",{className:n.genres,children:N.map(s=>e("span",{className:n.genre,children:s},s))})]}),p.length>0&&e("div",{className:n.metaRow,children:p.map((s,m)=>e(F.Fragment,{children:[e("span",{className:n.metaValue,children:s}),m<p.length-1&&e("span",{className:n.metaDivider,children:"·"})]},m))}),t.overview&&e("div",{className:n.synopsisSection,children:[e("h2",{className:n.sectionTitleSmall,children:"Synopsis"}),e("p",{className:n.synopsis,children:t.overview})]}),e("div",{className:n.actions,children:[e("button",{className:n.watchBtn,onClick:V,children:[e(a,{name:"play",size:14}),r?"Watch Now":`Start S${h}`]}),e("button",{className:`${n.watchlistBtn} ${g?n.active:""}`,onClick:W,children:[g?e(a,{name:"check",size:14}):e(a,{name:"plus",size:14}),g?"In Watchlist":"Add to Watchlist"]})]}),v&&S.length>1&&e("label",{className:n.seasonPickerLabel,children:[e("span",{children:"Season"}),e("select",{value:h,onChange:s=>$(parseInt(s.currentTarget.value,10)||1),className:n.seasonSelect,children:S.map(s=>e("option",{value:s.season_number,children:["Season ",s.season_number," (",s.episode_count," Episodes)"]},s.season_number))})]}),e("button",{className:n.detailsToggleBtn,onClick:()=>P(!d),children:[d?e(a,{name:"chevron-up"}):e(a,{name:"chevron-down"}),d?"Hide Details":"Show Details"]}),d&&e("div",{className:n.expandedContent,children:e("div",{className:n.detailGrid,children:[t.first_air_date&&e("div",{className:n.detailItem,children:[e("strong",{children:r?"Release Date":"First Air Date"}),e("span",{children:t.first_air_date})]}),t.last_air_date&&e("div",{className:n.detailItem,children:[e("strong",{children:"Last Air Date"}),e("span",{children:t.last_air_date})]}),t.networks&&t.networks.length>0&&e("div",{className:n.detailItem,children:[e("strong",{children:"Networks"}),e("span",{children:t.networks.map(s=>s.name).join(", ")})]}),t.created_by&&t.created_by.length>0&&e("div",{className:n.detailItem,children:[e("strong",{children:"Created By"}),e("span",{children:t.created_by.map(s=>s.name).join(", ")})]}),t.episode_run_time&&t.episode_run_time.length>0&&e("div",{className:n.detailItem,children:[e("strong",{children:"Episode Runtime"}),e("span",{children:[t.episode_run_time[0]," min"]})]}),t.imdb_id&&e("div",{className:n.detailItem,children:[e("strong",{children:"IMDb"}),e("a",{href:`https://www.imdb.com/title/${t.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:n.imdbLink,children:"View on IMDb"})]})]})})]})]})]}),f&&e("div",{className:n.matureOverlay,children:e("div",{className:n.matureContent,children:[e(a,{name:"exclamation-triangle",size:48}),e("h2",{children:"Content Warning"}),e("p",{children:"This content may contain mature themes."}),e(w,{onClick:()=>c("/"),children:"Go Back"})]})})]})}export{Qe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._fadeImage_1bp3x_1{opacity:0;transition:opacity .4s ease}._fadeImage_1bp3x_1._loaded_1bp3x_6{opacity:1}._overlay_5hzq9_1{position:fixed;inset:0;background-color:#0009;z-index:var(--z-modal);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);animation:_fadeIn_5hzq9_1 .2s ease-out}._content_5hzq9_11{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:calc(var(--z-modal) + 1);background-color:var(--bg-secondary);padding:var(--space-6);border-radius:var(--radius-lg);width:100%;max-width:min(500px,calc(100vw - 2 * var(--space-4)));max-height:calc(100vh - 2 * var(--space-4));overflow-y:auto;box-shadow:var(--shadow-xl);border:1px solid var(--border-primary);animation:_modalIn_5hzq9_1 .2s var(--ease-smooth)}._sm_5hzq9_29{max-width:min(400px,calc(100vw - 2 * var(--space-4)))}._md_5hzq9_33{max-width:min(500px,calc(100vw - 2 * var(--space-4)))}._lg_5hzq9_37{max-width:min(700px,calc(100vw - 2 * var(--space-4)))}._title_5hzq9_41{margin:0 0 var(--space-4);font-size:var(--font-size-xl);font-weight:var(--font-weight-bold);color:var(--text-primary)}._closeButton_5hzq9_48{position:absolute;top:var(--space-3);right:var(--space-3);display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:var(--radius-md);background:transparent;color:var(--text-secondary);cursor:pointer;opacity:.6;transition:opacity .15s ease,background-color .15s ease}._closeButton_5hzq9_48:hover{opacity:1;background-color:var(--bg-tertiary)}._body_5hzq9_74{color:var(--text-secondary)}._footer_5hzq9_78{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--space-3);margin-top:var(--space-6);padding-top:var(--space-4);border-top:1px solid var(--border-primary)}._footer_5hzq9_78>*{flex:0 1 auto;min-width:0;max-width:100%}@media(max-width:480px){._content_5hzq9_11{padding:var(--space-4)}._footer_5hzq9_78{flex-direction:column;align-items:stretch;justify-content:flex-start}._footer_5hzq9_78>*{flex:1 1 auto;width:100%}}@keyframes _fadeIn_5hzq9_1{0%{opacity:0}to{opacity:1}}@keyframes _modalIn_5hzq9_1{0%{opacity:0;transform:translate(-50%,-50%) scale(.95)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}._container_1x6po_1{position:relative;display:flex;align-items:center}._bellBtn_1x6po_7{background:var(--header-btn-bg, rgba(255, 255, 255, .05));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--header-control-border, rgba(255, 255, 255, .08));color:var(--text-primary);font-size:1.25rem;cursor:pointer;padding:var(--space-2);display:flex;align-items:center;justify-content:center;transition:transform var(--transition-fast),background var(--transition-fast);position:relative;width:50px;height:50px;border-radius:50%}._bellBtn_1x6po_7:hover{background:var(--header-btn-bg-hover, rgba(0, 0, 0, .25));border-color:#ffffff59;transform:translateY(-1px)}._bellBtn_1x6po_7:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._badge_1x6po_39{position:absolute;top:6px;right:6px;background-color:var(--color-danger);color:#fff;font-size:.62rem;font-weight:700;min-width:18px;height:18px;padding:0 4px;border-radius:999px;display:flex;align-items:center;justify-content:center;text-align:center;border:none;pointer-events:none;animation:_badgePulse_1x6po_1 1.8s ease-in-out 2;line-height:1}@keyframes _badgePulse_1x6po_1{50%{box-shadow:0 0 0 4px var(--accent-subtle)}}._dropdown_1x6po_67{position:fixed;top:calc(var(--vv-top, 0px) + var(--header-height, 64px) + var(--space-3));right:max(var(--space-4),calc((100vw - var(--max-width)) / 2 + var(--space-8)));width:min(420px,calc(100vw - 2rem));max-height:min(620px,calc(100vh - var(--header-height, 64px) - 2rem));background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border-secondary);border-radius:var(--radius-lg);box-shadow:var(--shadow-xl);z-index:var(--z-header);overflow:hidden;display:flex;flex-direction:column;animation:_slideIn_1x6po_1 .18s ease-out}@keyframes _slideIn_1x6po_1{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}._dropdownHeader_1x6po_98{padding:var(--space-4);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-primary)}._headerSubtitle_1x6po_106{display:block;margin-top:2px;font-size:var(--font-size-xs);color:var(--text-muted)}._headerActions_1x6po_113{display:flex;align-items:center;gap:var(--space-2)}._closeBtn_1x6po_119{display:none;align-items:center;justify-content:center;width:36px;height:36px;border:0;border-radius:var(--radius-full);color:var(--text-secondary);background:#ffffff0f;cursor:pointer}._sectionHeading_1x6po_132{margin:0;padding:var(--space-3) var(--space-4) var(--space-2);color:var(--text-muted);font-size:var(--font-size-xs);font-weight:700;letter-spacing:.06em;text-transform:uppercase}._dropdownHeader_1x6po_98 h4{margin:0;font-size:1rem;color:var(--text-primary)}._clearAllBtn_1x6po_148{background:none;border:1px solid var(--border-secondary);color:var(--accent-light);font-size:var(--font-size-xs);font-weight:600;cursor:pointer;padding:var(--space-1) var(--space-3);border-radius:var(--radius-full);transition:all var(--transition-fast)}._clearAllBtn_1x6po_148:hover{background:var(--accent-subtle);border-color:var(--border-accent);color:var(--accent-lighter)}._discoveryStatusRow_1x6po_166{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);font-size:.72rem;color:var(--text-muted);background:#ffffff08;border-bottom:1px solid var(--border-primary)}._statusDot_1x6po_177{width:8px;height:8px;border-radius:50%;flex-shrink:0}._statusDotRunning_1x6po_184{background:var(--accent);animation:_statusPulse_1x6po_1 1.2s ease-in-out infinite}._statusDotOk_1x6po_189{background:var(--color-success)}._statusDotInfo_1x6po_193{background:var(--color-info)}._statusDotError_1x6po_197{background:var(--color-danger)}._statusDotIdle_1x6po_201{background:var(--text-muted)}@keyframes _statusPulse_1x6po_1{0%,to{opacity:1}50%{opacity:.35}}._list_1x6po_216{overflow-y:auto;flex:1}._list_1x6po_216::-webkit-scrollbar{width:4px}._list_1x6po_216::-webkit-scrollbar-thumb{background:var(--border-secondary);border-radius:2px}._item_1x6po_230{display:flex;align-items:center;padding:var(--space-3) var(--space-4);gap:var(--space-3);text-decoration:none;transition:background var(--transition-fast);border-bottom:1px solid var(--border-primary);position:relative}._itemTitleLink_1x6po_241{display:block;text-decoration:none;border-radius:var(--radius-sm)}._itemTitleLink_1x6po_241:focus-visible,._systemItemMeta_1x6po_248:focus-visible,._removeItem_1x6po_249:focus-visible,._clearAllBtn_1x6po_148:focus-visible,._modalButton_1x6po_251:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._item_1x6po_230:hover{background:#ffffff0d}._systemItem_1x6po_248{background:#ffffff06}._systemIcon_1x6po_264{width:42px;height:42px;display:grid;place-items:center;border-radius:var(--radius-md);color:var(--accent-light);background:var(--accent-subtle);flex-shrink:0}._thumbnail_1x6po_275{width:48px;height:64px;border-radius:var(--radius-sm);object-fit:cover;flex-shrink:0;box-shadow:0 2px 8px #0000004d}._itemInfo_1x6po_284{flex:1;min-width:0}._itemTitle_1x6po_241{display:block;font-size:.85rem;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:var(--space-1)}._itemMeta_1x6po_300{display:inline-block;font-size:.7rem;background:var(--accent);color:var(--accent-text);padding:1px 6px;border-radius:var(--radius-sm);font-weight:600}._systemItemMeta_1x6po_248{display:inline-block;font-size:.7rem;background:none;color:var(--text-muted);padding:0;text-align:left;font:inherit;font-size:var(--font-size-xs);line-height:1.5;border:0;cursor:pointer;transition:background var(--transition-fast)}._systemItemMeta_1x6po_248:hover{color:var(--text-primary)}._systemItemMeta_1x6po_248 span{color:var(--accent-light);white-space:nowrap}._removeItem_1x6po_249{background:none;border:none;color:var(--text-muted);font-size:var(--font-size-xs);cursor:pointer;padding:var(--space-2);display:flex;align-items:center;justify-content:center;opacity:0;border-radius:var(--radius-sm);transition:opacity var(--transition-fast),color var(--transition-fast)}._item_1x6po_230:hover ._removeItem_1x6po_249{opacity:1}@media(hover:none),(pointer:coarse){._removeItem_1x6po_249{opacity:1}}._removeItem_1x6po_249:hover{color:var(--color-danger)}._queueItem_1x6po_365:hover{color:var(--color-success)}._modalButton_1x6po_251{background:var(--accent);color:var(--accent-text);border:0;padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);cursor:pointer;font-weight:600}._fullMessage_1x6po_379{margin:0;line-height:1.6;white-space:pre-wrap}._emptyState_1x6po_385{min-height:260px;padding:var(--space-10) var(--space-6);text-align:center;color:var(--text-muted);font-size:var(--font-size-sm);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-2)}._emptyState_1x6po_385 strong{color:var(--text-primary);font-size:var(--font-size-base)}._emptyIcon_1x6po_403{width:48px;height:48px;margin-bottom:var(--space-2);border-radius:var(--radius-full);display:grid;place-items:center;color:var(--accent-light);background:var(--accent-subtle)}@media(max-width:768px){._dropdown_1x6po_67{position:fixed;top:calc(var(--header-height, 64px) + env(safe-area-inset-top,0px));left:env(safe-area-inset-left,0px);right:env(safe-area-inset-right,0px);width:auto;height:calc(100dvh - var(--header-height, 64px) - env(safe-area-inset-top,0px));max-height:none;border-radius:0 0 var(--radius-lg) var(--radius-lg);animation:_mobileSheetIn_1x6po_1 .2s ease-out;padding-bottom:env(safe-area-inset-bottom,0px)}._removeItem_1x6po_249{padding:var(--space-2);min-width:36px;min-height:36px}._badge_1x6po_39{top:5px;right:6px;font-size:.58rem;min-width:16px;height:16px;padding:0 3px}._list_1x6po_216{overscroll-behavior:contain}._dropdownHeader_1x6po_98,._discoveryStatusRow_1x6po_166{flex-shrink:0}._closeBtn_1x6po_119{display:flex}}@media(max-width:480px){._bellBtn_1x6po_7{width:42px;height:42px}}@keyframes _mobileSheetIn_1x6po_1{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@media(prefers-reduced-motion:reduce){._dropdown_1x6po_67,._bellBtn_1x6po_7,._badge_1x6po_39,._statusDotRunning_1x6po_184{animation:none;transition:none}}._notificationDivider_1x6po_486{height:1px;flex-shrink:0;margin:var(--space-2) 0;background:var(--border-primary)}.skeleton{position:relative;overflow:hidden;background-color:var(--bg-tertiary);border-radius:var(--radius-sm)}.skeleton:after{position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,#fff0 0,#ffffff0d 20%,#ffffff1f 60%,#fff0);animation:shimmer 1.8s infinite ease-in-out;content:""}.skeleton-text{border-radius:var(--radius-sm);height:1em}.skeleton-circular{border-radius:50%}.skeleton-rectangular{border-radius:var(--radius-md)}.skeleton-card{display:flex;flex-direction:column;background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:var(--radius-lg);overflow:hidden}@keyframes shimmer{to{transform:translate(100%)}}._logo_t3il2_1{height:var(--logo-height, 75px);width:auto;display:block;overflow:visible}._skewer_t3il2_8{fill:none;stroke:#d9c6a5;stroke-width:1.1;stroke-linecap:round}._gaze_t3il2_15{transform:translate(calc(var(--dango-gaze-x, 0) * 1.1px),calc(var(--dango-gaze-y, 0) * .8px));transition:transform var(--gaze-dur, .15s) ease-out}._face_t3il2_20{opacity:0;transition:opacity .18s ease}[data-dango-face=normal] ._faceNormal_t3il2_25,[data-dango-face=pet] ._facePet_t3il2_26,[data-dango-face=squint] ._faceSquint_t3il2_27,[data-dango-face=sleep] ._faceSleep_t3il2_28{opacity:1}[data-dango-hover] ._gaze_t3il2_15{filter:drop-shadow(0 0 .5px var(--accent))}._line_t3il2_36{fill:none;stroke:#140f15;stroke-width:.5;stroke-linecap:round;stroke-linejoin:round}._sway_t3il2_44{animation:_dango-sway_t3il2_1 7.4s ease-in-out infinite}@keyframes _dango-sway_t3il2_1{0%,to{transform:translate(0)}50%{transform:translateY(.5px)}}._weight_t3il2_58{animation:_dango-weight_t3il2_1 5.6s ease-in-out infinite}@keyframes _dango-weight_t3il2_1{0%,to{transform:translate(0)}45%,65%{transform:translate(.2px,.8px)}}._shift_t3il2_73{animation:_dango-shift_t3il2_1 10.5s ease-in-out infinite}@keyframes _dango-shift_t3il2_1{0%,to{transform:translate(.3px,.6px)}50%{transform:translate(-.3px,.3px)}}._rock_t3il2_87{animation:_dango-rock_t3il2_1 7.9s ease-in-out infinite}@keyframes _dango-rock_t3il2_1{0%,72%,to{transform:translate(0)}80%{transform:translate(-.35px,.5px)}88%{transform:translate(.15px,.1px)}}._glance_t3il2_105{animation:_dango-glance_t3il2_1 11s ease-in-out infinite}@keyframes _dango-glance_t3il2_1{0%,30%,to{transform:translate(0)}40%,50%{transform:translate(-1.6px,-.45px)}62%{transform:translate(0)}}._blink_t3il2_124{transform-box:fill-box;transform-origin:center}._blinkDouble_t3il2_129{animation:_dango-blink-double_t3il2_1 4.4s infinite}@keyframes _dango-blink-double_t3il2_1{0%,86%,to{transform:scaleY(1)}89%,90.5%{transform:scaleY(.08)}93%,94.5%{transform:scaleY(.08)}97%{transform:scaleY(1)}}._blinkSlow_t3il2_153{animation:_dango-blink-slow_t3il2_1 9.5s infinite}@keyframes _dango-blink-slow_t3il2_1{0%,82%,to{transform:scaleY(1)}88%{transform:scaleY(.14)}95%{transform:scaleY(1)}}[data-dango-nudge=""] ._bump_t3il2_172{animation:_dango-nudge_t3il2_1 .52s ease-out}@keyframes _dango-nudge_t3il2_1{0%,to{transform:translate(0)}25%{transform:translate(.5px)}60%{transform:translate(-.35px)}}[data-dango-cheer=""] ._heart_t3il2_189{animation:_dango-heart_t3il2_1 1.2s ease-out infinite}._heart_t3il2_189{opacity:0;font-size:4.6px;text-anchor:middle;transform-box:fill-box;transform-origin:center}@keyframes _dango-heart_t3il2_1{0%{opacity:0;transform:translate(0) scale(.35)}22%{opacity:1}to{opacity:0;transform:translate(var(--drift, 0),-6.5px) scale(1.05)}}@media(prefers-reduced-motion:reduce){._sway_t3il2_44,._weight_t3il2_58,._shift_t3il2_73,._rock_t3il2_87,._glance_t3il2_105,._blinkDouble_t3il2_129,._blinkSlow_t3il2_153,[data-dango-nudge=""] ._bump_t3il2_172,[data-dango-cheer=""] ._heart_t3il2_189{animation:none}}._header_3lgqk_1{height:var(--header-height);--logo-height: 42px;--header-control-bg: rgba(255, 255, 255, .045);--header-control-border: rgba(255, 255, 255, .07);--header-btn-bg: rgba(255, 255, 255, .045);background:transparent;border-bottom:1px solid transparent;position:fixed;top:var(--vv-top, 0px);left:0;right:0;z-index:var(--z-header);display:flex;align-items:center;justify-content:center;transition:transform var(--transition-slow),background-color var(--transition-base),border-color var(--transition-base),box-shadow var(--transition-base)}._header_3lgqk_1._hidden_3lgqk_24{transform:translateY(-100%)}._header_3lgqk_1._scrolled_3lgqk_28{background-color:#13151dd9;backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border-bottom:1px solid rgba(255,255,255,.08);box-shadow:0 8px 32px #00000073;--header-btn-bg-hover: rgba(255, 255, 255, .1)}._logo_3lgqk_37{display:flex;align-items:center;justify-content:center;padding:4px;border-radius:var(--radius-md);transition:opacity var(--transition-base),transform var(--transition-fast)}._logo_3lgqk_37:hover{opacity:.9;transform:translateY(-1px)}._headerInner_3lgqk_53{width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--space-8);display:flex;align-items:center;justify-content:space-between}._leftSection_3lgqk_63{display:flex;align-items:center;gap:var(--space-2)}._desktopNav_3lgqk_69{display:flex;align-items:center;gap:var(--space-1);margin-left:var(--space-6);padding:4px 6px;background:var(--header-btn-bg, rgba(255, 255, 255, .05));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--header-control-border, rgba(255, 255, 255, .08));border-radius:var(--radius-full)}._navLink_3lgqk_82{color:var(--text-muted);font-weight:500;font-size:var(--font-size-sm);padding:var(--space-2) var(--space-3);border-radius:var(--radius-full);text-decoration:none;transition:all var(--transition-fast);position:relative;letter-spacing:.01em;background:none;z-index:1}._navLink_3lgqk_82:hover{color:var(--text-primary);background:#ffffff08}._navLinkActive_3lgqk_101{color:#fff;font-weight:600;background:transparent}._navPill_3lgqk_107{position:absolute;top:4px;bottom:4px;background:#ffffff12;border-radius:var(--radius-full);transition:left .25s cubic-bezier(.22,1,.36,1),width .25s cubic-bezier(.22,1,.36,1),opacity .2s ease;pointer-events:none;z-index:0}._navLinkActive_3lgqk_101:after{display:none}._rightSection_3lgqk_125{display:flex;align-items:center;gap:var(--space-3)}._searchWrapper_3lgqk_131{position:relative;display:flex;align-items:center;background:var(--header-btn-bg, rgba(255, 255, 255, .05));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--header-control-border, rgba(255, 255, 255, .08));border-radius:var(--radius-full);height:50px;padding:0 10px 0 14px;gap:8px;transition:all var(--transition-base);cursor:text}._searchWrapper_3lgqk_131:hover{background:var(--header-btn-bg-hover, rgba(255, 255, 255, .08));border-color:#ffffff38}._searchWrapper_3lgqk_131:focus-within{background:#0f1118f2;border-color:#ffffff59;box-shadow:0 4px 20px #00000059}._searchIconButton_3lgqk_158{display:inline-flex;align-items:center;justify-content:center;padding:0;border:none;background:none;color:inherit;cursor:pointer;flex-shrink:0}._searchIcon_3lgqk_158{font-size:.95rem;color:#fff9;flex-shrink:0;transition:color var(--transition-fast)}._searchIconButton_3lgqk_158:hover ._searchIcon_3lgqk_158{color:var(--accent)}._searchWrapper_3lgqk_131:focus-within ._searchIcon_3lgqk_158{color:#fff}._searchInput_3lgqk_185{width:160px;opacity:1;padding:0;border:none;background:transparent;color:var(--text-primary);font-size:var(--font-size-sm);font-family:inherit;height:100%;pointer-events:auto;outline:none;transition:width var(--transition-base)}._searchInput_3lgqk_185:focus,._searchInput_3lgqk_185:focus-visible,input._searchInput_3lgqk_185:focus,input._searchInput_3lgqk_185:focus-visible{outline:none!important;outline-offset:0!important;box-shadow:none!important;border:none!important}._searchInput_3lgqk_185::placeholder{color:#ffffff8c}._searchWrapper_3lgqk_131:focus-within ._searchInput_3lgqk_185{width:230px}._searchKbd_3lgqk_218{display:inline-flex;align-items:center;justify-content:center;padding:3px 6px;font-size:.68rem;font-weight:700;color:var(--text-muted);background:#ffffff14;border:1px solid rgba(255,255,255,.12);border-radius:var(--radius-sm);letter-spacing:.02em;white-space:nowrap;pointer-events:none;-webkit-user-select:none;user-select:none;transition:opacity var(--transition-fast)}._searchKbdHidden_3lgqk_236{opacity:0;pointer-events:none}._searchButton_3lgqk_241{display:none;cursor:pointer}._searchButton_3lgqk_241:hover{opacity:.9;transform:translateY(-1px)}._profileBtn_3lgqk_251{height:50px;border-radius:var(--radius-full);gap:var(--space-2);padding-right:var(--space-3);text-decoration:none;overflow:hidden;border:1px solid var(--header-control-border, rgba(255, 255, 255, .08));cursor:pointer;transition:all var(--transition-base);display:flex;align-items:center;justify-content:center;flex-shrink:0;background:var(--header-btn-bg, rgba(255, 255, 255, .05));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);color:var(--text-primary)}._profileBtn_3lgqk_251:hover{border-color:#ffffff59;transform:translateY(-1px);background:var(--header-btn-bg-hover, rgba(0, 0, 0, .25))}._profileBtn_3lgqk_251:active{transform:scale(.95)}._profileBtn_3lgqk_251 svg{color:var(--text-primary);font-size:1.1rem}._profileAvatar_3lgqk_286{width:50px;height:50px;display:flex;flex-shrink:0}._profileName_3lgqk_293{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-sm);font-weight:500}._hamburgerBtn_3lgqk_302{background:transparent;border:none;color:var(--text-primary);font-size:1.25rem;padding:var(--space-2);border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;height:40px;width:40px;flex-shrink:0}._hamburgerBtn_3lgqk_302:hover{background:var(--header-btn-bg-hover, rgba(255, 255, 255, .08))}._searchButton_3lgqk_241:focus-visible,._profileBtn_3lgqk_251:focus-visible,._hamburgerBtn_3lgqk_302:focus-visible,._logo_3lgqk_37:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._searchDropdown_3lgqk_330{position:absolute;top:calc(100% + var(--space-8));left:0;right:0;width:auto;max-height:min(520px,calc(100vh - var(--header-height, 64px) - 2rem));background:var(--glass-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--border-secondary);border-radius:var(--radius-lg);box-shadow:var(--shadow-xl);z-index:var(--z-header);overflow:hidden;display:flex;flex-direction:column;animation:_slideIn_3lgqk_1 .18s ease-out}@media(max-width:1200px){._searchDropdown_3lgqk_330{position:fixed;top:calc(var(--header-height, 64px) + env(safe-area-inset-top,0px) + 56px);left:env(safe-area-inset-left,0px);right:env(safe-area-inset-right,0px);width:auto;max-height:calc(100dvh - var(--header-height, 64px) - env(safe-area-inset-top,0px) - 56px);border-radius:0 0 var(--radius-lg) var(--radius-lg);padding-bottom:env(safe-area-inset-bottom,0px)}._searchDropdownNoBar_3lgqk_362{top:calc(var(--header-height, 64px) + env(safe-area-inset-top,0px) + var(--space-3));max-height:calc(100dvh - var(--header-height, 64px) - env(safe-area-inset-top,0px) - var(--space-3))}}._searchDropdownHeader_3lgqk_370{padding:var(--space-4);display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border-primary)}._searchDropdownQuery_3lgqk_378{font-size:.85rem;font-weight:600;color:var(--text-primary)}._searchDropdownSeeAll_3lgqk_384{background:none;border:none;color:var(--accent-light);font-size:var(--font-size-xs);font-weight:600;cursor:pointer;padding:var(--space-1) var(--space-3);border-radius:var(--radius-full);transition:all var(--transition-fast)}._searchDropdownSeeAll_3lgqk_384:hover{background:var(--accent-subtle);color:var(--accent-lighter)}._searchDropdownList_3lgqk_401{overflow-y:auto;flex:1}._searchDropdownList_3lgqk_401::-webkit-scrollbar{width:4px}._searchDropdownList_3lgqk_401::-webkit-scrollbar-thumb{background:var(--border-secondary);border-radius:2px}._searchDropdownItem_3lgqk_415{display:flex;align-items:center;padding:var(--space-3) var(--space-4);gap:var(--space-3);background:none;border:none;border-bottom:1px solid var(--border-primary);cursor:pointer;text-align:left;transition:background var(--transition-fast);width:100%}._searchDropdownItem_3lgqk_415:hover{background:#ffffff0d}._searchDropdownThumb_3lgqk_433{width:48px;height:64px;border-radius:var(--radius-sm);object-fit:cover;flex-shrink:0;box-shadow:0 2px 8px #0000004d}._searchDropdownItemInfo_3lgqk_442{display:flex;flex-direction:column;gap:2px;min-width:0}._searchDropdownItemTitle_3lgqk_449{font-size:.85rem;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._searchDropdownItemMeta_3lgqk_458{font-size:.7rem;color:var(--text-muted);white-space:nowrap}@keyframes _slideIn_3lgqk_1{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}._logo_3lgqk_37:active,._searchButton_3lgqk_241:active,._profileBtn_3lgqk_251:active,._hamburgerBtn_3lgqk_302:active{transform:scale(.97)}@media(prefers-reduced-motion:reduce){._logo_3lgqk_37,._searchButton_3lgqk_241,._profileBtn_3lgqk_251,._hamburgerBtn_3lgqk_302,._searchIcon_3lgqk_158{transition:none}}._hamburgerBtn_3lgqk_302:active{transform:scale(.95)}._mobileSearchBar_3lgqk_497{display:none}@media(max-width:1200px){._searchWrapper_3lgqk_131{background:transparent;border:none;padding:0;height:auto;cursor:default;backdrop-filter:none;-webkit-backdrop-filter:none}._searchWrapper_3lgqk_131:hover{background:transparent;border-color:transparent}._searchWrapper_3lgqk_131:focus-within{background:transparent;box-shadow:none;border-color:transparent}._searchIconButton_3lgqk_158,._searchIcon_3lgqk_158,._searchInput_3lgqk_185{display:none}._searchWrapper_3lgqk_131:focus-within ._searchInput_3lgqk_185{display:none}._searchKbd_3lgqk_218{display:none}._searchButton_3lgqk_241{display:flex;background:var(--header-btn-bg, rgba(255, 255, 255, .05));backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid transparent;color:var(--text-primary);padding:0;align-items:center;justify-content:center;cursor:pointer;pointer-events:auto;width:50px;height:50px;border-radius:50%;transition:all var(--transition-base);flex-shrink:0}._searchButton_3lgqk_241:hover{background:var(--header-btn-bg-hover, rgba(0, 0, 0, .25));border-color:#ffffff59;transform:translateY(-1px)}._searchIconMobile_3lgqk_568{font-size:1rem;color:#fff;transition:all var(--transition-base)}._searchButton_3lgqk_241:hover ._searchIconMobile_3lgqk_568{color:var(--accent)}._mobileSearchBar_3lgqk_497{display:block;position:absolute;top:100%;left:0;right:0;background:#0c0c0feb;backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border-bottom:1px solid rgba(255,255,255,.07);padding:var(--space-2) var(--space-3);animation:_slideDown_3lgqk_1 .2s ease;transition:transform var(--transition-base),opacity var(--transition-base)}._mobileSearchBarHidden_3lgqk_595{transform:translateY(-100%);opacity:0;pointer-events:none}@keyframes _slideDown_3lgqk_1{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}._mobileSearchInner_3lgqk_612{display:flex;align-items:center;background:#ffffff14;border:none;border-radius:var(--radius-full);padding:0 var(--space-4);height:40px}._mobileSearchInner_3lgqk_612:focus-within{border:none;outline:none;box-shadow:0 0 0 2px var(--accent)}._mobileSearchIcon_3lgqk_628{color:#ffffff80;font-size:.85rem;flex-shrink:0;margin-right:var(--space-2)}._mobileSearchInput_3lgqk_635{flex:1;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:var(--font-size-sm);font-family:inherit;height:100%}._mobileSearchInput_3lgqk_635::placeholder{color:#ffffff80}._mobileSearchInput_3lgqk_635:focus,input._mobileSearchInput_3lgqk_635:focus,._mobileSearchInput_3lgqk_635:focus-visible,input._mobileSearchInput_3lgqk_635:focus-visible{outline:none!important;box-shadow:none!important;border:none}}@media(max-width:920px){._profileBtn_3lgqk_251{width:50px;height:50px;padding:0}._profileName_3lgqk_293{display:none}}@media(max-width:805px){._desktopNav_3lgqk_69{display:none}}@media(max-width:542px){._rightSection_3lgqk_125{gap:4px}._hamburgerBtn_3lgqk_302{height:38px;width:38px;font-size:1rem}._logo_3lgqk_37{padding:2px;min-width:0}}@media(max-width:480px){._searchButton_3lgqk_241,._profileBtn_3lgqk_251,._profileAvatar_3lgqk_286{width:42px;height:42px}}._sidebar_153jc_1{position:fixed;top:0;left:0;width:280px;max-width:85vw;height:100%;transition:transform var(--transition-normal);z-index:var(--z-sidebar);padding:var(--space-8) var(--space-6);display:flex;flex-direction:column;overflow-y:auto;transform:translate(-100%);background-color:#0a0a0cf2;color:var(--text-primary);border-right:1px solid var(--border-primary)}._sidebar_153jc_1._open_153jc_20{transform:translate(0);box-shadow:20px 0 60px #00000080}._sidebarHeader_153jc_25{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-10);position:relative}._closeBtn_153jc_33{position:absolute;top:0;right:0;background:none;border:none;font-size:1.25rem;line-height:1;cursor:pointer;color:var(--text-tertiary);transition:color var(--transition-base);display:flex;align-items:center;justify-content:center;padding:var(--space-1);width:32px;height:32px;border-radius:var(--radius-sm)}._closeBtn_153jc_33:hover{color:var(--text-primary)}._logo_153jc_57{display:flex;align-items:center;text-decoration:none;--logo-height: 50px;transition:opacity var(--transition-base)}._logo_153jc_57:hover{opacity:.8}._navSection_153jc_69{display:flex;flex-direction:column;gap:var(--space-1)}._navLink_153jc_75{display:flex;align-items:center;gap:var(--space-4);padding:var(--space-3) var(--space-4);border-radius:var(--radius-md);text-decoration:none;transition:all var(--transition-base);color:var(--text-secondary);font-weight:var(--font-weight-medium);font-size:var(--font-size-base);border-left:2px solid transparent;margin-left:var(--space-2)}._navLink_153jc_75 svg{font-size:1rem;width:20px;text-align:center;flex-shrink:0;transition:color var(--transition-base)}._navLink_153jc_75:hover{background-color:#ffffff0a;color:var(--text-primary);border-left-color:#ffffff26}._navLink_153jc_75:hover svg{color:var(--text-primary)}._navLink_153jc_75._active_153jc_108{background-color:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--accent-light);border-left-color:var(--accent)}._navLink_153jc_75._active_153jc_108 svg{color:var(--accent)}._overlay_153jc_118{position:fixed;inset:0;background-color:#0009;z-index:calc(var(--z-sidebar) - 1);animation:_fadeIn_153jc_1 .3s ease-out}@keyframes _fadeIn_153jc_1{0%{opacity:0}to{opacity:1}}._versionInfo_153jc_138{margin-top:auto;padding-top:var(--space-8);font-size:1rem;color:var(--text-secondary);text-align:left;display:flex;align-items:center;gap:var(--space-2)}._versionInfo_153jc_138:before{content:"";display:block;width:5px;height:5px;border-radius:50%;background-color:var(--color-success)}@media(max-width:768px){._sidebar_153jc_1{width:260px;padding:var(--space-6) var(--space-4)}._sidebarHeader_153jc_25{margin-bottom:var(--space-8)}._logo_153jc_57{--logo-height: 48px}._navLink_153jc_75{padding:var(--space-3) var(--space-3)}}._footer_1c905_1{width:100%;position:relative;padding:0 var(--space-8) var(--space-8);overflow:visible;border-top:1px solid rgba(255,255,255,.08);margin-top:auto;background:linear-gradient(180deg,#0a0a0c99,#050507f2);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);color:var(--text-tertiary);font-size:var(--font-size-sm)}._footerInner_1c905_15{width:100%;max-width:var(--max-width);margin:0 auto;display:grid;grid-template-columns:1fr auto;align-items:start;gap:var(--space-12);padding-bottom:var(--space-8);border-bottom:1px solid rgba(255,255,255,.06)}._brandSection_1c905_27{grid-column:1;display:flex;flex-direction:column;align-items:flex-start;text-align:left;max-width:320px;position:relative;padding-top:0;margin-top:-30px}._logoRow_1c905_39{display:flex;align-items:center;gap:14px}._logoText_1c905_45{--logo-height: 60px;width:auto;display:block}._brandMeta_1c905_51{display:flex;align-items:center;justify-content:flex-start;gap:var(--space-2);flex-wrap:wrap;margin-top:10px}._brandTagline_1c905_60{color:var(--text-secondary);font-size:.88rem;line-height:1.5;margin:0}._statusPill_1c905_67{display:inline-flex;align-items:center;gap:var(--space-2);padding:4px 12px;background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:var(--radius-full);font-size:.78rem;color:var(--text-secondary);width:fit-content}._statusDot_1c905_80{width:7px;height:7px;border-radius:50%;background:var(--color-success);box-shadow:0 0 8px var(--color-success)}._linksGrid_1c905_88{grid-column:2;display:flex;gap:var(--space-8);justify-content:flex-end;padding-top:var(--space-8)}._linkColumn_1c905_96{display:flex;flex-direction:column;gap:var(--space-2)}._columnTitle_1c905_102{color:var(--text-primary);font-size:.9rem;font-weight:700;margin:0 0 var(--space-2);text-transform:uppercase;letter-spacing:.05em}._footer_1c905_1 a{color:var(--text-secondary);text-decoration:none;font-weight:500;font-size:.88rem;transition:all var(--transition-fast);display:inline-flex;align-items:center}._footer_1c905_1 a:hover{color:var(--accent);transform:translate(2px)}._bottomBar_1c905_126{position:relative;width:100%;max-width:var(--max-width);margin:var(--space-6) auto 0;display:flex;align-items:center;justify-content:center}._copyright_1c905_136{margin:0;color:var(--text-muted);font-size:.85rem;display:flex;align-items:center;justify-content:center;gap:4px;text-align:center}._brand_1c905_27{color:var(--accent);font-weight:700}._heartIcon_1c905_152{color:var(--color-danger);margin:0 2px}._backToTop_1c905_157{position:absolute;right:0;display:inline-flex;align-items:center;gap:var(--space-2);padding:6px 14px;background:#ffffff0d;border:1px solid rgba(255,255,255,.12);border-radius:var(--radius-full);color:var(--text-secondary);font-size:.8rem;font-weight:600;cursor:pointer;transition:all var(--transition-base)}._backToTop_1c905_157:hover{background:#ffffff1f;color:#fff;border-color:var(--accent);transform:translateY(-2px)}@media(max-width:768px){._footer_1c905_1{padding:0 var(--space-4) var(--space-6)}._footerInner_1c905_15{grid-template-columns:1fr;gap:var(--space-5);align-items:center;justify-items:center}._brandSection_1c905_27{grid-column:1;align-items:center;text-align:center;padding-top:0;justify-content:center;margin-top:-26px}._logoRow_1c905_39{flex-direction:column;align-items:center;gap:6px}._logoText_1c905_45{--logo-height: 52px}._brandMeta_1c905_51{flex-direction:column;align-items:center;gap:var(--space-1);justify-content:center;margin-top:6px}._linksGrid_1c905_88{grid-column:1;display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-4);text-align:center}._linkColumn_1c905_96{align-items:center;gap:var(--space-1)}._columnTitle_1c905_102{margin:0 0 var(--space-1);font-size:.78rem}._footer_1c905_1 a{font-size:.82rem}._bottomBar_1c905_126{flex-direction:column;gap:var(--space-3);text-align:center}._copyright_1c905_136{font-size:.78rem}._backToTop_1c905_157{position:static}}._container_e96gf_1{display:flex;flex-direction:column;gap:1rem;color:var(--text-primary);max-width:400px}._field_e96gf_9{display:flex;flex-direction:column;gap:.5rem}._field_e96gf_9 label{font-size:.9rem;opacity:.8}._textarea_e96gf_20{background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--text-primary);padding:.5rem;border-radius:4px;resize:vertical;font-family:inherit}._textarea_e96gf_20:hover{border-color:var(--border-secondary)}._textarea_e96gf_20:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._input_e96gf_40{background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--text-primary);padding:.6rem;border-radius:4px}._input_e96gf_40:hover{border-color:var(--border-secondary)}._input_e96gf_40:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._button_e96gf_58{background:var(--accent);color:var(--text-primary);border:none;padding:.7rem;border-radius:4px;cursor:pointer;font-weight:600;transition:opacity .2s}._button_e96gf_58:hover{opacity:.9}._button_e96gf_58:disabled{opacity:.5;cursor:not-allowed}._secondaryButton_e96gf_78{background:transparent;border:1px solid var(--border-primary);color:var(--text-primary);padding:.7rem;border-radius:4px;cursor:pointer;transition:background .2s,border-color .2s}._secondaryButton_e96gf_78:hover{background:#ffffff0d;border-color:var(--border-secondary)}._actions_e96gf_95{display:flex;gap:.5rem}._actions_e96gf_95 ._button_e96gf_58{flex:1}._hint_e96gf_104{background:var(--bg-secondary);border:1px solid var(--border-primary);border-radius:4px;padding:.6rem;font-size:.85rem;line-height:1.5}._hint_e96gf_104 ._actions_e96gf_95{margin-top:.6rem}._link_e96gf_117{color:var(--accent);text-decoration:underline;font-weight:600}._link_e96gf_117:hover{opacity:.85}.top-progress-bar{position:fixed;top:0;left:0;right:0;height:3px;z-index:9999;overflow:hidden;pointer-events:none;background:transparent}.top-progress-bar:after{content:"";position:absolute;top:0;bottom:0;left:0;width:40%;border-radius:0 3px 3px 0;background:linear-gradient(90deg,transparent,var(--accent),var(--accent-light),transparent);animation:top-progress-slide 1.1s infinite ease-in-out}@keyframes top-progress-slide{0%{transform:translate(-100%)}to{transform:translate(280%)}}@media(prefers-reduced-motion:reduce){.top-progress-bar:after{animation:none;width:100%;border-radius:0}}._screen_1pca0_1{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;width:100%;background-color:var(--bg-secondary);color:var(--text-primary);text-align:center;padding:2rem}._icon_1pca0_14{font-size:4rem;color:var(--color-danger);margin-bottom:1rem}._title_1pca0_20{margin-bottom:1rem}._text_1pca0_24{color:var(--text-secondary);margin-bottom:2rem}._button_1pca0_29{padding:.8rem 1.5rem;background-color:var(--accent);color:var(--accent-text);border:none;border-radius:var(--radius-md);cursor:pointer;display:flex;align-items:center;gap:.5rem;font-size:1rem;transition:background-color .2s}._button_1pca0_29:hover{background-color:var(--accent-light)}._container_88bss_1{display:flex;flex-direction:column;gap:1rem;color:var(--text-primary)}._field_88bss_8{display:flex;flex-direction:column;gap:.5rem}._field_88bss_8 label{font-size:.9rem;opacity:.8}._input_88bss_19{background:var(--bg-secondary);border:1px solid var(--border-primary);color:var(--text-primary);padding:.6rem;border-radius:4px}._input_88bss_19:hover{border-color:var(--border-secondary)}._input_88bss_19:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._actions_88bss_37{display:flex;gap:.5rem;justify-content:flex-end}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);border-radius:var(--radius-md);font-weight:var(--font-weight-medium);cursor:pointer;border:none;outline:none;font-family:inherit;position:relative;white-space:nowrap;font-size:var(--font-size-base);background:transparent;color:var(--text-primary);padding:var(--space-3) var(--space-6);min-height:44px;transition:background-color .15s ease,color .15s ease,transform .1s ease}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--accent-light);outline-offset:2px}.btn-primary{background:linear-gradient(135deg,var(--accent) 0%,var(--accent-dark) 100%);color:var(--accent-text);box-shadow:0 4px 12px var(--accent-glow)}.btn-primary:hover:not(:disabled){background:linear-gradient(135deg,var(--accent-light) 0%,var(--accent) 100%);transform:translateY(-1px);box-shadow:0 6px 16px var(--accent-glow)}.btn-primary:active:not(:disabled){transform:translateY(0)}.btn-secondary{background:#ffffff14;border:1px solid var(--border-secondary);color:var(--text-primary)}.btn-secondary:hover:not(:disabled){background:#ffffff1f;border-color:#ffffff40}.btn-ghost{background:transparent;color:var(--text-secondary)}.btn-ghost:hover:not(:disabled){background:#ffffff14;color:var(--text-primary)}.btn-danger{background:var(--color-danger);color:var(--color-danger-text)}.btn-danger:hover:not(:disabled){background:var(--color-danger-dark)}.btn-sm{min-height:36px;padding:var(--space-2) var(--space-4);font-size:var(--font-size-sm);border-radius:var(--radius-sm)}.btn-lg{min-height:52px;padding:var(--space-4) var(--space-8);font-size:var(--font-size-md);border-radius:var(--radius-lg)}.btn-block{width:100%}.btn-loading{color:transparent;pointer-events:none}.btn-spinner{position:absolute;width:16px;height:16px;border:2px solid rgba(128,128,128,.35);border-top-color:var(--accent-text);border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}._notice_1d75r_1{position:fixed;right:max(var(--space-4),env(safe-area-inset-right));bottom:max(var(--space-4),env(safe-area-inset-bottom));z-index:10000;display:flex;align-items:center;gap:var(--space-2);max-width:calc(100vw - 2 * var(--space-4));padding:var(--space-2-5) var(--space-3);border:1px solid var(--glass-border);border-radius:var(--radius-md);background:var(--glass-bg);color:var(--text-secondary);box-shadow:0 4px 16px #00000029;font-family:var(--font-family);font-size:var(--font-size-xs);font-weight:400;line-height:1.5;pointer-events:none;animation:_appear_1d75r_1 2.6s ease both}._notice_1d75r_1 svg{color:var(--text-tertiary);flex-shrink:0}@keyframes _appear_1d75r_1{0%{opacity:0;transform:translateY(4px)}8%,88%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(2px)}}@media(prefers-reduced-motion:reduce){._notice_1d75r_1{animation:none}}:root{--accent: #6d5dfc;--logo-ink: #140f15;--accent-light: #897cff;--accent-lighter: #b3a8ff;--accent-dark: #5646db;--accent-text: #ffffff;--accent-subtle: rgba(109, 93, 252, .12);--accent-glow: rgba(109, 93, 252, .18);--accent-h: 245;--accent-s: 96%;--accent-l: 68%;--color-danger: #ef4444;--color-error: var(--color-danger);--color-danger-dark: #dc2626;--color-danger-text: #ffffff;--color-success: #10b981;--color-success-text: #ffffff;--color-warning: #f59e0b;--color-warning-text: #17171c;--color-info: #3b82f6;--color-info-text: #ffffff;--badge-info-bg: var(--accent);--badge-info-text: var(--accent-text);--palette-gold: #d8b56b;--palette-silver: #c3c9d1;--palette-bronze: #c08d5f;--secondary-h: 180;--secondary-s: 85%;--secondary-l: 50%;--accent-blue: hsl(var(--secondary-h), var(--secondary-s), var(--secondary-l));--accent-blue-light: hsl(var(--secondary-h), var(--secondary-s), 70%);--bg-main: #0c0d12;--bg-primary: #13151d;--bg-secondary: #13151d;--bg-tertiary: #191c27;--bg-elevated: #202433;--header-bg: rgba(12, 13, 18, .85);--text-primary: #ffffff;--text-secondary: #b4b4bd;--text-tertiary: #8f8f98;--text-muted: #b4b4bd;--border-primary: rgba(255, 255, 255, .08);--border-secondary: rgba(255, 255, 255, .12);--border-accent: hsla(var(--accent-h), var(--accent-s), var(--accent-l), .3);--border: var(--border-primary);--control-border: #4b5570;--control-border-hover: #647093;--control-text: #ffffff;--card-radius: var(--radius-lg);--border-light: var(--border-secondary);--danger-color: var(--color-danger);--shadow-input-focus: 0 0 0 2px var(--accent-subtle);--shadow-focus: 0 0 0 2px var(--accent-subtle);--glass-bg: rgba(20, 20, 22, .95);--glass-border: var(--border-primary);--glass-highlight: rgba(255, 255, 255, .05);--glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, .36);--bg-hover: rgba(255, 255, 255, .08);--bg-hover-strong: rgba(255, 255, 255, .1);--bg-overlay: rgba(0, 0, 0, .55);--bg-overlay-strong: rgba(0, 0, 0, .6);--bg-overlay-heavy: rgba(0, 0, 0, .7);--bg-scrim: rgba(10, 10, 12, .55);--bg-scrim-strong: rgba(10, 10, 12, .8);--bg-dark: #0a0a0c;--bg-black: #000000;--border-strong: rgba(255, 255, 255, .14);--track-bg: rgba(255, 255, 255, .1);--track-buffered: rgba(255, 255, 255, .25);--shimmer-highlight: rgba(255, 255, 255, .07);--bg-selected: rgba(255, 255, 255, .06);--shadow-scrim: 0 4px 16px rgba(0, 0, 0, .45);--shadow-panel: 0 12px 32px rgba(0, 0, 0, .5);--color-danger-bg: rgba(153, 42, 42, .9);--font-family: "Outfit", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-size-2xs: .4375rem;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: 1rem;--font-size-md: 1.125rem;--font-size-lg: 1.5rem;--font-size-xl: 1.875rem;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--line-height-tight: 1.25;--line-height-normal: 1.5;--line-height-relaxed: 1.75;--space-px: 1px;--space-2px: 2px;--space-1: .25rem;--space-1-5: .375rem;--space-2: .5rem;--space-2-5: .625rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.25rem;--space-6: 1.5rem;--space-8: 2rem;--space-10: 2.5rem;--space-12: 3rem;--space-16: 4rem;--size-22: 22px;--size-42: 42px;--size-44: 44px;--size-48: 48px;--size-34: 34px;--size-36: 36px;--size-140: 140px;--size-180: 180px;--size-220: 220px;--size-250: 250px;--size-440: 440px;--size-480: 480px;--size-720: 720px;--size-84: 84px;--size-52: 52px;--size-90: 90px;--size-240: 240px;--size-320: 320px;--size-420: 420px;--size-900: 900px;--layout-asmr-max-width: 1400px;--layout-page-offset: 120px;--layout-player-mobile: 175px;--radius-xs: 6px;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 20px;--radius-xl: 28px;--radius-full: 9999px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .3);--shadow-md: 0 4px 12px rgba(0, 0, 0, .4);--shadow-lg: 0 12px 32px -4px rgba(0, 0, 0, .6);--shadow-active: 0 0 0 1px var(--border-accent), 0 8px 24px -4px rgba(0, 0, 0, .5);--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .4), 0 10px 10px -5px rgba(0, 0, 0, .2);--shadow-thumb: 0 0 5px rgba(0, 0, 0, .5);--blur-sm: 4px;--blur-md: 6px;--blur-lg: 12px;--z-base: 1;--z-dropdown: 100;--z-sticky: 200;--z-drawer: 300;--z-sidebar: 500;--z-header: 400;--z-modal: 600;--z-popover: 700;--z-toast: 800;--z-overlay: 900;--header-height: 80px;--max-width: 1600px;--sidebar-width: 280px;--ease-spring: cubic-bezier(.175, .885, .32, 1.275);--ease-smooth: cubic-bezier(.4, 0, .2, 1);--ease-emphasized: cubic-bezier(.32, .72, 0, 1);--transition-fast: .2s var(--ease-smooth);--transition-base: .3s var(--ease-smooth);--transition-normal: .4s var(--ease-smooth);--transition-slow: .5s var(--ease-smooth);--transition-emphasized: .42s var(--ease-emphasized);--transition-quick: .09s var(--ease-smooth);--duration-shimmer: 1.6s;--duration-spin: .9s;--focus-ring-color: var(--accent-light);--focus-ring-glow: 0 0 0 3px rgba(109, 93, 252, .35);--focus-scale: scale(1.05)}@media(min-width:1920px){:root{--font-size-base: 1.125rem;--max-width: 2000px}}html[data-theme=mochi]{--accent: #e3e1ee;--accent-light: #f4f3fa;--accent-lighter: #ffffff;--accent-dark: #b3b1c6;--accent-text: #17171c;--accent-subtle: rgba(227, 225, 238, .12);--accent-glow: rgba(227, 225, 238, 0);--accent-h: 248;--accent-s: 18%;--accent-l: 89%;--bg-main: #131316;--bg-primary: #1b1b1f;--bg-secondary: #1b1b1f;--bg-tertiary: #232329;--bg-elevated: #2b2b32;--header-bg: rgba(19, 19, 22, .88);--text-primary: #f2f2f5;--text-secondary: #a9a9b3;--text-tertiary: #85858f;--text-muted: #a9a9b3;--border-primary: #2c2c33;--border-secondary: #3a3a43;--control-border: #4c4c59;--control-border-hover: #666675;--control-text: #f2f2f5;--glass-bg: rgba(27, 27, 31, .96);--badge-info-bg: var(--accent);--badge-info-text: var(--accent-text);--shadow-sm: none;--shadow-md: none;--shadow-lg: none;--shadow-active: 0 0 0 1px var(--border-secondary);--shadow-xl: none;--focus-ring-color: var(--accent);--focus-ring-glow: 0 0 0 3px rgba(227, 225, 238, .25)}html[data-theme=sakura]{--accent: #d9a3d9;--accent-light: #eccbec;--accent-lighter: #f9e8f9;--accent-dark: #a978a9;--accent-text: #fff;--accent-subtle: rgba(217, 163, 217, .12);--accent-glow: rgba(217, 163, 217, 0);--accent-h: 300;--accent-s: 45%;--accent-l: 74%;--bg-main: #141116;--bg-primary: #1c171e;--bg-secondary: #1c171e;--bg-tertiary: #241e26;--bg-elevated: #2e262f;--header-bg: rgba(20, 17, 22, .88);--text-primary: #f3eaf3;--text-secondary: #b3a3b5;--text-tertiary: #8d7c8f;--text-muted: #b3a3b5;--border-primary: #322a34;--border-secondary: #403640;--control-border: #524458;--control-border-hover: #6b5872;--control-text: #f3eaf3;--glass-bg: rgba(28, 23, 30, .96);--badge-info-bg: var(--accent-dark);--badge-info-text: #ffffff;--shadow-sm: none;--shadow-md: none;--shadow-lg: none;--shadow-active: 0 0 0 1px var(--border-secondary);--shadow-xl: none;--focus-ring-color: var(--accent);--focus-ring-glow: 0 0 0 3px rgba(217, 163, 217, .25)}*,*:before,*:after{box-sizing:border-box}html{scroll-behavior:smooth;color-scheme:dark;scrollbar-gutter:stable;overflow-x:hidden;overflow-x:clip;max-width:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}html:has(:fullscreen),html:has(:-webkit-full-screen){scrollbar-gutter:auto}body{margin:0;padding:0;font-family:var(--font-family);background:var(--bg-main);color:var(--text-primary);line-height:var(--line-height-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden;overflow-x:clip;max-width:100%;color-scheme:dark}html,body,.app-container,.posterWrapper,.dot,.genreTag{--darkreader-inline-bgcolor: none !important;--darkreader-inline-bgimage: none !important;--darkreader-inline-bordercolor: none !important;--darkreader-inline-color: none !important;background-color:transparent}body{overflow-x:hidden;overflow-x:clip}body:before{display:none!important}h1,h2,h3,h4,h5,h6{margin:0;font-weight:var(--font-weight-semibold);letter-spacing:-.02em}a{color:inherit;text-decoration:none}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--focus-ring-color)!important;outline-offset:3px!important;box-shadow:var(--focus-ring-glow)!important;transition:outline-offset var(--transition-fast),transform var(--transition-fast)}a:focus:not(:focus-visible),button:focus:not(:focus-visible),input:focus:not(:focus-visible),select:focus:not(:focus-visible),[tabindex]:focus:not(:focus-visible){outline:none!important;box-shadow:none!important}a,button,input,select,textarea,[tabindex]{-webkit-tap-highlight-color:transparent}@media(min-width:1200px){a:focus-visible,button:focus-visible{transform:var(--focus-scale)}}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-elevated);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--text-tertiary)}.text-gradient{background:linear-gradient(135deg,#fff,#a5a5a5);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.text-gradient-accent{background:linear-gradient(135deg,var(--accent-light) 0%,var(--accent) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.app-container{display:flex;flex-direction:column;min-height:100vh}main{flex:1;width:100%;max-width:var(--max-width);margin:0 auto;padding:0 var(--space-8) var(--space-16);position:relative;z-index:1}.main-content{padding-top:var(--header-height)}@media(max-width:1024px){.main-content{padding-top:calc(var(--header-height) + 52px)}}@media(max-width:848px){main{padding:0 var(--space-4) var(--space-12)}.main-content{padding-top:116px}}.badge{display:inline-flex;align-items:center;gap:var(--space-1-5);padding:var(--space-1) var(--space-2-5);border-radius:var(--radius-full);border:1px solid var(--border-primary);background:var(--bg-tertiary);color:var(--text-secondary);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);line-height:var(--line-height-tight);white-space:nowrap}.badge-primary{border-color:color-mix(in srgb,var(--accent) 35%,transparent);background:var(--accent-subtle);color:var(--accent-light)}.badge-secondary{border-color:var(--border-secondary);background:var(--bg-secondary);color:var(--text-secondary)}.badge-danger{border-color:color-mix(in srgb,var(--color-danger) 35%,transparent);background:color-mix(in srgb,var(--color-danger) 12%,transparent);color:var(--color-danger)}.section-title{font-size:1.75rem;font-weight:800;margin-bottom:var(--space-8);color:var(--text-primary);letter-spacing:-.02em;line-height:1}.section-eyebrow{display:flex;align-items:center;gap:8px;font-size:.72rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:var(--accent-light);margin:0;line-height:1.4}.section-eyebrow:before{content:"";width:18px;height:3px;border-radius:999px;background:linear-gradient(90deg,var(--accent) 0%,var(--accent-light) 100%);box-shadow:0 0 10px var(--accent-glow);flex:none}.title-stack{display:flex;flex-direction:column;gap:4px;min-width:0;justify-content:center}html[data-theme=mochi] .section-eyebrow,html[data-theme=sakura] .section-eyebrow{color:var(--accent)}@media(max-width:768px){.section-title{font-size:1.5rem;margin-bottom:var(--space-6)}}.grid-container{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:var(--space-6);width:100%}@media(max-width:1024px){.grid-container{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--space-4)}}@media(max-width:768px){.grid-container{grid-template-columns:repeat(3,1fr);gap:var(--space-2)}}@media(max-width:480px){.grid-container{grid-template-columns:repeat(3,1fr);gap:8px}}footer{text-align:center;padding:var(--space-12);color:var(--text-muted);border-top:1px solid var(--border-primary);margin-top:var(--space-16);background:var(--bg-secondary)}footer a{color:var(--accent);text-decoration:none;font-weight:var(--font-weight-medium);transition:color var(--transition-fast)}footer a:hover{color:var(--accent-light);text-shadow:0 0 8px var(--accent-glow)}select{appearance:none;-webkit-appearance:none;cursor:pointer;background-color:var(--bg-tertiary)!important;border-color:var(--border-primary)!important}select:hover{background-color:var(--bg-tertiary)!important;border-color:var(--border-secondary)!important}select:focus{background-color:var(--bg-tertiary)!important;border-color:var(--accent)!important;outline:none}select:active{background-color:var(--bg-tertiary)!important}body.low-end{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol!important;--transition-fast: 0s !important;--transition-base: 0s !important;--transition-normal: 0s !important;--transition-slow: 0s !important;scroll-behavior:auto!important}body.low-end,body.low-end *{transition:none!important;animation:none!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;box-shadow:none!important;text-shadow:none!important}body.low-end:before{display:none!important}body.low-end .text-gradient,body.low-end .text-gradient-accent{background:none!important;-webkit-background-clip:initial!important;-webkit-text-fill-color:initial!important;color:var(--text-primary)!important}body.low-end .text-gradient-accent{color:var(--accent)!important}body.low-end [class*=banner],body.low-end [class*=bannerContainer],body.low-end [class*=bannerOverlay],body.low-end [class*=heroSection]{background-image:none!important;background-color:var(--bg-main)!important;min-height:auto!important}body.low-end [class*=infoGlass]{background:var(--bg-secondary)!important;-webkit-backdrop-filter:none!important;backdrop-filter:none!important;border:1px solid var(--border-primary)!important;box-shadow:none!important}.skeleton{position:relative;overflow:hidden;background-color:var(--bg-tertiary)}.skeleton:after{content:"";position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,#fff0 0,#ffffff0d 20%,#ffffff1f 60%,#fff0);animation:skeleton-wave 1.8s infinite ease-in-out}@keyframes skeleton-wave{to{transform:translate(100%)}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto!important}*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.page-container{width:100%;animation:page-fade-in var(--transition-smooth)}@keyframes page-fade-in{0%{opacity:0}to{opacity:1}}.error-message{padding:var(--space-4);text-align:center;color:var(--color-danger)}._gate_10ra3_1{min-height:100dvh;min-height:100svh;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;overflow-y:auto;padding:max(env(safe-area-inset-top),var(--space-5)) max(env(safe-area-inset-right),var(--space-4)) max(env(safe-area-inset-bottom),var(--space-5)) max(env(safe-area-inset-left),var(--space-4));background:radial-gradient(circle at 50% 0%,var(--accent-subtle),transparent 55%),var(--bg-main);color:var(--text-primary)}._gateInner_10ra3_17{width:min(100%,880px);margin:clamp(2rem,12vh,7rem) auto auto;display:flex;flex-direction:column;align-items:center;gap:var(--space-6)}._gateTitle_10ra3_26{margin:0;font-size:clamp(1.75rem,5vw,3rem);font-weight:700;letter-spacing:-.02em;text-align:center}._profileGrid_10ra3_34{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(104px,100%),148px));justify-content:center;gap:var(--space-5) var(--space-4);width:100%}._profileCard_10ra3_42{display:flex;flex-direction:column;align-items:center;gap:var(--space-3);min-width:0;min-height:44px;padding:0;border:0;background:none;color:inherit;font:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent}._profileCard_10ra3_42:disabled{cursor:default;opacity:.6}._profileCard_10ra3_42:focus-visible{outline:none}._profileCardAvatar_10ra3_67{position:relative;display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:1;overflow:hidden;border:2px solid transparent;border-radius:var(--radius-sm);background:var(--bg-tertiary);color:var(--text-tertiary);transition:transform var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast)}._profileCard_10ra3_42:hover ._profileCardAvatar_10ra3_67,._profileCard_10ra3_42:focus-visible ._profileCardAvatar_10ra3_67{transform:translateY(-3px) scale(1.02);border-color:var(--accent);box-shadow:0 12px 32px var(--accent-glow)}._profileCard_10ra3_42:active ._profileCardAvatar_10ra3_67{transform:scale(.98)}._addAvatar_10ra3_96{border:2px dashed var(--border-secondary);background:var(--bg-tertiary)}._profileCard_10ra3_42:hover ._addAvatar_10ra3_96{border-color:var(--accent);color:var(--accent)}._profileCardName_10ra3_106{max-width:100%;overflow:hidden;font-size:var(--font-size-sm);font-weight:600;text-align:center;text-overflow:ellipsis;white-space:nowrap}._ownerTag_10ra3_116{display:block;margin-top:var(--space-1);font-size:var(--font-size-xs);font-weight:500;color:var(--text-tertiary)}._lockBadge_10ra3_124{position:absolute;right:var(--space-2);bottom:var(--space-2);display:flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:var(--radius-full);background:#000000a6;color:#fff;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}._gatePanel_10ra3_139{width:min(100%,420px);margin:auto;display:flex;flex-direction:column;gap:var(--space-4);padding:var(--space-6);border:1px solid var(--border-secondary);border-radius:var(--radius-lg);background:var(--bg-tertiary);box-shadow:0 24px 64px #00000059}._panelAvatar_10ra3_152{align-self:center;width:96px;height:96px}._panelTitle_10ra3_158{margin:0;font-size:var(--font-size-lg);text-align:center}._gateForm_10ra3_164{display:flex;flex-direction:column;gap:var(--space-4)}._gateField_10ra3_170{display:flex;flex-direction:column;gap:var(--space-2);font-size:var(--font-size-sm);font-weight:600;color:var(--text-secondary)}._gateField_10ra3_170 input{width:100%;min-height:44px;padding:var(--space-3);border:1px solid var(--border-secondary);border-radius:var(--radius-md);background:var(--bg-primary);color:var(--text-primary);font-size:16px}._gateField_10ra3_170 input:focus{outline:none;border-color:var(--accent);box-shadow:var(--shadow-input-focus)}._gateHint_10ra3_196{max-width:42ch;margin:0;color:var(--text-secondary);text-align:center}._gateError_10ra3_203{margin:0;color:var(--danger-color);text-align:center}._backButton_10ra3_209{display:inline-flex;align-items:center;align-self:flex-start;gap:var(--space-2);min-height:44px;padding:var(--space-2) var(--space-3);border:0;border-radius:var(--radius-md);background:none;color:var(--text-secondary);font:inherit;cursor:pointer;touch-action:manipulation}._backButton_10ra3_209:hover{background:var(--bg-hover);color:var(--text-primary)}._backButton_10ra3_209:focus-visible{outline:2px solid var(--accent);outline-offset:2px}@media(max-width:640px){._gateInner_10ra3_17{gap:var(--space-5)}._profileGrid_10ra3_34{grid-template-columns:repeat(auto-fit,minmax(min(96px,100%),128px));gap:var(--space-4) var(--space-3)}._profileCard_10ra3_42{min-height:44px}._gatePanel_10ra3_139{padding:var(--space-5);gap:var(--space-3)}._panelAvatar_10ra3_152{width:80px;height:80px}}@media(max-width:380px){._profileGrid_10ra3_34{grid-template-columns:repeat(auto-fit,minmax(min(86px,100%),108px));gap:var(--space-4) var(--space-2)}._gatePanel_10ra3_139{padding:var(--space-4)}}@media(prefers-reduced-motion:reduce){._profileCardAvatar_10ra3_67{transition:none}._profileCard_10ra3_42:hover ._profileCardAvatar_10ra3_67,._profileCard_10ra3_42:focus-visible ._profileCardAvatar_10ra3_67,._profileCard_10ra3_42:active ._profileCardAvatar_10ra3_67{transform:none}}._form_10ra3_283{display:flex;flex-wrap:wrap;align-items:end;gap:var(--space-3);margin:var(--space-4) 0}._form_10ra3_283 h3,._form_10ra3_283 p{flex-basis:100%}._field_10ra3_296{display:flex;flex-direction:column;gap:var(--space-2);max-width:100%}._field_10ra3_296 input,._field_10ra3_296 select{padding:var(--space-3);color:var(--text-primary);background:var(--bg-primary);border:1px solid var(--border-secondary);border-radius:var(--radius-md);min-width:0}._avatarRow_10ra3_313{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-4)}._avatarRow_10ra3_313>:first-child{width:72px;height:72px}._uploadButton_10ra3_325{position:relative;display:inline-flex;align-items:center;gap:var(--space-2);padding:var(--space-3) var(--space-4);border:1px solid var(--border-secondary);border-radius:var(--radius-md);color:var(--text-primary);background:var(--bg-primary);font-size:var(--font-size-sm);font-weight:600;cursor:pointer;transition:background var(--transition-fast),border-color var(--transition-fast),color var(--transition-fast)}._uploadButton_10ra3_325:hover{background:var(--bg-elevated);border-color:var(--accent)}._uploadButton_10ra3_325:focus-within{outline:2px solid var(--accent);outline-offset:2px}._fileInput_10ra3_354{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}._fileInput_10ra3_354:disabled{cursor:not-allowed}._profileList_10ra3_367{list-style:none;padding:0}._profileList_10ra3_367 li{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) 0;border-bottom:1px solid var(--border-secondary)}._smallAvatar_10ra3_380{width:36px;height:36px;flex-shrink:0}._profileName_10ra3_385{flex:1;min-width:0;overflow-wrap:anywhere}
|