@serifpersia/dango 3.4.5 → 3.4.7
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-I3S6qw9d.js → AnimeCard-Cll26FQe.js} +1 -1
- package/client/dist/assets/{AnimeInfo-CLU2NSBR.js → AnimeInfo-zMQgNycF.js} +1 -1
- package/client/dist/assets/{AnimeInfoPage-4Mw9ArDy.js → AnimeInfoPage-DEPX3FFf.js} +2 -2
- package/client/dist/assets/Asmr-BbHVH9pC.js +2 -0
- package/client/dist/assets/Asmr-D1KuQwQy.css +1 -0
- package/client/dist/assets/Asmr.module-CdWlioTY.js +1 -0
- package/client/dist/assets/{AsmrResetProgressModal-DyU1Z2Gw.js → AsmrResetProgressModal-D4zRL_b8.js} +1 -1
- package/client/dist/assets/AvSyncCalibrator-CbzA-56T.js +10 -0
- package/client/dist/assets/{AvSyncCalibrator-C2wu1ydI.css → AvSyncCalibrator-gEONBv5a.css} +1 -1
- package/client/dist/assets/Home-q7a1RjQM.js +1 -0
- package/client/dist/assets/{Insights-i34-qV4C.js → Insights-6H3qK9Q_.js} +1 -1
- package/client/dist/assets/{LibraryListPage-DE-ASOX2.js → LibraryListPage-Cc-I_48d.js} +1 -1
- package/client/dist/assets/ListeningList-CxfHV13T.js +1 -0
- package/client/dist/assets/Manga-BmNPKJB8.js +1 -0
- package/client/dist/assets/Manga-CqAceKxR.css +1 -0
- package/client/dist/assets/Manga.module-depGEacJ.js +1 -0
- package/client/dist/assets/MangaInfoPage-Csyq4TAu.js +1 -0
- package/client/dist/assets/MangaReadPage-jaSR2qX6.js +1 -0
- package/client/dist/assets/{MangaResetProgressModal-DOjpLAMp.js → MangaResetProgressModal-DrfFCtDE.js} +1 -1
- package/client/dist/assets/{Mature-D2xb9EGB.js → Mature-20QVU1lQ.js} +1 -1
- package/client/dist/assets/{MediaCard-CKUEcFTd.js → MediaCard-CoRm07Vb.js} +1 -1
- package/client/dist/assets/Music-Yry6890T.js +1 -0
- package/client/dist/assets/OptionListMenu-DSTuvk6i.js +1 -0
- package/client/dist/assets/Player-yVWIsyOS.js +56 -0
- package/client/dist/assets/PlayerSettings-CiazXo-J.js +1 -0
- package/client/dist/assets/{QueueOptionsButton-BMvAC6Ut.js → QueueOptionsButton-CpyBvbsh.js} +1 -1
- package/client/dist/assets/{QueueRail-CAoGJvHP.js → QueueRail-DRxByiUx.js} +1 -1
- package/client/dist/assets/Radio-DxL91QOj.js +1 -0
- package/client/dist/assets/ReadingList-CNm6nFC1.js +1 -0
- package/client/dist/assets/{ResetProgressModal-vFC6N-Qw.js → ResetProgressModal-DiYoRAaR.js} +1 -1
- package/client/dist/assets/{Search-Bh9Y6nIJ.js → Search-BBRaD1PE.js} +1 -1
- package/client/dist/assets/{Settings-DRumujfh.js → Settings-C3ZhNo9P.js} +1 -1
- package/client/dist/assets/{SkeletonGrid-BtzUnQE0.js → SkeletonGrid-BAQn8Rru.js} +1 -1
- package/client/dist/assets/{Trackers-D0nqy8wu.js → Trackers-CZd3KCwM.js} +1 -1
- package/client/dist/assets/Tv-O1-yrBt9.js +4 -0
- package/client/dist/assets/{TvInfo-BkECbOKN.js → TvInfo-oMcOTrSG.js} +1 -1
- package/client/dist/assets/{TvPopup-D8WWY6o4.js → TvPopup-BaAmlbH4.js} +1 -1
- package/client/dist/assets/{TvSearch-kWPep3gL.js → TvSearch-CjGUazdR.js} +1 -1
- package/client/dist/assets/{TvWatchlist-dD4emIHx.js → TvWatchlist-W51KZDQP.js} +1 -1
- package/client/dist/assets/{Watchlist-cWxw38nU.js → Watchlist-DBtN7kPt.js} +1 -1
- package/client/dist/assets/{hls-uG_Y3i5s.js → hls-CSxWA5I-.js} +1 -1
- package/client/dist/assets/index-CQWyVhME.js +178 -0
- package/client/dist/assets/page-DRvjODkg.css +1 -0
- package/client/dist/assets/page.module-C1MlZzf3.js +1 -0
- package/client/dist/assets/{useAnimeInfoData-DjPBg24u.js → useAnimeInfoData-CthDMEMc.js} +1 -1
- package/client/dist/assets/{useAsmr-DQyobNQX.js → useAsmr-DH8inTBw.js} +1 -1
- package/client/dist/assets/useAsmrPopup-BfkGmSSw.js +1 -0
- package/client/dist/assets/{useMangaLibrary-C6L8mrnS.js → useMangaLibrary-CpQLCvkU.js} +1 -1
- package/client/dist/assets/useMangaPopup-B5LXZINf.js +1 -0
- package/client/dist/assets/usePopup-DS9jMzp6.js +1 -0
- package/client/dist/assets/useProviders-DYy7lHj6.js +1 -0
- package/client/dist/assets/{useTv-DzSYasru.js → useTv-DvKLIudk.js} +1 -1
- package/client/dist/assets/{useTvLibrary-BnbHS-gg.js → useTvLibrary-ChI7tnUw.js} +1 -1
- package/client/dist/index.html +1 -1
- package/package.json +2 -2
- package/server/dist/hono/proxy.js +102 -75
- package/server/dist/hono/tv.js +2 -2
- package/server/dist/hono/watchlist.js +2 -291
- package/server/dist/lib/anilist.js +0 -3
- package/server/dist/lib/mal.js +0 -38
- package/server/dist/lib/offline-db.js +0 -6
- package/server/dist/providers/remote-loader.js +15 -26
- package/server/dist/providers/title-matching.js +5 -5
- package/server/dist/repositories/manga.repository.js +0 -1
- package/server/dist/repositories/watched-episodes.repository.js +0 -2
- package/server/dist/utils/megaplay.utils.js +1 -2
- package/server/package.json +1 -1
- package/client/dist/assets/Asmr-Cq2ua6Zk.css +0 -1
- package/client/dist/assets/Asmr-DN9XBc5Y.js +0 -2
- package/client/dist/assets/Asmr.module-ChUXDZKx.js +0 -1
- package/client/dist/assets/AvSyncCalibrator-DxL0mr_4.js +0 -10
- package/client/dist/assets/Home-CeTeJ-gM.js +0 -1
- package/client/dist/assets/ListeningList-DrNce5ll.js +0 -1
- package/client/dist/assets/Manga-DOrf7Fk6.js +0 -1
- package/client/dist/assets/Manga-Dp_-l1Pw.css +0 -1
- package/client/dist/assets/Manga.module-BcfOdsNP.js +0 -1
- package/client/dist/assets/MangaInfoPage-CAZMLMGw.js +0 -1
- package/client/dist/assets/MangaReadPage-DQVEo8_F.js +0 -1
- package/client/dist/assets/Music-w_a34r7r.js +0 -1
- package/client/dist/assets/OptionListMenu-DxZHBMIZ.js +0 -1
- package/client/dist/assets/Player-B8YHeATv.js +0 -56
- package/client/dist/assets/PlayerSettings-Ddlg-MvW.js +0 -1
- package/client/dist/assets/Radio-6O7rAUv1.js +0 -1
- package/client/dist/assets/ReadingList-k3g8oHvs.js +0 -1
- package/client/dist/assets/Tv-DVebLMNS.js +0 -4
- package/client/dist/assets/index-BWIWE3Qy.js +0 -178
- package/client/dist/assets/useAsmrPopup-CDoroMBD.js +0 -1
- package/client/dist/assets/useMangaPopup-BSuMa_vA.js +0 -1
- package/client/dist/assets/useProviders-XIdvDof6.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as I,d as X,T as Y,u as e}from"./vendor-core-DfaOB3Rn.js";import{I as o}from"./vendor-icons-DrybRNxP.js";import{S as Z,O as _,a as ee,A as ne}from"./OptionListMenu-DxZHBMIZ.js";import{u as te}from"./index-BWIWE3Qy.js";import"./AvSyncCalibrator-DxL0mr_4.js";import"./vendor-query-BBT5_sHx.js";const ae="_settingsPanel_y6z3b_1",se="_header_y6z3b_33",le="_backBtn_y6z3b_56",ie="_contentWrapper_y6z3b_76",re="_menuContent_y6z3b_82",ce="_menuItem_y6z3b_89",oe="_selected_y6z3b_114",de="_currentValue_y6z3b_134",me="_menuNote_y6z3b_141",ue="_menuError_y6z3b_150",n={settingsPanel:ae,header:se,backBtn:le,contentWrapper:ie,menuContent:re,menuItem:ce,selected:oe,currentValue:de,menuNote:me,menuError:ue},he=(A,z)=>{const{isOpen:b,onClose:pe,videoSources:be,currentSource:v,currentLink:k,onSourceChange:w,subtitles:$,activeSubtitleTrack:y,onSubtitleChange:P,subtitleSettings:V,onSubtitleSettingsChange:O,useNativeControls:g,onNativeControlsToggle:E,anime4kEnabled:u,onAnime4kToggle:U,anime4kSupported:C,anime4kProfile:i,onAnime4kProfileChange:h,anime4kInitializing:B,anime4kError:f,videoDelayEnabled:N,onVideoDelayToggle:T,videoDelayMs:S,onVideoDelayChange:D,onCalibrateAvSync:M,isAutoSkipEnabled:d,onAutoSkipChange:x,isAutoplayEnabled:m,onAutoplayChange:L,fallbackChoice:p,onFallbackChoiceChange:W}=A,{lowEndMode:G}=te(),[a,r]=X("main");I.useEffect(()=>{if(!b){const t=setTimeout(()=>r("main"),300);return()=>clearTimeout(t)}},[b]);const j=()=>e("div",{className:n.menuContent,children:[e("button",{className:n.menuItem,onClick:()=>r("quality"),children:[e("span",{children:"Quality"}),e("span",{className:n.currentValue,children:k?.resolutionStr||"Auto"})]}),e("button",{className:n.menuItem,onClick:()=>r("subtitles"),children:[e("span",{children:"Subtitles"}),e("span",{className:n.currentValue,children:y||"Off"})]}),e("button",{className:n.menuItem,onClick:()=>r("subtitle-style"),children:e("span",{children:"Subtitle Style"})}),G&&e("button",{className:`${n.menuItem} ${g?n.selected:""}`,onClick:()=>{const t=!g;E(t),localStorage.setItem("playerUseNativeControls",t.toString())},children:[e("span",{children:"Native Controls"}),g&&e(o,{name:"check",size:12})]}),C&&e("button",{className:`${n.menuItem} ${u?n.selected:""}`,onClick:()=>{U(!u)},children:[e("span",{children:"Anime4K Upscaler"}),u&&e(o,{name:"check",size:12})]}),C&&u&&e("button",{className:n.menuItem,onClick:()=>r("upscaler"),children:e("span",{children:"Upscaler Settings"})}),e("button",{className:n.menuItem,onClick:()=>r("av-sync"),children:[e("span",{children:"A/V Sync"}),e("span",{className:n.currentValue,children:N?`${S}ms`:"Off"})]}),e("button",{className:n.menuItem,onClick:()=>r("playback"),children:[e("span",{children:"Playback"}),e("span",{className:n.currentValue,children:[d?"Auto-skip On":null,m?"Autoplay On":null].filter(Boolean).join(" • ")||"Off"})]})]}),q=()=>{const t=v?.links.sort((s,c)=>(parseInt(c.resolutionStr)||0)-(parseInt(s.resolutionStr)||0))||[];return e("div",{className:n.menuContent,children:e(_,{classes:{item:n.menuItem,active:n.selected},options:t.map(s=>({key:s.resolutionStr,label:s.resolutionStr,selected:k?.resolutionStr===s.resolutionStr})),onSelect:s=>{const c=t.find(l=>l.resolutionStr===s);c&&w(v,c)}})})},F=()=>e("div",{className:n.menuContent,children:e(_,{classes:{item:n.menuItem,active:n.selected},options:[{key:"off",label:"Off",selected:y==="off"},...$.map(t=>({key:t.label||t.lang,label:t.label,selected:y===(t.label||t.lang)}))],onSelect:t=>P(t)})}),Q=()=>e("div",{className:n.menuContent,children:e(ee,{classes:{item:n.menuItem,active:n.selected},values:V,onChange:O})}),R=Y(()=>{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}},[]),H=()=>e("div",{className:n.menuContent,children:[B&&e("div",{className:n.menuNote,role:"status",children:"Preparing GPU, this can take a few seconds…"}),f&&e("div",{className:n.menuError,role:"alert",children:["Upscaler failed: ",f]}),!R&&e("div",{className:n.menuNote,children:"Upscaling performs best in Chrome-based browsers."}),e("button",{className:`${n.menuItem} ${i==="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"})]}),i==="low"&&e(o,{name:"check",size:12})]}),e("button",{className:`${n.menuItem} ${i==="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"})]}),i==="balanced"&&e(o,{name:"check",size:12})]}),e("button",{className:`${n.menuItem} ${i==="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"})]}),i==="high"&&e(o,{name:"check",size:12})]}),e("button",{className:`${n.menuItem} ${i==="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"})]}),i==="denoise"&&e(o,{name:"check",size:12})]})]}),K=()=>e("div",{className:n.menuContent,children:[e("button",{type:"button",className:`${n.menuItem} ${d?n.selected:""}`,onClick:()=>x(!d),"aria-pressed":d,children:[e("span",{children:"Auto-skip openings and endings"}),e("span",{className:n.currentValue,children:d?"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} ${m?n.selected:""}`,onClick:()=>L(!m),"aria-pressed":m,children:[e("span",{children:"Autoplay next episode"}),e("span",{className:n.currentValue,children:m?"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:()=>W(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."})]}),J=()=>e("div",{className:n.menuContent,children:e(ne,{classes:{item:n.menuItem,active:n.selected,note:n.menuNote},enabled:N,delayMs:S,onToggle:T,onDelayChange:D,onCalibrate:M})});return b?e(Z,{classes:{panel:n.settingsPanel,header:n.header,backBtn:n.backBtn,title:"",content:n.contentWrapper},title:a==="main"?"Settings":a.charAt(0).toUpperCase()+a.slice(1).replace("-"," "),titleTag:"h3",showBack:a!=="main",onBack:()=>r("main"),panelRef:z,onPanelClick:t=>t.stopPropagation(),children:[a==="main"&&j(),a==="quality"&&q(),a==="subtitles"&&F(),a==="subtitle-style"&&Q(),a==="upscaler"&&H(),a==="av-sync"&&J(),a==="playback"&&K()]}):null},Ne=I.forwardRef(he);export{Ne as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{d as h,A as O,h as y,g as ne,u as e,S as L,$ as _,T as J}from"./vendor-core-DfaOB3Rn.js";import{I as o}from"./vendor-icons-DrybRNxP.js";import{b as Y}from"./vendor-query-BBT5_sHx.js";import{h as Z,t as K,W as se}from"./index-BWIWE3Qy.js";import{a}from"./Asmr.module-ChUXDZKx.js";import{r as i}from"./Radio.module-DGSZLpKM.js";const x=300*1e3,re="https://cdn.listen.moe/covers/";function W(n){return n?n.startsWith("http")?n:`${re}${n}`:null}function le(n){return n?W(n.albums[0]?.image)||W(n.artists[0]?.image)||W(n.sources[0]?.image):null}function F(n){return n?n.artists.map(s=>s.nameRomaji||s.name).join(", "):""}const oe=()=>{const n=Z();return Y({...n.radio.stations.queryOptions(),staleTime:x})},ie=n=>{const s=Z();return Y({...s.radio.search.queryOptions({q:n}),enabled:n.trim().length>0,staleTime:x})},G={song:null,lastPlayed:[],listeners:0,startTime:null},ce=n=>{const[s,p]=h(G),[l,c]=h(!1),d=O(null);return y(()=>{if(p(G),c(!1),!n)return;let m=null,f=!1;try{m=new WebSocket(n)}catch{return}return m.onopen=()=>{f||c(!0)},m.onmessage=v=>{try{const u=JSON.parse(v.data);if(u.op===0){const N=u.d?.heartbeat||35e3;d.current&&window.clearInterval(d.current),d.current=window.setInterval(()=>{m&&m.readyState===WebSocket.OPEN&&m.send(JSON.stringify({op:9}))},N)}else u.op===1&&p({song:u.d?.song||null,lastPlayed:u.d?.lastPlayed||[],listeners:u.d?.listeners||0,startTime:u.d?.startTime||null})}catch{}},m.onclose=()=>{f||c(!1)},()=>{f=!0,d.current&&window.clearInterval(d.current),d.current=null,m&&m.close()}},[n]),{nowPlaying:s,connected:l}};function X(n){if(!n)return"";const s=Math.max(0,Math.floor((Date.now()-new Date(n).getTime())/1e3)),p=Math.floor(s/60),l=s%60;return`${p}:${String(l).padStart(2,"0")}`}const de=({station:n,nowPlaying:s,connected:p,expanded:l,onStationStep:c,onExpandedChange:d,onClose:m})=>{const f=O(null),[v,u]=h(!1),[N,U]=h(!0),[S,I]=h(!1),[P,k]=h(!0),[M,T]=h(""),[b,A]=h(()=>{const t=parseFloat(localStorage.getItem("radioVolume")||"");return Number.isFinite(t)?t:1}),r=O(""),g=O(b);g.current=b,r.current||(r.current=typeof crypto<"u"&&"randomUUID"in crypto?crypto.randomUUID():`radio-${Date.now()}-${Math.random().toString(36).slice(2)}`);const w=s.song,C=le(w)||n.favicon||null,[E,q]=h(!1);y(()=>{q(!1)},[C]);const B=E?null:C,V=!!B,R=w?`${F(w)} — ${w.title}`:n.name;y(()=>{const t=f.current;if(t)return u(!1),t.src=n.streamUrl,t.load(),t.volume=g.current,t.play().catch(()=>u(!1)),()=>{t.removeAttribute("src")}},[n.id,n.streamUrl]),y(()=>{const t=f.current;t&&(t.volume=b)},[b]),y(()=>{if(l)return document.body.classList.add("asmr-player-open"),()=>document.body.classList.remove("asmr-player-open")},[l]),y(()=>{l&&k(!0)},[l]);const ee=t=>t?Math.max(0,Math.floor((Date.now()-new Date(t).getTime())/1e3)):0,D=ne.useCallback(t=>{n&&(K.discord.radioPresence.mutate({title:R,stationLabel:n.name,isPlaying:t,thumbnail:B||"",currentTime:ee(s.startTime),sessionId:r.current}).catch(()=>{}),K.discord.heartbeat.mutate({sessionId:r.current}).catch(()=>{}))},[n,R,B,s.startTime]);y(()=>{D(v)},[D,v,n.id,R,l]),y(()=>{if(!v)return;const t=window.setInterval(()=>D(!0),15e3);return()=>window.clearInterval(t)},[v,D]),y(()=>{const t=r.current,$=()=>se(t),H=()=>$(),Q=()=>{document.visibilityState==="hidden"&&$()};return window.addEventListener("pagehide",H),window.addEventListener("beforeunload",H),document.addEventListener("visibilitychange",Q),()=>{window.removeEventListener("pagehide",H),window.removeEventListener("beforeunload",H),document.removeEventListener("visibilitychange",Q),$()}},[]),y(()=>{if(!s.startTime){T("");return}T(X(s.startTime));const t=window.setInterval(()=>T(X(s.startTime)),1e3);return()=>window.clearInterval(t)},[s.startTime,s.song?.id]),y(()=>{if(!l)return;const t=$=>{$.key==="Escape"&&(S?I(!1):d(!1))};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[l,S,d]);const te=()=>{const t=f.current;t&&(t.paused?(t.load(),t.play().catch(()=>{})):t.pause())},ae=e(L,{children:[e("div",{className:a.playerButtons,children:[e("button",{className:a.playerBtn,onClick:()=>c(-1),"aria-label":"Previous station",children:e(o,{name:"step-backward"})}),e("button",{className:`${a.playerBtn} ${a.playBtn}`,onClick:te,"aria-label":v?"Pause":"Play",children:v?e(o,{name:"pause"}):e(o,{name:"play"})}),e("button",{className:a.playerBtn,onClick:()=>c(1),"aria-label":"Next station",children:e(o,{name:"step-forward"})})]}),e("div",{className:a.seekRow,children:[e("span",{className:i.liveBadge,children:[e(o,{name:"broadcast-tower",size:10})," LIVE"]}),M&&e("span",{className:a.timeLabel,children:M}),p&&s.listeners>0&&e("span",{className:a.timeLabel,children:[s.listeners," listening"]}),!p&&n.source==="listen.moe"&&e("span",{className:a.timeLabel,children:"connecting…"})]})]}),z=e(L,{children:[e("button",{className:`${a.playerBtn} ${a.playerToggle}`,onClick:()=>d(!l),"aria-label":l?"Minimize player":"Expand player",title:l?"Minimize to browse":"Expand",children:l?e(o,{name:"chevron-down"}):e(o,{name:"chevron-up"})}),e("div",{className:a.playerInfo,children:[e("p",{className:a.playerTitle,title:R,children:R}),e("p",{className:a.playerTrack,children:n.name})]}),e("div",{className:a.playerControls,children:ae}),e("div",{className:a.playerRight,children:[b===0?e(o,{name:"volume-mute",className:a.volumeIcon}):b<.5?e(o,{name:"volume-down",className:a.volumeIcon}):e(o,{name:"volume-up",className:a.volumeIcon}),e("input",{className:a.volumeBar,type:"range",min:0,max:1,step:.01,value:b,onChange:t=>{const $=parseFloat(t.target.value);A($),localStorage.setItem("radioVolume",String($))},style:{"--volume-percent":`${b*100}%`},"aria-label":"Volume"})]}),e("div",{className:a.playerActions,children:[l&&V&&e("button",{className:a.playerBtn,onClick:()=>U(t=>!t),"aria-label":N?"Hide art":"Show art",title:N?"Hide art":"Show art",children:N?e(o,{name:"eye-slash"}):e(o,{name:"image"})}),l&&s.lastPlayed.length>0&&e("button",{className:`${a.playerBtn} ${S?a.playerBtnActive:""}`,onClick:()=>I(t=>!t),"aria-label":S?"Hide history":"Show history",title:"Recently played",children:e(o,{name:"list-ol"})}),e("button",{className:a.playerBtn,onClick:m,"aria-label":"Close player",children:e(o,{name:"times"})})]})]}),j=e("audio",{ref:f,preload:"none",onPlay:()=>u(!0),onPause:()=>u(!1)});return l?_(e(L,{children:[j,e("div",{className:`${a.npOverlay} ${P?"":a.npOverlayControlsHidden}`,children:[e("div",{className:`${a.npStage} ${!N||!V?a.npStageBlank:""}`,onClick:()=>k(t=>!t),children:N&&V&&B&&e("div",{className:i.coverWrap,children:e("img",{src:B,alt:R,loading:"lazy",decoding:"async",draggable:!1,className:i.cover,onError:()=>q(!0)})})}),e("div",{className:`${a.playerBar} ${a.playerBarDocked} ${P?"":a.playerBarDockedHidden}`,onClick:t=>t.stopPropagation(),children:[z,S&&e(L,{children:[e("div",{className:a.npBackdrop,onClick:()=>I(!1)}),e("div",{className:a.chapterPanel,children:s.lastPlayed.map(t=>e("div",{className:a.chapterRow,children:e("span",{className:a.chapterRowLabel,title:`${F(t)} — ${t.title}`,children:[F(t)," — ",t.title]})},t.id))})]})]})]})]}),document.body):_(e(L,{children:[j,e("div",{className:a.playerBar,children:z})]}),document.body)},ve=()=>{y(()=>{document.title="Radio - dango"},[]);const[n,s]=h(""),[p,l]=h(""),[c,d]=h(null),[m,f]=h(!0),{data:v,isLoading:u}=oe(),{data:N,isLoading:U}=ie(p),S=J(()=>v?.stations||[],[v]),I=J(()=>N?.stations||[],[N]),P=p?I:S,{nowPlaying:k,connected:M}=ce(c?.gateway),T=r=>{d(r),f(!0)},b=r=>{const g=P.length>0?P:S;if(g.length===0||!c)return;const w=g.findIndex(E=>E.id===c.id),C=g[(w<0?0:w+r+g.length)%g.length];d(C)},A=r=>{const g=c?.id===r.id,w=g&&k.song?`${F(k.song)} — ${k.song.title}`:null,C=[r.codec,r.bitrate?`${r.bitrate}k`:"",r.tags].filter(Boolean).join(" · ");return e("button",{className:`${i.stationRow} ${g?i.stationRowActive:""}`,onClick:()=>T(r),children:[r.favicon?e("img",{src:r.favicon,alt:"",className:i.stationThumb,loading:"lazy",decoding:"async",onError:E=>{E.target.style.display="none"}}):e("span",{className:i.stationThumbPlaceholder,children:e(o,{name:"broadcast-tower"})}),e("span",{className:i.stationMeta,children:[e("span",{className:i.stationName,children:r.name}),C&&e("span",{className:i.stationSub,children:C})]}),w&&e("span",{className:i.stationNowPlaying,children:w})]},r.id)};return e("div",{className:`${a.page} ${c?a.pageWithPlayer:""}`,children:[e("div",{className:a.header,children:[e("h1",{className:a.pageTitle,children:[e(o,{name:"broadcast-tower"})," Radio"]}),e("form",{className:a.searchForm,onSubmit:r=>{r.preventDefault(),l(n)},children:[e("input",{className:a.searchInput,value:n,onChange:r=>s(r.target.value),placeholder:"Search stations (anime, j-pop, k-pop…)","aria-label":"Search radio stations"}),e("button",{className:a.searchBtn,type:"submit","aria-label":"Search",children:e(o,{name:"search"})})]})]}),p?e(L,{children:[e("h2",{className:i.sectionTitle,children:["Results for “",p,"”"]}),U?e("p",{className:a.statusMsg,children:"Searching…"}):I.length===0?e("p",{className:a.statusMsg,children:"No stations found."}):e("div",{className:i.stationList,children:I.map(A)})]}):e(L,{children:[e("h2",{className:i.sectionTitle,children:"Featured"}),u?e("p",{className:a.statusMsg,children:"Loading…"}):e("div",{className:i.stationList,children:S.map(A)})]}),c&&e(de,{station:c,nowPlaying:k,connected:M,expanded:m,onStationStep:b,onExpandedChange:f,onClose:()=>d(null)})]})};export{ve as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as U,d as v,h as b,T as w,u as i,S as E}from"./vendor-core-DfaOB3Rn.js";import{M as x}from"./MediaCard-CKUEcFTd.js";import{L as F}from"./LibraryListPage-DE-ASOX2.js";import{u as _,M as z}from"./useMangaPopup-BSuMa_vA.js";import{M as D}from"./MangaResetProgressModal-DOjpLAMp.js";import{x as G,d as O,o as Q,p as Y,u as q,y as H,z as K,A as V,M as h,m as Z,i as j,b as J,c as W}from"./useMangaLibrary-C6L8mrnS.js";import"./vendor-ui-3qrARCPr.js";import"./vendor-icons-DrybRNxP.js";import"./index-BWIWE3Qy.js";import"./vendor-query-BBT5_sHx.js";import"./useIsMobile-Dvx1uJ82.js";import"./SkeletonGrid-BtzUnQE0.js";import"./ErrorMessage-DAxegITP.js";import"./Watchlist.module-XGtVQr1d.js";import"./ResetProgressModal-vFC6N-Qw.js";const X=["All","Continue Reading",...h],R=24,y=e=>({provider:e.provider,mangaId:e.mangaId,title:e.title,altTitle:e.altTitle,cover:e.cover,contentRating:e.contentRating,readTarget:e.detailTarget,progressLabel:e.progressLabel});function va(){const{filter:e="All"}=U(),[g,p]=v(1),[d,u]=v(null);b(()=>{document.title="Reading List - dango"},[]),b(()=>{p(1)},[e]);const r=e==="Continue Reading",n=G(r?"All":e,g,R),s=O(100),I=Q(),T=Y(),{toggle:L,bookmarkedIds:C}=q(),{popup:t,openPopup:k,scheduleClose:c,cancelClose:m,closePopup:M}=_(),f=H(),P=K(),B=V(),S=w(()=>r?(s.data?.data??[]).map(a=>{const o=a.page??0,l=a.pageCount??0;return{key:a.id,libId:a.id,provider:a.provider,mangaId:a.mangaId,title:a.title,altTitle:a.altTitle,cover:a.cover||"",status:a.status,contentRating:a.contentRating||void 0,chapterLabel:a.chapterNumber?`Ch. ${a.chapterNumber}`:void 0,progressPercent:l>0?o/l*100:0,progressLabel:a.chapterNumber&&l>0?`Ch. ${a.chapterNumber} · p. ${o}/${l}`:void 0,detailTarget:a.chapterId&&a.provider&&a.mangaId?`/manga/${a.provider}/${encodeURIComponent(a.mangaId)}/read?chapter=${encodeURIComponent(a.chapterId)}`:`/manga/${a.provider}/${encodeURIComponent(a.mangaId)}`}}):(n.data?.data??[]).map(a=>({key:a.id,libId:a.id,provider:a.provider,mangaId:a.mangaId,title:a.title,altTitle:a.altTitle,cover:a.cover||"",status:a.status,contentRating:a.contentRating||void 0,chapterLabel:a.lastChapterNumber?`Ch. ${a.lastChapterNumber}`:void 0,progressPercent:void 0,progressLabel:void 0,detailTarget:`/manga/${a.provider}/${encodeURIComponent(a.mangaId)}`})),[r,s.data,n.data]),A=r?s.data?.total??0:n.data?.total??0,$=r?s.isLoading:n.isLoading,N=r?s.error:n.error;return i(F,{headerTitle:"My Reading List",headerSubtitle:"Track and manage your manga collection",filters:X,filterBy:e,filterBasePath:"/reading-list",continueFilter:"Continue Reading",statusOptions:[...h],entries:S,total:A,isLoading:$,error:N,page:g,pageSize:R,onPageChange:p,emptyTitle:"Your reading list is looking a bit lonely",emptyFilteredText:"No titles match this filter.",emptyAllText:"Let's find something to read!",browseLabel:"Browse Manga",browseTarget:"/manga",removeListLabel:"Remove from Reading List",listNoun:"reading list",skipConfirmKey:"mangaSkipRemoveConfirmation",onBulkStatus:(a,o)=>f.mutate({ids:a,status:o}),onBulkRemove:a=>{r?B.mutate(a):P.mutate(a)},onStatusChange:(a,o)=>T.mutate({id:a,status:o}),onRemoveItem:a=>I.mutate(a),renderCard:a=>i(x,{item:{id:a.libId,title:a.title,...W({title:a.title,altTitle:a.altTitle}),thumbnail:J(a.provider,a.cover),chapterBadge:a.chapterLabel??null,isAdult:j(a)},linkTo:a.detailTarget,hoverIcon:"book",progress:a.progressPercent!==void 0&&a.progressLabel?{percent:a.progressPercent,label:a.progressLabel}:void 0,showProgress:r,display:{elements:{poster:{typeBadge:!1,chapterBadge:!0,adultBadge:!0},info:{title:!0,mobileBadges:!0,progress:!0,meta:!1}}},onRemove:r?()=>u(a):void 0,onOpenDetails:o=>k(o,y(a)),onPopupHoverIntent:o=>o?m():c(),rawThumbnail:!0}),modals:i(E,{children:[t&&t.data.provider&&i(z,{data:t.data,anchorRect:t.rect,bookmarked:C.has(Z(t.data.provider,t.data.mangaId)),onToggleBookmark:()=>L({id:t.data.mangaId,provider:t.data.provider,title:t.data.title,cover:t.data.cover,altTitle:t.data.altTitle??void 0,contentRating:t.data.contentRating}),onMouseEnter:m,onMouseLeave:c,onRequestClose:M}),i(D,{mangaId:d?d.libId:null,title:d?.title,onClose:()=>u(null)})]})})}export{va as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{d as b,A as x,h as _,u as t,S as Ae,o as jr,p as Wr,a as zr,T as Ce,q as C}from"./vendor-core-DfaOB3Rn.js";import{u as Hr}from"./vendor-query-BBT5_sHx.js";import{g as Pn,e as Ur,t as tt,z as qr,W as Kr,M as mn,B as ke}from"./index-BWIWE3Qy.js";import{I as D}from"./vendor-icons-DrybRNxP.js";import{M as Yr,t as mr,f as Dn,d as Qr,C as Gr,S as Xr,U as Jr,a as Zr,p as On,u as es,b as ts,c as ns,l as rs,q as ss,i as Ln,v as as,w as os,x as dr,s as Rn,e as is,g as ls,h as cs,r as ds,j as nt,k as us,E as ms,A as hs,P as ps,m as ye,o as gs}from"./AvSyncCalibrator-DxL0mr_4.js";import{O as pn,S as fs,a as vs,A as bs}from"./OptionListMenu-DxZHBMIZ.js";import{u as ys}from"./useProviders-XIdvDof6.js";import{d as Ss,g as _s,h as Cs,f as ks,e as Ts,j as xs,k as Es}from"./useTvLibrary-BnbHS-gg.js";import{l as Ns,c as ws}from"./hls-uG_Y3i5s.js";import{u as Is}from"./useIsMobile-Dvx1uJ82.js";import{S as Bs}from"./SynopsisText-B3Sa5pRv.js";const Ms="_fullscreenFlat_1xij1_1",As="_timeDisplay_1xij1_15",Ps="_bottomControls_1xij1_19",Ls="_leftControls_1xij1_23",Rs="_rightControls_1xij1_24",$s="_controlBtn_1xij1_28",Ds="_controlsOverlay_1xij1_47",Os="_hidden_1xij1_67",Vs="_topControls_1xij1_73",Fs="_backBtn_1xij1_93",js="_videoTitleInfo_1xij1_113",Ws="_animeTitle_1xij1_119",zs="_episodeLabel_1xij1_127",Hs="_speedBoostBadge_1xij1_134",Us="_progressBarContainer_1xij1_180",qs="_progressBar_1xij1_180",Ks="_thumb_1xij1_199",Ys="_bufferedBar_1xij1_217",Qs="_watchedBar_1xij1_227",Gs="_scrubbing_1xij1_252",Xs="_timeBubble_1xij1_256",Js="_bottomControlsRow_1xij1_270",Zs="_nextEpisodeBtn_1xij1_293",ea="_active_1xij1_346",ta="_settingsPanel_1xij1_421",na="_settingsHeader_1xij1_440",ra="_settingsBackBtn_1xij1_448",sa="_settingsTitle_1xij1_466",aa="_settingsContent_1xij1_477",oa="_currentValue_1xij1_486",ia="_menuItem_1xij1_501",la="_menuNote_1xij1_534",ca="_loadingOverlay_1xij1_547",da="_loadingDots_1xij1_558",ua="_dot_1xij1_563",ma="_bufferingOverlay_1xij1_592",ha="_bufferingSpinner_1xij1_601",a={fullscreenFlat:Ms,timeDisplay:As,bottomControls:Ps,leftControls:Ls,rightControls:Rs,controlBtn:$s,controlsOverlay:Ds,hidden:Os,topControls:Vs,backBtn:Fs,videoTitleInfo:js,animeTitle:Ws,episodeLabel:zs,speedBoostBadge:Hs,progressBarContainer:Us,progressBar:qs,thumb:Ks,bufferedBar:Ys,watchedBar:Qs,scrubbing:Gs,timeBubble:Xs,bottomControlsRow:Js,nextEpisodeBtn:Zs,active:ea,settingsPanel:ta,settingsHeader:na,settingsBackBtn:ra,settingsTitle:sa,settingsContent:aa,currentValue:oa,menuItem:ia,menuNote:la,loadingOverlay:ca,loadingDots:da,dot:ua,bufferingOverlay:ma,bufferingSpinner:ha},hn=-6e4,$n=6e4,ur=500,pa=({classes:u,delayMs:w,onDelayChange:X})=>{const[H,F]=b(null),O=H??w,r=x(X);r.current=X;const L=x(w);L.current=w;const ae=x(null);ae.current=H,_(()=>{F(null)},[w]),_(()=>()=>{const U=ae.current;U!==null&&U!==L.current&&r.current(U)},[]);const he=U=>{L.current=U,ae.current=null,r.current(U),F(null)},i=U=>{const re=ae.current??L.current,Ve=Math.max(hn,Math.min($n,re+U));he(Ve)};return t(Ae,{children:[t("div",{style:{display:"flex",gap:6,padding:"0.5rem 0.75rem 0.25rem"},children:[t("button",{type:"button",className:u.item,onClick:()=>i(-ur),"aria-label":"Show subtitles 0.5 seconds earlier",style:{flex:1,justifyContent:"center"},children:t("span",{children:"-0.5s"})}),t("button",{type:"button",className:u.item,onClick:()=>i(ur),"aria-label":"Show subtitles 0.5 seconds later",style:{flex:1,justifyContent:"center"},children:t("span",{children:"+0.5s"})}),t("button",{type:"button",className:u.item,onClick:()=>he(0),disabled:O===0,"aria-label":"Reset subtitle timing",style:{flex:1,justifyContent:"center"},children:t("span",{children:"Reset"})})]}),t(Yr,{label:"Subtitle timing",display:mr(O),min:hn,max:$n,step:100,value:O,percent:(O-hn)/($n-hn)*100,onChange:U=>{const re=Math.round(U);ae.current=re,F(re)},onCommit:()=>{const U=ae.current;U!==null&&he(U)}}),t("div",{className:u.note,children:"Positive delays subtitles (show later). Negative shows them earlier. 0.0s is default."})]})},ga=({classes:u,tracks:w,selected:X,onChange:H})=>t(pn,{classes:u,options:w.map((F,O)=>({key:String(O),label:F.label||F.language,selected:O===X})),onSelect:F=>H(Number(F))}),fa=({player:u,title:w,episodeLabel:X,audioTracks:H,selectedAudioTrack:F,onAudioTrackChange:O,subtitles:r,selectedSubtitle:L,onSubtitleChange:ae,streams:he,qualityIdx:i,onQualityChange:U,onBack:re,children:Ve,movyServers:f=[],selectedMovyServer:Se="atlanta",onMovyServerSelect:$,isMovySource:Dt=!1,videoDelayEnabled:oe=!1,onVideoDelayToggle:Fe,videoDelayMs:Ct=0,onVideoDelayChange:kt,onCalibrateAvSync:Ot,subtitleDelayMs:Vt=0,onSubtitleDelayChange:gn,showNextEpisodeButton:Ft=!1,onNextEpisode:ie,isLoading:je=!1})=>{const{state:T,refs:rt,actions:M}=u,q=rt.videoRef,{subtitleFontSize:K,subtitlePosition:Pe,subtitleBgOpacity:st,subtitleBgColor:Te,subtitleTextColor:We,subtitleEdge:pe,subtitleBold:ze}=T,[y,Q]=b(null),Le=x(null),[jt,at]=b(0);_(()=>{const l=q.current;if(!l)return;const c=()=>at(l.clientHeight||0);c();const te=new ResizeObserver(c);return te.observe(l),()=>te.disconnect()},[q,he]);const ge=(l,c)=>{try{localStorage.setItem(l,String(c))}catch{}},ot=(l,c)=>{switch(l){case"fontSize":typeof c=="number"&&(M.setSubtitleFontSize(c),ge("subtitleFontSize",c));break;case"position":typeof c=="number"&&(M.setSubtitlePosition(c),ge("subtitlePosition",c));break;case"bgOpacity":typeof c=="number"&&(M.setSubtitleBgOpacity(c),ge("subtitleBgOpacity",c));break;case"bgColor":typeof c=="string"&&(M.setSubtitleBgColor(c),ge("subtitleBgColor",c));break;case"textColor":typeof c=="string"&&(M.setSubtitleTextColor(c),ge("subtitleTextColor",c));break;case"edge":(c==="shadow"||c==="outline"||c==="none")&&(M.setSubtitleEdge(c),ge("subtitleEdge",c));break;case"bold":typeof c=="boolean"&&(M.setSubtitleBold(c),ge("subtitleBold",c));break}};_(()=>{const l="tv-player-subtitle-style";let c=document.getElementById(l);c||(c=document.createElement("style"),c.id=l,document.head.appendChild(c));const te={fontSize:K,position:Pe,bgOpacity:st,bgColor:Te,textColor:We,edge:pe,bold:ze},Z=q.current,Et=Dn(K,jt||Z?.clientHeight||720);if(c.textContent=Qr({...te,fontSize:Et}),Z){const Be=()=>{const E=Number(Pe);return isNaN(E)?0:Math.max(0,Math.min(100,E))},Nt=(E,I)=>{try{const ee=E;ee.snapToLines=!1,ee.line=I}catch{}},wt=()=>{const E=Et*16,I=Z.videoHeight||Z.clientHeight||720,ee=Z.videoWidth||Z.clientWidth||1280;return{step:E*1.3/I*100,chars:Math.max(20,Math.floor(ee/(E*.55)))}},Yt=E=>{const I=Math.max(0,Math.min(100,100-Be())),ee=Array.from(E.activeCues??[]);if(ee.length<=1){ee.forEach(fe=>Nt(fe,I));return}const{step:mt,chars:ht}=wt();let Xt=I;for(let fe=ee.length-1;fe>=0;fe--){const pt=String(ee[fe].text??"").replace(/<[^>]*>/g,"").split(`
|
|
2
|
-
`).reduce((Jt,gt)=>Jt+Math.max(1,Math.ceil(gt.length/ht)),0),R=Xt-pt*mt;Nt(ee[fe],Math.max(0,R)),Xt=R-mt*.4}},It=()=>{const E=Math.max(0,Math.min(100,100-Be()));Array.from(Z.textTracks).forEach(I=>{I.cues&&(Array.from(I.cues).forEach(ee=>Nt(ee,E)),I.mode==="showing"&&Yt(I))})};It();const dt=E=>{const I=E.target;I.mode==="showing"&&Yt(I)},Qt=()=>{Array.from(Z.textTracks).forEach(E=>{E.removeEventListener("cuechange",dt),E.addEventListener("cuechange",dt)}),It()};Array.from(Z.textTracks).forEach(E=>{E.addEventListener("cuechange",dt)}),Z.textTracks.addEventListener("addtrack",Qt);const Gt=Array.from(Z.querySelectorAll("track")),ut=()=>It();return Gt.forEach(E=>E.addEventListener("load",ut)),()=>{Array.from(Z.textTracks).forEach(E=>{E.removeEventListener("cuechange",dt)}),Z.textTracks.removeEventListener("addtrack",Qt),Gt.forEach(E=>E.removeEventListener("load",ut))}}},[K,Pe,st,Te,We,pe,ze,L,r,q,jt]);const fn=l=>{const c=q.current;!c||isNaN(T.duration)||T.duration===0||(c.currentTime=l*T.duration)},Tt=()=>{q.current&&(M.setIsScrubbing(!0),M.wasPlayingBeforeScrub.current=!q.current.paused,q.current.pause())},He=l=>{const c=q.current;c&&T.duration&&(c.currentTime=l*T.duration)},J=()=>{M.setIsScrubbing(!1),M.wasPlayingBeforeScrub.current&&q.current?.play().catch(()=>{})},Wt=l=>{const c=q.current;c&&(c.volume=l,c.muted=l===0,localStorage.setItem("playerVolume",l.toString()))},xt=()=>{M.toggleMute()},A=r.length>0,j=L>=0,zt=()=>{Q("main"),M.setShowControls(!0)},Ht=()=>{if(j){ae(-1);return}let l=null;try{l=localStorage.getItem("tvLastSubtitle")}catch{}ae(On(r,{lastKey:l,enabled:!0}))},it=()=>{Q(null)},vn=()=>t(Ae,{children:[he.length>1&&t("button",{className:a.menuItem,onClick:()=>Q("quality"),children:[t("span",{children:"Quality"}),t("span",{className:a.currentValue,children:he[i]?.quality||"Auto"})]}),Dt&&f.length>0&&t("button",{className:a.menuItem,onClick:()=>Q("server"),children:[t("span",{style:{display:"flex",alignItems:"center",gap:6},children:[t(D,{name:"server",size:12})," Movy Server"]}),t("span",{className:a.currentValue,style:{textTransform:"capitalize"},children:Se})]}),A&&t("button",{className:a.menuItem,onClick:()=>Q("subtitles"),children:[t("span",{children:"Subtitles"}),t("span",{className:a.currentValue,children:j?r[L]?.label||r[L]?.language:"Off"})]}),A&&t("button",{className:a.menuItem,onClick:()=>Q("subtitle-style"),children:[t("span",{children:"Subtitle Style"}),t("span",{className:a.currentValue,children:[K.toFixed(1),"x · ",Pe]})]}),A&&t("button",{className:a.menuItem,onClick:()=>Q("subtitle-timing"),children:[t("span",{children:"Subtitle Timing"}),t("span",{className:a.currentValue,children:mr(Vt)})]}),H.length>0&&t("button",{className:a.menuItem,onClick:()=>Q("audio"),children:[t("span",{children:"Audio Track"}),t("span",{className:a.currentValue,children:H[F]?.label||H[F]?.language})]}),t("button",{className:a.menuItem,onClick:()=>Q("av-sync"),children:[t("span",{children:"A/V Sync"}),t("span",{className:a.currentValue,children:oe?`${Ct}ms`:"Off"})]})]}),S=()=>t(pn,{classes:{item:a.menuItem,active:a.active},options:he.map((l,c)=>({key:String(c),label:l.quality,selected:c===i})),onSelect:l=>U(Number(l))}),d=()=>t(pn,{classes:{item:a.menuItem,active:a.active},options:[{key:"off",label:"Off",selected:!j},...r.map((l,c)=>({key:String(c),label:l.label||l.language,selected:c===L}))],onSelect:l=>ae(l==="off"?-1:Number(l))}),le=()=>t(vs,{classes:{item:a.menuItem,active:a.active},values:{fontSize:K,position:Pe,bgOpacity:st,bgColor:Te,textColor:We,edge:pe,bold:ze},onChange:ot}),ce=()=>t(pa,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},delayMs:Vt,onDelayChange:l=>gn?.(l)}),Ut=()=>t(ga,{classes:{item:a.menuItem,active:a.active},tracks:H,selected:F,onChange:O}),qt=()=>t(pn,{classes:{item:a.menuItem,active:a.active},options:f.map(l=>({key:l,label:t("span",{style:{textTransform:"capitalize"},children:l}),selected:Se===l})),onSelect:l=>$?.(l)}),Ue=()=>t(bs,{classes:{item:a.menuItem,active:a.active,note:a.menuNote},enabled:oe,delayMs:Ct,onToggle:l=>Fe?.(l),onDelayChange:l=>kt?.(l),onCalibrate:()=>{Q(null),Ot?.()}}),Kt=T.isMuted?t(D,{name:"volume-mute"}):T.volume<.5?t(D,{name:"volume-down"}):t(D,{name:"volume-up"}),qe=t("div",{className:`${a.controlsOverlay} ${!T.showControls&&!y?a.hidden:""}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none"},children:t("div",{className:a.topControls,onClick:l=>l.stopPropagation(),children:[t("button",{className:a.backBtn,onClick:re,title:"Back","aria-label":"Back",children:t(D,{name:"chevron-left"})}),t("div",{className:a.videoTitleInfo,children:[t("span",{className:a.animeTitle,children:w}),X&&t("span",{className:a.episodeLabel,children:X})]})]})}),lt=!je&&!T.isBuffering&&T.duration>0?t(Gr,{isPlaying:T.isPlaying,onTogglePlay:M.togglePlay,onSkipBack:()=>M.seek(-10),onSkipForward:()=>M.seek(10)}):null,bn=t("div",{className:`${a.controlsOverlay} ${!T.showControls&&!y?a.hidden:""}`,"data-speed-boost-ignore":"true",style:{pointerEvents:"none",background:"none",justifyContent:"flex-end"},children:t("div",{className:a.bottomControls,onClick:l=>l.stopPropagation(),children:[t(Xr,{classes:{container:a.progressBarContainer,scrubbing:a.scrubbing,timeBubble:a.timeBubble,bar:a.progressBar,buffered:a.bufferedBar,watched:a.watchedBar,thumb:a.thumb},videoRef:q,duration:T.duration,formatTime:Pn,isScrubbing:T.isScrubbing,buffered:"full",onSeek:fn,onScrubStart:Tt,onScrubMove:He,onScrubEnd:J,timeLabelRef:Le}),t("div",{className:a.bottomControlsRow,children:[t("div",{className:a.leftControls,children:[t("button",{className:a.controlBtn,onClick:M.togglePlay,"aria-label":T.isPlaying?"Pause":"Play",children:T.isPlaying?t(D,{name:"pause"}):t(D,{name:"play"})}),t(Jr,{muted:T.isMuted,volume:T.volume,volumeIcon:Kt,buttonClassName:a.controlBtn,onToggleMute:xt,onVolumeChange:Wt,onExpandedChange:l=>M.setShowVolumeSlider(l)}),t("span",{className:a.timeDisplay,ref:Le,children:[Pn(0)," / ",Pn(T.duration)]})]}),t("div",{className:a.rightControls,children:[Ft&&t("button",{className:a.nextEpisodeBtn,onClick:ie,title:"Play next episode",children:"Next EP"}),A&&t("button",{className:`${a.controlBtn} ${j?a.active:""}`,onClick:Ht,"aria-label":j?"Turn subtitles off":"Turn subtitles on",children:t(D,{name:"closed-captioning"})}),t("button",{className:`${a.controlBtn} ${y?a.active:""}`,onClick:()=>y?it():zt(),"aria-label":"Settings",children:t(D,{name:"cog"})}),t("button",{className:a.controlBtn,onClick:M.toggleFullscreen,"aria-label":T.isFullscreen?"Exit Fullscreen":"Fullscreen",children:T.isFullscreen?t(D,{name:"compress"}):t(D,{name:"expand"})})]})]})]})}),ct=y?t("div",{"data-speed-boost-ignore":"true",onClick:l=>l.stopPropagation(),children:t(fs,{classes:{panel:a.settingsPanel,header:a.settingsHeader,backBtn:a.settingsBackBtn,title:a.settingsTitle,content:a.settingsContent},title:y==="main"?"Settings":y==="subtitle-style"?"Subtitle Style":y==="subtitle-timing"?"Subtitle Timing":y==="audio"?"Audio Track":y==="server"?"Movy Server":y==="av-sync"?"A/V Sync":y.charAt(0).toUpperCase()+y.slice(1),onBack:()=>y==="main"?it():Q("main"),children:[y==="main"&&vn(),y==="quality"&&S(),y==="subtitles"&&d(),y==="subtitle-style"&&le(),y==="subtitle-timing"&&ce(),y==="audio"&&Ut(),y==="server"&&qt(),y==="av-sync"&&Ue()]})}):null,_e=t(Ae,{children:[je&&t("div",{className:a.loadingOverlay,"aria-hidden":"true",children:t("div",{className:a.loadingDots,children:[t("div",{className:a.dot}),t("div",{className:a.dot}),t("div",{className:a.dot})]})}),T.isBuffering&&!je&&t("div",{className:a.bufferingOverlay,"aria-hidden":"true",children:t("div",{className:a.bufferingSpinner})}),T.isSpeedBoostActive&&t("div",{className:a.speedBoostBadge,"aria-hidden":"true",children:[t("span",{children:"2x"}),t(D,{name:"forward",size:12})]})]});return t(Zr,{player:u,topBar:qe,centerControls:lt,bottomBar:!je&&T.duration>0?bn:null,settingsPanel:ct,overlays:_e,isInteracting:!!y,className:T.isFullscreen?a.fullscreenFlat:"",children:Ve})};function va(u,w,X){const H=()=>{const O=Array.isArray(u.audioTracks)?u.audioTracks.length:0,r=X.getWant(),L=O>0?Math.min(Math.max(0,r),O-1):r;u.audioTrack=L,L!==r&&X.onResolve(L)},F=(O,r)=>{const L=X.getWant(),ae=Array.isArray(u.audioTracks)?u.audioTracks.length:0;if(r.id!==L&&L>=0&&L<ae){u.audioTrack!==L&&(u.audioTrack=L);return}X.onResolve(r.id)};return u.on(w.MANIFEST_PARSED,H),u.on(w.AUDIO_TRACK_SWITCHED,F),()=>{u.off(w.MANIFEST_PARSED,H),u.off(w.AUDIO_TRACK_SWITCHED,F)}}const ba="_page_263ma_1",ya="_header_263ma_7",Sa="_pageTitle_263ma_11",_a="_searchForm_263ma_21",Ca="_searchInput_263ma_27",ka="_searchBtn_263ma_42",Ta="_suggestions_263ma_58",xa="_suggestionPill_263ma_65",Ea="_statusMsg_263ma_81",Na="_error_263ma_87",wa="_textOnly_263ma_91",Ia="_spinner_263ma_96",Ba="_spin_263ma_96",Ma="_grid_263ma_110",Aa="_skeletonCard_263ma_116",Pa="_skeletonThumb_263ma_121",La="_skeletonLine_263ma_127",Ra="_shimmer_263ma_134",$a="_backBtn_263ma_154",Da="_meta_263ma_172",Oa="_headerActions_263ma_180",Va="_watchlistBtn_263ma_187",Fa="_active_263ma_205",ja="_year_263ma_215",Wa="_rating_263ma_220",za="_typeBadge_263ma_229",Ha="_tv_263ma_237",Ua="_movie_263ma_242",qa="_tvSeries_263ma_247",Ka="_tvMiniSeries_263ma_252",Ya="_overview_263ma_257",Qa="_controls_263ma_264",Ga="_controlLabel_263ma_272",Xa="_select_263ma_282",Ja="_playerSection_263ma_293",Za="_video_263ma_297",eo="_videoHidden_263ma_319",to="_delayCanvas_263ma_324",no="_delayCanvasActive_263ma_337",ro="_subtitleOverlay_263ma_341",so="_videoIframe_263ma_360",ao="_retryButton_263ma_368",oo="_sidebarSeason_263ma_383",io="_mobileSeasonRow_263ma_399",lo="_sidebarPosterCard_263ma_413",co="_sidebarPosterMeta_263ma_428",uo="_providerSelectWrap_263ma_445",mo="_genreRow_263ma_457",ho="_genreChip_263ma_464",po="_metaRow_263ma_474",go="_detailGrid_263ma_483",fo="_detailItem_263ma_490",vo="_imdbLink_263ma_512",p={page:ba,header:ya,pageTitle:Sa,searchForm:_a,searchInput:Ca,searchBtn:ka,suggestions:Ta,suggestionPill:xa,statusMsg:Ea,error:Na,textOnly:wa,spinner:Ia,spin:Ba,grid:Ma,skeletonCard:Aa,skeletonThumb:Pa,skeletonLine:La,shimmer:Ra,backBtn:$a,meta:Da,headerActions:Oa,watchlistBtn:Va,active:Fa,year:ja,rating:Wa,typeBadge:za,tv:Ha,movie:Ua,tvSeries:qa,tvMiniSeries:Ka,overview:Ya,controls:Qa,controlLabel:Ga,select:Xa,playerSection:Ja,video:Za,videoHidden:eo,delayCanvas:to,delayCanvasActive:no,subtitleOverlay:ro,videoIframe:so,retryButton:ao,sidebarSeason:oo,mobileSeasonRow:io,sidebarPosterCard:lo,sidebarPosterMeta:co,providerSelectWrap:uo,genreRow:mo,genreChip:ho,metaRow:po,detailGrid:go,detailItem:fo,imdbLink:vo},bo=[],Mo=()=>{const{id:u}=jr(),[w]=Wr(),X=x(w);X.current=w;const H=zr(),F=Hr(),O=w.get("type"),[r,L]=b(null),[ae,he]=b(!1),[i,U]=b(()=>parseInt(w.get("s")||"1",10)||1),[re,Ve]=b([]),[f,Se]=b(()=>parseInt(w.get("e")||"1",10)||1),[$,Dt]=b(()=>{try{return localStorage.getItem("tvProvider")||""}catch{return""}}),[oe,Fe]=b([]),[Ct,kt]=b(""),{options:Ot,isFallback:Vt,isLoading:gn}=ys(),Ft=Ce(()=>Ot.filter(e=>(e.kind??"tv")==="tv").map(e=>({id:e.value,label:e.label,tier:e.tier==="embed"?"embed":"direct",servers:e.servers})),[Ot]),ie=Vt||Ft.length===0?bo:Ft,je=ie.filter(e=>e.tier==="direct"),T=ie.filter(e=>e.tier==="embed"),[rt,M]=b(!1),[q,K]=b(""),[Pe,st]=b([]),[Te,We]=b(0),[pe,ze]=b([]),[y,Q]=b(-1),[Le,jt]=b("all"),[at,ge]=b(0),[ot,fn]=b(""),[Tt,He]=b(""),[J,Wt]=b(()=>{try{return localStorage.getItem("movyServer")||""}catch{return""}}),xt=Ce(()=>ie.find(e=>e.id===$),[ie,$]),A=xt?.tier==="embed",j=Ce(()=>xt?.servers??[],[xt]),zt=x([]);_(()=>{zt.current=oe},[oe]);const Ht=x(Te);_(()=>{Ht.current=Te},[Te]);const it=x(y);_(()=>{it.current=y},[y]);const vn=Ce(()=>[],[]),S=es({skipIntervals:vn}),d=S.refs.videoRef,le=x(null),ce=x([]),Ut=x(null),qt=x(null),[Ue,Kt]=b(()=>{try{const e=Number(localStorage.getItem("playerVideoDelayMs"));if(Number.isFinite(e)&&e>=0&&e<=500)return Math.round(e)}catch{}return 180}),[qe,lt]=b(()=>{try{return localStorage.getItem("playerVideoDelayEnabled")==="true"}catch{return!1}}),[bn,ct]=b(!1),[_e,l]=b(!1),c=x(null),te=x(null),Z=(e,n)=>{try{localStorage.setItem("playerVideoDelayMs",String(e)),localStorage.setItem("playerVideoDelayEnabled",String(n))}catch{}},Et=e=>{const n=Math.max(0,Math.min(500,Math.round(e)));Kt(n);try{localStorage.setItem("playerVideoDelayMs",String(n))}catch{}},[Be,Nt]=b(()=>{try{const e=Number(localStorage.getItem("tvSubtitleDelayMs"));if(Number.isFinite(e)&&e>=-6e4&&e<=6e4)return Math.round(e)}catch{}return 0}),wt=x(Be);wt.current=Be;const Yt=C(e=>{const n=Math.max(-6e4,Math.min(6e4,Math.round(e)));if(wt.current!==n){wt.current=n,Nt(n);try{localStorage.setItem("tvSubtitleDelayMs",String(n))}catch{}}},[]),It=()=>{c.current={enabled:qe,ms:Ue},lt(!0);try{localStorage.setItem("playerVideoDelayEnabled","true")}catch{}ct(!0)},dt=()=>{const e=c.current;c.current=null,e&&(Kt(e.ms),lt(e.enabled),Z(e.ms,e.enabled)),l(!1),ct(!1)},Qt=()=>{c.current=null,lt(!0),Z(Ue,!0),l(!1),ct(!1)},Gt=()=>{if(_e){l(!1);return}const e=d.current;e&&!isNaN(e.currentTime)&&(te.current=e.currentTime),l(!0)},ut=qe?Ue:0;ts({videoRef:d,canvasRef:Ut,delayMs:ut,enabled:qe});const E=qe,I=E||Be!==0,ee=x(I);ee.current=I;const mt=C(()=>{if(!ee.current)return;const e=d.current;e&&Array.from(e.textTracks).forEach(n=>{n.mode!=="hidden"&&(n.mode="hidden")})},[d]),{hasConsent:ht,grant:Xt}=Ur(),fe=x("");fe.current||(fe.current=`tv-${Date.now()}-${Math.random().toString(36).slice(2)}`);const h=O==="movie",pt=u?Ss(O||"tv",u):"",R=pt,Jt=_s(),gt=Cs(),{toggle:Vn,bookmarkedIds:hr,pending:pr}=ks(),{data:Fn}=Ts(r?pt:void 0),Zt=Fn?!!Fn.inLibrary:pt?hr.has(pt):!1,gr=C(()=>{!r||!u||Vn({tmdbId:Number(u),mediaType:O||"tv",title:r.title,poster:r.poster,year:r.year,adult:r.adult})},[r,u,O,Vn]),{data:Ke,isFetched:jn,isPending:Wn}=xs(R||void 0,i,f),en=Ce(()=>re.map(e=>e.episode_number).sort((e,n)=>e-n),[re]),Ye=en.indexOf(f),yn=Ye>0?en[Ye-1]:null,N=Ye>=0&&Ye<en.length-1?en[Ye+1]:null,tn=Ce(()=>(r?.seasons??[]).map(e=>e.season_number).filter(e=>Number.isFinite(e)).sort((e,n)=>e-n),[r]),ve=Ce(()=>{if(h||N!=null)return null;const e=tn.indexOf(i);return e>=0&&e<tn.length-1?tn[e+1]:(r?.number_of_seasons??0)>i?i+1:null},[h,N,tn,i,r?.number_of_seasons]),zn=Ke?.currentTime??0,Hn=Ke?.duration??0,Sn=Ke?.completed===!0||Ke?.completed===1||Ln(zn,Hn),[xe,Me]=b(!1),Ee=x(!1),_n=x(null),Bt=x(null);_(()=>{Ee.current=!1,Bt.current=null,Me(!1)},[R,i,f]);const[Ne,nn]=b(!1),[ft,Un]=b(0),[Qe,qn]=b(!1),[Re,Ge]=b(!1),[fr,Cn]=b(!1),[vr,Kn]=b(""),[rn,br]=b(!1),[yr,kn]=b(!1);ns(S,(oe.length>0||Tt!=="")&&!Ne&&!xe&&!Re);const Sr=Is(),[vt,_r]=b(rs),Cr=C(e=>{_r(e),ss(e)},[]),de=x(!1),Xe=x(null),Tn=x(0),Yn=x(!1),Qn=x(0),ne=x(null),Mt=x(""),kr=dr(zn,Hn),At=!de.current&&!Ee.current&&(Ne||xe||Re||Sn||kr),bt=x(At);bt.current=At;const yt=x(!1);_(()=>{yt.current=Qe},[Qe]);const Tr=e=>{const n=Math.floor(e/3600),s=Math.floor(e%3600/60),o=Math.floor(e%60);return n>0?`${n}:${String(s).padStart(2,"0")}:${String(o).padStart(2,"0")}`:`${s}:${String(o).padStart(2,"0")}`},$e=C((e,n)=>{if(!R||!n||n<30)return;const s=Ln(e,n),o=s?n:e;Math.abs(o-Tn.current)<10&&!s||(Tn.current=o,Jt.mutate({mediaId:R,season:i,episode:f,currentTime:Math.floor(o),duration:Math.floor(n),completed:s,title:r?.title??null,poster:r?.poster??null,backdrop:r?.backdrop??null,year:r?.year??null,overview:r?.overview??null,tmdbId:r?.id??null,mediaType:O||"tv",adult:r?.adult?1:0}))},[R,i,f,Jt,r,O]),we=C((e,n)=>{l(!1),ct(!1);const s=new URLSearchParams(w);s.set("type",w.get("type")||"tv"),s.set("s",String(e)),s.set("e",String(n)),H(`${window.location.pathname}?${s.toString()}`)},[w,H]),Pt=C(()=>{const e=d.current;if(!e||h||N==null){Cn(!1);return}const n=e.duration||0,s=e.currentTime||0;Cn(n>0&&s/n>=.8)},[h,N,d]),sn=C((e,n)=>["tv-sources",$,h?"movie":"tv",u,e,n,J],[$,h,u,J]),an=C(async(e,n)=>{if(!r||!u||!$)return{valid:!1,sources:[]};const s=h?"movie":"tv",o=await tt.tv.sources.query({provider:$,type:s,tmdbId:String(u),season:e,episode:n,title:r.title||"",year:r.year||"",totalSeasons:String(r.number_of_seasons||1),imdbId:r.imdb_id||"",...j.length>0&&J?{server:J}:{}});return{valid:"valid"in o?o.valid:!1,error:"error"in o?o.error:void 0,sources:o.sources,referer:"referer"in o?o.referer:void 0,audioTracks:o.audioTracks,subtitles:"subtitles"in o?o.subtitles:void 0}},[r,u,$,h,j,J]),Gn=C(()=>{if(h||!r||!u||!$||A||N==null)return;const e=sn(i,N);F.getQueryState(e)?.status!=="success"&&F.prefetchQuery({queryKey:e,queryFn:()=>an(i,N),staleTime:300*1e3,gcTime:1800*1e3})},[h,r,u,$,A,N,i,F,sn,an]),xr=C(()=>{if(_e)return;Pt();const e=d.current;!e||e.paused||e.ended||(e.duration>0&&e.duration-e.currentTime<=60&&Gn(),Xe.current&&clearTimeout(Xe.current),Xe.current=setTimeout(()=>{$e(e.currentTime,e.duration||0)},5e3))},[$e,d,_e,Pt,Gn]),Er=C(()=>{const e=d.current;if(!e||!r)return;Xe.current&&clearTimeout(Xe.current),$e(e.currentTime,e.duration||0),Yn.current=!0;const n=as({seekInduced:Date.now()-Qn.current<os,autoplayEnabled:vt,hasNext:!h&&N!=null,isFinal:h||N==null});n==="advance"&&N!=null?(Se(N),we(i,N)):n==="prompt-next"?(Ee.current=!1,de.current=!0,Me(!0)):n==="prompt-complete"&&(Kn(h?r.title:`${r.title} — Season ${i}`),Ge(!0),Ee.current=!0,de.current=!0)},[h,r,i,N,vt,$e,we,d]),Nr=C(()=>{Yn.current=!1,S.actions.onPlay()},[S.actions]),wr=C(()=>{S.actions.onPause();const e=d.current;e&&!e.ended&&$e(e.currentTime,e.duration||0)},[S.actions,$e,d]),Ir=C(()=>{S.actions.onLoadedMetadata();const e=d.current;if(e){try{const n=parseFloat(localStorage.getItem("playerVolume")||"");isNaN(n)||(e.volume=Math.max(0,Math.min(1,n))),e.muted=localStorage.getItem("playerMuted")==="true"}catch{}if(ne.current!=null&&ne.current>0){try{e.currentTime=ne.current}catch{}ne.current=null}Pt()}},[S.actions,d,Pt]),St=C(()=>{const e=d.current;if(e&&ne.current!=null&&ne.current>0){try{e.currentTime=ne.current}catch{}ne.current=null}},[d]),Br=C(()=>{ft>0&&(ne.current=ft);const e=d.current;if(e&&ft>0){try{e.currentTime=ft,ne.current=null}catch{}e.play().catch(()=>{})}nn(!1),de.current=!0},[ft,d]),Xn=C(()=>{ne.current=null;const e=d.current;e&&(e.currentTime=0,e.play().catch(()=>{})),nn(!1),de.current=!0},[d]),Mr=C(()=>{Ee.current=!0,Me(!1),de.current=!0},[]),Ar=C(()=>{Ee.current=!0,Me(!1),de.current=!0,ne.current=null;const e=d.current;if(e){try{e.currentTime=0}catch{}e.play().catch(()=>{})}},[d]),Jn=C(()=>{N!=null&&(Ee.current=!0,Me(!1),de.current=!0,Se(N),we(i,N))},[N,i,we]),Zn=C(()=>{ve!=null&&(Ee.current=!0,Me(!1),Ge(!1),de.current=!0,U(ve),Se(1),we(ve,1))},[ve,we]),Pr=C(async()=>{if(R)try{await gt.mutateAsync({id:R,status:"Completed"}),Ge(!1),Me(!1),H("/")}catch{}},[R,gt,H]);_(()=>{de.current=!1,_n.current=null,nn(!1),Cn(!1),Un(0),qn(!1),yt.current=!1,ne.current=null,Mt.current=`${R}:${i}:${f}`,Tn.current=0},[R,i,f]),_(()=>{jn&&(qn(!0),yt.current=!0)},[jn,R,i,f]),_(()=>{if(!Ke||de.current)return;const e=`${R}:${i}:${f}`;if(_n.current===e)return;_n.current=e;const n=Ke,s=n.currentTime??0,o=n.duration??0;dr(s,o)&&(Un(s),nn(!0))},[Ke,R,i,f]),_(()=>{if(!Qe||de.current||Ee.current||Ne||Re||xe)return;const e=`${R}:${i}:${f}`;if(Bt.current!==e){if(!Sn){Wn||(Bt.current=e);return}if(h){Bt.current=e,Me(!0);return}if(!(!r||Ye<0||re.length===0)){if(Bt.current=e,N==null&&ve==null){r&&re.length>0&&(Kn(`${r.title} — Season ${i}`),Ge(!0),Ee.current=!0,de.current=!0);return}Me(!0)}}},[Qe,Sn,Wn,Ne,Re,xe,h,N,ve,r,Ye,re.length,R,i,f]),_(()=>{(Ne||xe)&&d.current&&d.current.pause()},[Ne,xe,d]),_(()=>{const e=d.current;return()=>{Xe.current&&clearTimeout(Xe.current),e&&!e.ended&&$e(e.currentTime,e.duration||0)}},[$e,d]);const xn=C(e=>{let n=null,s=!0;try{n=localStorage.getItem("tvLastSubtitle"),s=localStorage.getItem("tvSubtitlesEnabled")!=="false"}catch{}return On(e,{lastKey:n,enabled:s})},[]),En=C(e=>{if(!(e<0))try{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e))}catch{}},[]),er=C(e=>{if(e.length===0)return 0;let n=null;try{n=localStorage.getItem("tvLastAudio")}catch{}if(n){const s=e.findIndex(g=>Rn(g)===n);if(s>=0)return s;const o=n.indexOf("|||"),m=o>=0?n.slice(0,o):n,P=o>=0?n.slice(o+3):n,v=e.findIndex(g=>g.language===m||g.label===P);if(v>=0)return v}return On(e,{lastKey:null,enabled:!0})},[]),{data:tr}=Es(R||void 0),nr=Ce(()=>(tr?.progress??[]).filter(n=>n.season===i&&(n.completed===!0||n.completed===1||Ln(n.currentTime,n.duration))).map(n=>String(n.episode)),[tr,i]),rr=Ce(()=>re.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})),[re]),sr=Ce(()=>(r?.genres??[]).map(e=>e.name).slice(0,5),[r]),Nn=Ce(()=>[r?.year,r?.status,r?.number_of_seasons?`${r.number_of_seasons} Season${r.number_of_seasons>1?"s":""}`:null,r?.number_of_episodes?`${r.number_of_episodes} Episodes`:null].filter(Boolean),[r]);_(()=>{if(ie.length!==0&&!ie.some(e=>e.id===$)){const e=ie.find(n=>n.tier==="direct")?.id??ie[0].id;Dt(e);try{localStorage.setItem("tvProvider",e)}catch{}}},[ie,$]),_(()=>{if(j.length!==0&&!j.includes(J)){Wt(j[0]);try{localStorage.setItem("movyServer",j[0])}catch{}}},[j,J]),_(()=>{if(!u){L(null),Fe([]),kt(""),K(""),He("");return}const e=Number(u),n=O||"tv";he(!0),L(null),Fe([]),kt(""),K(""),He("");const s=parseInt(X.current.get("s")||"",10),o=parseInt(X.current.get("e")||"",10);U(isNaN(s)?1:s),Se(isNaN(o)?1:o),ge(0),tt.tv.details.query({type:n,id:String(e)}).then(m=>{const P={id:m.id,title:m.title||"",overview:m.overview||"",vote_average:m.vote_average,year:m.year,poster:m.poster,backdrop:m.backdrop,imdb_id:m.imdb_id||void 0,adult:m.adult,seasons:m.seasons,number_of_seasons:m.number_of_seasons};L(P),he(!1),P.seasons&&P.seasons.length>0&&isNaN(s)&&U(P.seasons[0].season_number)}).catch(()=>{he(!1)})},[u,O]),_(()=>{if(!r||!u)return;if(!(r.seasons!==void 0||r.number_of_seasons!==void 0)){Ve([]);return}const n=parseInt(w.get("e")||"",10);tt.tv.episodes.query({id:String(u),season:String(i)}).then(s=>{const o=(s.episodes||[]).map(m=>({episode_number:m.episode_number,name:m.name||"",vote_average:m.vote_average,overview:m.overview||"",still_path:m.still_path||""}));if(Ve(o),o.length>0){const m=!isNaN(n)&&o.find(P=>P.episode_number===n)?n:o[0].episode_number;Se(m)}}).catch(()=>{})},[r,u,i,w]),_(()=>{!r||!u||h||tt.tv.episodes.query({id:String(u),season:String(i)}).then(e=>{const n=(e.episodes||[]).map(s=>({episode_number:s.episode_number,name:s.name||"",vote_average:s.vote_average,overview:s.overview||"",still_path:s.still_path||""}));Ve(n),n.length>0&&!n.find(s=>s.episode_number===f)&&Se(n[0].episode_number)}).catch(()=>{})},[i,r,u,h,f]),_(()=>{if(!A||!r||!u)return;fetch(`/api/tv/embed/${$}/${h?"movie":"tv"}/${u}?season=${i}&episode=${f}`).then(n=>n.json()).then(n=>{if(n.url)return He(n.url),fetch(`/api/resolve?url=${encodeURIComponent(n.url)}`).then(s=>s.json()).then(s=>{s.finalUrl&&He(s.finalUrl)})}).catch(()=>{})},[$,r,u,i,f,h,A]);const on=C(async()=>{if(!r||!u||!$||A||r.adult&&!ht)return;const e=`${R}:${i}:${f}`;zt.current.length>0?K(""):(M(!0),K(""),Fe([]),ge(0),st([]),ze([]));try{const s=await F.fetchQuery({queryKey:sn(i,f),queryFn:()=>an(i,f),staleTime:3e5,gcTime:18e5});if(Mt.current!==e)return;if(M(!1),!s.valid||!s.sources?.length){K(s.error?`${s.error}`:j.length>0?`No streams from ${J}. Try another server.`:"No streams available.");return}Fe(s.sources),kt(e),jt("all"),ge(0),s.referer&&fn(s.referer);const o=s.audioTracks||[];st(o),We(o.length>0?er(o):0);const m=s.subtitles||[];if(ze(m),m.length>0){const g=xn(m);Q(g),En(g)}else Q(-1);const P=h?"movie":"tv",v=u;tt.tv.subtitles.query({type:P,tmdbId:String(v),season:String(i),episode:String(f)}).then(g=>{if(Mt.current!==e)return;const se=Array.isArray(g.subtitles)?g.subtitles:[];se.length!==0&&ze(be=>{const V=[...be,...se.filter(B=>!be.some(k=>k.url===B.url))];if(be.length===0){const B=xn(V);Q(B),En(B)}return V})}).catch(()=>{}),K("")}catch{if(Mt.current!==e)return;M(!1),K("Failed to load streams.")}},[r,u,$,i,f,h,A,ht,j,J,xn,En,er,R,F,sn,an]),wn=C(e=>{const n=e.toLowerCase();Wt(n);try{localStorage.setItem("movyServer",n)}catch{}K("")},[]),Lr=C(e=>{Dt(e);try{localStorage.setItem("tvProvider",e)}catch{}},[]);_(()=>{$&&r&&!A&&on()},[$,r,on,A]),_(()=>{if(!d.current||(le.current&&(le.current.destroy(),le.current=null),A))return;let e=!1;if(_e){const v=d.current;return v&&(v.pause(),v.removeAttribute("src"),v.load(),v.src="/av-sync-test.mp4",bt.current||v.play().catch(()=>{})),()=>{e=!0}}const n=Le==="all"?oe:oe.filter(v=>v.type===Le),s=Ct===`${R}:${i}:${f}`&&n[at]?.url||"";if(!s){try{d.current?.pause()}catch{}return}const o=d.current;if(Mt.current===`${R}:${i}:${f}`&&ne.current==null&&!bt.current)try{!o.ended&&o.currentTime>1&&(ne.current=o.currentTime)}catch{}o.pause(),o.removeAttribute("src"),o.load(),S.actions.resetMediaState();const m=`/api/tv/stream-proxy?url=${encodeURIComponent(s)}&referer=${encodeURIComponent(ot)}`;n[at]?.type==="hls"?(async()=>{const v=await Ns();if(!e)if(v&&v.isSupported()){const g=new v({enableWorker:!0});le.current=g,g.on(v.Events.ERROR,(V,B)=>{B.fatal&&(K(`Stream failed (${B.details}). Try another source or reload.`),M(!1),g.destroy(),le.current=null)}),g.loadSource(m),g.attachMedia(o);const se=()=>{let V=!1,B=0;try{V=localStorage.getItem("tvSubtitlesEnabled")==="true";const k=parseInt(localStorage.getItem("tvSelectedSubtitle")||"0",10);!isNaN(k)&&k>=0&&(B=k)}catch{}return{enabled:V,index:B}},be=()=>{if(typeof g.subtitleTrack!="number")return;if(ce.current.length>0){g.subtitleTrack=-1;return}const V=Array.isArray(g.subtitleTracks)?g.subtitleTracks:[];if(V.length===0){g.subtitleTrack=-1;return}const B=se();if(B.enabled){const k=B.index<V.length?B.index:0;g.subtitleTrack=k,Q(k),mt()}else g.subtitleTrack=-1};va(g,v.Events,{getWant:()=>Ht.current,onResolve:V=>We(V)}),g.on(v.Events.MANIFEST_PARSED,()=>{be(),te.current!=null&&(o.currentTime=te.current,te.current=null),St(),!bt.current&&yt.current&&o.play().catch(()=>{})}),g.on(v.Events.SUBTITLE_TRACKS_UPDATED,()=>{be()}),g.on(v.Events.SUBTITLE_TRACK_SWITCH,(V,B)=>{if(ce.current.length>0){if(B.id!==-1)try{g.subtitleTrack=-1}catch{}return}const k=Array.isArray(g.subtitleTracks)?g.subtitleTracks:[];if(k.length!==0){if(B.id===-1){const Y=se();if(Y.enabled){const G=Y.index<k.length?Y.index:0;g.subtitleTrack=G;return}}Q(B.id),mt()}})}else ws(o)&&(o.src=m,te.current!=null&&(o.currentTime=te.current,te.current=null),St(),!bt.current&&yt.current&&o.play().catch(()=>{K("Failed to play stream. Try another source.")}))})():(o.src=m,te.current!=null&&(o.currentTime=te.current,te.current=null),St(),!bt.current&&yt.current&&o.play().catch(()=>{K("Failed to play stream. Try another source.")}));const P=()=>{const se=o.error?.code===4?"Video source not supported or not found":"Failed to load video stream";K(`${se}. The source may be invalid or expired. Try switching source or reloading.`),M(!1)};return o.addEventListener("error",P),()=>{e=!0,o.removeEventListener("error",P)}},[oe,Ct,at,Le,$,ot,A,d,_e,R,i,f,St,mt,S.actions]),_(()=>{if(!Qe||Ne||xe||Re||At||A||_e)return;const e=d.current;!e||!e.paused||e.ended||e.readyState<1||(St(),e.play().catch(()=>{}))},[Qe,Ne,xe,Re,At,A,_e,St,d]),_(()=>{const e=le.current;!e||typeof e.audioTrack!="number"||(e.audioTrack=Te)},[Te]),_(()=>{const e=le.current;!e||typeof e.subtitleTrack!="number"||!Array.isArray(e.subtitleTracks)||e.subtitleTracks.length===0||ce.current.length>0||(y>=0?e.subtitleTrack=y:e.subtitleTrack=-1)},[y]),_(()=>{const e=d.current;if(!(!e||A)&&(e.querySelectorAll("track").forEach(n=>n.remove()),ce.current=[],pe.length!==0&&(pe.forEach(n=>{const s=document.createElement("track");s.kind="subtitles",s.label=n.label||n.language||"Unknown",s.srclang=n.language||n.label||"en";const o=`/api/subtitle-proxy?url=${encodeURIComponent(n.url)}&referer=${encodeURIComponent(ot)}`;s.src=o,s.addEventListener("load",()=>{const m=ce.current.indexOf(s),P=s.track;if(P&&m>=0){const v=m===it.current;P.mode=v&&!ee.current?"showing":"hidden"}}),e.appendChild(s),ce.current.push(s)}),pe.length>0)))try{const n=le.current;n&&typeof n.subtitleTrack=="number"&&n.subtitleTrack!==-1&&(n.subtitleTrack=-1)}catch{}},[pe,ot,A,$,d]),_(()=>{const e=d.current;if(!e||A)return;const n=le.current;ce.current.length>0&&n&&typeof n.subtitleTrack=="number"&&Array.isArray(n.subtitleTracks)&&n.subtitleTracks.length>0&&(n.subtitleTrack=-1);const s=()=>{const P=Dn(S.state.subtitleFontSize,e.clientHeight||720),v=Math.max(0,Math.min(100,100-S.state.subtitlePosition)),g=()=>{const k=P*16,Y=e.videoHeight||e.clientHeight||720,G=e.videoWidth||e.clientWidth||1280;return{step:k*1.3/Y*100,chars:Math.max(20,Math.floor(G/(k*.55)))}},se=(k,Y)=>{const G=k;G.snapToLines=!1,G.line=Y},be=k=>{if(!k.cues)return;Array.from(k.cues).forEach(ue=>se(ue,v));const Y=Array.from(k.activeCues??[]);if(Y.length<=1){Y.forEach(ue=>se(ue,v));return}const{step:G,chars:W}=g();let Je=v;for(let ue=Y.length-1;ue>=0;ue--){const De=String(Y[ue].text??"").replace(/<[^>]*>/g,"").split(`
|
|
3
|
-
`).reduce((dn,Rt)=>dn+Math.max(1,Math.ceil(Rt.length/W)),0);Je=Math.max(0,Je-De*G),se(Y[ue],Je),Je-=G*.4}},V=ce.current;if(V.length>0){V.forEach((k,Y)=>{const G=k.track;if(!G)return;const W=Y===y;G.mode=W&&!I?"showing":"hidden",W&&!I&&be(G)});return}const B=Array.from(e.textTracks);B.length!==0&&B.forEach((k,Y)=>{const G=Y===y;k.mode=G&&!I?"showing":"hidden",G&&!I&&be(k)})};s();const o=()=>s();e.textTracks.addEventListener("addtrack",o),e.addEventListener("loadedmetadata",s,{once:!0});const m=window.setTimeout(s,600);return()=>{e.textTracks.removeEventListener("addtrack",o),e.removeEventListener("loadedmetadata",s),window.clearTimeout(m)}},[y,pe,A,$,d,I,S.state.subtitleFontSize,S.state.subtitlePosition]),_(()=>{if(!I)return;const e=d.current,n=qt.current;if(!e||!n)return;const s=Be/1e3,o=ut/1e3,m=new Set;let P=[],v=-1,g=-1,se=-1,be=-1,V=0,B=0,k=!1;const Y=()=>{const z=it.current;if(z<0)return null;const Oe=ce.current;return Oe.length>0?Oe[z]?.track??null:Array.from(e.textTracks)[z]??null},G=(z,Oe)=>{const me=z.cues;if(!me||me.length===0)return Array.from(z.activeCues??[]);let Ze=0,et=me.length;for(;Ze<et;){const Ie=Ze+et>>>1;me[Ie].endTime+s<Oe?Ze=Ie+1:et=Ie}const $t=[];for(let Ie=Ze;Ie<me.length;Ie++){const un=me[Ie];if(un.startTime+s>Oe)break;un.endTime+s>=Oe&&$t.push(un)}return $t},W=()=>{const z=Y(),Oe=e.currentTime-o,me=z?G(z,Oe):[],Ze=e.clientWidth,et=e.clientHeight,$t=e.videoWidth,Ie=e.videoHeight;if(me.length===P.length&&me.every((Bn,Mn)=>Bn===P[Mn])&&Ze===v&&et===g&&$t===se&&Ie===be||(P=me,v=Ze,g=et,se=$t,be=Ie,n.textContent="",me.length===0))return;const lr={fontSize:Dn(S.state.subtitleFontSize,et),position:S.state.subtitlePosition,bgOpacity:S.state.subtitleBgOpacity,bgColor:S.state.subtitleBgColor,textColor:S.state.subtitleTextColor,edge:S.state.subtitleEdge,bold:S.state.subtitleBold},Or=is(lr),Vr=ls(e,lr.position);me.forEach((Bn,Mn)=>{const cr=String(Bn.text??"");if(!cs(cr).trim())return;const An=document.createElement("div"),Fr=(me.length-1-Mn)*1.7;An.style.cssText=`${Or}
|
|
4
|
-
bottom: calc(${Vr}px + ${Fr}em);`,An.innerHTML=ds(cr),n.appendChild(An)})},Je=()=>{Array.from(e.textTracks).forEach(z=>{m.has(z)||(m.add(z),z.addEventListener("cuechange",W))})},ue=()=>{Je(),W()},In=()=>{if(k||B)return;const z=()=>{B=0,!(k||e.paused||e.ended)&&(W(),In())};B=window.requestAnimationFrame(z)},De=e,dn=()=>{V=0,W(),!k&&De.requestVideoFrameCallback&&(V=De.requestVideoFrameCallback(dn))},Rt=()=>{W(),De.requestVideoFrameCallback?V||(V=De.requestVideoFrameCallback(dn)):In()};Je(),e.textTracks.addEventListener("addtrack",ue),e.textTracks.addEventListener("removetrack",ue),e.addEventListener("timeupdate",W),e.addEventListener("seeked",W),e.addEventListener("loadedmetadata",W),e.addEventListener("play",Rt);const or=Array.from(e.querySelectorAll("track"));or.forEach(z=>z.addEventListener("load",W));const ir=typeof ResizeObserver>"u"?null:new ResizeObserver(()=>W());return ir?.observe(e),W(),Rt(),()=>{k=!0,m.forEach(z=>z.removeEventListener("cuechange",W)),e.textTracks.removeEventListener("addtrack",ue),e.textTracks.removeEventListener("removetrack",ue),e.removeEventListener("timeupdate",W),e.removeEventListener("seeked",W),e.removeEventListener("loadedmetadata",W),e.removeEventListener("play",Rt),or.forEach(z=>z.removeEventListener("load",W)),ir?.disconnect(),B&&window.cancelAnimationFrame(B),V&&De.cancelVideoFrameCallback&&De.cancelVideoFrameCallback(V),n.textContent=""}},[I,Be,y,pe,ut,d,S.state.subtitleFontSize,S.state.subtitlePosition,S.state.subtitleBgOpacity,S.state.subtitleBgColor,S.state.subtitleTextColor,S.state.subtitleEdge,S.state.subtitleBold]);const ln=()=>{L(null),Fe([]),He(""),H(-1)},Rr=C(e=>{U(e),Se(1),we(e,1)},[we]),cn=!h&&r?.seasons&&r.seasons.length>1?t("label",{className:p.sidebarSeason,children:[t("span",{children:"Season"}),t("select",{value:i,onChange:e=>Rr(parseInt(e.target.value,10)||1),className:p.select,children:r.seasons.map(e=>t("option",{value:e.season_number,children:["Season ",e.season_number," (",e.episode_count," ep)"]},e.season_number))})]}):null,_t=C(e=>{const n=parseInt(e,10);if(!isNaN(n)){try{d.current?.pause()}catch{}Se(n),we(i,n)}kn(!1)},[i,we,d]);_(()=>{if(h)return;const e=n=>{n.target.closest('input, textarea, button, select, a, [role="button"], [contenteditable="true"]')||n.key.toLowerCase()==="n"&&(N!=null?_t(String(N)):qr.error("No next episode available"))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[h,N,_t]);const $r=e=>{We(e);try{const s=Pe[e];s&&localStorage.setItem("tvLastAudio",Rn(s))}catch{}const n=le.current;n&&n.audioTrack!==void 0&&(n.audioTrack=e)},Dr=e=>{Q(e);try{if(e===-1)localStorage.setItem("tvSubtitlesEnabled","false");else{localStorage.setItem("tvSubtitlesEnabled","true"),localStorage.setItem("tvSelectedSubtitle",String(e));const m=pe[e];m&&localStorage.setItem("tvLastSubtitle",Rn(m))}}catch{}const n=d.current,s=le.current;if(s&&typeof s.subtitleTrack=="number"&&Array.isArray(s.subtitleTracks)&&s.subtitleTracks.length>0&&(s.subtitleTrack=ce.current.length>0||e<0?-1:e),!n)return;const o=ce.current;if(o.length>0){o.forEach((m,P)=>{const v=m.track;if(!v)return;const g=P===e;v.mode=g&&!I?"showing":"hidden"});return}Array.from(n.textTracks).forEach((m,P)=>{const v=P===e;m.mode=v&&!I?"showing":"hidden"})},Lt=C(()=>{if(!r)return;const e=d.current,n=h?"":`S${String(i).padStart(2,"0")}E${String(f).padStart(2,"0")}`;tt.discord.tvPresence.mutate({title:r.title,episodeLabel:n,isPlaying:e?!e.paused&&!e.ended:!0,thumbnail:r.poster,currentTime:e?e.currentTime:0,duration:e&&e.duration||0,isAdult:r.adult===!0,sessionId:fe.current}).catch(()=>{}),tt.discord.heartbeat.mutate({sessionId:fe.current}).catch(()=>{})},[r,h,i,f,d]);_(()=>{if(!r)return;Lt();const e=window.setInterval(()=>{const n=d.current;(!n||!n.paused)&&Lt()},15e3);return()=>window.clearInterval(e)},[Lt,r,d]),_(()=>{if(!r||A||rt||q||oe.length===0)return;const e=d.current;if(!e)return;const n=()=>Lt();return e.addEventListener("play",n),e.addEventListener("pause",n),e.addEventListener("seeked",n),()=>{e.removeEventListener("play",n),e.removeEventListener("pause",n),e.removeEventListener("seeked",n)}},[r,A,rt,q,oe,Lt,d]),_(()=>{const e=fe.current,n=()=>Kr(e),s=()=>n();return window.addEventListener("pagehide",s),window.addEventListener("beforeunload",s),()=>{window.removeEventListener("pagehide",s),window.removeEventListener("beforeunload",s),n()}},[]);const ar=Le==="all"?oe:oe.filter(e=>e.type===Le);return _(()=>{if(!r){document.title="TV & Movies - dango";return}document.title=h?`${r.title} - dango`:`${r.title} - Season ${i} Episode ${f} - dango`},[r,h,i,f]),_(()=>{if(!r||h)return;const e=new URLSearchParams(w),n=e.get("s"),s=e.get("e"),o=String(i),m=String(f);n===o&&s===m||(e.set("type",w.get("type")||"tv"),e.set("s",o),e.set("e",m),H(`${window.location.pathname}?${e.toString()}`,{replace:!0}))},[r,h,i,f,w,H]),t("div",{className:nt.playerPageLayout,children:[t("aside",{className:nt.episodeSidebar,children:r?h?t("div",{className:p.sidebarPosterCard,children:[r.poster&&t("img",{src:`https://image.tmdb.org/t/p/w342${r.poster}`,alt:r.title,loading:"lazy",decoding:"async"}),t("div",{className:p.sidebarPosterMeta,children:[t("strong",{children:r.title}),t("span",{children:r.year})]})]}):t(us,{episodes:rr,currentEpisode:String(f),watchedEpisodes:nr,onEpisodeClick:_t,header:cn}):h?t("div",{className:p.statusMsg,children:[t(D,{name:"spinner",className:p.spinner})," Loading..."]}):t(ms,{variant:"sidebar"})}),t("div",{className:nt.playerMain,children:[r&&t("div",{className:p.playerSection,onContextMenu:e=>e.preventDefault(),style:r.adult&&!ht?{filter:"blur(14px)",pointerEvents:"none",userSelect:"none"}:void 0,children:A&&Tt?t("iframe",{src:Tt,className:p.videoIframe,allow:"autoplay; fullscreen",allowFullScreen:!0}):!A&&(ar.length>0||rt)?t(Ae,{children:[q&&t("div",{className:`${p.statusMsg} ${p.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:[t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:q}),t("button",{className:p.retryButton,onClick:on,children:"Retry"})]}),j.length>0&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center",marginTop:4},children:[t("span",{style:{fontSize:"0.8rem",opacity:.9,fontWeight:600},children:"Servers:"}),j.map(e=>t("button",{onClick:()=>wn(e),className:p.retryButton,style:{padding:"4px 8px",fontSize:"0.75rem",textTransform:"capitalize",background:J===e?"var(--accent)":void 0,color:J===e?"white":void 0},children:e},e))]})]}),t(fa,{player:S,title:r.title,episodeLabel:h?void 0:`S${i} E${f}`,audioTracks:Pe,selectedAudioTrack:Te,onAudioTrackChange:$r,subtitles:pe,selectedSubtitle:y,onSubtitleChange:Dr,streams:ar,qualityIdx:at,onQualityChange:ge,onBack:ln,movyServers:j,selectedMovyServer:J,onMovyServerSelect:wn,isMovySource:j.length>0,videoDelayEnabled:qe,onVideoDelayToggle:e=>{lt(e);try{localStorage.setItem("playerVideoDelayEnabled",String(e))}catch{}},videoDelayMs:Ue,onVideoDelayChange:Et,onCalibrateAvSync:It,subtitleDelayMs:Be,onSubtitleDelayChange:Yt,showNextEpisodeButton:fr&&!Ne&&!xe&&!Re,onNextEpisode:Jn,isLoading:rt,children:[t("video",{ref:d,autoPlay:Qe&&!At,playsInline:!0,disablePictureInPicture:!0,className:`${p.video} ${E?p.videoHidden:""}`,onTimeUpdate:xr,onEnded:()=>{_e||Er()},onPlay:Nr,onPause:wr,onSeeked:()=>{Qn.current=Date.now(),Pt()},onLoadedMetadata:Ir,onVolumeChange:S.actions.onVolumeChange,onWaiting:S.actions.onWaiting,onPlaying:S.actions.onPlaying,onCanPlay:S.actions.onCanPlay,onContextMenu:e=>e.preventDefault(),onError:()=>{K("Video failed to load. Try another server or reload."),M(!1)}}),t("canvas",{ref:Ut,className:`${p.delayCanvas} ${E?p.delayCanvasActive:""}`}),I&&t("div",{ref:qt,className:p.subtitleOverlay}),t(hs,{isOpen:bn,ms:Ue,onChange:Et,onApply:Qt,onClose:dt,testClipActive:_e,onTestClip:Gt})]})]}):q&&!A?t("div",{className:`${p.statusMsg} ${p.error}`,style:{flexDirection:"column",alignItems:"stretch",gap:8},children:[t("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[t("span",{style:{flex:1},children:q}),t("button",{className:p.retryButton,onClick:on,children:"Retry"})]}),j.length>0&&t("div",{style:{display:"flex",flexWrap:"wrap",gap:6,alignItems:"center",marginTop:4},children:[t("span",{style:{fontSize:"0.8rem",opacity:.9,fontWeight:600},children:"Servers:"}),j.map(e=>t("button",{onClick:()=>wn(e),className:p.retryButton,style:{padding:"4px 8px",fontSize:"0.75rem",textTransform:"capitalize",background:J===e?"var(--accent)":void 0,color:J===e?"white":void 0},children:e},e))]})]}):null}),r&&t(ps,{showTheater:!1}),cn&&t("div",{className:p.mobileSeasonRow,children:cn}),r&&t("div",{className:p.providerSelectWrap,children:t("label",{className:p.controlLabel,children:["Source",t("select",{value:$,onChange:e=>Lr(e.target.value),className:p.select,disabled:ie.length===0,children:gn?t("option",{value:"",children:"Loading…"}):ie.length===0?t("option",{value:"",children:"No providers available"}):t(Ae,{children:[je.length>0&&t("optgroup",{label:"Direct HLS",children:je.map(e=>t("option",{value:e.id,children:e.label},e.id))}),T.length>0&&t("optgroup",{label:"Embeds",children:T.map(e=>t("option",{value:e.id,children:e.label},e.id))})]})})]})}),r&&t("div",{className:nt.playerInfoContainer,children:[t("div",{className:nt.playerInfoHeader,children:[t("div",{className:nt.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:nt.videoTitleSection,children:[t("div",{className:ye.titleContainer,children:[t("h1",{children:r.title}),t("div",{className:p.meta,children:[t("span",{className:p.year,children:r.year}),r.vote_average!=null&&r.vote_average>0&&t("span",{className:p.rating,children:[t(D,{name:"star",size:12}),Number(r.vote_average).toFixed(1)]}),t("span",{className:`${p.typeBadge} ${p[h?"movie":"tv"]}`,children:h?"Movie":"TV Show"})]}),sr.length>0&&t("div",{className:p.genreRow,children:sr.map(e=>t("span",{className:p.genreChip,children:e},e))}),Nn.length>0&&t("div",{className:p.metaRow,children:Nn.map((e,n)=>t("span",{children:[e,n<Nn.length-1?" · ":""]},`${e}-${n}`))})]}),t("div",{className:ye.controls,children:[t("button",{className:`${ye.watchlistBtn} ${Zt?ye.inList:""}`,onClick:gr,disabled:pr,type:"button",children:[Zt?t(D,{name:"check",size:14}):t(D,{name:"plus",size:14}),Zt?"In Watchlist":"Add to Watchlist"]}),!h&&t(Ae,{children:[t("button",{className:`${ye.watchlistBtn}`,onClick:()=>yn!=null&&_t(String(yn)),disabled:yn==null,type:"button",children:[t(D,{name:"chevron-left",size:14}),"Prev EP"]}),t("button",{className:`${ye.watchlistBtn}`,onClick:()=>N!=null&&_t(String(N)),disabled:N==null,type:"button",children:["Next EP",t(D,{name:"chevron-right",size:14})]}),!h&&t("button",{className:`${ye.watchlistBtn} ${ye.modeToggleBtn} ${vt?ye.modeToggleActive:""}`,onClick:()=>Cr(!vt),type:"button","aria-pressed":vt,children:vt?"AUTOPLAY: ON":"AUTOPLAY: OFF"}),Sr&&t("button",{className:`${ye.watchlistBtn}`,onClick:()=>kn(!0),type:"button",children:[t(D,{name:"list-ul",size:14}),"Episodes"]})]})]})]})]}),t("div",{className:ye.descriptionSection,children:[t("h3",{children:"Synopsis"}),t(Bs,{text:r.overview,emptyText:"No description available."})]}),t("button",{className:ye.detailsToggleBtn,onClick:()=>br(!rn),type:"button",children:[rn?t(D,{name:"chevron-up"}):t(D,{name:"chevron-down"}),rn?"Hide Details":"Show Details"]}),rn&&t("div",{className:p.detailGrid,children:[r.first_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:h?"Release Date":"First Air Date"}),t("span",{children:r.first_air_date})]}),r.last_air_date&&t("div",{className:p.detailItem,children:[t("strong",{children:"Last Air Date"}),t("span",{children:r.last_air_date})]}),r.networks&&r.networks.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Networks"}),t("span",{children:r.networks.map(e=>e.name).join(", ")})]}),r.created_by&&r.created_by.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Created By"}),t("span",{children:r.created_by.map(e=>e.name).join(", ")})]}),r.episode_run_time&&r.episode_run_time.length>0&&t("div",{className:p.detailItem,children:[t("strong",{children:"Episode Runtime"}),t("span",{children:[r.episode_run_time[0]," min"]})]}),r.imdb_id&&t("div",{className:p.detailItem,children:[t("strong",{children:"IMDb"}),t("a",{href:`https://www.imdb.com/title/${r.imdb_id}`,target:"_blank",rel:"noopener noreferrer",className:p.imdbLink,children:"View on IMDb"})]})]})]}),!h&&t(gs,{isOpen:yr,onClose:()=>kn(!1),episodes:rr,currentEpisode:String(f),watchedEpisodes:nr,onEpisodeClick:_t,header:cn}),r?.adult&&!ht&&t(mn,{isOpen:!0,title:"Content Warning",onClose:ln,children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:"This title contains mature content intended for adult audiences."}),t("p",{children:["By proceeding, you confirm that you are ",t("strong",{children:"18 years of age or older"})," ","(or the age of majority in your jurisdiction) and wish to view this content."]}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(ke,{variant:"secondary",onClick:ln,children:"Go Back"}),t(ke,{onClick:Xt,children:"I'm 18+, Continue"})]})]})}),t(mn,{isOpen:Ne,onClose:Xn,title:"Resume Watching",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:["You were at ",t("strong",{children:Tr(ft)})]}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center"},children:[t(ke,{variant:"secondary",onClick:Xn,children:"Start from Beginning"}),t(ke,{onClick:Br,children:"Resume"})]})]})}),t(mn,{isOpen:xe,onClose:Mr,title:h?"Movie Completed":"Episode Completed",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t("p",{children:h?t(Ae,{children:"You've already watched this movie."}):t(Ae,{children:["You've already watched"," ",t("strong",{children:["Season ",i," Episode ",f]}),". Would you like to continue?"]})}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(ke,{variant:"secondary",onClick:Ar,children:"Replay"}),N!=null?t(ke,{onClick:Jn,children:["Watch EP ",N]}):ve!=null?t(ke,{onClick:Zn,children:["Start Season ",ve]}):null]})]})}),t(mn,{isOpen:Re,onClose:()=>Ge(!1),title:h?"Movie Completed!":ve!=null?"Season Complete!":"Show Completed!",children:t("div",{style:{padding:"1rem",textAlign:"center"},children:[t(D,{name:"check-circle",size:48,style:{color:"var(--accent-lighter)",marginBottom:"0.5rem"}}),t("p",{style:{fontSize:"1.1rem",fontWeight:600},children:vr}),t("p",{style:{color:"var(--text-secondary)"},children:h?"You finished this movie!":ve!=null?`You finished Season ${i}.`:"Congratulations! You finished all available episodes."}),t("div",{style:{marginTop:"1rem",display:"flex",gap:"10px",justifyContent:"center",flexWrap:"wrap"},children:[t(ke,{variant:"secondary",onClick:()=>Ge(!1),children:"Close"}),ve!=null?t(ke,{onClick:Zn,children:["Start Season ",ve]}):t(Ae,{children:[t(ke,{onClick:()=>{Ge(!1),ln()},children:"Back to Details"}),Zt&&t(ke,{onClick:Pr,disabled:gt.isPending,children:gt.isPending?"Saving...":"Move to Completed"})]})]})]})}),!r&&t("div",{className:p.statusMsg,children:[t(D,{name:"spinner",className:p.spinner})," Loading..."]})]})]})};export{Mo as default};
|