@serifpersia/dango 3.7.2 → 3.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/client/dist/assets/{AnimeCard-CoPx634q.js → AnimeCard-BVufFeLC.js} +1 -1
- package/client/dist/assets/{AnimeInfo-COVCRujg.js → AnimeInfo-Dihook4h.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-BwlKpRXY.js → AnimeInfoPage-K0ErjilQ.js} +2 -2
- package/client/dist/assets/{Asmr-nOUcDsWe.js → Asmr-CP7vVwsh.js} +1 -1
- package/client/dist/assets/{AsmrResetProgressModal-Mj1PYE2c.js → AsmrResetProgressModal-cYO4Sr2k.js} +1 -1
- package/client/dist/assets/{Home-wi0a_BDQ.js → Home-BYuAVKgx.js} +1 -1
- package/client/dist/assets/{Insights-MLCDyTnY.js → Insights-Bx01GySp.js} +1 -1
- package/client/dist/assets/{LibraryListPage-CRqv737t.js → LibraryListPage-BnrEDG8j.js} +1 -1
- package/client/dist/assets/{ListeningList-8dzhiDeb.js → ListeningList-kRSLAo3B.js} +1 -1
- package/client/dist/assets/{Manga-dkD-uWJk.js → Manga-COhyMd3K.js} +1 -1
- package/client/dist/assets/{MangaInfoPage-nCeWZNcO.js → MangaInfoPage-LTEvl_nL.js} +1 -1
- package/client/dist/assets/{MangaReadPage-NdDNCyLg.js → MangaReadPage-sEwzyBQ7.js} +1 -1
- package/client/dist/assets/{MangaResetProgressModal-C28AiLJl.js → MangaResetProgressModal-CbMR36Zu.js} +1 -1
- package/client/dist/assets/{Mature-D5WSkhIJ.js → Mature-CMvs_-gf.js} +1 -1
- package/client/dist/assets/{MatureConsentModal-BsdpNeXA.js → MatureConsentModal-BnB-RHYQ.js} +1 -1
- package/client/dist/assets/{MediaCard-C1jNesfK.js → MediaCard-hWGCEHWx.js} +1 -1
- package/client/dist/assets/OptionListMenu-onM2KK2X.js +1 -0
- package/client/dist/assets/Player-2YKevlG4.js +56 -0
- package/client/dist/assets/PlayerSettings-BfSv-hut.js +1 -0
- package/client/dist/assets/{QueueOptionsButton-DNzKPzPw.js → QueueOptionsButton-B4Re8F3V.js} +1 -1
- package/client/dist/assets/{QueueRail-BWcDVSHd.js → QueueRail-Dkx_M6ng.js} +1 -1
- package/client/dist/assets/{ReadingList-zkFp3wpF.js → ReadingList-C--ZvTe2.js} +1 -1
- package/client/dist/assets/{ResetProgressModal-BYNYqwwl.js → ResetProgressModal-BuESoxbY.js} +1 -1
- package/client/dist/assets/{Search-yDP_wGJ1.js → Search-CEErwr88.js} +1 -1
- package/client/dist/assets/{Settings-BpKwWesn.js → Settings-C-QEEujv.js} +1 -1
- package/client/dist/assets/{SkeletonGrid-CYJeh04P.js → SkeletonGrid-QWMGLCGp.js} +1 -1
- package/client/dist/assets/{Trackers-D2KUt71k.js → Trackers-1i4Hd5D3.js} +1 -1
- package/client/dist/assets/Tv-C6F9655r.js +4 -0
- package/client/dist/assets/{TvInfo-D_4QdgV4.js → TvInfo-BajXP7JJ.js} +1 -1
- package/client/dist/assets/{TvPopup-DHXB5ZSF.js → TvPopup-DZtX79Ol.js} +1 -1
- package/client/dist/assets/{TvSearch-COwVoGru.js → TvSearch-DcWcxRb1.js} +1 -1
- package/client/dist/assets/{TvWatchlist-CU3r-NO5.js → TvWatchlist-Cf_25dKi.js} +1 -1
- package/client/dist/assets/{Watchlist-DHyuTLJG.js → Watchlist-DBmU8PNR.js} +1 -1
- package/client/dist/assets/{hls-DOAVt6Ry.js → hls-Bi-DS5KL.js} +1 -1
- package/client/dist/assets/{index-BLh_CXtu.js → index-DB81Su4I.js} +2 -2
- package/client/dist/assets/{libraryInvalidation-AzFLnbjH.js → libraryInvalidation-DI-v-DQ1.js} +1 -1
- package/client/dist/assets/playbackCompletion-IPHm9fp5.js +1 -0
- package/client/dist/assets/{useAnimeInfoData-MPNJXLaM.js → useAnimeInfoData-DpUA78Mv.js} +1 -1
- package/client/dist/assets/{useAsmr-2dFEmQD_.js → useAsmr-BwyYDnlP.js} +1 -1
- package/client/dist/assets/{useAsmrPopup-N2vUf3Pw.js → useAsmrPopup-BrrEaBlV.js} +1 -1
- package/client/dist/assets/{useMangaLibrary-B3Ni34a7.js → useMangaLibrary-BAUaug-u.js} +1 -1
- package/client/dist/assets/{useMangaPopup-h8NHEPUk.js → useMangaPopup-3Lx5tEub.js} +1 -1
- package/client/dist/assets/usePlaybackEnd-CuDnNZ8o.js +10 -0
- package/client/dist/assets/{useProviders-z8L8GKy0.js → useProviders-CKqOSX5-.js} +1 -1
- package/client/dist/assets/{useTv-D4zQ1BsQ.js → useTv-CZB47zUF.js} +1 -1
- package/client/dist/assets/{useTvLibrary-B4vcRzQc.js → useTvLibrary-BGz7Unv_.js} +1 -1
- package/client/dist/index.html +1 -1
- package/package.json +2 -2
- package/server/dist/server.js +2 -2
- package/server/package.json +1 -1
- package/client/dist/assets/AvSyncCalibrator-C5GxpyPE.js +0 -10
- package/client/dist/assets/OptionListMenu-CIvW5WmO.js +0 -1
- package/client/dist/assets/Player-PGj8YYO8.js +0 -56
- package/client/dist/assets/PlayerSettings-CAYfF0sA.js +0 -1
- package/client/dist/assets/Tv-Ul3jFq-x.js +0 -4
- package/client/dist/assets/playbackCompletion-DuUs8u-8.js +0 -1
- /package/client/dist/assets/{AvSyncCalibrator-BtUHM1mW.css → usePlaybackEnd-BtUHM1mW.css} +0 -0
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/PlayerSettings-CAYfF0sA.js","assets/vendor-core-DfaOB3Rn.js","assets/vendor-icons-DrybRNxP.js","assets/OptionListMenu-CIvW5WmO.js","assets/AvSyncCalibrator-C5GxpyPE.js","assets/index-BLh_CXtu.js","assets/vendor-query-BBT5_sHx.js","assets/index-B7katXv0.css","assets/AvSyncCalibrator-BtUHM1mW.css","assets/PlayerSettings-BXGe3F5k.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{u as t,g as ut,h as W,P as Jt,z as Zt,d as le,A,q as U,y as er,T as Me,o as tr,a as rr,c as nr,_ as or,S as ct}from"./vendor-core-DfaOB3Rn.js";import{u as xt,b as Mt,a as St}from"./vendor-query-BBT5_sHx.js";import{S as sr,U as ar,p as wt,s as ir,C as lr,a as cr,b as ur,c as Oe,d as Nt,f as _t,e as dr,g as mr,h as fr,r as pr,u as hr,i as vr,j as gr,k as yr,l as br,m as Sr,n as Se,A as Er,R as wr,E as kr,o as Tr,q as R,t as Cr,v as Rr,P as Mr,w as Nr}from"./AvSyncCalibrator-C5GxpyPE.js";import{I as Z}from"./vendor-icons-DrybRNxP.js";import{_ as Lt,S as Xe,i as Pr,q as ie,t as he,A as ke,O as Ar,P as Qe,M as we,e as xr,m as _r,n as Lr,o as Br,p as Dr,d as $r,u as Ir,B as Je,Q as Fr,f as Or}from"./index-BLh_CXtu.js";import{l as Wr,i as Pt,a as Bt,s as Ur}from"./playbackCompletion-DuUs8u-8.js";import{M as Vr}from"./MatureConsentModal-BsdpNeXA.js";import{u as Qr}from"./useIsMobile-Dvx1uJ82.js";import{s as Ee,Q as Gr}from"./QueueRail-BWcDVSHd.js";import{u as Kr,Q as zr}from"./QueueOptionsButton-DNzKPzPw.js";import{u as Dt}from"./useProviders-z8L8GKy0.js";import{l as qr}from"./hls-DOAVt6Ry.js";import{A as Hr}from"./AnimeMetaDetails-D8WIiO4b.js";import{S as jr}from"./SynopsisText-B3Sa5pRv.js";import"./vendor-ui-3qrARCPr.js";const Yr="_controlsOverlay_cejny_1",Xr="_hidden_cejny_21",Jr="_topControls_cejny_27",Zr="_backBtn_cejny_47",en="_videoTitleInfo_cejny_67",tn="_animeTitle_cejny_73",rn="_episodeNumber_cejny_83",nn="_bottomControls_cejny_91",on="_progressBarContainer_cejny_110",sn="_progressBar_cejny_110",an="_thumb_cejny_129",ln="_scrubbing_cejny_144",cn="_watchedBar_cejny_148",un="_bufferedBar_cejny_149",dn="_timeBubble_cejny_187",mn="_skipSegment_cejny_221",fn="_bottomControlsRow_cejny_231",pn="_leftControls_cejny_239",hn="_rightControls_cejny_240",vn="_controlBtn_cejny_247",gn="_theaterBtn_cejny_288",yn="_nextEpisodeBtn_cejny_292",bn="_active_cejny_313",Sn="_timeDisplay_cejny_317",En="_skipControls_cejny_325",$={controlsOverlay:Yr,hidden:Xr,topControls:Jr,backBtn:Zr,videoTitleInfo:en,animeTitle:tn,episodeNumber:rn,bottomControls:nn,progressBarContainer:on,progressBar:sn,thumb:an,scrubbing:ln,watchedBar:cn,bufferedBar:un,timeBubble:dn,skipSegment:mn,bottomControlsRow:fn,leftControls:pn,rightControls:hn,controlBtn:vn,theaterBtn:gn,nextEpisodeBtn:yn,active:bn,timeDisplay:Sn,skipControls:En},wn=({player:r,handlers:n,visible:a,skipIntervals:b,showNextEpisodeButton:i,onNextEpisode:l,isTheaterMode:s,onTheaterModeToggle:m,settingsBtnRef:c,timeDisplayRef:g})=>{const{state:f,refs:e,actions:o}=r,{showSettings:N}=f,u=()=>f.isMuted||f.volume===0?t(Z,{name:"volume-mute"}):f.volume<.5?t(Z,{name:"volume-down"}):t(Z,{name:"volume-up"});return t("div",{className:`${$.controlsOverlay} ${a?"":$.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:E=>E.stopPropagation(),children:[t(sr,{classes:{container:$.progressBarContainer,scrubbing:$.scrubbing,timeBubble:$.timeBubble,bar:$.progressBar,buffered:$.bufferedBar,watched:$.watchedBar,thumb:$.thumb},videoRef:e.videoRef,duration:f.duration,formatTime:o.formatTime,isScrubbing:f.isScrubbing,onSeek:n.handleSeek,onScrubStart:n.handleScrubStart,onScrubMove:n.handleScrubMove,onScrubEnd:n.handleScrubEnd,timeLabelRef:g,children:[f.duration>0&&r.state.currentSkipInterval&&t("div",{className:`${$.skipSegment} ${$[r.state.currentSkipInterval.skip_type]} `,style:{left:`${r.state.currentSkipInterval.start_time/f.duration*100}% `,width:`${(r.state.currentSkipInterval.end_time-r.state.currentSkipInterval.start_time)/f.duration*100}% `}}),b.map(E=>{const P=E.start_time/f.duration*100,y=(E.end_time-E.start_time)/f.duration*100;return t("div",{className:`${$.skipSegment} ${$[E.skip_type]} `,style:{left:`${P}% `,width:`${y}% `},title:E.skip_type.toUpperCase()},E.skip_id)})]}),t("div",{className:$.bottomControlsRow,children:[t("div",{className:$.leftControls,children:[t("button",{className:$.controlBtn,onClick:o.togglePlay,"aria-label":f.isPlaying?"Pause":"Play",children:f.isPlaying?t(Z,{name:"pause"}):t(Z,{name:"play"})}),t(ar,{muted:f.isMuted,volume:f.volume,volumeIcon:u(),buttonClassName:$.controlBtn,onToggleMute:o.toggleMute,onVolumeChange:n.handleVolumeChange,onExpandedChange:E=>o.setShowVolumeSlider(E)}),t("span",{className:$.timeDisplay,ref:g,children:[o.formatTime(0)," / ",o.formatTime(f.duration)]}),f.currentSkipInterval&&!f.isAutoSkipEnabled&&t("button",{className:$.controlBtn,onClick:()=>{e.videoRef.current&&f.currentSkipInterval&&(e.videoRef.current.currentTime=f.currentSkipInterval.end_time,o.setCurrentSkipInterval(null))},children:["Skip ",f.currentSkipInterval.skip_type==="op"?"Opening":"Ending"]})]}),t("div",{className:$.rightControls,children:[t("div",{className:$.skipControls,children:i&&t("button",{className:$.nextEpisodeBtn,onClick:l,title:"Play next episode",children:"Next EP"})}),t("button",{className:`${$.controlBtn} ${n.isSubtitleActive?$.active:""}`,onClick:n.handleCCToggle,title:n.isSubtitleActive?"Disable Subtitles":"Enable Subtitles","aria-label":"Toggle Subtitles",children:t(Z,{name:"closed-captioning",size:22})}),t("button",{ref:c,className:`${$.controlBtn} ${N?$.active:""} `,onClick:()=>o.setShowSettings(!N),"aria-label":"Settings",children:t(Z,{name:"cog"})}),t("button",{className:`${$.controlBtn} ${$.theaterBtn} ${s?$.active:""} `,onClick:E=>{E.stopPropagation(),m()},title:s?"Exit Theater Mode":"Theater Mode","aria-label":s?"Exit Theater Mode":"Theater Mode",children:t(Z,{name:"tv"})}),t("button",{className:$.controlBtn,onClick:o.toggleFullscreen,"aria-label":f.isFullscreen?"Exit Fullscreen":"Fullscreen",children:f.isFullscreen?t(Z,{name:"compress"}):t(Z,{name:"expand"})})]})]})]})})};function kn(r){const{state:n,refs:a,actions:b}=r,i=o=>{a.videoRef.current&&(a.videoRef.current.volume=o,a.videoRef.current.muted=o===0)},l=o=>{!a.videoRef.current||isNaN(n.duration)||n.duration===0||(a.videoRef.current.currentTime=o*n.duration,b.sendProgressUpdate(!1,!0))},s=()=>{a.videoRef.current&&(b.setIsScrubbing(!0),b.wasPlayingBeforeScrub.current=!a.videoRef.current.paused,a.videoRef.current.pause())},m=o=>{!a.videoRef.current||!n.duration||(a.videoRef.current.currentTime=o*n.duration)},c=()=>{b.setIsScrubbing(!1),b.wasPlayingBeforeScrub.current&&a.videoRef.current?.play()},g=o=>{if(!a.videoRef.current)return;b.setActiveSubtitleTrack(o);try{if(o===null||o==="off")localStorage.setItem("playerSubtitlesEnabled","false");else{localStorage.setItem("playerSubtitlesEnabled","true");const u=n.availableSubtitles.find(E=>E.label===o||E.lang===o);u?localStorage.setItem("playerLastSubtitle",ir(u)):localStorage.setItem("playerLastSubtitle",o)}}catch{}let N=!1;Array.from(a.videoRef.current.textTracks).forEach(u=>{const P=o!==null&&o!=="off"&&(u.language===o||u.label===o)&&!N;u.mode=P?"showing":"hidden",P&&(N=!0)})},f=n.activeSubtitleTrack!==null&&n.activeSubtitleTrack!=="off";return{handleVolumeChange:i,handleSeek:l,handleScrubStart:s,handleScrubMove:m,handleScrubEnd:c,handleSubtitleSelection:g,isSubtitleActive:f,handleCCToggle:()=>{if(!a.videoRef.current)return;if(f){g("off");return}if(n.availableSubtitles.length===0)return;let o=null;try{o=localStorage.getItem("playerLastSubtitle")}catch{}const N=wt(n.availableSubtitles,{lastKey:o,enabled:!0});if(N<0)return;const u=n.availableSubtitles[N];g(u.label||u.lang)}}}const Tn=Zt(()=>Lt(()=>import("./PlayerSettings-CAYfF0sA.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),Cn=({player:r,isAutoplayEnabled:n,onAutoplayChange:a,showNextEpisodeButton:b,onNextEpisode:i,videoSources:l,selectedSource:s,selectedLink:m,onSourceChange:c,loadingVideo:g,skipIntervals:f,animeTitle:e,episodeNumber:o,isTheaterMode:N,onTheaterModeToggle:u,anime4kEnabled:E,onAnime4kToggle:P,anime4kSupported:y,anime4kProfile:w,onAnime4kProfileChange:k,anime4kInitializing:T,anime4kError:_,videoDelayEnabled:d,onVideoDelayToggle:h,videoDelayMs:x,onVideoDelayChange:J,onCalibrateAvSync:I,fallbackChoice:z,onFallbackChoiceChange:F,ambientSettings:V,onAmbientChange:G,children:K,overlays:q,isInteractingExtra:v=!1,className:S,hideChrome:M=!1})=>{const{state:C,actions:H}=r,{showSettings:D}=C,{setShowSettings:B}=H,L=kn(r),Q=ut.useRef(null),pe=ut.useRef(null),Le=ut.useRef(null);W(()=>{const X=ge=>{Q.current&&!Q.current.contains(ge.target)&&pe.current&&!pe.current.contains(ge.target)&&D&&B(!1)};return D&&document.addEventListener("mousedown",X),()=>{document.removeEventListener("mousedown",X)}},[D,B]);const Ne=C.showControls||D||C.isScrubbing,re=t(ur,{visible:Ne,title:e,episode:o?`Episode ${o}`:void 0,onBack:()=>window.history.back(),classes:{overlay:$.controlsOverlay,hidden:$.hidden,top:$.topControls,backBtn:$.backBtn,titleInfo:$.videoTitleInfo,title:$.animeTitle,episode:$.episodeNumber}}),Y=!g&&!C.isBuffering&&C.duration>0?t(lr,{isPlaying:C.isPlaying,onTogglePlay:H.togglePlay,onSkipBack:()=>H.seek(-10),onSkipForward:()=>H.seek(10)}):null,Te=t(wn,{player:r,handlers:L,visible:Ne,skipIntervals:f,showNextEpisodeButton:b,onNextEpisode:i,isTheaterMode:N,onTheaterModeToggle:u,settingsBtnRef:pe,timeDisplayRef:Le}),Be=t(Jt,{fallback:null,children:t(Tn,{ref:Q,isOpen:D,onClose:()=>B(!1),videoSources:l,currentSource:s,currentLink:m,onSourceChange:c,subtitles:C.availableSubtitles,activeSubtitleTrack:C.activeSubtitleTrack,onSubtitleChange:L.handleSubtitleSelection,subtitleSettings:{fontSize:C.subtitleFontSize,position:C.subtitlePosition,bgOpacity:C.subtitleBgOpacity,bgColor:C.subtitleBgColor,textColor:C.subtitleTextColor,edge:C.subtitleEdge,bold:C.subtitleBold},onSubtitleSettingsChange:H.setSubtitleStyle,useNativeControls:C.useNativeControls,onNativeControlsToggle:H.setUseNativeControls,anime4kEnabled:E,onAnime4kToggle:P,anime4kSupported:y,anime4kProfile:w,onAnime4kProfileChange:k,anime4kInitializing:T,anime4kError:_,videoDelayEnabled:d,onVideoDelayToggle:h,videoDelayMs:x,onVideoDelayChange:J,onCalibrateAvSync:I,isAutoSkipEnabled:C.isAutoSkipEnabled,onAutoSkipChange:X=>{H.setIsAutoSkipEnabled(X);try{localStorage.setItem("autoSkipEnabled",X.toString())}catch{}},isAutoplayEnabled:n,onAutoplayChange:a,fallbackChoice:z,onFallbackChoiceChange:F,isTheaterMode:N,ambientSettings:V,onAmbientChange:G})}),ne=D?t("div",{"data-speed-boost-ignore":"true",onClick:X=>X.stopPropagation(),children:Be}):null;return t(cr,{player:r,topBar:re,centerControls:Y,bottomBar:!g&&C.duration>0?Te:null,settingsPanel:ne,overlays:q,isInteracting:v,className:S,chromeDisabled:M,children:K})},Rn=({count:r=3})=>t("section",{className:Ee.section,children:[t("div",{className:Ee.header,children:t("button",{className:Ee.headerToggle,disabled:!0,children:[t("span",{className:Ee.title,children:t(Xe,{width:"60px",height:"1.2rem",variant:"text"})}),t(Z,{name:"chevron-down",style:{opacity:.3}})]})}),t("div",{className:Ee.list,children:Array.from({length:r}).map((n,a)=>t("div",{className:Ee.item,style:{pointerEvents:"none"},children:[t("div",{className:Ee.dragHandle,style:{opacity:.2},children:t(Xe,{width:"16px",height:"16px",variant:"rectangular"})}),t("div",{className:Ee.thumbnail,style:{overflow:"hidden",background:"transparent"},children:t(Xe,{width:"100%",height:"100%",variant:"rectangular"})}),t("div",{className:Ee.meta,children:[t(Xe,{width:"80%",height:"1.2rem",variant:"text",className:Ee.metaGap}),t(Xe,{width:"40%",height:"0.8rem",variant:"rectangular",style:{borderRadius:"var(--radius-sm)"}})]})]},a))})]}),Mn={soft:"Softsub",hard:"Hardsub",mixed:"Mixed"},Nn={direct:"Direct",embed:"Embed",cookie:"Needs cookie"},Pn=["direct","cookie","embed"],An=({selectedProvider:r,onProviderChange:n,isAdult:a,options:b})=>{const l=(b&&b.length>0?b:[]).filter(s=>s.mature===(a===!0));return t("div",{className:Oe.providerSelectContainer,children:[t("h4",{children:"Provider"}),t("select",{className:Oe.providerSelect,value:r,onChange:s=>n(s.currentTarget.value),children:Pn.map(s=>{const m=l.filter(c=>(c.tier??"direct")===s);return m.length===0?null:t("optgroup",{label:Nn[s],children:m.map(c=>t("option",{value:c.id,children:c.sub?`${c.label} (${Mn[c.sub]})`:c.label},c.id))},s)})})]})},xn=({videoSources:r,selectedSource:n,selectedLink:a,onSourceChange:b,onLinkChange:i})=>{const l=Array.isArray(r)?r:[];if(l.length===0)return null;const s=n?.type==="iframe"&&(n.links?.length??0)>1;return t("div",{className:Oe.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:Oe.sourceButtons,children:l.map((m,c)=>t("button",{className:`${Oe.sourceButton} ${n?.sourceName===m.sourceName?Oe.active:""} `,onClick:()=>b(m),children:m.sourceName},`${m.sourceName}-${c}`))}),s&&t("select",{className:Oe.sourceSelect,"aria-label":"Fallback embed quality",value:a?.link??n.links[0]?.link??"",onChange:m=>{const c=n.links.find(g=>g.link===m.currentTarget.value);c&&i(c)},children:n.links.map(m=>t("option",{value:m.link,children:m.resolutionStr},m.link))})]})},_n=ut.memo(xn,(r,n)=>r.selectedSource?.sourceName===n.selectedSource?.sourceName&&r.selectedLink?.link===n.selectedLink?.link&&r.videoSources===n.videoSources),Ln={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}},Bn={low:"ModeB",balanced:"ModeA",high:"ModeAA",denoise:"ModeC"},Dn=5,$n=15e3,In=`
|
|
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 Fn({videoRef:r,canvasRef:n,profile:a="balanced",delayMs:b=0}){const[i,l]=le(!1),[s,m]=le(()=>{try{return localStorage.getItem("anime4kEnabled")==="true"}catch{return!1}}),[c,g]=le(!1),[f,e]=le(null),[o,N]=le(0),u=A(0),E=A(null),P=A(null),y=A(null),w=A(null),k=A(null),T=A(null),_=A(null),d=A(null),h=A(null),x=A(!1),J=A(-1),I=A(0),z=A(b);z.current=b;const F=A([]),V=A(!1),G=A(!1),K=A(!1),q=A(null),v=A(-1),S=A(-1),M=A(!1),C=A(0);W(()=>{async function B(){if(typeof navigator>"u"||!navigator.gpu){l(!1);return}try{const L=await navigator.gpu.requestAdapter();l(!!L)}catch{l(!1)}}B()},[]),W(()=>{if(!s||!i)return;let B=!1;const L=++u.current,Q=Y=>{if(Y)try{Y.close()}catch{}},pe=()=>{for(const Y of F.current)Q(Y.bitmap);F.current=[]},Le=Y=>Math.max(8,Math.min(40,Math.ceil(Y/16.7)+4));function Ne(){h.current!==null&&(cancelAnimationFrame(h.current),h.current=null)}async function re(){let Y=r.current;const Te=n.current;if(!Y||!Te||u.current!==L)return;const Be=performance.now()+$n;for(;(!Y||Y.videoWidth===0)&&performance.now()<Be;){if(await new Promise(ue=>requestAnimationFrame(ue)),B||u.current!==L)return;Y=r.current}if(!Y||Y.videoWidth===0){!B&&u.current===L&&(e("Timed out waiting for video metadata"),g(!1),m(!1));return}const ne=Y.videoWidth,X=Y.videoHeight,ge=Math.max(ne,X),dt=window.innerWidth,Pe=window.innerHeight,et=Math.max(dt,Pe),tt=ge<et?et/ge:1,Ge=Ln[a],mt=ge<=480?Ge.sd:ge<=720?Ge.hd:ge<=1080?Ge.fhd:1,ce=Math.min(mt,tt);Te.width=Math.round(ne*ce),Te.height=Math.round(X*ce),g(!0),e(null),I.current=0,J.current=-1,v.current=-1,S.current=-1,M.current=!1,C.current=0,pe(),x.current=!1;try{let ue=function(){B||u.current!==L||(Ne(),h.current=requestAnimationFrame(()=>{He()}))};const{ModeA:ft,ModeB:Ce,ModeC:rt,ModeAA:Ae}=await Lt(async()=>{const{ModeA:j,ModeB:ee,ModeC:se,ModeAA:de}=await import("./index-BOKlZEHq.js").then(me=>me.i);return{ModeA:j,ModeB:ee,ModeC:se,ModeAA:de}},[]);if(!navigator.gpu)throw new Error("WebGPU not available");const nt=await navigator.gpu.requestAdapter();if(!nt)throw new Error("No GPU adapter found");const O=await nt.requestDevice();if(!O)throw new Error("Failed to get GPU device");const De=Te.getContext("webgpu");if(!De)throw new Error("Failed to get WebGPU context");const Ke=navigator.gpu.getPreferredCanvasFormat();De.configure({device:O,format:Ke,alphaMode:"premultiplied"});const oe=O.createTexture({size:[ne,X],format:"rgba16float",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),ot=Bn[a],xe=Math.round(ne*ce),We=Math.round(X*ce),$e=(()=>{switch(ot){case"ModeB":return new Ce({device:O,inputTexture:oe,nativeDimensions:{width:ne,height:X},targetDimensions:{width:xe,height:We}});case"ModeC":return new rt({device:O,inputTexture:oe,nativeDimensions:{width:ne,height:X},targetDimensions:{width:xe,height:We}});case"ModeAA":return new Ae({device:O,inputTexture:oe,nativeDimensions:{width:ne,height:X},targetDimensions:{width:xe,height:We}});default:return new ft({device:O,inputTexture:oe,nativeDimensions:{width:ne,height:X},targetDimensions:{width:xe,height:We}})}})(),st=$e.getOutputTexture(),ze=O.createSampler({magFilter:"linear",minFilter:"linear"}),qe=O.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
|
-
`}),_e=O.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),at=O.createRenderPipeline({layout:O.createPipelineLayout({bindGroupLayouts:[_e]}),vertex:{module:qe,entryPoint:"vs"},fragment:{module:qe,entryPoint:"fs",targets:[{format:Ke}]},primitive:{topology:"triangle-list"}}),pt=O.createBindGroup({layout:_e,entries:[{binding:0,resource:st.createView()},{binding:1,resource:ze}]});try{const j=O.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,externalTexture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}}]}),ee=O.createShaderModule({code:In}),se=O.createRenderPipeline({layout:O.createPipelineLayout({bindGroupLayouts:[j]}),vertex:{module:ee,entryPoint:"vs"},fragment:{module:ee,entryPoint:"fs",targets:[{format:"rgba16float"}]},primitive:{topology:"triangle-list"}});q.current={pipeline:se,layout:j,inputView:oe.createView()}}catch{q.current=null}if(u.current!==L){oe.destroy(),O.destroy();return}E.current=O,P.current=De,y.current=$e,w.current=oe,k.current=st,T.current=at,_.current=ze,d.current=_e,G.current=!1,K.current=!1;async function ht(){const j=q.current;if(!j||G.current)return!1;const ee=r.current;if(!ee)return!1;const se=!K.current;se&&O.pushErrorScope("validation");try{const de=O.importExternalTexture({source:ee}),me=O.createBindGroup({layout:j.layout,entries:[{binding:0,resource:de},{binding:1,resource:ze}]}),ve=O.createCommandEncoder(),ye=ve.beginRenderPass({colorAttachments:[{view:j.inputView,loadOp:"load",storeOp:"store"}]});ye.setPipeline(j.pipeline),ye.setBindGroup(0,me),ye.draw(6),ye.end(),O.queue.submit([ve.finish()])}catch{return G.current=!0,q.current=null,!1}if(se){const de=await O.popErrorScope().catch(()=>null);if(de)return console.warn("[anime4k] blit probe failed:",de.message),G.current=!0,q.current=null,!1;K.current=!0}return!0}g(!1);async function He(){if(B||u.current!==L||!De)return;const j=r.current;if(!j||j.videoWidth===0){ue();return}if(j!==Y||j.videoWidth!==ne||j.videoHeight!==X){N(me=>me+1);return}if(j.paused||j.ended||document.hidden||j.readyState<HTMLMediaElement.HAVE_CURRENT_DATA){ue();return}const ee=j.getVideoPlaybackQuality().totalVideoFrames;if(ee===S.current){ue();return}if(x.current){ue();return}const se=j.currentTime;(j.seeking||v.current>=0&&Math.abs(se-v.current)>.5)&&(pe(),M.current=!1,C.current=0,S.current=-1),v.current=se;const de=Math.max(0,z.current||0);de>C.current&&(M.current=!1),x.current=!0;try{const me=performance.now();let ve=null,ye=!1;if(de<=0){F.current.length>0&&pe(),M.current=!1,C.current=0;let be=!1;if(!V.current)try{O.queue.copyExternalImageToTexture({source:j},{texture:oe},[ne,X]),S.current=ee,be=!0}catch(ae){if(ae instanceof TypeError)V.current=!0;else throw ae}if(!be&&!G.current&&q.current&&await ht()&&(S.current=ee,be=!0),!be){const ae=await createImageBitmap(j);S.current=ee,O.queue.copyExternalImageToTexture({source:ae},{texture:oe},[ne,X]),Q(ae)}}else{const be=await createImageBitmap(j);S.current=ee;const ae=F.current;ae.push({bitmap:be,capture:me});const vt=Le(de);for(;ae.length>vt;)Q(ae.shift()?.bitmap);let Ve=-1;for(let fe=ae.length-1;fe>=0;fe--)if(me-ae[fe].capture>=de){Ve=fe;break}if(Ve!==-1){for(let Ye=0;Ye<Ve;Ye++)Q(ae.shift()?.bitmap);const fe=ae.shift();fe?(ve=fe.bitmap,M.current=!0,C.current=de):(ve=be,ye=!0)}else if(!M.current)ve=be,ye=!0;else{const fe=ae.shift();ve=fe?fe.bitmap:be,fe||(ye=!0)}if(!ve){x.current=!1,ue();return}O.queue.copyExternalImageToTexture({source:ve},{texture:oe},[ne,X]),ye||Q(ve)}const je=O.createCommandEncoder();await $e.pass(je);const Ue=je.beginRenderPass({colorAttachments:[{view:De.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]});Ue.setPipeline(at),Ue.setBindGroup(0,pt),Ue.draw(6),Ue.end(),O.queue.submit([je.finish()]),J.current=ee,I.current=0,O.queue.onSubmittedWorkDone().then(()=>{u.current===L&&(x.current=!1)})}catch(me){if(x.current=!1,I.current+=1,I.current>=Dn&&!B&&u.current===L){console.error(me),e(me instanceof Error?me.message:"Render error"),m(!1);return}}ue()}ue()}catch(ue){!B&&u.current===L&&(e(ue instanceof Error?ue.message:"Failed to initialize upscaler"),g(!1),m(!1))}}return re(),()=>{B=!0,u.current+=1,Ne(),pe(),w.current&&(w.current.destroy(),w.current=null),k.current&&(k.current.destroy(),k.current=null),E.current&&(E.current.destroy(),E.current=null),y.current=null,T.current=null,_.current=null,d.current=null,q.current=null,P.current=null,x.current=!1}},[s,i,r,n,a,o]);const H=U(B=>{m(B);try{localStorage.setItem("anime4kEnabled",String(B))}catch{}},[]),D=U(()=>{m(B=>{const L=!B;try{localStorage.setItem("anime4kEnabled",String(L))}catch{}return L})},[]);return{isWebGPUSupported:i,isEnabled:s,isInitializing:c,error:f,toggle:D,setEnabled:H}}function On({videoRef:r,episodeKey:n,isEnabled:a,isSupported:b,mediaReady:i,isIframeSource:l,setEnabled:s}){const m=A(null),c=A(!1),g=A(!1),f=A(s);f.current=s,W(()=>{const e=m.current;m.current=n,!(e===null||e===n)&&(!a||!b||(c.current=!0,g.current=!1,f.current(!1)))},[n,a,b]),W(()=>{if(!c.current)return;if(a){g.current&&(c.current=!1);return}if(g.current=!0,!i)return;if(l){c.current=!1,f.current(!0);return}const e=r.current;if(!e)return;let o,N=!1;const u=()=>{N||(N=!0,c.current=!1,f.current(!0))};if(e.readyState>=2)return o=window.setTimeout(u,500),()=>window.clearTimeout(o);const E=()=>{window.setTimeout(u,500)};return e.addEventListener("canplay",E,{once:!0}),e.addEventListener("playing",E,{once:!0}),o=window.setTimeout(u,5e3),()=>{window.clearTimeout(o),e.removeEventListener("canplay",E),e.removeEventListener("playing",E)}},[a,i,l,r])}const Wn=()=>localStorage.getItem("preferredMode")==="dub"?"dub":"sub",Un=/^[a-z0-9-]+$/i,$t=r=>r?"preferredProviderMature":"preferredProvider",It=r=>{const n=localStorage.getItem($t(r));return n&&Un.test(n)?n:null},Ft=(r,n)=>{localStorage.setItem($t(n),r)},Vn=()=>It(!1)??"megaplay",Qn=()=>({showMeta:{},episodes:[],watchedEpisodes:[],watchlistStatus:null,showCombinedDetails:!1,currentMode:Wn(),inWatchlist:!1,videoSources:[],selectedSource:null,selectedLink:null,isAutoplayEnabled:Wr(),showResumeModal:!0,resumeTime:0,resumeDuration:0,skipIntervals:[],selectedProvider:Vn(),loadingShowData:!0,loadingVideo:!1,error:null,showCookieModal:!1,cookieProvider:null});function Gn(r,n){switch(n.type){case"SET_STATE":return{...r,...n.payload};case"SET_MODE":return{...r,currentMode:n.payload,videoSources:[],selectedSource:null,selectedLink:null};case"SET_PROVIDER":return{...r,selectedProvider:n.payload};default:return r}}async function At(r,n,a,b,i=!1){if(!r||!n)throw new Error("Missing params");try{const[l,s,m,c]=await Promise.all([he.data.video.query({showId:r,episodeNumber:n,mode:a.currentMode,provider:a.selectedProvider}).catch(w=>{const k=w.data?.cause;return w.message==="AUTH_REQUIRED"&&k?.provider==="mkissa"&&b({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:"mkissa"}}),null}),he.progress.getEpisode.query({showId:r,episodeNumber:n}).catch(()=>null),he.settings.getByKey.query({key:"preferredSource"}).catch(()=>null),he.data.skipTimes.query({showId:r,episodeNumber:n}).catch(()=>[])]),g=m?.value,f=l?.filter(w=>{const k=w.sourceName.toLowerCase();return a.currentMode==="dub"?k.includes("eng")||k.includes("dub"):k.includes("jpn")||k.includes("sub")||!k.includes("eng")&&!k.includes("dub")})??[],e=f.length>0?f:l??[];let o=e.length>0?e[0]:null;if(g){const w=e.find(k=>k.sourceName===g);w&&(o=w)}const N=o&&o.links.length>0?o.links.sort((w,k)=>(parseInt(k.resolutionStr)||0)-(parseInt(w.resolutionStr)||0))[0]:null,u=s?.currentTime||0,E=s?.duration||0,y=(Array.isArray(c)?c:c?.results||[]).map(w=>({skip_id:w.skip_id||"",skip_type:w.skip_type||"",start_time:w.interval?.start_time??w.start_time??0,end_time:w.interval?.end_time??w.end_time??0})).filter(w=>w.end_time>0);return(!l||l.length===0)&&(i||ke.error(`No video sources found for ${a.selectedProvider}`)),{videoSources:l,selectedSource:o,selectedLink:N,resumeTime:u,resumeDuration:E,showResumeModal:u>5&&o?.type!=="iframe",skipIntervals:y,fetchedEpisodeNumber:n}}catch(l){const s=l;if(s.message==="AUTH_REQUIRED")return b({type:"SET_STATE",payload:{showCookieModal:!0,cookieProvider:s.provider}}),{videoSources:[],selectedSource:null,selectedLink:null,resumeTime:0,resumeDuration:0,showResumeModal:!1,skipIntervals:[],fetchedEpisodeNumber:n};throw l}}const Kn=(r,n,a,b)=>{const[i,l]=er(Gn,a,v=>({...Qn(),showMeta:v?.name?{name:v.name,thumbnail:v.thumbnail,nativeName:v.nativeName,englishName:v.englishName,names:{romaji:v.name||v.englishName,english:v.englishName||v.name,native:v.nativeName}}:{}})),s=xt(),m=Pr(),c=A(null),g=A(null),{options:f}=Dt(),e=Me(()=>f.filter(v=>(v.kind??"anime")==="anime"),[f]),o=n||i.initialEpisode,N=A(o);W(()=>{N.current!==o&&(N.current=o,l({type:"SET_STATE",payload:{selectedSource:null,selectedLink:null}}))},[o,l]),W(()=>{r&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(r)&&i.selectedProvider!=="animepahe"&&c.current!==r&&(c.current=r,l({type:"SET_PROVIDER",payload:"animepahe"}))},[r,i.selectedProvider]);const{data:u,isLoading:E,error:P}=Kr(r),{data:y}=Mt({queryKey:[ie.playerData,r,i.currentMode,i.selectedProvider],queryFn:async()=>{if(!r)throw new Error("No showId");const v=async()=>{try{const D=await he.data.episodes.query({showId:r,mode:i.currentMode,provider:i.selectedProvider}).catch(()=>null);if(D?.episodes?.length)return D}catch{}return null},[S,M,C]=await Promise.all([v(),he.watchlist.check.query({showId:r}).catch(()=>({inWatchlist:!1,status:null})),he.progress.getWatchedEpisodes.query({showId:r}).catch(()=>[])]),H=S?.episodes?S.episodes.sort((D,B)=>parseFloat(D)-parseFloat(B)):[];return{description:S?.description||"",episodes:H,inWatchlist:M.inWatchlist,watchlistStatus:M.status??null,watchedEpisodes:C}},enabled:!!r});W(()=>{!n&&y?.episodes&&y.episodes.length>0&&!n&&l({type:"SET_STATE",payload:{initialEpisode:y.episodes[0]}})},[y,n]),W(()=>{if(u?.isAdult===void 0||g.current===r)return;const v=u.isAdult===!0,S=e.filter(C=>C.mature===v);if(S.length===0||e.find(C=>C.id===i.selectedProvider)?.mature===v)return;const M=It(v);g.current=r??null,l({type:"SET_PROVIDER",payload:S.find(C=>C.id===M)?.id??S[0].id})},[u?.isAdult,i.selectedProvider,r,e]),W(()=>{if(!r||!/^dango-mt-\d+$/.test(r)||g.current===`temp:${r}`)return;const v=u?.provider;v&&(g.current=`temp:${r}`,v!==i.selectedProvider&&l({type:"SET_PROVIDER",payload:v}))},[r,u,i.selectedProvider]);const{data:w,isLoading:k,error:T}=Mt({queryKey:[ie.videoSources,r,o,i.selectedProvider,i.currentMode],queryFn:()=>At(r,o,i,l),enabled:!!r&&!!o&&!(i.showMeta?.isAdult===!0&&!b?.hasMatureConsent)}),{mutateAsync:_}=St({mutationFn:async({wasIn:v,showMeta:S})=>{if(!r)throw new Error("Missing showId");if(v)await he.watchlist.remove.mutate({id:r});else{const M=S.name||S.names?.romaji;if(!M)throw new Error("Missing show name");await he.watchlist.add.mutate({id:r,name:M,thumbnail:S.thumbnail,nativeName:S.names?.native,englishName:S.names?.english,type:S.type,isAdult:S.isAdult})}return!v},onSuccess:v=>{ke.success(v?"Added to watchlist":"Removed from watchlist"),s.invalidateQueries({queryKey:[ie.playerData,r]}),s.invalidateQueries({queryKey:[ie.showData,r]}),s.invalidateQueries({queryKey:[ie.watchlist]})},onError:v=>ke.error(v instanceof Error?v.message:"Failed to update watchlist")}),d=U(async()=>{!r||!u||await _({wasIn:!!y?.inWatchlist,showMeta:u})},[r,u,y?.inWatchlist,_]),h=U(async v=>{try{await he.settings.set.mutate({key:"preferredSource",value:v})}catch(S){console.error(S)}},[]),{mutateAsync:x,isPending:J}=St({mutationFn:async({status:v})=>{if(!r)throw new Error("Missing showId");return await he.watchlist.setStatus.mutate({id:r,status:v}),v},onSuccess:v=>{l({type:"SET_STATE",payload:{inWatchlist:!0,watchlistStatus:v}}),ke.success(`Moved to ${v}`),s.invalidateQueries({queryKey:[ie.showData,r]}),s.invalidateQueries({queryKey:[ie.watchlist]}),s.invalidateQueries({queryKey:[ie.continueWatching]})},onError:()=>ke.error("Failed to update watchlist status")}),I=U(async()=>{await x({status:"Completed"})},[x]),{mutateAsync:z,isPending:F}=St({mutationFn:async({episodeNumber:v,duration:S,showMeta:M,episodes:C})=>{await he.progress.updateProgress.mutate({showId:r??"",episodeNumber:v,currentTime:S,duration:S,showName:M.name,showThumbnail:M.thumbnail,nativeName:M.names?.native,englishName:M.names?.english,genres:M.genres?.map(H=>H.name),popularityScore:Ar(M.score)??void 0,type:M.type,status:M.status,episodeCount:C.length,isAdult:M.isAdult})},onSuccess:(v,S)=>{ke.success(`Episode ${S.episodeNumber} marked as watched`),s.invalidateQueries({queryKey:[ie.playerData,r]}),s.invalidateQueries({queryKey:[ie.showMeta,r]}),s.invalidateQueries({queryKey:[ie.videoSources,r,S.episodeNumber]}),s.invalidateQueries({queryKey:[ie.continueWatching]}),s.invalidateQueries({queryKey:[ie.thisWeekSchedule]}),s.invalidateQueries(m.continueWatching.pathFilter())},onError:()=>ke.error("Failed to mark episode as watched")}),V=U(async(v,S)=>{!r||!u||await z({episodeNumber:v,duration:S,showMeta:u,episodes:y?.episodes||[]})},[r,u,y?.episodes,z]),G=U(async()=>{l({type:"SET_STATE",payload:{showCombinedDetails:!i.showCombinedDetails}})},[i.showCombinedDetails]),K=Me(()=>{const v=P||T,S=v?v.message:null,M=S==="AUTH_REQUIRED"?null:S,C=w&&w.fetchedEpisodeNumber===o?w:null,H=!!w&&!C;return{...i,currentEpisode:o,showMeta:{...i.showMeta||{},...u||{}},episodes:y?.episodes||[],watchedEpisodes:y?.watchedEpisodes||[],inWatchlist:!!y?.inWatchlist,watchlistStatus:y?.watchlistStatus??i.watchlistStatus??null,videoSources:C?.videoSources||[],selectedSource:i.selectedSource||C?.selectedSource||null,selectedLink:i.selectedLink||C?.selectedLink||null,resumeTime:C?.resumeTime||0,resumeDuration:C?.resumeDuration||0,showResumeModal:i.showResumeModal&&(C?.showResumeModal??!1),skipIntervals:C?.skipIntervals||[],loadingShowData:E,loadingVideo:k||H,error:M,fetchedEpisodeNumber:C?.fetchedEpisodeNumber}},[i,u,y,w,E,k,P,T,o]),q=U((v,S)=>{const M=S||r;if(!M||!v||M===r&&v===o)return;const H=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(M)&&i.selectedProvider!=="animepahe"?"animepahe":i.selectedProvider,D=["video-sources",M,v,H,i.currentMode];s.getQueryState(D)?.status!=="success"&&s.prefetchQuery({queryKey:D,queryFn:()=>At(M,v,{selectedProvider:H,currentMode:i.currentMode},l,!0),staleTime:300*1e3,gcTime:1800*1e3})},[r,o,s,i,l]);return{state:K,dispatch:l,toggleWatchlist:d,moveToCompleted:I,setPreferredSource:h,handleToggleDetails:G,markEpisodeWatched:V,prefetchEpisodeSources:q,isMarkingWatched:F,isUpdatingWatchlistStatus:J}};function zn({onNext:r,onToggleTheater:n,flashControls:a}){W(()=>{const b=i=>{i.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||(["arrowup","arrowdown","arrowleft","arrowright"].includes(i.key.toLowerCase())&&a(),i.key.toLowerCase()==="n"&&r(),i.key.toLowerCase()==="t"&&n())};return document.addEventListener("keydown",b),()=>{document.removeEventListener("keydown",b)}},[a,r,n])}const Ze=(r,n,a)=>r.showId===n||!!a&&r.showId===a;function qn({videoRef:r,testClipActive:n,selectedSourceType:a,onEnded:b,queue:i,removeFromQueue:l,showId:s,showMetaId:m,showMetaStatus:c,currentEpisode:g,episodes:f,isAutoplayEnabled:e,isCompleted:o,showResumeModal:N,nextEpisode:u,previousEpisode:E,navigate:P,invalidateContinueWatching:y,dispatch:w}){const[k,T]=le(!1),_=A(!1),[d,h]=le(null),[x,J]=le(null),I=A(l);I.current=l;const z=o||k,F=z&&Pt(f,g??void 0,c);W(()=>{k||(_.current=!1)},[k]);const V=U(()=>{b();const D=i.find(L=>Ze(L,s,m)&&L.episodeNumber===g);if(i.length>0){const L=i.findIndex(pe=>Ze(pe,s,m)&&pe.episodeNumber===g),Q=L>=0?i[L+1]||null:i[0];J({nextItem:Q,playedItem:D||null}),h(2)}else D&&I.current({showId:D.showId,episodeNumber:D.episodeNumber});let B=!1;if(e&&i.length===0){const L=f.findIndex(Q=>Q===g);if(L>-1&&L<f.length-1){const Q=f[L+1];y(),P(`/watch/${s}/${Q}`),B=!0}}!B&&i.length===0&&!x&&!_.current&&Pt(f,g??void 0,c)&&w({type:"SET_STATE",payload:{showResumeModal:!0}})},[b,P,i,s,m,c,g,f,e,x,w,y]),G=U(()=>{if(i.length===0)return;b();const D=i.find(Q=>Ze(Q,s,m)&&Q.episodeNumber===g),B=i.findIndex(Q=>Ze(Q,s,m)&&Q.episodeNumber===g),L=B>=0?i[B+1]||null:i[0];D&&l({showId:D.showId,episodeNumber:D.episodeNumber}),L?P(`/watch/${L.showId}/${L.episodeNumber}`):D&&w({type:"SET_STATE",payload:{showResumeModal:!0}})},[b,P,i,l,s,m,g,w]),K=U(()=>{u&&(y(),T(!1),P(`/watch/${s}/${u}`)),w({type:"SET_STATE",payload:{showResumeModal:!1}})},[u,P,s,w,y]),q=U(()=>{i.length>0?G():u?K():ke.error("No next episode available")},[i.length,G,K,u]),v=U(()=>{_.current=!0},[]),S=U(()=>T(!1),[]),M=U(D=>T(D),[]),C=U(()=>{J(null),h(null)},[]),H=U(()=>{E&&P(`/watch/${s}/${E}`)},[E,P,s]);return W(()=>{const D=r.current;if(!D)return;const B=()=>{n||V()};return D.addEventListener("ended",B),()=>{D.removeEventListener("ended",B)}},[V,r,n]),W(()=>{const D=B=>{B.origin===window.location.origin&&a==="iframe"&&B.data?.type==="ANI_WEB_MEDIA_ENDED"&&V()};return window.addEventListener("message",D),()=>window.removeEventListener("message",D)},[V,a]),W(()=>{if(!x||d===null)return;if(d<=0){const{nextItem:B,playedItem:L}=x;J(null),h(null),L&&I.current({showId:L.showId,episodeNumber:L.episodeNumber}),B?P(`/watch/${B.showId}/${B.episodeNumber}`):L&&w({type:"SET_STATE",payload:{showResumeModal:!0}});return}const D=window.setTimeout(()=>{h(B=>B===null?null:B-1)},1e3);return()=>window.clearTimeout(D)},[x,d,P,w]),W(()=>{k&&(N||i.length>0||x||_.current||F&&w({type:"SET_STATE",payload:{showResumeModal:!0}}))},[k,F,N,i.length,x,w]),{hasReachedEpisodeEnd:k,effectiveIsCompleted:z,isShowCompleted:F,queueCountdown:d,pendingQueueTransition:x,handleQueueTransition:G,handleNextEpisode:K,handleNShortcut:q,handlePreviousEpisode:H,markShowCompletedDismissed:v,resetReachedEpisodeEnd:S,setReachedEpisodeEnd:M,cancelQueueTransition:C}}function Hn({videoRef:r,queue:n,showId:a,showMetaId:b,currentEpisode:i,selectedSourceType:l,hasNextEpisode:s,nextEpisode:m,prefetchEpisodeSources:c,setReachedEpisodeEnd:g,matchesQueueItem:f}){const[e,o]=le(!1),N=A(c);N.current=c;const u=A("");return W(()=>{const E=r.current;if(o(!1),g(!1),!E||l==="iframe")return;const P=()=>{const y=E.duration,w=E.currentTime;if(!y||Number.isNaN(y)){o(!1),g(!1);return}if(y-w<=60){const k=n.findIndex(d=>f(d,a,b)&&d.episodeNumber===i),T=n.length>0?k>=0?n[k+1]||null:n[0]:null,_=T?`${T.showId}:${T.episodeNumber}`:s?`${a}:${m}`:"";_&&u.current!==_&&(u.current=_,T?N.current(T.episodeNumber,T.showId):N.current(m??""))}o(s&&Bt(w,y)),g(w>=Math.max(y*.98,y-10))};return P(),E.addEventListener("timeupdate",P),E.addEventListener("loadedmetadata",P),()=>{E.removeEventListener("timeupdate",P),E.removeEventListener("loadedmetadata",P)}},[r,s,i,l,m,a,n,b,g,f,c]),{showNextEpisodePrompt:e}}const Et="fallbackChoice";function jn(){try{const r=localStorage.getItem(Et);return r==="iframe"||r==="retry"?r:null}catch{return null}}function Yn(r){try{r===null?localStorage.removeItem(Et):localStorage.setItem(Et,r)}catch{}}function Xn({showId:r,episodeNumber:n,currentMode:a,selectedProvider:b,selectedSourceType:i,videoSources:l,isAdult:s,providerOrder:m,matureProviders:c,setPreferredSource:g,dispatch:f,showControls:e}){const o=A(!1),N=A([]),u=A(!1),[E,P]=le(null),[y,w]=le(!1),[k,T]=le(!1),[_,d]=le(()=>jn()??"ask"),h=U(S=>{d(S),Yn(S==="ask"?null:S)},[]),x=A(_);W(()=>{x.current=_},[_]);const J=A(l);J.current=l;const I=U(()=>{o.current=!1,N.current=[],u.current=!1,P(null),w(!1)},[]);W(()=>{I()},[I,r,n]);const z=U(S=>{if(o.current)return;o.current=!0;const M=S.links[0];g(S.sourceName),f({type:"SET_STATE",payload:{selectedSource:S,selectedLink:M}}),P(null)},[f,g]),F=U(()=>{const M=J.current.find(C=>C.type==="iframe");return M?.links?.length?M:null},[]),V=U(async()=>{const S=m.filter(M=>{if(N.current.includes(M))return!1;const C=c.has(M);return s===void 0?!0:C===s});w(!0);try{for(const M of S){N.current.push(M);let C=null;try{C=await he.data.video.query({showId:r,episodeNumber:n,mode:a,provider:M})}catch{continue}const H=(C??[]).filter(L=>{const Q=L.sourceName.toLowerCase();return a==="dub"?Q.includes("eng")||Q.includes("dub"):Q.includes("jpn")||Q.includes("sub")||!Q.includes("eng")&&!Q.includes("dub")});if((H.length>0?H:C??[]).find(L=>L.type!=="iframe"&&L.links?.length)){N.current=[b],u.current=!1,f({type:"SET_STATE",payload:{selectedProvider:M,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),Ft(M,s===!0),P(null),ke.success(`Switched to ${M} (direct stream)`);return}}P({retryFailed:!0}),ke.error("No working direct stream found on other providers")}finally{w(!1)}},[r,n,a,s,b,f,m,c]),G=U(()=>{if(o.current||u.current||i!=="player")return;const S=F();if(!S)return;N.current.includes(b)||N.current.push(b);const M=x.current;if(M==="iframe"){z(S);return}if(M==="retry"){V();return}e(!0),P({retryFailed:!1})},[i,b,F,z,V,e]),K=U(()=>{u.current=!0,P(null),T(!1)},[]),q=U(()=>{k&&h("iframe");const S=F();S?z(S):P(null)},[k,h,F,z]),v=U(()=>{k&&h("retry"),V()},[k,h,V]);return{fallbackPrompt:E,isRetryingProvider:y,rememberFallbackChoice:k,setRememberFallbackChoice:T,fallbackChoice:_,updateFallbackChoice:h,dismissFallbackPrompt:K,chooseIframeFallback:q,chooseProviderRetry:v,handleVideoSourceError:G,resetFallback:I}}function Jn({videoRef:r,selectedSource:n,selectedLink:a,loadingVideo:b,testClipActive:i,resumeTime:l,showResumeModal:s,calibReturnRef:m,setAvailableSubtitles:c,setActiveSubtitleTrack:g,showControls:f,onFatalError:e}){const o=A(null),N=A(0),u=A(l),E=A(s),P=A(e);return P.current=e,W(()=>{u.current=l,E.current=s},[l,s]),W(()=>{const y=r.current;if(!y)return;let w=!1;for(o.current&&(o.current.destroy(),o.current=null),(b||n)&&(y.pause(),y.removeAttribute("src"),y.load());y.firstChild;)y.removeChild(y.firstChild);if(i)return y.src="/av-sync-test.mp4",y.play().catch(()=>{f(!0)}),()=>{w=!0};if(!n||!a)return;if(n.type==="iframe"){N.current=0;return}m.current!=null?(N.current=m.current,m.current=null):u.current>5&&!E.current?N.current=u.current:E.current&&(N.current=0);let k=a.link;if(k.startsWith("/api/proxy")||(k=`/api/proxy?url=${encodeURIComponent(k)}`,a.headers?.Referer&&(k+=`&referer=${encodeURIComponent(a.headers.Referer)}`)),n.subtitles){const I=localStorage.getItem("playerSubtitlesEnabled")!=="false";let z=null;try{z=localStorage.getItem("playerLastSubtitle")}catch{}const F=wt(n.subtitles,{lastKey:z,enabled:I}),V=F>=0?n.subtitles[F]:null;n.subtitles.forEach(G=>{const K=document.createElement("track");K.kind="subtitles",K.label=G.label,K.srclang=G.lang;const q=G.src??G.url;if(q){let v=`/api/subtitle-proxy?url=${encodeURIComponent(q)}`;const S=a.headers?.Referer;S&&(v+=`&referer=${encodeURIComponent(S)}`),K.src=v}V&&G.label===V.label&&G.lang===V.lang&&(K.default=!0),y.appendChild(K)}),I||g("off"),c(n.subtitles)}const T=N.current;N.current=0;const _=()=>{T>0&&(y.currentTime=T)};y.addEventListener("loadedmetadata",_,{once:!0});const d=!(E.current&&u.current>5),h=()=>{d&&y.play().catch(()=>{f(!0)})};a.hls?(async()=>{const I=await qr();if(w)return;if(!I||!I.isSupported()){y.src=k,h();return}const z=document.body.classList.contains("low-end"),F=new I({maxBufferLength:z?15:30,maxMaxBufferLength:z?30:60,maxBufferSize:z?25*1e3*1e3:60*1e3*1e3,startLevel:-1,enableWorker:!0});o.current=F,F.on(I.Events.ERROR,(K,q)=>{q.fatal&&P.current()});const V=(n.subtitles?.length??0)>0,G=()=>{try{V&&typeof F.subtitleTrack=="number"&&F.subtitleTrack!==-1&&(F.subtitleTrack=-1)}catch{}};F.on(I.Events.SUBTITLE_TRACK_SWITCH,(K,q)=>{q?.id!==-1&&G()}),G(),F.loadSource(k),F.attachMedia(y),F.once(I.Events.MANIFEST_PARSED,()=>{w||h()})})():(y.src=k,h());const x=localStorage.getItem("playerVolume"),J=localStorage.getItem("playerMuted");return x!==null&&(y.volume=parseFloat(x)),J!==null&&(y.muted=J==="true"),()=>{w=!0,y.removeEventListener("loadedmetadata",_),o.current&&(o.current.destroy(),o.current=null)}},[n,a,r,m,b,i,g,c,f]),{seekToTimeRef:N}}function Zn({videoRef:r,availableSubtitles:n,activeSubtitleTrack:a,setAvailableSubtitles:b,setActiveSubtitleTrack:i}){W(()=>{const l=r.current;if(!l)return;const s=()=>{const m=Array.from(l.textTracks).map(c=>({label:c.label,lang:c.language,src:void 0,mode:c.mode}));b(m)};return l.textTracks.addEventListener("addtrack",s),l.textTracks.addEventListener("removetrack",s),s(),()=>{l.textTracks.removeEventListener("addtrack",s),l.textTracks.removeEventListener("removetrack",s)}},[r,b]),W(()=>{if(a===null&&n.length>0&&localStorage.getItem("playerSubtitlesEnabled")!=="false"){let l=null;try{l=localStorage.getItem("playerLastSubtitle")}catch{}const s=wt(n,{lastKey:l,enabled:!0});if(s<0){i("off");return}const m=n[s];i(m.lang||m.label)}},[a,n,i]),W(()=>{const l=r.current;if(!l||n.length===0)return;const s=a;if(!(localStorage.getItem("playerSubtitlesEnabled")!=="false")||s==="off"||s===null){Array.from(l.textTracks).forEach(g=>{g.mode="hidden"});return}let c=!1;if(Array.from(l.textTracks).forEach(g=>{const e=(g.language===s||g.label===s)&&!c;g.mode=e?"showing":"hidden",e&&(c=!0)}),!c&&l.textTracks.length>0){const g=Array.from(l.textTracks).find(f=>f.language==="en"||f.label==="English")||l.textTracks[0];g&&(g.mode="showing")}},[a,n,r])}function eo({videoRef:r,videoBoxH:n,style:a,sourceKey:b,activeSubtitleTrack:i,availableSubtitles:l}){W(()=>{const s="dynamic-subtitle-styles";let m=document.getElementById(s);m||(m=document.createElement("style"),m.id=s,document.head.appendChild(m)),m.textContent=Nt(a);const c=r.current;if(!c)return;const g=_t(a.fontSize,n||c.clientHeight||720);m.textContent=Nt({...a,fontSize:g});const f=()=>{const T=Number(a.position),_=isNaN(T)?0:Math.max(0,Math.min(100,T));return Math.max(0,Math.min(100,100-_))},e=(T,_)=>{try{const d=T;d.snapToLines=!1,d.line=_}catch{}},o=()=>{const T=g*16,_=c.videoHeight||c.clientHeight||720,d=c.videoWidth||c.clientWidth||1280;return{step:T*1.3/_*100,chars:Math.max(20,Math.floor(d/(T*.55)))}},N=T=>{const _=f(),d=Array.from(T.activeCues??[]);if(d.length<=1){d.forEach(I=>e(I,_));return}const{step:h,chars:x}=o();let J=_;for(let I=d.length-1;I>=0;I--){const F=String(d[I].text??"").replace(/<[^>]*>/g,"").split(`
|
|
55
|
-
`).reduce((G,K)=>G+Math.max(1,Math.ceil(K.length/x)),0),V=J-F*h;e(d[I],Math.max(0,V)),J=V-h*.4}},u=T=>{if(!T.cues)return;const _=f();Array.from(T.cues).forEach(d=>e(d,_)),T.mode==="showing"&&N(T)},E=()=>{Array.from(c.textTracks).forEach(u)};E();const P=T=>{const _=T.target;_.mode==="showing"&&N(_)};Array.from(c.textTracks).forEach(T=>{T.addEventListener("cuechange",P)});const y=()=>{Array.from(c.textTracks).forEach(T=>{T.removeEventListener("cuechange",P),T.addEventListener("cuechange",P)}),E()};c.textTracks.addEventListener("addtrack",y),c.textTracks.addEventListener("removetrack",y);const w=Array.from(c.querySelectorAll("track")),k=()=>{E()};return w.forEach(T=>{T.addEventListener("load",k)}),()=>{Array.from(c.textTracks).forEach(T=>{T.removeEventListener("cuechange",P)}),c.textTracks.removeEventListener("addtrack",y),c.textTracks.removeEventListener("removetrack",y),w.forEach(T=>{T.removeEventListener("load",k)})}},[a,n,r,b,i,l])}function to({videoRef:r,overlayRef:n,style:a,activeSubtitleTrack:b,delayMs:i,enabled:l}){W(()=>{if(!l)return;const s=r.current,m=n.current;if(!s||!m)return;const c=localStorage.getItem("playerSubtitlesEnabled")!=="false",g=()=>{if(m.innerHTML="",!c||b==="off"||b===null)return;const o=Array.from(s.textTracks).find(k=>k.language===b||k.label===b);if(!o||o.mode!=="showing")return;const N=i/1e3;let u;if(N>0&&o.cues){const k=s.currentTime-N;u=Array.from(o.cues).filter(T=>T.startTime<=k&&k<=T.endTime)}else u=Array.from(o.activeCues??[]);if(u.length===0)return;const E={...a,fontSize:_t(a.fontSize,s.clientHeight||0)},P=dr(E),y=mr(s,E.position),w=Array.from(u);w.forEach((k,T)=>{const _=String(k.text??"");if(!fr(_).trim())return;const d=document.createElement("div"),h=(w.length-1-T)*1.7;d.style.cssText=`${P}
|
|
56
|
-
bottom: calc(${y}px + ${h}em);`,d.innerHTML=pr(_),m.appendChild(d)})},f=()=>g(),e=()=>g();return Array.from(s.textTracks).forEach(o=>{o.addEventListener("cuechange",f)}),s.addEventListener("timeupdate",e),g(),()=>{Array.from(s.textTracks).forEach(o=>{o.removeEventListener("cuechange",f)}),s.removeEventListener("timeupdate",e),m.innerHTML=""}},[b,i,l,n,a,r])}const ro=({isOpen:r,onClose:n,onSuccess:a})=>{const b=()=>{a?.(),n()};return t(we,{isOpen:r,onClose:n,title:"MKissa Browser Verification",children:t("div",{className:Qe.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:Qe.actions,children:t("a",{className:Qe.link,href:"https://mkissa.to/anime",target:"_blank",rel:"noreferrer",children:"Open MKissa anime"})}),t("div",{className:Qe.actions,children:[t("button",{className:Qe.secondaryButton,onClick:n,children:"Cancel"}),t("button",{className:Qe.button,onClick:b,children:"Refresh Dango"})]})]})})},So=()=>{const{id:r,episodeNumber:n}=tr(),a=rr(),b=xt(),i=nr(),{hasConsent:l,grant:s}=xr(),{options:m}=Dt(),c=Me(()=>m.filter(p=>(p.kind??"anime")==="anime"),[m]),g=Me(()=>c.map(p=>p.id),[c]),f=Me(()=>new Set(c.filter(p=>p.mature).map(p=>p.id)),[c]),{state:e,dispatch:o,toggleWatchlist:N,moveToCompleted:u,setPreferredSource:E,handleToggleDetails:P,markEpisodeWatched:y,prefetchEpisodeSources:w,isMarkingWatched:k,isUpdatingWatchlistStatus:T}=Kn(r,n,i.state||null,{hasMatureConsent:l});W(()=>{if(r&&e.showMeta?.id&&e.showMeta.id!==r){const p=n?`/watch/${e.showMeta.id}/${n}${window.location.search}`:`/watch/${e.showMeta.id}${window.location.search}`;a(p,{replace:!0})}},[r,e.showMeta?.id,n,a]);const _=Me(()=>{if(e.showMeta.name)return{name:e.showMeta.name,thumbnail:e.showMeta.thumbnail,names:e.showMeta.names,genres:e.showMeta.genres,score:e.showMeta.score,isAdult:e.showMeta.isAdult}},[e.showMeta.name,e.showMeta.thumbnail,e.showMeta.names,e.showMeta.genres,e.showMeta.score,e.showMeta.isAdult]),d=hr({skipIntervals:e.skipIntervals,showId:r,episodeNumber:e.currentEpisode?.toString(),episodeCount:e.episodes.length||void 0,sourceType:e.selectedSource?.type,showMeta:_}),{refs:h,actions:x}=d,J=Qr(),I=A(null),z=A(null),F=A(null),[V,G]=le(()=>{try{const p=localStorage.getItem("anime4kProfile");return["low","balanced","high","denoise"].includes(p)?p:"balanced"}catch{return"balanced"}}),{videoDelayMs:K,videoDelayEnabled:q,setDelayEnabled:v,handleVideoDelayChange:S,isCalibrating:M,testClipActive:C,stopCalibration:H,openAvSyncCalibrator:D,cancelAvSyncCalibrator:B,applyAvSyncCalibrator:L,toggleTestClip:Q,calibReturnRef:pe,effectiveVideoDelayMs:Le}=vr(h.videoRef,()=>x.setShowSettings(!1)),Ne=A(null),re=Fn({videoRef:h.videoRef,canvasRef:z,profile:V,delayMs:Le}),Y=re.isEnabled&&re.isWebGPUSupported;On({videoRef:h.videoRef,episodeKey:`${r??""}:${e.currentEpisode??""}`,isEnabled:re.isEnabled,isSupported:re.isWebGPUSupported,mediaReady:!e.loadingVideo&&!!e.selectedLink,isIframeSource:e.selectedSource?.type==="iframe",setEnabled:re.setEnabled}),gr({videoRef:h.videoRef,canvasRef:Ne,delayMs:Le,enabled:q&&!Y});const Te=q&&!Y,Be=Y||Te,[ne,X]=le(!1),ge=A(n);W(()=>{ge.current!==n&&(ge.current=n,H())},[n,H]);const dt=U(()=>{b.invalidateQueries({queryKey:[ie.continueWatching]})},[b]),{data:Pe=[],isLoading:et}=_r(),tt=Lr(),Ge=Br(),mt=Dr(),{isTheaterMode:ce,toggleTheaterMode:ue,handleLayoutClick:ft}=yr();or(()=>{if(d.state.isFullscreen||ce)return;const p=h.playerContainerRef.current,te=I.current;if(!p||!te)return;const Fe=()=>{const bt=p.getBoundingClientRect().height;te.style.height=`${bt}px`};Fe();const lt=new ResizeObserver(Fe);return lt.observe(p),()=>lt.disconnect()},[d.state.isFullscreen,ce,h.playerContainerRef]);const Ce=Me(()=>e.episodes.findIndex(p=>p===e.currentEpisode),[e.episodes,e.currentEpisode]),rt=Ce>0?e.episodes[Ce-1]:null,Ae=Ce>=0&&Ce<e.episodes.length-1?e.episodes[Ce+1]:null,nt=Ce>-1&&Ce<e.episodes.length-1,O=Bt(e.resumeTime,e.resumeDuration),{hasReachedEpisodeEnd:De,effectiveIsCompleted:Ke,isShowCompleted:oe,queueCountdown:ot,pendingQueueTransition:xe,handleQueueTransition:We,handleNextEpisode:$e,handleNShortcut:st,handlePreviousEpisode:ze,markShowCompletedDismissed:qe,resetReachedEpisodeEnd:_e,setReachedEpisodeEnd:at,cancelQueueTransition:pt}=qn({videoRef:h.videoRef,testClipActive:C,selectedSourceType:e.selectedSource?.type,onEnded:x.onEnded,queue:Pe,removeFromQueue:tt.mutate,showId:r,showMetaId:e.showMeta?.id,showMetaStatus:e.showMeta.status,currentEpisode:e.currentEpisode,episodes:e.episodes,isAutoplayEnabled:e.isAutoplayEnabled,isCompleted:O,showResumeModal:e.showResumeModal,nextEpisode:Ae,previousEpisode:rt,navigate:a,invalidateContinueWatching:dt,dispatch:o}),{showNextEpisodePrompt:ht}=Hn({videoRef:h.videoRef,queue:Pe,showId:r,showMetaId:e.showMeta?.id,currentEpisode:e.currentEpisode,selectedSourceType:e.selectedSource?.type,hasNextEpisode:nt,nextEpisode:Ae,prefetchEpisodeSources:w,setReachedEpisodeEnd:at,matchesQueueItem:Ze}),He=e.showResumeModal&&(oe||!Ke),ee=Ke&&!oe&&Pe.length===0&&!xe&&(e.showResumeModal||De),se=He||ee;br(d,!!e.selectedLink&&!ce&&!se);const{fallbackPrompt:de,isRetryingProvider:me,rememberFallbackChoice:ve,setRememberFallbackChoice:ye,fallbackChoice:je,updateFallbackChoice:Ue,dismissFallbackPrompt:be,chooseIframeFallback:ae,chooseProviderRetry:vt,handleVideoSourceError:Ve,resetFallback:fe}=Xn({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:g,matureProviders:f,setPreferredSource:E,dispatch:o,showControls:x.setShowControls}),{seekToTimeRef:Ye}=Jn({videoRef:h.videoRef,selectedSource:e.selectedSource,selectedLink:e.selectedLink,loadingVideo:e.loadingVideo,testClipActive:C,resumeTime:e.resumeTime,showResumeModal:e.showResumeModal,calibReturnRef:pe,setAvailableSubtitles:x.setAvailableSubtitles,setActiveSubtitleTrack:x.setActiveSubtitleTrack,showControls:x.setShowControls,onFatalError:Ve});W(()=>{se&&d.state.isFullscreen&&d.actions.toggleFullscreen()},[se,d.state.isFullscreen,d.actions]),W(()=>{se&&h.videoRef.current&&h.videoRef.current.pause()},[se,h.videoRef]);const{titlePreference:it}=$r(),{lowEndMode:kt}=Ir(),{settings:gt,update:Ot}=Sr(),Wt=ce&>.enabled&&!kt&&e.selectedSource?.type!=="iframe"&&!!e.selectedLink,Ie=Me(()=>{if(!e.showMeta||e.loadingShowData)return"Loading...";const{name:p,names:te}=e.showMeta;return it==="name"?p||"Loading...":it==="nativeName"?te?.native||p||"Loading...":it==="englishName"?te?.english||p||"Loading...":p||"Loading..."},[e.showMeta,it,e.loadingShowData]);W(()=>{Ie&&Ie!=="Loading..."&&e.currentEpisode&&(document.title=`► ${Ie} Episode ${e.currentEpisode} - dango`)},[Ie,e.currentEpisode]),zn({onNext:st,onToggleTheater:ue,flashControls:d.actions.flashControls});const{setAvailableSubtitles:Ut,setActiveSubtitleTrack:Vt}=x,Tt=Me(()=>({fontSize:d.state.subtitleFontSize,position:d.state.subtitlePosition,bgOpacity:d.state.subtitleBgOpacity,bgColor:d.state.subtitleBgColor,textColor:d.state.subtitleTextColor,edge:d.state.subtitleEdge,bold:d.state.subtitleBold}),[d.state.subtitleFontSize,d.state.subtitlePosition,d.state.subtitleBgOpacity,d.state.subtitleBgColor,d.state.subtitleTextColor,d.state.subtitleEdge,d.state.subtitleBold]);Zn({videoRef:h.videoRef,availableSubtitles:d.state.availableSubtitles,activeSubtitleTrack:d.state.activeSubtitleTrack,setAvailableSubtitles:Ut,setActiveSubtitleTrack:Vt});const[Qt,Gt]=le(0);W(()=>{const p=h.videoRef.current;if(!p)return;const te=()=>Gt(p.clientHeight||0);te();const Fe=new ResizeObserver(te);return Fe.observe(p),()=>Fe.disconnect()},[h.videoRef,e.selectedSource,e.selectedLink]),eo({videoRef:h.videoRef,videoBoxH:Qt,style:Tt,sourceKey:`${e.selectedSource?.sourceName??""}:${e.selectedLink?.link??""}`,activeSubtitleTrack:d.state.activeSubtitleTrack,availableSubtitles:d.state.availableSubtitles}),to({videoRef:h.videoRef,overlayRef:F,style:Tt,activeSubtitleTrack:d.state.activeSubtitleTrack,delayMs:Le,enabled:Be}),W(()=>{try{localStorage.setItem("anime4kProfile",V)}catch{}},[V]);const Kt=()=>{h.videoRef.current&&(h.videoRef.current.currentTime=e.resumeTime,h.videoRef.current.play()),o({type:"SET_STATE",payload:{showResumeModal:!1}})},zt=()=>{h.videoRef.current&&(h.videoRef.current.currentTime=0,h.videoRef.current.play()),o({type:"SET_STATE",payload:{showResumeModal:!1}})},yt=U(()=>{oe&&qe(),ee&&_e(),o({type:"SET_STATE",payload:{showResumeModal:!1}})},[o,oe,ee,qe,_e]),qt=U(()=>{if(_e(),h.videoRef.current)try{h.videoRef.current.currentTime=0,h.videoRef.current.play().catch(()=>{})}catch{}o({type:"SET_STATE",payload:{showResumeModal:!1}})},[o,h,_e]),Ht=U(async()=>{try{await u(),o({type:"SET_STATE",payload:{showResumeModal:!1}}),a("/")}catch{}},[u,o,a]),Ct=(p,te)=>t("div",{className:p,children:[t("button",{className:`${R.episodeNavBtn} ${R.secondary}`,onClick:ze,disabled:!rt,type:"button",children:[t(Z,{name:"chevron-left",size:12}),"Prev EP"]}),t("button",{className:`${R.episodeNavBtn} ${R.primary}`,onClick:$e,disabled:!Ae,type:"button",children:["Next EP",t(Z,{name:"chevron-right",size:12})]}),te==="mobile"&&J&&t("button",{className:`${R.episodeNavBtn} ${R.episodePickerBtn}`,onClick:()=>X(!0),type:"button",children:[t(Z,{name:"list-ul",size:12}),"Episodes"]})]}),jt=p=>{o({type:"SET_STATE",payload:{isAutoplayEnabled:p}}),Ur(p)},Rt=!!(e.currentEpisode&&e.watchedEpisodes.includes(e.currentEpisode)),Yt=e.selectedProvider!=="megaplay"||e.selectedSource?.type==="iframe",Xt=U(async()=>{if(!r||!e.currentEpisode||!e.showMeta.name||k)return;const p=h.videoRef.current?.duration,te=Math.max(p||0,e.resumeDuration||0,Number(e.showMeta.episodeDuration||0)*60,1);await y(e.currentEpisode,te)},[r,e.currentEpisode,e.showMeta,e.resumeDuration,y,k,h.videoRef]);if(e.error&&!e.showMeta.name&&e.videoSources.length===0&&e.episodes.length===0)return t("p",{className:"error-message",children:["Error: ",e.error]});const Re=e.loadingShowData||e.loadingVideo;return e.showMeta?.isAdult===!0&&!l?t("div",{className:Se.playerPageLayout,children:t(Vr,{isOpen:!0,onClose:()=>a("/home"),onGrant:s})}):t("div",{className:`${Se.playerPageLayout} ${ce?Se.theaterMode:""}`,onClick:ft,children:[ce&&t(Er,{videoRef:h.videoRef,active:Wt,settings:gt}),t(we,{isOpen:He&&oe,onClose:yt,title:"Show Completed!",width:"sm",children:[t(we.Body,{children:t("p",{children:"Congratulations! You've finished the final episode of this series."})}),t(we.Actions,{children:t(Je,{onClick:Ht,disabled:T,children:T?"Saving...":"Move to Completed"})})]}),t(wr,{isOpen:He&&!oe,onClose:yt,title:"Resume Playback?",message:t(ct,{children:["You were watching at ",t("strong",{children:d.actions.formatTime(e.resumeTime)}),". Would you like to continue?"]}),onResume:Kt,onRestart:zt}),t(we,{isOpen:ee,onClose:yt,title:"Episode Completed",width:"sm",children:[t(we.Body,{children:t("p",{children:["You've already watched Episode ",t("strong",{children:e.currentEpisode}),".",Ae?" Would you like to watch the next episode?":""]})}),t(we.Actions,{children:[t(Je,{variant:"secondary",onClick:qt,children:"Replay"}),Ae&&t(Je,{onClick:$e,children:`Watch EP ${Ae}`})]})]}),t(we,{isOpen:!!de,onClose:be,title:"Direct stream failed",width:"sm",children:[t(we.Body,{children:[t("p",{children:[t("strong",{children:e.selectedProvider}),"'s direct stream failed for this episode."]}),de?.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:ve,onChange:p=>ye(p.currentTarget.checked)}),"Remember my choice"]})]}),t(we.Actions,{children:[t(Je,{variant:"secondary",onClick:ae,children:"Continue with iframe"}),t(Je,{onClick:vt,disabled:me,children:me?"Searching…":"Try another provider"})]})]}),t(Fr,{isOpen:!!e.showCookieModal&&e.cookieProvider!=="mkissa",onClose:()=>o({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{b.invalidateQueries({queryKey:[ie.videoSources,r,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),t(ro,{isOpen:!!e.showCookieModal&&e.cookieProvider==="mkissa",onClose:()=>o({type:"SET_STATE",payload:{showCookieModal:!1}}),onSuccess:()=>{b.invalidateQueries({queryKey:[ie.videoSources,r,e.currentEpisode,e.selectedProvider,e.currentMode]})}}),!ce&&t("aside",{ref:I,className:Se.episodeSidebar,children:e.loadingShowData?t(kr,{variant:"sidebar"}):t(Tr,{episodes:e.episodes,currentEpisode:e.currentEpisode??void 0,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:p=>a(`/watch/${r}/${p}`)})}),t("div",{className:Se.playerMain,children:[t("div",{className:`${R.videoContainer} ${d.state.isFullscreen?"":Se.videoPlayerWrapper} ${d.state.isFullscreen?R.fullscreenActive:""}`,style:{...se?{visibility:"hidden"}:{}},onContextMenu:p=>p.preventDefault(),children:t(Cn,{player:d,isAutoplayEnabled:e.isAutoplayEnabled,onAutoplayChange:jt,fallbackChoice:je,onFallbackChoiceChange:Ue,ambientSettings:gt,onAmbientChange:Ot,showNextEpisodeButton:!se&&ht&&Pe.length===0,onNextEpisode:$e,videoSources:e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:(p,te)=>{h.videoRef.current&&!isNaN(h.videoRef.current.currentTime)&&(Ye.current=h.videoRef.current.currentTime),E(p.sourceName),o({type:"SET_STATE",payload:{selectedSource:p,selectedLink:te,showResumeModal:e.showResumeModal&&p.type!=="iframe"}})},loadingVideo:Re,skipIntervals:e.skipIntervals,animeTitle:Ie,episodeNumber:e.currentEpisode??void 0,isTheaterMode:ce,onTheaterModeToggle:ue,anime4kEnabled:re.isEnabled,onAnime4kToggle:re.toggle,anime4kSupported:re.isWebGPUSupported,anime4kProfile:V,onAnime4kProfileChange:G,anime4kInitializing:re.isInitializing,anime4kError:re.error,videoDelayEnabled:q,onVideoDelayToggle:v,videoDelayMs:K,onVideoDelayChange:S,onCalibrateAvSync:D,isInteractingExtra:ne||M,className:Cr.shellFill,hideChrome:e.selectedSource?.type==="iframe",overlays:t(ct,{children:[d.state.isSpeedBoostActive&&t("div",{className:R.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(Z,{name:"forward",size:12})]}),ot!==null&&xe?.nextItem&&t("div",{className:R.queueCountdown,children:["Queue next in ",ot,"s"]})]}),children:[Re&&t("div",{className:R.loadingOverlay,children:t("div",{className:R.loadingDots,children:[t("div",{className:R.dot}),t("div",{className:R.dot}),t("div",{className:R.dot})]})}),d.state.isBuffering&&!Re&&e.selectedSource?.type!=="iframe"&&t("div",{className:R.bufferingOverlay,children:t("div",{className:R.bufferingSpinner})}),e.selectedSource?.type==="iframe"?!Re&&t("iframe",{src:e.selectedLink?.link,className:R.videoIframe,allow:"autoplay; fullscreen; picture-in-picture",allowFullScreen:!0,sandbox:e.selectedSource.sandbox?`${e.selectedSource.sandbox} allow-fullscreen allow-popups allow-popups-to-escape-sandbox`:void 0}):t(ct,{children:[!Re&&e.videoSources.length===0&&t("div",{className:R.errorOverlay,children:[t("p",{children:["No sources found for this episode with ",e.selectedProvider,"."]}),t("p",{className:R.errorSubtext,children:"Please try selecting a different provider below."}),t("button",{className:R.retryButton,onClick:()=>window.location.reload(),"data-speed-boost-ignore":"true",style:{marginTop:8},children:"Retry"})]}),!Re&&e.videoSources.length>0&&t("video",{ref:h.videoRef,controls:d.state.useNativeControls,playsInline:!0,"webkit-playsinline":"true",disablePictureInPicture:!0,disableRemotePlayback:!0,onPlay:x.onPlay,onPause:x.onPause,onLoadedMetadata:x.onLoadedMetadata,onTimeUpdate:()=>{C||(x.onTimeUpdate(),xe&&h.videoRef.current&&h.videoRef.current.currentTime<h.videoRef.current.duration-1&&pt())},onVolumeChange:x.onVolumeChange,onWaiting:x.onWaiting,onPlaying:x.onPlaying,onCanPlay:x.onCanPlay,onError:Ve,onContextMenu:p=>p.preventDefault(),className:Be?R.videoElementHidden:""}),re.isWebGPUSupported&&!Re&&e.videoSources.length>0&&t("canvas",{ref:z,className:`${R.upscalerCanvas} ${Y?R.upscalerActive:""}`}),!Y&&!Re&&e.videoSources.length>0&&t("canvas",{ref:Ne,className:`${R.upscalerCanvas} ${Te?R.upscalerActive:""}`}),re.isEnabled&&re.isWebGPUSupported&&re.isInitializing&&t("div",{className:R.upscalerStatusBadge,children:"Preparing upscaler…"}),Be&&t("div",{ref:F,className:R.subtitleOverlay}),t(Rr,{isOpen:M,ms:K,onChange:S,onApply:L,onClose:B,testClipActive:C,onTestClip:Q})]})]})}),!ce&&t(Mr,{}),!ce&&t(ct,{children:[et&&Pe.length===0?t(Rn,{count:3}):t(Gr,{title:"Queue",items:Pe,currentShowId:r,currentEpisode:e.currentEpisode??void 0,onNextQueue:We,onRemove:p=>tt.mutate({showId:p.showId,episodeNumber:p.episodeNumber}),onClear:()=>Ge.mutate(),showClearAll:!0,onReorder:p=>mt.mutate(p.map(te=>({id:te.id,showId:te.showId,episodeNumber:te.episodeNumber})))}),t("div",{className:R.streamPanel,children:[t(An,{selectedProvider:e.selectedProvider,isAdult:e.showMeta?.isAdult,options:c,onProviderChange:p=>{fe(),o({type:"SET_STATE",payload:{selectedProvider:p,videoSources:[],selectedSource:null,selectedLink:null,loadingVideo:!0}}),Ft(p,e.showMeta?.isAdult===!0)}}),Ct(`${R.episodeActions} ${R.desktopEpisodeActions}`,"desktop"),Re?t("div",{className:R.sourceLoader,children:t("div",{className:R.spinner})}):t(_n,{videoSources:e.videoSources,selectedSource:e.selectedSource,selectedLink:e.selectedLink,onSourceChange:p=>{h.videoRef.current&&!isNaN(h.videoRef.current.currentTime)&&(Ye.current=h.videoRef.current.currentTime);const Fe=(p.links||[]).sort((lt,bt)=>(parseInt(bt.resolutionStr)||0)-(parseInt(lt.resolutionStr)||0))[0]||null;E(p.sourceName),o({type:"SET_STATE",payload:{selectedSource:p,selectedLink:Fe,showResumeModal:e.showResumeModal&&p.type!=="iframe"}})},onLinkChange:p=>{e.selectedSource&&(E(e.selectedSource.sourceName),o({type:"SET_STATE",payload:{selectedLink:p}}))}})]}),t("div",{className:Se.playerInfoContainer,children:[t("div",{className:Se.playerInfoHeader,children:[t("div",{className:Se.playerAnimeCard,children:t("img",{src:Or(e.showMeta.thumbnail||""),alt:Ie,loading:"lazy",decoding:"async",onError:p=>{p.target.src="/placeholder.svg"}})}),t("div",{className:Se.videoTitleSection,children:[t("div",{className:R.titleContainer,children:[t("h1",{children:Ie}),t("div",{className:R.scheduleInfo,children:[e.showMeta.status&&t("span",{className:R.status,children:e.showMeta.status}),e.showMeta.nextEpisodeAirDate&&t("span",{className:R.nextEpisode,children:["Next episode: ",e.showMeta.nextEpisodeAirDate]})]})]}),t("div",{className:R.controls,children:[t("button",{className:`${R.watchlistBtn} ${e.inWatchlist?R.inList:""}`,onClick:N,children:[e.inWatchlist?t(Z,{name:"check",size:14}):t(Z,{name:"plus",size:14}),e.inWatchlist?"In Watchlist":"Add to Watchlist"]}),t(zr,{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:`${R.watchlistBtn} ${R.queueBtn}`,activeClassName:R.queueActive}),Yt&&t("button",{className:`${R.watchlistBtn} ${R.markWatchedBtn} ${Rt?R.markWatchedDone:""}`,onClick:Xt,disabled:k||!e.currentEpisode,children:[t(Z,{name:"check",size:14}),k?"Saving...":Rt?"Watched":"Mark Watched"]}),t("button",{className:`${R.watchlistBtn} ${R.modeToggleBtn} ${e.currentMode==="dub"?R.modeToggleActive:""}`,onClick:()=>{const p=e.currentMode==="dub"?"sub":"dub";fe(),o({type:"SET_MODE",payload:p}),localStorage.setItem("preferredMode",p)},type:"button","aria-pressed":e.currentMode==="dub",children:e.currentMode==="dub"?"DUB":"SUB"}),kt&&t("button",{className:`${R.watchlistBtn} ${R.modeToggleBtn} ${d.state.useNativeControls?R.modeToggleActive:""}`,onClick:()=>{const p=!d.state.useNativeControls;d.actions.setUseNativeControls(p),localStorage.setItem("playerUseNativeControls",p.toString())},type:"button",children:d.state.useNativeControls?"NATIVE: ON":"NATIVE: OFF"})]})]})]}),Ct(`${R.episodeActions} ${R.mobileEpisodeActions}`,"mobile"),t("div",{className:Se.infoColumns,children:[t("div",{className:`${R.descriptionSection} ${R.synopsisFlat}`,children:[t("h3",{children:"Synopsis"}),t(jr,{text:e.showMeta.description?e.showMeta.description.replace(/<[^>]*>?/gm,""):"",emptyText:"No description available."}),t("button",{className:R.detailsToggleBtn,onClick:P,children:[e.showCombinedDetails?t(Z,{name:"chevron-up"}):t(Z,{name:"chevron-down"}),e.showCombinedDetails?"Hide Details":"Show Details"]})]}),e.showCombinedDetails&&t(Hr,{showMeta:e.showMeta,styles:R})]})]})]})]}),t(Nr,{isOpen:ne,onClose:()=>X(!1),episodes:e.episodes,currentEpisode:e.currentEpisode??void 0,watchedEpisodes:e.watchedEpisodes,onEpisodeClick:p=>{X(!1),a(`/watch/${r}/${p}`)}})]})};export{So as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as w,d as ne,T as te,u as e}from"./vendor-core-DfaOB3Rn.js";import{I as o}from"./vendor-icons-DrybRNxP.js";import{S as ae,O as A,a as se,A as le,b as ie}from"./OptionListMenu-CIvW5WmO.js";import{u as re}from"./index-BLh_CXtu.js";import"./AvSyncCalibrator-C5GxpyPE.js";import"./vendor-query-BBT5_sHx.js";const ce="_settingsPanel_1dymm_1",oe="_header_1dymm_33",me="_backBtn_1dymm_56",de="_contentWrapper_1dymm_76",ue="_menuContent_1dymm_82",he="_menuItem_1dymm_89",pe="_selected_1dymm_114",be="_currentValue_1dymm_134",ye="_menuNote_1dymm_141",ge="_menuError_1dymm_150",n={settingsPanel:ce,header:oe,backBtn:me,contentWrapper:de,menuContent:ue,menuItem:he,selected:pe,currentValue:be,menuNote:ye,menuError:ge},ve=($,P)=>{const{isOpen:y,onClose:ke,videoSources:Ce,currentSource:C,currentLink:N,onSourceChange:V,subtitles:O,activeSubtitleTrack:g,onSubtitleChange:E,subtitleSettings:z,onSubtitleSettingsChange:T,useNativeControls:v,onNativeControlsToggle:U,anime4kEnabled:u,onAnime4kToggle:B,anime4kSupported:f,anime4kProfile:r,onAnime4kProfileChange:h,anime4kInitializing:L,anime4kError:S,videoDelayEnabled:_,onVideoDelayToggle:M,videoDelayMs:I,onVideoDelayChange:D,onCalibrateAvSync:x,isAutoSkipEnabled:m,onAutoSkipChange:W,isAutoplayEnabled:d,onAutoplayChange:G,fallbackChoice:p,onFallbackChoiceChange:j,isTheaterMode:q,ambientSettings:b,onAmbientChange:k}=$,{lowEndMode:F}=re(),[a,i]=ne("main");w.useEffect(()=>{if(!y){const t=setTimeout(()=>i("main"),300);return()=>clearTimeout(t)}},[y]);const Q=()=>e("div",{className:n.menuContent,children:[e("button",{className:n.menuItem,onClick:()=>i("quality"),children:[e("span",{children:"Quality"}),e("span",{className:n.currentValue,children:N?.resolutionStr||"Auto"})]}),e("button",{className:n.menuItem,onClick:()=>i("subtitles"),children:[e("span",{children:"Subtitles"}),e("span",{className:n.currentValue,children:g||"Off"})]}),e("button",{className:n.menuItem,onClick:()=>i("subtitle-style"),children:e("span",{children:"Subtitle Style"})}),F&&e("button",{className:`${n.menuItem} ${v?n.selected:""}`,onClick:()=>{const t=!v;U(t),localStorage.setItem("playerUseNativeControls",t.toString())},children:[e("span",{children:"Native Controls"}),v&&e(o,{name:"check",size:12})]}),f&&e("button",{className:`${n.menuItem} ${u?n.selected:""}`,onClick:()=>{B(!u)},children:[e("span",{children:"Anime4K Upscaler"}),u&&e(o,{name:"check",size:12})]}),f&&u&&e("button",{className:n.menuItem,onClick:()=>i("upscaler"),children:e("span",{children:"Upscaler Settings"})}),e("button",{className:n.menuItem,onClick:()=>i("av-sync"),children:[e("span",{children:"A/V Sync"}),e("span",{className:n.currentValue,children:_?`${I}ms`:"Off"})]}),e("button",{className:n.menuItem,onClick:()=>i("playback"),children:[e("span",{children:"Playback"}),e("span",{className:n.currentValue,children:[m?"Auto-skip On":null,d?"Autoplay On":null].filter(Boolean).join(" • ")||"Off"})]}),q&&b&&k&&e("button",{className:n.menuItem,onClick:()=>i("ambient"),children:[e("span",{children:"Ambient Light"}),e("span",{className:n.currentValue,children:b.enabled?"On":"Off"})]})]}),R=()=>{const t=C?.links.sort((s,c)=>(parseInt(c.resolutionStr)||0)-(parseInt(s.resolutionStr)||0))||[];return e("div",{className:n.menuContent,children:e(A,{classes:{item:n.menuItem,active:n.selected},options:t.map(s=>({key:s.resolutionStr,label:s.resolutionStr,selected:N?.resolutionStr===s.resolutionStr})),onSelect:s=>{const c=t.find(l=>l.resolutionStr===s);c&&V(C,c)}})})},H=()=>e("div",{className:n.menuContent,children:e(A,{classes:{item:n.menuItem,active:n.selected},options:[{key:"off",label:"Off",selected:g==="off"},...O.map(t=>({key:t.label||t.lang,label:t.label,selected:g===(t.label||t.lang)}))],onSelect:t=>E(t)})}),K=()=>e("div",{className:n.menuContent,children:e(se,{classes:{item:n.menuItem,active:n.selected},values:z,onChange:T})}),J=te(()=>{try{const s=navigator.userAgentData?.brands?.map(l=>l.brand.toLowerCase())??[];if(s.length>0)return s.some(l=>l.includes("chromium")||l.includes("chrome")||l.includes("edge")||l.includes("opera")||l.includes("brave")||l.includes("vivaldi"));const c=navigator.userAgent.toLowerCase();return c.includes("chrome")||c.includes("chromium")||c.includes("edg")}catch{return!0}},[]),X=()=>e("div",{className:n.menuContent,children:[L&&e("div",{className:n.menuNote,role:"status",children:"Preparing GPU, this can take a few seconds…"}),S&&e("div",{className:n.menuError,role:"alert",children:["Upscaler failed: ",S]}),!J&&e("div",{className:n.menuNote,children:"Upscaling performs best in Chrome-based browsers."}),e("button",{className:`${n.menuItem} ${r==="low"?n.selected:""}`,onClick:()=>h("low"),children:[e("div",{children:[e("div",{children:"Low"}),e("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:"Lightest, best for weaker GPUs"})]}),r==="low"&&e(o,{name:"check",size:12})]}),e("button",{className:`${n.menuItem} ${r==="balanced"?n.selected:""}`,onClick:()=>h("balanced"),children:[e("div",{children:[e("div",{children:"Balanced"}),e("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:"Source + display aware"})]}),r==="balanced"&&e(o,{name:"check",size:12})]}),e("button",{className:`${n.menuItem} ${r==="high"?n.selected:""}`,onClick:()=>h("high"),children:[e("div",{children:[e("div",{children:"High"}),e("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:"Aggressive, needs strong GPU"})]}),r==="high"&&e(o,{name:"check",size:12})]}),e("button",{className:`${n.menuItem} ${r==="denoise"?n.selected:""}`,onClick:()=>h("denoise"),children:[e("div",{children:[e("div",{children:"Denoise"}),e("div",{style:{fontSize:"0.75rem",color:"var(--text-tertiary)"},children:"Denoise + upscale noisy, compressed sources"})]}),r==="denoise"&&e(o,{name:"check",size:12})]})]}),Y=()=>e("div",{className:n.menuContent,children:[e("button",{type:"button",className:`${n.menuItem} ${m?n.selected:""}`,onClick:()=>W(!m),"aria-pressed":m,children:[e("span",{children:"Auto-skip openings and endings"}),e("span",{className:n.currentValue,children:m?"On":"Off"})]}),e("div",{className:n.menuNote,children:"Automatically jump past opening, ending and recap segments when detected."}),e("button",{type:"button",className:`${n.menuItem} ${d?n.selected:""}`,onClick:()=>G(!d),"aria-pressed":d,children:[e("span",{children:"Autoplay next episode"}),e("span",{className:n.currentValue,children:d?"On":"Off"})]}),e("div",{className:n.menuNote,children:"Automatically start the next episode when this one ends."}),e("button",{type:"button",className:n.menuItem,onClick:()=>j(p==="ask"?"iframe":p==="iframe"?"retry":"ask"),children:[e("span",{children:"Failed direct stream"}),e("span",{className:n.currentValue,children:p==="iframe"?"Use iframe":p==="retry"?"Try provider":"Ask me"})]}),e("div",{className:n.menuNote,children:"When a direct stream fails: ask each time, go straight to the embedded player (may show ads), or automatically try another provider."})]}),Z=()=>e("div",{className:n.menuContent,children:e(le,{classes:{item:n.menuItem,active:n.selected,note:n.menuNote},enabled:_,delayMs:I,onToggle:M,onDelayChange:D,onCalibrate:x})}),ee=()=>b&&k?e("div",{className:n.menuContent,children:e(ie,{classes:{item:n.menuItem,active:n.selected,note:n.menuNote},values:b,onChange:k})}):null;return y?e(ae,{classes:{panel:n.settingsPanel,header:n.header,backBtn:n.backBtn,title:"",content:n.contentWrapper},title:a==="main"?"Settings":a==="ambient"?"Ambient Light":a.charAt(0).toUpperCase()+a.slice(1).replace("-"," "),titleTag:"h3",showBack:a!=="main",onBack:()=>i("main"),panelRef:P,onPanelClick:t=>t.stopPropagation(),children:[a==="main"&&Q(),a==="quality"&&R(),a==="subtitles"&&H(),a==="subtitle-style"&&K(),a==="upscaler"&&X(),a==="av-sync"&&Z(),a==="playback"&&Y(),a==="ambient"&&ee()]}):null},we=w.forwardRef(ve);export{we as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{u as t,d as S,A as P,h as v,S as Le,g as jr,q as T,o as Gr,p as Qr,a as Xr,T as Te}from"./vendor-core-DfaOB3Rn.js";import{u as Jr}from"./vendor-query-BBT5_sHx.js";import{g as nn,t as vt,W as Zr,J as Ln,e as es,A as ts,M as ur,B as ot}from"./index-BLh_CXtu.js";import{I as H}from"./vendor-icons-DrybRNxP.js";import{S as ns,U as rs,p as $n,M as ss,x as br,f as Dn,d as as,C as os,a as is,b as ls,c as en,u as cs,i as us,j as ds,m as ms,k as hs,l as bs,s as Bn,e as fs,g as ps,h as gs,r as vs,n as Me,A as ys,o as Ss,E as _s,v as Ts,P as Cs,q as de,w as ks,R as Es}from"./AvSyncCalibrator-C5GxpyPE.js";import{S as Ns,O as Pn,a as xs,A as Is,b as As}from"./OptionListMenu-CIvW5WmO.js";import{M as ws}from"./MatureConsentModal-BsdpNeXA.js";import{u as Ms}from"./useProviders-z8L8GKy0.js";import{d as Ls,g as Bs,h as Ps,f as Rs,e as zs,j as $s,k as Ds}from"./useTvLibrary-B4vcRzQc.js";import{l as Os,s as Vs,a as Rn,d as Fs,S as qs,h as dr}from"./playbackCompletion-DuUs8u-8.js";import{l as Us,c as Ws}from"./hls-DOAVt6Ry.js";import{u as Hs}from"./useIsMobile-Dvx1uJ82.js";import{S as Ks}from"./SynopsisText-B3Sa5pRv.js";import"./libraryInvalidation-AzFLnbjH.js";const Ys="_fullscreenFlat_10bzs_1",js="_timeDisplay_10bzs_12",Gs="_bottomControls_10bzs_16",Qs="_leftControls_10bzs_20",Xs="_rightControls_10bzs_21",Js="_controlBtn_10bzs_25",Zs="_controlsOverlay_10bzs_32",ea="_hidden_10bzs_52",ta="_topControls_10bzs_58",na="_backBtn_10bzs_78",ra="_videoTitleInfo_10bzs_98",sa="_animeTitle_10bzs_104",aa="_episodeLabel_10bzs_112",oa="_speedBoostBadge_10bzs_119",ia="_progressBarContainer_10bzs_165",la="_progressBar_10bzs_165",ca="_thumb_10bzs_184",ua="_bufferedBar_10bzs_202",da="_watchedBar_10bzs_212",ma="_scrubbing_10bzs_237",ha="_timeBubble_10bzs_241",ba="_bottomControlsRow_10bzs_255",fa="_nextEpisodeBtn_10bzs_278",pa="_active_10bzs_340",ga="_settingsPanel_10bzs_352",va="_settingsHeader_10bzs_371",ya="_settingsBackBtn_10bzs_379",Sa="_settingsTitle_10bzs_397",_a="_settingsContent_10bzs_408",Ta="_currentValue_10bzs_417",Ca="_menuItem_10bzs_423",ka="_menuNote_10bzs_456",Ea="_loadingOverlay_10bzs_465",Na="_loadingDots_10bzs_476",xa="_dot_10bzs_481",Ia="_bufferingOverlay_10bzs_510",Aa="_bufferingSpinner_10bzs_519",o={fullscreenFlat:Ys,timeDisplay:js,bottomControls:Gs,leftControls:Qs,rightControls:Xs,controlBtn:Js,controlsOverlay:Zs,hidden:ea,topControls:ta,backBtn:na,videoTitleInfo:ra,animeTitle:sa,episodeLabel:aa,speedBoostBadge:oa,progressBarContainer:ia,progressBar:la,thumb:ca,bufferedBar:ua,watchedBar:da,scrubbing:ma,timeBubble:ha,bottomControlsRow:ba,nextEpisodeBtn:fa,active:pa,settingsPanel:ga,settingsHeader:va,settingsBackBtn:ya,settingsTitle:Sa,settingsContent:_a,currentValue:Ta,menuItem:Ca,menuNote:ka,loadingOverlay:Ea,loadingDots:Na,dot:xa,bufferingOverlay:Ia,bufferingSpinner:Aa},wa=({player:a,visible:m,settingsOpen:V,onOpenSettings:M,onCloseSettings:R,hasSubtitles:A,isSubtitleActive:r,subtitles:_,onSubtitleChange:s,showNextEpisodeButton:C,onNextEpisode:F,isTheaterMode:z,onTheaterModeToggle:h,timeLabelRef:j})=>{const{state:d,refs:qe,actions:O}=a,X=qe.videoRef,Be=E=>{const te=X.current;!te||isNaN(d.duration)||d.duration===0||(te.currentTime=E*d.duration)},Pe=()=>{X.current&&(O.setIsScrubbing(!0),O.wasPlayingBeforeScrub.current=!X.current.paused,X.current.pause())},Ue=E=>{const te=X.current;te&&d.duration&&(te.currentTime=E*d.duration)},We=()=>{O.setIsScrubbing(!1),O.wasPlayingBeforeScrub.current&&X.current?.play().catch(()=>{})},Qe=E=>{const te=X.current;te&&(te.volume=E,te.muted=E===0)},ie=()=>{if(r){s(-1);return}let E=null;try{E=localStorage.getItem("tvLastSubtitle")}catch{}s($n(_,{lastKey:E,enabled:!0}))},G=d.isMuted?t(H,{name:"volume-mute"}):d.volume<.5?t(H,{name:"volume-down"}):t(H,{name:"volume-up"});return t("div",{className:`${o.controlsOverlay} ${m?"":o.hidden}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:o.bottomControls,onClick:E=>E.stopPropagation(),children:[t(ns,{classes:{container:o.progressBarContainer,scrubbing:o.scrubbing,timeBubble:o.timeBubble,bar:o.progressBar,buffered:o.bufferedBar,watched:o.watchedBar,thumb:o.thumb},videoRef:X,duration:d.duration,formatTime:nn,isScrubbing:d.isScrubbing,buffered:"full",onSeek:Be,onScrubStart:Pe,onScrubMove:Ue,onScrubEnd:We,timeLabelRef:j}),t("div",{className:o.bottomControlsRow,children:[t("div",{className:o.leftControls,children:[t("button",{className:o.controlBtn,onClick:O.togglePlay,"aria-label":d.isPlaying?"Pause":"Play",children:d.isPlaying?t(H,{name:"pause"}):t(H,{name:"play"})}),t(rs,{muted:d.isMuted,volume:d.volume,volumeIcon:G,buttonClassName:o.controlBtn,onToggleMute:O.toggleMute,onVolumeChange:Qe,onExpandedChange:E=>O.setShowVolumeSlider(E)}),t("span",{className:o.timeDisplay,ref:j,children:[nn(0)," / ",nn(d.duration)]})]}),t("div",{className:o.rightControls,children:[C&&t("button",{className:o.nextEpisodeBtn,onClick:F,title:"Play next episode",children:"Next EP"}),A&&t("button",{className:`${o.controlBtn} ${r?o.active:""}`,onClick:ie,"aria-label":r?"Turn subtitles off":"Turn subtitles on",children:t(H,{name:"closed-captioning"})}),t("button",{className:`${o.controlBtn} ${V?o.active:""}`,onClick:()=>V?R():M(),"aria-label":"Settings",children:t(H,{name:"cog"})}),t("button",{className:`${o.controlBtn} ${z?o.active:""}`,onClick:E=>{E.stopPropagation(),h()},title:z?"Exit Theater Mode":"Theater Mode","aria-label":z?"Exit Theater Mode":"Theater Mode",children:t(H,{name:"tv"})}),t("button",{className:o.controlBtn,onClick:O.toggleFullscreen,"aria-label":d.isFullscreen?"Exit Fullscreen":"Fullscreen",children:d.isFullscreen?t(H,{name:"compress"}):t(H,{name:"expand"})})]})]})]})})},tn=-6e4,zn=6e4,mr=500,Ma=({classes:a,delayMs:m,onDelayChange:V})=>{const[M,R]=S(null),A=M??m,r=P(V);r.current=V;const _=P(m);_.current=m;const s=P(null);s.current=M,v(()=>{R(null)},[m]),v(()=>()=>{const z=s.current;z!==null&&z!==_.current&&r.current(z)},[]);const C=z=>{_.current=z,s.current=null,r.current(z),R(null)},F=z=>{const h=s.current??_.current,j=Math.max(tn,Math.min(zn,h+z));C(j)};return t(Le,{children:[t("div",{style:{display:"flex",gap:6,padding:"0.5rem 0.75rem 0.25rem"},children:[t("button",{type:"button",className:a.item,onClick:()=>F(-mr),"aria-label":"Show subtitles 0.5 seconds earlier",style:{flex:1,justifyContent:"center"},children:t("span",{children:"-0.5s"})}),t("button",{type:"button",className:a.item,onClick:()=>F(mr),"aria-label":"Show subtitles 0.5 seconds later",style:{flex:1,justifyContent:"center"},children:t("span",{children:"+0.5s"})}),t("button",{type:"button",className:a.item,onClick:()=>C(0),disabled:A===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(ss,{label:"Subtitle timing",display:br(A),min:tn,max:zn,step:100,value:A,percent:(A-tn)/(zn-tn)*100,onChange:z=>{const h=Math.round(z);s.current=h,R(h)},onCommit:()=>{const z=s.current;z!==null&&C(z)}}),t("div",{className:a.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},La=({view:a,onSelectView:m,onClose:V,player:M,onSubtitleStyleChange:R,streams:A,resolutionIdx:r,onResolutionChange:_,hasSubtitles:s,subtitles:C,selectedSubtitle:F,isSubtitleActive:z,onSubtitleChange:h,audioTracks:j,selectedAudioTrack:d,onAudioTrackChange:qe,videoDelayEnabled:O,onVideoDelayToggle:X,videoDelayMs:Be,onVideoDelayChange:Pe,onCalibrate:Ue,subtitleDelayMs:We,onSubtitleDelayChange:Qe,ambientSettings:ie,onAmbientChange:G})=>{const{state:E}=M,te=()=>t(Le,{children:[A.length>1&&t("button",{className:o.menuItem,onClick:()=>m("resolution"),children:[t("span",{children:"Resolution"}),t("span",{className:o.currentValue,children:A[r]?.quality||"Auto"})]}),s&&t("button",{className:o.menuItem,onClick:()=>m("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:o.currentValue,children:z?C[F]?.label||C[F]?.language:"Off"})]}),s&&t("button",{className:o.menuItem,onClick:()=>m("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:o.currentValue,children:[E.subtitleFontSize.toFixed(1),"x · ",E.subtitlePosition]})]}),s&&t("button",{className:o.menuItem,onClick:()=>m("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:o.currentValue,children:br(We)})]}),j.length>0&&t("button",{className:o.menuItem,onClick:()=>m("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:o.currentValue,children:j[d]?.label||j[d]?.language})]}),t("button",{className:o.menuItem,onClick:()=>m("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:o.currentValue,children:O?`${Be}ms`:"Off"})]}),ie&&G&&t("button",{className:o.menuItem,onClick:()=>m("ambient"),children:[t("span",{children:"Ambient Light"}),t("span",{className:o.currentValue,children:ie.enabled?"On":"Off"})]})]}),Ce=()=>t(Pn,{classes:{item:o.menuItem,active:o.active},options:A.map((x,Y)=>({key:String(Y),label:x.quality,selected:Y===r})),onSelect:x=>_(Number(x))}),Q=()=>t(Pn,{classes:{item:o.menuItem,active:o.active},options:[{key:"off",label:"Off",selected:!z},...C.map((x,Y)=>({key:String(Y),label:x.label||x.language,selected:Y===F}))],onSelect:x=>h(x==="off"?-1:Number(x))}),ke=()=>t(xs,{classes:{item:o.menuItem,active:o.active},values:{fontSize:E.subtitleFontSize,position:E.subtitlePosition,bgOpacity:E.subtitleBgOpacity,bgColor:E.subtitleBgColor,textColor:E.subtitleTextColor,edge:E.subtitleEdge,bold:E.subtitleBold},onChange:R}),K=()=>t(Ma,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},delayMs:We,onDelayChange:x=>Qe?.(x)}),Re=()=>t(Pn,{classes:{item:o.menuItem,active:o.active},options:j.map((x,Y)=>({key:String(Y),label:x.label||x.language,selected:Y===d})),onSelect:x=>qe(Number(x))}),He=()=>t(Is,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},enabled:O,delayMs:Be,onToggle:x=>X?.(x),onDelayChange:x=>Pe?.(x),onCalibrate:Ue}),ge=()=>ie&&G?t(As,{classes:{item:o.menuItem,active:o.active,note:o.menuNote},values:ie,onChange:G}):null;return t("div",{"data-speed-boost-ignore":"true",onClick:x=>x.stopPropagation(),children:t(Ns,{classes:{panel:o.settingsPanel,header:o.settingsHeader,backBtn:o.settingsBackBtn,title:o.settingsTitle,content:o.settingsContent},title:a==="main"?"Settings":a==="subtitle-style"?"Subtitle Style":a==="subtitle-timing"?"Subtitle Timing":a==="audio"?"Audio Track":a==="resolution"?"Resolution":a==="av-sync"?"A/V Sync":a==="ambient"?"Ambient Light":a.charAt(0).toUpperCase()+a.slice(1),onBack:()=>a==="main"?V():m("main"),children:[a==="main"&&te(),a==="resolution"&&Ce(),a==="subtitles"&&Q(),a==="subtitle-style"&&ke(),a==="subtitle-timing"&&K(),a==="audio"&&Re(),a==="av-sync"&&He(),a==="ambient"&&ge()]})})},Ba=({player:a,title:m,episodeLabel:V,audioTracks:M,selectedAudioTrack:R,onAudioTrackChange:A,subtitles:r,selectedSubtitle:_,onSubtitleChange:s,streams:C,resolutionIdx:F,onResolutionChange:z,onBack:h,children:j,videoDelayEnabled:d=!1,onVideoDelayToggle:qe,videoDelayMs:O=0,onVideoDelayChange:X,onCalibrateAvSync:Be,subtitleDelayMs:Pe=0,onSubtitleDelayChange:Ue,showNextEpisodeButton:We=!1,onNextEpisode:Qe,isLoading:ie=!1,isTheaterMode:G,onTheaterModeToggle:E,ambientSettings:te,onAmbientChange:Ce})=>{const{state:Q,refs:ke,actions:K}=a,Re=ke.videoRef,{subtitleFontSize:He,subtitlePosition:ge,subtitleBgOpacity:x,subtitleBgColor:Y,subtitleTextColor:it,subtitleEdge:le,subtitleBold:ze}=Q,[Ee,$e]=S(null),lt=P(null),[Lt,yt]=S(0);v(()=>{const Oe=Re.current;if(!Oe)return;const ve=()=>yt(Oe.clientHeight||0);ve();const Z=new ResizeObserver(ve);return Z.observe(Oe),()=>Z.disconnect()},[Re]);const Xe=K.setSubtitleStyle;v(()=>{const Oe="tv-player-subtitle-style";let ve=document.getElementById(Oe);ve||(ve=document.createElement("style"),ve.id=Oe,document.head.appendChild(ve));const Z={fontSize:He,position:ge,bgOpacity:x,bgColor:Y,textColor:it,edge:le,bold:ze},se=Re.current,Je=Dn(He,Lt||se?.clientHeight||720);if(ve.textContent=as({...Z,fontSize:Je}),se){const Ct=()=>{const B=Number(ge);return isNaN(B)?0:Math.max(0,Math.min(100,B))},ut=(B,ee)=>{try{const ne=B;ne.snapToLines=!1,ne.line=ee}catch{}},Rt=()=>{const B=Je*16,ee=se.videoHeight||se.clientHeight||720,ne=se.videoWidth||se.clientWidth||1280;return{step:B*1.3/ee*100,chars:Math.max(20,Math.floor(ne/(B*.55)))}},dt=B=>{const ee=Math.max(0,Math.min(100,100-Ct())),ne=Array.from(B.activeCues??[]);if(ne.length<=1){ne.forEach(ae=>ut(ae,ee));return}const{step:zt,chars:$t}=Rt();let Dt=ee;for(let ae=ne.length-1;ae>=0;ae--){const an=String(ne[ae].text??"").replace(/<[^>]*>/g,"").split(`
|
|
2
|
-
`).reduce((on,ln)=>on+Math.max(1,Math.ceil(ln.length/$t)),0),Ot=Dt-an*zt;ut(ne[ae],Math.max(0,Ot)),Dt=Ot-zt*.4}},p=()=>{const B=Math.max(0,Math.min(100,100-Ct()));Array.from(se.textTracks).forEach(ee=>{ee.cues&&(Array.from(ee.cues).forEach(ne=>ut(ne,B)),ee.mode==="showing"&&dt(ee))})};p();const l=B=>{const ee=B.target;ee.mode==="showing"&&dt(ee)},ce=()=>{Array.from(se.textTracks).forEach(B=>{B.removeEventListener("cuechange",l),B.addEventListener("cuechange",l)}),p()};Array.from(se.textTracks).forEach(B=>{B.addEventListener("cuechange",l)}),se.textTracks.addEventListener("addtrack",ce);const ue=Array.from(se.querySelectorAll("track")),kt=()=>p();return ue.forEach(B=>B.addEventListener("load",kt)),()=>{Array.from(se.textTracks).forEach(B=>{B.removeEventListener("cuechange",l)}),se.textTracks.removeEventListener("addtrack",ce),ue.forEach(B=>B.removeEventListener("load",kt))}}},[He,ge,x,Y,it,le,ze,_,r,Re,Lt]);const me=r.length>0,St=_>=0,_t=()=>{$e("main"),K.setShowControls(!0)},L=()=>{$e(null)},ct=Q.showControls||!!Ee,Bt=t(ls,{visible:ct,title:m,episode:V,onBack:h,classes:{overlay:o.controlsOverlay,hidden:o.hidden,top:o.topControls,backBtn:o.backBtn,titleInfo:o.videoTitleInfo,title:o.animeTitle,episode:o.episodeLabel}}),De=!ie&&!Q.isBuffering&&Q.duration>0?t(os,{isPlaying:Q.isPlaying,onTogglePlay:K.togglePlay,onSkipBack:()=>K.seek(-10),onSkipForward:()=>K.seek(10)}):null,Pt=t(wa,{player:a,visible:ct,settingsOpen:!!Ee,onOpenSettings:_t,onCloseSettings:L,hasSubtitles:me,isSubtitleActive:St,subtitles:r,onSubtitleChange:s,showNextEpisodeButton:We,onNextEpisode:Qe,isTheaterMode:G,onTheaterModeToggle:E,timeLabelRef:lt}),rn=Ee?t(La,{view:Ee,onSelectView:$e,onClose:L,player:a,onSubtitleStyleChange:Xe,streams:C,resolutionIdx:F,onResolutionChange:z,hasSubtitles:me,subtitles:r,selectedSubtitle:_,isSubtitleActive:St,onSubtitleChange:s,audioTracks:M,selectedAudioTrack:R,onAudioTrackChange:A,videoDelayEnabled:d,onVideoDelayToggle:qe,videoDelayMs:O,onVideoDelayChange:X,onCalibrate:()=>{$e(null),Be?.()},subtitleDelayMs:Pe,onSubtitleDelayChange:Ue,ambientSettings:te,onAmbientChange:Ce}):null,Tt=t(Le,{children:[ie&&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})]})}),Q.isBuffering&&!ie&&t("div",{className:o.bufferingOverlay,"aria-hidden":"true",children:t("div",{className:o.bufferingSpinner})}),Q.isSpeedBoostActive&&t("div",{className:o.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(H,{name:"forward",size:12})]})]});return t(is,{player:a,topBar:Bt,centerControls:De,bottomBar:!ie&&Q.duration>0?Pt:null,settingsPanel:rn,overlays:Tt,isInteracting:!!Ee,onStageClick:L,className:Q.isFullscreen?o.fullscreenFlat:"",children:j})},Pa=({servers:a,selectedServer:m,onServerSelect:V})=>a.length===0?null:t("div",{className:en.sourceSelectionContainer,children:[t("h4",{children:"Source"}),t("div",{className:en.sourceButtons,children:a.map(M=>t("button",{className:`${en.sourceButton} ${m===M?en.active:""}`,onClick:()=>V(M),children:M},M))})]}),Ra=jr.memo(Pa);function za({details:a,isMovie:m,season:V,episode:M,videoRef:R,active:A}){const r=P("");r.current||(r.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const _=T(()=>{if(!a)return;const s=R.current,C=m?"":`S${String(V).padStart(2,"0")}E${String(M).padStart(2,"0")}`;vt.discord.tvPresence.mutate({title:a.title,episodeLabel:C,isPlaying:s?!s.paused&&!s.ended:!0,thumbnail:a.poster,currentTime:s?s.currentTime:0,duration:s&&s.duration||0,isAdult:a.adult===!0,sessionId:r.current}).catch(()=>{}),vt.discord.heartbeat.mutate({sessionId:r.current}).catch(()=>{})},[a,m,V,M,R]);return v(()=>{if(!a)return;_();const s=window.setInterval(()=>{const C=R.current;(!C||!C.paused)&&_()},15e3);return()=>window.clearInterval(s)},[_,a,R]),v(()=>{if(!a||!A)return;const s=R.current;if(!s)return;const C=()=>_();return s.addEventListener("play",C),s.addEventListener("pause",C),s.addEventListener("seeked",C),()=>{s.removeEventListener("play",C),s.removeEventListener("pause",C),s.removeEventListener("seeked",C)}},[a,A,_,R]),v(()=>{const s=r.current,C=()=>Zr(s),F=()=>C();return window.addEventListener("pagehide",F),window.addEventListener("beforeunload",F),()=>{window.removeEventListener("pagehide",F),window.removeEventListener("beforeunload",F),C()}},[]),{sendPresence:_}}function $a(a,m,V){const M=()=>{const A=Array.isArray(a.audioTracks)?a.audioTracks.length:0,r=V.getWant(),_=A>0?Math.min(Math.max(0,r),A-1):r;a.audioTrack=_,_!==r&&V.onResolve(_)},R=(A,r)=>{const _=V.getWant(),s=Array.isArray(a.audioTracks)?a.audioTracks.length:0;if(r.id!==_&&_>=0&&_<s){a.audioTrack!==_&&(a.audioTrack=_);return}V.onResolve(r.id)};return a.on(m.MANIFEST_PARSED,M),a.on(m.AUDIO_TRACK_SWITCHED,R),()=>{a.off(m.MANIFEST_PARSED,M),a.off(m.AUDIO_TRACK_SWITCHED,R)}}const Da=/\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 Oa(){try{if(Da.test(navigator.userAgent||""))return!0;const a=navigator.deviceMemory;if(typeof a=="number"&&a>0&&a<2)return!0}catch{}return!1}const Va="_statusMsg_zqb8u_1",Fa="_error_zqb8u_7",qa="_spinner_zqb8u_11",Ua="_spin_zqb8u_11",Wa="_sourceLoader_zqb8u_16",Ha="_ringSpinner_zqb8u_22",Ka="_meta_zqb8u_40",Ya="_year_zqb8u_48",ja="_rating_zqb8u_53",Ga="_typeBadge_zqb8u_62",Qa="_tv_zqb8u_70",Xa="_movie_zqb8u_75",Ja="_controlLabel_zqb8u_80",Za="_select_zqb8u_90",eo="_playerSection_zqb8u_102",to="_video_zqb8u_106",no="_videoHidden_zqb8u_128",ro="_delayCanvas_zqb8u_133",so="_delayCanvasActive_zqb8u_146",ao="_subtitleOverlay_zqb8u_150",oo="_videoIframe_zqb8u_169",io="_retryButton_zqb8u_177",lo="_sidebarSeason_zqb8u_192",co="_mobileSeasonRow_zqb8u_208",uo="_providerSelectWrap_zqb8u_222",mo="_genreRow_zqb8u_230",ho="_genreChip_zqb8u_237",bo="_metaRow_zqb8u_247",fo="_detailGrid_zqb8u_256",po="_detailItem_zqb8u_264",go="_imdbLink_zqb8u_286",g={statusMsg:Va,error:Fa,spinner:qa,spin:Ua,sourceLoader:Wa,ringSpinner:Ha,meta:Ka,year:Ya,rating:ja,typeBadge:Ga,tv:Qa,movie:Xa,controlLabel:Ja,select:Za,playerSection:eo,video:to,videoHidden:no,delayCanvas:ro,delayCanvasActive:so,subtitleOverlay:ao,videoIframe:oo,retryButton:io,sidebarSeason:lo,mobileSeasonRow:co,providerSelectWrap:uo,genreRow:mo,genreChip:ho,metaRow:bo,detailGrid:fo,detailItem:po,imdbLink:go},vo=[],yo=[];function hr({error:a,onRetry:m}){return t("div",{className:`${g.statusMsg} ${g.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:a}),t("button",{className:g.retryButton,onClick:m,children:"Retry"})]})})}const Ro=()=>{const{id:a}=Gr(),[m]=Qr(),V=P(m);V.current=m;const M=Xr(),R=Jr(),A=m.get("type"),[r,_]=S(null),[s,C]=S(()=>parseInt(m.get("s")||"1",10)||1),[F,z]=S([]),[h,j]=S(()=>parseInt(m.get("e")||"1",10)||1),[d,qe]=S(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[O,X]=S([]),[Be,Pe]=S(""),{options:Ue,isFallback:We,isLoading:Qe}=Ms(),ie=Te(()=>Ue.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.id,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[Ue]),G=We||ie.length===0?vo:ie,E=G.filter(e=>e.tier==="direct"),te=G.filter(e=>e.tier==="embed"),[Ce,Q]=S(!1),[ke,K]=S(""),[Re,He]=S([]),[ge,x]=S(0),[Y,it]=S([]),[le,ze]=S(-1),[Ee,$e]=S(0),[lt,Lt]=S(""),[yt,Xe]=S(""),[me,St]=S(()=>{try{return localStorage.getItem("tvServer")||""}catch{return""}}),_t=Te(()=>G.find(e=>e.id===d),[G,d]),L=_t?.tier==="embed",[ct,Bt]=S([]),[De,Pt]=S(""),[rn,Tt]=S(""),[Oe,ve]=S(!1),Z=Te(()=>ct.length>0?ct:_t?.servers??[],[ct,_t]),se=Te(()=>De?["Embed",...Z]:Z,[Z,De]),Je=Oe&&!!De,Ct=Je?rn||De:"";v(()=>{if(!De){Tt("");return}let e=!1;return Ln(`/api/resolve?url=${encodeURIComponent(De)}`).then(n=>{!e&&n.finalUrl&&Tt(n.finalUrl)}).catch(()=>{}),()=>{e=!0}},[De]);const ut=P([]);v(()=>{ut.current=O},[O]);const Rt=P(ge);v(()=>{Rt.current=ge},[ge]);const dt=P(le);v(()=>{dt.current=le},[le]);const p=cs({skipIntervals:yo}),l=p.refs.videoRef,ce=P(null),ue=P([]),kt=P(null),B=P(null),{videoDelayMs:ee,videoDelayEnabled:ne,setDelayEnabled:zt,handleVideoDelayChange:$t,isCalibrating:Dt,testClipActive:ae,stopCalibration:sn,openAvSyncCalibrator:an,cancelAvSyncCalibrator:Ot,applyAvSyncCalibrator:on,toggleTestClip:ln,calibReturnRef:Vt,effectiveVideoDelayMs:cn}=us(l),[mt,fr]=S(()=>{try{const e=Number(localStorage.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),un=P(mt);un.current=mt;const pr=T(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(un.current!==n){un.current=n,fr(n);try{localStorage.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]);ds({videoRef:l,canvasRef:kt,delayMs:cn,enabled:ne});const dn=ne,ye=dn||mt!==0,{settings:mn,update:gr}=ms(),hn=P(ye);hn.current=ye;const bn=T(()=>{if(!hn.current)return;const e=l.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[l]),{hasConsent:Et,grant:vr}=es(),b=A==="movie";za({details:r,isMovie:b,season:s,episode:h,videoRef:l,active:!L&&!Ce&&!ke&&O.length>0});const Ft=a?Ls(A||"tv",a):"",q=Ft,On=Bs(),qt=Ps(),{toggle:Vn,bookmarkedIds:yr,pending:Sr}=Rs(),{data:Fn}=zs(r?Ft:void 0),Ut=Fn?!!Fn.inLibrary:Ft?yr.has(Ft):!1,_r=T(()=>{!r||!a||Vn({tmdbId:Number(a),mediaType:A||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,a,A,Vn]),{data:Ze,isFetched:qn,isPending:Un}=$s(q||void 0,s,h),Wt=Te(()=>F.map(e=>e.episode_number).sort((e,n)=>e-n),[F]),et=Wt.indexOf(h),fn=et>0?Wt[et-1]:null,w=et>=0&&et<Wt.length-1?Wt[et+1]:null,Ht=Te(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),Se=Te(()=>{if(b||w!=null)return null;const e=Ht.indexOf(s);return e>=0&&e<Ht.length-1?Ht[e+1]:(r?.number_of_seasons??0)>s?s+1:null},[b,w,Ht,s,r?.number_of_seasons]),Wn=Ze?.currentTime??0,Hn=Ze?.duration??0,pn=Ze?.completed===!0||Ze?.completed===1||Rn(Wn,Hn),[Ne,Ve]=S(!1),xe=P(!1),gn=P(null),Nt=P(null);v(()=>{xe.current=!1,Nt.current=null,Ve(!1)},[q,s,h]);const[Ie,Kt]=S(!1),[ht,Kn]=S(0),[tt,Yn]=S(!1),[Ke,nt]=S(!1),[Tr,vn]=S(!1),[Cr,jn]=S(""),[Yt,kr]=S(!1),[Er,yn]=S(!1),{isTheaterMode:Fe,toggleTheaterMode:Sn,handleLayoutClick:Nr}=hs();v(()=>{const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="t"&&Sn()};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[Sn]),bs(p,(O.length>0||yt!=="")&&!Fe&&!Ie&&!Ne&&!Ke);const xr=Hs(),[bt,Ir]=S(Os),Ar=T(e=>{Ir(e),Vs(e)},[]),he=P(!1),rt=P(null),_n=P(0),Gn=P(!1),Qn=P(0),J=P(null),xt=P(""),wr=dr(Wn,Hn),It=!he.current&&!xe.current&&(Ie||Ne||Ke||pn||wr),ft=P(It);ft.current=It;const pt=P(!1);v(()=>{pt.current=tt},[tt]);const Ye=T((e,n)=>{if(!q||!n||n<30)return;const i=Rn(e,n),u=i?n:e;Math.abs(u-_n.current)<10&&!i||(_n.current=u,On.mutate({mediaId:q,season:s,episode:h,currentTime:Math.floor(u),duration:Math.floor(n),completed:i,title:r?.title??null,poster:r?.poster??null,backdrop:r?.backdrop??null,year:r?.year??null,overview:r?.overview??null,tmdbId:r?.id??null,mediaType:A||"tv",adult:r?.adult?1:0}))},[q,s,h,On,r,A]),Ae=T((e,n)=>{sn();const i=new URLSearchParams(m);i.set("type",m.get("type")||"tv"),i.set("s",String(e)),i.set("e",String(n)),M(`${window.location.pathname}?${i.toString()}`)},[m,M,sn]),At=T(()=>{const e=l.current;if(!e||b||w==null){vn(!1);return}const n=e.duration||0,i=e.currentTime||0;vn(n>0&&i/n>=.8)},[b,w,l]),jt=T((e,n)=>["tv-sources",d,b?"movie":"tv",a,e,n,me],[d,b,a,me]),Gt=T(async(e,n)=>{if(!r||!a||!d)return{valid:!1,sources:[]};const i=b?"movie":"tv",u=await vt.tv.sources.query({provider:d,type:i,tmdbId:String(a),season:e,episode:n,title:r.title||"",year:r.year||"",totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||"",...Z.length>0&&me?{server:me}:{}});return{valid:"valid"in u?u.valid:!1,error:"error"in u?u.error:void 0,sources:u.sources,referer:"referer"in u?u.referer:void 0,audioTracks:u.audioTracks,subtitles:"subtitles"in u?u.subtitles:void 0,servers:"servers"in u?u.servers:void 0,embedUrl:"embedUrl"in u?u.embedUrl:void 0}},[r,a,d,b,Z,me]),Xn=T(()=>{if(b||!r||!a||!d||L||w==null)return;const e=jt(s,w);R.getQueryState(e)?.status!=="success"&&R.prefetchQuery({queryKey:e,queryFn:()=>Gt(s,w),staleTime:300*1e3,gcTime:1800*1e3})},[b,r,a,d,L,w,s,R,jt,Gt]),Mr=T(()=>{if(ae)return;At();const e=l.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&Xn(),rt.current&&clearTimeout(rt.current),rt.current=setTimeout(()=>{Ye(e.currentTime,e.duration||0)},5e3))},[Ye,l,ae,At,Xn]),Lr=T(()=>{const e=l.current;if(!e||!r)return;rt.current&&clearTimeout(rt.current),Ye(e.currentTime,e.duration||0),Gn.current=!0;const n=Fs({seekInduced:Date.now()-Qn.current<qs,autoplayEnabled:bt,hasNext:!b&&w!=null,isFinal:b||w==null});n==="advance"&&w!=null?(j(w),Ae(s,w)):n==="prompt-next"?(xe.current=!1,he.current=!0,Ve(!0)):n==="prompt-complete"&&(jn(b?r.title:`${r.title} - Season ${s}`),nt(!0),xe.current=!0,he.current=!0)},[b,r,s,w,bt,Ye,Ae,l]),Br=T(()=>{Gn.current=!1,p.actions.onPlay()},[p.actions]),Pr=T(()=>{p.actions.onPause();const e=l.current;e&&!e.ended&&Ye(e.currentTime,e.duration||0)},[p.actions,Ye,l]),Rr=T(()=>{p.actions.onLoadedMetadata();const e=l.current;if(e){try{const n=parseFloat(localStorage.getItem("playerVolume")||"");isNaN(n)||(e.volume=Math.max(0,Math.min(1,n))),e.muted=localStorage.getItem("playerMuted")==="true"}catch{}if(J.current!=null&&J.current>0){try{e.currentTime=J.current}catch{}J.current=null}At()}},[p.actions,l,At]),Tn=T(()=>{const e=l.current;if(e&&J.current!=null&&J.current>0){try{e.currentTime=J.current}catch{}J.current=null}},[l]),zr=T(()=>{ht>0&&(J.current=ht);const e=l.current;if(e&&ht>0){try{e.currentTime=ht,J.current=null}catch{}e.play().catch(()=>{})}Kt(!1),he.current=!0},[ht,l]),Jn=T(()=>{J.current=null;const e=l.current;e&&(e.currentTime=0,e.play().catch(()=>{})),Kt(!1),he.current=!0},[l]),$r=T(()=>{xe.current=!0,Ve(!1),he.current=!0},[]),Dr=T(()=>{xe.current=!0,Ve(!1),he.current=!0,J.current=null;const e=l.current;if(e){try{e.currentTime=0}catch{}e.play().catch(()=>{})}},[l]),Zn=T(()=>{w!=null&&(xe.current=!0,Ve(!1),he.current=!0,j(w),Ae(s,w))},[w,s,Ae]),er=T(()=>{Se!=null&&(xe.current=!0,Ve(!1),nt(!1),he.current=!0,C(Se),j(1),Ae(Se,1))},[Se,Ae]),Or=T(async()=>{if(q)try{await qt.mutateAsync({id:q,status:"Completed"}),nt(!1),Ve(!1),M("/")}catch{}},[q,qt,M]);v(()=>{he.current=!1,gn.current=null,Kt(!1),vn(!1),Kn(0),Yn(!1),pt.current=!1,J.current=null,xt.current=`${q}:${s}:${h}`,_n.current=0},[q,s,h]),v(()=>{qn&&(Yn(!0),pt.current=!0)},[qn,q,s,h]),v(()=>{if(!Ze||he.current)return;const e=`${q}:${s}:${h}`;if(gn.current===e)return;gn.current=e;const n=Ze,i=n.currentTime??0,u=n.duration??0;dr(i,u)&&(Kn(i),Kt(!0))},[Ze,q,s,h]),v(()=>{if(!tt||he.current||xe.current||Ie||Ke||Ne)return;const e=`${q}:${s}:${h}`;if(Nt.current!==e){if(!pn){Un||(Nt.current=e);return}if(b){Nt.current=e,Ve(!0);return}if(!(!r||et<0||F.length===0)){if(Nt.current=e,w==null&&Se==null){r&&F.length>0&&(jn(`${r.title} - Season ${s}`),nt(!0),xe.current=!0,he.current=!0);return}Ve(!0)}}},[tt,pn,Un,Ie,Ke,Ne,b,w,Se,r,et,F.length,q,s,h]),v(()=>{(Ie||Ne)&&l.current&&l.current.pause()},[Ie,Ne,l]),v(()=>{const e=l.current;return()=>{rt.current&&clearTimeout(rt.current),e&&!e.ended&&Ye(e.currentTime,e.duration||0)}},[Ye,l]);const Cn=T(e=>{let n=null,i=!0;try{n=localStorage.getItem("tvLastSubtitle"),i=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return $n(e,{lastKey:n,enabled:i})},[]),kn=T(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),tr=T(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const i=e.findIndex(f=>Bn(f)===n);if(i>=0)return i;const u=n.indexOf("|||"),c=u>=0?n.slice(0,u):n,I=u>=0?n.slice(u+3):n,$=e.findIndex(f=>f.language===c||f.label===I);if($>=0)return $}return $n(e,{lastKey:null,enabled:!0})},[]),{data:nr}=Ds(q||void 0),rr=Te(()=>(nr?.progress??[]).filter(n=>n.season===s&&(n.completed===1||n.completed===1||Rn(n.currentTime,n.duration))).map(n=>String(n.episode)),[nr,s]),sr=Te(()=>F.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})),[F]),ar=Te(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),En=Te(()=>[r?.year,r?.status,r?.number_of_seasons?`${r.number_of_seasons} Season${r.number_of_seasons>1?"s":""}`:null,r?.number_of_episodes?`${r.number_of_episodes} Episodes`:null].filter(Boolean),[r]);v(()=>{if(G.length!==0&&!G.some(e=>e.id===d)){const e=G.find(n=>n.tier==="direct")?.id??G[0].id;qe(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[G,d]),v(()=>{Bt([]),Pt(""),Tt(""),ve(!1)},[d]),v(()=>{if(Z.length!==0&&!Z.includes(me)){St(Z[0]);try{localStorage.setItem("tvServer",Z[0])}catch{}}},[Z,me]),v(()=>{if(!a){_(null),X([]),Pe(""),K(""),Xe("");return}const e=Number(a),n=A||"tv";_(null),X([]),Pe(""),K(""),Xe("");const i=parseInt(V.current.get("s")||"",10),u=parseInt(V.current.get("e")||"",10);C(isNaN(i)?1:i),j(isNaN(u)?1:u),$e(0),vt.tv.details.query({type:n,id:String(e)}).then(c=>{const I={id:c.id,title:c.title||"",overview:c.overview||"",vote_average:c.vote_average,year:c.year,poster:c.poster,backdrop:c.backdrop,imdb_id:c.imdb_id||void 0,adult:c.adult,seasons:c.seasons,number_of_seasons:c.number_of_seasons};_(I),I.seasons&&I.seasons.length>0&&isNaN(i)&&C(I.seasons[0].season_number)}).catch(()=>{})},[a,A]),v(()=>{if(!r||!a)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){z([]);return}const n=parseInt(m.get("e")||"",10);vt.tv.episodes.query({id:String(a),season:String(s)}).then(i=>{const u=(i.episodes||[]).map(c=>({episode_number:c.episode_number,name:c.name||"",vote_average:c.vote_average,overview:c.overview||"",still_path:c.still_path||""}));z(u),u.length!==0&&j(c=>!isNaN(n)&&u.some(I=>I.episode_number===n)?n:u.some(I=>I.episode_number===c)?c:u[0].episode_number)}).catch(()=>{})},[r,a,s,m]),v(()=>{if(!L||!r||!a)return;Ln(`/api/tv/embed/${d}/${b?"movie":"tv"}/${a}?season=${s}&episode=${h}`).then(n=>{if(n.url)return Xe(n.url),Ln(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(i=>{i.finalUrl&&Xe(i.finalUrl)})}).catch(()=>{})},[d,r,a,s,h,b,L]);const Qt=T(async()=>{if(!r||!a||!d||L||r.adult&&!Et)return;const e=`${q}:${s}:${h}`;Q(!0),K(""),ut.current.length===0&&(X([]),$e(0),He([]),it([]));try{const n=await R.fetchQuery({queryKey:jt(s,h),queryFn:()=>Gt(s,h),staleTime:3e5,gcTime:18e5});if(xt.current!==e){Q(!1);return}if(Q(!1),!n.valid||!n.sources?.length){K(n.error?`${n.error}`:Z.length>0?`No streams from ${me}. Try another server.`:"No streams available.");return}X(n.sources),Pe(e),n.servers?.length&&Bt(n.servers),n.embedUrl&&Pt(n.embedUrl),$e(0),n.referer&&Lt(n.referer);const i=n.audioTracks||[];He(i),x(i.length>0?tr(i):0);const u=n.subtitles||[];if(it(u),u.length>0){const $=Cn(u);ze($),kn($)}else ze(-1);const c=b?"movie":"tv",I=a;vt.tv.subtitles.query({type:c,tmdbId:String(I),season:String(s),episode:String(h)}).then($=>{if(xt.current!==e)return;const f=Array.isArray($.subtitles)?$.subtitles:[];f.length!==0&&it(re=>{const be=[...re,...f.filter(y=>!re.some(fe=>fe.url===y.url))];if(re.length===0){const y=Cn(be);ze(y),kn(y)}return be})}).catch(()=>{}),K("")}catch(n){if(xt.current!==e)return;Q(!1),K(n instanceof Error?n.message:"Failed to load streams.")}},[r,a,d,s,h,b,L,Et,Z,me,Cn,kn,tr,q,R,jt,Gt]),Nn=T(()=>{const e=l.current;e&&!isNaN(e.currentTime)&&(J.current=e.currentTime)},[l]),Vr=T(e=>{if(e==="Embed"){ve(!0);return}Nn(),ve(!1),St(e);try{localStorage.setItem("tvServer",e)}catch{}K("")},[Nn]),Fr=T(e=>{qe(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);v(()=>{d&&r&&!L&&Qt()},[d,r,Qt,L]),v(()=>{if(!l.current)return;if(ce.current&&(ce.current.destroy(),ce.current=null),L||Je){const f=l.current;f&&(f.pause(),f.removeAttribute("src"),f.load());return}let e=!1;if(ae){const f=l.current;return f&&(f.pause(),f.removeAttribute("src"),f.load(),f.src="/av-sync-test.mp4",ft.current||f.play().catch(()=>{})),()=>{e=!0}}if(Vt.current!=null&&(J.current=Vt.current,Vt.current=null),xt.current===`${q}:${s}:${h}`&&J.current==null&&!ft.current)try{const f=l.current;f&&!f.ended&&f.currentTime>1&&(J.current=f.currentTime)}catch{}const i=J.current??0,u=!Ce&&Be===`${q}:${s}:${h}`?Je?"":O[Ee]?.url||"":"";if(!u){try{l.current?.pause(),l.current?.removeAttribute("src"),l.current?.load()}catch{}return}const c=l.current;c.pause(),c.removeAttribute("src"),c.load(),p.actions.resetMediaState();const I=`/api/tv/stream-proxy?url=${encodeURIComponent(u)}&referer=${encodeURIComponent(lt)}&provider=${encodeURIComponent(d)}`;O[Ee]?.type==="hls"?(async()=>{const f=await Us();if(!e)if(f&&f.isSupported()){const re=Oa()||document.body.classList.contains("low-end"),be=re?60:180,y=new f({enableWorker:!0,lowLatencyMode:!1,startPosition:i>0?i:-1,maxBufferLength:be,maxMaxBufferLength:be+(re?30:60),backBufferLength:re?30:60,maxBufferSize:(re?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}}}});ce.current=y,y.on(f.Events.ERROR,(D,N)=>{N.fatal&&(K(`Stream failed (${N.details}). Try another source or reload.`),Q(!1),y.destroy(),ce.current=null)}),y.loadSource(I),y.attachMedia(c);const fe=()=>{let D=!1,N=0;try{D=localStorage.getItem("tvSubtitlesEnabled")==="true";const k=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(k)&&k>=0&&(N=k)}catch{}return{enabled:D,index:N}},U=()=>{if(typeof y.subtitleTrack!="number")return;if(ue.current.length>0){y.subtitleTrack=-1;return}const D=Array.isArray(y.subtitleTracks)?y.subtitleTracks:[];if(D.length===0){y.subtitleTrack=-1;return}const N=fe();if(N.enabled){const k=N.index<D.length?N.index:0;y.subtitleTrack=k,ze(k),bn()}else y.subtitleTrack=-1};$a(y,f.Events,{getWant:()=>Rt.current,onResolve:D=>x(D)}),y.on(f.Events.MANIFEST_PARSED,()=>{U(),(i>0||!ft.current&&pt.current)&&c.play().catch(()=>p.actions.setShowControls(!0))}),y.on(f.Events.SUBTITLE_TRACKS_UPDATED,()=>{U()}),y.on(f.Events.SUBTITLE_TRACK_SWITCH,(D,N)=>{if(ue.current.length>0){if(N.id!==-1)try{y.subtitleTrack=-1}catch{}return}const k=Array.isArray(y.subtitleTracks)?y.subtitleTracks:[];if(k.length!==0){if(N.id===-1){const _e=fe();if(_e.enabled){const oe=_e.index<k.length?_e.index:0;y.subtitleTrack=oe;return}}ze(N.id),bn()}})}else Ws(c)&&(c.src=I,(i>0||!ft.current&&pt.current)&&c.play().catch(()=>{K("Failed to play stream. Try another source.")}))})():(c.src=I,(i>0||!ft.current&&pt.current)&&c.play().catch(()=>{K("Failed to play stream. Try another source.")}));const $=()=>{const be=c.error?.code===4?"Video source not supported or not found":"Failed to load video stream";K(`${be}. The source may be invalid or expired. Try switching source or reloading.`),Q(!1)};return c.addEventListener("error",$),()=>{e=!0,c.removeEventListener("error",$)}},[O,Be,Ce,Ee,d,lt,L,Je,l,Vt,ae,q,s,h,Tn,bn,p.actions]),v(()=>{if(!tt||Ie||Ne||Ke||It||L||ae)return;const e=l.current;!e||!e.paused||e.ended||e.readyState<1||(Tn(),e.play().catch(()=>{}))},[tt,Ie,Ne,Ke,It,L,ae,Tn,l]),v(()=>{const e=ce.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=ge)},[ge]),v(()=>{const e=ce.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ue.current.length>0||(le>=0?e.subtitleTrack=le:e.subtitleTrack=-1)},[le]),v(()=>{const e=l.current;if(!(!e||L)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ue.current=[],Y.length!==0&&(Y.forEach(n=>{const i=document.createElement("track");i.kind="subtitles",i.label=n.label||n.language||"Unknown",i.srclang=n.language||n.label||"en";const u=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent(lt)}`;i.src=u,i.addEventListener("load",()=>{const c=ue.current.indexOf(i),I=i.track;if(I&&c>=0){const $=c===dt.current;I.mode=$&&!hn.current?"showing":"hidden"}}),e.appendChild(i),ue.current.push(i)}),Y.length>0)))try{const n=ce.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[Y,lt,L,d,l]),v(()=>{const e=l.current;if(!e||L)return;const n=ce.current;ue.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const i=()=>{const I=Dn(p.state.subtitleFontSize,e.clientHeight||720),$=Math.max(0,Math.min(100,100-p.state.subtitlePosition)),f=()=>{const U=I*16,D=e.videoHeight||e.clientHeight||720,N=e.videoWidth||e.clientWidth||1280;return{step:U*1.3/D*100,chars:Math.max(20,Math.floor(N/(U*.55)))}},re=(U,D)=>{const N=U;N.snapToLines=!1,N.line=D},be=U=>{if(!U.cues)return;Array.from(U.cues).forEach(oe=>re(oe,$));const D=Array.from(U.activeCues??[]);if(D.length<=1){D.forEach(oe=>re(oe,$));return}const{step:N,chars:k}=f();let _e=$;for(let oe=D.length-1;oe>=0;oe--){const je=String(D[oe].text??"").replace(/<[^>]*>/g,"").split(`
|
|
3
|
-
`).reduce((Jt,wt)=>Jt+Math.max(1,Math.ceil(wt.length/k)),0);_e=Math.max(0,_e-je*N),re(D[oe],_e),_e-=N*.4}},y=ue.current;if(y.length>0){y.forEach((U,D)=>{const N=U.track;if(!N)return;const k=D===le;N.mode=k&&!ye?"showing":"hidden",k&&!ye&&be(N)});return}const fe=Array.from(e.textTracks);fe.length!==0&&fe.forEach((U,D)=>{const N=D===le;U.mode=N&&!ye?"showing":"hidden",N&&!ye&&be(U)})};i();const u=()=>i();e.textTracks.addEventListener("addtrack",u),e.addEventListener("loadedmetadata",i,{once:!0});const c=window.setTimeout(i,600);return()=>{e.textTracks.removeEventListener("addtrack",u),e.removeEventListener("loadedmetadata",i),window.clearTimeout(c)}},[le,Y,L,d,l,ye,p.state.subtitleFontSize,p.state.subtitlePosition]),v(()=>{if(!ye)return;const e=l.current,n=B.current;if(!e||!n)return;const i=mt/1e3,u=cn/1e3,c=new Set;let I=[],$=-1,f=-1,re=-1,be=-1,y=0,fe=0,U=!1;const D=()=>{const W=dt.current;if(W<0)return null;const Ge=ue.current;return Ge.length>0?Ge[W]?.track??null:Array.from(e.textTracks)[W]??null},N=(W,Ge)=>{const pe=W.cues;if(!pe||pe.length===0)return Array.from(W.activeCues??[]);let st=0,at=pe.length;for(;st<at;){const we=st+at>>>1;pe[we].endTime+i<Ge?st=we+1:at=we}const Mt=[];for(let we=st;we<pe.length;we++){const Zt=pe[we];if(Zt.startTime+i>Ge)break;Zt.endTime+i>=Ge&&Mt.push(Zt)}return Mt},k=()=>{const W=D(),Ge=e.currentTime-u,pe=W?N(W,Ge):[],st=e.clientWidth,at=e.clientHeight,Mt=e.videoWidth,we=e.videoHeight;if(pe.length===I.length&&pe.every((An,wn)=>An===I[wn])&&st===$&&at===f&&Mt===re&&we===be||(I=pe,$=st,f=at,re=Mt,be=we,n.textContent="",pe.length===0))return;const lr={fontSize:Dn(p.state.subtitleFontSize,at),position:p.state.subtitlePosition,bgOpacity:p.state.subtitleBgOpacity,bgColor:p.state.subtitleBgColor,textColor:p.state.subtitleTextColor,edge:p.state.subtitleEdge,bold:p.state.subtitleBold},Hr=fs(lr),Kr=ps(e,lr.position);pe.forEach((An,wn)=>{const cr=String(An.text??"");if(!gs(cr).trim())return;const Mn=document.createElement("div"),Yr=(pe.length-1-wn)*1.7;Mn.style.cssText=`${Hr}
|
|
4
|
-
bottom: calc(${Kr}px + ${Yr}em);`,Mn.innerHTML=vs(cr),n.appendChild(Mn)})},_e=()=>{Array.from(e.textTracks).forEach(W=>{c.has(W)||(c.add(W),W.addEventListener("cuechange",k))})},oe=()=>{_e(),k()},In=()=>{if(U||fe)return;const W=()=>{fe=0,!(U||e.paused||e.ended)&&(k(),In())};fe=window.requestAnimationFrame(W)},je=e,Jt=()=>{y=0,k(),!U&&je.requestVideoFrameCallback&&(y=je.requestVideoFrameCallback(Jt))},wt=()=>{k(),je.requestVideoFrameCallback?y||(y=je.requestVideoFrameCallback(Jt)):In()};_e(),e.textTracks.addEventListener("addtrack",oe),e.textTracks.addEventListener("removetrack",oe),e.addEventListener("timeupdate",k),e.addEventListener("seeked",k),e.addEventListener("loadedmetadata",k),e.addEventListener("play",wt);const or=Array.from(e.querySelectorAll("track"));or.forEach(W=>W.addEventListener("load",k));const ir=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>k());return ir?.observe(e),k(),wt(),()=>{U=!0,c.forEach(W=>W.removeEventListener("cuechange",k)),e.textTracks.removeEventListener("addtrack",oe),e.textTracks.removeEventListener("removetrack",oe),e.removeEventListener("timeupdate",k),e.removeEventListener("seeked",k),e.removeEventListener("loadedmetadata",k),e.removeEventListener("play",wt),or.forEach(W=>W.removeEventListener("load",k)),ir?.disconnect(),fe&&window.cancelAnimationFrame(fe),y&&je.cancelVideoFrameCallback&&je.cancelVideoFrameCallback(y),n.textContent=""}},[ye,mt,le,Y,cn,l,p.state.subtitleFontSize,p.state.subtitlePosition,p.state.subtitleBgOpacity,p.state.subtitleBgColor,p.state.subtitleTextColor,p.state.subtitleEdge,p.state.subtitleBold]);const xn=()=>{_(null),X([]),Xe(""),M(-1)},qr=T(e=>{C(e),j(1),Ae(e,1)},[Ae]),Xt=!b&&r?.seasons&&r.seasons.length>1?t("label",{className:g.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:s,onChange:e=>qr(parseInt(e.currentTarget.value,10)||1),className:g.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,gt=T(e=>{const n=parseInt(e,10);if(!isNaN(n)){try{l.current?.pause()}catch{}j(n),Ae(s,n)}yn(!1)},[s,Ae,l]);v(()=>{if(b)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(w!=null?gt(String(w)):ts.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[b,w,gt]);const Ur=e=>{x(e);try{const i=Re[e];i&&localStorage.setItem("tvLastAudio",Bn(i))}catch{}const n=ce.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Wr=e=>{ze(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const c=Y[e];c&&localStorage.setItem("tvLastSubtitle",Bn(c))}}catch{}const n=l.current,i=ce.current;if(i&&typeof i.subtitleTrack=="number"&&Array.isArray(i.subtitleTracks)&&i.subtitleTracks.length>0&&(i.subtitleTrack=ue.current.length>0||e<0?-1:e),!n)return;const u=ue.current;if(u.length>0){u.forEach((c,I)=>{const $=c.track;if(!$)return;const f=I===e;$.mode=f&&!ye?"showing":"hidden"});return}Array.from(n.textTracks).forEach((c,I)=>{const $=I===e;c.mode=$&&!ye?"showing":"hidden"})};return v(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=b?`${r.title} - dango`:`${r.title} - Season ${s} Episode ${h} - dango`},[r,b,s,h]),v(()=>{if(!r||b)return;const e=new URLSearchParams(m),n=e.get("s"),i=e.get("e"),u=String(s),c=String(h);n===u&&i===c||(e.set("type",m.get("type")||"tv"),e.set("s",u),e.set("e",c),M(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,b,s,h,m,M]),t("div",{className:`${Me.playerPageLayout} ${Fe?Me.theaterMode:""} ${b?Me.noSidebar:""}`,onClick:Nr,children:[Fe&&t(ys,{videoRef:l,active:mn.enabled&&!L&&O.length>0&&!ke&&!(r?.adult&&!Et),settings:mn}),!Fe&&!b&&t("aside",{className:Me.episodeSidebar,children:r?t(Ss,{episodes:sr,currentEpisode:String(h),watchedEpisodes:rr,onEpisodeClick:gt,header:Xt}):t(_s,{variant:"sidebar"})}),t("div",{className:Me.playerMain,children:[r&&t("div",{className:g.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!Et?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:L&&yt?t("iframe",{src:yt,className:g.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!L&&Ct?t("iframe",{src:Ct,className:g.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!L&&(O.length>0||Ce)?t(Le,{children:[ke&&t(hr,{error:ke,onRetry:Qt}),t(Ba,{player:p,title:r.title,episodeLabel:b?void 0:`S${s} E${h}`,audioTracks:Re,selectedAudioTrack:ge,onAudioTrackChange:Ur,subtitles:Y,selectedSubtitle:le,onSubtitleChange:Wr,streams:O,resolutionIdx:Ee,onResolutionChange:e=>{Nn(),$e(e)},onBack:xn,videoDelayEnabled:ne,onVideoDelayToggle:zt,videoDelayMs:ee,onVideoDelayChange:$t,onCalibrateAvSync:an,subtitleDelayMs:mt,onSubtitleDelayChange:pr,showNextEpisodeButton:Tr&&!Ie&&!Ne&&!Ke,onNextEpisode:Zn,isLoading:Ce,isTheaterMode:Fe,onTheaterModeToggle:Sn,ambientSettings:mn,onAmbientChange:gr,children:[t("video",{ref:l,autoPlay:tt&&!It,playsInline:!0,disablePictureInPicture:!0,className:`${g.video} ${dn?g.videoHidden:""}`,onTimeUpdate:Mr,onEnded:()=>{ae||Lr()},onPlay:Br,onPause:Pr,onSeeked:()=>{Qn.current=Date.now(),At()},onLoadedMetadata:Rr,onVolumeChange:p.actions.onVolumeChange,onWaiting:p.actions.onWaiting,onPlaying:p.actions.onPlaying,onCanPlay:p.actions.onCanPlay,onContextMenu:e=>e.preventDefault(),onError:()=>{K("Video failed to load. Try another server or reload."),Q(!1)}}),t("canvas",{ref:kt,className:`${g.delayCanvas} ${dn?g.delayCanvasActive:""}`}),ye&&t("div",{ref:B,className:g.subtitleOverlay}),t(Ts,{isOpen:Dt,ms:ee,onChange:$t,onApply:on,onClose:Ot,testClipActive:ae,onTestClip:ln})]})]}):ke&&!L?t(hr,{error:ke,onRetry:Qt}):null}),!Fe&&r&&t(Cs,{}),!Fe&&Xt&&t("div",{className:g.mobileSeasonRow,children:Xt}),!Fe&&r&&t("div",{className:de.streamPanel,children:[t("div",{className:g.providerSelectWrap,children:t("label",{className:g.controlLabel,children:["Provider",t("select",{value:d,onChange:e=>Fr(e.currentTarget.value),className:g.select,disabled:G.length===0,children:Qe?t("option",{value:"",children:"Loading..."}):G.length===0?t("option",{value:"",children:"No providers available"}):t(Le,{children:[E.length>0&&t("optgroup",{label:"Direct HLS",children:E.map(e=>t("option",{value:e.id,children:e.label},e.id))}),te.length>0&&t("optgroup",{label:"Embeds",children:te.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),!L&&(Ce?t("div",{className:g.sourceLoader,children:t("div",{className:g.ringSpinner})}):t(Ra,{servers:se,selectedServer:Oe?"Embed":me,onServerSelect:Vr}))]}),!Fe&&r&&t("div",{className:Me.playerInfoContainer,children:[t("div",{className:Me.playerInfoHeader,children:[t("div",{className:Me.playerAnimeCard,children:r.poster&&t("img",{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"})}),t("div",{className:Me.videoTitleSection,children:[t("div",{className:de.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:g.meta,children:[t("span",{className:g.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:g.rating,children:[t(H,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${g.typeBadge} ${g[b?"movie":"tv"]}`,children:b?"Movie":"TV Show"})]}),ar.length>0&&t("div",{className:g.genreRow,children:ar.map(e=>t("span",{className:g.genreChip,children:e},e))}),En.length>0&&t("div",{className:g.metaRow,children:En.map((e,n)=>t("span",{children:[e,n<En.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:de.controls,children:[t("button",{className:`${de.watchlistBtn} ${Ut?de.inList:""}`,onClick:_r,disabled:Sr,type:"button",children:[Ut?t(H,{name:"check",size:14}):t(H,{name:"plus",size:14}),Ut?"In Watchlist":"Add to Watchlist"]}),!b&&t(Le,{children:[t("button",{className:`${de.watchlistBtn}`,onClick:()=>fn!=null&>(String(fn)),disabled:fn==null,type:"button",children:[t(H,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${de.watchlistBtn}`,onClick:()=>w!=null&>(String(w)),disabled:w==null,type:"button",children:["Next EP",t(H,{name:"chevron-right",size:14})]}),!b&&t("button",{className:`${de.watchlistBtn} ${de.modeToggleBtn} ${bt?de.modeToggleActive:""}`,onClick:()=>Ar(!bt),type:"button","aria-pressed":bt,children:bt?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),xr&&t("button",{className:`${de.watchlistBtn}`,onClick:()=>yn(!0),type:"button",children:[t(H,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:Me.infoColumns,children:[t("div",{className:`${de.descriptionSection} ${de.synopsisFlat}`,children:[t("h3",{children:"Synopsis"}),t(Ks,{text:r.overview,emptyText:"No description available."}),t("button",{className:de.detailsToggleBtn,onClick:()=>kr(!Yt),type:"button",children:[Yt?t(H,{name:"chevron-up"}):t(H,{name:"chevron-down"}),Yt?"Hide Details":"Show Details"]})]}),Yt&&t("div",{className:g.detailGrid,children:[r.first_air_date&&t("div",{className:g.detailItem,children:[t("strong",{children:b?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:g.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:g.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:g.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:g.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:g.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:g.imdbLink,children:"View on IMDb"})]})]})]})]}),!b&&t(ks,{isOpen:Er,onClose:()=>yn(!1),episodes:sr,currentEpisode:String(h),watchedEpisodes:rr,onEpisodeClick:gt,header:Xt}),r?.adult&&!Et&&t(ws,{isOpen:!0,onClose:xn,onGrant:vr}),t(Es,{isOpen:Ie,onClose:Jn,title:"Resume Watching",message:t(Le,{children:["You were at ",t("strong",{children:nn(ht)})]}),restartLabel:"Start from Beginning",onResume:zr,onRestart:Jn}),t(ur,{isOpen:Ne,onClose:$r,title:b?"Movie Completed":"Episode Completed",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:b?t(Le,{children:"You've already watched this movie."}):t(Le,{children:["You've already watched"," ",t("strong",{children:["Season ",s," Episode ",h]}),". Would you like to continue?"]})}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(ot,{variant:"secondary",onClick:Dr,children:"Replay"}),w!=null?t(ot,{onClick:Zn,children:["Watch EP ",w]}):Se!=null?t(ot,{onClick:er,children:["Start Season ",Se]}):null]})]})}),t(ur,{isOpen:Ke,onClose:()=>nt(!1),title:b?"Movie Completed!":Se!=null?"Season Complete!":"Show Completed!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(H,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:Cr}),t("p",{style:{color:"var(--text-secondary)"},children:b?"You finished this movie!":Se!=null?`You finished Season ${s}.`:"Congratulations! You finished all available episodes."}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(ot,{variant:"secondary",onClick:()=>nt(!1),children:"Close"}),Se!=null?t(ot,{onClick:er,children:["Start Season ",Se]}):t(Le,{children:[t(ot,{onClick:()=>{nt(!1),xn()},children:"Back to Details"}),Ut&&t(ot,{onClick:Or,disabled:qt.isPending,children:qt.isPending?"Saving...":"Move to Completed"})]})]})]})}),!r&&t("div",{className:g.statusMsg,children:[t(H,{name:"spinner",className:g.spinner})," Loading..."]})]})]})};export{Ro as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const o=.8;const c=2e3,a="autoplayEnabled",r=(e,t)=>t>0&&e>=t*.8,E=(e,t)=>e>5&&!r(e,t),S=()=>{try{return localStorage.getItem(a)==="true"}catch{return!1}},d=e=>{try{localStorage.setItem(a,String(e))}catch{}},l=["finished","completed","complete","ended"],u=(e,t,n)=>e.length>0&&!!t&&e[e.length-1]===t&&l.some(s=>String(n||"").trim().toLowerCase().includes(s)),I=e=>e.seekInduced?"none":e.autoplayEnabled&&e.hasNext?"advance":e.hasNext?"prompt-next":e.isFinal?"prompt-complete":"none";export{o as C,c as S,r as a,I as d,E as h,u as i,S as l,d as s};
|
|
File without changes
|