@streamapp/stream 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -460,4 +460,4 @@ void main() {
460
460
  col.a = 1.0;
461
461
  gl_FragColor = col;
462
462
  }
463
- `;function TA(e){const t=e.replace("#","");return[parseInt(t.slice(0,2),16)/255,parseInt(t.slice(2,4),16)/255,parseInt(t.slice(4,6),16)/255]}function RA(e,t,n){const r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),r}function TX({speed:e=5,scale:t=1,color:n="#7B7481",noiseIntensity:r=1.5,rotation:a=0,colorTransitionMs:o=0,className:c}){const d=p.useRef(null),h=p.useRef({speed:e,scale:t,color:n,noiseIntensity:r,rotation:a,colorTransitionMs:o});h.current={speed:e,scale:t,color:n,noiseIntensity:r,rotation:a,colorTransitionMs:o};const m=p.useRef(()=>{});return p.useEffect(()=>{const x=d.current;if(!x)return;const g=x.getContext("webgl",{antialias:!0,alpha:!1,powerPreference:"low-power"});if(!g)return;const v=g.createProgram();g.attachShader(v,RA(g,g.VERTEX_SHADER,NX)),g.attachShader(v,RA(g,g.FRAGMENT_SHADER,EX)),g.linkProgram(v),g.useProgram(v);const S=g.createBuffer();g.bindBuffer(g.ARRAY_BUFFER,S),g.bufferData(g.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),g.STATIC_DRAW);const b=g.getAttribLocation(v,"aPos");g.enableVertexAttribArray(b),g.vertexAttribPointer(b,2,g.FLOAT,!1,0,0);const j={time:g.getUniformLocation(v,"uTime"),color:g.getUniformLocation(v,"uColor"),speed:g.getUniformLocation(v,"uSpeed"),scale:g.getUniformLocation(v,"uScale"),rotation:g.getUniformLocation(v,"uRotation"),noise:g.getUniformLocation(v,"uNoiseIntensity")},C=TA(h.current.color),k=()=>{const B=h.current;g.uniform1f(j.speed,B.speed),g.uniform1f(j.scale,B.scale),g.uniform1f(j.rotation,B.rotation),g.uniform1f(j.noise,B.noiseIntensity)},N=window.matchMedia("(prefers-reduced-motion: reduce)").matches,T=()=>{const B=Math.min(window.devicePixelRatio||1,2),G=Math.max(1,Math.floor(x.clientWidth*B)),I=Math.max(1,Math.floor(x.clientHeight*B));(x.width!==G||x.height!==I)&&(x.width=G,x.height=I,g.viewport(0,0,G,I))},R=new ResizeObserver(T);R.observe(x),T();let A=0;const O=(B=0)=>{const G=h.current,I=TA(G.color),H=G.colorTransitionMs??0;if(H<=0||document.hidden)C[0]=I[0],C[1]=I[1],C[2]=I[2];else if(B>0){const ee=1-Math.exp(-B/(H/3));C[0]+=(I[0]-C[0])*ee,C[1]+=(I[1]-C[1])*ee,C[2]+=(I[2]-C[2])*ee}k(),g.uniform3f(j.color,C[0],C[1],C[2]),g.uniform1f(j.time,A),g.drawArrays(g.TRIANGLE_STRIP,0,4)};m.current=O,O();let z=0,_=0;const V=B=>{if(z=requestAnimationFrame(V),document.hidden)return;const G=_?B-_:16;_=B,N||(A+=.1*(G/1e3)),O(G)};return z=requestAnimationFrame(V),()=>{cancelAnimationFrame(z),R.disconnect(),g.deleteProgram(v),g.deleteBuffer(S),m.current=()=>{}}},[]),p.useEffect(()=>{m.current(0)},[e,t,n,r,a,o]),l.jsx("canvas",{ref:d,className:W("block size-full",c)})}function AA(e){(!Number.isFinite(e)||e<0)&&(e=0);const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}const MA=32,RX=40;function DA({children:e,className:t}){const n=p.useRef(null),r=p.useRef(null),[a,o]=p.useState(!1);return p.useLayoutEffect(()=>{const c=n.current,d=r.current;if(!c||!d)return;let h;const m=()=>{h==null||h.cancel(),h=void 0;const g=d.firstElementChild,v=(g==null?void 0:g.scrollWidth)??0,b=!window.matchMedia("(prefers-reduced-motion: reduce)").matches&&v>c.clientWidth+1;if(o(b),!b)return;const j=v+MA;h=d.animate([{transform:"translateX(0)"},{transform:`translateX(-${j}px)`}],{duration:j/RX*1e3,iterations:1/0,easing:"linear"})};m();const x=new ResizeObserver(m);return x.observe(c),()=>{x.disconnect(),h==null||h.cancel()}},[e]),l.jsx("div",{ref:n,className:W("overflow-hidden",t),children:l.jsxs("div",{ref:r,className:W("flex whitespace-nowrap",a&&"w-max will-change-transform"),children:[l.jsx("span",{className:W("min-w-0",!a&&"truncate"),children:e}),a&&l.jsx("span",{"aria-hidden":!0,className:"shrink-0",style:{paddingLeft:MA},children:e})]})})}const AX={collapse:"Collapse",enterFullscreen:"Enter full screen",exitFullscreen:"Exit full screen",previous:"Previous track",play:"Play",pause:"Pause",next:"Next track",progress:"Progress",volume:"Volume",unknownTrack:"Unknown track"},MX="#5E3AA8";function DX(e,t,n){return"#"+[e,t,n].map(r=>Math.round(r).toString(16).padStart(2,"0")).join("")}function _X(e){const n=document.createElement("canvas");n.width=24,n.height=24;const r=n.getContext("2d",{willReadFrequently:!0});r.drawImage(e,0,0,24,24);let a;try{a=r.getImageData(0,0,24,24).data}catch{return null}const o=new Map;for(let d=0;d<a.length;d+=4){const h=a[d],m=a[d+1],x=a[d+2];if(a[d+3]<8)continue;const v=Math.max(h,m,x),S=Math.min(h,m,x),b=(h+m+x)/3,j=v===0?0:(v-S)/v;if(b<25||b>235||j<.15)continue;const C=h>>4<<8|m>>4<<4|x>>4,k=o.get(C)||{n:0,r:0,g:0,b:0};k.n++,k.r+=h,k.g+=m,k.b+=x,o.set(C,k)}let c=null;for(const d of o.values())(!c||d.n>c.n)&&(c=d);return c?[c.r/c.n,c.g/c.n,c.b/c.n]:null}function OX([e,t,n]){const r=Math.max(e,t,n);if(r<150){const a=150/Math.max(r,1);e=Math.min(255,e*a),t=Math.min(255,t*a),n=Math.min(255,n*a)}return DX(e,t,n)}function zX(e,t){const[n,r]=p.useState();return p.useEffect(()=>{if(!t||!e){r(void 0);return}let a=!1;const o=new Image;return o.crossOrigin="anonymous",o.onload=()=>{if(a)return;const c=_X(o);r(c?OX(c):void 0)},o.onerror=()=>!a&&r(void 0),o.src=e,()=>{a=!0}},[e,t]),n}function PX({track:e,playing:t=!1,currentTime:n=0,duration:r=0,volume:a,hasPrev:o=!0,hasNext:c=!0,accentColor:d,extractFromCover:h=!0,colorTransitionMs:m=400,nowPlayingLabel:x,labels:g,autoFullscreen:v=!1,onToggle:S,onPrev:b,onNext:j,onSeek:C,onVolumeChange:k,onClose:N,className:T,...R}){const A={...AX,...g},O=p.useRef(null),[z,_]=p.useState(!1),V=e.lyrics??[],B=V.length>0,G=zX(e.cover,h&&!d&&!z),I=d??G??MX,H=p.useRef(n),[ee,X]=p.useState(n);p.useEffect(()=>{Math.abs(n-H.current)>.75&&(H.current=n,X(n))},[n]),p.useEffect(()=>{H.current=n,X(n)},[e]),p.useEffect(()=>{if(!t)return;let Z=0,ve=0,Te=0;const Ee=Ie=>{Z=requestAnimationFrame(Ee);const Fe=ve?(Ie-ve)/1e3:0;ve=Ie,H.current=Math.min(r||1/0,H.current+Fe),Te+=Fe,Te>=.08&&(Te=0,X(H.current))};return Z=requestAnimationFrame(Ee),()=>cancelAnimationFrame(Z)},[t,r]);const M=Z=>{H.current=Z,X(Z),C==null||C(Z)},U=p.useMemo(()=>{let Z=0;for(let ve=0;ve<V.length&&V[ve].time<=ee;ve++)Z=ve;return Z},[V,ee]),K=p.useRef(null),ne=p.useRef([]),q=p.useRef(!1),P=p.useRef(null),L=p.useCallback((Z="smooth")=>{const ve=ne.current[U],Te=K.current;ve&&Te&&Te.scrollTo({top:ve.offsetTop-Te.clientHeight/2+ve.clientHeight/2,behavior:Z})},[U]);p.useEffect(()=>{if(q.current)return;const Z=setTimeout(()=>L(),220);return()=>clearTimeout(Z)},[U,e,L]),p.useEffect(()=>()=>{P.current&&clearTimeout(P.current)},[]);const Y=()=>{q.current=!0,P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{q.current=!1,L()},5e3)},[J,$]=p.useState(!1);p.useEffect(()=>{const Z=()=>$(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",Z),()=>document.removeEventListener("fullscreenchange",Z)},[]);const se=()=>{var Z,ve;document.fullscreenElement?document.exitFullscreen():(ve=(Z=O.current)==null?void 0:Z.requestFullscreen)==null||ve.call(Z)};p.useEffect(()=>{var Z,ve;v&&!document.fullscreenElement&&((ve=(Z=O.current)==null?void 0:Z.requestFullscreen)==null||ve.call(Z).catch(()=>{}))},[]),p.useEffect(()=>{const Z=ve=>ve.key==="Escape"&&!document.fullscreenElement&&(N==null?void 0:N());return window.addEventListener("keydown",Z),()=>window.removeEventListener("keydown",Z)},[N]);const oe=typeof a=="number"&&!!k,ie=e.cover&&!z;return l.jsxs("div",{ref:O,"data-slot":"audio-player-stage",className:W("fixed inset-0 z-[60] overflow-hidden",T),...R,children:[l.jsx(TX,{className:"!absolute inset-0",color:I,colorTransitionMs:m,speed:4,scale:.8,noiseIntensity:1,rotation:.05}),l.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-black/30 via-black/40 to-black/70"}),l.jsxs("div",{className:"relative flex h-full flex-col px-[5vw] pb-8 pt-5 text-white",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("button",{onClick:N,"aria-label":A.collapse,className:W("-ml-2 flex size-9 items-center justify-center rounded-full text-white/80 transition-colors hover:bg-white/10 hover:text-white",!N&&"invisible"),children:l.jsx(zo,{className:"size-5"})}),x?l.jsx("span",{className:"text-[11px] font-medium uppercase tracking-widest text-white/60",children:x}):l.jsx("span",{"aria-hidden":!0}),l.jsx("button",{onClick:se,"aria-label":J?A.exitFullscreen:A.enterFullscreen,className:"-mr-2 flex size-9 items-center justify-center rounded-full text-white/70 transition-colors hover:bg-white/10 hover:text-white",children:J?l.jsx(jL,{className:"size-4"}):l.jsx(Lp,{className:"size-4"})})]}),l.jsxs("div",{className:W("flex min-h-0 flex-1 items-center gap-[6vw]",B?"justify-start":"justify-center"),children:[l.jsxs("div",{className:W("mx-auto flex w-full max-w-[min(60vw,280px)] flex-col gap-7",B&&"shrink-0 md:mx-0"),children:[l.jsx("div",{className:W("aspect-square w-full overflow-hidden rounded-3xl shadow-2xl ring-1 ring-white/10 transition-transform duration-500 ease-out",t?"scale-100":"scale-95"),children:ie?l.jsx("img",{src:e.cover,alt:"",onError:()=>_(!0),className:"size-full object-cover"}):l.jsx("div",{className:"flex size-full items-center justify-center bg-white/10",children:l.jsx(Js,{className:"size-16 text-white/50"})})}),l.jsxs("div",{className:W("min-w-0",!B&&"text-center"),children:[l.jsx(DA,{className:"text-2xl font-bold leading-tight [text-shadow:0_1px_12px_rgba(0,0,0,0.4)]",children:e.title||A.unknownTrack}),e.artist&&l.jsx(DA,{className:"mt-1 text-base leading-tight text-white/70 [text-shadow:0_1px_10px_rgba(0,0,0,0.5)]",children:e.artist})]}),l.jsxs("div",{className:"flex flex-col gap-1.5",children:[l.jsx(Xy,{value:[Math.min(ee,r)],min:0,max:r||1,step:1,onValueChange:Z=>M(Z[0]),"aria-label":A.progress}),l.jsxs("div",{className:"flex justify-between font-mono text-[11px] tabular-nums text-white/50",children:[l.jsx("span",{children:AA(ee)}),l.jsxs("span",{children:["-",AA(Math.max(0,r-ee))]})]})]}),l.jsxs("div",{className:"flex items-center justify-center gap-8",children:[l.jsx("button",{onClick:b,disabled:!o,"aria-label":A.previous,className:"flex size-12 items-center justify-center rounded-full text-white/80 transition-transform hover:scale-105 hover:text-white disabled:pointer-events-none disabled:opacity-30",children:l.jsx(D1,{className:"size-7 fill-current"})}),l.jsx("button",{onClick:S,"aria-label":t?A.pause:A.play,className:"flex size-16 items-center justify-center rounded-full bg-white text-black shadow-lg transition-transform hover:scale-105",children:t?l.jsx(Fi,{className:"size-7 fill-current"}):l.jsx(Hn,{className:"size-7 translate-x-0.5 fill-current"})}),l.jsx("button",{onClick:j,disabled:!c,"aria-label":A.next,className:"flex size-12 items-center justify-center rounded-full text-white/80 transition-transform hover:scale-105 hover:text-white disabled:pointer-events-none disabled:opacity-30",children:l.jsx(_1,{className:"size-7 fill-current"})})]}),oe&&l.jsxs("div",{className:"flex items-center gap-3 text-white/60",children:[l.jsx(z1,{className:"size-4 shrink-0"}),l.jsx(Xy,{value:[Math.round((a??0)*100)],min:0,max:100,onValueChange:Z=>k==null?void 0:k(Z[0]/100),"aria-label":A.volume,className:"flex-1"})]})]}),B&&l.jsx("div",{ref:K,onWheel:Y,onTouchStart:Y,onTouchMove:Y,className:"relative hidden min-h-0 flex-1 self-stretch overflow-y-auto py-[38vh] [scrollbar-width:none] md:block [&::-webkit-scrollbar]:hidden",children:V.map((Z,ve)=>l.jsx("p",{ref:Te=>{ne.current[ve]=Te},onClick:()=>M(Z.time),className:W("max-w-2xl cursor-pointer px-2 py-2.5 text-2xl font-semibold leading-snug transition-colors duration-300 lg:text-3xl",ve!==U&&"text-white/30 hover:text-white/55"),children:Z.text},ve))})]})]})]})}const LX={previous:"上一首",play:"播放",pause:"暂停",next:"下一首",volume:"音量",nowPlaying:"播放中",openNowPlaying:"打开播放中:{title}"},IX={collapse:"收起",enterFullscreen:"全屏",exitFullscreen:"退出全屏",previous:"上一首",play:"播放",pause:"暂停",next:"下一首",progress:"进度",volume:"音量",unknownTrack:"未知曲目"},$X="flex size-9 shrink-0 items-center justify-center rounded-full text-foreground/70 transition-colors hover:bg-[var(--acr-hover)] hover:text-foreground",_A={music:"音乐",podcast:"播客"};function BX(){const e=Oy(),[t,n]=p.useState(e.activeKind),r=e.queues[t];return l.jsxs(cy,{children:[l.jsx(rG,{asChild:!0,children:l.jsx("button",{"aria-label":"播放队列",className:$X,title:"播放队列",children:l.jsx(Js,{className:"size-4"})})}),l.jsxs(uy,{className:"gap-0 p-0 text-foreground",children:[l.jsxs("div",{className:"flex items-baseline gap-1.5 px-4 pt-3 pb-2 pr-10",children:[l.jsx("h2",{className:"text-lg font-bold tracking-tight",children:"播放列表"}),l.jsx("span",{className:"text-xs text-muted-foreground",children:r.length})]}),l.jsx("div",{className:"mb-2 flex justify-center px-4",children:l.jsx(aN,{variant:"segmented",size:"large",value:t,onValueChange:a=>n(a),"aria-label":"播放列表类型",children:["music","podcast"].map(a=>l.jsxs(iN,{value:a,className:"gap-1 px-4",children:[_A[a],l.jsx("span",{className:"text-[11px] opacity-60",children:e.queues[a].length})]},a))})}),l.jsx("div",{className:"scrollbar-mac min-h-0 flex-1 overflow-y-auto px-2 pb-3",children:r.length===0?l.jsxs("div",{className:"flex h-32 items-center justify-center text-sm text-muted-foreground",children:[_A[t],"队列为空"]}):r.map((a,o)=>{var d;const c=((d=e.current)==null?void 0:d.id)===a.id&&e.activeKind===t;return l.jsxs("button",{onClick:()=>e.playQueue(r,o,t),className:"group flex w-full items-center gap-3 rounded-xl px-2 py-2 text-left transition-colors hover:bg-[var(--acr-hover)]",children:[l.jsxs("div",{className:"relative size-11 shrink-0 overflow-hidden rounded-lg",children:[a.poster?l.jsx("img",{src:a.poster,alt:"",className:"size-full object-cover"}):l.jsx("span",{className:"flex size-full items-center justify-center bg-[var(--acr-chip)] text-muted-foreground",children:l.jsx(A1,{className:"size-4"})}),l.jsx("div",{className:W("absolute inset-0 flex items-center justify-center bg-black/35 transition-opacity",c?"opacity-100":"opacity-0 group-hover:opacity-100"),children:l.jsx(Hn,{className:"size-4 translate-x-px fill-white text-white"})})]}),l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsx("div",{className:W("truncate text-sm font-medium",c&&"text-primary"),children:a.title||"未命名"}),a.author&&l.jsx("div",{className:"truncate text-xs text-muted-foreground",children:a.author})]}),a.durationS?l.jsx("span",{className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:_h(a.durationS)}):null]},a.id)})})]})]})}const OA=/\[(\d{1,2}):(\d{1,2})(?:[.:](\d{1,3}))?\]/g;function UX(e){const t=[];for(const n of e.split(/\r?\n/)){const r=[...n.matchAll(OA)];if(!r.length)continue;const a=n.replace(OA,"").trim();if(a)for(const o of r){const c=Number(o[1]),d=Number(o[2]),h=o[3]?Number(o[3].padEnd(3,"0"))/1e3:0;t.push({time:c*60+d+h,text:a})}}return t.sort((n,r)=>n.time-r.time)}const VX="flex size-9 shrink-0 items-center justify-center rounded-full text-foreground/70 transition-colors hover:bg-[var(--acr-hover)] hover:text-foreground disabled:pointer-events-none disabled:opacity-30";function FX(e){if(e.platform==="netease"&&e.trackId)return`netease:${e.trackId}`;if(e.title&&e.author)return`${e.title}::${e.author}`}function HX(e,t){const[n,r]=p.useState(void 0);return p.useEffect(()=>{r(void 0);const a=t?FX(t):void 0;if(!a)return;let o=!1;return be.lyrics(e,a).then(c=>{var h;if(o)return;const d=(h=c.result)==null?void 0:h.items[0];if(d!=null&&d.matched&&d.lrc){const m=UX(d.lrc);m.length&&r(m)}}).catch(()=>{}),()=>{o=!0}},[e,t==null?void 0:t.id]),n}function zA(e,t){return{title:e.title||"播放中",artist:e.author,cover:e.poster,...t!=null&&t.length?{lyrics:t}:{}}}function qX({conn:e}){const t=Oy(),n=bX(),{current:r,queue:a}=t,o=r?a.findIndex(j=>j.id===r.id):-1,c=o>0,d=o>=0&&o<a.length-1,[h,m]=p.useState(()=>t.getVolume()),[x,g]=p.useState(!1),v=HX(e,r),S=p.useMemo(()=>r?zA(r):null,[r]),b=p.useMemo(()=>r?zA(r,v):null,[r,v]);return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 z-20 flex justify-center px-4 pb-4",children:l.jsx(kX,{className:"pointer-events-auto",labels:LX,track:S,playing:t.playing,currentTime:n,duration:t.duration,volume:h,hasPrev:c,hasNext:d,onPrev:()=>c&&t.playQueue(a,o-1,t.activeKind),onNext:()=>d&&t.playQueue(a,o+1,t.activeKind),onToggle:t.toggle,onSeek:t.seek,onVolumeChange:j=>{m(j),t.setVolume(j)},actions:l.jsxs(l.Fragment,{children:[l.jsx(BX,{}),l.jsx("button",{onClick:()=>g(!0),disabled:!r,"aria-label":"Now Playing",title:"Now Playing",className:VX,children:l.jsx(Lp,{className:"size-4"})})]})})}),x&&r&&b&&l.jsx(PX,{labels:IX,track:b,playing:t.playing,currentTime:n,duration:t.duration,volume:h,hasPrev:c,hasNext:d,onToggle:t.toggle,onPrev:()=>c&&t.playQueue(a,o-1,t.activeKind),onNext:()=>d&&t.playQueue(a,o+1,t.activeKind),onSeek:t.seek,onVolumeChange:j=>{m(j),t.setVolume(j)},onClose:()=>g(!1)})]})}function KX(e,t,n=!0){const r=p.useRef(t);r.current=t;const a=p.useRef(null),o=p.useRef([]);return p.useEffect(()=>{if(!n)return;const c=Uk();let d=null,h=!1,m=1e3,x;const g=()=>{d=c.openSocket(e,{onOpen:()=>{m=1e3,a.current=d;for(const v of o.current.splice(0))d==null||d.send(v)},onMessage:v=>{try{r.current(JSON.parse(v))}catch{}},onClose:()=>{a.current===d&&(a.current=null),h||(x=setTimeout(g,m),m=Math.min(m*2,15e3))}})};return g(),()=>{h=!0,x&&clearTimeout(x),d==null||d.close(),a.current=null,o.current=[]}},[e,n]),c=>{const d=JSON.stringify(c),h=a.current;h?h.send(d):o.current.push(d)}}const GX=Vr("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-shadow duration-[400ms] hover:shadow-lg hover:shadow-black/30 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:bg-zinc-800 disabled:text-zinc-500 disabled:border-zinc-700 disabled:shadow-none disabled:hover:shadow-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow",destructive:"bg-destructive text-destructive-foreground shadow-sm",outline:"border border-zinc-700 bg-zinc-900 text-zinc-100 shadow-sm",secondary:"bg-zinc-800 text-zinc-100 shadow-sm",ghost:"text-zinc-200 hover:shadow-none hover:ring-1 hover:ring-white/10",link:"text-primary underline-offset-4 hover:underline hover:shadow-none"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),PA=p.forwardRef(({className:e,variant:t,size:n,asChild:r=!1,...a},o)=>{const c=r?qi:"button";return l.jsx(c,{className:W(GX({variant:t,size:n,className:e})),ref:o,...a})});PA.displayName="Button";function LA({...e}){return l.jsx(Rc,{"data-slot":"dialog",...e})}function YX({...e}){return l.jsx(Ac,{"data-slot":"dialog-portal",...e})}function IA({...e}){return l.jsx(Ki,{"data-slot":"dialog-close",...e})}function WX({className:e,...t}){return l.jsx(Wo,{"data-slot":"dialog-overlay",className:W("fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",e),...t})}function $A({className:e,children:t,showCloseButton:n=!0,...r}){return l.jsxs(YX,{"data-slot":"dialog-portal",children:[l.jsx(WX,{}),l.jsxs(Xo,{"data-slot":"dialog-content",className:W("fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",e),...r,children:[t,n&&l.jsxs(Ki,{"data-slot":"dialog-close",className:"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",children:[l.jsx(Hi,{}),l.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}function BA({className:e,...t}){return l.jsx("div",{"data-slot":"dialog-header",className:W("flex flex-col gap-2 text-center sm:text-left",e),...t})}function UA({className:e,showCloseButton:t=!1,children:n,...r}){return l.jsxs("div",{"data-slot":"dialog-footer",className:W("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...r,children:[n,t&&l.jsx(Ki,{asChild:!0,children:l.jsx(PA,{variant:"outline",children:"Close"})})]})}function VA({className:e,...t}){return l.jsx(Dc,{"data-slot":"dialog-title",className:W("text-lg leading-none font-semibold",e),...t})}function FA({className:e,...t}){return l.jsx(_c,{"data-slot":"dialog-description",className:W("text-sm text-muted-foreground",e),...t})}function XX(e){const{renaming:t,deleting:n,renameLabel:r,onRenameLabelChange:a,onCloseRename:o,onCloseDelete:c,onConfirmRename:d,onConfirmDelete:h,renameSaving:m,deleteSaving:x,renameTitle:g,renameDesc:v,nameLabel:S,deleteTitle:b,deleteBody:j}=e;return l.jsxs(l.Fragment,{children:[l.jsx(LA,{open:t!==null,onOpenChange:C=>{C||o()},children:l.jsx($A,{children:l.jsxs("form",{className:"flex flex-col gap-4",onSubmit:C=>{C.preventDefault(),d()},children:[l.jsxs(BA,{children:[l.jsx(VA,{children:g}),l.jsx(FA,{children:v})]}),l.jsx("div",{className:"px-4 py-2",children:l.jsx(Jt,{"aria-label":S,size:"xl",value:r,onChange:C=>a(C.target.value),autoFocus:!0})}),l.jsxs(UA,{children:[l.jsx(IA,{asChild:!0,children:l.jsx(Ne,{type:"button",variant:"neutral",size:"large",disabled:m,children:"取消"})}),l.jsx(Ne,{type:"submit",size:"large",disabled:m||!r.trim(),children:m?"保存中…":"保存"})]})]})})}),l.jsx(LA,{open:n!==null,onOpenChange:C=>{C||c()},children:l.jsxs($A,{children:[l.jsxs(BA,{children:[l.jsx(VA,{children:b}),l.jsx(FA,{children:j((n==null?void 0:n.label)??"")})]}),l.jsxs(UA,{children:[l.jsx(IA,{asChild:!0,children:l.jsx(Ne,{type:"button",variant:"neutral",size:"large",disabled:x,children:"取消"})}),l.jsx(Ne,{type:"button",variant:"destructive",size:"large",disabled:x,onClick:h,children:x?"删除中…":"删除"})]})]})})]})}function QX(e){var n;const t=((n=e.content)==null?void 0:n.media)??[];return!t.some(r=>r.kind==="audio")&&t.some(r=>r.kind==="link"&&!!r.track_id)}function ZX(e){var t;for(const n of((t=e.content)==null?void 0:t.media)??[]){if(n.kind==="audio"&&n.poster)return n.poster;if(n.kind==="link"&&n.image)return n.image;if(n.kind==="image"&&n.url)return n.url}}function JX(e){const t=(e.sources??[]).map(n=>{var r,a;return((r=n.source)==null?void 0:r.id)||((a=n.source)==null?void 0:a.pluginId)||""}).join(" ").toLowerCase();return t.includes("163")||t.includes("netease")?"网易云":t.includes("qqmusic")||t.includes("/qq/")?"QQ音乐":t.includes("spotify")?"Spotify":t.includes("youtube")||t.includes("ytmusic")?"YouTube":""}const Du="__liked_songs__",eQ=4,HA="grid grid-cols-[repeat(auto-fill,minmax(max(140px,calc((100%-60px)/6)),1fr))] gap-3";function qA(e){const[,t,n,...r]=e.split("/");return t!=="music"?{kind:"home"}:n==="liked"?{kind:"liked"}:n==="playlist"&&r[0]?{kind:"playlist",id:decodeURIComponent(r[0])}:n==="collection"&&r[0]?{kind:"collection",id:decodeURIComponent(r.join("/"))}:n==="search"&&r[0]?{kind:"search",q:decodeURIComponent(r.join("/"))}:{kind:"home"}}function tQ(e){return e.kind==="liked"?"/music/liked":e.kind==="playlist"?"/music/playlist/"+encodeURIComponent(e.id):e.kind==="collection"?"/music/collection/"+encodeURIComponent(e.id):e.kind==="search"?"/music/search/"+encodeURIComponent(e.q):"/music"}function nQ(e){return e.isCollection||e.sel&&(e.selStream||e.isLikedPlaylist)?"track-list":!e.channelsLoaded&&!e.isLikedPlaylist?"loading":"grid"}function Zy(e,t){Ke.error(e,{description:t,action:{label:"复制错误",onClick:()=>{var n;return void((n=navigator.clipboard)==null?void 0:n.writeText(t))}}})}const va="group-data-[state=selected]/table-row:text-primary-foreground",Rl="group-data-[state=selected]/table-row:text-primary-foreground/80";function KA({origin:e}){const t=e.kind==="netdisk"?"bg-sky-500/15 text-sky-500":"bg-amber-500/15 text-amber-500",n=e.kind==="netdisk"?"来自挂载的网盘目录,文件在盘里直接播":"源站标记为付费集(与能不能播无关——网盘补上音频后依然是付费集)";return l.jsx("span",{title:n,className:W("shrink-0 rounded px-1 py-px text-[9px] font-medium",t,"group-data-[state=selected]/table-row:bg-white/20",va),children:e.label})}function rQ(){return l.jsxs("span",{className:"eq","aria-hidden":!0,children:[l.jsx("i",{}),l.jsx("i",{}),l.jsx("i",{})]})}function _u(e){if(!e)return null;const t=e.indexOf(":");return t<=0?null:{platform:e.slice(0,t),trackId:e.slice(t+1)}}function $h(e){return!!(e.sourceItem||e.likeRef||_u(e.trackKey))}function GA(e,t){if(!e||e.id!==void 0&&t.id!==void 0&&e.id!==t.id)return t;const n=e.downloadedBytes,r=t.downloadedBytes,a=n!==void 0&&r!==void 0?Math.max(n,r):r??n,o=e.totalBytes,c=t.totalBytes,d=o!==void 0&&c!==void 0?Math.max(o,c):c??o;return{...t,downloadedBytes:a,totalBytes:d,failedAt:t.state==="failed"?e.failedAt??t.failedAt:t.failedAt}}function sQ({job:e}){const t=e.downloadedBytes??0,n=e.totalBytes??0,r=t>0,a=n>0?Math.max(0,Math.min(1,t/n)):r?.64:0,o=6,c=2*Math.PI*o,d=r?"下载中":"探测下载源";return r?l.jsxs("svg",{className:"size-4 shrink-0 -rotate-90 text-primary",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[l.jsx("title",{children:d}),l.jsx("circle",{cx:"8",cy:"8",r:o,className:"stroke-muted-foreground/25",strokeWidth:"2"}),l.jsx("circle",{cx:"8",cy:"8",r:o,stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeDasharray:c,strokeDashoffset:c*(1-a)})]}):l.jsx("span",{className:W("inline-flex size-4 shrink-0 items-center justify-center text-muted-foreground/75",Rl),title:d,children:l.jsx(wr,{className:"size-4 animate-spin",strokeWidth:2})})}function YA({row:e,canDownload:t,active:n,onDownload:r}){const a=!t||n;return{disabled:a,onSelect:o=>{o.stopPropagation(),a||r==null||r(e)}}}function WA({conn:e,collectKey:t,meta:n,anchorStreamId:r,MenuItem:a,onChanged:o}){const[c,d]=p.useState([]),[h,m]=p.useState(new Set),[x,g]=p.useState("");p.useEffect(()=>{let b=!0;return Promise.all([be.collections(e,"audio"),be.whereCollected(e,t)]).then(([j,C])=>{b&&(d([...j.filter(k=>!k.system)].sort((k,N)=>+(N.anchorStreamId===r)-+(k.anchorStreamId===r))),m(new Set(C.collectionIds)))}).catch(()=>{}),()=>{b=!1}},[]);const v=(b,j)=>{m(C=>{const k=new Set(C);return j?k.delete(b):k.add(b),k}),(j?be.removeFromCollection(e,b,t):be.addToCollection(e,b,t,n)).then(()=>o==null?void 0:o()).catch(()=>m(C=>{const k=new Set(C);return j?k.add(b):k.delete(b),k}))},S=async()=>{const b=x.trim();if(!b)return;const j=await be.createCollection(e,"audio",b,r??void 0);g(""),d(C=>[j,...C]),v(j.id,!1),o==null||o()};return l.jsxs(l.Fragment,{children:[c.map(b=>{const j=h.has(b.id);return l.jsxs(a,{onSelect:C=>{C.preventDefault(),v(b.id,j)},children:[l.jsx(Rs,{className:W("size-4",j?"opacity-100":"opacity-0")}),l.jsx("span",{className:"truncate",children:b.label})]},b.id)}),l.jsx("div",{className:"border-t border-[var(--acr-border-soft)] px-1.5 py-1",children:l.jsx(Jt,{placeholder:"新建播单…",value:x,onChange:b=>g(b.target.value),onKeyDown:b=>{b.stopPropagation(),b.key==="Enter"&&S()},onClick:b=>b.stopPropagation()})})]})}function aQ({row:e,canDownload:t,job:n,isArchived:r,onDownload:a,collect:o}){const c=(n==null?void 0:n.state)==="queued"||(n==null?void 0:n.state)==="running",d=r?"重新下载":c?"下载中":"下载到本地",h=YA({row:e,canDownload:t,active:c,onDownload:a});return l.jsxs(Tx,{children:[l.jsx(Rx,{asChild:!0,children:l.jsx("button",{type:"button",onClick:m=>m.stopPropagation(),className:"mx-auto inline-flex size-6 items-center justify-center rounded-full text-muted-foreground/70 opacity-0 transition-all hover:text-foreground group-hover/item:opacity-100 focus-visible:opacity-100 data-[state=open]:opacity-100","aria-label":"歌曲操作",title:"歌曲操作",children:l.jsx(_p,{className:"size-4"})})}),l.jsxs(qf,{align:"end",size:"sm",className:"w-36",children:[l.jsxs(xs,{...h,children:[l.jsx(wc,{}),l.jsx("span",{children:d})]}),o&&ku(e,o.streamId)&&l.jsxs(Yk,{children:[l.jsxs(Ax,{children:[l.jsx(Pp,{}),l.jsx("span",{children:"加入播单"})]}),l.jsx(Mx,{className:"w-48",children:l.jsx(WA,{conn:o.conn,collectKey:ku(e,o.streamId),meta:{title:e.title,poster:e.poster,artist:e.author,album:e.album,durationS:e.durationS,sourceUrl:e.sourceUrl},anchorStreamId:o.streamId,MenuItem:xs,onChanged:o.onChanged})})]})]})]})}function XA({row:e,canDownload:t,job:n,isArchived:r,onDownload:a,collect:o,children:c}){const d=(n==null?void 0:n.state)==="queued"||(n==null?void 0:n.state)==="running",h=r?"重新下载":d?"下载中":"下载到本地",m=YA({row:e,canDownload:t,active:d,onDownload:a});return l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:c}),l.jsxs(Tl,{size:"sm",className:"w-36",children:[l.jsxs(Rr,{onSelect:()=>void I1({id:e.id,title:e.title,...e.author!==void 0?{author:e.author}:{}}),children:[l.jsx(Dp,{}),l.jsx("span",{children:"在对话中引用"})]}),l.jsxs(Rr,{...m,children:[l.jsx(wc,{}),l.jsx("span",{children:h})]}),o&&ku(e,o.streamId)&&l.jsxs(hX,{children:[l.jsxs(CA,{children:[l.jsx(Pp,{}),l.jsx("span",{children:"加入播单"})]}),l.jsx(kA,{className:"w-48",children:l.jsx(WA,{conn:o.conn,collectKey:ku(e,o.streamId),meta:{title:e.title,poster:e.poster,artist:e.author,album:e.album,durationS:e.durationS,sourceUrl:e.sourceUrl},anchorStreamId:o.streamId,MenuItem:Rr,onChanged:o.onChanged})})]})]})]})}function iQ({row:e,baseUrl:t}){const n=Py(e),r=YR(e);return l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-start gap-2.5",children:[e.poster&&l.jsx("img",{src:os(t,e.poster),alt:"",loading:"lazy",decoding:"async",className:"size-11 shrink-0 rounded-md object-cover ring-1 ring-[var(--acr-border-soft)]"}),l.jsx("div",{className:"min-w-0 break-words text-[13px] font-medium leading-snug",children:e.title})]}),n.length>0&&l.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-[11px]",children:n.map(a=>l.jsxs(p.Fragment,{children:[l.jsx("dt",{className:"text-muted-foreground",children:a.label}),l.jsx("dd",{className:"min-w-0 break-words text-foreground/90",children:a.value})]},a.label))}),r&&l.jsx("p",{className:"line-clamp-6 whitespace-pre-line text-[11px] leading-relaxed text-muted-foreground",children:r}),e.sourceUrl&&l.jsx("a",{href:e.sourceUrl,target:"_blank",rel:"noreferrer",onClick:a=>a.stopPropagation(),className:"truncate text-[11px] text-primary hover:underline",children:e.sourceUrl})]})}function oQ({row:e,baseUrl:t}){return l.jsxs(Bx,{openDelay:200,closeDelay:120,children:[l.jsx(Ux,{asChild:!0,children:l.jsx("button",{type:"button","aria-label":"节目信息",onClick:n=>n.stopPropagation(),onKeyDown:n=>n.stopPropagation(),className:W("inline-flex size-4 shrink-0 items-center justify-center rounded-full text-muted-foreground/70 opacity-0 transition-opacity","group-hover/item:opacity-100 focus-visible:opacity-100 focus-visible:outline-none hover:text-foreground",Rl),children:l.jsx(zp,{className:"size-3.5"})})}),l.jsx(Vx,{align:"start",side:"bottom",className:"w-80",children:l.jsx(iQ,{row:e,baseUrl:t})})]})}const lQ=53,cQ=200,uQ=p.memo(function({row:t,index:n,baseUrl:r,isCurrent:a,isPlaying:o,isLiked:c,job:d,isArchived:h,canDownload:m,selectMode:x,selected:g,onToggleLike:v,onToggleSelect:S,onDownload:b,onPlay:j,collect:C,rowRef:k,drag:N}){const T=N?{draggable:!0,onDragStart:M=>{M.dataTransfer.effectAllowed="move",N.onDragStart(n)},onDragEnter:()=>N.onDragEnter(n),onDragOver:M=>{M.preventDefault(),M.dataTransfer.dropEffect="move"},onDrop:M=>{M.preventDefault(),N.onDragEnd()},onDragEnd:()=>N.onDragEnd()}:{},R=N!=null&&N.isDropTarget?"[&>td]:border-t-2 [&>td]:border-t-primary":"",A=t.poster?l.jsx("img",{src:os(r,t.poster),alt:"",loading:"lazy",decoding:"async",className:"size-9 shrink-0 rounded-md object-cover shadow-sm ring-1 ring-[var(--acr-border-soft)]"}):l.jsx("span",{className:W("flex size-9 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground shadow-sm ring-1 ring-[var(--acr-border-soft)]","group-data-[state=selected]/table-row:bg-white/15",va),children:l.jsx(A1,{className:"size-4"})}),O=(d==null?void 0:d.state)==="queued"||(d==null?void 0:d.state)==="running",z=!!(d!=null&&d.failedAt)&&Date.now()-d.failedAt<5e3,_=O&&d?l.jsx(sQ,{job:d}):t.trackKey&&h?l.jsx("span",{className:W("inline-flex size-4 shrink-0 items-center justify-center text-emerald-500/90",va),title:"已下载",children:l.jsx(mL,{className:"size-4",strokeWidth:2})}):z?l.jsx("span",{className:W("inline-flex size-4 shrink-0 items-center justify-center text-destructive/90",va),title:d!=null&&d.lastError?`下载失败:${d.lastError}`:"下载失败",children:l.jsx(hL,{className:"size-4",strokeWidth:2})}):null,V=l.jsx(aQ,{row:t,canDownload:m,job:d,isArchived:h,onDownload:b,collect:C}),B=t.author?l.jsxs("div",{className:W("flex min-w-0 items-center gap-1.5 text-[11px] text-muted-foreground",Rl),children:[_,l.jsx("span",{className:"truncate",children:t.author})]}):_?l.jsx("div",{className:W("flex min-w-0 items-center gap-1.5 text-[11px] text-muted-foreground",Rl),children:_}):null,G=KY(t)?l.jsx(oQ,{row:t,baseUrl:r}):null,I=t.likeRef?`${t.likeRef.platform}:${t.likeRef.trackId}`:t.trackKey,H=l.jsx("button",{onClick:M=>{M.stopPropagation(),v(t)},disabled:!I,className:W("mx-auto inline-flex size-6 items-center justify-center rounded-full text-muted-foreground/70 transition-colors hover:text-foreground",Rl,"group-data-[state=selected]/table-row:hover:text-primary-foreground"),title:c?"取消喜欢":"喜欢",children:l.jsx(Fd,{className:W("size-4",c&&"fill-primary text-primary",c&&"group-data-[state=selected]/table-row:fill-current",c&&va)})}),ee=l.jsx("span",{className:W("text-right text-[12px] tabular-nums text-muted-foreground",Rl),children:t.durationS?_h(t.durationS):"--:--"}),X=l.jsx("button",{onClick:M=>{M.stopPropagation(),S==null||S(t)},"aria-label":g?"取消选择":"选择",className:W("mx-auto inline-flex size-4.5 items-center justify-center rounded-full border transition-colors",g?"border-primary bg-primary text-primary-foreground group-data-[state=selected]/table-row:border-primary-foreground group-data-[state=selected]/table-row:bg-primary-foreground group-data-[state=selected]/table-row:text-primary":"border-[var(--acr-border)] text-transparent hover:border-foreground/50 group-data-[state=selected]/table-row:border-primary-foreground/50"),children:l.jsx(Rs,{className:"size-3",strokeWidth:3})});if(t.track&&!t.muted){const M=()=>{x?S==null||S(t):j(t)};return l.jsx(XA,{row:t,canDownload:m,job:d,isArchived:h,onDownload:b,collect:C,children:l.jsxs(Eu,{ref:k,role:"button",tabIndex:0,...T,onClick:M,onKeyDown:U=>{(U.key==="Enter"||U.key===" ")&&(U.preventDefault(),M())},"data-state":a?"selected":void 0,className:W("group group/item cursor-pointer outline-none","focus-visible:[&>td]:bg-[var(--acr-hover)] focus-visible:[&>td]:border-b-transparent","focus-visible:[&>td:first-child]:rounded-l-[7px] focus-visible:[&>td:last-child]:rounded-r-[7px]",R),children:[l.jsx(Wr,{className:"text-center",children:l.jsx("span",{className:"relative flex h-5 items-center justify-center text-xs",children:x?X:o?l.jsx("span",{className:W("text-primary",va),children:l.jsx(rQ,{})}):a?l.jsx(Hn,{className:W("size-3.5 fill-current text-primary",va)}):l.jsxs(l.Fragment,{children:[l.jsx("span",{className:"tabular-nums text-muted-foreground group-hover:opacity-0",children:n+1}),l.jsx(Hn,{className:"absolute size-3.5 fill-current text-foreground opacity-0 group-hover:opacity-100"})]})})}),l.jsx(Wr,{children:l.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[A,l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:W("flex items-center gap-1.5 text-[13px]",a?"font-medium text-primary":"text-foreground",va),children:[l.jsx("span",{className:"truncate",children:t.title}),t.vip&&l.jsx("span",{className:W("shrink-0 rounded bg-amber-500/15 px-1 py-px text-[9px] font-medium text-amber-500","group-data-[state=selected]/table-row:bg-white/20",va),children:"VIP"}),t.origin&&l.jsx(KA,{origin:t.origin}),G]}),B]})]})}),l.jsx(Wr,{className:"truncate text-[12px] text-muted-foreground",children:t.album}),l.jsx(Wr,{className:"text-center",children:H}),l.jsx(Wr,{className:"text-right",children:l.jsxs("div",{className:"flex items-center justify-end gap-1",children:[ee,V]})})]})})}return l.jsx(XA,{row:t,canDownload:m,job:d,isArchived:h,onDownload:b,collect:C,children:l.jsxs(Eu,{...T,className:W("group/item opacity-50",R),children:[l.jsx(Wr,{className:"text-center text-xs text-muted-foreground/60",children:x?X:n+1}),l.jsx(Wr,{children:l.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[A,l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[13px] text-foreground/70",children:[l.jsx("span",{className:"truncate",children:t.title}),t.origin&&l.jsx(KA,{origin:t.origin}),G]}),B]})]})}),l.jsx(Wr,{className:"truncate text-[12px] text-muted-foreground",children:t.album}),l.jsx(Wr,{}),l.jsx(Wr,{className:"text-right",children:l.jsxs("div",{className:"flex items-center justify-end gap-1",children:[l.jsx("span",{className:"text-right text-[12px] tabular-nums text-muted-foreground",children:t.durationS?_h(t.durationS):"--:--"}),V]})})]})})});function QA({height:e,side:t}){return l.jsx("tr",{"aria-hidden":!0,"data-testid":`track-vpad-${t}`,style:{height:e,pointerEvents:"none"},children:l.jsx("td",{colSpan:5,style:{height:e,padding:0,borderBottomWidth:0}})})}function ZA({rows:e,queue:t,stage:n,baseUrl:r,liked:a,toggleLike:o,jobs:c={},archived:d={},onDownload:h,busy:m,busyText:x="加载中…",emptyText:g,selectMode:v,selectedIds:S,onToggleSelect:b,collect:j,jumpKey:C,onReorder:k}){var Fe;const N=p.useRef({toggleLike:o,onToggleSelect:b,onDownload:h,collect:j,stage:n,queue:t});N.current={toggleLike:o,onToggleSelect:b,onDownload:h,collect:j,stage:n,queue:t};const T=p.useCallback(fe=>N.current.toggleLike(fe),[]),R=p.useCallback(fe=>{var Se,ye;return(ye=(Se=N.current).onToggleSelect)==null?void 0:ye.call(Se,fe)},[]),A=p.useCallback(fe=>{var Se,ye;return(ye=(Se=N.current).onDownload)==null?void 0:ye.call(Se,fe)},[]),O=p.useCallback(()=>{var fe,Se;return(Se=(fe=N.current.collect)==null?void 0:fe.onChanged)==null?void 0:Se.call(fe)},[]),z=p.useCallback(fe=>{var Xe;const{stage:Se,queue:ye}=N.current;fe.track&&((Xe=Se.current)==null?void 0:Xe.id)===fe.track.id?Se.toggle():Se.playQueue(ye,fe.playIndex,"music")},[]),_=b?R:void 0,V=h?A:void 0,B=j==null?void 0:j.conn,G=(j==null?void 0:j.streamId)??null,I=p.useMemo(()=>B?{conn:B,streamId:G,onChanged:O}:void 0,[B,G,O]),[H,ee]=p.useState(null),X=p.useCallback(fe=>{ee(fe?bA(fe):null)},[]),[M,U]=p.useState(null),[K,ne]=p.useState(null),q=p.useCallback(fe=>{U(fe),ne(fe)},[]),P=p.useCallback(fe=>ne(fe),[]),L=p.useRef({onReorder:k,dragFrom:M,dragOver:K});L.current={onReorder:k,dragFrom:M,dragOver:K};const Y=p.useCallback(()=>{const{onReorder:fe,dragFrom:Se,dragOver:ye}=L.current;fe&&Se!==null&&ye!==null&&Se!==ye&&fe(Se,ye),U(null),ne(null)},[]),J=!m&&e.length>cQ,$=CY({count:J?e.length:0,getScrollElement:()=>H,estimateSize:()=>lQ,overscan:10}),se=J?$.getVirtualItems():[],oe=se.length?se[0].start:0,ie=se.length?$.getTotalSize()-se[se.length-1].end:0,Z=J?se.map(fe=>({row:e[fe.index],index:fe.index})):e.map((fe,Se)=>({row:fe,index:Se})),ve=p.useRef(null),Te=p.useRef(null),Ee=(Fe=n.current)==null?void 0:Fe.id,Ie=p.useMemo(()=>Ee?e.findIndex(fe=>{var Se;return!fe.muted&&((Se=fe.track)==null?void 0:Se.id)===Ee}):-1,[e,Ee]);return p.useEffect(()=>{if(Te.current===C||m||!Ee)return;if(J){if(Ie<0||!H)return;Te.current=C??null,$.scrollToIndex(Ie,{align:"center"});return}const fe=ve.current;fe&&(Te.current=C??null,fe.scrollIntoView({block:"center"}))},[C,m,Ee,e,J,Ie,H,$]),p.useEffect(()=>{Te.current!==C&&(Te.current=null)},[C]),l.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:l.jsx(Gy,{ref:X,className:"min-h-0 flex-1 px-2 py-1.5 pb-24 scrollbar-mac",children:l.jsxs(uX,{scrollable:!1,className:"table-fixed",children:[l.jsx(dX,{sticky:!0,children:l.jsxs(Eu,{children:[l.jsx(Tu,{className:"w-8 text-center",children:"#"}),l.jsx(Tu,{children:"标题"}),l.jsx(Tu,{className:"w-[28%]",children:"专辑"}),l.jsx(Tu,{className:"w-10 text-center",children:"喜欢"}),l.jsx(Tu,{className:"w-[84px] text-right",children:"时长"})]})}),l.jsxs(fX,{children:[m&&l.jsx(Eu,{children:l.jsx(Wr,{colSpan:5,className:"whitespace-normal py-16 text-center text-sm text-muted-foreground",children:l.jsxs("span",{className:"inline-flex items-center gap-2",children:[l.jsx(wr,{className:"size-5 animate-spin"}),x]})})}),oe>0&&l.jsx(QA,{height:oe,side:"top"}),!m&&Z.map(({row:fe,index:Se})=>{var re;const ye=fe.trackKey?c[fe.trackKey]:void 0,Xe=fe.likeRef?`${fe.likeRef.platform}:${fe.likeRef.trackId}`:fe.trackKey,nt=!!fe.track&&!fe.muted&&((re=n.current)==null?void 0:re.id)===fe.track.id;return l.jsx(uQ,{row:fe,index:Se,baseUrl:r,isCurrent:nt,isPlaying:nt&&n.playing,isLiked:Xe?a.has(Xe):!1,job:ye,isArchived:fe.trackKey?d[fe.trackKey]||!!(ye!=null&&ye.archived):!1,canDownload:!!h&&$h(fe),selectMode:!!v,selected:!!(S!=null&&S.has(fe.id)),onToggleLike:T,onToggleSelect:_,onDownload:V,onPlay:z,collect:I,rowRef:nt?ve:void 0,drag:k&&!v?{onDragStart:q,onDragEnter:P,onDragEnd:Y,isDropTarget:M!==null&&K===Se&&K!==M}:void 0},fe.id)}),ie>0&&l.jsx(QA,{height:ie,side:"bottom"}),!m&&e.length===0&&l.jsx(Eu,{children:l.jsx(Wr,{colSpan:5,className:"whitespace-normal py-6 text-center text-sm text-muted-foreground",children:g})})]})]})})})}const dQ={downloadAll:l.jsx(wc,{}),sync:l.jsx(Hd,{}),netdisk:l.jsx(bL,{}),exportM3u:l.jsx(Js,{}),rename:l.jsx(Sc,{}),remove:l.jsx(Po,{})};function fQ({playDisabled:e,onPlayAll:t,selectMode:n,onToggleSelectMode:r,onDownloadAll:a,sync:o,onNetdisk:c,onRename:d,onRemove:h,onExportM3u:m}){const x={downloadAll:!!a,sync:o?{on:o.on}:null,netdisk:!!c,rename:!!d,remove:!!h,exportM3u:!!m},g=GY(x),v="[&>span:first-child]:hidden pl-2 pr-2",S={downloadAll:a,sync:o==null?void 0:o.onToggle,netdisk:c,rename:d,remove:h,exportM3u:m};return l.jsxs(l.Fragment,{children:[l.jsxs(Ne,{size:"small",disabled:e,onClick:t,children:[l.jsx(Hn,{className:"size-4"})," 播放全部"]}),l.jsxs(Ne,{size:"small",variant:n?"default":"neutral","aria-pressed":n,onClick:r,children:[l.jsx(SL,{className:"size-4"})," 多选"]}),g.length>0&&l.jsxs(Tx,{children:[l.jsx(Rx,{asChild:!0,children:l.jsx(Ne,{size:"small",variant:"neutral","aria-label":"更多操作",children:l.jsx(_p,{className:"size-4"})})}),l.jsx(qf,{align:"start",size:"sm",className:"w-44",children:g.map(b=>{if(b.kind==="separator")return l.jsx(su,{},b.key);const j=dQ[b.key];return b.kind==="checkbox"?l.jsxs(Qk,{checked:b.checked,className:v,onSelect:C=>{var k;C.preventDefault(),(k=S[b.key])==null||k.call(S)},children:[j,b.label,b.checked&&l.jsx(Rs,{className:"ml-auto size-3.5"})]},b.key):l.jsxs(xs,{variant:b.destructive?"destructive":"default",onSelect:()=>{var C;return(C=S[b.key])==null?void 0:C.call(S)},children:[j,b.label]},b.key)})})]})]})}function hQ({conn:e,count:t,anchorStreamId:n,onPick:r,onDownload:a,onCancel:o}){const[c,d]=p.useState(!1),[h,m]=p.useState([]),[x,g]=p.useState("");p.useEffect(()=>{c&&be.collections(e,"audio").then(S=>{const b=[...S.filter(j=>!j.system)].sort((j,C)=>+(C.anchorStreamId===n)-+(j.anchorStreamId===n));m(b)}).catch(()=>m([]))},[c,e,n]);const v=async()=>{const S=x.trim();if(!S)return;const b=await be.createCollection(e,"audio",S,n??void 0);g(""),d(!1),r(b.id)};return l.jsxs("div",{className:"pointer-events-auto absolute bottom-24 left-1/2 z-30 flex -translate-x-1/2 items-center gap-3 rounded-full bg-[var(--acr-panel)] px-4 py-2 shadow-[0_0_0_1px_rgba(190,190,190,0.16),0_16px_48px_rgba(0,0,0,0.45)] backdrop-blur-xl",children:[l.jsxs("span",{className:"text-[13px] tabular-nums",children:["已选 ",t," 首"]}),l.jsxs(Ne,{size:"small",variant:"neutral",onClick:a,children:[l.jsx(wc,{className:"size-4"})," 下载"]}),l.jsxs(gy,{open:c,onOpenChange:d,children:[l.jsx(xy,{asChild:!0,children:l.jsxs(Ne,{size:"small",children:[l.jsx(Pp,{className:"size-4"})," 加入播单"]})}),l.jsxs(Ch,{align:"center",side:"top",className:"w-56 p-1.5",children:[l.jsxs("div",{className:"flex max-h-64 flex-col gap-0.5 overflow-y-auto scrollbar-mac",children:[h.map(S=>l.jsxs("button",{onClick:()=>{d(!1),r(S.id)},className:"flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] hover:bg-[var(--acr-hover)]",children:[l.jsx(Js,{className:"size-4 shrink-0 text-muted-foreground"}),l.jsx("span",{className:"min-w-0 flex-1 truncate",children:S.label}),S.anchorStreamId===n&&l.jsx("span",{className:"text-[10px] text-muted-foreground",children:"本节目"})]},S.id)),h.length===0&&l.jsx("div",{className:"px-2 py-2 text-[12px] text-muted-foreground",children:"还没有播单。"})]}),l.jsx("div",{className:"mt-1 border-t border-[var(--acr-border-soft)] pt-1.5",children:l.jsx(Jt,{placeholder:"新建播单…",value:x,onChange:S=>g(S.target.value),onKeyDown:S=>{S.key==="Enter"&&v()}})})]})]}),l.jsx(Ne,{size:"small",variant:"ghost",onClick:o,children:"取消"})]})}function mQ({conn:e,channels:t,onChannelsChanged:n,onReload:r}){var Fu,ka,nm;const a=Oy(),[o,c]=p.useState("content"),d=vA(),h=qA(d.pathname()),m=p.useMemo(()=>{const F=new Set,he=[];for(const Ae of t)for(const Ve of Ae.streams)F.has(Ve.id)||(F.add(Ve.id),he.push(Ve));return he},[t]),x=p.useMemo(()=>OY(m),[m]),g=p.useMemo(()=>new Map(m.map(F=>[F.id,F.description||F.id])),[m]),{selection:v,navigate:S}=lX(qA,tQ),b=v.kind==="playlist"?v.id:v.kind==="liked"?Du:null,j=v.kind==="collection",C=v.kind==="collection"?v.id:null,k=v.kind==="search"?v.q:"",N=cX("music:grid",bA),[T,R]=p.useState(h.kind==="search"?h.q:""),[A,O]=p.useState(""),[z,_]=p.useState(!1),[V,B]=p.useState([]),[G,I]=p.useState(!1),[H,ee]=p.useState([]),[X,M]=p.useState([]),[U,K]=p.useState(!1),[ne,q]=p.useState(null),[P,L]=p.useState({}),[Y,J]=p.useState({}),[$,se]=p.useState(!1),[oe,ie]=p.useState(null),[Z,ve]=p.useState(!1),[Te,Ee]=p.useState(new Set),[Ie,Fe]=p.useState(!1),[fe,Se]=p.useState(new Set),[ye,Xe]=p.useState([]),[nt,re]=p.useState(null),[_e,Pe]=p.useState(null),[We,ge]=p.useState(new Map),[Ge,je]=p.useState(null),[kt,zt]=p.useState(""),[Xn,fn]=p.useState(!1),[Qn,sn]=p.useState(null),[Zn,we]=p.useState(!1),[Oe,lt]=p.useState([]),[an,en]=p.useState(!1),[bt,Ft]=p.useState(""),Sn=p.useRef({}),Me=p.useRef(P);Me.current=P;const Ue=p.useRef(b);Ue.current=b;const ke=()=>{be.collectionItems(e,Th.audioLiked).then(F=>{Ee(new Set(F.map(he=>`${he.platform}:${he.trackId}`))),M(F)}).catch(()=>{})},ft=F=>{const he=F.likeRef??_u(F.trackKey);if(!he)return;const Ae=`${he.platform}:${he.trackId}`,Ve=Te.has(Ae);Ee(at=>{const Rt=new Set(at);return Ve?Rt.delete(Ae):Rt.add(Ae),Rt});const qe={kind:"track",platform:he.platform,trackId:he.trackId};if(Ve){M(at=>at.filter(Rt=>`${Rt.platform}:${Rt.trackId}`!==Ae)),be.removeFromCollection(e,Th.audioLiked,qe).catch(ke);return}const mt={key:`track:${he.platform}:${he.trackId}`,kind:"track",domain:"audio",platform:he.platform,trackId:he.trackId,title:F.title,artist:F.author,album:F.album,poster:F.poster,durationS:F.durationS,sourceUrl:F.sourceUrl,firstCollectedAt:Date.now()};M(at=>[mt,...at.filter(Rt=>`${Rt.platform}:${Rt.trackId}`!==Ae)]),be.addToCollection(e,Th.audioLiked,qe,{title:F.title,artist:F.author,album:F.album,poster:F.poster,durationS:F.durationS,sourceUrl:F.sourceUrl}).then(at=>{M(Rt=>[at,...Rt.filter(ct=>`${ct.platform}:${ct.trackId}`!==Ae)])}).catch(ke)};p.useEffect(()=>{ke()},[e]);const Pt=()=>{be.collections(e,"audio").then(F=>lt(F.filter(he=>!he.system))).catch(()=>lt([]))};p.useEffect(()=>{Pt()},[e]),p.useEffect(()=>{if(Fe(!1),Se(new Set),!b||b===Du){ee([]),q(b),O("");return}let F=!0;return K(!0),se(XR(Ly(t,b))),L({}),J({}),O(""),be.items(e,{stream:b,limit:2e3}).then(he=>F&&ee(he)).catch(()=>F&&ee([])).finally(()=>{F&&(K(!1),q(b))}),()=>{F=!1}},[e,b]);const Qt=XR(Ly(t,b));p.useEffect(()=>{!b||b===Du||se(Qt)},[Qt,b]),p.useEffect(()=>{Ca(),re(null),Pe(null),ge(new Map)},[e,b]),p.useEffect(()=>{if(ge(new Map),Se(new Set),!nt||!b){Pe(null);return}let F=!0;return be.collectionItems(e,nt).then(async he=>{if(!F)return;Pe(he);const Ae=KR(he,b),Ve=new Map;await Promise.all([...Ae.fetchStreams.keys()].map(async qe=>{const mt=await be.items(e,{stream:qe,limit:2e3}).catch(()=>[]);for(const at of mt)Ve.set(at.id,at)})),F&&ge(Ve)}).catch(()=>{F&&(Pe([]),Ke.error("播单成员加载失败"))}),()=>{F=!1}},[e,nt,b]);const[Rn,At]=p.useState(null),[_n,ws]=p.useState(new Map),[Ht,An]=p.useState(null),[ya,Jn]=p.useState(!1);p.useEffect(()=>{if(O(""),!C){At(null),ws(new Map),An(null),Jn(!1);return}let F=!0;return At(null),ws(new Map),Jn(!1),be.collections(e,"audio").then(he=>{F&&(An(he.find(Ae=>Ae.id===C&&!Ae.system)??null),Jn(!0))}).catch(()=>{F&&Ke.error("播单信息加载失败")}),be.collectionItems(e,C).then(async he=>{if(!F)return;At(he);const Ae=KR(he,""),Ve=new Map;await Promise.all([...Ae.fetchStreams.keys()].map(async qe=>{const mt=await be.items(e,{stream:qe,limit:2e3}).catch(()=>[]);for(const at of mt)Ve.set(at.id,at)})),F&&ws(Ve)}).catch(()=>{F&&(At([]),Ke.error("播单加载失败"))}),()=>{F=!1}},[e,C]);const{collectionRows:dr,collectionTracks:Qh}=p.useMemo(()=>{if(!Rn)return{collectionRows:null,collectionTracks:[]};const{rows:F,tracks:he}=GR(Rn,Ae=>_n.get(Ae),e.baseUrl);return{collectionRows:F,collectionTracks:he}},[Rn,_n,e.baseUrl]);p.useEffect(()=>{BY({selCollection:C,membersLoaded:Rn!==null,metaLoaded:ya,meta:Ht})&&S({kind:"home"})},[C,Rn,ya,Ht]);const Fs=j?Rn===null:b!=null&&b!==Du&&ne!==b,jn=p.useMemo(()=>{var F;return zY((F=t.flatMap(he=>he.streams).find(he=>he.id===b))==null?void 0:F.sources)},[t,b]),{rows:Cn,playableTracks:Xr}=p.useMemo(()=>{const F=[];return{rows:IY(H,zy).map(Ae=>{const Ve=Oh(Ae,e.baseUrl),qe=Ve?F.push(Ve)-1:-1;return{item:Ae,track:Ve,playIndex:qe}}),playableTracks:F}},[H,e.baseUrl]),ci=p.useMemo(()=>Cn.map(({item:F,track:he,playIndex:Ae})=>{var qe;const Ve=HR(F);return{id:F.id,title:zy(F),author:typeof F.author=="string"?F.author:void 0,album:TY((qe=F.content)==null?void 0:qe.text),poster:(he==null?void 0:he.poster)??ZX(F),durationS:he==null?void 0:he.durationS,track:he??void 0,playIndex:Ae,vip:QX(F),origin:qR(F,jn),trackKey:Ve,likeRef:_u(Ve)??void 0,sourceUrl:F.url,muted:!he,sourceItem:F}}),[Cn]);p.useEffect(()=>{G&&!U&&Xr.length>0&&(a.playQueue(Xr,0,"music"),I(!1))},[G,U,Xr]);const hn=Ly(t,b),qt=b===Du,_l=nQ({sel:b,selStream:!!hn,isLikedPlaylist:qt,channelsLoaded:t.length>0,isCollection:v.kind==="collection"});async function mo(){if(!hn)return;const F=await be.items(e,{stream:hn.id,limit:2e3}).catch(()=>null);F&&ee(F)}const ba=WY({isCollection:j,isLikedPlaylist:qt,streamId:b,collectionId:C}),ui=async()=>{if(ba)try{const F=ba.kind==="collection"?await be.exportCollectionPlaylist(e,ba.id):await be.exportStreamPlaylist(e,ba.id);ie(F)}catch{Ke.error("生成 m3u 失败")}},Qr=p.useMemo(()=>X.map(F=>({id:`liked:${F.platform}:${F.trackId}`,kind:"music",url:zh(e.baseUrl,{platform:F.platform,trackId:F.trackId}),title:F.title,author:F.artist,poster:F.poster?os(e.baseUrl,F.poster):void 0,durationS:F.durationS})),[e.baseUrl,X]),Hs=p.useMemo(()=>X.map((F,he)=>({id:`liked:${F.platform}:${F.trackId}`,title:F.title,author:F.artist,album:F.album,poster:F.poster,durationS:F.durationS,track:Qr[he],playIndex:he,trackKey:`${F.platform}:${F.trackId}`,likeRef:{platform:F.platform,trackId:F.trackId},sourceUrl:F.sourceUrl})),[X,Qr]),wa=p.useMemo(()=>new Map(H.map(F=>[F.id,F])),[H]),{scopeRows:Yt,scopeTracks:Zh}=p.useMemo(()=>{if(!_e)return{scopeRows:null,scopeTracks:[]};const{rows:F,tracks:he}=GR(_e,Ae=>wa.get(Ae)??We.get(Ae),e.baseUrl);return{scopeRows:F,scopeTracks:he}},[_e,wa,We,e.baseUrl]),Ol=p.useMemo(()=>$Y(WR({collectionRows:dr,scopeRows:Yt,isLikedPlaylist:qt,likedRows:Hs,tableRows:ci}),A),[dr,Yt,qt,Hs,ci,A]),Sa=p.useMemo(()=>{const F=j&&C&&Rn?{id:C,members:Rn,set:At}:qt?{id:Th.audioLiked,members:X,set:M}:null;if(!F||A.trim())return;const{id:he,members:Ae,set:Ve}=F;return(qe,mt)=>{const at=VY(Ae,qe,mt);at!==Ae&&(Ve(at),be.reorderCollection(e,he,at.map(Rt=>Rt.key)).catch(Rt=>{Ve(Ae),Ke.error("排序没保存",{description:Rt instanceof Error?Rt.message:String(Rt)})}))}},[j,C,Rn,qt,X,A,e]),qs=dr?Qh:Yt?Zh:qt?Qr:Xr,Iu=p.useMemo(()=>V.map(F=>({id:F.id,kind:"music",url:zh(e.baseUrl,{platform:F.platform,trackId:F.trackId}),title:F.title,author:F.artist,poster:F.poster?os(e.baseUrl,F.poster):void 0,durationS:F.durationS})),[e.baseUrl,V]),$u=p.useMemo(()=>V.map((F,he)=>({id:F.id,title:F.title,author:F.artist,album:F.album,poster:F.poster,durationS:F.durationS,track:Iu[he],playIndex:he,trackKey:`${F.platform}:${F.trackId}`,likeRef:{platform:F.platform,trackId:F.trackId},sourceUrl:F.sourceUrl})),[V,Iu]),zl=qt?Hs:k?$u:ci,di=p.useMemo(()=>zl.map(F=>F.likeRef??_u(F.trackKey)).filter(F=>!!F),[zl]);p.useEffect(()=>{if(di.length===0){J({});return}let F=!0;return be.archiveStatus(e,di).then(he=>{F&&J(he.archived)}).catch(()=>{F&&J({})}),()=>{F=!1}},[e,di]);const ja=async(F={})=>{var at,Rt;const he=await be.downloadJobs(e),Ae={},Ve=new Map(zl.map(ct=>[ct.trackKey,ct.title])),qe=di.length?(await be.archiveStatus(e,di)).archived:{},mt=new Map;for(const ct of he.jobs){const jt=`${ct.platform}:${ct.track_id}`,hr=mt.get(jt);(!hr||ct.id>hr.id)&&mt.set(jt,ct)}for(const[ct,jt]of mt)if(Ae[ct]={id:jt.id,state:jt.state,attempts:jt.attempts,lastError:jt.last_error,downloadedBytes:jt.downloaded_bytes,totalBytes:jt.total_bytes,archived:jt.archived,failedAt:jt.state==="failed"?((at=P[ct])==null?void 0:at.id)===jt.id?(Rt=P[ct])==null?void 0:Rt.failedAt:Sn.current[ct]==="queued"||Sn.current[ct]==="running"?Date.now():void 0:void 0},F.notify){const hr=Sn.current[ct],Ss=hr==="queued"||hr==="running";Ss&&jt.state==="done"&&!jt.archived&&!qe[ct]?Zy("归档失败",`${Ve.get(ct)??ct}:归档文件不存在或已被移动`):Ss&&jt.state==="failed"&&Zy("下载失败",`${Ve.get(ct)??ct}${jt.last_error?`:${jt.last_error}`:""}`)}Sn.current=Object.fromEntries(Object.entries(Ae).map(([ct,jt])=>[ct,jt.state])),L(ct=>{const jt={...ct},hr=new Set(Object.keys(Ae));for(const[Ss,Ks]of Object.entries(Ae))jt[Ss]=GA(ct[Ss],Ks);for(const[Ss,Ks]of Object.entries(ct))!hr.has(Ss)&&(Ks.state==="queued"||Ks.state==="running"||Ks.failedAt)&&(jt[Ss]=Ks);return jt}),J(ct=>({...ct,...qe}))};p.useEffect(()=>{let F=!0;const he=()=>ja({notify:!0}).catch(()=>{});he();const Ae=setInterval(()=>{if(!F)return;Object.values(Me.current).some(qe=>qe.state==="queued"||qe.state==="running")&&he()},5e3);return()=>{F=!1,clearInterval(Ae)}},[e,di]),KX(be.wsUrl(e),p.useCallback(F=>{if(F.type!=="audio-download")return;const he=`${F.job.platform}:${F.job.track_id}`;L(Ae=>{var mt,at;const Ve=GA(Ae[he],{id:F.job.id,state:F.job.state,attempts:F.job.attempts,lastError:F.job.last_error,downloadedBytes:F.job.downloaded_bytes,totalBytes:F.job.total_bytes,archived:F.job.archived,failedAt:F.job.state==="failed"?((mt=Ae[he])==null?void 0:mt.id)===F.job.id?(at=Ae[he])==null?void 0:at.failedAt:Date.now():void 0}),qe=Ae[he];return(qe==null?void 0:qe.id)===Ve.id&&qe.state===Ve.state&&qe.attempts===Ve.attempts&&qe.lastError===Ve.lastError&&qe.downloadedBytes===Ve.downloadedBytes&&qe.totalBytes===Ve.totalBytes&&qe.archived===Ve.archived&&qe.failedAt===Ve.failedAt?Ae:{...Ae,[he]:Ve}}),F.job.archived&&J(Ae=>({...Ae,[he]:!0}))},[])),p.useEffect(()=>{const F=Object.entries(P).filter(([,Ve])=>Ve.state==="failed"&&Ve.failedAt);if(!F.length)return;const he=Math.max(250,Math.min(...F.map(([,Ve])=>Math.max(0,5e3-(Date.now()-(Ve.failedAt??0)))))),Ae=setTimeout(()=>{const Ve=Date.now();L(qe=>{let mt=!1;const at={...qe};for(const[Rt,ct]of Object.entries(at))ct.state==="failed"&&ct.failedAt&&Ve-ct.failedAt>=5e3&&(delete at[Rt],mt=!0);return mt?at:qe})},he);return()=>clearTimeout(Ae)},[P]);const Pl=F=>{const he=T.trim();if(!he){S({kind:"home"});return}R(he),S({kind:"search",q:he})};p.useEffect(()=>{if(!k){B([]),_(!1);return}R(k);let F=!0;return _(!0),be.musicSearch(e,k).then(he=>{F&&B(he)}).catch(()=>{F&&B([])}).finally(()=>{F&&_(!1)}),()=>{F=!1}},[e,k]);const Zr=async(F,he={})=>{const Ae=F.likeRef??_u(F.trackKey);if(!F.sourceItem&&!Ae)return{ok:!1};const Ve=F.trackKey;Ve&&he.optimistic&&L(qe=>{const mt=qe[Ve];return(mt==null?void 0:mt.state)==="queued"||(mt==null?void 0:mt.state)==="running"?qe:{...qe,[Ve]:{state:"queued"}}});try{return{ok:!0,enqueued:(await be.download(e,F.sourceItem?{itemId:F.sourceItem.id,skipArchived:he.skipArchived,force:he.force}:{track:{platform:Ae.platform,trackId:Ae.trackId,title:F.title,artist:F.author,album:F.album||void 0,pageUrl:F.sourceUrl},skipArchived:he.skipArchived,force:he.force})).enqueued}}catch(qe){return Ve&&L(mt=>{const at={...mt};return delete at[Ve],at}),{ok:!1,error:qe}}},er=async F=>{const he=await Zr(F,{optimistic:!0,force:!0});if(he.ok){await ja().catch(()=>{});return}"error"in he&&Zy("加入下载队列失败",he.error instanceof Error?he.error.message:F.title)},Bu=async(F,he)=>{let Ae=0,Ve=0,qe=0,mt=0;const at=async()=>{for(;mt<F.length;){const ct=F[mt++],jt=await Zr(ct,{skipArchived:!0});if(!jt.ok){Ve++;continue}jt.enqueued>0?Ae++:qe++}};await Promise.all(Array.from({length:Math.min(eQ,F.length)},()=>at())),await ja().catch(()=>{});const Rt=ZR({succeeded:Ae,failed:Ve,skipped:he,archived:qe});Rt.kind==="success"?Ke.success(Rt.text):Ke.error(Rt.text)},hb=F=>{Se(he=>{const Ae=new Set(he);return Ae.has(F.id)?Ae.delete(F.id):Ae.add(F.id),Ae})},Ca=()=>{if(!b||qt){Xe([]);return}const F=b;be.collections(e,"audio",F).then(he=>{F===Ue.current&&Xe(he)}).catch(()=>{F===Ue.current&&Xe([])})},Jh=async()=>{if(!Ge)return;const F=kt.trim();if(F){fn(!0);try{await be.renameCollection(e,Ge.id,F),C===Ge.id&&An(he=>he&&{...he,label:F}),je(null),Ca(),Pt()}catch{Ke.error("重命名失败")}finally{fn(!1)}}},Ll=async()=>{if(!Qn)return;const F=Qn.id;we(!0);try{await be.deleteCollection(e,F),nt===F&&re(null);const he=C===F;sn(null),Ca(),he&&S({kind:"home"}),Pt()}catch{Ke.error("删除失败")}finally{we(!1)}},Il=WR({collectionRows:dr,scopeRows:Yt,isLikedPlaylist:qt,likedRows:Hs,tableRows:ci}),fr=!!nt&&!Yt,Uu=()=>{const F=YY({isCollection:j,isLikedPlaylist:qt,scopeId:nt,streamId:b});if(F.kind==="stream"){be.download(e,{stream:F.streamId,skipArchived:!0}).then(Ve=>{const qe=ZR({succeeded:Ve.enqueued,failed:0,skipped:0,archived:Ve.skipped});qe.kind==="success"?Ke.success(qe.text):Ke.error(qe.text),ja().catch(()=>{})}).catch(()=>Ke.error("加入下载队列失败"));return}const{targets:he,skipped:Ae}=QR({rows:Il,canDownload:$h});if(he.length===0){Ke.error("这个列表里没有可下载的曲目");return}Bu(he,Ae)},em=async F=>{const he=!qt&&b?b:null,Ve=Il.filter(qe=>fe.has(qe.id)).flatMap(qe=>{const mt=ku(qe,he);return mt?[{key:mt,title:qe.title,poster:qe.poster,artist:qe.author,album:qe.album,durationS:qe.durationS,sourceUrl:qe.sourceUrl}]:[]});if(Ve.length!==0)try{await be.addToCollectionBatch(e,F,Ve),Ke.success(`已加入播单:${Ve.length} 首`),Fe(!1),Se(new Set),Ca(),Pt()}catch{Ke.error("加入播单失败")}},Vu=()=>{const{targets:F,skipped:he}=QR({rows:Il,canDownload:$h,selection:{ids:fe,idOf:Ae=>Ae.id}});if(F.length===0){Ke.error("选中的曲目都没有可下载的来源");return}Bu(F,he),Fe(!1),Se(new Set)},fi=()=>{Ca(),Pt()},tm=async()=>{const F=bt.trim();if(F)try{const he=await be.createCollection(e,"audio",F);en(!1),Ft(""),lt(Ae=>[...Ae,he]),Ke.success(`已创建播单:${F}`)}catch{Ke.error("创建播单失败")}};return l.jsxs("div",{className:"relative flex h-full min-h-0 flex-col",children:[_l==="loading"?l.jsxs("div",{className:"flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground",children:[l.jsx(wr,{className:"size-5 animate-spin"})," 载入中…"]}):_l==="track-list"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-3 border-b border-border px-4 py-3",children:[l.jsx(Ne,{icon:!0,size:"large",variant:"neutral","aria-label":"返回",onClick:()=>S({kind:"home"}),children:l.jsx(N1,{})}),(()=>{var he,Ae;const F=j?void 0:qt?(he=X[0])==null?void 0:he.poster:(hn==null?void 0:hn.image)??((Ae=Xr[0])==null?void 0:Ae.poster);return F?l.jsx("img",{src:os(e.baseUrl,F),alt:"",className:"size-12 shrink-0 rounded-md object-cover"}):l.jsx("span",{className:"flex size-12 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground",children:qt?l.jsx(Fd,{className:"size-5 fill-primary text-primary"}):l.jsx(Js,{className:"size-5"})})})(),l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsx("div",{className:"truncate text-[15px] font-bold",children:j?(Ht==null?void 0:Ht.label)??"播单":qt?"我喜欢的歌曲":(hn==null?void 0:hn.description)||(hn==null?void 0:hn.id)}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:j?A?`${Ol.length} / ${(dr==null?void 0:dr.length)??0} 首`:`${(dr==null?void 0:dr.length)??0} 首`:A?`${Ol.length} / ${qt?X.length:Cn.length} 首`:`${qt?X.length:Cn.length} 首`})]}),l.jsx(Zf,{size:"large",className:"w-56 max-w-[48%] shrink-0",value:A,onChange:F=>O(F.target.value),onClear:()=>O(""),placeholder:"搜索本列表","aria-label":"在列表内搜索"}),l.jsx(fQ,{playDisabled:qs.length===0,onPlayAll:()=>a.playQueue(qs,0,"music"),selectMode:Ie,onToggleSelectMode:()=>{Fe(!Ie),Se(new Set)},onDownloadAll:!fr&&Il.some($h)?Uu:void 0,sync:hn&&!qt&&!j?{on:$,onToggle:()=>{if(!b)return;const F=!$;se(F),be.setSync(e,b,F).catch(()=>se(!F))}}:void 0,onNetdisk:hn&&!qt&&!j?()=>ve(!0):void 0,onExportM3u:ba?ui:void 0,onRename:j&&Ht?()=>{je(Ht),zt(Ht.label)}:void 0,onRemove:j&&Ht?()=>sn(Ht):void 0})]}),!j&&ye.length>0&&l.jsxs("div",{className:"flex shrink-0 items-center gap-1.5 overflow-x-auto border-b border-border px-4 py-2 scrollbar-mac",children:[l.jsx(Ne,{size:"mini",variant:nt?"neutral":"default",className:"rounded-full",onClick:()=>re(null),children:"全部"}),ye.map(F=>l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:l.jsxs(Ne,{size:"mini",variant:nt===F.id?"default":"neutral",className:"rounded-full",onClick:()=>re(nt===F.id?null:F.id),children:[F.label,typeof F.itemCount=="number"?` (${F.itemCount})`:""]})}),l.jsxs(Tl,{size:"sm",className:"w-32",children:[l.jsxs(Rr,{onSelect:()=>{je(F),zt(F.label)},children:[l.jsx(Sc,{}),l.jsx("span",{children:"重命名"})]}),l.jsxs(Rr,{variant:"destructive",onSelect:()=>sn(F),children:[l.jsx(Po,{}),l.jsx("span",{children:"删除播单"})]})]})]},F.id))]}),hn&&!qt&&l.jsx(sX,{apiBase:e.baseUrl,open:Z,onOpenChange:ve,streamId:hn.id,streamTitle:hn.description||hn.id,onChanged:()=>{mo()}}),l.jsx(ZA,{rows:Ol,queue:qs,stage:a,baseUrl:e.baseUrl,liked:Te,toggleLike:ft,jobs:P,archived:Y,onDownload:er,busy:Fs,selectMode:Ie,selectedIds:fe,onToggleSelect:hb,jumpKey:b??void 0,onReorder:Sa,collect:{conn:e,streamId:!qt&&b?b:null,onChanged:fi},emptyText:j?A?"没有匹配的曲目。":"这个播单还是空的——去某个播客里用「加入播单」把节目收进来。":A?"没有匹配的节目。":qt?"还没有喜欢的歌曲。":"这个歌单还没有曲目(等待下次抓取)。"}),l.jsx(kY,{open:!!oe,onOpenChange:F=>{F||ie(null)},children:l.jsxs(IR,{children:[l.jsxs($R,{children:[l.jsx(UR,{children:oe!=null&&oe.written?"已生成 m3u":"未生成 m3u"}),l.jsxs(VR,{children:["写入 ",(oe==null?void 0:oe.written)??0," 首",oe&&oe.skipped>0?`,跳过 ${oe.skipped} 首(还没有本地文件)`:"",oe!=null&&oe.path?l.jsxs(l.Fragment,{children:["。文件位置:",l.jsx("br",{}),l.jsx("code",{className:"break-all",children:oe.path})]}):"。没有可写入的曲目,未生成文件。"]})]}),l.jsx(BR,{children:l.jsx(FR,{onClick:()=>ie(null),children:"好"})})]})})]}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:[l.jsx(Lf,{title:((Fu=t[0])==null?void 0:Fu.label)??((ka=t[0])==null?void 0:ka.description)??"歌单",onRefresh:r,exportChannel:t.length===1?{conn:e,id:t[0].id}:void 0,className:"min-w-0 flex-1"}),l.jsx(Zf,{size:"large",className:"w-56 max-w-[48%] shrink-0",value:T,onChange:F=>R(F.target.value),onClear:()=>R(""),onKeyDown:F=>{F.key==="Enter"&&Pl()},placeholder:"搜索歌曲 / 歌手","aria-label":"搜索歌曲或歌手"})]}),t[0]?l.jsx(Cy,{value:o,onChange:c}):null,o==="config"&&t[0]?l.jsx("div",{className:"min-h-0 flex-1 overflow-auto",children:l.jsx(jy,{conn:e,channelId:t[0].id,showHeader:!1,onChanged:n,onDeleted:()=>{c("content")}})}):l.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:k?l.jsx(ZA,{rows:$u,queue:Iu,stage:a,baseUrl:e.baseUrl,liked:Te,toggleLike:ft,jobs:P,archived:Y,onDownload:er,busy:z,busyText:"搜索中…",jumpKey:`search:${k}`,collect:{conn:e,streamId:null},emptyText:"没有找到歌曲。"}):l.jsxs(Gy,{ref:N,className:"h-full p-4 pb-24 scrollbar-mac",children:[l.jsxs("div",{className:"mb-1.5 flex items-center gap-2",children:[l.jsx("span",{className:"text-[13px] font-semibold text-muted-foreground",children:"我的播单"}),an?l.jsx(Jt,{autoFocus:!0,className:"h-6 w-40 text-[12px]",placeholder:"播单名,回车创建",value:bt,onChange:F=>Ft(F.target.value),onKeyDown:F=>{F.key==="Enter"&&tm(),F.key==="Escape"&&(en(!1),Ft(""))},onBlur:()=>{en(!1),Ft("")}}):l.jsx("button",{onClick:()=>en(!0),className:"text-[12px] text-muted-foreground transition-colors hover:text-foreground",children:"+ 新建播单"})]}),l.jsxs("div",{"data-testid":"music-liked-grid",className:HA,children:[l.jsxs(Wy,{onOpen:()=>S({kind:"liked"}),ariaLabel:"我喜欢的歌曲",src:(nm=X[0])!=null&&nm.poster?os(e.baseUrl,X[0].poster):void 0,ratio:"1 / 1",fallback:l.jsx(Fd,{className:"size-10 fill-primary text-primary"}),caption:"overlay",title:"我喜欢的歌曲",children:[l.jsxs(Yy,{className:"right-1.5 top-1.5 tabular-nums",children:[X.length," 首"]}),l.jsx("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center bg-black/0 opacity-0 transition-all duration-200 group-hover:bg-black/25 group-hover:opacity-100",children:l.jsx("button",{onClick:F=>{F.stopPropagation(),S({kind:"liked"}),Qr.length&&a.playQueue(Qr,0,"music")},"aria-label":"播放",className:"pointer-events-auto flex size-14 items-center justify-center rounded-full border border-white/40 bg-white/20 text-white shadow-xl backdrop-blur-md transition-transform duration-200 hover:scale-110 hover:bg-white/30",children:l.jsx(Hn,{className:"size-6 translate-x-0.5 fill-current"})})})]}),UY(Oe,g).map(F=>{const he=Oe.find(Ae=>Ae.id===F.id);return l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:l.jsx("div",{children:l.jsx(Wy,{onOpen:()=>S({kind:"collection",id:F.id}),ariaLabel:F.label,ratio:"1 / 1",fallback:l.jsx(Js,{className:"size-9"}),caption:"overlay",title:F.label,subtitle:F.subtitle,children:l.jsxs(Yy,{className:"right-1.5 top-1.5 tabular-nums",children:[F.itemCount," 首"]})})})}),l.jsxs(Tl,{size:"sm",className:"w-32",children:[l.jsxs(Rr,{onSelect:()=>{je(he),zt(he.label)},children:[l.jsx(Sc,{}),l.jsx("span",{children:"重命名"})]}),l.jsxs(Rr,{variant:"destructive",onSelect:()=>sn(he),children:[l.jsx(Po,{}),l.jsx("span",{children:"删除播单"})]})]})]},F.id)})]}),m.length===0?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mt-6 mb-1.5 text-[13px] font-semibold text-muted-foreground",children:"歌单 / 播客"}),l.jsx("div",{className:"px-1 py-3 text-[13px] text-muted-foreground",children:"还没有歌单。去「添加来源」把音乐/电台源加为歌单。"})]}):l.jsx(l.Fragment,{children:[{key:"music",label:"歌单",list:x.playlists,icon:l.jsx(Js,{className:"size-9"})},{key:"podcast",label:"播客",list:x.podcasts,icon:l.jsx(kL,{className:"size-9"})}].filter(F=>F.list.length>0).map(F=>l.jsxs("div",{children:[l.jsx("div",{className:"mt-6 mb-1.5 text-[13px] font-semibold text-muted-foreground",children:F.label}),l.jsx("div",{className:HA,children:F.list.map(he=>{const Ae=JX(he);return l.jsx(vX,{id:he.id,label:he.description||he.id,children:l.jsxs(Wy,{onOpen:()=>S({kind:"playlist",id:he.id}),ariaLabel:he.description||he.id,src:he.image?os(e.baseUrl,he.image):void 0,ratio:"1 / 1",fallback:F.icon,caption:"overlay",title:he.description||he.id,children:[Ae&&l.jsx(Yy,{className:"right-1.5 top-1.5",children:Ae}),l.jsx("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center bg-black/0 opacity-0 transition-all duration-200 group-hover:bg-black/25 group-hover:opacity-100",children:l.jsx("button",{onClick:Ve=>{Ve.stopPropagation(),S({kind:"playlist",id:he.id}),I(!0)},"aria-label":"播放",className:"pointer-events-auto flex size-14 items-center justify-center rounded-full border border-white/40 bg-white/20 text-white shadow-xl backdrop-blur-md transition-transform duration-200 hover:scale-110 hover:bg-white/30",children:l.jsx(Hn,{className:"size-6 translate-x-0.5 fill-current"})})})]})},he.id)})})]},F.key))})]})})]}),_l==="track-list"&&Ie&&fe.size>0&&l.jsx(hQ,{conn:e,count:fe.size,anchorStreamId:!qt&&b?b:null,onPick:F=>void em(F),onDownload:()=>Vu(),onCancel:()=>{Fe(!1),Se(new Set)}}),l.jsx(XX,{renaming:Ge,deleting:Qn,renameLabel:kt,onRenameLabelChange:zt,onCloseRename:()=>je(null),onCloseDelete:()=>sn(null),onConfirmRename:()=>void Jh(),onConfirmDelete:()=>void Ll(),renameSaving:Xn,deleteSaving:Zn,renameTitle:"重命名播单",renameDesc:"修改这个子列表的显示名称。",nameLabel:"播单名称",deleteTitle:"删除播单",deleteBody:F=>`将删除「${F}」这个子列表;其中的分集/曲目仍留在原 stream 里,不会被删除。此操作不可撤销。`}),o==="config"?null:l.jsx(qX,{conn:e})]})}function pQ({channel:e,onChannelsChanged:t,onReload:n}){const r=p.useMemo(()=>iX("/music"),[]);return l.jsx("div",{"data-testid":"panel-music",className:"flex min-h-0 flex-1 flex-col",children:l.jsx(oX,{location:r,children:l.jsx(Cx,{conn:ut,children:l.jsx(mQ,{conn:ut,channels:[e],onChannelsChanged:t,onReload:n})})})})}function Jy(e){let t;function n(r){if(document.querySelector(`link[${e.marker}]`)!==null)return;const a=document.createElement("link");a.rel="stylesheet",a.setAttribute(e.marker,""),a.href=`${r}/panel/${e.file}.css`,document.head.appendChild(a)}return{load(r){if(t!==void 0)return t;const a=(async()=>{n(r);const o=document.createElement("script");try{return o.setAttribute(e.marker,""),o.crossOrigin="anonymous",o.src=`${r}/panel/${e.file}.js`,await new Promise((c,d)=>{o.addEventListener("load",()=>{const h=globalThis[e.globalName];if(h===void 0){d(new Error(`${e.label} bundle 加载了但没有导出 ${e.globalName}`));return}c(h)}),o.addEventListener("error",()=>d(new Error(`${e.label} bundle 加载失败`))),document.head.appendChild(o)})}catch(c){throw o.remove(),t=void 0,c}})();return t=a,a}}}const gQ=Jy({marker:"data-stream-panel-research",globalName:"__streamPanelResearch",file:"panel-research",label:"研究"}),xQ=["everySeconds","everyMinutes","hourly","daily","weekly","monthly"],vQ={everySeconds:"每隔几秒",everyMinutes:"每隔几分钟",hourly:"每小时",daily:"每天",weekly:"每周",monthly:"每月"},yQ=["周日","周一","周二","周三","周四","周五","周六"];function Bh(e){return yQ[e]??String(e)}function Al(e,t,n){if(e==="*")return{all:!0,step:null,values:JA(t,n,1)};const r=new Set;let a=null;const o=e.split(",");for(const c of o){const d=/^(\*|\d{1,2}(?:-\d{1,2})?)(?:\/(\d{1,2}))?$/.exec(c);if(!d)return null;const[,h,m]=d,x=m===void 0?1:Number(m);if(x<1)return null;let g,v;if(h==="*")g=t,v=n;else if(h.includes("-")){const[S,b]=h.split("-").map(Number);g=S,v=b}else g=Number(h),v=m===void 0?Number(h):n;if(!Number.isInteger(g)||!Number.isInteger(v)||g<t||v>n||g>v)return null;for(const S of JA(g,v,x))r.add(S);o.length===1&&h==="*"&&m!==void 0&&(a=x)}return r.size===0?null:{all:!1,step:a,values:[...r].sort((c,d)=>c-d)}}function JA(e,t,n){const r=[];for(let a=e;a<=t;a+=n)r.push(a);return r}function eb(e){const t=e.trim().split(/\s+/);if(t.length!==6)return null;const n=Al(t[0],0,59),r=Al(t[1],0,59),a=Al(t[2],0,23),o=Al(t[3],1,31),c=Al(t[4],1,12),d=Al(t[5],0,6);return!n||!r||!a||!o||!c||!d?null:{second:n,minute:r,hour:a,dayOfMonth:o,month:c,dayOfWeek:d}}function bQ(e){const t=e.trim()===""?[]:e.trim().split(/\s+/);return t.length!==6?`要 6 段(含秒),现在是 ${t.length} 段——每天 09:45 = "0 45 9 * * *"`:eb(e)?null:"有一段看不懂:只支持 * / */n / a-b / a-b/n / 逗号列表,且秒分 0–59、时 0–23、日 1–31、月 1–12、周 0–6"}function Uh(e){return!e.all&&e.step===null&&e.values.length===1?e.values[0]:null}function tb(e,t){return`${String(e).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function wQ(e){const t=[...e].sort((r,a)=>r-a);return t.every((r,a)=>a===0||r===t[a-1]+1)&&t.length>2?`${Bh(t[0])}至${Bh(t.at(-1))}`:t.map(Bh).join("、")}function SQ(e){const t=eM(e);if(!t)return null;switch(t.kind){case"everySeconds":return t.n===1?"每秒":`每 ${t.n} 秒`;case"everyMinutes":return t.n===1?"每分钟":`每 ${t.n} 分钟`;case"hourly":return`每小时第 ${t.minute} 分`;case"daily":return`每天 ${tb(t.hour,t.minute)}`;case"weekly":return`${wQ(t.weekdays)} ${tb(t.hour,t.minute)}`;case"monthly":return`每月 ${t.day} 日 ${tb(t.hour,t.minute)}`}}function jQ(e){switch(e.kind){case"everySeconds":return`*/${e.n} * * * * *`;case"everyMinutes":return`0 */${e.n} * * * *`;case"hourly":return`0 ${e.minute} * * * *`;case"daily":return`0 ${e.minute} ${e.hour} * * *`;case"weekly":return`0 ${e.minute} ${e.hour} * * ${[...e.weekdays].sort((t,n)=>t-n).join(",")}`;case"monthly":return`0 ${e.minute} ${e.hour} ${e.day} * *`}}function eM(e){const t=eb(e);if(!t)return null;const{second:n,minute:r,hour:a,dayOfMonth:o,month:c,dayOfWeek:d}=t;if(!c.all)return null;if(n.step!==null&&r.all&&a.all&&o.all&&d.all)return{kind:"everySeconds",n:n.step};if(n.all&&r.all&&a.all&&o.all&&d.all)return{kind:"everySeconds",n:1};if(Uh(n)!==0)return null;if(a.all&&o.all&&d.all){if(r.step!==null)return{kind:"everyMinutes",n:r.step};if(r.all)return{kind:"everyMinutes",n:1}}const m=Uh(r);if(m===null)return null;if(a.all&&o.all&&d.all)return{kind:"hourly",minute:m};const x=Uh(a);if(x===null)return null;if(o.all&&d.all)return{kind:"daily",hour:x,minute:m};if(o.all&&!d.all&&d.step===null)return{kind:"weekly",weekdays:d.values,hour:x,minute:m};if(d.all){const g=Uh(o);if(g!==null)return{kind:"monthly",day:g,hour:x,minute:m}}return null}function CQ(e){const t=n=>Number.isInteger(n);switch(e.kind){case"everySeconds":return t(e.n)&&e.n>=1&&e.n<=59?null:"间隔必须是 1–59 秒";case"everyMinutes":return t(e.n)&&e.n>=1&&e.n<=59?null:"间隔必须是 1–59 分钟";case"hourly":return t(e.minute)&&e.minute>=0&&e.minute<=59?null:"分钟必须是 0–59 的整数";case"monthly":return!t(e.day)||e.day<1||e.day>31?"日必须是 1–31 的整数":nb(e.hour,e.minute);case"weekly":return e.weekdays.length===0?"至少选一个星期几":e.weekdays.some(n=>!t(n)||n<0||n>6)?"周几只能是 0(周日)到 6(周六)":nb(e.hour,e.minute);case"daily":return nb(e.hour,e.minute)}}function nb(e,t){return!Number.isInteger(e)||e<0||e>23?"小时必须是 0–23 的整数":!Number.isInteger(t)||t<0||t>59?"分钟必须是 0–59 的整数":null}const kQ=366*4;function NQ(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return""}}function EQ(e,{from:t=new Date,count:n=3,timeZone:r}={}){const a=eb(e);if(!a||r!==void 0&&r!==""&&r!==NQ()||!a.dayOfMonth.all&&!a.dayOfWeek.all)return null;const o=[],c=new Date(t.getFullYear(),t.getMonth(),t.getDate());for(let d=0;d<kQ&&o.length<n;d+=1){const h=new Date(c.getFullYear(),c.getMonth(),c.getDate()+d);if(a.month.values.includes(h.getMonth()+1)&&!(!a.dayOfMonth.all&&!a.dayOfMonth.values.includes(h.getDate()))&&!(!a.dayOfWeek.all&&!a.dayOfWeek.values.includes(h.getDay())))for(const m of a.hour.values){for(const x of a.minute.values){for(const g of a.second.values){const v=new Date(h.getFullYear(),h.getMonth(),h.getDate(),m,x,g);if(!(v.getTime()<=t.getTime())&&(o.push(v),o.length>=n))break}if(o.length>=n)break}if(o.length>=n)break}}return o}function tM(e){const t=n=>String(n).padStart(2,"0");return`${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function nM(e,t){const n=Math.round((e-t)/1e3),r=Math.abs(n),a=r<60?`${r} 秒`:r<3600?`${Math.round(r/60)} 分钟`:r<86400?`${Math.round(r/3600)} 小时`:`${Math.round(r/86400)} 天`;return n>=0?`${a}后`:`${a}前`}function rM(e,t){const n=SQ(e);return n===null?null:t?`${n}(${t})`:n}function sM({schedule:e,timezone:t,count:n=3,now:r=Date.now(),testId:a}){const o=EQ(e,{from:new Date(r),count:n,timeZone:t});return o===null?l.jsxs("div",{"data-testid":a,className:"text-[12px] text-muted-foreground",children:["下次:按 ",t," 计算,本机算不出来"]}):o.length===0?l.jsx("div",{"data-testid":a,className:"text-[12px] text-destructive",children:"下次:永不触发——这条排期没有任何匹配的时刻"}):l.jsxs("div",{"data-testid":a,className:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5 text-[12px] text-muted-foreground",children:[l.jsx("span",{children:"下次"}),l.jsx("span",{className:"text-foreground",children:tM(o[0])}),l.jsxs("span",{children:["(",nM(o[0].getTime(),r),")"]}),o.length>1&&l.jsxs("span",{className:"opacity-70",children:["此后 ",o.slice(1).map(tM).join(" · ")]})]})}function TQ(e){const t=eM(e);return t?{kind:t.kind,preset:t}:{kind:"raw",preset:{kind:"daily",hour:9,minute:0}}}function RQ(e,t){const n="hour"in e?e.hour:9,r="minute"in e?e.minute:0;switch(t){case"everySeconds":return{kind:t,n:30};case"everyMinutes":return{kind:t,n:5};case"hourly":return{kind:t,minute:r};case"daily":return{kind:t,hour:n,minute:r};case"weekly":return{kind:t,weekdays:e.kind==="weekly"?e.weekdays:[1,2,3,4,5],hour:n,minute:r};case"monthly":return{kind:t,day:e.kind==="monthly"?e.day:1,hour:n,minute:r}}}function Ml({label:e,value:t,min:n,max:r,onChange:a,testId:o,width:c="w-16"}){return l.jsxs("label",{className:"flex items-center gap-1.5 text-[13px] text-muted-foreground",children:[l.jsx(Jt,{type:"number",min:n,max:r,value:Number.isFinite(t)?t:"","data-testid":o,"aria-label":e,className:`${c} h-7 px-2 text-[13px]`,onChange:d=>a(d.target.value===""?NaN:Number(d.target.value))}),e]})}function rb({hour:e,minute:t,onChange:n}){return l.jsxs(l.Fragment,{children:[l.jsx(Ml,{label:"时",value:e,min:0,max:23,testId:"sched-hour",onChange:r=>n({hour:r,minute:t})}),l.jsx(Ml,{label:"分",value:t,min:0,max:59,testId:"sched-minute",onChange:r=>n({hour:e,minute:r})})]})}function AQ({taskId:e,schedule:t,timezone:n,busy:r=!1,onCancel:a,onSave:o}){const c=p.useMemo(()=>TQ(t),[t]),[d,h]=p.useState(c.kind),[m,x]=p.useState(c.preset),[g,v]=p.useState(t),S=d==="raw"?null:CQ(m),b=d==="raw"?g.trim():S?null:jQ(m),j=d==="raw"?bQ(g):null,C=S??j,k=b!==null&&C===null?rM(b,n):null;return l.jsxs("div",{"data-testid":`task-schedule-editor-${e}`,className:"flex flex-col gap-2.5 rounded-lg bg-[var(--acr-card-nested)] p-3",children:[l.jsxs("div",{className:"flex flex-wrap gap-1",children:[xQ.map(N=>l.jsx(Ne,{type:"button",size:"small",variant:d===N?"secondary":"ghost","data-testid":`sched-kind-${N}`,onClick:()=>{h(N),x(T=>RQ(T,N))},children:vQ[N]},N)),l.jsx(Ne,{type:"button",size:"small",variant:d==="raw"?"secondary":"ghost","data-testid":"sched-kind-raw",onClick:()=>{h("raw"),v(b??t)},children:"自定义表达式"})]}),l.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-2",children:[d==="everySeconds"&&m.kind==="everySeconds"&&l.jsx(Ml,{label:"秒一次",value:m.n,min:1,max:59,testId:"sched-n",onChange:N=>x({kind:"everySeconds",n:N})}),d==="everyMinutes"&&m.kind==="everyMinutes"&&l.jsx(Ml,{label:"分钟一次",value:m.n,min:1,max:59,testId:"sched-n",onChange:N=>x({kind:"everyMinutes",n:N})}),d==="hourly"&&m.kind==="hourly"&&l.jsx(Ml,{label:"分(每小时)",value:m.minute,min:0,max:59,testId:"sched-minute",onChange:N=>x({kind:"hourly",minute:N})}),d==="monthly"&&m.kind==="monthly"&&l.jsxs(l.Fragment,{children:[l.jsx(Ml,{label:"日",value:m.day,min:1,max:31,testId:"sched-day",onChange:N=>x({...m,day:N})}),l.jsx(rb,{hour:m.hour,minute:m.minute,onChange:N=>x({...m,...N})})]}),d==="weekly"&&m.kind==="weekly"&&l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"flex flex-wrap gap-1",children:[0,1,2,3,4,5,6].map(N=>{const T=m.weekdays.includes(N);return l.jsx(Ne,{type:"button",size:"small",variant:T?"secondary":"ghost","aria-pressed":T,"data-testid":`sched-weekday-${N}`,onClick:()=>x({...m,weekdays:T?m.weekdays.filter(R=>R!==N):[...m.weekdays,N].sort((R,A)=>R-A)}),children:Bh(N)},N)})}),l.jsx(rb,{hour:m.hour,minute:m.minute,onChange:N=>x({...m,...N})})]}),d==="daily"&&m.kind==="daily"&&l.jsx(rb,{hour:m.hour,minute:m.minute,onChange:N=>x({...m,...N})}),d==="raw"&&l.jsx(Jt,{"data-testid":"sched-raw","aria-label":"cron 表达式",value:g,spellCheck:!1,autoComplete:"off",className:"h-7 w-64 px-2 font-mono text-[12px]",onChange:N=>v(N.target.value)})]}),C!==null?l.jsx("div",{"data-testid":"sched-error",className:"text-[12px] text-destructive",children:C}):l.jsxs("div",{className:"flex flex-col gap-0.5",children:[l.jsx("div",{className:"text-[13px] text-foreground","data-testid":"sched-sentence",children:k??"这条表达式合法,但超出了能翻成人话的范围——请照下面的触发时刻确认它是不是你要的"}),l.jsx("div",{className:"font-mono text-[11px] text-muted-foreground","data-testid":"sched-expr",children:b}),b!==null&&l.jsx(sM,{schedule:b,timezone:n,testId:"sched-next"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Ne,{type:"button",size:"small",variant:"default","data-testid":`sched-save-${e}`,disabled:r||C!==null||b===null||b===t,onClick:()=>{b!==null&&o(b)},children:r?"保存中…":"保存排期"}),l.jsx(Ne,{type:"button",size:"small",variant:"ghost","data-testid":`sched-cancel-${e}`,onClick:a,children:"取消"})]})]})}async function Vh(e){if(!e.ok){const t=await e.text();throw new Error(`${e.status} ${t.slice(0,300)}`)}return e.json()}async function MQ(e){return(await Vh(await fetch(`${e}/api/tasks`))).tasks}async function DQ(e,t,n=50){return(await Vh(await fetch(`${e}/api/tasks/${encodeURIComponent(t)}/runs?limit=${n}`))).runs}async function _Q(e,t){await Vh(await fetch(`${e}/api/tasks/${encodeURIComponent(t)}/run`,{method:"POST"}))}async function OQ(e,t,n){if(t.source!=="user")throw new Error(`${t.id} 是内置运维任务,排期改代码不改库`);if(typeof t.command!="string")throw new Error(`${t.id} 这一行没有 command,改不了——请刷新页面重试`);const r={id:t.id,label:t.label,schedule:n.schedule??t.schedule,...t.timezone!==void 0?{timezone:t.timezone}:{},command:t.command,args:t.args??[],...t.cwd!==void 0?{cwd:t.cwd}:{},...t.env!==void 0?{env:t.env}:{},...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},serial:t.serial!==!1,maxAttempts:t.maxAttempts??1,effect:t.effect,enabled:n.enabled??t.enabled},a=await Vh(await fetch(`${e}/api/tasks/${encodeURIComponent(t.id)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(r)}));return{...t,...a.task,source:"user"}}function zQ(e){return e===null?"—":new Date(e).toLocaleString()}function PQ(e){return e===null?"—":e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function LQ({run:e}){const[t,n]=p.useState(!1),r=e.state==="failed";return l.jsxs("div",{className:"border-t border-[var(--acr-border-soft)] py-1 text-[12px]",children:[l.jsxs("button",{type:"button",className:"flex w-full gap-3 text-left",onClick:()=>n(a=>!a),children:[l.jsx("span",{className:"w-40 shrink-0 text-muted-foreground",children:zQ(e.attemptedAt??e.insertedAt)}),l.jsx("span",{className:`w-16 shrink-0 ${r?"text-destructive":"text-muted-foreground"}`,children:e.state}),l.jsx("span",{className:"w-16 shrink-0 text-muted-foreground",children:PQ(e.durationMs)}),l.jsx("span",{className:"flex-1 truncate",children:e.summary??"(没报摘要)"})]}),t&&(e.detail!==void 0||e.errors!==void 0)&&l.jsx("pre",{className:"mt-1 overflow-x-auto rounded-md bg-[var(--acr-card-nested)] p-2 text-[11px]",children:JSON.stringify({detail:e.detail,errors:e.errors},null,2)})]})}const sb={external:{text:"动外部世界",variant:"destructive"},"writes-db":{text:"写库",variant:"secondary"},"writes-files":{text:"写文件",variant:"secondary"},"read-only":{text:"只读",variant:"secondary"}};function IQ(e){var n;if(e.shadowed)return{label:"不会执行",dot:"bg-destructive",tone:"text-destructive"};if(!e.enabled)return{label:"已停用",dot:"bg-muted-foreground/50",tone:"text-muted-foreground"};const t=(n=e.lastRun)==null?void 0:n.state;return t==="running"||t==="claimed"||t==="waiting"?{label:"在跑",dot:"bg-primary animate-pulse",tone:"text-primary"}:t==="failed"?{label:"上次失败",dot:"bg-destructive",tone:"text-destructive"}:{label:"正常",dot:"bg-muted-foreground/40",tone:"text-muted-foreground"}}function $Q({apiBase:e,task:t,onChanged:n}){const[r,a]=p.useState(null),[o,c]=p.useState(!1),[d,h]=p.useState(!1),[m,x]=p.useState(!1),[g,v]=p.useState(null),[S,b]=p.useState(!1),j=p.useRef(!0);p.useEffect(()=>(j.current=!0,()=>{j.current=!1}),[]),p.useEffect(()=>{if(!S)return;const O=setTimeout(()=>b(!1),5e3);return()=>clearTimeout(O)},[S]);const C=p.useCallback(async()=>{const O=!o;if(c(O),O&&r===null)try{const z=await DQ(e,t.id);j.current&&a(z)}catch(z){j.current&&v(z.message)}},[e,o,r,t.id]),k=p.useCallback(async O=>{x(!0),v(null);try{const z=await OQ(e,t,O);if(!j.current)return;n(z),h(!1)}catch(z){j.current&&v(z.message)}finally{j.current&&x(!1)}},[e,n,t]),N=IQ(t),T=rM(t.schedule,t.timezone),R=t.source==="user"&&!t.shadowed,A=t.lastRun;return l.jsxs(ho,{className:"flex flex-col gap-2 p-3","data-testid":`task-row-${t.source}-${t.id}`,children:[l.jsxs("div",{className:"flex items-start gap-2",children:[l.jsx("span",{className:`mt-[7px] size-1.5 shrink-0 rounded-full ${N.dot}`,"aria-hidden":!0}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[l.jsx("span",{className:"text-[15px] font-semibold leading-tight [letter-spacing:var(--text-title3-tracking)]",children:t.label}),l.jsx("span",{"data-testid":`task-status-${t.source}-${t.id}`,className:`text-[12px] ${N.tone}`,children:N.label}),t.source==="builtin"&&l.jsx(Bt,{variant:"outline",size:"sm",children:"内置"}),sb[t.effect]&&l.jsx(Bt,{"data-testid":`task-effect-${t.id}`,size:"sm",variant:sb[t.effect].variant,children:sb[t.effect].text})]}),t.shadowed&&l.jsxs("div",{className:"text-[12px] text-destructive",children:["与内置任务 ",t.id," 重名,调度中心已丢弃这一行——它不会执行。删掉它:DELETE /api/tasks/",t.id]}),l.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2",children:[l.jsx("span",{className:"text-[13px] text-foreground",children:T??"这条排期翻不成人话,见右侧原始表达式"}),l.jsx("code",{"data-testid":`task-cron-${t.id}`,className:"font-mono text-[11px] text-muted-foreground",children:t.schedule})]}),t.enabled?l.jsx(sM,{schedule:t.schedule,timezone:t.timezone,testId:`task-next-${t.id}`}):l.jsx("div",{className:"text-[12px] text-muted-foreground",children:"已停用,节拍器上没有它"})]}),l.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[R&&l.jsxs(l.Fragment,{children:[l.jsxs(Ne,{type:"button",size:"small",variant:"ghost",disabled:m,"data-testid":`task-toggle-${t.id}`,onClick:()=>{k({enabled:!t.enabled})},children:[t.enabled?l.jsx(Fi,{}):l.jsx(Hn,{}),t.enabled?"暂停":"恢复"]}),l.jsxs(Ne,{type:"button",size:"small",variant:"ghost","data-testid":`task-edit-${t.id}`,onClick:()=>h(O=>!O),children:[l.jsx(CL,{}),"改排期"]})]}),l.jsx(Ne,{type:"button",size:"small",variant:S?"destructive":"neutral","data-testid":`task-run-${t.id}`,onClick:()=>{if(t.effect==="external"&&!S){b(!0);return}b(!1),_Q(e,t.id).catch(O=>{j.current&&v(O.message)})},children:S?"确认执行?":"立即跑一次"})]})]}),d&&R&&l.jsx(AQ,{taskId:t.id,schedule:t.schedule,timezone:t.timezone,busy:m,onCancel:()=>h(!1),onSave:O=>{k({schedule:O})}}),l.jsxs("button",{type:"button","data-testid":`task-expand-${t.id}`,onClick:C,className:"flex items-baseline gap-2 rounded-md px-1 py-0.5 text-left transition-colors hover:bg-[var(--acr-hover)]",children:[l.jsx("span",{className:"shrink-0 text-[12px] text-muted-foreground",children:A?`上次 ${nM(A.attemptedAt??A.insertedAt,Date.now())}`:"上次"}),l.jsx("span",{className:`min-w-0 flex-1 truncate text-[13px] ${(A==null?void 0:A.state)==="failed"?"text-destructive":""}`,children:A?A.summary??"(没报摘要)":"还没跑过"})]}),g&&l.jsx("div",{"data-testid":`task-error-${t.id}`,className:"text-[12px] text-destructive",children:g}),o&&l.jsx("div",{"data-nested-surface":"true",children:r===null?l.jsx("div",{className:"text-[12px] text-muted-foreground",children:"读取中…"}):r.length===0?l.jsx("div",{className:"text-[12px] text-muted-foreground",children:"还没有执行记录"}):r.map(O=>l.jsx(LQ,{run:O},O.id))})]})}function BQ({apiBase:e,title:t="定时任务"}){const[n,r]=p.useState(null),[a,o]=p.useState(null),c=p.useRef(!0),d=p.useCallback(async()=>{try{const m=await MQ(e);c.current&&(r(m),o(null))}catch(m){c.current&&o(m.message)}},[e]);p.useEffect(()=>(c.current=!0,d(),()=>{c.current=!1}),[d]);const h=p.useCallback(m=>{r(x=>(x==null?void 0:x.map(g=>g.source===m.source&&g.id===m.id?m:g))??x)},[]);return l.jsxs("div",{className:"flex h-full min-h-0 flex-col",children:[l.jsx("div",{"data-testid":"panel-tasks-header",className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:l.jsx(Lf,{title:t,onRefresh:()=>{d()},refreshLabel:"重新读取",className:"min-w-0 flex-1"})}),l.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto px-4 py-3",children:a!==null&&n===null?l.jsxs("div",{className:"text-[13px] text-destructive",children:["读不到任务列表:",a]}):n===null?l.jsx("div",{className:"text-[13px] text-muted-foreground",children:"读取中…"}):l.jsx("div",{className:"flex flex-col gap-2",children:n.map(m=>l.jsx($Q,{apiBase:e,task:m,onChanged:h},`${m.source}:${m.id}`))})})]})}function aM(e,t){var r,a;const n=e.poster?os(t,e.poster):void 0;if(e.url){const o=Np(t,e.url),c=(r=e.url.match(/[?&]key=([^&]+)/))==null?void 0:r[1],d=(a=e.url.match(/[?&]id=([^&]+)/))==null?void 0:a[1],h=c?decodeURIComponent(c):d?`item:${decodeURIComponent(d)}`:void 0,m=c?`key=${c}`:d?`id=${d}`:void 0;return{kind:"file",src:o,poster:n,...h?{progressKey:h}:{},...m?{subtitleListUrl:`${t}/api/media/netdisk-subtitle-list?${m}`,subtitleUrlBase:`${t}/api/media/netdisk-subtitle?${m}`}:{}}}if(e.provider==="bilibili"&&e.vid){const o=e.vid.startsWith("BV")?`bvid=${e.vid}`:`aid=${e.vid.slice(2)}`;return{kind:"dash",dashUrl:`${t}/api/media/bilibili/dash?${o}`,progressiveUrl:`${t}/api/media/bilibili/play?${o}`,progressKey:`bilibili:${e.vid}`,poster:n}}return(e.provider==="douyin"||e.provider==="tiktok")&&e.page_url?{kind:"file",src:`${t}/api/media/douyin/video?u=${encodeURIComponent(e.page_url)}`,poster:n}:(e.provider==="xhs"||e.provider==="xiaohongshu"||e.provider==="douyin"||e.provider==="tiktok")&&e.embed?{kind:"file",src:`${t}${e.embed}`,poster:n}:e.embed?{kind:"iframe",src:e.embed}:n?{kind:"poster",src:n}:{kind:"none"}}function UQ(e){for(const t of e??[]){if(t.kind!=="video")continue;const n=aM(t,"").kind;if(n==="dash"||n==="file")return t}}function VQ(e,t,n){if(!e)return"";const r=aM(e,t),a=r.kind==="file"?r.src:r.kind==="dash"?r.progressiveUrl:"";return a?`${a}${a.includes("?")?"&":"?"}dl=1&name=${encodeURIComponent(n)}`:""}function FQ(e){const t=document.createElement("a");t.href=e,t.rel="noopener",document.body.appendChild(t),t.click(),t.remove()}function Fh(e){const t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function HQ(e,t){var o,c,d,h,m,x;const n=(t==null?void 0:t.excerpt)||(t==null?void 0:t.text)||((o=t==null?void 0:t.html)==null?void 0:o.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim())||"";if(n)return n;const r=lM(e),a=((c=e.content)==null?void 0:c.text)||((h=(d=e.content)==null?void 0:d.quoted)==null?void 0:h.text)||qQ((m=e.content)==null?void 0:m.media)||e.body_text||((x=e.body_html)==null?void 0:x.replace(/<[^>]+>/g," "))||"";return cM(a,[e.url,...r])}function ab(e){var a;const t=(a=e.content)==null?void 0:a.quoted;if(!t)return null;const n=(t.author??"").trim(),r=cM(t.text??"",[e.url,...lM(e)]);return!n&&!r?null:{author:n,text:r}}function iM(e,t){const n=HQ(e,t),r=ab(e);return r&&n&&n===r.text?"":n}function oM(e,t){var c,d,h;const n=[],r=new Set,a=(m,x,g,v)=>{!m||r.has(m)||(r.add(m),n.push({src:os(ut.baseUrl,m),alt:x,w:g,h:v}))};for(const m of(t==null?void 0:t.media)??[])m.kind==="image"&&a(m.url,m.alt,m.w,m.h),m.kind==="video"&&a(m.poster,void 0,m.w,m.h);a(t==null?void 0:t.leadImage);const o=[...((c=e.content)==null?void 0:c.media)??[],...((h=(d=e.content)==null?void 0:d.quoted)==null?void 0:h.media)??[]];for(const m of o)m.kind==="image"&&a(m.thumb||m.url,m.alt,m.w,m.h),m.kind==="video"&&a(m.poster,void 0,m.w,m.h),m.kind==="audio"&&a(m.poster),m.kind==="link"&&a(m.image);for(const m of e.attachments??[])/\.(png|jpe?g|webp|gif)(\?|#|$)/i.test(m)&&a(m);return n}function lM(e){var a,o,c;const t=[],n=d=>{d&&!t.includes(d)&&t.push(d)},r=[...((a=e.content)==null?void 0:a.media)??[],...((c=(o=e.content)==null?void 0:o.quoted)==null?void 0:c.media)??[]];for(const d of r)d.kind==="image"&&(n(d.url),n(d.thumb)),d.kind==="video"&&(n(d.poster),n(d.embed),n(d.page_url)),d.kind==="audio"&&(n(d.url),n(d.poster),n(d.page_url)),d.kind==="link"&&(n(d.url),n(d.image));for(const d of e.attachments??[])n(d);return t}function qQ(e){const t=e==null?void 0:e.find(n=>n.kind==="link"&&!!n.summary);return(t==null?void 0:t.summary)??""}function cM(e,t){let n=e;for(const r of t)r&&(n=n.split(r).join(" "));return n.replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim()}function uM(e){const t=new Date(e).getTime();if(!Number.isFinite(t))return"";const n=Date.now()-t,r=6e4,a=60*r,o=24*a;return n<a?`${Math.max(1,Math.round(n/r))}m`:n<o?`${Math.round(n/a)}h`:`${Math.round(n/o)}d`}function dM(e){const t=(e.title??"").trim();return t&&!/^[((]\s*(?:无标题|untitled)\s*[))]$/i.test(t)?t:""}const fM=new Map;function KQ(e,t,n){!e||!t||!n||fM.set(e,{w:t,h:n})}function ib(e){return e?fM.get(e):void 0}const hM=210,GQ=2,YQ=6,WQ=3/4,XQ="4 / 3",QQ=9/16,ZQ=5/4;function mM(e){return Math.min(ZQ,Math.max(QQ,e))}const JQ=22,eZ=20,tZ=18,nZ=30,rZ=14,sZ=13,aZ=2,iZ=2,oZ=3,lZ=12,cZ=16.5,uZ=22,dZ=3,fZ=44;function hZ(e){const t=Math.floor(e/hM);return Math.min(YQ,Math.max(GQ,t))}function mZ(e,t){let n=0;for(const r of e)n+=/[⺀-鿿가-퟿＀-￯]/.test(r)?t:t*.55;return n}function ob(e,t,n,r){return e?Math.min(r,Math.max(1,Math.ceil(mZ(e,t)/Math.max(1,n)))):0}function pZ(e,t){let n=0;if(e.hasMedia){const o=e.mediaW&&e.mediaH?e.mediaH/e.mediaW:WQ;n+=t*mM(o)}const r=ob(e.title,rZ,t,aZ),a=ob(e.summary,sZ,t,r>0?iZ:oZ);if(n+=JQ+r*eZ+a*tZ+nZ,e.quote){const o=ob(e.quote,lZ,t-fZ,dZ);n+=uZ+o*cZ}return n}function gZ(e){const t=oM(e)[0],n=ib(t==null?void 0:t.src),r=ab(e);return{id:e.id,mediaW:(n==null?void 0:n.w)??(t==null?void 0:t.w),mediaH:(n==null?void 0:n.h)??(t==null?void 0:t.h),hasMedia:!!t,title:dM(e),summary:iM(e),quote:r?`${r.author}${r.text}`:""}}function xZ(e){let t=0;for(let n=1;n<e.length;n++)e[n]<e[t]&&(t=n);return t}function vZ(e,t,n){var r;return!n||n.colCount!==t||e.length<n.itemCount?!1:n.itemCount===0?!0:((r=e[n.itemCount-1])==null?void 0:r.id)===n.lastId}function yZ(e,t,n,r){t=Math.max(1,t);const a=vZ(e,t,r),o=a?r.columns.map(h=>[...h]):Array.from({length:t},()=>[]),c=a?[...r.heights]:new Array(t).fill(0),d=a?r.itemCount:0;for(let h=d;h<e.length;h++){const m=e[h],x=xZ(c);o[x].push(m.id),c[x]+=pZ(m,n)}return{columns:o,heights:c,colCount:t,itemCount:e.length,lastId:e.length?e[e.length-1].id:null}}function bZ(e,t){const n=new Set(e.filter(c=>{var d;return(d=c.storyGroup)==null?void 0:d.isRep}).map(c=>c.storyGroup.id)),r=new Map,a=new Map;return{rendered:e.filter(c=>{const d=c.storyGroup;return!d||(d.isRep||a.set(d.id,[...a.get(d.id)??[],c]),d.isRep)||!n.has(d.id)||t.has(d.id)?!0:(r.set(d.id,(r.get(d.id)??0)+1),!1)}),hidden:r,membersOf:a}}function wZ(e,t){return t?"收起同源的":`另有 ${e} 条同源`}function pM(e,t){const n=Date.parse(e.timestamp||e.fetched_at),r=t.map(o=>Date.parse(o.timestamp||o.fetched_at)).filter(o=>Number.isFinite(o)&&o>n);if(!Number.isFinite(n)||r.length===0)return null;const a=Math.round((Math.min(...r)-n)/1e3);return a<60?null:a<3600?`首发,早 ${Math.round(a/60)} 分钟`:a<86400?`首发,早 ${Math.round(a/3600)} 小时`:`首发,早 ${Math.round(a/86400)} 天`}function SZ(e,t){const n=new Set(e);return n.delete(t)||n.add(t),n}function jZ(e){var t,n,r;return(r=(n=(t=e.content)==null?void 0:t.media)==null?void 0:n.find(a=>a.kind==="video"&&a.provider==="bilibili"&&!!a.vid))==null?void 0:r.vid}const CZ=e=>e.stream_id.includes("bilibili"),gM=e=>{var t;return e.stream_id.includes("v2ex")||(((t=e.url)==null?void 0:t.includes("v2ex.com"))??!1)},kZ=e=>{var t;return e.stream_id.includes("douyin")||(((t=e.url)==null?void 0:t.includes("douyin.com"))??!1)},xM=e=>{var t;return e.stream_id.includes("xhs")||(((t=e.url)==null?void 0:t.includes("xiaohongshu.com"))??!1)},vM=e=>e.stream_id.includes("xueqiu");function NZ(e){var n,r;const t=(r=(n=e.content)==null?void 0:n.quoted)==null?void 0:r.text;return!!t&&/(\.\.\.|…)\s*$/.test(t.trim())}function yM(e){return!xM(e)&&!vM(e)}function EZ(e){var t,n;return e.note_id?e.note_id:(n=(t=e.url)==null?void 0:t.match(/\/(?:explore|discovery\/item)\/([0-9a-zA-Z]+)/))==null?void 0:n[1]}function TZ(e){var t,n,r,a;return((n=(t=e.url)==null?void 0:t.match(/v2ex\.com\/t\/(\d+)/))==null?void 0:n[1])??(gM(e)?(a=(r=e.url)==null?void 0:r.match(/\/t\/(\d+)/))==null?void 0:a[1]:void 0)}function RZ(e){var n,r,a,o;if(e.stream_id.includes("hackernews")){const c=e.source_guid;if(typeof c=="string"){const h=c.match(/^(\d+)/);if(h)return h[1]}const d=(((n=e.content)==null?void 0:n.media)??[]).map(h=>h.kind==="link"?h.url:"").map(h=>{var m;return(m=h.match(/item\?id=(\d+)/))==null?void 0:m[1]}).find(Boolean);return d||((r=`${e.url??""} ${e.body_html??""}`.match(/item\?id=(\d+)/))==null?void 0:r[1])}return(o=`${e.url??""} ${e.body_html??""} ${(((a=e.content)==null?void 0:a.media)??[]).map(c=>c.kind==="link"?c.url:"").join(" ")}`.match(/news\.ycombinator\.com\/item\?id=(\d+)/))==null?void 0:o[1]}function Ou(e){var n,r,a,o;if(CZ(e)){const c=jZ(e);return c?{source:"bilibili-comments",vid:c}:null}if(xM(e)){const c=EZ(e),d=e.url?new URLSearchParams(e.url.split("?")[1]??"").get("xsec_token")??void 0:void 0;return c&&d?{source:"xhs",noteId:c,xsecToken:d}:null}if(gM(e)){const c=TZ(e);return c?{source:"v2ex",id:c}:null}if(kZ(e))return e.url?{source:"douyin",url:e.url,isGallery:((n=e.content)==null?void 0:n.archetype)==="gallery"}:null;if(vM(e)&&NZ(e)){const c=(a=(r=e.content)==null?void 0:r.quoted)==null?void 0:a.permalink;return c?{source:"xueqiu",permalink:c}:null}const t=RZ(e);return t?{source:"hackernews",id:t}:((o=e.content)==null?void 0:o.archetype)==="link"&&e.url?{source:"link",url:e.url}:null}function AZ(e){const t=Ou(e);return!!t&&t.source!=="link"&&t.source!=="xueqiu"}const bM=300*1e3,MZ=240,DZ=800,_Z=3,wM="stream.preload-cache.v1",ur=new Map,lb=e=>!!e&&Date.now()-e.at<bM;function OZ(){if(typeof window>"u")return[];try{const e=window.sessionStorage.getItem(wM);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t.filter(n=>n&&typeof n.key=="string"&&typeof n.at=="number"&&n.value):[]}catch{return[]}}function Hh(){if(!(typeof window>"u"))try{const e=[];for(const[t,n]of ur.entries())!n.value||!lb(n)||e.push({key:t,at:n.at,value:n.value});window.sessionStorage.setItem(wM,JSON.stringify(e))}catch{}}function zZ(){if(!(ur.size>0))for(const e of OZ()){if(Date.now()-e.at>=bM)continue;const t=Promise.resolve(e.value);ur.set(e.key,{at:e.at,value:e.value,promise:t})}}zZ();function SM(e,t){ur.delete(e),ur.set(e,t),Hh()}function PZ(e,t){for(ur.set(e,t);ur.size>MZ;){const n=ur.keys().next().value;if(n===void 0)break;ur.delete(n)}Hh()}const qh=new Map,jM=e=>{var t;return(t=qh.get(e))==null?void 0:t.forEach(n=>n())};let Kh=0;const CM=[];function LZ(){return Kh<_Z?(Kh++,Promise.resolve()):new Promise(e=>CM.push(e)).then(()=>void Kh++)}function IZ(){var e;Kh--,(e=CM.shift())==null||e()}function $Z(e,t,n){const r=JSON.stringify(t),a=ur.get(r);if(lb(a))return SM(r,a),a.promise;const c=(async()=>{await LZ();try{return await be.enrich(e,t)}finally{IZ()}})(),d={at:Date.now(),promise:c};return PZ(r,d),c.then(h=>{d.value=h,Hh(),jM(r)}).catch(()=>{ur.get(r)===d&&(ur.delete(r),Hh()),jM(r)}),c}function BZ(e){const t=e?Ou(e):null,n=t?JSON.stringify(t):"",[,r]=p.useState(0);p.useEffect(()=>{if(!n)return;const o=()=>r(d=>d+1);let c=qh.get(n);return c||qh.set(n,c=new Set),c.add(o),()=>{c.delete(o),c.size||qh.delete(n)}},[n]);const a=n?ur.get(n):void 0;return a&&SM(n,a),(a==null?void 0:a.value)??null}function UZ(e,t){if(!yM(e))return;const n=Ou(e);n&&(lb(ur.get(JSON.stringify(n)))||$Z(t,n).catch(()=>{}))}function kM(e,t){const n=p.useRef(null);return p.useEffect(()=>{const r=n.current;if(!r||!yM(e)||!Ou(e))return;const a=r.closest("[data-radix-scroll-area-viewport]")??r.closest('[data-slot="shell-content"]'),o=new IntersectionObserver(c=>{c[0].isIntersecting&&UZ(e,t)},{root:a,rootMargin:`0px 0px ${DZ}px 0px`});return o.observe(r),()=>o.disconnect()},[e,t]),n}function NM(e,{onPlayAudio:t}={}){var z,_,V,B,G;const n=BZ(e),r=oM(e,n==null?void 0:n.article),a=r[0],o=UQ((z=e.content)==null?void 0:z.media),c=((_=e.content)==null?void 0:_.archetype)==="video"||(((V=e.content)==null?void 0:V.media)??[]).some(I=>I.kind==="video"),d=RY(),h=d&&!o&&!c?Oh(e,ut.baseUrl,"podcast"):null,m=!!h&&((B=d==null?void 0:d.current)==null?void 0:B.id)===e.id,x=m&&!!(d!=null&&d.playing),g=!h||!d?void 0:()=>{m?d.toggle():t?t(e):d.play(h)},v=dM(e),S=iM(e,n==null?void 0:n.article),b=ab(e),j=e.author_avatar||cN(e.stream_id)||IP(ut.baseUrl,e.url),C=e.comment_count??(n==null?void 0:n.total),k=AZ(e)||typeof C=="number",N=((G=e.title)==null?void 0:G.trim())||(typeof e.author=="string"?e.author:"")||"download",T=VQ(o,ut.baseUrl,N),R=!!T,A=Ou(e),O=(A==null?void 0:A.source)==="xhs";return{media:r,firstMedia:a,video:o??null,isVideoNote:c,audioTrack:h,audioPlaying:x,onAudioActivate:g,title:v,summary:S,quoted:b,avatar:j??"",commentCount:C,hasComments:k,videoDl:T,canDownload:R,xhsParams:A,isXhs:O}}function EM({className:e,...t}){return l.jsx(o$,{"data-slot":"avatar",className:W("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...t})}function TM({className:e,...t}){return l.jsx(c$,{"data-slot":"avatar-image",className:W("aspect-square size-full",e),...t})}function RM({className:e,...t}){return l.jsx(d$,{"data-slot":"avatar-fallback",className:W("flex size-full items-center justify-center rounded-[inherit] border border-[var(--acr-border)] bg-[var(--acr-chip)] text-[11px] font-medium text-foreground",e),...t})}const VZ=/\.pdf(\?|#|$)/i;function AM(e,t,n){const r=t.media??[];return e==="stt"?t.resolvedByHandle?!0:r.some(a=>a.kind==="video"?!!a.url||!a.resolveOnly&&!!(a.vid||a.embed||a.page_url):a.kind==="audio"&&(!!a.url||!!(a.platform&&a.track_id))):e==="ocr"?r.some(a=>a.kind==="image"||a.kind==="link"&&VZ.test(a.url)):!!cb(t,n)}function cb(e,t){const n=(e.media??[]).find(r=>r.kind==="link");return(n==null?void 0:n.url)??t}const ub={stt:"语音转文字",ocr:"图片/PDF 识别",article:"网页正文抓取",inline:"直取条目原文"};function MM(e,t,n){if(e.archetype==="forward"){const a=e.quoted;return a!=null&&a.archetype?MM({archetype:a.archetype,text:a.text,media:a.media},t,n):DM(e)}if(e.archetype==="text"){const a=DM(e);if(!a.ok){const o=cb(e,n);if(o!==void 0)return t.article?{ok:!0,branch:"article",url:o}:{ok:!1,code:"branch_unavailable",branch:"article",message:`${ub.article}未配置`}}return a}const r=e.archetype==="video"||e.archetype==="audio"?"stt":e.archetype==="gallery"||AM("ocr",e,n)?"ocr":"article";return AM(r,e,n)?t[r]?r==="article"?{ok:!0,branch:r,url:cb(e,n)}:{ok:!0,branch:r}:{ok:!1,code:"branch_unavailable",branch:r,message:`${ub[r]}未配置`}:{ok:!1,code:"no_source",branch:r,message:`这条内容里没有可${ub[r]}的东西`}}function DM(e){var n;const t=(n=e.text)==null?void 0:n.trim();return t?{ok:!0,branch:"inline",text:t}:{ok:!1,code:"no_source",branch:"inline",message:"这条内容没有正文"}}const db={stt:!1,ocr:!1,article:!1};function FZ(e){const t=e.content,n=(t==null?void 0:t.media)??[];return{archetype:(t==null?void 0:t.archetype)??((n??[]).some(a=>a.kind==="video"||a.kind==="audio")?"video":(n??[]).some(a=>a.kind==="image")?"gallery":e.url?"link":"text"),text:t==null?void 0:t.text,media:n,quoted:t==null?void 0:t.quoted}}function HZ(e,t){const n=MM(FZ(e),t,e.url);return n.ok&&n.branch!=="inline"}const _M=p.createContext(db);function qZ({caps:e,children:t}){return l.jsx(_M.Provider,{value:e,children:t})}function KZ(){const e=p.useContext(_M);return p.useMemo(()=>t=>HZ(t,e),[e])}function GZ(e){var n;const t=(n=e.find(r=>r.kind==="extract"))==null?void 0:n.branches;return{stt:!!(t!=null&&t.stt),ocr:!!(t!=null&&t.ocr),article:!!(t!=null&&t.article)}}function YZ(e,t){const[n,r]=p.useState(()=>({caps:db,status:"loading"})),a=e.baseUrl;return p.useEffect(()=>{let o=!1;return be.conversions.kinds(e).then(c=>{o||r({caps:GZ(c.items),status:"ready"})}).catch(()=>{o||r({caps:db,status:"error"})}),()=>{o=!0}},[a,t]),n}function OM({item:e,videoDl:t,children:n}){const r=KZ();return l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:n}),l.jsxs(Tl,{size:"sm",children:[l.jsxs(Rr,{onSelect:()=>void I1(e),children:[l.jsx(Dp,{}),"在对话中引用"]}),r(e)?l.jsxs(Rr,{onSelect:()=>void $L(ut,e),children:[l.jsx(gL,{}),"转成文字"]}):null,e.url?l.jsx(Rr,{asChild:!0,children:l.jsxs("a",{href:e.url,target:"_blank",rel:"noreferrer",children:[l.jsx(Op,{}),"打开原文"]})}):null,t?l.jsxs(Rr,{onSelect:()=>FQ(t),children:[l.jsx(wc,{}),"下载视频"]}):null]})]})}function zM({noteId:e,initialLiked:t=!1,initialCollected:n=!1,likeCount:r,className:a}){const[o,c]=p.useState(t),[d,h]=p.useState(n),[m,x]=p.useState(!1);async function g(S){if(m)return;const b=S==="like"?o:d,j=S==="like"?c:h,C=S==="like"?b?"unlike":"like":b?"uncollect":"collect";j(!b),x(!0);try{await be.interactXhs(ut,{noteId:e,action:C})}catch(k){j(b),Ke.error(S==="like"?"点赞失败":"收藏失败",{description:k instanceof Error?k.message:""})}finally{x(!1)}}const v=r==null?null:r+(o===t?0:o?1:-1);return l.jsxs(l.Fragment,{children:[l.jsxs(Ne,{variant:"neutral",size:"small","aria-pressed":o,"aria-label":o?"取消点赞":"点赞",title:o?"取消点赞":"点赞",className:a,onClick:S=>{S.stopPropagation(),g("like")},children:[l.jsx(Fd,{className:W(o&&"fill-current text-rose-500")}),v??null]}),l.jsx(Ne,{variant:"neutral",size:"small","aria-pressed":d,"aria-label":d?"取消收藏":"收藏",title:d?"取消收藏":"收藏",onClick:S=>{S.stopPropagation(),g("collect")},children:l.jsx(uL,{className:W(d&&"fill-current text-amber-500")})})]})}const PM=60;function WZ({item:e,onOpen:t,onPlayAudio:n}){var U,K,ne;const{t:r}=kp(),a=kM(e,ut),{firstMedia:o,isVideoNote:c,video:d,audioTrack:h,audioPlaying:m,onAudioActivate:x,title:g,summary:v,quoted:S,avatar:b,videoDl:j,canDownload:C,xhsParams:k}=NM(e,{onPlayAudio:n}),N=(k==null?void 0:k.source)==="xhs",T=o,[,R]=p.useState(0),O=ib(T==null?void 0:T.src)??(T!=null&&T.w&&(T!=null&&T.h)?{w:T.w,h:T.h}:void 0),z=O?O.h/O.w:void 0,_=z===void 0?void 0:mM(z),V=O&&_!==void 0?_===z?`${O.w} / ${O.h}`:`1 / ${_}`:XQ,B=v.length>PM?`${v.slice(0,PM)}…`:v,G=g||B||e.author||e.stream_id,I=c||!!d,H=(ne=(K=(U=e.content)==null?void 0:U.media)==null?void 0:K.find(q=>q.kind==="video"))==null?void 0:ne.duration_s,ee=I?H:h==null?void 0:h.durationS,X=h&&x?l.jsx("button",{type:"button","aria-label":r(m?"timeline.pause":"timeline.play"),onClick:q=>{q.stopPropagation(),x()},className:"flex size-10 items-center justify-center rounded-full bg-black/55 text-white shadow-sm transition-colors hover:bg-black/70",children:m?l.jsx(Fi,{className:"size-5 fill-current"}):l.jsx(Hn,{className:"size-5 translate-x-px fill-current"})}):null,M=l.jsx("div",{ref:a,"data-nested-surface":"true","data-item-id":e.id,role:"button",tabIndex:0,"aria-label":G,onClick:()=>t(e,{intent:"read"}),onKeyDown:q=>{q.target===q.currentTarget&&(q.key!=="Enter"&&q.key!==" "||(q.preventDefault(),t(e,{intent:"read"})))},className:"group block w-full cursor-pointer rounded-xl text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-ring/50",children:l.jsxs(ho,{nestedSurface:!0,className:W("flex flex-col overflow-hidden p-0",wA),children:[T?l.jsxs(Ey,{ratio:V,src:T.src,alt:T.alt??"",onClick:q=>{q.stopPropagation(),t(e,{intent:"watch"})},onNaturalSize:(q,P)=>{ib(T.src)||(KQ(T.src,q,P),R(L=>L+1))},children:[I?l.jsx("span",{"data-slot":"post-card-video-badge","aria-label":r("timeline.play"),className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:l.jsx("span",{className:"flex size-9 items-center justify-center rounded-full bg-black/55 text-white shadow-sm",children:l.jsx(Hn,{className:"size-4 translate-x-px fill-current"})})}):null,!I&&X?l.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:X}):null,typeof ee=="number"?l.jsx("span",{className:"absolute bottom-1.5 right-1.5 rounded-full bg-black/55 px-2 py-0.5 text-[11px] tabular-nums text-white",children:Fh(ee)}):null]}):null,l.jsxs("div",{className:"flex flex-col gap-1 px-3 pb-2.5 pt-2.5",children:[g?l.jsx(Mh,{className:"self-stretch line-clamp-2 whitespace-normal",children:g}):null,v?l.jsx(Ny,{className:W("whitespace-normal",g?"line-clamp-2":"line-clamp-3"),children:v}):null,S?l.jsx(ho,{"data-post-card-quote":"true",className:"mt-1.5 rounded-lg px-2.5 py-2 text-[12px] leading-snug text-muted-foreground",children:l.jsxs("div",{className:"line-clamp-3 whitespace-normal",children:[S.author?l.jsxs("span",{className:"font-medium text-foreground/70",children:["@",S.author,":"]}):null,S.text]})}):null,!T&&X?l.jsxs("div",{className:"mt-1 flex items-center gap-2.5",children:[X,typeof ee=="number"?l.jsx("span",{className:"text-[12px] tabular-nums text-muted-foreground",children:Fh(ee)}):null]}):null,l.jsxs("div",{className:"mt-1 flex min-w-0 items-center gap-1.5 text-[12px] text-muted-foreground",children:[l.jsxs(EM,{className:"size-4 shrink-0",children:[b?l.jsx(TM,{src:b,alt:"",className:"object-cover"}):null,l.jsx(RM,{children:l.jsx(R1,{className:"size-2.5"})})]}),l.jsx("span",{className:"truncate",children:e.author||e.stream_id}),l.jsx("span",{className:"shrink-0 opacity-70",children:"·"}),l.jsx("span",{className:"shrink-0 opacity-70",children:uM(e.timestamp)}),N&&k?l.jsx("div",{className:"ml-auto flex shrink-0 items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100",children:l.jsx(zM,{noteId:k.noteId})}):null]})]})]})});return l.jsx(OM,{item:e,videoDl:C?j:void 0,children:M})}const XZ=p.createContext(null);function QZ(){const e=p.useContext(XZ);if(!e)throw new Error("useVideoStage must be used inside <VideoStageContext.Provider>");return e}const Gh=507,ZZ=510,JZ=16/9,eJ=2,tJ=800;function Un(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function nJ(e,t){return e&&Un(e.width)&&Un(e.height)?e:t&&Un(t.width)&&Un(t.height)?t:null}function rJ({naturalWidth:e,naturalHeight:t,containerWidth:n,minWidth:r,maxWidth:a,maxHeight:o}){const c=Un(e)&&Un(t)?e/t:JZ;if(!Un(n)&&!Un(r))return{width:0,height:0,ratio:c};let d=Un(n)?n:r;return Un(a)&&(d=Math.min(d,a)),Un(o)&&(d=Math.min(d,o*c)),Un(r)&&(d=Math.max(d,r)),{width:Math.round(d),height:Math.round(d/c),ratio:c}}const Yh=p.forwardRef(function({kind:t="image",src:n,alt:r="",naturalWidth:a,naturalHeight:o,mediaSize:c,minWidth:d,maxWidth:h,maxHeight:m,videoMaxHeight:x,frameClassName:g,imageClassName:v,fallback:S,onSizingChange:b,maxRetries:j=eJ,retryDelayMs:C=tJ,className:k,children:N,...T},R){const A=p.useRef(null),[O,z]=p.useState(0),[_,V]=p.useState(null),B=p.useCallback(ne=>{A.current=ne,typeof R=="function"?R(ne):R&&(R.current=ne)},[R]);p.useLayoutEffect(()=>{V(null)},[n]),p.useLayoutEffect(()=>{const ne=A.current;if(!ne)return;z(ne.clientWidth);const q=new ResizeObserver(P=>{var L;return z(((L=P[0])==null?void 0:L.contentRect.width)??0)});return q.observe(ne),()=>q.disconnect()},[]);const G=Un(a)&&Un(o)?{width:a,height:o}:null,I=nJ(c,G??_),H=Un(m)?m:t==="video"?Gh:ZZ,ee=t==="video"&&Un(x)?Math.min(H,x):H,X=I?I.height>I.width:!1,M=t==="video"?X?9/16:16/9:I?I.width/I.height:16/9,U=rJ({naturalWidth:M,naturalHeight:1,containerWidth:O,minWidth:d,maxWidth:h,maxHeight:ee});p.useEffect(()=>{b==null||b({naturalW:(I==null?void 0:I.width)??0,naturalH:(I==null?void 0:I.height)??0,containerW:O,maxHeight:ee,box:U})},[O,U.width,U.height,U.ratio,I==null?void 0:I.width,I==null?void 0:I.height,ee,b]);const K=t==="video"?X?"9 / 16":"16 / 9":I?`${I.width} / ${I.height}`:"16 / 9";return l.jsx("div",{ref:B,"data-slot":"media-box",className:W("w-full",k),style:{maxWidth:h},...T,children:l.jsx(Ey,{"data-slot":"media-box-frame",ratio:K,style:{width:U.width||void 0},className:W("block [transform:translateZ(0)] rounded-2xl border border-[var(--acr-border)] bg-black [&_video]:rounded-[inherit]",g),src:n,alt:r,fallback:S,imageClassName:v,maxRetries:j,retryDelayMs:C,onNaturalSize:(ne,q)=>{G||V({width:ne,height:q})},children:N})})});var LM=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(r[o]=a[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Wh="html",fb="svg",sJ="http://www.w3.org/2000/svg",aJ=function(e,t){var n,r,a,o=(n=e.ownerDocument)!==null&&n!==void 0?n:document,c=(a=(r=o.defaultView)!==null&&r!==void 0?r:o.parentWindow)!==null&&a!==void 0?a:window;switch(t){case Wh:return e instanceof c.HTMLElement;case fb:return e instanceof c.SVGElement;default:throw new Error('Unrecognized element type "'.concat(t,'" for validateElementType.'))}},IM=function(e,t){var n,r,a={},o,c,d;switch(e){case Wh:d=document.createElement((n=t==null?void 0:t.containerElement)!==null&&n!==void 0?n:"div");break;case fb:d=document.createElementNS(sJ,(r=t==null?void 0:t.containerElement)!==null&&r!==void 0?r:"g");break;default:throw new Error('Invalid element type "'.concat(e,'" for createPortalNode: must be "html" or "svg".'))}if(t&&typeof t=="object"&&t.attributes)for(var h=0,m=Object.entries(t.attributes);h<m.length;h++){var x=m[h],g=x[0],v=x[1];d.setAttribute(g,v)}var S={element:d,elementType:e,setPortalProps:function(b){a=b},getInitialPortalProps:function(){return a},mount:function(b,j){if(j!==c){if(S.unmount(),b!==o&&!aJ(b,e))throw new Error('Invalid element type for portal: "'.concat(e,'" portalNodes must be used with ').concat(e," elements, but OutPortal is within <").concat(b.tagName,">."));b.replaceChild(S.element,j),o=b,c=j}},unmount:function(b){b&&b!==c||o&&c&&(o.replaceChild(c,S.element),o=void 0,c=void 0)}};return S};(function(e){LM(t,e);function t(n){var r=e.call(this,n)||this;return r.addPropsChannel=function(){Object.assign(r.props.node,{setPortalProps:function(a){r.setState({nodeProps:a})}})},r.state={nodeProps:r.props.node.getInitialPortalProps()},r}return t.prototype.componentDidMount=function(){this.addPropsChannel()},t.prototype.componentDidUpdate=function(){this.addPropsChannel()},t.prototype.render=function(){var n=this,r=this.props,a=r.children,o=r.node;return Fa.createPortal(p.Children.map(a,function(c){return p.isValidElement(c)?p.cloneElement(c,n.state.nodeProps):c}),o.element)},t})(p.PureComponent);var iJ=(function(e){LM(t,e);function t(n){var r=e.call(this,n)||this;return r.placeholderNode=p.createRef(),r.passPropsThroughPortal(),r}return t.prototype.passPropsThroughPortal=function(){var n=Object.assign({},this.props,{node:void 0});this.props.node.setPortalProps(n)},t.prototype.componentDidMount=function(){var n=this.props.node;this.currentPortalNode=n;var r=this.placeholderNode.current,a=r.parentNode;n.mount(a,r),this.passPropsThroughPortal()},t.prototype.componentDidUpdate=function(){var n=this.props.node;this.currentPortalNode&&n!==this.currentPortalNode&&(this.currentPortalNode.unmount(this.placeholderNode.current),this.currentPortalNode.setPortalProps({}),this.currentPortalNode=n);var r=this.placeholderNode.current,a=r.parentNode;n.mount(a,r),this.passPropsThroughPortal()},t.prototype.componentWillUnmount=function(){var n=this.props.node;n.unmount(this.placeholderNode.current),n.setPortalProps({})},t.prototype.render=function(){var n=this.props.node.element.tagName,r=this.props.node.elementType===Wh?n.toLowerCase():n;return p.createElement(r,{ref:this.placeholderNode})},t})(p.PureComponent);IM.bind(null,Wh),IM.bind(null,fb);const oJ=iJ;function lJ({node:e,onExpand:t,expandTitle:n,expandAriaLabel:r}){return l.jsxs("div",{"data-slot":"media-box-player",className:"group absolute inset-0",children:[l.jsx("div",{className:"thumb-player absolute inset-0",children:l.jsx(oJ,{node:e})}),t?l.jsx("button",{type:"button",onClick:a=>{a.stopPropagation(),t()},title:n,"aria-label":r||n,className:"absolute right-2 top-2 z-10 rounded-full bg-black/55 p-1.5 text-white opacity-0 transition-opacity hover:bg-black/75 group-hover:opacity-100",children:l.jsx(Lp,{className:"size-4"})}):null]})}const Xh=520;function $M({label:e,onActivate:t,children:n}){return l.jsx("div",{"data-slot":"media-hit",role:"button",tabIndex:0,"aria-label":e,title:e,className:"absolute inset-0 flex items-center justify-center",onClick:r=>{r.stopPropagation(),t()},onKeyDown:r=>{r.key!=="Enter"&&r.key!==" "||(r.preventDefault(),r.stopPropagation(),t())},children:n})}function cJ({item:e,last:t,onOpen:n,onPlayAudio:r}){return l.jsxs(l.Fragment,{children:[l.jsx(uJ,{item:e,onOpen:n,onPlayAudio:r}),t?null:l.jsx(Gk,{className:"mx-3 bg-[var(--acr-border-soft)]"})]})}function uJ({item:e,onOpen:t,onPlayAudio:n}){const r=kM(e,ut),{media:a,firstMedia:o,video:c,isVideoNote:d,audioTrack:h,audioPlaying:m,onAudioActivate:x,title:g,summary:v,quoted:S,avatar:b,videoDl:j,canDownload:C,xhsParams:k}=NM(e,{onPlayAudio:n}),N=(k==null?void 0:k.source)==="xhs",T=l.jsxs(Tr,{ref:r,"data-item-id":e.id,variant:"outline",role:"button",tabIndex:0,onClick:()=>t(e,{intent:"read"}),onKeyDown:R=>{(R.key==="Enter"||R.key===" ")&&(R.preventDefault(),t(e,{intent:"read"}))},className:"group/row w-full cursor-pointer items-start !bg-transparent !backdrop-blur-none hover:!bg-transparent focus-visible:border-transparent focus-visible:ring-0",children:[l.jsxs(kF,{className:"flex-row items-center gap-3",children:[l.jsx(nu,{variant:"avatar",children:l.jsxs(EM,{children:[b?l.jsx(TM,{src:b,alt:"",className:"object-cover"}):null,l.jsx(RM,{children:l.jsx(R1,{className:"size-3.5"})})]})}),l.jsxs("div",{className:"flex min-w-0 flex-1 items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx(ma,{children:e.author||e.stream_id}),l.jsxs(ro,{children:[e.stream_id," · ",uM(e.timestamp)]})]}),N&&k?l.jsx("div",{className:"flex shrink-0 items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/row:opacity-100",children:l.jsx(zM,{noteId:k.noteId})}):null,l.jsx(Bt,{variant:"secondary",size:"sm",children:e.type})]})]}),l.jsxs(Is,{className:"-my-2 pl-[52px] pr-2.5",children:[g?l.jsx(ma,{className:"whitespace-normal text-[14px]",children:g}):null,v?l.jsx(ro,{className:"mt-1 line-clamp-3",children:v}):null,S?l.jsxs("div",{className:"mt-2 line-clamp-2 border-l-2 border-[var(--acr-border-soft)] pl-2.5 text-[13px] text-muted-foreground",children:[S.author?l.jsxs("span",{className:"font-medium text-foreground/70",children:["@",S.author,":"]}):null,S.text]}):null,c?l.jsx(dJ,{item:e,media:c,poster:o==null?void 0:o.src,className:"mt-2"}):h&&x?l.jsx(fJ,{poster:o==null?void 0:o.src,playing:m,durationS:h.durationS,onActivate:x}):o?l.jsx(hJ,{media:a,compact:!0,isVideo:d,onOpen:R=>t(e,{mediaIndex:R,intent:"watch"})}):null]})]});return l.jsx(OM,{item:e,videoDl:C?j:void 0,children:T})}function dJ({item:e,media:t,poster:n,className:r="mt-3"}){const a=QZ(),o=p.useRef(null),c=!!a.node&&a.activeId===e.id&&a.openId!==e.id,d=n||t.poster;return p.useEffect(()=>{if(!c||typeof IntersectionObserver>"u")return;const h=o.current;if(!h)return;const m=h.closest('[data-slot="shell-content"]'),x=new IntersectionObserver(g=>{var v;g[0].isIntersecting||(v=h.querySelector("video"))==null||v.pause()},{root:m,threshold:0});return x.observe(h),()=>x.disconnect()},[c]),c?l.jsx("div",{ref:o,"data-slot":"acrylic-inline-video",children:l.jsx(Yh,{kind:"video",src:d,mediaSize:a.videoSize?{width:a.videoSize.w,height:a.videoSize.h}:null,className:r,maxWidth:Xh,videoMaxHeight:Gh,children:l.jsx("div",{className:"h-full w-full",onClick:h=>h.stopPropagation(),children:l.jsx(lJ,{node:a.node})})})}):l.jsx(Yh,{kind:"video",src:d,className:r,maxWidth:Xh,videoMaxHeight:Gh,children:l.jsx($M,{label:"播放视频",onActivate:()=>a.play(e,t),children:l.jsx("span",{className:"flex size-10 items-center justify-center rounded-full bg-black/55 text-white shadow-sm",children:l.jsx(Hn,{className:"size-5 translate-x-px fill-current"})})})})}function fJ({poster:e,playing:t,durationS:n,onActivate:r}){const{t:a}=kp(),o=a(t?"timeline.pause":"timeline.play"),c=t?l.jsx(Fi,{className:"size-5 fill-current"}):l.jsx(Hn,{className:"size-5 translate-x-px fill-current"}),d=l.jsx("button",{type:"button","aria-label":o,title:o,onClick:h=>{h.stopPropagation(),r()},className:"flex size-10 items-center justify-center rounded-full bg-black/55 text-white shadow-sm transition-colors hover:bg-black/70",children:c});return e?l.jsxs(Yh,{kind:"image",src:e,className:"mt-2",maxWidth:Xh,children:[l.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:d}),typeof n=="number"?l.jsx("span",{className:"absolute bottom-1.5 right-1.5 rounded-full bg-black/55 px-2 py-0.5 text-[11px] tabular-nums text-white",children:Fh(n)}):null]}):l.jsxs("div",{className:"mt-2 flex items-center gap-2.5",onClick:h=>h.stopPropagation(),children:[d,typeof n=="number"?l.jsx("span",{className:"text-[12px] tabular-nums text-muted-foreground",children:Fh(n)}):null]})}function hJ({media:e,compact:t=!1,isVideo:n=!1,onOpen:r}){const a=e[0];return a?e.length>1&&!t?l.jsx("div",{className:"mt-3 grid max-w-xl grid-cols-2 gap-2",children:e.slice(0,4).map((o,c)=>l.jsxs("button",{type:"button",onClick:d=>{d.stopPropagation(),r==null||r(c)},className:"relative overflow-hidden rounded-[9px] border border-[var(--acr-border)] bg-[var(--acr-card-nested)]",children:[l.jsx("img",{src:o.src,alt:o.alt||"",referrerPolicy:"no-referrer",className:"aspect-square size-full object-cover",loading:"lazy"}),c===3&&e.length>4?l.jsxs("div",{className:"absolute inset-0 flex items-center justify-center bg-black/45 text-[13px] font-medium text-white",children:["+",e.length-4]}):null]},`${o.src}-${c}`))}):l.jsx(Yh,{kind:n?"video":"image",src:a.src,alt:a.alt,naturalWidth:a.w,naturalHeight:a.h,className:"mt-2",maxWidth:t?Xh:void 0,videoMaxHeight:t&&n?Gh:void 0,children:r?l.jsx($M,{label:n?"视频":"查看大图",onActivate:()=>r(0),children:n?l.jsx("span",{className:"flex size-9 items-center justify-center rounded-full bg-black/55 pl-0.5 text-[15px] text-white",children:"▶"}):null}):n?l.jsx("div",{"aria-label":"视频",className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:l.jsx("span",{className:"flex size-9 items-center justify-center rounded-full bg-black/55 pl-0.5 text-[15px] text-white",children:"▶"})}):null}):null}function mJ(e){const[t,n]=p.useState(0);p.useLayoutEffect(()=>{const o=e.current;if(!o||typeof ResizeObserver>"u")return;const c=new ResizeObserver(([d])=>n(d.contentRect.width));return c.observe(o),()=>c.disconnect()},[e]);const r=hZ(t),a=t>0?t/r:hM;return{colCount:r,colWidth:a}}function pJ(e,t,n){const r=p.useRef(null);return p.useMemo(()=>{const a=yZ(e.map(gZ),t,n,r.current??void 0);return r.current=a,a},[e,t,n])}function BM({n:e,expanded:t,lead:n,onToggle:r}){return l.jsxs("div",{className:"flex w-full items-center gap-2 px-3 py-1 text-xs text-muted-foreground",children:[l.jsxs("button",{type:"button","data-slot":"same-story-toggle",onClick:r,className:"flex items-center gap-1 text-left hover:text-foreground",children:[l.jsx("span",{"aria-hidden":!0,children:t?"▾":"▸"}),wZ(e,t)]}),n&&l.jsx("span",{"data-slot":"same-story-lead",className:"text-[11px] opacity-70",children:n})]})}function gJ({items:e,layout:t,channelId:n,onOpen:r,onPlayAudio:a,className:o}){const c=p.useRef(null),[d,h]=p.useState(()=>new Set),{rendered:m,hidden:x,membersOf:g}=p.useMemo(()=>bZ(e,d),[e,d]),v=b=>h(j=>SZ(j,b)),S=p.useRef({layout:t,channelId:n});if(p.useEffect(()=>{var C,k;const b=S.current;if(S.current={layout:t,channelId:n},b.layout===t||b.channelId!==n)return;const j=(C=c.current)==null?void 0:C.closest('[data-slot="shell-content"]');(k=j==null?void 0:j.scrollTo)==null||k.call(j,{top:0})},[t,n]),t==="list"){const b={onOpen:r,onPlayAudio:a};return l.jsx("div",{ref:c,className:o,children:l.jsx(ru,{className:"w-full gap-0",children:m.map((j,C)=>{var T;const k=(T=j.storyGroup)!=null&&T.isRep?j.storyGroup.id:void 0,N=k?x.get(k)??0:0;return l.jsxs("div",{className:"w-full",children:[l.jsx(cJ,{item:j,last:C===m.length-1&&N===0,...b}),k&&(N>0||d.has(k))&&l.jsx(BM,{n:N,expanded:d.has(k),lead:pM(j,g.get(k)??[]),onToggle:()=>v(k)})]},j.id)})})})}return l.jsx(xJ,{rootRef:c,items:m,hidden:x,membersOf:g,expanded:d,onToggleGroup:v,handlers:{onOpen:r,onPlayAudio:a},className:o})}function xJ({rootRef:e,items:t,hidden:n,membersOf:r,expanded:a,onToggleGroup:o,handlers:c,className:d}){const{colCount:h,colWidth:m}=mJ(e),{columns:x}=pJ(t,h,m),g=p.useMemo(()=>new Map(t.map(v=>[v.id,v])),[t]);return l.jsx("div",{ref:e,"data-slot":"post-feed-masonry",className:W("flex w-full items-start gap-3",d),children:x.map((v,S)=>l.jsx("div",{"data-slot":"post-feed-column",className:"flex min-w-0 flex-1 flex-col gap-3",children:v.map(b=>{var N;const j=g.get(b);if(!j)return null;const C=(N=j.storyGroup)!=null&&N.isRep?j.storyGroup.id:void 0,k=C?n.get(C)??0:0;return l.jsxs("div",{className:"flex flex-col",children:[l.jsx(WZ,{item:j,...c}),C&&(k>0||a.has(C))&&l.jsx(BM,{n:k,expanded:a.has(C),lead:pM(j,r.get(C)??[]),onToggle:()=>o(C)})]},b)})},S))})}function vJ(){let e=null;return{arm:(t,n)=>{e={trackId:t,seconds:n}},retarget:t=>{e&&e.trackId!==t&&(e=null)},redeem:t=>{const n=e&&e.trackId===t?e.seconds:null;return e=null,n},clear:()=>{e=null}}}function yJ(e,t,n){if(!t)return!1;const r=e.redeem(n);return r===null?!1:(t.currentTime=r,!0)}function bJ({elementRef:e,stageRef:t,onMediaEvent:n,children:r}){const a=p.useRef(null),o=e??a,[c,d]=p.useState(null),[h,m]=p.useState({music:[],podcast:[]}),[x,g]=p.useState("music"),[v,S]=p.useState(!1),b=p.useMemo(()=>yX(),[]),[j,C]=p.useState(0),k=p.useRef((()=>{if(typeof window>"u")return 1;const z=Number(window.localStorage.getItem("audioVolume"));return Number.isFinite(z)&&z>0?Math.min(1,z):1})()),N=p.useMemo(()=>vJ(),[]);p.useEffect(()=>{b.set(0),C(0),N.retarget(c==null?void 0:c.id),c&&T()},[c==null?void 0:c.id]),p.useEffect(()=>{o.current&&(o.current.volume=k.current)},[c==null?void 0:c.id]);const T=()=>{const z=o.current;return z?z.play().catch(_=>{_==null||_.name}):Promise.resolve()},R=async(z,_)=>{const V=["","ABORTED","NETWORK","DECODE","SRC_NOT_SUPPORTED"][(_==null?void 0:_.code)??0]||"UNKNOWN";let B=_?`MEDIA_ERR_${V}${_.message?` — ${_.message}`:""}`:"无法播放";if(z.url&&((_==null?void 0:_.code)===2||(_==null?void 0:_.code)===4))try{const I=await fetch(z.url);if(!I.ok){const H=await I.json().catch(()=>null);B+=` | 上游:${(H==null?void 0:H.detail)||(H==null?void 0:H.error)||`HTTP ${I.status}`}`}}catch(I){B+=` | 网络:${(I==null?void 0:I.message)||"请求失败"}`}const G=`${z.title||"音频"}:${B}`;Ke.error("播放失败",{description:G,action:{label:"复制错误",onClick:()=>{var I;return void((I=navigator.clipboard)==null?void 0:I.writeText(G))}}})},A=p.useMemo(()=>{const z={current:c,playing:v,duration:j||(c==null?void 0:c.durationS)||0,activeKind:x,queues:h,queue:h[x],play:_=>{m(V=>({...V,[_.kind]:[_]})),g(_.kind),_.id===(c==null?void 0:c.id)?T():d(_)},playQueue:(_,V,B)=>{const G=_[Math.max(0,Math.min(V,_.length-1))];G&&(m(I=>({...I,[B]:_})),g(B),G.id===(c==null?void 0:c.id)?T():d(G))},toggle:()=>{const _=o.current;_&&(_.paused?T():_.pause())},seek:_=>{o.current&&(o.current.currentTime=_)},playAt:(_,V)=>{if(_.id===(c==null?void 0:c.id)){o.current&&(o.current.currentTime=V),T();return}N.arm(_.id,V),m(B=>({...B,[_.kind]:[_]})),g(_.kind),d(_)},stop:()=>{var _;(_=o.current)==null||_.pause(),N.clear(),d(null)},getVolume:()=>k.current,setVolume:_=>{const V=Math.max(0,Math.min(1,_));k.current=V,o.current&&(o.current.volume=V),window.localStorage.setItem("audioVolume",String(V))}};return t&&(t.current=z),z},[c,v,j,h,x,t]),O=()=>{S(!1);const z=(c==null?void 0:c.kind)??x,_=AY(h[z],c==null?void 0:c.id);_&&d(_)};return l.jsxs(_y.Provider,{value:A,children:[l.jsx(NA.Provider,{value:b,children:r}),l.jsx("audio",{ref:o,src:c==null?void 0:c.url,onPlay:()=>S(!0),onPause:()=>S(!1),onTimeUpdate:z=>b.set(z.currentTarget.currentTime),onDurationChange:z=>C(z.currentTarget.duration||0),onError:z=>{var _;N.clear(),c&&R(c,z.currentTarget.error),n==null||n("error",`code=${((_=z.currentTarget.error)==null?void 0:_.code)??0}`)},onEnded:O,onLoadStart:()=>n==null?void 0:n("loadstart"),onLoadedMetadata:()=>{yJ(N,o.current,c==null?void 0:c.id),n==null||n("loadedmetadata")},onPlaying:()=>n==null?void 0:n("playing"),onWaiting:()=>n==null?void 0:n("waiting"),onStalled:()=>n==null?void 0:n("stalled"),onSuspend:()=>n==null?void 0:n("suspend"),hidden:!0})]})}function wJ(e){return e==="watch"}const SJ=Jy({marker:"data-stream-panel-detail",globalName:"__streamPanelDetail",file:"panel-detail",label:"详情"}),jJ=Jy({marker:"data-stream-panel-movie",globalName:"__streamPanelMovie",file:"panel-movie",label:"影视"}),UM=60,CJ="420px",kJ="min(1100px, 100vw)";function NJ({onWidthChange:e,onChannelNavState:t,registerChannelSetter:n,registerChannelReloader:r,onItemContext:a}={}){const[o,c]=p.useState([]),[d,h]=p.useState(),[m,x]=p.useState(!1),[g,v]=p.useState([]),[S,b]=p.useState([]),[j,C]=p.useState(Rh),k=p.useRef([]);k.current=g;const N=p.useRef(0),[T,R]=p.useState(null),[A,O]=p.useState("content"),[z,_]=p.useState(0);p.useEffect(()=>{O("content")},[j]);const[V,B]=p.useState(null),G=p.useRef(null),I=p.useRef(void 0),H=p.useRef(!1),ee=p.useRef(null),X=p.useRef(null),{caps:M,status:U}=YZ(ut),K=WV(ut),ne=p.useMemo(()=>KV(ut),[]),[q,P]=p.useState(!1),[L,Y]=p.useState(!1),J=p.useRef(K.state);J.current=K.state;const $=p.useRef(void 0);p.useEffect(()=>{$.current=U==="ready"?M:void 0},[M,U]);const[se,oe]=p.useState(!1),[ie,Z]=p.useState(),ve=p.useRef(null),Te=p.useRef(null),[Ee,Ie]=p.useState(!1),[Fe,fe]=p.useState(!1),[Se,ye]=p.useState(),Xe=p.useRef(null),nt=p.useRef(null),[re,_e]=p.useState(!1),[Pe,We]=p.useState(),ge=p.useCallback(()=>{be.channels(ut).then(Me=>v(Me)).catch(()=>{}),be.spaces(ut).then(Me=>b(Me)).catch(()=>{})},[]);p.useEffect(()=>{ge()},[ge]),p.useEffect(()=>Fk(be.wsUrl(ut),ge),[ge]);const Ge=e===void 0,je=g.find(Me=>Me.id===j),kt=(je==null?void 0:je.present)==="video",zt=Ge&&(je==null?void 0:je.present)==="audio",Xn=kt&&Ge,fn=(je==null?void 0:je.present)==="research",Qn=(je==null?void 0:je.present)==="tasks",sn=(je==null?void 0:je.present)==="embed",Zn=sn?EJ(je==null?void 0:je.options):void 0,we=p.useRef(void 0);we.current=je;const Oe=p.useMemo(()=>g.filter(Me=>Me.id===j),[g,j]),lt=p.useRef(Oe);lt.current=Oe,p.useEffect(()=>{const Me=++N.current;ee.current!==null&&(ee.current.scrollTop=0),c([]),h(void 0),I.current=void 0,H.current=!1,x(!1),!(kt||zt||fn||Qn||sn)&&be.channelItems(ut,j,{limit:UM}).then(Ue=>{Me===N.current&&(c(Ue.items),I.current=Ue.next_cursor)}).catch(Ue=>{Me===N.current&&h(Ue instanceof Error?Ue.message:String(Ue))})},[j,kt,zt,fn,Qn,sn]);const an=p.useCallback(()=>{const Me=I.current;if(!Me||H.current)return;const Ue=N.current;H.current=!0,x(!0),be.channelItems(ut,j,{limit:UM,cursor:Me}).then(ke=>{Ue===N.current&&(c(ft=>{const Pt=new Set(ft.map(Qt=>Qt.id));return[...ft,...ke.items.filter(Qt=>!Pt.has(Qt.id))]}),I.current=ke.next_cursor)}).catch(()=>{}).finally(()=>{Ue===N.current&&(H.current=!1,x(!1))})},[j]),en=T!==null;p.useEffect(()=>{e==null||e(en?kJ:CJ)},[en,e]),p.useEffect(()=>{t==null||t({spaces:S.map(Me=>({id:Me.id,label:Me.label})),channels:MR(g).map(Me=>({id:Me.id,label:Me.label,supported:Ay(Me),space_id:Me.space_id})),active:j})},[S,g,j,t]),p.useEffect(()=>{a==null||a({open:T===null?null:_R(T.item),recent:o.slice(0,oY).map(_R),fullscreen:en||Fe})},[o,T,en,Fe,a]),p.useEffect(()=>{n==null||n(Me=>{C(Ue=>{const ke=k.current.find(ft=>ft.id===Me);return ke!==void 0&&Ay(ke)?Me:Ue})})},[n]),p.useEffect(()=>{r==null||r(ge)},[r,ge]),p.useEffect(()=>{if(T===null)return;oe(!1),Z(void 0);let Me=!1,Ue;return SJ.load(ut.baseUrl).then(ke=>{Me||X.current===null||(ke.mount(X.current,{backend:ut.baseUrl,item:T.item,startMediaIndex:T.mediaIndex,autoPlayMedia:T.autoPlay,extractCaps:$.current,askChat:PL(),onClose:()=>R(null)}),Ue=ke,oe(!0))}).catch(ke=>{Me||Z(ke instanceof Error?ke.message:String(ke))}),()=>{Me=!0;const ke=Ue;ke!==void 0&&queueMicrotask(()=>ke.unmount())}},[T]);const bt=p.useCallback(Me=>{var ft;const Ue=DY(o,ut.baseUrl,"podcast"),ke=Ue.findIndex(Pt=>Pt.id===Me.id);ke>=0&&((ft=G.current)==null||ft.playQueue(Ue,ke,"podcast"))},[o]),Ft=p.useCallback(()=>{const Me=be.refreshChannel(ut,j);Ke.promise(Me,{loading:"正在重新抓取…",success:Ue=>{const ke=`抓取完成:取到 ${Ue.fetched} 条,新增 ${Ue.written} 条`;return Ue.failed>0?`${ke}(${Ue.failed}/${Ue.streams.length} 条源没成)`:ke},error:Ue=>`抓取失败:${Ue instanceof Error?Ue.message:String(Ue)}`}),Me.catch(()=>{if(J.current!=="never-seen")return;const Ue=new Date;QV("harvest",ZV("harvest"),Ue)&&(JV("harvest",Ue),Y(!0))}).finally(()=>ge())},[j,ge]);p.useEffect(()=>{if(!Xn)return;Ie(!1),ye(void 0),fe(!1);let Me=!1,Ue;return jJ.load(ut.baseUrl).then(ke=>{Me||ve.current===null||(ke.mount(ve.current,{backend:ut.baseUrl,channels:lt.current,onChannelsChanged:ge,onReload:Ft,onOverlayChange:fe}),Ue=ke,Te.current=ke,Ie(!0))}).catch(ke=>{Me||ye(ke instanceof Error?ke.message:String(ke))}),()=>{Me=!0,Te.current=null;const ke=Ue;ke!==void 0&&queueMicrotask(()=>ke.unmount())}},[Xn,j,ge,Ft]),p.useEffect(()=>{var Me;Ee&&((Me=Te.current)==null||Me.update({backend:ut.baseUrl,channels:Oe,onChannelsChanged:ge,onReload:Ft,onOverlayChange:fe}))},[Ee,Oe,ge,Ft]),p.useEffect(()=>{if(!fn||je===void 0)return;_e(!1),We(void 0);let Me=!1,Ue;return gQ.load(ut.baseUrl).then(ke=>{if(Me||Xe.current===null)return;const ft=we.current;ft!==void 0&&(ke.mount(Xe.current,{backend:ut.baseUrl,channel:ft,onChannelsChanged:ge}),Ue=ke,nt.current=ke,_e(!0))}).catch(ke=>{Me||We(ke instanceof Error?ke.message:String(ke))}),()=>{Me=!0,nt.current=null;const ke=Ue;ke!==void 0&&queueMicrotask(()=>ke.unmount())}},[fn,j]),p.useEffect(()=>{var Me;!re||je===void 0||(Me=nt.current)==null||Me.update({backend:ut.baseUrl,channel:je,onChannelsChanged:ge})},[re,je,ge]);const Sn=p.useCallback(Me=>{const Ue=Me.currentTarget;Ue.scrollHeight-Ue.scrollTop-Ue.clientHeight<Ue.clientHeight&&an()},[an]);return l.jsx(qZ,{caps:M,children:l.jsxs("div",{className:"relative flex h-full flex-col text-foreground",children:[l.jsx(OL,{}),K.state==="never-seen"&&K.declinedAt===void 0&&!q&&l.jsx(Pk,{variant:"banner",actions:ne,onDismiss:()=>P(!0),onConnected:K.refresh}),L&&K.state==="never-seen"&&l.jsx(YV,{actions:ne,onConnected:K.refresh}),t===void 0?l.jsx(iY,{channels:g,selected:j,onSelect:Me=>C(Me)}):null,l.jsx(bJ,{stageRef:G,children:kt?Ge?l.jsxs("div",{"data-testid":"panel-movie-host",className:"relative min-h-0 flex-1",children:[l.jsx("div",{ref:ve,className:"absolute inset-0 flex flex-col"}),Se!==void 0?l.jsxs("div",{"data-testid":"panel-movie-error",className:"absolute inset-0 flex items-center justify-center p-4 text-center text-sm text-destructive",children:["影视频道加载失败:",Se]}):Ee?null:l.jsx("div",{"data-testid":"panel-movie-loading",className:"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground",children:"加载中…"})]}):l.jsx("div",{"data-testid":"panel-movie-too-narrow",className:"p-4 text-sm text-muted-foreground",children:"影视频道要更宽的版面,请在工作台里打开。"}):zt&&je!==void 0?l.jsx(pQ,{channel:je,onChannelsChanged:ge,onReload:Ft}):fn?l.jsxs("div",{"data-testid":"panel-research-host",className:"relative min-h-0 flex-1",children:[l.jsx("div",{ref:Xe,className:"absolute inset-0 flex flex-col"}),Pe!==void 0?l.jsxs("div",{"data-testid":"panel-research-error",className:"absolute inset-0 flex items-center justify-center p-4 text-center text-sm text-destructive",children:["研究频道加载失败:",Pe]}):re?null:l.jsx("div",{"data-testid":"panel-research-loading",className:"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground",children:"加载中…"})]}):Qn?l.jsx("div",{"data-testid":"panel-tasks-host",className:"min-h-0 flex-1",children:l.jsx(BQ,{apiBase:ut.baseUrl,title:(je==null?void 0:je.label)??"定时任务"})}):sn&&je!==void 0?l.jsxs(l.Fragment,{children:[l.jsx("div",{"data-testid":"panel-timeline-header",className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:l.jsx(Lf,{title:je.label,onRefresh:()=>_(Me=>Me+1),refreshLabel:"重新载入面板",exportChannel:{conn:ut,id:je.id},className:"min-w-0 flex-1"})}),l.jsx(Cy,{value:A,onChange:O}),A==="config"?l.jsx("div",{"data-testid":"panel-config",className:"min-h-0 flex-1 overflow-y-auto",children:l.jsx(Cx,{conn:ut,children:l.jsx(jy,{conn:ut,channelId:je.id,showHeader:!1,onChanged:ge,onDeleted:()=>{O("content"),C(Rh)}})})}):Zn!==void 0?l.jsx("iframe",{"data-testid":"panel-embed-frame",title:je.label,src:Zn,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups",className:"min-h-0 w-full flex-1 border-0 bg-background"},`${Zn}#${z}`):l.jsx("div",{"data-testid":"panel-embed-empty",className:"flex flex-1 items-center justify-center p-6 text-center text-sm text-muted-foreground",children:"这个外接面板还没有地址。到「配置」分页填一个 http(s) 网址,这里就会整页装它。"})]}):l.jsxs(l.Fragment,{children:[l.jsx("div",{"data-testid":"panel-timeline-header",className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:l.jsx(Lf,{title:(je==null?void 0:je.label)??"时间线",onRefresh:Ft,exportChannel:je?{conn:ut,id:je.id}:void 0,className:"min-w-0 flex-1"})}),je!==void 0?l.jsx(Cy,{value:A,onChange:O}):null,A==="config"&&je!==void 0?l.jsx("div",{"data-testid":"panel-config",className:"min-h-0 flex-1 overflow-y-auto",children:l.jsx(Cx,{conn:ut,children:l.jsx(jy,{conn:ut,channelId:je.id,showHeader:!1,onChanged:ge,onDeleted:()=>{O("content"),C(Rh)},onEditStream:B})})}):d!==void 0?l.jsxs("div",{"data-testid":"panel-error",className:"p-4 text-sm text-destructive",children:["取内容失败:",d]}):l.jsxs("div",{ref:ee,"data-testid":"panel-scroll",className:"min-h-0 flex-1 overflow-y-auto p-5",onScroll:Sn,children:[l.jsx(gJ,{items:o,layout:"waterfall",channelId:j,onOpen:(Me,Ue)=>R({item:Me,mediaIndex:(Ue==null?void 0:Ue.mediaIndex)??0,autoPlay:wJ(Ue==null?void 0:Ue.intent)}),onPlayAudio:bt}),m?l.jsx("div",{className:"py-3 text-center text-xs text-muted-foreground",children:"加载中…"}):null]})]})}),T!==null?l.jsxs(l.Fragment,{children:[l.jsx("div",{ref:X,className:"absolute inset-0"}),ie!==void 0?l.jsxs("div",{className:"absolute inset-0 flex items-center justify-center p-4 text-center text-sm text-destructive",children:["详情加载失败:",ie]}):se?null:l.jsx("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground",children:"加载中…"})]}):null,V!==null?l.jsx("div",{"data-testid":"panel-stream-setting",className:"absolute inset-0 z-10 flex flex-col bg-background",children:l.jsx(aY,{conn:ut,channelId:j,channelName:je==null?void 0:je.label,stream:V,onBack:()=>B(null),onSaved:ge})}):null]})})}function EJ(e){const t=e==null?void 0:e.url;if(!(typeof t!="string"||t.trim()===""))try{const n=new URL(t);return n.protocol==="http:"||n.protocol==="https:"?t:void 0}catch{return}}const VM="data-ds-dark-theme";function TJ(){return document.body.hasAttribute(VM)}function RJ(e){const t=()=>{const r=TJ();e.classList.toggle("dark",r),document.body.classList.toggle("dark",r)};t();const n=new MutationObserver(t);return n.observe(document.body,{attributes:!0,attributeFilter:[VM]}),()=>{n.disconnect(),document.body.classList.remove("dark")}}let Dl,zu,Pu,Lu;function AJ(e){Pu==null||Pu(e)}function MJ(){Lu==null||Lu()}function DJ(e,t){LP(t.backend,t.backend.replace(/^http/,"ws")),P1(t.onAskChat),zu=RJ(e),Dl=_z.createRoot(e),Dl.render(l.jsx(p.StrictMode,{children:l.jsx(NJ,{onWidthChange:t.manageWidth===!1?void 0:n=>{e.style.width=n},onChannelNavState:t.onChannelNavState,onItemContext:t.onItemContext,registerChannelSetter:t.onChannelNavState===void 0?void 0:n=>{Pu=n},registerChannelReloader:n=>{Lu=n}})}))}function _J(){Dl==null||Dl.unmount(),Dl=void 0,zu==null||zu(),zu=void 0,Pu=void 0,Lu=void 0,P1(void 0)}const OJ=Object.freeze(Object.defineProperty({__proto__:null,default:class Cz{constructor(t,n){this.id=t,this.listeners=n}static async connect(t,n){const r=new Set,a=new aF;return a.onmessage=o=>{r.forEach(c=>{c(o)})},n!=null&&n.headers&&(n.headers=Array.from(new Headers(n.headers).entries())),await Bk("plugin:websocket|connect",{url:t,onMessage:a,config:n}).then(o=>new Cz(o,r))}addListener(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}async send(t){let n;if(typeof t=="string")n={type:"Text",data:t};else if(typeof t=="object"&&"type"in t)n=t;else if(Array.isArray(t))n={type:"Binary",data:t};else throw new Error("invalid `message` type, expected a `{ type: string, data: any }` object, a string or a numeric array");await Bk("plugin:websocket|send",{id:this.id,message:n})}async disconnect(){await this.send({type:"Close",data:{code:1e3,reason:"Disconnected by client"}})}}},Symbol.toStringTag,{value:"Module"}));return Zt.mount=DJ,Zt.reloadChannels=MJ,Zt.setChannel=AJ,Zt.unmount=_J,Object.defineProperty(Zt,Symbol.toStringTag,{value:"Module"}),Zt})({});
463
+ `;function TA(e){const t=e.replace("#","");return[parseInt(t.slice(0,2),16)/255,parseInt(t.slice(2,4),16)/255,parseInt(t.slice(4,6),16)/255]}function RA(e,t,n){const r=e.createShader(t);return e.shaderSource(r,n),e.compileShader(r),r}function TX({speed:e=5,scale:t=1,color:n="#7B7481",noiseIntensity:r=1.5,rotation:a=0,colorTransitionMs:o=0,className:c}){const d=p.useRef(null),h=p.useRef({speed:e,scale:t,color:n,noiseIntensity:r,rotation:a,colorTransitionMs:o});h.current={speed:e,scale:t,color:n,noiseIntensity:r,rotation:a,colorTransitionMs:o};const m=p.useRef(()=>{});return p.useEffect(()=>{const x=d.current;if(!x)return;const g=x.getContext("webgl",{antialias:!0,alpha:!1,powerPreference:"low-power"});if(!g)return;const v=g.createProgram();g.attachShader(v,RA(g,g.VERTEX_SHADER,NX)),g.attachShader(v,RA(g,g.FRAGMENT_SHADER,EX)),g.linkProgram(v),g.useProgram(v);const S=g.createBuffer();g.bindBuffer(g.ARRAY_BUFFER,S),g.bufferData(g.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,1,1]),g.STATIC_DRAW);const b=g.getAttribLocation(v,"aPos");g.enableVertexAttribArray(b),g.vertexAttribPointer(b,2,g.FLOAT,!1,0,0);const j={time:g.getUniformLocation(v,"uTime"),color:g.getUniformLocation(v,"uColor"),speed:g.getUniformLocation(v,"uSpeed"),scale:g.getUniformLocation(v,"uScale"),rotation:g.getUniformLocation(v,"uRotation"),noise:g.getUniformLocation(v,"uNoiseIntensity")},C=TA(h.current.color),k=()=>{const B=h.current;g.uniform1f(j.speed,B.speed),g.uniform1f(j.scale,B.scale),g.uniform1f(j.rotation,B.rotation),g.uniform1f(j.noise,B.noiseIntensity)},N=window.matchMedia("(prefers-reduced-motion: reduce)").matches,T=()=>{const B=Math.min(window.devicePixelRatio||1,2),G=Math.max(1,Math.floor(x.clientWidth*B)),I=Math.max(1,Math.floor(x.clientHeight*B));(x.width!==G||x.height!==I)&&(x.width=G,x.height=I,g.viewport(0,0,G,I))},R=new ResizeObserver(T);R.observe(x),T();let A=0;const O=(B=0)=>{const G=h.current,I=TA(G.color),H=G.colorTransitionMs??0;if(H<=0||document.hidden)C[0]=I[0],C[1]=I[1],C[2]=I[2];else if(B>0){const ee=1-Math.exp(-B/(H/3));C[0]+=(I[0]-C[0])*ee,C[1]+=(I[1]-C[1])*ee,C[2]+=(I[2]-C[2])*ee}k(),g.uniform3f(j.color,C[0],C[1],C[2]),g.uniform1f(j.time,A),g.drawArrays(g.TRIANGLE_STRIP,0,4)};m.current=O,O();let z=0,_=0;const V=B=>{if(z=requestAnimationFrame(V),document.hidden)return;const G=_?B-_:16;_=B,N||(A+=.1*(G/1e3)),O(G)};return z=requestAnimationFrame(V),()=>{cancelAnimationFrame(z),R.disconnect(),g.deleteProgram(v),g.deleteBuffer(S),m.current=()=>{}}},[]),p.useEffect(()=>{m.current(0)},[e,t,n,r,a,o]),l.jsx("canvas",{ref:d,className:W("block size-full",c)})}function AA(e){(!Number.isFinite(e)||e<0)&&(e=0);const t=Math.floor(e/60),n=Math.floor(e%60);return`${t}:${n.toString().padStart(2,"0")}`}const MA=32,RX=40;function DA({children:e,className:t}){const n=p.useRef(null),r=p.useRef(null),[a,o]=p.useState(!1);return p.useLayoutEffect(()=>{const c=n.current,d=r.current;if(!c||!d)return;let h;const m=()=>{h==null||h.cancel(),h=void 0;const g=d.firstElementChild,v=(g==null?void 0:g.scrollWidth)??0,b=!window.matchMedia("(prefers-reduced-motion: reduce)").matches&&v>c.clientWidth+1;if(o(b),!b)return;const j=v+MA;h=d.animate([{transform:"translateX(0)"},{transform:`translateX(-${j}px)`}],{duration:j/RX*1e3,iterations:1/0,easing:"linear"})};m();const x=new ResizeObserver(m);return x.observe(c),()=>{x.disconnect(),h==null||h.cancel()}},[e]),l.jsx("div",{ref:n,className:W("overflow-hidden",t),children:l.jsxs("div",{ref:r,className:W("flex whitespace-nowrap",a&&"w-max will-change-transform"),children:[l.jsx("span",{className:W("min-w-0",!a&&"truncate"),children:e}),a&&l.jsx("span",{"aria-hidden":!0,className:"shrink-0",style:{paddingLeft:MA},children:e})]})})}const AX={collapse:"Collapse",enterFullscreen:"Enter full screen",exitFullscreen:"Exit full screen",previous:"Previous track",play:"Play",pause:"Pause",next:"Next track",progress:"Progress",volume:"Volume",unknownTrack:"Unknown track"},MX="#5E3AA8";function DX(e,t,n){return"#"+[e,t,n].map(r=>Math.round(r).toString(16).padStart(2,"0")).join("")}function _X(e){const n=document.createElement("canvas");n.width=24,n.height=24;const r=n.getContext("2d",{willReadFrequently:!0});r.drawImage(e,0,0,24,24);let a;try{a=r.getImageData(0,0,24,24).data}catch{return null}const o=new Map;for(let d=0;d<a.length;d+=4){const h=a[d],m=a[d+1],x=a[d+2];if(a[d+3]<8)continue;const v=Math.max(h,m,x),S=Math.min(h,m,x),b=(h+m+x)/3,j=v===0?0:(v-S)/v;if(b<25||b>235||j<.15)continue;const C=h>>4<<8|m>>4<<4|x>>4,k=o.get(C)||{n:0,r:0,g:0,b:0};k.n++,k.r+=h,k.g+=m,k.b+=x,o.set(C,k)}let c=null;for(const d of o.values())(!c||d.n>c.n)&&(c=d);return c?[c.r/c.n,c.g/c.n,c.b/c.n]:null}function OX([e,t,n]){const r=Math.max(e,t,n);if(r<150){const a=150/Math.max(r,1);e=Math.min(255,e*a),t=Math.min(255,t*a),n=Math.min(255,n*a)}return DX(e,t,n)}function zX(e,t){const[n,r]=p.useState();return p.useEffect(()=>{if(!t||!e){r(void 0);return}let a=!1;const o=new Image;return o.crossOrigin="anonymous",o.onload=()=>{if(a)return;const c=_X(o);r(c?OX(c):void 0)},o.onerror=()=>!a&&r(void 0),o.src=e,()=>{a=!0}},[e,t]),n}function PX({track:e,playing:t=!1,currentTime:n=0,duration:r=0,volume:a,hasPrev:o=!0,hasNext:c=!0,accentColor:d,extractFromCover:h=!0,colorTransitionMs:m=400,nowPlayingLabel:x,labels:g,autoFullscreen:v=!1,onToggle:S,onPrev:b,onNext:j,onSeek:C,onVolumeChange:k,onClose:N,className:T,...R}){const A={...AX,...g},O=p.useRef(null),[z,_]=p.useState(!1),V=e.lyrics??[],B=V.length>0,G=zX(e.cover,h&&!d&&!z),I=d??G??MX,H=p.useRef(n),[ee,X]=p.useState(n);p.useEffect(()=>{Math.abs(n-H.current)>.75&&(H.current=n,X(n))},[n]),p.useEffect(()=>{H.current=n,X(n)},[e]),p.useEffect(()=>{if(!t)return;let Z=0,ve=0,Te=0;const Ee=Ie=>{Z=requestAnimationFrame(Ee);const Fe=ve?(Ie-ve)/1e3:0;ve=Ie,H.current=Math.min(r||1/0,H.current+Fe),Te+=Fe,Te>=.08&&(Te=0,X(H.current))};return Z=requestAnimationFrame(Ee),()=>cancelAnimationFrame(Z)},[t,r]);const M=Z=>{H.current=Z,X(Z),C==null||C(Z)},U=p.useMemo(()=>{let Z=0;for(let ve=0;ve<V.length&&V[ve].time<=ee;ve++)Z=ve;return Z},[V,ee]),K=p.useRef(null),ne=p.useRef([]),q=p.useRef(!1),P=p.useRef(null),L=p.useCallback((Z="smooth")=>{const ve=ne.current[U],Te=K.current;ve&&Te&&Te.scrollTo({top:ve.offsetTop-Te.clientHeight/2+ve.clientHeight/2,behavior:Z})},[U]);p.useEffect(()=>{if(q.current)return;const Z=setTimeout(()=>L(),220);return()=>clearTimeout(Z)},[U,e,L]),p.useEffect(()=>()=>{P.current&&clearTimeout(P.current)},[]);const Y=()=>{q.current=!0,P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{q.current=!1,L()},5e3)},[J,$]=p.useState(!1);p.useEffect(()=>{const Z=()=>$(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",Z),()=>document.removeEventListener("fullscreenchange",Z)},[]);const se=()=>{var Z,ve;document.fullscreenElement?document.exitFullscreen():(ve=(Z=O.current)==null?void 0:Z.requestFullscreen)==null||ve.call(Z)};p.useEffect(()=>{var Z,ve;v&&!document.fullscreenElement&&((ve=(Z=O.current)==null?void 0:Z.requestFullscreen)==null||ve.call(Z).catch(()=>{}))},[]),p.useEffect(()=>{const Z=ve=>ve.key==="Escape"&&!document.fullscreenElement&&(N==null?void 0:N());return window.addEventListener("keydown",Z),()=>window.removeEventListener("keydown",Z)},[N]);const oe=typeof a=="number"&&!!k,ie=e.cover&&!z;return l.jsxs("div",{ref:O,"data-slot":"audio-player-stage",className:W("fixed inset-0 z-[60] overflow-hidden",T),...R,children:[l.jsx(TX,{className:"!absolute inset-0",color:I,colorTransitionMs:m,speed:4,scale:.8,noiseIntensity:1,rotation:.05}),l.jsx("div",{className:"absolute inset-0 bg-gradient-to-b from-black/30 via-black/40 to-black/70"}),l.jsxs("div",{className:"relative flex h-full flex-col px-[max(1.5rem,9.5vw)] pb-8 pt-5 text-white",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("button",{onClick:N,"aria-label":A.collapse,className:W("-ml-2 flex size-9 items-center justify-center rounded-full text-white/80 transition-colors hover:bg-white/10 hover:text-white",!N&&"invisible"),children:l.jsx(zo,{className:"size-5"})}),x?l.jsx("span",{className:"text-[11px] font-medium uppercase tracking-widest text-white/60",children:x}):l.jsx("span",{"aria-hidden":!0}),l.jsx("button",{onClick:se,"aria-label":J?A.exitFullscreen:A.enterFullscreen,className:"-mr-2 flex size-9 items-center justify-center rounded-full text-white/70 transition-colors hover:bg-white/10 hover:text-white",children:J?l.jsx(jL,{className:"size-4"}):l.jsx(Lp,{className:"size-4"})})]}),l.jsxs("div",{className:W("flex min-h-0 flex-1 items-center gap-[6vw]",B?"justify-start md:pl-[50px]":"justify-center"),children:[l.jsxs("div",{className:W("mx-auto flex w-full max-w-[min(60vw,280px)] flex-col gap-7",B&&"shrink-0 md:mx-0"),children:[l.jsx("div",{className:W("aspect-square w-full overflow-hidden rounded-3xl shadow-2xl ring-1 ring-white/10 transition-transform duration-500 ease-out",t?"scale-100":"scale-95"),children:ie?l.jsx("img",{src:e.cover,alt:"",onError:()=>_(!0),className:"size-full object-cover"}):l.jsx("div",{className:"flex size-full items-center justify-center bg-white/10",children:l.jsx(Js,{className:"size-16 text-white/50"})})}),l.jsxs("div",{className:W("min-w-0",!B&&"text-center"),children:[l.jsx(DA,{className:"text-2xl font-bold leading-tight [text-shadow:0_1px_12px_rgba(0,0,0,0.4)]",children:e.title||A.unknownTrack}),e.artist&&l.jsx(DA,{className:"mt-1 text-base leading-tight text-white/70 [text-shadow:0_1px_10px_rgba(0,0,0,0.5)]",children:e.artist})]}),l.jsxs("div",{className:"flex flex-col gap-1.5",children:[l.jsx(Xy,{value:[Math.min(ee,r)],min:0,max:r||1,step:1,onValueChange:Z=>M(Z[0]),"aria-label":A.progress}),l.jsxs("div",{className:"flex justify-between font-mono text-[11px] tabular-nums text-white/50",children:[l.jsx("span",{children:AA(ee)}),l.jsxs("span",{children:["-",AA(Math.max(0,r-ee))]})]})]}),l.jsxs("div",{className:"flex items-center justify-center gap-8",children:[l.jsx("button",{onClick:b,disabled:!o,"aria-label":A.previous,className:"flex size-12 items-center justify-center rounded-full text-white/80 transition-transform hover:scale-105 hover:text-white disabled:pointer-events-none disabled:opacity-30",children:l.jsx(D1,{className:"size-7 fill-current"})}),l.jsx("button",{onClick:S,"aria-label":t?A.pause:A.play,className:"flex size-16 items-center justify-center rounded-full bg-white text-black shadow-lg transition-transform hover:scale-105",children:t?l.jsx(Fi,{className:"size-7 fill-current"}):l.jsx(Hn,{className:"size-7 translate-x-0.5 fill-current"})}),l.jsx("button",{onClick:j,disabled:!c,"aria-label":A.next,className:"flex size-12 items-center justify-center rounded-full text-white/80 transition-transform hover:scale-105 hover:text-white disabled:pointer-events-none disabled:opacity-30",children:l.jsx(_1,{className:"size-7 fill-current"})})]}),oe&&l.jsxs("div",{className:"flex items-center gap-3 text-white/60",children:[l.jsx(z1,{className:"size-4 shrink-0"}),l.jsx(Xy,{value:[Math.round((a??0)*100)],min:0,max:100,onValueChange:Z=>k==null?void 0:k(Z[0]/100),"aria-label":A.volume,className:"flex-1"})]})]}),B&&l.jsx("div",{ref:K,onWheel:Y,onTouchStart:Y,onTouchMove:Y,className:"relative hidden min-h-0 flex-1 self-stretch overflow-y-auto py-[38vh] [scrollbar-width:none] md:block [&::-webkit-scrollbar]:hidden",children:V.map((Z,ve)=>l.jsx("p",{ref:Te=>{ne.current[ve]=Te},onClick:()=>M(Z.time),className:W("max-w-2xl cursor-pointer px-2 py-2.5 text-2xl font-semibold leading-snug transition-colors duration-300 lg:text-3xl",ve!==U&&"text-white/30 hover:text-white/55"),children:Z.text},ve))})]})]})]})}const LX={previous:"上一首",play:"播放",pause:"暂停",next:"下一首",volume:"音量",nowPlaying:"播放中",openNowPlaying:"打开播放中:{title}"},IX={collapse:"收起",enterFullscreen:"全屏",exitFullscreen:"退出全屏",previous:"上一首",play:"播放",pause:"暂停",next:"下一首",progress:"进度",volume:"音量",unknownTrack:"未知曲目"},$X="flex size-9 shrink-0 items-center justify-center rounded-full text-foreground/70 transition-colors hover:bg-[var(--acr-hover)] hover:text-foreground",_A={music:"音乐",podcast:"播客"};function BX(){const e=Oy(),[t,n]=p.useState(e.activeKind),r=e.queues[t];return l.jsxs(cy,{children:[l.jsx(rG,{asChild:!0,children:l.jsx("button",{"aria-label":"播放队列",className:$X,title:"播放队列",children:l.jsx(Js,{className:"size-4"})})}),l.jsxs(uy,{className:"gap-0 p-0 text-foreground",children:[l.jsxs("div",{className:"flex items-baseline gap-1.5 px-4 pt-3 pb-2 pr-10",children:[l.jsx("h2",{className:"text-lg font-bold tracking-tight",children:"播放列表"}),l.jsx("span",{className:"text-xs text-muted-foreground",children:r.length})]}),l.jsx("div",{className:"mb-2 flex justify-center px-4",children:l.jsx(aN,{variant:"segmented",size:"large",value:t,onValueChange:a=>n(a),"aria-label":"播放列表类型",children:["music","podcast"].map(a=>l.jsxs(iN,{value:a,className:"gap-1 px-4",children:[_A[a],l.jsx("span",{className:"text-[11px] opacity-60",children:e.queues[a].length})]},a))})}),l.jsx("div",{className:"scrollbar-mac min-h-0 flex-1 overflow-y-auto px-2 pb-3",children:r.length===0?l.jsxs("div",{className:"flex h-32 items-center justify-center text-sm text-muted-foreground",children:[_A[t],"队列为空"]}):r.map((a,o)=>{var d;const c=((d=e.current)==null?void 0:d.id)===a.id&&e.activeKind===t;return l.jsxs("button",{onClick:()=>e.playQueue(r,o,t),className:"group flex w-full items-center gap-3 rounded-xl px-2 py-2 text-left transition-colors hover:bg-[var(--acr-hover)]",children:[l.jsxs("div",{className:"relative size-11 shrink-0 overflow-hidden rounded-lg",children:[a.poster?l.jsx("img",{src:a.poster,alt:"",className:"size-full object-cover"}):l.jsx("span",{className:"flex size-full items-center justify-center bg-[var(--acr-chip)] text-muted-foreground",children:l.jsx(A1,{className:"size-4"})}),l.jsx("div",{className:W("absolute inset-0 flex items-center justify-center bg-black/35 transition-opacity",c?"opacity-100":"opacity-0 group-hover:opacity-100"),children:l.jsx(Hn,{className:"size-4 translate-x-px fill-white text-white"})})]}),l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsx("div",{className:W("truncate text-sm font-medium",c&&"text-primary"),children:a.title||"未命名"}),a.author&&l.jsx("div",{className:"truncate text-xs text-muted-foreground",children:a.author})]}),a.durationS?l.jsx("span",{className:"shrink-0 text-xs tabular-nums text-muted-foreground",children:_h(a.durationS)}):null]},a.id)})})]})]})}const OA=/\[(\d{1,2}):(\d{1,2})(?:[.:](\d{1,3}))?\]/g;function UX(e){const t=[];for(const n of e.split(/\r?\n/)){const r=[...n.matchAll(OA)];if(!r.length)continue;const a=n.replace(OA,"").trim();if(a)for(const o of r){const c=Number(o[1]),d=Number(o[2]),h=o[3]?Number(o[3].padEnd(3,"0"))/1e3:0;t.push({time:c*60+d+h,text:a})}}return t.sort((n,r)=>n.time-r.time)}const VX="flex size-9 shrink-0 items-center justify-center rounded-full text-foreground/70 transition-colors hover:bg-[var(--acr-hover)] hover:text-foreground disabled:pointer-events-none disabled:opacity-30";function FX(e){if(e.platform==="netease"&&e.trackId)return`netease:${e.trackId}`;if(e.title&&e.author)return`${e.title}::${e.author}`}function HX(e,t){const[n,r]=p.useState(void 0);return p.useEffect(()=>{r(void 0);const a=t?FX(t):void 0;if(!a)return;let o=!1;return be.lyrics(e,a).then(c=>{var h;if(o)return;const d=(h=c.result)==null?void 0:h.items[0];if(d!=null&&d.matched&&d.lrc){const m=UX(d.lrc);m.length&&r(m)}}).catch(()=>{}),()=>{o=!0}},[e,t==null?void 0:t.id]),n}function zA(e,t){return{title:e.title||"播放中",artist:e.author,cover:e.poster,...t!=null&&t.length?{lyrics:t}:{}}}function qX({conn:e}){const t=Oy(),n=bX(),{current:r,queue:a}=t,o=r?a.findIndex(j=>j.id===r.id):-1,c=o>0,d=o>=0&&o<a.length-1,[h,m]=p.useState(()=>t.getVolume()),[x,g]=p.useState(!1),v=HX(e,r),S=p.useMemo(()=>r?zA(r):null,[r]),b=p.useMemo(()=>r?zA(r,v):null,[r,v]);return l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"pointer-events-none absolute inset-x-0 bottom-0 z-20 flex justify-center px-4 pb-4",children:l.jsx(kX,{className:"pointer-events-auto",labels:LX,track:S,playing:t.playing,currentTime:n,duration:t.duration,volume:h,hasPrev:c,hasNext:d,onPrev:()=>c&&t.playQueue(a,o-1,t.activeKind),onNext:()=>d&&t.playQueue(a,o+1,t.activeKind),onToggle:t.toggle,onSeek:t.seek,onVolumeChange:j=>{m(j),t.setVolume(j)},actions:l.jsxs(l.Fragment,{children:[l.jsx(BX,{}),l.jsx("button",{onClick:()=>g(!0),disabled:!r,"aria-label":"Now Playing",title:"Now Playing",className:VX,children:l.jsx(Lp,{className:"size-4"})})]})})}),x&&r&&b&&l.jsx(PX,{labels:IX,track:b,playing:t.playing,currentTime:n,duration:t.duration,volume:h,hasPrev:c,hasNext:d,onToggle:t.toggle,onPrev:()=>c&&t.playQueue(a,o-1,t.activeKind),onNext:()=>d&&t.playQueue(a,o+1,t.activeKind),onSeek:t.seek,onVolumeChange:j=>{m(j),t.setVolume(j)},onClose:()=>g(!1)})]})}function KX(e,t,n=!0){const r=p.useRef(t);r.current=t;const a=p.useRef(null),o=p.useRef([]);return p.useEffect(()=>{if(!n)return;const c=Uk();let d=null,h=!1,m=1e3,x;const g=()=>{d=c.openSocket(e,{onOpen:()=>{m=1e3,a.current=d;for(const v of o.current.splice(0))d==null||d.send(v)},onMessage:v=>{try{r.current(JSON.parse(v))}catch{}},onClose:()=>{a.current===d&&(a.current=null),h||(x=setTimeout(g,m),m=Math.min(m*2,15e3))}})};return g(),()=>{h=!0,x&&clearTimeout(x),d==null||d.close(),a.current=null,o.current=[]}},[e,n]),c=>{const d=JSON.stringify(c),h=a.current;h?h.send(d):o.current.push(d)}}const GX=Vr("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-shadow duration-[400ms] hover:shadow-lg hover:shadow-black/30 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:bg-zinc-800 disabled:text-zinc-500 disabled:border-zinc-700 disabled:shadow-none disabled:hover:shadow-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-primary text-primary-foreground shadow",destructive:"bg-destructive text-destructive-foreground shadow-sm",outline:"border border-zinc-700 bg-zinc-900 text-zinc-100 shadow-sm",secondary:"bg-zinc-800 text-zinc-100 shadow-sm",ghost:"text-zinc-200 hover:shadow-none hover:ring-1 hover:ring-white/10",link:"text-primary underline-offset-4 hover:underline hover:shadow-none"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),PA=p.forwardRef(({className:e,variant:t,size:n,asChild:r=!1,...a},o)=>{const c=r?qi:"button";return l.jsx(c,{className:W(GX({variant:t,size:n,className:e})),ref:o,...a})});PA.displayName="Button";function LA({...e}){return l.jsx(Rc,{"data-slot":"dialog",...e})}function YX({...e}){return l.jsx(Ac,{"data-slot":"dialog-portal",...e})}function IA({...e}){return l.jsx(Ki,{"data-slot":"dialog-close",...e})}function WX({className:e,...t}){return l.jsx(Wo,{"data-slot":"dialog-overlay",className:W("fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0",e),...t})}function $A({className:e,children:t,showCloseButton:n=!0,...r}){return l.jsxs(YX,{"data-slot":"dialog-portal",children:[l.jsx(WX,{}),l.jsxs(Xo,{"data-slot":"dialog-content",className:W("fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg",e),...r,children:[t,n&&l.jsxs(Ki,{"data-slot":"dialog-close",className:"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",children:[l.jsx(Hi,{}),l.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}function BA({className:e,...t}){return l.jsx("div",{"data-slot":"dialog-header",className:W("flex flex-col gap-2 text-center sm:text-left",e),...t})}function UA({className:e,showCloseButton:t=!1,children:n,...r}){return l.jsxs("div",{"data-slot":"dialog-footer",className:W("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",e),...r,children:[n,t&&l.jsx(Ki,{asChild:!0,children:l.jsx(PA,{variant:"outline",children:"Close"})})]})}function VA({className:e,...t}){return l.jsx(Dc,{"data-slot":"dialog-title",className:W("text-lg leading-none font-semibold",e),...t})}function FA({className:e,...t}){return l.jsx(_c,{"data-slot":"dialog-description",className:W("text-sm text-muted-foreground",e),...t})}function XX(e){const{renaming:t,deleting:n,renameLabel:r,onRenameLabelChange:a,onCloseRename:o,onCloseDelete:c,onConfirmRename:d,onConfirmDelete:h,renameSaving:m,deleteSaving:x,renameTitle:g,renameDesc:v,nameLabel:S,deleteTitle:b,deleteBody:j}=e;return l.jsxs(l.Fragment,{children:[l.jsx(LA,{open:t!==null,onOpenChange:C=>{C||o()},children:l.jsx($A,{children:l.jsxs("form",{className:"flex flex-col gap-4",onSubmit:C=>{C.preventDefault(),d()},children:[l.jsxs(BA,{children:[l.jsx(VA,{children:g}),l.jsx(FA,{children:v})]}),l.jsx("div",{className:"px-4 py-2",children:l.jsx(Jt,{"aria-label":S,size:"xl",value:r,onChange:C=>a(C.target.value),autoFocus:!0})}),l.jsxs(UA,{children:[l.jsx(IA,{asChild:!0,children:l.jsx(Ne,{type:"button",variant:"neutral",size:"large",disabled:m,children:"取消"})}),l.jsx(Ne,{type:"submit",size:"large",disabled:m||!r.trim(),children:m?"保存中…":"保存"})]})]})})}),l.jsx(LA,{open:n!==null,onOpenChange:C=>{C||c()},children:l.jsxs($A,{children:[l.jsxs(BA,{children:[l.jsx(VA,{children:b}),l.jsx(FA,{children:j((n==null?void 0:n.label)??"")})]}),l.jsxs(UA,{children:[l.jsx(IA,{asChild:!0,children:l.jsx(Ne,{type:"button",variant:"neutral",size:"large",disabled:x,children:"取消"})}),l.jsx(Ne,{type:"button",variant:"destructive",size:"large",disabled:x,onClick:h,children:x?"删除中…":"删除"})]})]})})]})}function QX(e){var n;const t=((n=e.content)==null?void 0:n.media)??[];return!t.some(r=>r.kind==="audio")&&t.some(r=>r.kind==="link"&&!!r.track_id)}function ZX(e){var t;for(const n of((t=e.content)==null?void 0:t.media)??[]){if(n.kind==="audio"&&n.poster)return n.poster;if(n.kind==="link"&&n.image)return n.image;if(n.kind==="image"&&n.url)return n.url}}function JX(e){const t=(e.sources??[]).map(n=>{var r,a;return((r=n.source)==null?void 0:r.id)||((a=n.source)==null?void 0:a.pluginId)||""}).join(" ").toLowerCase();return t.includes("163")||t.includes("netease")?"网易云":t.includes("qqmusic")||t.includes("/qq/")?"QQ音乐":t.includes("spotify")?"Spotify":t.includes("youtube")||t.includes("ytmusic")?"YouTube":""}const Du="__liked_songs__",eQ=4,HA="grid grid-cols-[repeat(auto-fill,minmax(max(140px,calc((100%-60px)/6)),1fr))] gap-3";function qA(e){const[,t,n,...r]=e.split("/");return t!=="music"?{kind:"home"}:n==="liked"?{kind:"liked"}:n==="playlist"&&r[0]?{kind:"playlist",id:decodeURIComponent(r[0])}:n==="collection"&&r[0]?{kind:"collection",id:decodeURIComponent(r.join("/"))}:n==="search"&&r[0]?{kind:"search",q:decodeURIComponent(r.join("/"))}:{kind:"home"}}function tQ(e){return e.kind==="liked"?"/music/liked":e.kind==="playlist"?"/music/playlist/"+encodeURIComponent(e.id):e.kind==="collection"?"/music/collection/"+encodeURIComponent(e.id):e.kind==="search"?"/music/search/"+encodeURIComponent(e.q):"/music"}function nQ(e){return e.isCollection||e.sel&&(e.selStream||e.isLikedPlaylist)?"track-list":!e.channelsLoaded&&!e.isLikedPlaylist?"loading":"grid"}function Zy(e,t){Ke.error(e,{description:t,action:{label:"复制错误",onClick:()=>{var n;return void((n=navigator.clipboard)==null?void 0:n.writeText(t))}}})}const va="group-data-[state=selected]/table-row:text-primary-foreground",Rl="group-data-[state=selected]/table-row:text-primary-foreground/80";function KA({origin:e}){const t=e.kind==="netdisk"?"bg-sky-500/15 text-sky-500":"bg-amber-500/15 text-amber-500",n=e.kind==="netdisk"?"来自挂载的网盘目录,文件在盘里直接播":"源站标记为付费集(与能不能播无关——网盘补上音频后依然是付费集)";return l.jsx("span",{title:n,className:W("shrink-0 rounded px-1 py-px text-[9px] font-medium",t,"group-data-[state=selected]/table-row:bg-white/20",va),children:e.label})}function rQ(){return l.jsxs("span",{className:"eq","aria-hidden":!0,children:[l.jsx("i",{}),l.jsx("i",{}),l.jsx("i",{})]})}function _u(e){if(!e)return null;const t=e.indexOf(":");return t<=0?null:{platform:e.slice(0,t),trackId:e.slice(t+1)}}function $h(e){return!!(e.sourceItem||e.likeRef||_u(e.trackKey))}function GA(e,t){if(!e||e.id!==void 0&&t.id!==void 0&&e.id!==t.id)return t;const n=e.downloadedBytes,r=t.downloadedBytes,a=n!==void 0&&r!==void 0?Math.max(n,r):r??n,o=e.totalBytes,c=t.totalBytes,d=o!==void 0&&c!==void 0?Math.max(o,c):c??o;return{...t,downloadedBytes:a,totalBytes:d,failedAt:t.state==="failed"?e.failedAt??t.failedAt:t.failedAt}}function sQ({job:e}){const t=e.downloadedBytes??0,n=e.totalBytes??0,r=t>0,a=n>0?Math.max(0,Math.min(1,t/n)):r?.64:0,o=6,c=2*Math.PI*o,d=r?"下载中":"探测下载源";return r?l.jsxs("svg",{className:"size-4 shrink-0 -rotate-90 text-primary",viewBox:"0 0 16 16",fill:"none","aria-hidden":"true",children:[l.jsx("title",{children:d}),l.jsx("circle",{cx:"8",cy:"8",r:o,className:"stroke-muted-foreground/25",strokeWidth:"2"}),l.jsx("circle",{cx:"8",cy:"8",r:o,stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeDasharray:c,strokeDashoffset:c*(1-a)})]}):l.jsx("span",{className:W("inline-flex size-4 shrink-0 items-center justify-center text-muted-foreground/75",Rl),title:d,children:l.jsx(wr,{className:"size-4 animate-spin",strokeWidth:2})})}function YA({row:e,canDownload:t,active:n,onDownload:r}){const a=!t||n;return{disabled:a,onSelect:o=>{o.stopPropagation(),a||r==null||r(e)}}}function WA({conn:e,collectKey:t,meta:n,anchorStreamId:r,MenuItem:a,onChanged:o}){const[c,d]=p.useState([]),[h,m]=p.useState(new Set),[x,g]=p.useState("");p.useEffect(()=>{let b=!0;return Promise.all([be.collections(e,"audio"),be.whereCollected(e,t)]).then(([j,C])=>{b&&(d([...j.filter(k=>!k.system)].sort((k,N)=>+(N.anchorStreamId===r)-+(k.anchorStreamId===r))),m(new Set(C.collectionIds)))}).catch(()=>{}),()=>{b=!1}},[]);const v=(b,j)=>{m(C=>{const k=new Set(C);return j?k.delete(b):k.add(b),k}),(j?be.removeFromCollection(e,b,t):be.addToCollection(e,b,t,n)).then(()=>o==null?void 0:o()).catch(()=>m(C=>{const k=new Set(C);return j?k.add(b):k.delete(b),k}))},S=async()=>{const b=x.trim();if(!b)return;const j=await be.createCollection(e,"audio",b,r??void 0);g(""),d(C=>[j,...C]),v(j.id,!1),o==null||o()};return l.jsxs(l.Fragment,{children:[c.map(b=>{const j=h.has(b.id);return l.jsxs(a,{onSelect:C=>{C.preventDefault(),v(b.id,j)},children:[l.jsx(Rs,{className:W("size-4",j?"opacity-100":"opacity-0")}),l.jsx("span",{className:"truncate",children:b.label})]},b.id)}),l.jsx("div",{className:"border-t border-[var(--acr-border-soft)] px-1.5 py-1",children:l.jsx(Jt,{placeholder:"新建播单…",value:x,onChange:b=>g(b.target.value),onKeyDown:b=>{b.stopPropagation(),b.key==="Enter"&&S()},onClick:b=>b.stopPropagation()})})]})}function aQ({row:e,canDownload:t,job:n,isArchived:r,onDownload:a,collect:o}){const c=(n==null?void 0:n.state)==="queued"||(n==null?void 0:n.state)==="running",d=r?"重新下载":c?"下载中":"下载到本地",h=YA({row:e,canDownload:t,active:c,onDownload:a});return l.jsxs(Tx,{children:[l.jsx(Rx,{asChild:!0,children:l.jsx("button",{type:"button",onClick:m=>m.stopPropagation(),className:"mx-auto inline-flex size-6 items-center justify-center rounded-full text-muted-foreground/70 opacity-0 transition-all hover:text-foreground group-hover/item:opacity-100 focus-visible:opacity-100 data-[state=open]:opacity-100","aria-label":"歌曲操作",title:"歌曲操作",children:l.jsx(_p,{className:"size-4"})})}),l.jsxs(qf,{align:"end",size:"sm",className:"w-36",children:[l.jsxs(xs,{...h,children:[l.jsx(wc,{}),l.jsx("span",{children:d})]}),o&&ku(e,o.streamId)&&l.jsxs(Yk,{children:[l.jsxs(Ax,{children:[l.jsx(Pp,{}),l.jsx("span",{children:"加入播单"})]}),l.jsx(Mx,{className:"w-48",children:l.jsx(WA,{conn:o.conn,collectKey:ku(e,o.streamId),meta:{title:e.title,poster:e.poster,artist:e.author,album:e.album,durationS:e.durationS,sourceUrl:e.sourceUrl},anchorStreamId:o.streamId,MenuItem:xs,onChanged:o.onChanged})})]})]})]})}function XA({row:e,canDownload:t,job:n,isArchived:r,onDownload:a,collect:o,children:c}){const d=(n==null?void 0:n.state)==="queued"||(n==null?void 0:n.state)==="running",h=r?"重新下载":d?"下载中":"下载到本地",m=YA({row:e,canDownload:t,active:d,onDownload:a});return l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:c}),l.jsxs(Tl,{size:"sm",className:"w-36",children:[l.jsxs(Rr,{onSelect:()=>void I1({id:e.id,title:e.title,...e.author!==void 0?{author:e.author}:{}}),children:[l.jsx(Dp,{}),l.jsx("span",{children:"在对话中引用"})]}),l.jsxs(Rr,{...m,children:[l.jsx(wc,{}),l.jsx("span",{children:h})]}),o&&ku(e,o.streamId)&&l.jsxs(hX,{children:[l.jsxs(CA,{children:[l.jsx(Pp,{}),l.jsx("span",{children:"加入播单"})]}),l.jsx(kA,{className:"w-48",children:l.jsx(WA,{conn:o.conn,collectKey:ku(e,o.streamId),meta:{title:e.title,poster:e.poster,artist:e.author,album:e.album,durationS:e.durationS,sourceUrl:e.sourceUrl},anchorStreamId:o.streamId,MenuItem:Rr,onChanged:o.onChanged})})]})]})]})}function iQ({row:e,baseUrl:t}){const n=Py(e),r=YR(e);return l.jsxs("div",{className:"flex flex-col gap-2.5",children:[l.jsxs("div",{className:"flex items-start gap-2.5",children:[e.poster&&l.jsx("img",{src:os(t,e.poster),alt:"",loading:"lazy",decoding:"async",className:"size-11 shrink-0 rounded-md object-cover ring-1 ring-[var(--acr-border-soft)]"}),l.jsx("div",{className:"min-w-0 break-words text-[13px] font-medium leading-snug",children:e.title})]}),n.length>0&&l.jsx("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-[11px]",children:n.map(a=>l.jsxs(p.Fragment,{children:[l.jsx("dt",{className:"text-muted-foreground",children:a.label}),l.jsx("dd",{className:"min-w-0 break-words text-foreground/90",children:a.value})]},a.label))}),r&&l.jsx("p",{className:"line-clamp-6 whitespace-pre-line text-[11px] leading-relaxed text-muted-foreground",children:r}),e.sourceUrl&&l.jsx("a",{href:e.sourceUrl,target:"_blank",rel:"noreferrer",onClick:a=>a.stopPropagation(),className:"truncate text-[11px] text-primary hover:underline",children:e.sourceUrl})]})}function oQ({row:e,baseUrl:t}){return l.jsxs(Bx,{openDelay:200,closeDelay:120,children:[l.jsx(Ux,{asChild:!0,children:l.jsx("button",{type:"button","aria-label":"节目信息",onClick:n=>n.stopPropagation(),onKeyDown:n=>n.stopPropagation(),className:W("inline-flex size-4 shrink-0 items-center justify-center rounded-full text-muted-foreground/70 opacity-0 transition-opacity","group-hover/item:opacity-100 focus-visible:opacity-100 focus-visible:outline-none hover:text-foreground",Rl),children:l.jsx(zp,{className:"size-3.5"})})}),l.jsx(Vx,{align:"start",side:"bottom",className:"w-80",children:l.jsx(iQ,{row:e,baseUrl:t})})]})}const lQ=53,cQ=200,uQ=p.memo(function({row:t,index:n,baseUrl:r,isCurrent:a,isPlaying:o,isLiked:c,job:d,isArchived:h,canDownload:m,selectMode:x,selected:g,onToggleLike:v,onToggleSelect:S,onDownload:b,onPlay:j,collect:C,rowRef:k,drag:N}){const T=N?{draggable:!0,onDragStart:M=>{M.dataTransfer.effectAllowed="move",N.onDragStart(n)},onDragEnter:()=>N.onDragEnter(n),onDragOver:M=>{M.preventDefault(),M.dataTransfer.dropEffect="move"},onDrop:M=>{M.preventDefault(),N.onDragEnd()},onDragEnd:()=>N.onDragEnd()}:{},R=N!=null&&N.isDropTarget?"[&>td]:border-t-2 [&>td]:border-t-primary":"",A=t.poster?l.jsx("img",{src:os(r,t.poster),alt:"",loading:"lazy",decoding:"async",className:"size-9 shrink-0 rounded-md object-cover shadow-sm ring-1 ring-[var(--acr-border-soft)]"}):l.jsx("span",{className:W("flex size-9 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground shadow-sm ring-1 ring-[var(--acr-border-soft)]","group-data-[state=selected]/table-row:bg-white/15",va),children:l.jsx(A1,{className:"size-4"})}),O=(d==null?void 0:d.state)==="queued"||(d==null?void 0:d.state)==="running",z=!!(d!=null&&d.failedAt)&&Date.now()-d.failedAt<5e3,_=O&&d?l.jsx(sQ,{job:d}):t.trackKey&&h?l.jsx("span",{className:W("inline-flex size-4 shrink-0 items-center justify-center text-emerald-500/90",va),title:"已下载",children:l.jsx(mL,{className:"size-4",strokeWidth:2})}):z?l.jsx("span",{className:W("inline-flex size-4 shrink-0 items-center justify-center text-destructive/90",va),title:d!=null&&d.lastError?`下载失败:${d.lastError}`:"下载失败",children:l.jsx(hL,{className:"size-4",strokeWidth:2})}):null,V=l.jsx(aQ,{row:t,canDownload:m,job:d,isArchived:h,onDownload:b,collect:C}),B=t.author?l.jsxs("div",{className:W("flex min-w-0 items-center gap-1.5 text-[11px] text-muted-foreground",Rl),children:[_,l.jsx("span",{className:"truncate",children:t.author})]}):_?l.jsx("div",{className:W("flex min-w-0 items-center gap-1.5 text-[11px] text-muted-foreground",Rl),children:_}):null,G=KY(t)?l.jsx(oQ,{row:t,baseUrl:r}):null,I=t.likeRef?`${t.likeRef.platform}:${t.likeRef.trackId}`:t.trackKey,H=l.jsx("button",{onClick:M=>{M.stopPropagation(),v(t)},disabled:!I,className:W("mx-auto inline-flex size-6 items-center justify-center rounded-full text-muted-foreground/70 transition-colors hover:text-foreground",Rl,"group-data-[state=selected]/table-row:hover:text-primary-foreground"),title:c?"取消喜欢":"喜欢",children:l.jsx(Fd,{className:W("size-4",c&&"fill-primary text-primary",c&&"group-data-[state=selected]/table-row:fill-current",c&&va)})}),ee=l.jsx("span",{className:W("text-right text-[12px] tabular-nums text-muted-foreground",Rl),children:t.durationS?_h(t.durationS):"--:--"}),X=l.jsx("button",{onClick:M=>{M.stopPropagation(),S==null||S(t)},"aria-label":g?"取消选择":"选择",className:W("mx-auto inline-flex size-4.5 items-center justify-center rounded-full border transition-colors",g?"border-primary bg-primary text-primary-foreground group-data-[state=selected]/table-row:border-primary-foreground group-data-[state=selected]/table-row:bg-primary-foreground group-data-[state=selected]/table-row:text-primary":"border-[var(--acr-border)] text-transparent hover:border-foreground/50 group-data-[state=selected]/table-row:border-primary-foreground/50"),children:l.jsx(Rs,{className:"size-3",strokeWidth:3})});if(t.track&&!t.muted){const M=()=>{x?S==null||S(t):j(t)};return l.jsx(XA,{row:t,canDownload:m,job:d,isArchived:h,onDownload:b,collect:C,children:l.jsxs(Eu,{ref:k,role:"button",tabIndex:0,...T,onClick:M,onKeyDown:U=>{(U.key==="Enter"||U.key===" ")&&(U.preventDefault(),M())},"data-state":a?"selected":void 0,className:W("group group/item cursor-pointer outline-none","focus-visible:[&>td]:bg-[var(--acr-hover)] focus-visible:[&>td]:border-b-transparent","focus-visible:[&>td:first-child]:rounded-l-[7px] focus-visible:[&>td:last-child]:rounded-r-[7px]",R),children:[l.jsx(Wr,{className:"text-center",children:l.jsx("span",{className:"relative flex h-5 items-center justify-center text-xs",children:x?X:o?l.jsx("span",{className:W("text-primary",va),children:l.jsx(rQ,{})}):a?l.jsx(Hn,{className:W("size-3.5 fill-current text-primary",va)}):l.jsxs(l.Fragment,{children:[l.jsx("span",{className:"tabular-nums text-muted-foreground group-hover:opacity-0",children:n+1}),l.jsx(Hn,{className:"absolute size-3.5 fill-current text-foreground opacity-0 group-hover:opacity-100"})]})})}),l.jsx(Wr,{children:l.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[A,l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:W("flex items-center gap-1.5 text-[13px]",a?"font-medium text-primary":"text-foreground",va),children:[l.jsx("span",{className:"truncate",children:t.title}),t.vip&&l.jsx("span",{className:W("shrink-0 rounded bg-amber-500/15 px-1 py-px text-[9px] font-medium text-amber-500","group-data-[state=selected]/table-row:bg-white/20",va),children:"VIP"}),t.origin&&l.jsx(KA,{origin:t.origin}),G]}),B]})]})}),l.jsx(Wr,{className:"truncate text-[12px] text-muted-foreground",children:t.album}),l.jsx(Wr,{className:"text-center",children:H}),l.jsx(Wr,{className:"text-right",children:l.jsxs("div",{className:"flex items-center justify-end gap-1",children:[ee,V]})})]})})}return l.jsx(XA,{row:t,canDownload:m,job:d,isArchived:h,onDownload:b,collect:C,children:l.jsxs(Eu,{...T,className:W("group/item opacity-50",R),children:[l.jsx(Wr,{className:"text-center text-xs text-muted-foreground/60",children:x?X:n+1}),l.jsx(Wr,{children:l.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[A,l.jsxs("div",{className:"min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-1.5 text-[13px] text-foreground/70",children:[l.jsx("span",{className:"truncate",children:t.title}),t.origin&&l.jsx(KA,{origin:t.origin}),G]}),B]})]})}),l.jsx(Wr,{className:"truncate text-[12px] text-muted-foreground",children:t.album}),l.jsx(Wr,{}),l.jsx(Wr,{className:"text-right",children:l.jsxs("div",{className:"flex items-center justify-end gap-1",children:[l.jsx("span",{className:"text-right text-[12px] tabular-nums text-muted-foreground",children:t.durationS?_h(t.durationS):"--:--"}),V]})})]})})});function QA({height:e,side:t}){return l.jsx("tr",{"aria-hidden":!0,"data-testid":`track-vpad-${t}`,style:{height:e,pointerEvents:"none"},children:l.jsx("td",{colSpan:5,style:{height:e,padding:0,borderBottomWidth:0}})})}function ZA({rows:e,queue:t,stage:n,baseUrl:r,liked:a,toggleLike:o,jobs:c={},archived:d={},onDownload:h,busy:m,busyText:x="加载中…",emptyText:g,selectMode:v,selectedIds:S,onToggleSelect:b,collect:j,jumpKey:C,onReorder:k}){var Fe;const N=p.useRef({toggleLike:o,onToggleSelect:b,onDownload:h,collect:j,stage:n,queue:t});N.current={toggleLike:o,onToggleSelect:b,onDownload:h,collect:j,stage:n,queue:t};const T=p.useCallback(fe=>N.current.toggleLike(fe),[]),R=p.useCallback(fe=>{var Se,ye;return(ye=(Se=N.current).onToggleSelect)==null?void 0:ye.call(Se,fe)},[]),A=p.useCallback(fe=>{var Se,ye;return(ye=(Se=N.current).onDownload)==null?void 0:ye.call(Se,fe)},[]),O=p.useCallback(()=>{var fe,Se;return(Se=(fe=N.current.collect)==null?void 0:fe.onChanged)==null?void 0:Se.call(fe)},[]),z=p.useCallback(fe=>{var Xe;const{stage:Se,queue:ye}=N.current;fe.track&&((Xe=Se.current)==null?void 0:Xe.id)===fe.track.id?Se.toggle():Se.playQueue(ye,fe.playIndex,"music")},[]),_=b?R:void 0,V=h?A:void 0,B=j==null?void 0:j.conn,G=(j==null?void 0:j.streamId)??null,I=p.useMemo(()=>B?{conn:B,streamId:G,onChanged:O}:void 0,[B,G,O]),[H,ee]=p.useState(null),X=p.useCallback(fe=>{ee(fe?bA(fe):null)},[]),[M,U]=p.useState(null),[K,ne]=p.useState(null),q=p.useCallback(fe=>{U(fe),ne(fe)},[]),P=p.useCallback(fe=>ne(fe),[]),L=p.useRef({onReorder:k,dragFrom:M,dragOver:K});L.current={onReorder:k,dragFrom:M,dragOver:K};const Y=p.useCallback(()=>{const{onReorder:fe,dragFrom:Se,dragOver:ye}=L.current;fe&&Se!==null&&ye!==null&&Se!==ye&&fe(Se,ye),U(null),ne(null)},[]),J=!m&&e.length>cQ,$=CY({count:J?e.length:0,getScrollElement:()=>H,estimateSize:()=>lQ,overscan:10}),se=J?$.getVirtualItems():[],oe=se.length?se[0].start:0,ie=se.length?$.getTotalSize()-se[se.length-1].end:0,Z=J?se.map(fe=>({row:e[fe.index],index:fe.index})):e.map((fe,Se)=>({row:fe,index:Se})),ve=p.useRef(null),Te=p.useRef(null),Ee=(Fe=n.current)==null?void 0:Fe.id,Ie=p.useMemo(()=>Ee?e.findIndex(fe=>{var Se;return!fe.muted&&((Se=fe.track)==null?void 0:Se.id)===Ee}):-1,[e,Ee]);return p.useEffect(()=>{if(Te.current===C||m||!Ee)return;if(J){if(Ie<0||!H)return;Te.current=C??null,$.scrollToIndex(Ie,{align:"center"});return}const fe=ve.current;fe&&(Te.current=C??null,fe.scrollIntoView({block:"center"}))},[C,m,Ee,e,J,Ie,H,$]),p.useEffect(()=>{Te.current!==C&&(Te.current=null)},[C]),l.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:l.jsx(Gy,{ref:X,className:"min-h-0 flex-1 px-2 py-1.5 pb-24 scrollbar-mac",children:l.jsxs(uX,{scrollable:!1,className:"table-fixed",children:[l.jsx(dX,{sticky:!0,children:l.jsxs(Eu,{children:[l.jsx(Tu,{className:"w-8 text-center",children:"#"}),l.jsx(Tu,{children:"标题"}),l.jsx(Tu,{className:"w-[28%]",children:"专辑"}),l.jsx(Tu,{className:"w-10 text-center",children:"喜欢"}),l.jsx(Tu,{className:"w-[84px] text-right",children:"时长"})]})}),l.jsxs(fX,{children:[m&&l.jsx(Eu,{children:l.jsx(Wr,{colSpan:5,className:"whitespace-normal py-16 text-center text-sm text-muted-foreground",children:l.jsxs("span",{className:"inline-flex items-center gap-2",children:[l.jsx(wr,{className:"size-5 animate-spin"}),x]})})}),oe>0&&l.jsx(QA,{height:oe,side:"top"}),!m&&Z.map(({row:fe,index:Se})=>{var re;const ye=fe.trackKey?c[fe.trackKey]:void 0,Xe=fe.likeRef?`${fe.likeRef.platform}:${fe.likeRef.trackId}`:fe.trackKey,nt=!!fe.track&&!fe.muted&&((re=n.current)==null?void 0:re.id)===fe.track.id;return l.jsx(uQ,{row:fe,index:Se,baseUrl:r,isCurrent:nt,isPlaying:nt&&n.playing,isLiked:Xe?a.has(Xe):!1,job:ye,isArchived:fe.trackKey?d[fe.trackKey]||!!(ye!=null&&ye.archived):!1,canDownload:!!h&&$h(fe),selectMode:!!v,selected:!!(S!=null&&S.has(fe.id)),onToggleLike:T,onToggleSelect:_,onDownload:V,onPlay:z,collect:I,rowRef:nt?ve:void 0,drag:k&&!v?{onDragStart:q,onDragEnter:P,onDragEnd:Y,isDropTarget:M!==null&&K===Se&&K!==M}:void 0},fe.id)}),ie>0&&l.jsx(QA,{height:ie,side:"bottom"}),!m&&e.length===0&&l.jsx(Eu,{children:l.jsx(Wr,{colSpan:5,className:"whitespace-normal py-6 text-center text-sm text-muted-foreground",children:g})})]})]})})})}const dQ={downloadAll:l.jsx(wc,{}),sync:l.jsx(Hd,{}),netdisk:l.jsx(bL,{}),exportM3u:l.jsx(Js,{}),rename:l.jsx(Sc,{}),remove:l.jsx(Po,{})};function fQ({playDisabled:e,onPlayAll:t,selectMode:n,onToggleSelectMode:r,onDownloadAll:a,sync:o,onNetdisk:c,onRename:d,onRemove:h,onExportM3u:m}){const x={downloadAll:!!a,sync:o?{on:o.on}:null,netdisk:!!c,rename:!!d,remove:!!h,exportM3u:!!m},g=GY(x),v="[&>span:first-child]:hidden pl-2 pr-2",S={downloadAll:a,sync:o==null?void 0:o.onToggle,netdisk:c,rename:d,remove:h,exportM3u:m};return l.jsxs(l.Fragment,{children:[l.jsxs(Ne,{size:"small",disabled:e,onClick:t,children:[l.jsx(Hn,{className:"size-4"})," 播放全部"]}),l.jsxs(Ne,{size:"small",variant:n?"default":"neutral","aria-pressed":n,onClick:r,children:[l.jsx(SL,{className:"size-4"})," 多选"]}),g.length>0&&l.jsxs(Tx,{children:[l.jsx(Rx,{asChild:!0,children:l.jsx(Ne,{size:"small",variant:"neutral","aria-label":"更多操作",children:l.jsx(_p,{className:"size-4"})})}),l.jsx(qf,{align:"start",size:"sm",className:"w-44",children:g.map(b=>{if(b.kind==="separator")return l.jsx(su,{},b.key);const j=dQ[b.key];return b.kind==="checkbox"?l.jsxs(Qk,{checked:b.checked,className:v,onSelect:C=>{var k;C.preventDefault(),(k=S[b.key])==null||k.call(S)},children:[j,b.label,b.checked&&l.jsx(Rs,{className:"ml-auto size-3.5"})]},b.key):l.jsxs(xs,{variant:b.destructive?"destructive":"default",onSelect:()=>{var C;return(C=S[b.key])==null?void 0:C.call(S)},children:[j,b.label]},b.key)})})]})]})}function hQ({conn:e,count:t,anchorStreamId:n,onPick:r,onDownload:a,onCancel:o}){const[c,d]=p.useState(!1),[h,m]=p.useState([]),[x,g]=p.useState("");p.useEffect(()=>{c&&be.collections(e,"audio").then(S=>{const b=[...S.filter(j=>!j.system)].sort((j,C)=>+(C.anchorStreamId===n)-+(j.anchorStreamId===n));m(b)}).catch(()=>m([]))},[c,e,n]);const v=async()=>{const S=x.trim();if(!S)return;const b=await be.createCollection(e,"audio",S,n??void 0);g(""),d(!1),r(b.id)};return l.jsxs("div",{className:"pointer-events-auto absolute bottom-24 left-1/2 z-30 flex -translate-x-1/2 items-center gap-3 rounded-full bg-[var(--acr-panel)] px-4 py-2 shadow-[0_0_0_1px_rgba(190,190,190,0.16),0_16px_48px_rgba(0,0,0,0.45)] backdrop-blur-xl",children:[l.jsxs("span",{className:"text-[13px] tabular-nums",children:["已选 ",t," 首"]}),l.jsxs(Ne,{size:"small",variant:"neutral",onClick:a,children:[l.jsx(wc,{className:"size-4"})," 下载"]}),l.jsxs(gy,{open:c,onOpenChange:d,children:[l.jsx(xy,{asChild:!0,children:l.jsxs(Ne,{size:"small",children:[l.jsx(Pp,{className:"size-4"})," 加入播单"]})}),l.jsxs(Ch,{align:"center",side:"top",className:"w-56 p-1.5",children:[l.jsxs("div",{className:"flex max-h-64 flex-col gap-0.5 overflow-y-auto scrollbar-mac",children:[h.map(S=>l.jsxs("button",{onClick:()=>{d(!1),r(S.id)},className:"flex items-center gap-2 rounded-md px-2 py-1.5 text-left text-[13px] hover:bg-[var(--acr-hover)]",children:[l.jsx(Js,{className:"size-4 shrink-0 text-muted-foreground"}),l.jsx("span",{className:"min-w-0 flex-1 truncate",children:S.label}),S.anchorStreamId===n&&l.jsx("span",{className:"text-[10px] text-muted-foreground",children:"本节目"})]},S.id)),h.length===0&&l.jsx("div",{className:"px-2 py-2 text-[12px] text-muted-foreground",children:"还没有播单。"})]}),l.jsx("div",{className:"mt-1 border-t border-[var(--acr-border-soft)] pt-1.5",children:l.jsx(Jt,{placeholder:"新建播单…",value:x,onChange:S=>g(S.target.value),onKeyDown:S=>{S.key==="Enter"&&v()}})})]})]}),l.jsx(Ne,{size:"small",variant:"ghost",onClick:o,children:"取消"})]})}function mQ({conn:e,channels:t,onChannelsChanged:n,onReload:r}){var Fu,ka,nm;const a=Oy(),[o,c]=p.useState("content"),d=vA(),h=qA(d.pathname()),m=p.useMemo(()=>{const F=new Set,he=[];for(const Ae of t)for(const Ve of Ae.streams)F.has(Ve.id)||(F.add(Ve.id),he.push(Ve));return he},[t]),x=p.useMemo(()=>OY(m),[m]),g=p.useMemo(()=>new Map(m.map(F=>[F.id,F.description||F.id])),[m]),{selection:v,navigate:S}=lX(qA,tQ),b=v.kind==="playlist"?v.id:v.kind==="liked"?Du:null,j=v.kind==="collection",C=v.kind==="collection"?v.id:null,k=v.kind==="search"?v.q:"",N=cX("music:grid",bA),[T,R]=p.useState(h.kind==="search"?h.q:""),[A,O]=p.useState(""),[z,_]=p.useState(!1),[V,B]=p.useState([]),[G,I]=p.useState(!1),[H,ee]=p.useState([]),[X,M]=p.useState([]),[U,K]=p.useState(!1),[ne,q]=p.useState(null),[P,L]=p.useState({}),[Y,J]=p.useState({}),[$,se]=p.useState(!1),[oe,ie]=p.useState(null),[Z,ve]=p.useState(!1),[Te,Ee]=p.useState(new Set),[Ie,Fe]=p.useState(!1),[fe,Se]=p.useState(new Set),[ye,Xe]=p.useState([]),[nt,re]=p.useState(null),[_e,Pe]=p.useState(null),[We,ge]=p.useState(new Map),[Ge,je]=p.useState(null),[kt,zt]=p.useState(""),[Xn,fn]=p.useState(!1),[Qn,sn]=p.useState(null),[Zn,we]=p.useState(!1),[Oe,lt]=p.useState([]),[an,en]=p.useState(!1),[bt,Ft]=p.useState(""),Sn=p.useRef({}),Me=p.useRef(P);Me.current=P;const Ue=p.useRef(b);Ue.current=b;const ke=()=>{be.collectionItems(e,Th.audioLiked).then(F=>{Ee(new Set(F.map(he=>`${he.platform}:${he.trackId}`))),M(F)}).catch(()=>{})},ft=F=>{const he=F.likeRef??_u(F.trackKey);if(!he)return;const Ae=`${he.platform}:${he.trackId}`,Ve=Te.has(Ae);Ee(at=>{const Rt=new Set(at);return Ve?Rt.delete(Ae):Rt.add(Ae),Rt});const qe={kind:"track",platform:he.platform,trackId:he.trackId};if(Ve){M(at=>at.filter(Rt=>`${Rt.platform}:${Rt.trackId}`!==Ae)),be.removeFromCollection(e,Th.audioLiked,qe).catch(ke);return}const mt={key:`track:${he.platform}:${he.trackId}`,kind:"track",domain:"audio",platform:he.platform,trackId:he.trackId,title:F.title,artist:F.author,album:F.album,poster:F.poster,durationS:F.durationS,sourceUrl:F.sourceUrl,firstCollectedAt:Date.now()};M(at=>[mt,...at.filter(Rt=>`${Rt.platform}:${Rt.trackId}`!==Ae)]),be.addToCollection(e,Th.audioLiked,qe,{title:F.title,artist:F.author,album:F.album,poster:F.poster,durationS:F.durationS,sourceUrl:F.sourceUrl}).then(at=>{M(Rt=>[at,...Rt.filter(ct=>`${ct.platform}:${ct.trackId}`!==Ae)])}).catch(ke)};p.useEffect(()=>{ke()},[e]);const Pt=()=>{be.collections(e,"audio").then(F=>lt(F.filter(he=>!he.system))).catch(()=>lt([]))};p.useEffect(()=>{Pt()},[e]),p.useEffect(()=>{if(Fe(!1),Se(new Set),!b||b===Du){ee([]),q(b),O("");return}let F=!0;return K(!0),se(XR(Ly(t,b))),L({}),J({}),O(""),be.items(e,{stream:b,limit:2e3}).then(he=>F&&ee(he)).catch(()=>F&&ee([])).finally(()=>{F&&(K(!1),q(b))}),()=>{F=!1}},[e,b]);const Qt=XR(Ly(t,b));p.useEffect(()=>{!b||b===Du||se(Qt)},[Qt,b]),p.useEffect(()=>{Ca(),re(null),Pe(null),ge(new Map)},[e,b]),p.useEffect(()=>{if(ge(new Map),Se(new Set),!nt||!b){Pe(null);return}let F=!0;return be.collectionItems(e,nt).then(async he=>{if(!F)return;Pe(he);const Ae=KR(he,b),Ve=new Map;await Promise.all([...Ae.fetchStreams.keys()].map(async qe=>{const mt=await be.items(e,{stream:qe,limit:2e3}).catch(()=>[]);for(const at of mt)Ve.set(at.id,at)})),F&&ge(Ve)}).catch(()=>{F&&(Pe([]),Ke.error("播单成员加载失败"))}),()=>{F=!1}},[e,nt,b]);const[Rn,At]=p.useState(null),[_n,ws]=p.useState(new Map),[Ht,An]=p.useState(null),[ya,Jn]=p.useState(!1);p.useEffect(()=>{if(O(""),!C){At(null),ws(new Map),An(null),Jn(!1);return}let F=!0;return At(null),ws(new Map),Jn(!1),be.collections(e,"audio").then(he=>{F&&(An(he.find(Ae=>Ae.id===C&&!Ae.system)??null),Jn(!0))}).catch(()=>{F&&Ke.error("播单信息加载失败")}),be.collectionItems(e,C).then(async he=>{if(!F)return;At(he);const Ae=KR(he,""),Ve=new Map;await Promise.all([...Ae.fetchStreams.keys()].map(async qe=>{const mt=await be.items(e,{stream:qe,limit:2e3}).catch(()=>[]);for(const at of mt)Ve.set(at.id,at)})),F&&ws(Ve)}).catch(()=>{F&&(At([]),Ke.error("播单加载失败"))}),()=>{F=!1}},[e,C]);const{collectionRows:dr,collectionTracks:Qh}=p.useMemo(()=>{if(!Rn)return{collectionRows:null,collectionTracks:[]};const{rows:F,tracks:he}=GR(Rn,Ae=>_n.get(Ae),e.baseUrl);return{collectionRows:F,collectionTracks:he}},[Rn,_n,e.baseUrl]);p.useEffect(()=>{BY({selCollection:C,membersLoaded:Rn!==null,metaLoaded:ya,meta:Ht})&&S({kind:"home"})},[C,Rn,ya,Ht]);const Fs=j?Rn===null:b!=null&&b!==Du&&ne!==b,jn=p.useMemo(()=>{var F;return zY((F=t.flatMap(he=>he.streams).find(he=>he.id===b))==null?void 0:F.sources)},[t,b]),{rows:Cn,playableTracks:Xr}=p.useMemo(()=>{const F=[];return{rows:IY(H,zy).map(Ae=>{const Ve=Oh(Ae,e.baseUrl),qe=Ve?F.push(Ve)-1:-1;return{item:Ae,track:Ve,playIndex:qe}}),playableTracks:F}},[H,e.baseUrl]),ci=p.useMemo(()=>Cn.map(({item:F,track:he,playIndex:Ae})=>{var qe;const Ve=HR(F);return{id:F.id,title:zy(F),author:typeof F.author=="string"?F.author:void 0,album:TY((qe=F.content)==null?void 0:qe.text),poster:(he==null?void 0:he.poster)??ZX(F),durationS:he==null?void 0:he.durationS,track:he??void 0,playIndex:Ae,vip:QX(F),origin:qR(F,jn),trackKey:Ve,likeRef:_u(Ve)??void 0,sourceUrl:F.url,muted:!he,sourceItem:F}}),[Cn]);p.useEffect(()=>{G&&!U&&Xr.length>0&&(a.playQueue(Xr,0,"music"),I(!1))},[G,U,Xr]);const hn=Ly(t,b),qt=b===Du,_l=nQ({sel:b,selStream:!!hn,isLikedPlaylist:qt,channelsLoaded:t.length>0,isCollection:v.kind==="collection"});async function mo(){if(!hn)return;const F=await be.items(e,{stream:hn.id,limit:2e3}).catch(()=>null);F&&ee(F)}const ba=WY({isCollection:j,isLikedPlaylist:qt,streamId:b,collectionId:C}),ui=async()=>{if(ba)try{const F=ba.kind==="collection"?await be.exportCollectionPlaylist(e,ba.id):await be.exportStreamPlaylist(e,ba.id);ie(F)}catch{Ke.error("生成 m3u 失败")}},Qr=p.useMemo(()=>X.map(F=>({id:`liked:${F.platform}:${F.trackId}`,kind:"music",url:zh(e.baseUrl,{platform:F.platform,trackId:F.trackId}),title:F.title,author:F.artist,poster:F.poster?os(e.baseUrl,F.poster):void 0,durationS:F.durationS})),[e.baseUrl,X]),Hs=p.useMemo(()=>X.map((F,he)=>({id:`liked:${F.platform}:${F.trackId}`,title:F.title,author:F.artist,album:F.album,poster:F.poster,durationS:F.durationS,track:Qr[he],playIndex:he,trackKey:`${F.platform}:${F.trackId}`,likeRef:{platform:F.platform,trackId:F.trackId},sourceUrl:F.sourceUrl})),[X,Qr]),wa=p.useMemo(()=>new Map(H.map(F=>[F.id,F])),[H]),{scopeRows:Yt,scopeTracks:Zh}=p.useMemo(()=>{if(!_e)return{scopeRows:null,scopeTracks:[]};const{rows:F,tracks:he}=GR(_e,Ae=>wa.get(Ae)??We.get(Ae),e.baseUrl);return{scopeRows:F,scopeTracks:he}},[_e,wa,We,e.baseUrl]),Ol=p.useMemo(()=>$Y(WR({collectionRows:dr,scopeRows:Yt,isLikedPlaylist:qt,likedRows:Hs,tableRows:ci}),A),[dr,Yt,qt,Hs,ci,A]),Sa=p.useMemo(()=>{const F=j&&C&&Rn?{id:C,members:Rn,set:At}:qt?{id:Th.audioLiked,members:X,set:M}:null;if(!F||A.trim())return;const{id:he,members:Ae,set:Ve}=F;return(qe,mt)=>{const at=VY(Ae,qe,mt);at!==Ae&&(Ve(at),be.reorderCollection(e,he,at.map(Rt=>Rt.key)).catch(Rt=>{Ve(Ae),Ke.error("排序没保存",{description:Rt instanceof Error?Rt.message:String(Rt)})}))}},[j,C,Rn,qt,X,A,e]),qs=dr?Qh:Yt?Zh:qt?Qr:Xr,Iu=p.useMemo(()=>V.map(F=>({id:F.id,kind:"music",url:zh(e.baseUrl,{platform:F.platform,trackId:F.trackId}),title:F.title,author:F.artist,poster:F.poster?os(e.baseUrl,F.poster):void 0,durationS:F.durationS})),[e.baseUrl,V]),$u=p.useMemo(()=>V.map((F,he)=>({id:F.id,title:F.title,author:F.artist,album:F.album,poster:F.poster,durationS:F.durationS,track:Iu[he],playIndex:he,trackKey:`${F.platform}:${F.trackId}`,likeRef:{platform:F.platform,trackId:F.trackId},sourceUrl:F.sourceUrl})),[V,Iu]),zl=qt?Hs:k?$u:ci,di=p.useMemo(()=>zl.map(F=>F.likeRef??_u(F.trackKey)).filter(F=>!!F),[zl]);p.useEffect(()=>{if(di.length===0){J({});return}let F=!0;return be.archiveStatus(e,di).then(he=>{F&&J(he.archived)}).catch(()=>{F&&J({})}),()=>{F=!1}},[e,di]);const ja=async(F={})=>{var at,Rt;const he=await be.downloadJobs(e),Ae={},Ve=new Map(zl.map(ct=>[ct.trackKey,ct.title])),qe=di.length?(await be.archiveStatus(e,di)).archived:{},mt=new Map;for(const ct of he.jobs){const jt=`${ct.platform}:${ct.track_id}`,hr=mt.get(jt);(!hr||ct.id>hr.id)&&mt.set(jt,ct)}for(const[ct,jt]of mt)if(Ae[ct]={id:jt.id,state:jt.state,attempts:jt.attempts,lastError:jt.last_error,downloadedBytes:jt.downloaded_bytes,totalBytes:jt.total_bytes,archived:jt.archived,failedAt:jt.state==="failed"?((at=P[ct])==null?void 0:at.id)===jt.id?(Rt=P[ct])==null?void 0:Rt.failedAt:Sn.current[ct]==="queued"||Sn.current[ct]==="running"?Date.now():void 0:void 0},F.notify){const hr=Sn.current[ct],Ss=hr==="queued"||hr==="running";Ss&&jt.state==="done"&&!jt.archived&&!qe[ct]?Zy("归档失败",`${Ve.get(ct)??ct}:归档文件不存在或已被移动`):Ss&&jt.state==="failed"&&Zy("下载失败",`${Ve.get(ct)??ct}${jt.last_error?`:${jt.last_error}`:""}`)}Sn.current=Object.fromEntries(Object.entries(Ae).map(([ct,jt])=>[ct,jt.state])),L(ct=>{const jt={...ct},hr=new Set(Object.keys(Ae));for(const[Ss,Ks]of Object.entries(Ae))jt[Ss]=GA(ct[Ss],Ks);for(const[Ss,Ks]of Object.entries(ct))!hr.has(Ss)&&(Ks.state==="queued"||Ks.state==="running"||Ks.failedAt)&&(jt[Ss]=Ks);return jt}),J(ct=>({...ct,...qe}))};p.useEffect(()=>{let F=!0;const he=()=>ja({notify:!0}).catch(()=>{});he();const Ae=setInterval(()=>{if(!F)return;Object.values(Me.current).some(qe=>qe.state==="queued"||qe.state==="running")&&he()},5e3);return()=>{F=!1,clearInterval(Ae)}},[e,di]),KX(be.wsUrl(e),p.useCallback(F=>{if(F.type!=="audio-download")return;const he=`${F.job.platform}:${F.job.track_id}`;L(Ae=>{var mt,at;const Ve=GA(Ae[he],{id:F.job.id,state:F.job.state,attempts:F.job.attempts,lastError:F.job.last_error,downloadedBytes:F.job.downloaded_bytes,totalBytes:F.job.total_bytes,archived:F.job.archived,failedAt:F.job.state==="failed"?((mt=Ae[he])==null?void 0:mt.id)===F.job.id?(at=Ae[he])==null?void 0:at.failedAt:Date.now():void 0}),qe=Ae[he];return(qe==null?void 0:qe.id)===Ve.id&&qe.state===Ve.state&&qe.attempts===Ve.attempts&&qe.lastError===Ve.lastError&&qe.downloadedBytes===Ve.downloadedBytes&&qe.totalBytes===Ve.totalBytes&&qe.archived===Ve.archived&&qe.failedAt===Ve.failedAt?Ae:{...Ae,[he]:Ve}}),F.job.archived&&J(Ae=>({...Ae,[he]:!0}))},[])),p.useEffect(()=>{const F=Object.entries(P).filter(([,Ve])=>Ve.state==="failed"&&Ve.failedAt);if(!F.length)return;const he=Math.max(250,Math.min(...F.map(([,Ve])=>Math.max(0,5e3-(Date.now()-(Ve.failedAt??0)))))),Ae=setTimeout(()=>{const Ve=Date.now();L(qe=>{let mt=!1;const at={...qe};for(const[Rt,ct]of Object.entries(at))ct.state==="failed"&&ct.failedAt&&Ve-ct.failedAt>=5e3&&(delete at[Rt],mt=!0);return mt?at:qe})},he);return()=>clearTimeout(Ae)},[P]);const Pl=F=>{const he=T.trim();if(!he){S({kind:"home"});return}R(he),S({kind:"search",q:he})};p.useEffect(()=>{if(!k){B([]),_(!1);return}R(k);let F=!0;return _(!0),be.musicSearch(e,k).then(he=>{F&&B(he)}).catch(()=>{F&&B([])}).finally(()=>{F&&_(!1)}),()=>{F=!1}},[e,k]);const Zr=async(F,he={})=>{const Ae=F.likeRef??_u(F.trackKey);if(!F.sourceItem&&!Ae)return{ok:!1};const Ve=F.trackKey;Ve&&he.optimistic&&L(qe=>{const mt=qe[Ve];return(mt==null?void 0:mt.state)==="queued"||(mt==null?void 0:mt.state)==="running"?qe:{...qe,[Ve]:{state:"queued"}}});try{return{ok:!0,enqueued:(await be.download(e,F.sourceItem?{itemId:F.sourceItem.id,skipArchived:he.skipArchived,force:he.force}:{track:{platform:Ae.platform,trackId:Ae.trackId,title:F.title,artist:F.author,album:F.album||void 0,pageUrl:F.sourceUrl},skipArchived:he.skipArchived,force:he.force})).enqueued}}catch(qe){return Ve&&L(mt=>{const at={...mt};return delete at[Ve],at}),{ok:!1,error:qe}}},er=async F=>{const he=await Zr(F,{optimistic:!0,force:!0});if(he.ok){await ja().catch(()=>{});return}"error"in he&&Zy("加入下载队列失败",he.error instanceof Error?he.error.message:F.title)},Bu=async(F,he)=>{let Ae=0,Ve=0,qe=0,mt=0;const at=async()=>{for(;mt<F.length;){const ct=F[mt++],jt=await Zr(ct,{skipArchived:!0});if(!jt.ok){Ve++;continue}jt.enqueued>0?Ae++:qe++}};await Promise.all(Array.from({length:Math.min(eQ,F.length)},()=>at())),await ja().catch(()=>{});const Rt=ZR({succeeded:Ae,failed:Ve,skipped:he,archived:qe});Rt.kind==="success"?Ke.success(Rt.text):Ke.error(Rt.text)},hb=F=>{Se(he=>{const Ae=new Set(he);return Ae.has(F.id)?Ae.delete(F.id):Ae.add(F.id),Ae})},Ca=()=>{if(!b||qt){Xe([]);return}const F=b;be.collections(e,"audio",F).then(he=>{F===Ue.current&&Xe(he)}).catch(()=>{F===Ue.current&&Xe([])})},Jh=async()=>{if(!Ge)return;const F=kt.trim();if(F){fn(!0);try{await be.renameCollection(e,Ge.id,F),C===Ge.id&&An(he=>he&&{...he,label:F}),je(null),Ca(),Pt()}catch{Ke.error("重命名失败")}finally{fn(!1)}}},Ll=async()=>{if(!Qn)return;const F=Qn.id;we(!0);try{await be.deleteCollection(e,F),nt===F&&re(null);const he=C===F;sn(null),Ca(),he&&S({kind:"home"}),Pt()}catch{Ke.error("删除失败")}finally{we(!1)}},Il=WR({collectionRows:dr,scopeRows:Yt,isLikedPlaylist:qt,likedRows:Hs,tableRows:ci}),fr=!!nt&&!Yt,Uu=()=>{const F=YY({isCollection:j,isLikedPlaylist:qt,scopeId:nt,streamId:b});if(F.kind==="stream"){be.download(e,{stream:F.streamId,skipArchived:!0}).then(Ve=>{const qe=ZR({succeeded:Ve.enqueued,failed:0,skipped:0,archived:Ve.skipped});qe.kind==="success"?Ke.success(qe.text):Ke.error(qe.text),ja().catch(()=>{})}).catch(()=>Ke.error("加入下载队列失败"));return}const{targets:he,skipped:Ae}=QR({rows:Il,canDownload:$h});if(he.length===0){Ke.error("这个列表里没有可下载的曲目");return}Bu(he,Ae)},em=async F=>{const he=!qt&&b?b:null,Ve=Il.filter(qe=>fe.has(qe.id)).flatMap(qe=>{const mt=ku(qe,he);return mt?[{key:mt,title:qe.title,poster:qe.poster,artist:qe.author,album:qe.album,durationS:qe.durationS,sourceUrl:qe.sourceUrl}]:[]});if(Ve.length!==0)try{await be.addToCollectionBatch(e,F,Ve),Ke.success(`已加入播单:${Ve.length} 首`),Fe(!1),Se(new Set),Ca(),Pt()}catch{Ke.error("加入播单失败")}},Vu=()=>{const{targets:F,skipped:he}=QR({rows:Il,canDownload:$h,selection:{ids:fe,idOf:Ae=>Ae.id}});if(F.length===0){Ke.error("选中的曲目都没有可下载的来源");return}Bu(F,he),Fe(!1),Se(new Set)},fi=()=>{Ca(),Pt()},tm=async()=>{const F=bt.trim();if(F)try{const he=await be.createCollection(e,"audio",F);en(!1),Ft(""),lt(Ae=>[...Ae,he]),Ke.success(`已创建播单:${F}`)}catch{Ke.error("创建播单失败")}};return l.jsxs("div",{className:"relative flex h-full min-h-0 flex-col",children:[_l==="loading"?l.jsxs("div",{className:"flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground",children:[l.jsx(wr,{className:"size-5 animate-spin"})," 载入中…"]}):_l==="track-list"?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex items-center gap-3 border-b border-border px-4 py-3",children:[l.jsx(Ne,{icon:!0,size:"large",variant:"neutral","aria-label":"返回",onClick:()=>S({kind:"home"}),children:l.jsx(N1,{})}),(()=>{var he,Ae;const F=j?void 0:qt?(he=X[0])==null?void 0:he.poster:(hn==null?void 0:hn.image)??((Ae=Xr[0])==null?void 0:Ae.poster);return F?l.jsx("img",{src:os(e.baseUrl,F),alt:"",className:"size-12 shrink-0 rounded-md object-cover"}):l.jsx("span",{className:"flex size-12 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground",children:qt?l.jsx(Fd,{className:"size-5 fill-primary text-primary"}):l.jsx(Js,{className:"size-5"})})})(),l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsx("div",{className:"truncate text-[15px] font-bold",children:j?(Ht==null?void 0:Ht.label)??"播单":qt?"我喜欢的歌曲":(hn==null?void 0:hn.description)||(hn==null?void 0:hn.id)}),l.jsx("div",{className:"text-[11px] text-muted-foreground",children:j?A?`${Ol.length} / ${(dr==null?void 0:dr.length)??0} 首`:`${(dr==null?void 0:dr.length)??0} 首`:A?`${Ol.length} / ${qt?X.length:Cn.length} 首`:`${qt?X.length:Cn.length} 首`})]}),l.jsx(Zf,{size:"large",className:"w-56 max-w-[48%] shrink-0",value:A,onChange:F=>O(F.target.value),onClear:()=>O(""),placeholder:"搜索本列表","aria-label":"在列表内搜索"}),l.jsx(fQ,{playDisabled:qs.length===0,onPlayAll:()=>a.playQueue(qs,0,"music"),selectMode:Ie,onToggleSelectMode:()=>{Fe(!Ie),Se(new Set)},onDownloadAll:!fr&&Il.some($h)?Uu:void 0,sync:hn&&!qt&&!j?{on:$,onToggle:()=>{if(!b)return;const F=!$;se(F),be.setSync(e,b,F).catch(()=>se(!F))}}:void 0,onNetdisk:hn&&!qt&&!j?()=>ve(!0):void 0,onExportM3u:ba?ui:void 0,onRename:j&&Ht?()=>{je(Ht),zt(Ht.label)}:void 0,onRemove:j&&Ht?()=>sn(Ht):void 0})]}),!j&&ye.length>0&&l.jsxs("div",{className:"flex shrink-0 items-center gap-1.5 overflow-x-auto border-b border-border px-4 py-2 scrollbar-mac",children:[l.jsx(Ne,{size:"mini",variant:nt?"neutral":"default",className:"rounded-full",onClick:()=>re(null),children:"全部"}),ye.map(F=>l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:l.jsxs(Ne,{size:"mini",variant:nt===F.id?"default":"neutral",className:"rounded-full",onClick:()=>re(nt===F.id?null:F.id),children:[F.label,typeof F.itemCount=="number"?` (${F.itemCount})`:""]})}),l.jsxs(Tl,{size:"sm",className:"w-32",children:[l.jsxs(Rr,{onSelect:()=>{je(F),zt(F.label)},children:[l.jsx(Sc,{}),l.jsx("span",{children:"重命名"})]}),l.jsxs(Rr,{variant:"destructive",onSelect:()=>sn(F),children:[l.jsx(Po,{}),l.jsx("span",{children:"删除播单"})]})]})]},F.id))]}),hn&&!qt&&l.jsx(sX,{apiBase:e.baseUrl,open:Z,onOpenChange:ve,streamId:hn.id,streamTitle:hn.description||hn.id,onChanged:()=>{mo()}}),l.jsx(ZA,{rows:Ol,queue:qs,stage:a,baseUrl:e.baseUrl,liked:Te,toggleLike:ft,jobs:P,archived:Y,onDownload:er,busy:Fs,selectMode:Ie,selectedIds:fe,onToggleSelect:hb,jumpKey:b??void 0,onReorder:Sa,collect:{conn:e,streamId:!qt&&b?b:null,onChanged:fi},emptyText:j?A?"没有匹配的曲目。":"这个播单还是空的——去某个播客里用「加入播单」把节目收进来。":A?"没有匹配的节目。":qt?"还没有喜欢的歌曲。":"这个歌单还没有曲目(等待下次抓取)。"}),l.jsx(kY,{open:!!oe,onOpenChange:F=>{F||ie(null)},children:l.jsxs(IR,{children:[l.jsxs($R,{children:[l.jsx(UR,{children:oe!=null&&oe.written?"已生成 m3u":"未生成 m3u"}),l.jsxs(VR,{children:["写入 ",(oe==null?void 0:oe.written)??0," 首",oe&&oe.skipped>0?`,跳过 ${oe.skipped} 首(还没有本地文件)`:"",oe!=null&&oe.path?l.jsxs(l.Fragment,{children:["。文件位置:",l.jsx("br",{}),l.jsx("code",{className:"break-all",children:oe.path})]}):"。没有可写入的曲目,未生成文件。"]})]}),l.jsx(BR,{children:l.jsx(FR,{onClick:()=>ie(null),children:"好"})})]})})]}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:[l.jsx(Lf,{title:((Fu=t[0])==null?void 0:Fu.label)??((ka=t[0])==null?void 0:ka.description)??"歌单",onRefresh:r,exportChannel:t.length===1?{conn:e,id:t[0].id}:void 0,className:"min-w-0 flex-1"}),l.jsx(Zf,{size:"large",className:"w-56 max-w-[48%] shrink-0",value:T,onChange:F=>R(F.target.value),onClear:()=>R(""),onKeyDown:F=>{F.key==="Enter"&&Pl()},placeholder:"搜索歌曲 / 歌手","aria-label":"搜索歌曲或歌手"})]}),t[0]?l.jsx(Cy,{value:o,onChange:c}):null,o==="config"&&t[0]?l.jsx("div",{className:"min-h-0 flex-1 overflow-auto",children:l.jsx(jy,{conn:e,channelId:t[0].id,showHeader:!1,onChanged:n,onDeleted:()=>{c("content")}})}):l.jsx("div",{className:"flex min-h-0 flex-1 flex-col",children:k?l.jsx(ZA,{rows:$u,queue:Iu,stage:a,baseUrl:e.baseUrl,liked:Te,toggleLike:ft,jobs:P,archived:Y,onDownload:er,busy:z,busyText:"搜索中…",jumpKey:`search:${k}`,collect:{conn:e,streamId:null},emptyText:"没有找到歌曲。"}):l.jsxs(Gy,{ref:N,className:"h-full p-4 pb-24 scrollbar-mac",children:[l.jsxs("div",{className:"mb-1.5 flex items-center gap-2",children:[l.jsx("span",{className:"text-[13px] font-semibold text-muted-foreground",children:"我的播单"}),an?l.jsx(Jt,{autoFocus:!0,className:"h-6 w-40 text-[12px]",placeholder:"播单名,回车创建",value:bt,onChange:F=>Ft(F.target.value),onKeyDown:F=>{F.key==="Enter"&&tm(),F.key==="Escape"&&(en(!1),Ft(""))},onBlur:()=>{en(!1),Ft("")}}):l.jsx("button",{onClick:()=>en(!0),className:"text-[12px] text-muted-foreground transition-colors hover:text-foreground",children:"+ 新建播单"})]}),l.jsxs("div",{"data-testid":"music-liked-grid",className:HA,children:[l.jsxs(Wy,{onOpen:()=>S({kind:"liked"}),ariaLabel:"我喜欢的歌曲",src:(nm=X[0])!=null&&nm.poster?os(e.baseUrl,X[0].poster):void 0,ratio:"1 / 1",fallback:l.jsx(Fd,{className:"size-10 fill-primary text-primary"}),caption:"overlay",title:"我喜欢的歌曲",children:[l.jsxs(Yy,{className:"right-1.5 top-1.5 tabular-nums",children:[X.length," 首"]}),l.jsx("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center bg-black/0 opacity-0 transition-all duration-200 group-hover:bg-black/25 group-hover:opacity-100",children:l.jsx("button",{onClick:F=>{F.stopPropagation(),S({kind:"liked"}),Qr.length&&a.playQueue(Qr,0,"music")},"aria-label":"播放",className:"pointer-events-auto flex size-14 items-center justify-center rounded-full border border-white/40 bg-white/20 text-white shadow-xl backdrop-blur-md transition-transform duration-200 hover:scale-110 hover:bg-white/30",children:l.jsx(Hn,{className:"size-6 translate-x-0.5 fill-current"})})})]}),UY(Oe,g).map(F=>{const he=Oe.find(Ae=>Ae.id===F.id);return l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:l.jsx("div",{children:l.jsx(Wy,{onOpen:()=>S({kind:"collection",id:F.id}),ariaLabel:F.label,ratio:"1 / 1",fallback:l.jsx(Js,{className:"size-9"}),caption:"overlay",title:F.label,subtitle:F.subtitle,children:l.jsxs(Yy,{className:"right-1.5 top-1.5 tabular-nums",children:[F.itemCount," 首"]})})})}),l.jsxs(Tl,{size:"sm",className:"w-32",children:[l.jsxs(Rr,{onSelect:()=>{je(he),zt(he.label)},children:[l.jsx(Sc,{}),l.jsx("span",{children:"重命名"})]}),l.jsxs(Rr,{variant:"destructive",onSelect:()=>sn(he),children:[l.jsx(Po,{}),l.jsx("span",{children:"删除播单"})]})]})]},F.id)})]}),m.length===0?l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"mt-6 mb-1.5 text-[13px] font-semibold text-muted-foreground",children:"歌单 / 播客"}),l.jsx("div",{className:"px-1 py-3 text-[13px] text-muted-foreground",children:"还没有歌单。去「添加来源」把音乐/电台源加为歌单。"})]}):l.jsx(l.Fragment,{children:[{key:"music",label:"歌单",list:x.playlists,icon:l.jsx(Js,{className:"size-9"})},{key:"podcast",label:"播客",list:x.podcasts,icon:l.jsx(kL,{className:"size-9"})}].filter(F=>F.list.length>0).map(F=>l.jsxs("div",{children:[l.jsx("div",{className:"mt-6 mb-1.5 text-[13px] font-semibold text-muted-foreground",children:F.label}),l.jsx("div",{className:HA,children:F.list.map(he=>{const Ae=JX(he);return l.jsx(vX,{id:he.id,label:he.description||he.id,children:l.jsxs(Wy,{onOpen:()=>S({kind:"playlist",id:he.id}),ariaLabel:he.description||he.id,src:he.image?os(e.baseUrl,he.image):void 0,ratio:"1 / 1",fallback:F.icon,caption:"overlay",title:he.description||he.id,children:[Ae&&l.jsx(Yy,{className:"right-1.5 top-1.5",children:Ae}),l.jsx("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center bg-black/0 opacity-0 transition-all duration-200 group-hover:bg-black/25 group-hover:opacity-100",children:l.jsx("button",{onClick:Ve=>{Ve.stopPropagation(),S({kind:"playlist",id:he.id}),I(!0)},"aria-label":"播放",className:"pointer-events-auto flex size-14 items-center justify-center rounded-full border border-white/40 bg-white/20 text-white shadow-xl backdrop-blur-md transition-transform duration-200 hover:scale-110 hover:bg-white/30",children:l.jsx(Hn,{className:"size-6 translate-x-0.5 fill-current"})})})]})},he.id)})})]},F.key))})]})})]}),_l==="track-list"&&Ie&&fe.size>0&&l.jsx(hQ,{conn:e,count:fe.size,anchorStreamId:!qt&&b?b:null,onPick:F=>void em(F),onDownload:()=>Vu(),onCancel:()=>{Fe(!1),Se(new Set)}}),l.jsx(XX,{renaming:Ge,deleting:Qn,renameLabel:kt,onRenameLabelChange:zt,onCloseRename:()=>je(null),onCloseDelete:()=>sn(null),onConfirmRename:()=>void Jh(),onConfirmDelete:()=>void Ll(),renameSaving:Xn,deleteSaving:Zn,renameTitle:"重命名播单",renameDesc:"修改这个子列表的显示名称。",nameLabel:"播单名称",deleteTitle:"删除播单",deleteBody:F=>`将删除「${F}」这个子列表;其中的分集/曲目仍留在原 stream 里,不会被删除。此操作不可撤销。`}),o==="config"?null:l.jsx(qX,{conn:e})]})}function pQ({channel:e,onChannelsChanged:t,onReload:n}){const r=p.useMemo(()=>iX("/music"),[]);return l.jsx("div",{"data-testid":"panel-music",className:"flex min-h-0 flex-1 flex-col",children:l.jsx(oX,{location:r,children:l.jsx(Cx,{conn:ut,children:l.jsx(mQ,{conn:ut,channels:[e],onChannelsChanged:t,onReload:n})})})})}function Jy(e){let t;function n(r){if(document.querySelector(`link[${e.marker}]`)!==null)return;const a=document.createElement("link");a.rel="stylesheet",a.setAttribute(e.marker,""),a.href=`${r}/panel/${e.file}.css`,document.head.appendChild(a)}return{load(r){if(t!==void 0)return t;const a=(async()=>{n(r);const o=document.createElement("script");try{return o.setAttribute(e.marker,""),o.crossOrigin="anonymous",o.src=`${r}/panel/${e.file}.js`,await new Promise((c,d)=>{o.addEventListener("load",()=>{const h=globalThis[e.globalName];if(h===void 0){d(new Error(`${e.label} bundle 加载了但没有导出 ${e.globalName}`));return}c(h)}),o.addEventListener("error",()=>d(new Error(`${e.label} bundle 加载失败`))),document.head.appendChild(o)})}catch(c){throw o.remove(),t=void 0,c}})();return t=a,a}}}const gQ=Jy({marker:"data-stream-panel-research",globalName:"__streamPanelResearch",file:"panel-research",label:"研究"}),xQ=["everySeconds","everyMinutes","hourly","daily","weekly","monthly"],vQ={everySeconds:"每隔几秒",everyMinutes:"每隔几分钟",hourly:"每小时",daily:"每天",weekly:"每周",monthly:"每月"},yQ=["周日","周一","周二","周三","周四","周五","周六"];function Bh(e){return yQ[e]??String(e)}function Al(e,t,n){if(e==="*")return{all:!0,step:null,values:JA(t,n,1)};const r=new Set;let a=null;const o=e.split(",");for(const c of o){const d=/^(\*|\d{1,2}(?:-\d{1,2})?)(?:\/(\d{1,2}))?$/.exec(c);if(!d)return null;const[,h,m]=d,x=m===void 0?1:Number(m);if(x<1)return null;let g,v;if(h==="*")g=t,v=n;else if(h.includes("-")){const[S,b]=h.split("-").map(Number);g=S,v=b}else g=Number(h),v=m===void 0?Number(h):n;if(!Number.isInteger(g)||!Number.isInteger(v)||g<t||v>n||g>v)return null;for(const S of JA(g,v,x))r.add(S);o.length===1&&h==="*"&&m!==void 0&&(a=x)}return r.size===0?null:{all:!1,step:a,values:[...r].sort((c,d)=>c-d)}}function JA(e,t,n){const r=[];for(let a=e;a<=t;a+=n)r.push(a);return r}function eb(e){const t=e.trim().split(/\s+/);if(t.length!==6)return null;const n=Al(t[0],0,59),r=Al(t[1],0,59),a=Al(t[2],0,23),o=Al(t[3],1,31),c=Al(t[4],1,12),d=Al(t[5],0,6);return!n||!r||!a||!o||!c||!d?null:{second:n,minute:r,hour:a,dayOfMonth:o,month:c,dayOfWeek:d}}function bQ(e){const t=e.trim()===""?[]:e.trim().split(/\s+/);return t.length!==6?`要 6 段(含秒),现在是 ${t.length} 段——每天 09:45 = "0 45 9 * * *"`:eb(e)?null:"有一段看不懂:只支持 * / */n / a-b / a-b/n / 逗号列表,且秒分 0–59、时 0–23、日 1–31、月 1–12、周 0–6"}function Uh(e){return!e.all&&e.step===null&&e.values.length===1?e.values[0]:null}function tb(e,t){return`${String(e).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function wQ(e){const t=[...e].sort((r,a)=>r-a);return t.every((r,a)=>a===0||r===t[a-1]+1)&&t.length>2?`${Bh(t[0])}至${Bh(t.at(-1))}`:t.map(Bh).join("、")}function SQ(e){const t=eM(e);if(!t)return null;switch(t.kind){case"everySeconds":return t.n===1?"每秒":`每 ${t.n} 秒`;case"everyMinutes":return t.n===1?"每分钟":`每 ${t.n} 分钟`;case"hourly":return`每小时第 ${t.minute} 分`;case"daily":return`每天 ${tb(t.hour,t.minute)}`;case"weekly":return`${wQ(t.weekdays)} ${tb(t.hour,t.minute)}`;case"monthly":return`每月 ${t.day} 日 ${tb(t.hour,t.minute)}`}}function jQ(e){switch(e.kind){case"everySeconds":return`*/${e.n} * * * * *`;case"everyMinutes":return`0 */${e.n} * * * *`;case"hourly":return`0 ${e.minute} * * * *`;case"daily":return`0 ${e.minute} ${e.hour} * * *`;case"weekly":return`0 ${e.minute} ${e.hour} * * ${[...e.weekdays].sort((t,n)=>t-n).join(",")}`;case"monthly":return`0 ${e.minute} ${e.hour} ${e.day} * *`}}function eM(e){const t=eb(e);if(!t)return null;const{second:n,minute:r,hour:a,dayOfMonth:o,month:c,dayOfWeek:d}=t;if(!c.all)return null;if(n.step!==null&&r.all&&a.all&&o.all&&d.all)return{kind:"everySeconds",n:n.step};if(n.all&&r.all&&a.all&&o.all&&d.all)return{kind:"everySeconds",n:1};if(Uh(n)!==0)return null;if(a.all&&o.all&&d.all){if(r.step!==null)return{kind:"everyMinutes",n:r.step};if(r.all)return{kind:"everyMinutes",n:1}}const m=Uh(r);if(m===null)return null;if(a.all&&o.all&&d.all)return{kind:"hourly",minute:m};const x=Uh(a);if(x===null)return null;if(o.all&&d.all)return{kind:"daily",hour:x,minute:m};if(o.all&&!d.all&&d.step===null)return{kind:"weekly",weekdays:d.values,hour:x,minute:m};if(d.all){const g=Uh(o);if(g!==null)return{kind:"monthly",day:g,hour:x,minute:m}}return null}function CQ(e){const t=n=>Number.isInteger(n);switch(e.kind){case"everySeconds":return t(e.n)&&e.n>=1&&e.n<=59?null:"间隔必须是 1–59 秒";case"everyMinutes":return t(e.n)&&e.n>=1&&e.n<=59?null:"间隔必须是 1–59 分钟";case"hourly":return t(e.minute)&&e.minute>=0&&e.minute<=59?null:"分钟必须是 0–59 的整数";case"monthly":return!t(e.day)||e.day<1||e.day>31?"日必须是 1–31 的整数":nb(e.hour,e.minute);case"weekly":return e.weekdays.length===0?"至少选一个星期几":e.weekdays.some(n=>!t(n)||n<0||n>6)?"周几只能是 0(周日)到 6(周六)":nb(e.hour,e.minute);case"daily":return nb(e.hour,e.minute)}}function nb(e,t){return!Number.isInteger(e)||e<0||e>23?"小时必须是 0–23 的整数":!Number.isInteger(t)||t<0||t>59?"分钟必须是 0–59 的整数":null}const kQ=366*4;function NQ(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return""}}function EQ(e,{from:t=new Date,count:n=3,timeZone:r}={}){const a=eb(e);if(!a||r!==void 0&&r!==""&&r!==NQ()||!a.dayOfMonth.all&&!a.dayOfWeek.all)return null;const o=[],c=new Date(t.getFullYear(),t.getMonth(),t.getDate());for(let d=0;d<kQ&&o.length<n;d+=1){const h=new Date(c.getFullYear(),c.getMonth(),c.getDate()+d);if(a.month.values.includes(h.getMonth()+1)&&!(!a.dayOfMonth.all&&!a.dayOfMonth.values.includes(h.getDate()))&&!(!a.dayOfWeek.all&&!a.dayOfWeek.values.includes(h.getDay())))for(const m of a.hour.values){for(const x of a.minute.values){for(const g of a.second.values){const v=new Date(h.getFullYear(),h.getMonth(),h.getDate(),m,x,g);if(!(v.getTime()<=t.getTime())&&(o.push(v),o.length>=n))break}if(o.length>=n)break}if(o.length>=n)break}}return o}function tM(e){const t=n=>String(n).padStart(2,"0");return`${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}function nM(e,t){const n=Math.round((e-t)/1e3),r=Math.abs(n),a=r<60?`${r} 秒`:r<3600?`${Math.round(r/60)} 分钟`:r<86400?`${Math.round(r/3600)} 小时`:`${Math.round(r/86400)} 天`;return n>=0?`${a}后`:`${a}前`}function rM(e,t){const n=SQ(e);return n===null?null:t?`${n}(${t})`:n}function sM({schedule:e,timezone:t,count:n=3,now:r=Date.now(),testId:a}){const o=EQ(e,{from:new Date(r),count:n,timeZone:t});return o===null?l.jsxs("div",{"data-testid":a,className:"text-[12px] text-muted-foreground",children:["下次:按 ",t," 计算,本机算不出来"]}):o.length===0?l.jsx("div",{"data-testid":a,className:"text-[12px] text-destructive",children:"下次:永不触发——这条排期没有任何匹配的时刻"}):l.jsxs("div",{"data-testid":a,className:"flex flex-wrap items-baseline gap-x-2 gap-y-0.5 text-[12px] text-muted-foreground",children:[l.jsx("span",{children:"下次"}),l.jsx("span",{className:"text-foreground",children:tM(o[0])}),l.jsxs("span",{children:["(",nM(o[0].getTime(),r),")"]}),o.length>1&&l.jsxs("span",{className:"opacity-70",children:["此后 ",o.slice(1).map(tM).join(" · ")]})]})}function TQ(e){const t=eM(e);return t?{kind:t.kind,preset:t}:{kind:"raw",preset:{kind:"daily",hour:9,minute:0}}}function RQ(e,t){const n="hour"in e?e.hour:9,r="minute"in e?e.minute:0;switch(t){case"everySeconds":return{kind:t,n:30};case"everyMinutes":return{kind:t,n:5};case"hourly":return{kind:t,minute:r};case"daily":return{kind:t,hour:n,minute:r};case"weekly":return{kind:t,weekdays:e.kind==="weekly"?e.weekdays:[1,2,3,4,5],hour:n,minute:r};case"monthly":return{kind:t,day:e.kind==="monthly"?e.day:1,hour:n,minute:r}}}function Ml({label:e,value:t,min:n,max:r,onChange:a,testId:o,width:c="w-16"}){return l.jsxs("label",{className:"flex items-center gap-1.5 text-[13px] text-muted-foreground",children:[l.jsx(Jt,{type:"number",min:n,max:r,value:Number.isFinite(t)?t:"","data-testid":o,"aria-label":e,className:`${c} h-7 px-2 text-[13px]`,onChange:d=>a(d.target.value===""?NaN:Number(d.target.value))}),e]})}function rb({hour:e,minute:t,onChange:n}){return l.jsxs(l.Fragment,{children:[l.jsx(Ml,{label:"时",value:e,min:0,max:23,testId:"sched-hour",onChange:r=>n({hour:r,minute:t})}),l.jsx(Ml,{label:"分",value:t,min:0,max:59,testId:"sched-minute",onChange:r=>n({hour:e,minute:r})})]})}function AQ({taskId:e,schedule:t,timezone:n,busy:r=!1,onCancel:a,onSave:o}){const c=p.useMemo(()=>TQ(t),[t]),[d,h]=p.useState(c.kind),[m,x]=p.useState(c.preset),[g,v]=p.useState(t),S=d==="raw"?null:CQ(m),b=d==="raw"?g.trim():S?null:jQ(m),j=d==="raw"?bQ(g):null,C=S??j,k=b!==null&&C===null?rM(b,n):null;return l.jsxs("div",{"data-testid":`task-schedule-editor-${e}`,className:"flex flex-col gap-2.5 rounded-lg bg-[var(--acr-card-nested)] p-3",children:[l.jsxs("div",{className:"flex flex-wrap gap-1",children:[xQ.map(N=>l.jsx(Ne,{type:"button",size:"small",variant:d===N?"secondary":"ghost","data-testid":`sched-kind-${N}`,onClick:()=>{h(N),x(T=>RQ(T,N))},children:vQ[N]},N)),l.jsx(Ne,{type:"button",size:"small",variant:d==="raw"?"secondary":"ghost","data-testid":"sched-kind-raw",onClick:()=>{h("raw"),v(b??t)},children:"自定义表达式"})]}),l.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-2",children:[d==="everySeconds"&&m.kind==="everySeconds"&&l.jsx(Ml,{label:"秒一次",value:m.n,min:1,max:59,testId:"sched-n",onChange:N=>x({kind:"everySeconds",n:N})}),d==="everyMinutes"&&m.kind==="everyMinutes"&&l.jsx(Ml,{label:"分钟一次",value:m.n,min:1,max:59,testId:"sched-n",onChange:N=>x({kind:"everyMinutes",n:N})}),d==="hourly"&&m.kind==="hourly"&&l.jsx(Ml,{label:"分(每小时)",value:m.minute,min:0,max:59,testId:"sched-minute",onChange:N=>x({kind:"hourly",minute:N})}),d==="monthly"&&m.kind==="monthly"&&l.jsxs(l.Fragment,{children:[l.jsx(Ml,{label:"日",value:m.day,min:1,max:31,testId:"sched-day",onChange:N=>x({...m,day:N})}),l.jsx(rb,{hour:m.hour,minute:m.minute,onChange:N=>x({...m,...N})})]}),d==="weekly"&&m.kind==="weekly"&&l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"flex flex-wrap gap-1",children:[0,1,2,3,4,5,6].map(N=>{const T=m.weekdays.includes(N);return l.jsx(Ne,{type:"button",size:"small",variant:T?"secondary":"ghost","aria-pressed":T,"data-testid":`sched-weekday-${N}`,onClick:()=>x({...m,weekdays:T?m.weekdays.filter(R=>R!==N):[...m.weekdays,N].sort((R,A)=>R-A)}),children:Bh(N)},N)})}),l.jsx(rb,{hour:m.hour,minute:m.minute,onChange:N=>x({...m,...N})})]}),d==="daily"&&m.kind==="daily"&&l.jsx(rb,{hour:m.hour,minute:m.minute,onChange:N=>x({...m,...N})}),d==="raw"&&l.jsx(Jt,{"data-testid":"sched-raw","aria-label":"cron 表达式",value:g,spellCheck:!1,autoComplete:"off",className:"h-7 w-64 px-2 font-mono text-[12px]",onChange:N=>v(N.target.value)})]}),C!==null?l.jsx("div",{"data-testid":"sched-error",className:"text-[12px] text-destructive",children:C}):l.jsxs("div",{className:"flex flex-col gap-0.5",children:[l.jsx("div",{className:"text-[13px] text-foreground","data-testid":"sched-sentence",children:k??"这条表达式合法,但超出了能翻成人话的范围——请照下面的触发时刻确认它是不是你要的"}),l.jsx("div",{className:"font-mono text-[11px] text-muted-foreground","data-testid":"sched-expr",children:b}),b!==null&&l.jsx(sM,{schedule:b,timezone:n,testId:"sched-next"})]}),l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Ne,{type:"button",size:"small",variant:"default","data-testid":`sched-save-${e}`,disabled:r||C!==null||b===null||b===t,onClick:()=>{b!==null&&o(b)},children:r?"保存中…":"保存排期"}),l.jsx(Ne,{type:"button",size:"small",variant:"ghost","data-testid":`sched-cancel-${e}`,onClick:a,children:"取消"})]})]})}async function Vh(e){if(!e.ok){const t=await e.text();throw new Error(`${e.status} ${t.slice(0,300)}`)}return e.json()}async function MQ(e){return(await Vh(await fetch(`${e}/api/tasks`))).tasks}async function DQ(e,t,n=50){return(await Vh(await fetch(`${e}/api/tasks/${encodeURIComponent(t)}/runs?limit=${n}`))).runs}async function _Q(e,t){await Vh(await fetch(`${e}/api/tasks/${encodeURIComponent(t)}/run`,{method:"POST"}))}async function OQ(e,t,n){if(t.source!=="user")throw new Error(`${t.id} 是内置运维任务,排期改代码不改库`);if(typeof t.command!="string")throw new Error(`${t.id} 这一行没有 command,改不了——请刷新页面重试`);const r={id:t.id,label:t.label,schedule:n.schedule??t.schedule,...t.timezone!==void 0?{timezone:t.timezone}:{},command:t.command,args:t.args??[],...t.cwd!==void 0?{cwd:t.cwd}:{},...t.env!==void 0?{env:t.env}:{},...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},serial:t.serial!==!1,maxAttempts:t.maxAttempts??1,effect:t.effect,enabled:n.enabled??t.enabled},a=await Vh(await fetch(`${e}/api/tasks/${encodeURIComponent(t.id)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(r)}));return{...t,...a.task,source:"user"}}function zQ(e){return e===null?"—":new Date(e).toLocaleString()}function PQ(e){return e===null?"—":e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function LQ({run:e}){const[t,n]=p.useState(!1),r=e.state==="failed";return l.jsxs("div",{className:"border-t border-[var(--acr-border-soft)] py-1 text-[12px]",children:[l.jsxs("button",{type:"button",className:"flex w-full gap-3 text-left",onClick:()=>n(a=>!a),children:[l.jsx("span",{className:"w-40 shrink-0 text-muted-foreground",children:zQ(e.attemptedAt??e.insertedAt)}),l.jsx("span",{className:`w-16 shrink-0 ${r?"text-destructive":"text-muted-foreground"}`,children:e.state}),l.jsx("span",{className:"w-16 shrink-0 text-muted-foreground",children:PQ(e.durationMs)}),l.jsx("span",{className:"flex-1 truncate",children:e.summary??"(没报摘要)"})]}),t&&(e.detail!==void 0||e.errors!==void 0)&&l.jsx("pre",{className:"mt-1 overflow-x-auto rounded-md bg-[var(--acr-card-nested)] p-2 text-[11px]",children:JSON.stringify({detail:e.detail,errors:e.errors},null,2)})]})}const sb={external:{text:"动外部世界",variant:"destructive"},"writes-db":{text:"写库",variant:"secondary"},"writes-files":{text:"写文件",variant:"secondary"},"read-only":{text:"只读",variant:"secondary"}};function IQ(e){var n;if(e.shadowed)return{label:"不会执行",dot:"bg-destructive",tone:"text-destructive"};if(!e.enabled)return{label:"已停用",dot:"bg-muted-foreground/50",tone:"text-muted-foreground"};const t=(n=e.lastRun)==null?void 0:n.state;return t==="running"||t==="claimed"||t==="waiting"?{label:"在跑",dot:"bg-primary animate-pulse",tone:"text-primary"}:t==="failed"?{label:"上次失败",dot:"bg-destructive",tone:"text-destructive"}:{label:"正常",dot:"bg-muted-foreground/40",tone:"text-muted-foreground"}}function $Q({apiBase:e,task:t,onChanged:n}){const[r,a]=p.useState(null),[o,c]=p.useState(!1),[d,h]=p.useState(!1),[m,x]=p.useState(!1),[g,v]=p.useState(null),[S,b]=p.useState(!1),j=p.useRef(!0);p.useEffect(()=>(j.current=!0,()=>{j.current=!1}),[]),p.useEffect(()=>{if(!S)return;const O=setTimeout(()=>b(!1),5e3);return()=>clearTimeout(O)},[S]);const C=p.useCallback(async()=>{const O=!o;if(c(O),O&&r===null)try{const z=await DQ(e,t.id);j.current&&a(z)}catch(z){j.current&&v(z.message)}},[e,o,r,t.id]),k=p.useCallback(async O=>{x(!0),v(null);try{const z=await OQ(e,t,O);if(!j.current)return;n(z),h(!1)}catch(z){j.current&&v(z.message)}finally{j.current&&x(!1)}},[e,n,t]),N=IQ(t),T=rM(t.schedule,t.timezone),R=t.source==="user"&&!t.shadowed,A=t.lastRun;return l.jsxs(ho,{className:"flex flex-col gap-2 p-3","data-testid":`task-row-${t.source}-${t.id}`,children:[l.jsxs("div",{className:"flex items-start gap-2",children:[l.jsx("span",{className:`mt-[7px] size-1.5 shrink-0 rounded-full ${N.dot}`,"aria-hidden":!0}),l.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[l.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[l.jsx("span",{className:"text-[15px] font-semibold leading-tight [letter-spacing:var(--text-title3-tracking)]",children:t.label}),l.jsx("span",{"data-testid":`task-status-${t.source}-${t.id}`,className:`text-[12px] ${N.tone}`,children:N.label}),t.source==="builtin"&&l.jsx(Bt,{variant:"outline",size:"sm",children:"内置"}),sb[t.effect]&&l.jsx(Bt,{"data-testid":`task-effect-${t.id}`,size:"sm",variant:sb[t.effect].variant,children:sb[t.effect].text})]}),t.shadowed&&l.jsxs("div",{className:"text-[12px] text-destructive",children:["与内置任务 ",t.id," 重名,调度中心已丢弃这一行——它不会执行。删掉它:DELETE /api/tasks/",t.id]}),l.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2",children:[l.jsx("span",{className:"text-[13px] text-foreground",children:T??"这条排期翻不成人话,见右侧原始表达式"}),l.jsx("code",{"data-testid":`task-cron-${t.id}`,className:"font-mono text-[11px] text-muted-foreground",children:t.schedule})]}),t.enabled?l.jsx(sM,{schedule:t.schedule,timezone:t.timezone,testId:`task-next-${t.id}`}):l.jsx("div",{className:"text-[12px] text-muted-foreground",children:"已停用,节拍器上没有它"})]}),l.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[R&&l.jsxs(l.Fragment,{children:[l.jsxs(Ne,{type:"button",size:"small",variant:"ghost",disabled:m,"data-testid":`task-toggle-${t.id}`,onClick:()=>{k({enabled:!t.enabled})},children:[t.enabled?l.jsx(Fi,{}):l.jsx(Hn,{}),t.enabled?"暂停":"恢复"]}),l.jsxs(Ne,{type:"button",size:"small",variant:"ghost","data-testid":`task-edit-${t.id}`,onClick:()=>h(O=>!O),children:[l.jsx(CL,{}),"改排期"]})]}),l.jsx(Ne,{type:"button",size:"small",variant:S?"destructive":"neutral","data-testid":`task-run-${t.id}`,onClick:()=>{if(t.effect==="external"&&!S){b(!0);return}b(!1),_Q(e,t.id).catch(O=>{j.current&&v(O.message)})},children:S?"确认执行?":"立即跑一次"})]})]}),d&&R&&l.jsx(AQ,{taskId:t.id,schedule:t.schedule,timezone:t.timezone,busy:m,onCancel:()=>h(!1),onSave:O=>{k({schedule:O})}}),l.jsxs("button",{type:"button","data-testid":`task-expand-${t.id}`,onClick:C,className:"flex items-baseline gap-2 rounded-md px-1 py-0.5 text-left transition-colors hover:bg-[var(--acr-hover)]",children:[l.jsx("span",{className:"shrink-0 text-[12px] text-muted-foreground",children:A?`上次 ${nM(A.attemptedAt??A.insertedAt,Date.now())}`:"上次"}),l.jsx("span",{className:`min-w-0 flex-1 truncate text-[13px] ${(A==null?void 0:A.state)==="failed"?"text-destructive":""}`,children:A?A.summary??"(没报摘要)":"还没跑过"})]}),g&&l.jsx("div",{"data-testid":`task-error-${t.id}`,className:"text-[12px] text-destructive",children:g}),o&&l.jsx("div",{"data-nested-surface":"true",children:r===null?l.jsx("div",{className:"text-[12px] text-muted-foreground",children:"读取中…"}):r.length===0?l.jsx("div",{className:"text-[12px] text-muted-foreground",children:"还没有执行记录"}):r.map(O=>l.jsx(LQ,{run:O},O.id))})]})}function BQ({apiBase:e,title:t="定时任务"}){const[n,r]=p.useState(null),[a,o]=p.useState(null),c=p.useRef(!0),d=p.useCallback(async()=>{try{const m=await MQ(e);c.current&&(r(m),o(null))}catch(m){c.current&&o(m.message)}},[e]);p.useEffect(()=>(c.current=!0,d(),()=>{c.current=!1}),[d]);const h=p.useCallback(m=>{r(x=>(x==null?void 0:x.map(g=>g.source===m.source&&g.id===m.id?m:g))??x)},[]);return l.jsxs("div",{className:"flex h-full min-h-0 flex-col",children:[l.jsx("div",{"data-testid":"panel-tasks-header",className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:l.jsx(Lf,{title:t,onRefresh:()=>{d()},refreshLabel:"重新读取",className:"min-w-0 flex-1"})}),l.jsx("div",{className:"min-h-0 flex-1 overflow-y-auto px-4 py-3",children:a!==null&&n===null?l.jsxs("div",{className:"text-[13px] text-destructive",children:["读不到任务列表:",a]}):n===null?l.jsx("div",{className:"text-[13px] text-muted-foreground",children:"读取中…"}):l.jsx("div",{className:"flex flex-col gap-2",children:n.map(m=>l.jsx($Q,{apiBase:e,task:m,onChanged:h},`${m.source}:${m.id}`))})})]})}function aM(e,t){var r,a;const n=e.poster?os(t,e.poster):void 0;if(e.url){const o=Np(t,e.url),c=(r=e.url.match(/[?&]key=([^&]+)/))==null?void 0:r[1],d=(a=e.url.match(/[?&]id=([^&]+)/))==null?void 0:a[1],h=c?decodeURIComponent(c):d?`item:${decodeURIComponent(d)}`:void 0,m=c?`key=${c}`:d?`id=${d}`:void 0;return{kind:"file",src:o,poster:n,...h?{progressKey:h}:{},...m?{subtitleListUrl:`${t}/api/media/netdisk-subtitle-list?${m}`,subtitleUrlBase:`${t}/api/media/netdisk-subtitle?${m}`}:{}}}if(e.provider==="bilibili"&&e.vid){const o=e.vid.startsWith("BV")?`bvid=${e.vid}`:`aid=${e.vid.slice(2)}`;return{kind:"dash",dashUrl:`${t}/api/media/bilibili/dash?${o}`,progressiveUrl:`${t}/api/media/bilibili/play?${o}`,progressKey:`bilibili:${e.vid}`,poster:n}}return(e.provider==="douyin"||e.provider==="tiktok")&&e.page_url?{kind:"file",src:`${t}/api/media/douyin/video?u=${encodeURIComponent(e.page_url)}`,poster:n}:(e.provider==="xhs"||e.provider==="xiaohongshu"||e.provider==="douyin"||e.provider==="tiktok")&&e.embed?{kind:"file",src:`${t}${e.embed}`,poster:n}:e.embed?{kind:"iframe",src:e.embed}:n?{kind:"poster",src:n}:{kind:"none"}}function UQ(e){for(const t of e??[]){if(t.kind!=="video")continue;const n=aM(t,"").kind;if(n==="dash"||n==="file")return t}}function VQ(e,t,n){if(!e)return"";const r=aM(e,t),a=r.kind==="file"?r.src:r.kind==="dash"?r.progressiveUrl:"";return a?`${a}${a.includes("?")?"&":"?"}dl=1&name=${encodeURIComponent(n)}`:""}function FQ(e){const t=document.createElement("a");t.href=e,t.rel="noopener",document.body.appendChild(t),t.click(),t.remove()}function Fh(e){const t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function HQ(e,t){var o,c,d,h,m,x;const n=(t==null?void 0:t.excerpt)||(t==null?void 0:t.text)||((o=t==null?void 0:t.html)==null?void 0:o.replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim())||"";if(n)return n;const r=lM(e),a=((c=e.content)==null?void 0:c.text)||((h=(d=e.content)==null?void 0:d.quoted)==null?void 0:h.text)||qQ((m=e.content)==null?void 0:m.media)||e.body_text||((x=e.body_html)==null?void 0:x.replace(/<[^>]+>/g," "))||"";return cM(a,[e.url,...r])}function ab(e){var a;const t=(a=e.content)==null?void 0:a.quoted;if(!t)return null;const n=(t.author??"").trim(),r=cM(t.text??"",[e.url,...lM(e)]);return!n&&!r?null:{author:n,text:r}}function iM(e,t){const n=HQ(e,t),r=ab(e);return r&&n&&n===r.text?"":n}function oM(e,t){var c,d,h;const n=[],r=new Set,a=(m,x,g,v)=>{!m||r.has(m)||(r.add(m),n.push({src:os(ut.baseUrl,m),alt:x,w:g,h:v}))};for(const m of(t==null?void 0:t.media)??[])m.kind==="image"&&a(m.url,m.alt,m.w,m.h),m.kind==="video"&&a(m.poster,void 0,m.w,m.h);a(t==null?void 0:t.leadImage);const o=[...((c=e.content)==null?void 0:c.media)??[],...((h=(d=e.content)==null?void 0:d.quoted)==null?void 0:h.media)??[]];for(const m of o)m.kind==="image"&&a(m.thumb||m.url,m.alt,m.w,m.h),m.kind==="video"&&a(m.poster,void 0,m.w,m.h),m.kind==="audio"&&a(m.poster),m.kind==="link"&&a(m.image);for(const m of e.attachments??[])/\.(png|jpe?g|webp|gif)(\?|#|$)/i.test(m)&&a(m);return n}function lM(e){var a,o,c;const t=[],n=d=>{d&&!t.includes(d)&&t.push(d)},r=[...((a=e.content)==null?void 0:a.media)??[],...((c=(o=e.content)==null?void 0:o.quoted)==null?void 0:c.media)??[]];for(const d of r)d.kind==="image"&&(n(d.url),n(d.thumb)),d.kind==="video"&&(n(d.poster),n(d.embed),n(d.page_url)),d.kind==="audio"&&(n(d.url),n(d.poster),n(d.page_url)),d.kind==="link"&&(n(d.url),n(d.image));for(const d of e.attachments??[])n(d);return t}function qQ(e){const t=e==null?void 0:e.find(n=>n.kind==="link"&&!!n.summary);return(t==null?void 0:t.summary)??""}function cM(e,t){let n=e;for(const r of t)r&&(n=n.split(r).join(" "));return n.replace(/https?:\/\/\S+/g," ").replace(/\s+/g," ").trim()}function uM(e){const t=new Date(e).getTime();if(!Number.isFinite(t))return"";const n=Date.now()-t,r=6e4,a=60*r,o=24*a;return n<a?`${Math.max(1,Math.round(n/r))}m`:n<o?`${Math.round(n/a)}h`:`${Math.round(n/o)}d`}function dM(e){const t=(e.title??"").trim();return t&&!/^[((]\s*(?:无标题|untitled)\s*[))]$/i.test(t)?t:""}const fM=new Map;function KQ(e,t,n){!e||!t||!n||fM.set(e,{w:t,h:n})}function ib(e){return e?fM.get(e):void 0}const hM=210,GQ=2,YQ=6,WQ=3/4,XQ="4 / 3",QQ=9/16,ZQ=5/4;function mM(e){return Math.min(ZQ,Math.max(QQ,e))}const JQ=22,eZ=20,tZ=18,nZ=30,rZ=14,sZ=13,aZ=2,iZ=2,oZ=3,lZ=12,cZ=16.5,uZ=22,dZ=3,fZ=44;function hZ(e){const t=Math.floor(e/hM);return Math.min(YQ,Math.max(GQ,t))}function mZ(e,t){let n=0;for(const r of e)n+=/[⺀-鿿가-퟿＀-￯]/.test(r)?t:t*.55;return n}function ob(e,t,n,r){return e?Math.min(r,Math.max(1,Math.ceil(mZ(e,t)/Math.max(1,n)))):0}function pZ(e,t){let n=0;if(e.hasMedia){const o=e.mediaW&&e.mediaH?e.mediaH/e.mediaW:WQ;n+=t*mM(o)}const r=ob(e.title,rZ,t,aZ),a=ob(e.summary,sZ,t,r>0?iZ:oZ);if(n+=JQ+r*eZ+a*tZ+nZ,e.quote){const o=ob(e.quote,lZ,t-fZ,dZ);n+=uZ+o*cZ}return n}function gZ(e){const t=oM(e)[0],n=ib(t==null?void 0:t.src),r=ab(e);return{id:e.id,mediaW:(n==null?void 0:n.w)??(t==null?void 0:t.w),mediaH:(n==null?void 0:n.h)??(t==null?void 0:t.h),hasMedia:!!t,title:dM(e),summary:iM(e),quote:r?`${r.author}${r.text}`:""}}function xZ(e){let t=0;for(let n=1;n<e.length;n++)e[n]<e[t]&&(t=n);return t}function vZ(e,t,n){var r;return!n||n.colCount!==t||e.length<n.itemCount?!1:n.itemCount===0?!0:((r=e[n.itemCount-1])==null?void 0:r.id)===n.lastId}function yZ(e,t,n,r){t=Math.max(1,t);const a=vZ(e,t,r),o=a?r.columns.map(h=>[...h]):Array.from({length:t},()=>[]),c=a?[...r.heights]:new Array(t).fill(0),d=a?r.itemCount:0;for(let h=d;h<e.length;h++){const m=e[h],x=xZ(c);o[x].push(m.id),c[x]+=pZ(m,n)}return{columns:o,heights:c,colCount:t,itemCount:e.length,lastId:e.length?e[e.length-1].id:null}}function bZ(e,t){const n=new Set(e.filter(c=>{var d;return(d=c.storyGroup)==null?void 0:d.isRep}).map(c=>c.storyGroup.id)),r=new Map,a=new Map;return{rendered:e.filter(c=>{const d=c.storyGroup;return!d||(d.isRep||a.set(d.id,[...a.get(d.id)??[],c]),d.isRep)||!n.has(d.id)||t.has(d.id)?!0:(r.set(d.id,(r.get(d.id)??0)+1),!1)}),hidden:r,membersOf:a}}function wZ(e,t){return t?"收起同源的":`另有 ${e} 条同源`}function pM(e,t){const n=Date.parse(e.timestamp||e.fetched_at),r=t.map(o=>Date.parse(o.timestamp||o.fetched_at)).filter(o=>Number.isFinite(o)&&o>n);if(!Number.isFinite(n)||r.length===0)return null;const a=Math.round((Math.min(...r)-n)/1e3);return a<60?null:a<3600?`首发,早 ${Math.round(a/60)} 分钟`:a<86400?`首发,早 ${Math.round(a/3600)} 小时`:`首发,早 ${Math.round(a/86400)} 天`}function SZ(e,t){const n=new Set(e);return n.delete(t)||n.add(t),n}function jZ(e){var t,n,r;return(r=(n=(t=e.content)==null?void 0:t.media)==null?void 0:n.find(a=>a.kind==="video"&&a.provider==="bilibili"&&!!a.vid))==null?void 0:r.vid}const CZ=e=>e.stream_id.includes("bilibili"),gM=e=>{var t;return e.stream_id.includes("v2ex")||(((t=e.url)==null?void 0:t.includes("v2ex.com"))??!1)},kZ=e=>{var t;return e.stream_id.includes("douyin")||(((t=e.url)==null?void 0:t.includes("douyin.com"))??!1)},xM=e=>{var t;return e.stream_id.includes("xhs")||(((t=e.url)==null?void 0:t.includes("xiaohongshu.com"))??!1)},vM=e=>e.stream_id.includes("xueqiu");function NZ(e){var n,r;const t=(r=(n=e.content)==null?void 0:n.quoted)==null?void 0:r.text;return!!t&&/(\.\.\.|…)\s*$/.test(t.trim())}function yM(e){return!xM(e)&&!vM(e)}function EZ(e){var t,n;return e.note_id?e.note_id:(n=(t=e.url)==null?void 0:t.match(/\/(?:explore|discovery\/item)\/([0-9a-zA-Z]+)/))==null?void 0:n[1]}function TZ(e){var t,n,r,a;return((n=(t=e.url)==null?void 0:t.match(/v2ex\.com\/t\/(\d+)/))==null?void 0:n[1])??(gM(e)?(a=(r=e.url)==null?void 0:r.match(/\/t\/(\d+)/))==null?void 0:a[1]:void 0)}function RZ(e){var n,r,a,o;if(e.stream_id.includes("hackernews")){const c=e.source_guid;if(typeof c=="string"){const h=c.match(/^(\d+)/);if(h)return h[1]}const d=(((n=e.content)==null?void 0:n.media)??[]).map(h=>h.kind==="link"?h.url:"").map(h=>{var m;return(m=h.match(/item\?id=(\d+)/))==null?void 0:m[1]}).find(Boolean);return d||((r=`${e.url??""} ${e.body_html??""}`.match(/item\?id=(\d+)/))==null?void 0:r[1])}return(o=`${e.url??""} ${e.body_html??""} ${(((a=e.content)==null?void 0:a.media)??[]).map(c=>c.kind==="link"?c.url:"").join(" ")}`.match(/news\.ycombinator\.com\/item\?id=(\d+)/))==null?void 0:o[1]}function Ou(e){var n,r,a,o;if(CZ(e)){const c=jZ(e);return c?{source:"bilibili-comments",vid:c}:null}if(xM(e)){const c=EZ(e),d=e.url?new URLSearchParams(e.url.split("?")[1]??"").get("xsec_token")??void 0:void 0;return c&&d?{source:"xhs",noteId:c,xsecToken:d}:null}if(gM(e)){const c=TZ(e);return c?{source:"v2ex",id:c}:null}if(kZ(e))return e.url?{source:"douyin",url:e.url,isGallery:((n=e.content)==null?void 0:n.archetype)==="gallery"}:null;if(vM(e)&&NZ(e)){const c=(a=(r=e.content)==null?void 0:r.quoted)==null?void 0:a.permalink;return c?{source:"xueqiu",permalink:c}:null}const t=RZ(e);return t?{source:"hackernews",id:t}:((o=e.content)==null?void 0:o.archetype)==="link"&&e.url?{source:"link",url:e.url}:null}function AZ(e){const t=Ou(e);return!!t&&t.source!=="link"&&t.source!=="xueqiu"}const bM=300*1e3,MZ=240,DZ=800,_Z=3,wM="stream.preload-cache.v1",ur=new Map,lb=e=>!!e&&Date.now()-e.at<bM;function OZ(){if(typeof window>"u")return[];try{const e=window.sessionStorage.getItem(wM);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t.filter(n=>n&&typeof n.key=="string"&&typeof n.at=="number"&&n.value):[]}catch{return[]}}function Hh(){if(!(typeof window>"u"))try{const e=[];for(const[t,n]of ur.entries())!n.value||!lb(n)||e.push({key:t,at:n.at,value:n.value});window.sessionStorage.setItem(wM,JSON.stringify(e))}catch{}}function zZ(){if(!(ur.size>0))for(const e of OZ()){if(Date.now()-e.at>=bM)continue;const t=Promise.resolve(e.value);ur.set(e.key,{at:e.at,value:e.value,promise:t})}}zZ();function SM(e,t){ur.delete(e),ur.set(e,t),Hh()}function PZ(e,t){for(ur.set(e,t);ur.size>MZ;){const n=ur.keys().next().value;if(n===void 0)break;ur.delete(n)}Hh()}const qh=new Map,jM=e=>{var t;return(t=qh.get(e))==null?void 0:t.forEach(n=>n())};let Kh=0;const CM=[];function LZ(){return Kh<_Z?(Kh++,Promise.resolve()):new Promise(e=>CM.push(e)).then(()=>void Kh++)}function IZ(){var e;Kh--,(e=CM.shift())==null||e()}function $Z(e,t,n){const r=JSON.stringify(t),a=ur.get(r);if(lb(a))return SM(r,a),a.promise;const c=(async()=>{await LZ();try{return await be.enrich(e,t)}finally{IZ()}})(),d={at:Date.now(),promise:c};return PZ(r,d),c.then(h=>{d.value=h,Hh(),jM(r)}).catch(()=>{ur.get(r)===d&&(ur.delete(r),Hh()),jM(r)}),c}function BZ(e){const t=e?Ou(e):null,n=t?JSON.stringify(t):"",[,r]=p.useState(0);p.useEffect(()=>{if(!n)return;const o=()=>r(d=>d+1);let c=qh.get(n);return c||qh.set(n,c=new Set),c.add(o),()=>{c.delete(o),c.size||qh.delete(n)}},[n]);const a=n?ur.get(n):void 0;return a&&SM(n,a),(a==null?void 0:a.value)??null}function UZ(e,t){if(!yM(e))return;const n=Ou(e);n&&(lb(ur.get(JSON.stringify(n)))||$Z(t,n).catch(()=>{}))}function kM(e,t){const n=p.useRef(null);return p.useEffect(()=>{const r=n.current;if(!r||!yM(e)||!Ou(e))return;const a=r.closest("[data-radix-scroll-area-viewport]")??r.closest('[data-slot="shell-content"]'),o=new IntersectionObserver(c=>{c[0].isIntersecting&&UZ(e,t)},{root:a,rootMargin:`0px 0px ${DZ}px 0px`});return o.observe(r),()=>o.disconnect()},[e,t]),n}function NM(e,{onPlayAudio:t}={}){var z,_,V,B,G;const n=BZ(e),r=oM(e,n==null?void 0:n.article),a=r[0],o=UQ((z=e.content)==null?void 0:z.media),c=((_=e.content)==null?void 0:_.archetype)==="video"||(((V=e.content)==null?void 0:V.media)??[]).some(I=>I.kind==="video"),d=RY(),h=d&&!o&&!c?Oh(e,ut.baseUrl,"podcast"):null,m=!!h&&((B=d==null?void 0:d.current)==null?void 0:B.id)===e.id,x=m&&!!(d!=null&&d.playing),g=!h||!d?void 0:()=>{m?d.toggle():t?t(e):d.play(h)},v=dM(e),S=iM(e,n==null?void 0:n.article),b=ab(e),j=e.author_avatar||cN(e.stream_id)||IP(ut.baseUrl,e.url),C=e.comment_count??(n==null?void 0:n.total),k=AZ(e)||typeof C=="number",N=((G=e.title)==null?void 0:G.trim())||(typeof e.author=="string"?e.author:"")||"download",T=VQ(o,ut.baseUrl,N),R=!!T,A=Ou(e),O=(A==null?void 0:A.source)==="xhs";return{media:r,firstMedia:a,video:o??null,isVideoNote:c,audioTrack:h,audioPlaying:x,onAudioActivate:g,title:v,summary:S,quoted:b,avatar:j??"",commentCount:C,hasComments:k,videoDl:T,canDownload:R,xhsParams:A,isXhs:O}}function EM({className:e,...t}){return l.jsx(o$,{"data-slot":"avatar",className:W("relative flex size-8 shrink-0 overflow-hidden rounded-full",e),...t})}function TM({className:e,...t}){return l.jsx(c$,{"data-slot":"avatar-image",className:W("aspect-square size-full",e),...t})}function RM({className:e,...t}){return l.jsx(d$,{"data-slot":"avatar-fallback",className:W("flex size-full items-center justify-center rounded-[inherit] border border-[var(--acr-border)] bg-[var(--acr-chip)] text-[11px] font-medium text-foreground",e),...t})}const VZ=/\.pdf(\?|#|$)/i;function AM(e,t,n){const r=t.media??[];return e==="stt"?t.resolvedByHandle?!0:r.some(a=>a.kind==="video"?!!a.url||!a.resolveOnly&&!!(a.vid||a.embed||a.page_url):a.kind==="audio"&&(!!a.url||!!(a.platform&&a.track_id))):e==="ocr"?r.some(a=>a.kind==="image"||a.kind==="link"&&VZ.test(a.url)):!!cb(t,n)}function cb(e,t){const n=(e.media??[]).find(r=>r.kind==="link");return(n==null?void 0:n.url)??t}const ub={stt:"语音转文字",ocr:"图片/PDF 识别",article:"网页正文抓取",inline:"直取条目原文"};function MM(e,t,n){if(e.archetype==="forward"){const a=e.quoted;return a!=null&&a.archetype?MM({archetype:a.archetype,text:a.text,media:a.media},t,n):DM(e)}if(e.archetype==="text"){const a=DM(e);if(!a.ok){const o=cb(e,n);if(o!==void 0)return t.article?{ok:!0,branch:"article",url:o}:{ok:!1,code:"branch_unavailable",branch:"article",message:`${ub.article}未配置`}}return a}const r=e.archetype==="video"||e.archetype==="audio"?"stt":e.archetype==="gallery"||AM("ocr",e,n)?"ocr":"article";return AM(r,e,n)?t[r]?r==="article"?{ok:!0,branch:r,url:cb(e,n)}:{ok:!0,branch:r}:{ok:!1,code:"branch_unavailable",branch:r,message:`${ub[r]}未配置`}:{ok:!1,code:"no_source",branch:r,message:`这条内容里没有可${ub[r]}的东西`}}function DM(e){var n;const t=(n=e.text)==null?void 0:n.trim();return t?{ok:!0,branch:"inline",text:t}:{ok:!1,code:"no_source",branch:"inline",message:"这条内容没有正文"}}const db={stt:!1,ocr:!1,article:!1};function FZ(e){const t=e.content,n=(t==null?void 0:t.media)??[];return{archetype:(t==null?void 0:t.archetype)??((n??[]).some(a=>a.kind==="video"||a.kind==="audio")?"video":(n??[]).some(a=>a.kind==="image")?"gallery":e.url?"link":"text"),text:t==null?void 0:t.text,media:n,quoted:t==null?void 0:t.quoted}}function HZ(e,t){const n=MM(FZ(e),t,e.url);return n.ok&&n.branch!=="inline"}const _M=p.createContext(db);function qZ({caps:e,children:t}){return l.jsx(_M.Provider,{value:e,children:t})}function KZ(){const e=p.useContext(_M);return p.useMemo(()=>t=>HZ(t,e),[e])}function GZ(e){var n;const t=(n=e.find(r=>r.kind==="extract"))==null?void 0:n.branches;return{stt:!!(t!=null&&t.stt),ocr:!!(t!=null&&t.ocr),article:!!(t!=null&&t.article)}}function YZ(e,t){const[n,r]=p.useState(()=>({caps:db,status:"loading"})),a=e.baseUrl;return p.useEffect(()=>{let o=!1;return be.conversions.kinds(e).then(c=>{o||r({caps:GZ(c.items),status:"ready"})}).catch(()=>{o||r({caps:db,status:"error"})}),()=>{o=!0}},[a,t]),n}function OM({item:e,videoDl:t,children:n}){const r=KZ();return l.jsxs(Ru,{children:[l.jsx(Au,{asChild:!0,children:n}),l.jsxs(Tl,{size:"sm",children:[l.jsxs(Rr,{onSelect:()=>void I1(e),children:[l.jsx(Dp,{}),"在对话中引用"]}),r(e)?l.jsxs(Rr,{onSelect:()=>void $L(ut,e),children:[l.jsx(gL,{}),"转成文字"]}):null,e.url?l.jsx(Rr,{asChild:!0,children:l.jsxs("a",{href:e.url,target:"_blank",rel:"noreferrer",children:[l.jsx(Op,{}),"打开原文"]})}):null,t?l.jsxs(Rr,{onSelect:()=>FQ(t),children:[l.jsx(wc,{}),"下载视频"]}):null]})]})}function zM({noteId:e,initialLiked:t=!1,initialCollected:n=!1,likeCount:r,className:a}){const[o,c]=p.useState(t),[d,h]=p.useState(n),[m,x]=p.useState(!1);async function g(S){if(m)return;const b=S==="like"?o:d,j=S==="like"?c:h,C=S==="like"?b?"unlike":"like":b?"uncollect":"collect";j(!b),x(!0);try{await be.interactXhs(ut,{noteId:e,action:C})}catch(k){j(b),Ke.error(S==="like"?"点赞失败":"收藏失败",{description:k instanceof Error?k.message:""})}finally{x(!1)}}const v=r==null?null:r+(o===t?0:o?1:-1);return l.jsxs(l.Fragment,{children:[l.jsxs(Ne,{variant:"neutral",size:"small","aria-pressed":o,"aria-label":o?"取消点赞":"点赞",title:o?"取消点赞":"点赞",className:a,onClick:S=>{S.stopPropagation(),g("like")},children:[l.jsx(Fd,{className:W(o&&"fill-current text-rose-500")}),v??null]}),l.jsx(Ne,{variant:"neutral",size:"small","aria-pressed":d,"aria-label":d?"取消收藏":"收藏",title:d?"取消收藏":"收藏",onClick:S=>{S.stopPropagation(),g("collect")},children:l.jsx(uL,{className:W(d&&"fill-current text-amber-500")})})]})}const PM=60;function WZ({item:e,onOpen:t,onPlayAudio:n}){var U,K,ne;const{t:r}=kp(),a=kM(e,ut),{firstMedia:o,isVideoNote:c,video:d,audioTrack:h,audioPlaying:m,onAudioActivate:x,title:g,summary:v,quoted:S,avatar:b,videoDl:j,canDownload:C,xhsParams:k}=NM(e,{onPlayAudio:n}),N=(k==null?void 0:k.source)==="xhs",T=o,[,R]=p.useState(0),O=ib(T==null?void 0:T.src)??(T!=null&&T.w&&(T!=null&&T.h)?{w:T.w,h:T.h}:void 0),z=O?O.h/O.w:void 0,_=z===void 0?void 0:mM(z),V=O&&_!==void 0?_===z?`${O.w} / ${O.h}`:`1 / ${_}`:XQ,B=v.length>PM?`${v.slice(0,PM)}…`:v,G=g||B||e.author||e.stream_id,I=c||!!d,H=(ne=(K=(U=e.content)==null?void 0:U.media)==null?void 0:K.find(q=>q.kind==="video"))==null?void 0:ne.duration_s,ee=I?H:h==null?void 0:h.durationS,X=h&&x?l.jsx("button",{type:"button","aria-label":r(m?"timeline.pause":"timeline.play"),onClick:q=>{q.stopPropagation(),x()},className:"flex size-10 items-center justify-center rounded-full bg-black/55 text-white shadow-sm transition-colors hover:bg-black/70",children:m?l.jsx(Fi,{className:"size-5 fill-current"}):l.jsx(Hn,{className:"size-5 translate-x-px fill-current"})}):null,M=l.jsx("div",{ref:a,"data-nested-surface":"true","data-item-id":e.id,role:"button",tabIndex:0,"aria-label":G,onClick:()=>t(e,{intent:"read"}),onKeyDown:q=>{q.target===q.currentTarget&&(q.key!=="Enter"&&q.key!==" "||(q.preventDefault(),t(e,{intent:"read"})))},className:"group block w-full cursor-pointer rounded-xl text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-ring/50",children:l.jsxs(ho,{nestedSurface:!0,className:W("flex flex-col overflow-hidden p-0",wA),children:[T?l.jsxs(Ey,{ratio:V,src:T.src,alt:T.alt??"",onClick:q=>{q.stopPropagation(),t(e,{intent:"watch"})},onNaturalSize:(q,P)=>{ib(T.src)||(KQ(T.src,q,P),R(L=>L+1))},children:[I?l.jsx("span",{"data-slot":"post-card-video-badge","aria-label":r("timeline.play"),className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:l.jsx("span",{className:"flex size-9 items-center justify-center rounded-full bg-black/55 text-white shadow-sm",children:l.jsx(Hn,{className:"size-4 translate-x-px fill-current"})})}):null,!I&&X?l.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:X}):null,typeof ee=="number"?l.jsx("span",{className:"absolute bottom-1.5 right-1.5 rounded-full bg-black/55 px-2 py-0.5 text-[11px] tabular-nums text-white",children:Fh(ee)}):null]}):null,l.jsxs("div",{className:"flex flex-col gap-1 px-3 pb-2.5 pt-2.5",children:[g?l.jsx(Mh,{className:"self-stretch line-clamp-2 whitespace-normal",children:g}):null,v?l.jsx(Ny,{className:W("whitespace-normal",g?"line-clamp-2":"line-clamp-3"),children:v}):null,S?l.jsx(ho,{"data-post-card-quote":"true",className:"mt-1.5 rounded-lg px-2.5 py-2 text-[12px] leading-snug text-muted-foreground",children:l.jsxs("div",{className:"line-clamp-3 whitespace-normal",children:[S.author?l.jsxs("span",{className:"font-medium text-foreground/70",children:["@",S.author,":"]}):null,S.text]})}):null,!T&&X?l.jsxs("div",{className:"mt-1 flex items-center gap-2.5",children:[X,typeof ee=="number"?l.jsx("span",{className:"text-[12px] tabular-nums text-muted-foreground",children:Fh(ee)}):null]}):null,l.jsxs("div",{className:"mt-1 flex min-w-0 items-center gap-1.5 text-[12px] text-muted-foreground",children:[l.jsxs(EM,{className:"size-4 shrink-0",children:[b?l.jsx(TM,{src:b,alt:"",className:"object-cover"}):null,l.jsx(RM,{children:l.jsx(R1,{className:"size-2.5"})})]}),l.jsx("span",{className:"truncate",children:e.author||e.stream_id}),l.jsx("span",{className:"shrink-0 opacity-70",children:"·"}),l.jsx("span",{className:"shrink-0 opacity-70",children:uM(e.timestamp)}),N&&k?l.jsx("div",{className:"ml-auto flex shrink-0 items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100",children:l.jsx(zM,{noteId:k.noteId})}):null]})]})]})});return l.jsx(OM,{item:e,videoDl:C?j:void 0,children:M})}const XZ=p.createContext(null);function QZ(){const e=p.useContext(XZ);if(!e)throw new Error("useVideoStage must be used inside <VideoStageContext.Provider>");return e}const Gh=507,ZZ=510,JZ=16/9,eJ=2,tJ=800;function Un(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function nJ(e,t){return e&&Un(e.width)&&Un(e.height)?e:t&&Un(t.width)&&Un(t.height)?t:null}function rJ({naturalWidth:e,naturalHeight:t,containerWidth:n,minWidth:r,maxWidth:a,maxHeight:o}){const c=Un(e)&&Un(t)?e/t:JZ;if(!Un(n)&&!Un(r))return{width:0,height:0,ratio:c};let d=Un(n)?n:r;return Un(a)&&(d=Math.min(d,a)),Un(o)&&(d=Math.min(d,o*c)),Un(r)&&(d=Math.max(d,r)),{width:Math.round(d),height:Math.round(d/c),ratio:c}}const Yh=p.forwardRef(function({kind:t="image",src:n,alt:r="",naturalWidth:a,naturalHeight:o,mediaSize:c,minWidth:d,maxWidth:h,maxHeight:m,videoMaxHeight:x,frameClassName:g,imageClassName:v,fallback:S,onSizingChange:b,maxRetries:j=eJ,retryDelayMs:C=tJ,className:k,children:N,...T},R){const A=p.useRef(null),[O,z]=p.useState(0),[_,V]=p.useState(null),B=p.useCallback(ne=>{A.current=ne,typeof R=="function"?R(ne):R&&(R.current=ne)},[R]);p.useLayoutEffect(()=>{V(null)},[n]),p.useLayoutEffect(()=>{const ne=A.current;if(!ne)return;z(ne.clientWidth);const q=new ResizeObserver(P=>{var L;return z(((L=P[0])==null?void 0:L.contentRect.width)??0)});return q.observe(ne),()=>q.disconnect()},[]);const G=Un(a)&&Un(o)?{width:a,height:o}:null,I=nJ(c,G??_),H=Un(m)?m:t==="video"?Gh:ZZ,ee=t==="video"&&Un(x)?Math.min(H,x):H,X=I?I.height>I.width:!1,M=t==="video"?X?9/16:16/9:I?I.width/I.height:16/9,U=rJ({naturalWidth:M,naturalHeight:1,containerWidth:O,minWidth:d,maxWidth:h,maxHeight:ee});p.useEffect(()=>{b==null||b({naturalW:(I==null?void 0:I.width)??0,naturalH:(I==null?void 0:I.height)??0,containerW:O,maxHeight:ee,box:U})},[O,U.width,U.height,U.ratio,I==null?void 0:I.width,I==null?void 0:I.height,ee,b]);const K=t==="video"?X?"9 / 16":"16 / 9":I?`${I.width} / ${I.height}`:"16 / 9";return l.jsx("div",{ref:B,"data-slot":"media-box",className:W("w-full",k),style:{maxWidth:h},...T,children:l.jsx(Ey,{"data-slot":"media-box-frame",ratio:K,style:{width:U.width||void 0},className:W("block [transform:translateZ(0)] rounded-2xl border border-[var(--acr-border)] bg-black [&_video]:rounded-[inherit]",g),src:n,alt:r,fallback:S,imageClassName:v,maxRetries:j,retryDelayMs:C,onNaturalSize:(ne,q)=>{G||V({width:ne,height:q})},children:N})})});var LM=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,a){r.__proto__=a}||function(r,a){for(var o in a)Object.prototype.hasOwnProperty.call(a,o)&&(r[o]=a[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}})(),Wh="html",fb="svg",sJ="http://www.w3.org/2000/svg",aJ=function(e,t){var n,r,a,o=(n=e.ownerDocument)!==null&&n!==void 0?n:document,c=(a=(r=o.defaultView)!==null&&r!==void 0?r:o.parentWindow)!==null&&a!==void 0?a:window;switch(t){case Wh:return e instanceof c.HTMLElement;case fb:return e instanceof c.SVGElement;default:throw new Error('Unrecognized element type "'.concat(t,'" for validateElementType.'))}},IM=function(e,t){var n,r,a={},o,c,d;switch(e){case Wh:d=document.createElement((n=t==null?void 0:t.containerElement)!==null&&n!==void 0?n:"div");break;case fb:d=document.createElementNS(sJ,(r=t==null?void 0:t.containerElement)!==null&&r!==void 0?r:"g");break;default:throw new Error('Invalid element type "'.concat(e,'" for createPortalNode: must be "html" or "svg".'))}if(t&&typeof t=="object"&&t.attributes)for(var h=0,m=Object.entries(t.attributes);h<m.length;h++){var x=m[h],g=x[0],v=x[1];d.setAttribute(g,v)}var S={element:d,elementType:e,setPortalProps:function(b){a=b},getInitialPortalProps:function(){return a},mount:function(b,j){if(j!==c){if(S.unmount(),b!==o&&!aJ(b,e))throw new Error('Invalid element type for portal: "'.concat(e,'" portalNodes must be used with ').concat(e," elements, but OutPortal is within <").concat(b.tagName,">."));b.replaceChild(S.element,j),o=b,c=j}},unmount:function(b){b&&b!==c||o&&c&&(o.replaceChild(c,S.element),o=void 0,c=void 0)}};return S};(function(e){LM(t,e);function t(n){var r=e.call(this,n)||this;return r.addPropsChannel=function(){Object.assign(r.props.node,{setPortalProps:function(a){r.setState({nodeProps:a})}})},r.state={nodeProps:r.props.node.getInitialPortalProps()},r}return t.prototype.componentDidMount=function(){this.addPropsChannel()},t.prototype.componentDidUpdate=function(){this.addPropsChannel()},t.prototype.render=function(){var n=this,r=this.props,a=r.children,o=r.node;return Fa.createPortal(p.Children.map(a,function(c){return p.isValidElement(c)?p.cloneElement(c,n.state.nodeProps):c}),o.element)},t})(p.PureComponent);var iJ=(function(e){LM(t,e);function t(n){var r=e.call(this,n)||this;return r.placeholderNode=p.createRef(),r.passPropsThroughPortal(),r}return t.prototype.passPropsThroughPortal=function(){var n=Object.assign({},this.props,{node:void 0});this.props.node.setPortalProps(n)},t.prototype.componentDidMount=function(){var n=this.props.node;this.currentPortalNode=n;var r=this.placeholderNode.current,a=r.parentNode;n.mount(a,r),this.passPropsThroughPortal()},t.prototype.componentDidUpdate=function(){var n=this.props.node;this.currentPortalNode&&n!==this.currentPortalNode&&(this.currentPortalNode.unmount(this.placeholderNode.current),this.currentPortalNode.setPortalProps({}),this.currentPortalNode=n);var r=this.placeholderNode.current,a=r.parentNode;n.mount(a,r),this.passPropsThroughPortal()},t.prototype.componentWillUnmount=function(){var n=this.props.node;n.unmount(this.placeholderNode.current),n.setPortalProps({})},t.prototype.render=function(){var n=this.props.node.element.tagName,r=this.props.node.elementType===Wh?n.toLowerCase():n;return p.createElement(r,{ref:this.placeholderNode})},t})(p.PureComponent);IM.bind(null,Wh),IM.bind(null,fb);const oJ=iJ;function lJ({node:e,onExpand:t,expandTitle:n,expandAriaLabel:r}){return l.jsxs("div",{"data-slot":"media-box-player",className:"group absolute inset-0",children:[l.jsx("div",{className:"thumb-player absolute inset-0",children:l.jsx(oJ,{node:e})}),t?l.jsx("button",{type:"button",onClick:a=>{a.stopPropagation(),t()},title:n,"aria-label":r||n,className:"absolute right-2 top-2 z-10 rounded-full bg-black/55 p-1.5 text-white opacity-0 transition-opacity hover:bg-black/75 group-hover:opacity-100",children:l.jsx(Lp,{className:"size-4"})}):null]})}const Xh=520;function $M({label:e,onActivate:t,children:n}){return l.jsx("div",{"data-slot":"media-hit",role:"button",tabIndex:0,"aria-label":e,title:e,className:"absolute inset-0 flex items-center justify-center",onClick:r=>{r.stopPropagation(),t()},onKeyDown:r=>{r.key!=="Enter"&&r.key!==" "||(r.preventDefault(),r.stopPropagation(),t())},children:n})}function cJ({item:e,last:t,onOpen:n,onPlayAudio:r}){return l.jsxs(l.Fragment,{children:[l.jsx(uJ,{item:e,onOpen:n,onPlayAudio:r}),t?null:l.jsx(Gk,{className:"mx-3 bg-[var(--acr-border-soft)]"})]})}function uJ({item:e,onOpen:t,onPlayAudio:n}){const r=kM(e,ut),{media:a,firstMedia:o,video:c,isVideoNote:d,audioTrack:h,audioPlaying:m,onAudioActivate:x,title:g,summary:v,quoted:S,avatar:b,videoDl:j,canDownload:C,xhsParams:k}=NM(e,{onPlayAudio:n}),N=(k==null?void 0:k.source)==="xhs",T=l.jsxs(Tr,{ref:r,"data-item-id":e.id,variant:"outline",role:"button",tabIndex:0,onClick:()=>t(e,{intent:"read"}),onKeyDown:R=>{(R.key==="Enter"||R.key===" ")&&(R.preventDefault(),t(e,{intent:"read"}))},className:"group/row w-full cursor-pointer items-start !bg-transparent !backdrop-blur-none hover:!bg-transparent focus-visible:border-transparent focus-visible:ring-0",children:[l.jsxs(kF,{className:"flex-row items-center gap-3",children:[l.jsx(nu,{variant:"avatar",children:l.jsxs(EM,{children:[b?l.jsx(TM,{src:b,alt:"",className:"object-cover"}):null,l.jsx(RM,{children:l.jsx(R1,{className:"size-3.5"})})]})}),l.jsxs("div",{className:"flex min-w-0 flex-1 items-center justify-between gap-3",children:[l.jsxs("div",{className:"min-w-0",children:[l.jsx(ma,{children:e.author||e.stream_id}),l.jsxs(ro,{children:[e.stream_id," · ",uM(e.timestamp)]})]}),N&&k?l.jsx("div",{className:"flex shrink-0 items-center gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/row:opacity-100",children:l.jsx(zM,{noteId:k.noteId})}):null,l.jsx(Bt,{variant:"secondary",size:"sm",children:e.type})]})]}),l.jsxs(Is,{className:"-my-2 pl-[52px] pr-2.5",children:[g?l.jsx(ma,{className:"whitespace-normal text-[14px]",children:g}):null,v?l.jsx(ro,{className:"mt-1 line-clamp-3",children:v}):null,S?l.jsxs("div",{className:"mt-2 line-clamp-2 border-l-2 border-[var(--acr-border-soft)] pl-2.5 text-[13px] text-muted-foreground",children:[S.author?l.jsxs("span",{className:"font-medium text-foreground/70",children:["@",S.author,":"]}):null,S.text]}):null,c?l.jsx(dJ,{item:e,media:c,poster:o==null?void 0:o.src,className:"mt-2"}):h&&x?l.jsx(fJ,{poster:o==null?void 0:o.src,playing:m,durationS:h.durationS,onActivate:x}):o?l.jsx(hJ,{media:a,compact:!0,isVideo:d,onOpen:R=>t(e,{mediaIndex:R,intent:"watch"})}):null]})]});return l.jsx(OM,{item:e,videoDl:C?j:void 0,children:T})}function dJ({item:e,media:t,poster:n,className:r="mt-3"}){const a=QZ(),o=p.useRef(null),c=!!a.node&&a.activeId===e.id&&a.openId!==e.id,d=n||t.poster;return p.useEffect(()=>{if(!c||typeof IntersectionObserver>"u")return;const h=o.current;if(!h)return;const m=h.closest('[data-slot="shell-content"]'),x=new IntersectionObserver(g=>{var v;g[0].isIntersecting||(v=h.querySelector("video"))==null||v.pause()},{root:m,threshold:0});return x.observe(h),()=>x.disconnect()},[c]),c?l.jsx("div",{ref:o,"data-slot":"acrylic-inline-video",children:l.jsx(Yh,{kind:"video",src:d,mediaSize:a.videoSize?{width:a.videoSize.w,height:a.videoSize.h}:null,className:r,maxWidth:Xh,videoMaxHeight:Gh,children:l.jsx("div",{className:"h-full w-full",onClick:h=>h.stopPropagation(),children:l.jsx(lJ,{node:a.node})})})}):l.jsx(Yh,{kind:"video",src:d,className:r,maxWidth:Xh,videoMaxHeight:Gh,children:l.jsx($M,{label:"播放视频",onActivate:()=>a.play(e,t),children:l.jsx("span",{className:"flex size-10 items-center justify-center rounded-full bg-black/55 text-white shadow-sm",children:l.jsx(Hn,{className:"size-5 translate-x-px fill-current"})})})})}function fJ({poster:e,playing:t,durationS:n,onActivate:r}){const{t:a}=kp(),o=a(t?"timeline.pause":"timeline.play"),c=t?l.jsx(Fi,{className:"size-5 fill-current"}):l.jsx(Hn,{className:"size-5 translate-x-px fill-current"}),d=l.jsx("button",{type:"button","aria-label":o,title:o,onClick:h=>{h.stopPropagation(),r()},className:"flex size-10 items-center justify-center rounded-full bg-black/55 text-white shadow-sm transition-colors hover:bg-black/70",children:c});return e?l.jsxs(Yh,{kind:"image",src:e,className:"mt-2",maxWidth:Xh,children:[l.jsx("div",{className:"absolute inset-0 flex items-center justify-center",children:d}),typeof n=="number"?l.jsx("span",{className:"absolute bottom-1.5 right-1.5 rounded-full bg-black/55 px-2 py-0.5 text-[11px] tabular-nums text-white",children:Fh(n)}):null]}):l.jsxs("div",{className:"mt-2 flex items-center gap-2.5",onClick:h=>h.stopPropagation(),children:[d,typeof n=="number"?l.jsx("span",{className:"text-[12px] tabular-nums text-muted-foreground",children:Fh(n)}):null]})}function hJ({media:e,compact:t=!1,isVideo:n=!1,onOpen:r}){const a=e[0];return a?e.length>1&&!t?l.jsx("div",{className:"mt-3 grid max-w-xl grid-cols-2 gap-2",children:e.slice(0,4).map((o,c)=>l.jsxs("button",{type:"button",onClick:d=>{d.stopPropagation(),r==null||r(c)},className:"relative overflow-hidden rounded-[9px] border border-[var(--acr-border)] bg-[var(--acr-card-nested)]",children:[l.jsx("img",{src:o.src,alt:o.alt||"",referrerPolicy:"no-referrer",className:"aspect-square size-full object-cover",loading:"lazy"}),c===3&&e.length>4?l.jsxs("div",{className:"absolute inset-0 flex items-center justify-center bg-black/45 text-[13px] font-medium text-white",children:["+",e.length-4]}):null]},`${o.src}-${c}`))}):l.jsx(Yh,{kind:n?"video":"image",src:a.src,alt:a.alt,naturalWidth:a.w,naturalHeight:a.h,className:"mt-2",maxWidth:t?Xh:void 0,videoMaxHeight:t&&n?Gh:void 0,children:r?l.jsx($M,{label:n?"视频":"查看大图",onActivate:()=>r(0),children:n?l.jsx("span",{className:"flex size-9 items-center justify-center rounded-full bg-black/55 pl-0.5 text-[15px] text-white",children:"▶"}):null}):n?l.jsx("div",{"aria-label":"视频",className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:l.jsx("span",{className:"flex size-9 items-center justify-center rounded-full bg-black/55 pl-0.5 text-[15px] text-white",children:"▶"})}):null}):null}function mJ(e){const[t,n]=p.useState(0);p.useLayoutEffect(()=>{const o=e.current;if(!o||typeof ResizeObserver>"u")return;const c=new ResizeObserver(([d])=>n(d.contentRect.width));return c.observe(o),()=>c.disconnect()},[e]);const r=hZ(t),a=t>0?t/r:hM;return{colCount:r,colWidth:a}}function pJ(e,t,n){const r=p.useRef(null);return p.useMemo(()=>{const a=yZ(e.map(gZ),t,n,r.current??void 0);return r.current=a,a},[e,t,n])}function BM({n:e,expanded:t,lead:n,onToggle:r}){return l.jsxs("div",{className:"flex w-full items-center gap-2 px-3 py-1 text-xs text-muted-foreground",children:[l.jsxs("button",{type:"button","data-slot":"same-story-toggle",onClick:r,className:"flex items-center gap-1 text-left hover:text-foreground",children:[l.jsx("span",{"aria-hidden":!0,children:t?"▾":"▸"}),wZ(e,t)]}),n&&l.jsx("span",{"data-slot":"same-story-lead",className:"text-[11px] opacity-70",children:n})]})}function gJ({items:e,layout:t,channelId:n,onOpen:r,onPlayAudio:a,className:o}){const c=p.useRef(null),[d,h]=p.useState(()=>new Set),{rendered:m,hidden:x,membersOf:g}=p.useMemo(()=>bZ(e,d),[e,d]),v=b=>h(j=>SZ(j,b)),S=p.useRef({layout:t,channelId:n});if(p.useEffect(()=>{var C,k;const b=S.current;if(S.current={layout:t,channelId:n},b.layout===t||b.channelId!==n)return;const j=(C=c.current)==null?void 0:C.closest('[data-slot="shell-content"]');(k=j==null?void 0:j.scrollTo)==null||k.call(j,{top:0})},[t,n]),t==="list"){const b={onOpen:r,onPlayAudio:a};return l.jsx("div",{ref:c,className:o,children:l.jsx(ru,{className:"w-full gap-0",children:m.map((j,C)=>{var T;const k=(T=j.storyGroup)!=null&&T.isRep?j.storyGroup.id:void 0,N=k?x.get(k)??0:0;return l.jsxs("div",{className:"w-full",children:[l.jsx(cJ,{item:j,last:C===m.length-1&&N===0,...b}),k&&(N>0||d.has(k))&&l.jsx(BM,{n:N,expanded:d.has(k),lead:pM(j,g.get(k)??[]),onToggle:()=>v(k)})]},j.id)})})})}return l.jsx(xJ,{rootRef:c,items:m,hidden:x,membersOf:g,expanded:d,onToggleGroup:v,handlers:{onOpen:r,onPlayAudio:a},className:o})}function xJ({rootRef:e,items:t,hidden:n,membersOf:r,expanded:a,onToggleGroup:o,handlers:c,className:d}){const{colCount:h,colWidth:m}=mJ(e),{columns:x}=pJ(t,h,m),g=p.useMemo(()=>new Map(t.map(v=>[v.id,v])),[t]);return l.jsx("div",{ref:e,"data-slot":"post-feed-masonry",className:W("flex w-full items-start gap-3",d),children:x.map((v,S)=>l.jsx("div",{"data-slot":"post-feed-column",className:"flex min-w-0 flex-1 flex-col gap-3",children:v.map(b=>{var N;const j=g.get(b);if(!j)return null;const C=(N=j.storyGroup)!=null&&N.isRep?j.storyGroup.id:void 0,k=C?n.get(C)??0:0;return l.jsxs("div",{className:"flex flex-col",children:[l.jsx(WZ,{item:j,...c}),C&&(k>0||a.has(C))&&l.jsx(BM,{n:k,expanded:a.has(C),lead:pM(j,r.get(C)??[]),onToggle:()=>o(C)})]},b)})},S))})}function vJ(){let e=null;return{arm:(t,n)=>{e={trackId:t,seconds:n}},retarget:t=>{e&&e.trackId!==t&&(e=null)},redeem:t=>{const n=e&&e.trackId===t?e.seconds:null;return e=null,n},clear:()=>{e=null}}}function yJ(e,t,n){if(!t)return!1;const r=e.redeem(n);return r===null?!1:(t.currentTime=r,!0)}function bJ({elementRef:e,stageRef:t,onMediaEvent:n,children:r}){const a=p.useRef(null),o=e??a,[c,d]=p.useState(null),[h,m]=p.useState({music:[],podcast:[]}),[x,g]=p.useState("music"),[v,S]=p.useState(!1),b=p.useMemo(()=>yX(),[]),[j,C]=p.useState(0),k=p.useRef((()=>{if(typeof window>"u")return 1;const z=Number(window.localStorage.getItem("audioVolume"));return Number.isFinite(z)&&z>0?Math.min(1,z):1})()),N=p.useMemo(()=>vJ(),[]);p.useEffect(()=>{b.set(0),C(0),N.retarget(c==null?void 0:c.id),c&&T()},[c==null?void 0:c.id]),p.useEffect(()=>{o.current&&(o.current.volume=k.current)},[c==null?void 0:c.id]);const T=()=>{const z=o.current;return z?z.play().catch(_=>{_==null||_.name}):Promise.resolve()},R=async(z,_)=>{const V=["","ABORTED","NETWORK","DECODE","SRC_NOT_SUPPORTED"][(_==null?void 0:_.code)??0]||"UNKNOWN";let B=_?`MEDIA_ERR_${V}${_.message?` — ${_.message}`:""}`:"无法播放";if(z.url&&((_==null?void 0:_.code)===2||(_==null?void 0:_.code)===4))try{const I=await fetch(z.url);if(!I.ok){const H=await I.json().catch(()=>null);B+=` | 上游:${(H==null?void 0:H.detail)||(H==null?void 0:H.error)||`HTTP ${I.status}`}`}}catch(I){B+=` | 网络:${(I==null?void 0:I.message)||"请求失败"}`}const G=`${z.title||"音频"}:${B}`;Ke.error("播放失败",{description:G,action:{label:"复制错误",onClick:()=>{var I;return void((I=navigator.clipboard)==null?void 0:I.writeText(G))}}})},A=p.useMemo(()=>{const z={current:c,playing:v,duration:j||(c==null?void 0:c.durationS)||0,activeKind:x,queues:h,queue:h[x],play:_=>{m(V=>({...V,[_.kind]:[_]})),g(_.kind),_.id===(c==null?void 0:c.id)?T():d(_)},playQueue:(_,V,B)=>{const G=_[Math.max(0,Math.min(V,_.length-1))];G&&(m(I=>({...I,[B]:_})),g(B),G.id===(c==null?void 0:c.id)?T():d(G))},toggle:()=>{const _=o.current;_&&(_.paused?T():_.pause())},seek:_=>{o.current&&(o.current.currentTime=_)},playAt:(_,V)=>{if(_.id===(c==null?void 0:c.id)){o.current&&(o.current.currentTime=V),T();return}N.arm(_.id,V),m(B=>({...B,[_.kind]:[_]})),g(_.kind),d(_)},stop:()=>{var _;(_=o.current)==null||_.pause(),N.clear(),d(null)},getVolume:()=>k.current,setVolume:_=>{const V=Math.max(0,Math.min(1,_));k.current=V,o.current&&(o.current.volume=V),window.localStorage.setItem("audioVolume",String(V))}};return t&&(t.current=z),z},[c,v,j,h,x,t]),O=()=>{S(!1);const z=(c==null?void 0:c.kind)??x,_=AY(h[z],c==null?void 0:c.id);_&&d(_)};return l.jsxs(_y.Provider,{value:A,children:[l.jsx(NA.Provider,{value:b,children:r}),l.jsx("audio",{ref:o,src:c==null?void 0:c.url,onPlay:()=>S(!0),onPause:()=>S(!1),onTimeUpdate:z=>b.set(z.currentTarget.currentTime),onDurationChange:z=>C(z.currentTarget.duration||0),onError:z=>{var _;N.clear(),c&&R(c,z.currentTarget.error),n==null||n("error",`code=${((_=z.currentTarget.error)==null?void 0:_.code)??0}`)},onEnded:O,onLoadStart:()=>n==null?void 0:n("loadstart"),onLoadedMetadata:()=>{yJ(N,o.current,c==null?void 0:c.id),n==null||n("loadedmetadata")},onPlaying:()=>n==null?void 0:n("playing"),onWaiting:()=>n==null?void 0:n("waiting"),onStalled:()=>n==null?void 0:n("stalled"),onSuspend:()=>n==null?void 0:n("suspend"),hidden:!0})]})}function wJ(e){return e==="watch"}const SJ=Jy({marker:"data-stream-panel-detail",globalName:"__streamPanelDetail",file:"panel-detail",label:"详情"}),jJ=Jy({marker:"data-stream-panel-movie",globalName:"__streamPanelMovie",file:"panel-movie",label:"影视"}),UM=60,CJ="420px",kJ="min(1100px, 100vw)";function NJ({onWidthChange:e,onChannelNavState:t,registerChannelSetter:n,registerChannelReloader:r,onItemContext:a}={}){const[o,c]=p.useState([]),[d,h]=p.useState(),[m,x]=p.useState(!1),[g,v]=p.useState([]),[S,b]=p.useState([]),[j,C]=p.useState(Rh),k=p.useRef([]);k.current=g;const N=p.useRef(0),[T,R]=p.useState(null),[A,O]=p.useState("content"),[z,_]=p.useState(0);p.useEffect(()=>{O("content")},[j]);const[V,B]=p.useState(null),G=p.useRef(null),I=p.useRef(void 0),H=p.useRef(!1),ee=p.useRef(null),X=p.useRef(null),{caps:M,status:U}=YZ(ut),K=WV(ut),ne=p.useMemo(()=>KV(ut),[]),[q,P]=p.useState(!1),[L,Y]=p.useState(!1),J=p.useRef(K.state);J.current=K.state;const $=p.useRef(void 0);p.useEffect(()=>{$.current=U==="ready"?M:void 0},[M,U]);const[se,oe]=p.useState(!1),[ie,Z]=p.useState(),ve=p.useRef(null),Te=p.useRef(null),[Ee,Ie]=p.useState(!1),[Fe,fe]=p.useState(!1),[Se,ye]=p.useState(),Xe=p.useRef(null),nt=p.useRef(null),[re,_e]=p.useState(!1),[Pe,We]=p.useState(),ge=p.useCallback(()=>{be.channels(ut).then(Me=>v(Me)).catch(()=>{}),be.spaces(ut).then(Me=>b(Me)).catch(()=>{})},[]);p.useEffect(()=>{ge()},[ge]),p.useEffect(()=>Fk(be.wsUrl(ut),ge),[ge]);const Ge=e===void 0,je=g.find(Me=>Me.id===j),kt=(je==null?void 0:je.present)==="video",zt=Ge&&(je==null?void 0:je.present)==="audio",Xn=kt&&Ge,fn=(je==null?void 0:je.present)==="research",Qn=(je==null?void 0:je.present)==="tasks",sn=(je==null?void 0:je.present)==="embed",Zn=sn?EJ(je==null?void 0:je.options):void 0,we=p.useRef(void 0);we.current=je;const Oe=p.useMemo(()=>g.filter(Me=>Me.id===j),[g,j]),lt=p.useRef(Oe);lt.current=Oe,p.useEffect(()=>{const Me=++N.current;ee.current!==null&&(ee.current.scrollTop=0),c([]),h(void 0),I.current=void 0,H.current=!1,x(!1),!(kt||zt||fn||Qn||sn)&&be.channelItems(ut,j,{limit:UM}).then(Ue=>{Me===N.current&&(c(Ue.items),I.current=Ue.next_cursor)}).catch(Ue=>{Me===N.current&&h(Ue instanceof Error?Ue.message:String(Ue))})},[j,kt,zt,fn,Qn,sn]);const an=p.useCallback(()=>{const Me=I.current;if(!Me||H.current)return;const Ue=N.current;H.current=!0,x(!0),be.channelItems(ut,j,{limit:UM,cursor:Me}).then(ke=>{Ue===N.current&&(c(ft=>{const Pt=new Set(ft.map(Qt=>Qt.id));return[...ft,...ke.items.filter(Qt=>!Pt.has(Qt.id))]}),I.current=ke.next_cursor)}).catch(()=>{}).finally(()=>{Ue===N.current&&(H.current=!1,x(!1))})},[j]),en=T!==null;p.useEffect(()=>{e==null||e(en?kJ:CJ)},[en,e]),p.useEffect(()=>{t==null||t({spaces:S.map(Me=>({id:Me.id,label:Me.label})),channels:MR(g).map(Me=>({id:Me.id,label:Me.label,supported:Ay(Me),space_id:Me.space_id})),active:j})},[S,g,j,t]),p.useEffect(()=>{a==null||a({open:T===null?null:_R(T.item),recent:o.slice(0,oY).map(_R),fullscreen:en||Fe})},[o,T,en,Fe,a]),p.useEffect(()=>{n==null||n(Me=>{C(Ue=>{const ke=k.current.find(ft=>ft.id===Me);return ke!==void 0&&Ay(ke)?Me:Ue})})},[n]),p.useEffect(()=>{r==null||r(ge)},[r,ge]),p.useEffect(()=>{if(T===null)return;oe(!1),Z(void 0);let Me=!1,Ue;return SJ.load(ut.baseUrl).then(ke=>{Me||X.current===null||(ke.mount(X.current,{backend:ut.baseUrl,item:T.item,startMediaIndex:T.mediaIndex,autoPlayMedia:T.autoPlay,extractCaps:$.current,askChat:PL(),onClose:()=>R(null)}),Ue=ke,oe(!0))}).catch(ke=>{Me||Z(ke instanceof Error?ke.message:String(ke))}),()=>{Me=!0;const ke=Ue;ke!==void 0&&queueMicrotask(()=>ke.unmount())}},[T]);const bt=p.useCallback(Me=>{var ft;const Ue=DY(o,ut.baseUrl,"podcast"),ke=Ue.findIndex(Pt=>Pt.id===Me.id);ke>=0&&((ft=G.current)==null||ft.playQueue(Ue,ke,"podcast"))},[o]),Ft=p.useCallback(()=>{const Me=be.refreshChannel(ut,j);Ke.promise(Me,{loading:"正在重新抓取…",success:Ue=>{const ke=`抓取完成:取到 ${Ue.fetched} 条,新增 ${Ue.written} 条`;return Ue.failed>0?`${ke}(${Ue.failed}/${Ue.streams.length} 条源没成)`:ke},error:Ue=>`抓取失败:${Ue instanceof Error?Ue.message:String(Ue)}`}),Me.catch(()=>{if(J.current!=="never-seen")return;const Ue=new Date;QV("harvest",ZV("harvest"),Ue)&&(JV("harvest",Ue),Y(!0))}).finally(()=>ge())},[j,ge]);p.useEffect(()=>{if(!Xn)return;Ie(!1),ye(void 0),fe(!1);let Me=!1,Ue;return jJ.load(ut.baseUrl).then(ke=>{Me||ve.current===null||(ke.mount(ve.current,{backend:ut.baseUrl,channels:lt.current,onChannelsChanged:ge,onReload:Ft,onOverlayChange:fe}),Ue=ke,Te.current=ke,Ie(!0))}).catch(ke=>{Me||ye(ke instanceof Error?ke.message:String(ke))}),()=>{Me=!0,Te.current=null;const ke=Ue;ke!==void 0&&queueMicrotask(()=>ke.unmount())}},[Xn,j,ge,Ft]),p.useEffect(()=>{var Me;Ee&&((Me=Te.current)==null||Me.update({backend:ut.baseUrl,channels:Oe,onChannelsChanged:ge,onReload:Ft,onOverlayChange:fe}))},[Ee,Oe,ge,Ft]),p.useEffect(()=>{if(!fn||je===void 0)return;_e(!1),We(void 0);let Me=!1,Ue;return gQ.load(ut.baseUrl).then(ke=>{if(Me||Xe.current===null)return;const ft=we.current;ft!==void 0&&(ke.mount(Xe.current,{backend:ut.baseUrl,channel:ft,onChannelsChanged:ge}),Ue=ke,nt.current=ke,_e(!0))}).catch(ke=>{Me||We(ke instanceof Error?ke.message:String(ke))}),()=>{Me=!0,nt.current=null;const ke=Ue;ke!==void 0&&queueMicrotask(()=>ke.unmount())}},[fn,j]),p.useEffect(()=>{var Me;!re||je===void 0||(Me=nt.current)==null||Me.update({backend:ut.baseUrl,channel:je,onChannelsChanged:ge})},[re,je,ge]);const Sn=p.useCallback(Me=>{const Ue=Me.currentTarget;Ue.scrollHeight-Ue.scrollTop-Ue.clientHeight<Ue.clientHeight&&an()},[an]);return l.jsx(qZ,{caps:M,children:l.jsxs("div",{className:"relative flex h-full flex-col text-foreground",children:[l.jsx(OL,{}),K.state==="never-seen"&&K.declinedAt===void 0&&!q&&l.jsx(Pk,{variant:"banner",actions:ne,onDismiss:()=>P(!0),onConnected:K.refresh}),L&&K.state==="never-seen"&&l.jsx(YV,{actions:ne,onConnected:K.refresh}),t===void 0?l.jsx(iY,{channels:g,selected:j,onSelect:Me=>C(Me)}):null,l.jsx(bJ,{stageRef:G,children:kt?Ge?l.jsxs("div",{"data-testid":"panel-movie-host",className:"relative min-h-0 flex-1",children:[l.jsx("div",{ref:ve,className:"absolute inset-0 flex flex-col"}),Se!==void 0?l.jsxs("div",{"data-testid":"panel-movie-error",className:"absolute inset-0 flex items-center justify-center p-4 text-center text-sm text-destructive",children:["影视频道加载失败:",Se]}):Ee?null:l.jsx("div",{"data-testid":"panel-movie-loading",className:"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground",children:"加载中…"})]}):l.jsx("div",{"data-testid":"panel-movie-too-narrow",className:"p-4 text-sm text-muted-foreground",children:"影视频道要更宽的版面,请在工作台里打开。"}):zt&&je!==void 0?l.jsx(pQ,{channel:je,onChannelsChanged:ge,onReload:Ft}):fn?l.jsxs("div",{"data-testid":"panel-research-host",className:"relative min-h-0 flex-1",children:[l.jsx("div",{ref:Xe,className:"absolute inset-0 flex flex-col"}),Pe!==void 0?l.jsxs("div",{"data-testid":"panel-research-error",className:"absolute inset-0 flex items-center justify-center p-4 text-center text-sm text-destructive",children:["研究频道加载失败:",Pe]}):re?null:l.jsx("div",{"data-testid":"panel-research-loading",className:"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground",children:"加载中…"})]}):Qn?l.jsx("div",{"data-testid":"panel-tasks-host",className:"min-h-0 flex-1",children:l.jsx(BQ,{apiBase:ut.baseUrl,title:(je==null?void 0:je.label)??"定时任务"})}):sn&&je!==void 0?l.jsxs(l.Fragment,{children:[l.jsx("div",{"data-testid":"panel-timeline-header",className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:l.jsx(Lf,{title:je.label,onRefresh:()=>_(Me=>Me+1),refreshLabel:"重新载入面板",exportChannel:{conn:ut,id:je.id},className:"min-w-0 flex-1"})}),l.jsx(Cy,{value:A,onChange:O}),A==="config"?l.jsx("div",{"data-testid":"panel-config",className:"min-h-0 flex-1 overflow-y-auto",children:l.jsx(Cx,{conn:ut,children:l.jsx(jy,{conn:ut,channelId:je.id,showHeader:!1,onChanged:ge,onDeleted:()=>{O("content"),C(Rh)}})})}):Zn!==void 0?l.jsx("iframe",{"data-testid":"panel-embed-frame",title:je.label,src:Zn,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups",className:"min-h-0 w-full flex-1 border-0 bg-background"},`${Zn}#${z}`):l.jsx("div",{"data-testid":"panel-embed-empty",className:"flex flex-1 items-center justify-center p-6 text-center text-sm text-muted-foreground",children:"这个外接面板还没有地址。到「配置」分页填一个 http(s) 网址,这里就会整页装它。"})]}):l.jsxs(l.Fragment,{children:[l.jsx("div",{"data-testid":"panel-timeline-header",className:"flex h-8 shrink-0 items-center gap-2 px-4 pt-3 pb-0 box-content",children:l.jsx(Lf,{title:(je==null?void 0:je.label)??"时间线",onRefresh:Ft,exportChannel:je?{conn:ut,id:je.id}:void 0,className:"min-w-0 flex-1"})}),je!==void 0?l.jsx(Cy,{value:A,onChange:O}):null,A==="config"&&je!==void 0?l.jsx("div",{"data-testid":"panel-config",className:"min-h-0 flex-1 overflow-y-auto",children:l.jsx(Cx,{conn:ut,children:l.jsx(jy,{conn:ut,channelId:je.id,showHeader:!1,onChanged:ge,onDeleted:()=>{O("content"),C(Rh)},onEditStream:B})})}):d!==void 0?l.jsxs("div",{"data-testid":"panel-error",className:"p-4 text-sm text-destructive",children:["取内容失败:",d]}):l.jsxs("div",{ref:ee,"data-testid":"panel-scroll",className:"min-h-0 flex-1 overflow-y-auto p-5",onScroll:Sn,children:[l.jsx(gJ,{items:o,layout:"waterfall",channelId:j,onOpen:(Me,Ue)=>R({item:Me,mediaIndex:(Ue==null?void 0:Ue.mediaIndex)??0,autoPlay:wJ(Ue==null?void 0:Ue.intent)}),onPlayAudio:bt}),m?l.jsx("div",{className:"py-3 text-center text-xs text-muted-foreground",children:"加载中…"}):null]})]})}),T!==null?l.jsxs(l.Fragment,{children:[l.jsx("div",{ref:X,className:"absolute inset-0"}),ie!==void 0?l.jsxs("div",{className:"absolute inset-0 flex items-center justify-center p-4 text-center text-sm text-destructive",children:["详情加载失败:",ie]}):se?null:l.jsx("div",{className:"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground",children:"加载中…"})]}):null,V!==null?l.jsx("div",{"data-testid":"panel-stream-setting",className:"absolute inset-0 z-10 flex flex-col bg-background",children:l.jsx(aY,{conn:ut,channelId:j,channelName:je==null?void 0:je.label,stream:V,onBack:()=>B(null),onSaved:ge})}):null]})})}function EJ(e){const t=e==null?void 0:e.url;if(!(typeof t!="string"||t.trim()===""))try{const n=new URL(t);return n.protocol==="http:"||n.protocol==="https:"?t:void 0}catch{return}}const VM="data-ds-dark-theme";function TJ(){return document.body.hasAttribute(VM)}function RJ(e){const t=()=>{const r=TJ();e.classList.toggle("dark",r),document.body.classList.toggle("dark",r)};t();const n=new MutationObserver(t);return n.observe(document.body,{attributes:!0,attributeFilter:[VM]}),()=>{n.disconnect(),document.body.classList.remove("dark")}}let Dl,zu,Pu,Lu;function AJ(e){Pu==null||Pu(e)}function MJ(){Lu==null||Lu()}function DJ(e,t){LP(t.backend,t.backend.replace(/^http/,"ws")),P1(t.onAskChat),zu=RJ(e),Dl=_z.createRoot(e),Dl.render(l.jsx(p.StrictMode,{children:l.jsx(NJ,{onWidthChange:t.manageWidth===!1?void 0:n=>{e.style.width=n},onChannelNavState:t.onChannelNavState,onItemContext:t.onItemContext,registerChannelSetter:t.onChannelNavState===void 0?void 0:n=>{Pu=n},registerChannelReloader:n=>{Lu=n}})}))}function _J(){Dl==null||Dl.unmount(),Dl=void 0,zu==null||zu(),zu=void 0,Pu=void 0,Lu=void 0,P1(void 0)}const OJ=Object.freeze(Object.defineProperty({__proto__:null,default:class Cz{constructor(t,n){this.id=t,this.listeners=n}static async connect(t,n){const r=new Set,a=new aF;return a.onmessage=o=>{r.forEach(c=>{c(o)})},n!=null&&n.headers&&(n.headers=Array.from(new Headers(n.headers).entries())),await Bk("plugin:websocket|connect",{url:t,onMessage:a,config:n}).then(o=>new Cz(o,r))}addListener(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}async send(t){let n;if(typeof t=="string")n={type:"Text",data:t};else if(typeof t=="object"&&"type"in t)n=t;else if(Array.isArray(t))n={type:"Binary",data:t};else throw new Error("invalid `message` type, expected a `{ type: string, data: any }` object, a string or a numeric array");await Bk("plugin:websocket|send",{id:this.id,message:n})}async disconnect(){await this.send({type:"Close",data:{code:1e3,reason:"Disconnected by client"}})}}},Symbol.toStringTag,{value:"Module"}));return Zt.mount=DJ,Zt.reloadChannels=MJ,Zt.setChannel=AJ,Zt.unmount=_J,Object.defineProperty(Zt,Symbol.toStringTag,{value:"Module"}),Zt})({});