mirror of
https://github.com/TheBinaryNinja/tvapp2.git
synced 2026-06-11 19:05:41 -04:00
2 lines
30 KiB
JavaScript
2 lines
30 KiB
JavaScript
import{v as Z,r as u,y as K,H as i,o as e,u as l,N as o,e as k,X as p,_ as x,F as V,K as O,q as D,t as d,h as ge,p as T,Y as F,T as ae,O as P,G as fe,U as oe,J as b,n as h,f,k as Me,z as te,W as Ee,V as ce,g as le,j as Ue,Z as H,b as Le,w as Ve,i as me}from"./index-CQPQcDLN.js";import{u as ye,m as Ge,p as Ie,a as Re}from"./useSettings-CPUgOpin.js";import{_ as W}from"./Stat.vue_vue_type_script_setup_true_lang-BLQk8QX-.js";const Te=["aria-checked"],ne=Z({__name:"Checkbox",props:{on:{type:Boolean}},emits:["change"],setup(S,{emit:B}){const _=S,E=B;function m(g){g.stopPropagation(),E("change",!_.on)}return(g,U)=>(i(),u("div",{class:K(["cbx",{on:_.on}]),role:"checkbox","aria-checked":!!_.on,onClick:m},null,10,Te))}}),Oe={class:"drawer-wrap"},Be={class:"glass drawer-panel"},Ne={class:"drawer-hd"},je={class:"src-ico",style:{width:"44px",height:"44px","border-radius":"10px"}},Ke={style:{flex:"1"}},He={style:{"font-weight":"600","font-size":"15px"}},Fe={class:"drawer-body"},Ye={style:{border:"1px solid var(--hairline)","border-radius":"10px",padding:"10px 12px",background:"var(--bg-2)","max-height":"168px",overflow:"auto"}},qe={class:"row",style:{gap:"8px","margin-bottom":"8px"}},Je={class:"mono muted",style:{"font-size":"var(--fs-xs)","min-width":"32px"}},We={style:{"font-weight":"500"}},Xe={class:"muted",style:{"font-size":"var(--fs-xs)"}},Ze={key:0,class:"muted",style:{"font-size":"var(--fs-xs)","padding-top":"6px"}},Qe={class:"form-row"},es={class:"field-lbl"},ss={key:0,class:"muted",style:{"font-size":"var(--fs-xs)","margin-left":"6px"}},ts={class:"row",style:{gap:"10px"}},ls={class:"form-row"},ns={class:"field-lbl"},as={key:0,class:"muted",style:{"font-size":"var(--fs-xs)","margin-left":"6px"}},os={class:"select"},is={value:""},ds=["value"],us={class:"form-row"},rs={class:"field-lbl"},vs={key:0,class:"muted",style:{"font-size":"var(--fs-xs)","margin-left":"6px"}},ps={class:"input"},cs=["placeholder"],ms={class:"row",style:{"margin-top":"6px"}},gs=Z({__name:"ChannelBulkDrawer",props:{channels:{}},emits:["close","apply"],setup(S,{emit:B}){const _=S,E=B,m=b(""),g=b(""),U=b(""),G=h(()=>new Set(_.channels.map(r=>r.state)).size>1),I=h(()=>new Set(_.channels.map(r=>r.group)).size>1),c=h(()=>new Set(_.channels.map(r=>r.source)).size>1),A=h(()=>{var v;return G.value?"":((v=_.channels[0])==null?void 0:v.state)??""}),M=h(()=>{var v;return I.value?"":((v=_.channels[0])==null?void 0:v.group)??""}),$=h(()=>{var v;return c.value?"":((v=_.channels[0])==null?void 0:v.source)??""});function y(v){m.value=v}function n(){const v={};m.value&&m.value!==A.value&&(v.state=m.value),g.value&&g.value!==M.value&&(v.group=g.value),U.value&&U.value!==$.value&&(v.source=U.value),E("apply",v),E("close")}return(v,r)=>(i(),u("div",Oe,[e("div",{class:"glass-bg drawer-backdrop",onClick:r[0]||(r[0]=z=>E("close"))}),e("div",Be,[e("div",Ne,[e("div",je,[l(f,{name:"edit",size:20})]),e("div",Ke,[e("div",He,"Edit "+o(S.channels.length)+" channels",1),r[5]||(r[5]=e("div",{class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"2px"}}," Apply changes to all selected channels ",-1))]),l(k,{variant:"ghost",size:"sm",icon:"x",onClick:r[1]||(r[1]=z=>E("close"))})]),e("div",Fe,[e("div",Ye,[e("div",qe,[l(f,{name:"check",size:13,style:{color:"var(--good)"}}),r[6]||(r[6]=e("span",{style:{"font-weight":"600","font-size":"var(--fs-sm)"}},"Channels being edited",-1)),r[7]||(r[7]=e("span",{class:"spacer"},null,-1)),l(x,{tone:"cyan"},{default:p(()=>[d(o(S.channels.length),1)]),_:1})]),(i(!0),u(V,null,O(S.channels.slice(0,8),z=>(i(),u("div",{key:z.id,class:"row",style:{gap:"8px",padding:"3px 0","font-size":"var(--fs-sm)"}},[e("span",Je,"#"+o(z.channel),1),e("span",We,o(z.tvg_name),1),e("span",Xe,"· "+o(z.group),1)]))),128)),S.channels.length>8?(i(),u("div",Ze," + "+o(S.channels.length-8)+" more ",1)):D("",!0)]),r[13]||(r[13]=e("div",{class:"divider"},null,-1)),e("div",Qe,[e("div",es,[r[8]||(r[8]=d(" State ",-1)),G.value?(i(),u("span",ss,"· mixed — leave unchanged")):D("",!0)]),e("div",ts,[l(ge,{value:m.value||A.value,onChange:y,options:[{value:"active",label:"Active",icon:"check"},{value:"disabled",label:"Disabled",icon:"x"}]},null,8,["value"]),m.value?(i(),T(x,{key:0,tone:m.value==="active"?"active":"disabled"},{default:p(()=>[d(o(m.value==="active"?"active":"disabled"),1)]),_:1},8,["tone"])):G.value?D("",!0):(i(),T(x,{key:1,tone:A.value==="active"?"active":"disabled"},{default:p(()=>[d(o(A.value),1)]),_:1},8,["tone"]))])]),e("div",ls,[e("div",ns,[r[9]||(r[9]=d(" Group ",-1)),I.value?(i(),u("span",as,"· mixed — leave unchanged")):D("",!0)]),e("div",os,[F(e("select",{"onUpdate:modelValue":r[2]||(r[2]=z=>g.value=z)},[e("option",is,o(I.value?"Leave unchanged (mixed)":`Leave unchanged (${M.value})`),1),(i(!0),u(V,null,O(P(fe),z=>(i(),u("option",{key:z,value:z},o(z),9,ds))),128))],512),[[ae,g.value]])])]),e("div",us,[e("div",rs,[r[10]||(r[10]=d(" Source ",-1)),c.value?(i(),u("span",vs,"· mixed — leave unchanged")):D("",!0)]),e("div",ps,[l(f,{name:"playlist",size:14}),F(e("input",{"onUpdate:modelValue":r[3]||(r[3]=z=>U.value=z),placeholder:c.value?"Leave unchanged (mixed)":`Leave unchanged (${$.value})`},null,8,cs),[[oe,U.value]])])]),e("div",ms,[r[12]||(r[12]=e("span",{class:"spacer"},null,-1)),l(k,{variant:"ghost",onClick:r[4]||(r[4]=z=>E("close"))},{default:p(()=>[...r[11]||(r[11]=[d("Cancel",-1)])]),_:1}),l(k,{variant:"primary",icon:"check",onClick:n},{default:p(()=>[d(" Apply to "+o(S.channels.length)+" channels ",1)]),_:1})])])])]))}}),fs={class:"drawer-wrap"},ys={class:"glass drawer-panel",style:{width:"50vw","max-width":"50vw","min-width":"440px"}},xs={class:"drawer-hd"},hs={style:{flex:"1"}},bs={class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"2px"}},ws={class:"drawer-body"},ks={class:"form-row"},_s={class:"row",style:{gap:"10px","align-items":"center"}},$s={class:"muted",style:{"font-size":"var(--fs-xs)"}},zs={class:"form-row"},Cs={style:{display:"grid",gap:"8px"}},Ss=["checked"],As={style:{flex:"1"}},Ps={class:"muted mono",style:{"font-size":"var(--fs-xs)","margin-top":"2px"}},Ds=["checked"],Ms={style:{flex:"1"}},Es={class:"mono",style:{padding:"0 8px 0 10px",color:"var(--text-3)","font-size":"11px","border-right":"1px solid var(--hairline)","align-self":"stretch",display:"flex","align-items":"center"}},Us={class:"form-row"},Ls={class:"row",style:{gap:"8px"}},Vs={class:"input mono",style:{flex:"1","font-size":"12px"}},Gs=["value"],Is={style:{display:"grid",gap:"8px"}},Rs={class:"row",style:{gap:"10px",padding:"8px 12px",border:"1px solid var(--hairline)","border-radius":"8px",background:"var(--bg-2)"}},Ts={class:"row",style:{gap:"10px",padding:"8px 12px",border:"1px solid var(--hairline)","border-radius":"8px",background:"var(--bg-2)"}},Os={style:{border:"1px solid var(--hairline)","border-radius":"8px",background:"var(--bg-2)",padding:"8px 12px"}},Bs={class:"row",style:{gap:"8px","margin-bottom":"6px"}},Ns={style:{"font-weight":"500"}},js={class:"mono muted",style:{"font-size":"var(--fs-xs)"}},Ks={class:"row",style:{"margin-top":"6px"}},Hs=Z({__name:"PlaylistStatusDrawer",props:{playlist:{},channels:{}},emits:["close"],setup(S,{emit:B}){const _=S,E=B,m=ye(_.playlist.id),g=h(()=>_.channels.filter(y=>y.epg==="matched").length),U=h(()=>_.channels.length-g.value),G=h(()=>{const y=new Map;for(const n of _.channels)y.set(n.group,(y.get(n.group)||0)+1);return[...y.entries()].sort((n,v)=>v[1]-n[1])}),I=h(()=>Ie(_.playlist.id)),c=h(()=>Re.value.replace(/\/$/,"")),A=b(!1);function M(){var y;try{(y=navigator.clipboard)==null||y.writeText(I.value)}catch{}A.value=!0,setTimeout(()=>A.value=!1,1400)}function $(y){m.endpointMode=y}return(y,n)=>(i(),u("div",fs,[e("div",{class:"glass-bg drawer-backdrop",onClick:n[0]||(n[0]=v=>E("close"))}),e("div",ys,[e("div",xs,[e("div",{class:K(["src-ico",{builtin:S.playlist.builtin}]),style:{width:"44px",height:"44px","border-radius":"10px"}},[l(f,{name:"globe",size:20})],2),e("div",hs,[n[7]||(n[7]=e("div",{style:{"font-weight":"600","font-size":"15px"}},"Playlist status",-1)),e("div",bs,o(S.playlist.name),1)]),l(k,{variant:"ghost",size:"sm",icon:"x",onClick:n[1]||(n[1]=v=>E("close"))})]),e("div",ws,[e("div",ks,[n[8]||(n[8]=e("div",{class:"field-lbl"},"State",-1)),e("div",_s,[l(Me,{on:P(m).active,onChange:n[2]||(n[2]=v=>P(m).active=v)},null,8,["on"]),l(x,{tone:P(m).active?"active":"disabled"},{default:p(()=>[d(o(P(m).active?"Active":"Inactive"),1)]),_:1},8,["tone"]),e("span",$s,o(P(m).active?"Playlist is being served at the endpoint below.":"Endpoint is paused. Downstream clients will receive 404."),1)])]),n[24]||(n[24]=e("div",{class:"divider"},null,-1)),e("div",zs,[n[13]||(n[13]=e("div",{class:"field-lbl"},"Endpoint",-1)),e("div",Cs,[e("label",{class:"row",style:te([{gap:"10px",padding:"8px 10px",border:"1px solid var(--hairline)","border-radius":"8px",cursor:"pointer"},P(m).endpointMode==="global"?"border-color: var(--accent); background: var(--accent-soft);":""])},[e("input",{type:"radio",name:"endpoint-mode",checked:P(m).endpointMode==="global",onChange:n[3]||(n[3]=v=>$("global"))},null,40,Ss),e("div",As,[n[9]||(n[9]=e("div",{style:{"font-weight":"500","font-size":"var(--fs-sm)"}},"Global",-1)),e("div",Ps,o(P(Ge)),1),n[10]||(n[10]=e("div",{class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"2px"}},"Uses the M3U endpoint defined in Settings.",-1))])],4),e("label",{class:"row",style:te([{gap:"10px",padding:"8px 10px",border:"1px solid var(--hairline)","border-radius":"8px",cursor:"pointer","align-items":"flex-start"},P(m).endpointMode==="custom"?"border-color: var(--accent); background: var(--accent-soft);":""])},[e("input",{type:"radio",name:"endpoint-mode",checked:P(m).endpointMode==="custom",onChange:n[4]||(n[4]=v=>$("custom")),style:{"margin-top":"4px"}},null,40,Ds),e("div",Ms,[n[11]||(n[11]=e("div",{style:{"font-weight":"500","font-size":"var(--fs-sm)"}},"Custom",-1)),n[12]||(n[12]=e("div",{class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"2px","margin-bottom":"6px"}}," Host this playlist at a custom path on the Domain from Settings. ",-1)),e("div",{class:K(["input","mono"]),style:te([{"font-size":"12px"},P(m).endpointMode==="custom"?"":"opacity: 0.55; pointer-events: none;"])},[e("span",Es,o(c.value),1),F(e("input",{"onUpdate:modelValue":n[5]||(n[5]=v=>P(m).customPath=v),placeholder:"/playlists/my-playlist.m3u"},null,512),[[oe,P(m).customPath]])],4)])],4)])]),n[25]||(n[25]=e("div",{class:"divider"},null,-1)),e("div",Us,[n[14]||(n[14]=e("div",{class:"field-lbl"},"Hosted at",-1)),e("div",Ls,[e("div",Vs,[l(f,{name:"globe",size:14}),e("input",{value:I.value,readonly:""},null,8,Gs)]),l(k,{variant:"ghost",size:"sm",icon:A.value?"check":"copy",onClick:M},{default:p(()=>[d(o(A.value?"Copied":"Copy"),1)]),_:1},8,["icon"])])]),n[26]||(n[26]=e("div",{class:"divider"},null,-1)),n[27]||(n[27]=e("div",{class:"field-lbl",style:{"margin-bottom":"10px"}},"Summary",-1)),e("div",Is,[e("div",Rs,[l(f,{name:"check",size:13,style:{color:"var(--good)"}}),n[15]||(n[15]=e("span",{style:{"font-size":"var(--fs-sm)"}},"EPG matched",-1)),n[16]||(n[16]=e("span",{class:"spacer"},null,-1)),l(x,{tone:"good"},{default:p(()=>[d(o(g.value),1)]),_:1})]),e("div",Ts,[l(f,{name:"warn",size:13,style:{color:"var(--warn)"}}),n[17]||(n[17]=e("span",{style:{"font-size":"var(--fs-sm)"}},"EPG unmatched",-1)),n[18]||(n[18]=e("span",{class:"spacer"},null,-1)),l(x,{tone:"warn"},{default:p(()=>[d(o(U.value),1)]),_:1})]),e("div",Os,[e("div",Bs,[l(f,{name:"grid",size:13}),n[19]||(n[19]=e("span",{style:{"font-weight":"600","font-size":"var(--fs-sm)"}},"Channels per category",-1)),n[20]||(n[20]=e("span",{class:"spacer"},null,-1)),l(x,{tone:"cyan"},{default:p(()=>[d(o(G.value.length),1)]),_:1})]),(i(!0),u(V,null,O(G.value,([v,r])=>(i(),u("div",{key:v,class:"row",style:{gap:"8px",padding:"3px 0","font-size":"var(--fs-sm)"}},[e("span",Ns,o(v),1),n[21]||(n[21]=e("span",{class:"spacer"},null,-1)),e("span",js,o(r),1)]))),128))])]),e("div",Ks,[n[23]||(n[23]=e("span",{class:"spacer"},null,-1)),l(k,{variant:"primary",icon:"check",onClick:n[6]||(n[6]=v=>E("close"))},{default:p(()=>[...n[22]||(n[22]=[d("Done",-1)])]),_:1})])])])]))}}),Fs={class:"col"},Ys={class:"card",style:{display:"flex","align-items":"center",gap:"16px"}},qs={style:{flex:"1"}},Js={class:"row",style:{gap:"10px"}},Ws={style:{margin:"0","font-size":"18px","font-weight":"600"}},Xs={class:"src-url",style:{"margin-top":"4px"}},Zs={key:0,class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"6px"}},Qs={class:"row",style:{gap:"18px"}},et={class:"card flush"},st={class:"toolbar"},tt={class:"select"},lt={key:0,class:"tbl"},nt={style:{width:"40px"}},at=["onClick"],ot={class:"mono muted"},it={class:"row",style:{gap:"10px"}},dt=["value","onBlur","onKeydown"],ut=["onDblclick"],rt={class:"muted"},vt={class:"mono muted"},pt={key:1,style:{color:"var(--text-3)"}},ct={class:"row",style:{gap:"6px"}},mt={class:"muted",style:{"font-size":"var(--fs-xs)"}},gt={key:1,class:"ch-grid"},ft=["onClick"],yt={class:"cbx-pos"},xt={class:"top"},ht={style:{"min-width":"0"}},bt={class:"name"},wt={class:"meta mono",style:{"margin-top":"4px"}},kt={class:"meta"},_t={class:"row"},$t={class:"modal-hd"},zt={class:"modal-body"},Ct={class:"row",style:{gap:"8px",padding:"8px 10px",background:"var(--accent-soft)","border-radius":"8px","align-items":"center"}},St={style:{"font-size":"var(--fs-sm)",color:"var(--text-1)"}},At={style:{color:"var(--accent-hi)"}},Pt={class:"form-row"},Dt={class:"input"},Mt={class:"form-row"},Et=["value"],Ut={class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"6px",display:"flex","align-items":"center",gap:"6px"}},Lt={key:0,style:{color:"var(--bad)"}},Vt={key:1,style:{color:"var(--bad)"}},Gt={class:"mono",style:{color:"var(--text-1)"}},It={style:{border:"1px solid var(--hairline)","border-radius":"10px",padding:"10px 12px",background:"var(--bg-2)","max-height":"168px",overflow:"auto"}},Rt={class:"row",style:{gap:"8px","margin-bottom":"8px"}},Tt={class:"mono muted",style:{"font-size":"var(--fs-xs)","min-width":"32px"}},Ot={style:{"font-weight":"500"}},Bt={class:"muted",style:{"font-size":"var(--fs-xs)"}},Nt={key:0,class:"muted",style:{"font-size":"var(--fs-xs)","padding-top":"6px"}},jt={class:"modal-ft"},Kt={class:"modal-hd"},Ht={class:"modal-body"},Ft={class:"row",style:{gap:"8px",padding:"8px 10px",background:"var(--accent-soft)","border-radius":"8px","align-items":"center"}},Yt={style:{"font-size":"var(--fs-sm)",color:"var(--text-1)"}},qt={style:{color:"var(--accent-hi)"}},Jt={key:0,class:"empty",style:{padding:"28px 20px","text-align":"center"}},Wt={class:"form-row"},Xt={class:"select"},Zt=["value"],Qt={key:0,style:{border:"1px solid var(--hairline)","border-radius":"10px",padding:"12px 14px",background:"var(--bg-2)",display:"grid",gap:"10px"}},el={class:"row",style:{gap:"10px"}},sl={class:"src-ico",style:{width:"40px",height:"40px","border-radius":"10px"}},tl={style:{flex:"1","min-width":"0"}},ll={style:{"font-weight":"600","font-size":"var(--fs-sm)"}},nl={class:"mono muted",style:{"font-size":"var(--fs-xs)","margin-top":"2px"}},al={class:"muted",style:{"font-size":"var(--fs-xs)"}},ol={class:"row",style:{gap:"10px","align-items":"center","padding-top":"8px","border-top":"1px dashed var(--hairline)"}},il={style:{color:"var(--accent-hi)"}},dl={class:"modal-ft"},ul={key:4,class:"custom-toast"},cl=Z({__name:"PlaylistDetailScreen",props:{id:{}},setup(S){const B=S,_=Ve("openChannel"),m=b({id:"",name:"…",url:"",channels:0,groups:0,lastSync:"",status:"good",auto:!1,interval:""}),g=h(()=>m.value),U=b("table"),G=b(""),I=b("all"),c=b(new Set),A=b(null),M=b([]);Ee(async()=>{const a=B.id;if(!a)return;const[s,t]=await Promise.all([fetch(`/api/playlists/${encodeURIComponent(a)}`),fetch(`/api/playlists/${encodeURIComponent(a)}/channels`)]);s.ok&&(m.value=await s.json()),t.ok&&(M.value=await t.json())});const $=b(null),y=b([...Le]),n=b(null),v=b(!1),r=b(!1),z=h(()=>ye(g.value.id)),Y=b(null);function ie(a,s){const t=s.ctrlKey||s.metaKey;if(t&&s.shiftKey){xe(a.id),Y.value=a.id;return}if(t){Q(a.id),Y.value=a.id;return}c.value.size>=2?v.value=!0:_(a)}function xe(a){const s=N.value.map(J=>J.id),t=s.indexOf(a);if(t<0)return;const w=Y.value?s.indexOf(Y.value):-1,q=w<0?t:Math.min(w,t),De=Math.max(w<0?t:w,t),pe=new Set(c.value);for(let J=q;J<=De;J++)pe.add(s[J]);c.value=pe}function he(a){if(!a.state&&!a.group&&!a.source){v.value=!1;return}const s=c.value,t=s.size;M.value=M.value.map(q=>s.has(q.id)?{...q,...a.state?{state:a.state}:{},...a.group?{group:a.group}:{},...a.source?{source:a.source}:{}}:q);const w=[];a.state&&w.push(`state → ${a.state}`),a.group&&w.push(`group → ${a.group}`),a.source&&w.push(`source → ${a.source}`),n.value={kind:"edit",text:`Updated ${t} channel${t===1?"":"s"} · ${w.join(", ")}`},v.value=!1,c.value=new Set}ce(n,a=>{a&&setTimeout(()=>n.value=null,3200)});const N=h(()=>M.value.filter(a=>(I.value==="all"||a.group===I.value)&&(G.value===""||a.tvg_name.toLowerCase().includes(G.value.toLowerCase())))),C=h(()=>M.value.filter(a=>c.value.has(a.id)));function Q(a){const s=new Set(c.value);s.has(a)?s.delete(a):s.add(a),c.value=s,Y.value=a}function be(){c.value.size===N.value.length?c.value=new Set:c.value=new Set(N.value.map(a=>a.id))}function de(a,s){M.value=M.value.map(t=>t.id===a?{...t,tvg_name:s}:t)}function we(a,s){de(a,s.target.value),A.value=null}function ke(a,s){s.key==="Enter"&&(de(a,s.target.value),A.value=null),s.key==="Escape"&&(A.value=null)}const j=b("My Custom Playlist"),ee=b(!1),L=b("my-custom-playlist");function _e(a){return a.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48)}ce(j,a=>{ee.value||(L.value=_e(a)||"custom-playlist")});const $e=h(()=>y.value.map(a=>a.slug)),ue=h(()=>$e.value.includes(L.value)),se=h(()=>L.value.length>0&&/^[a-z0-9-]+$/.test(L.value)&&!ue.value),ze=h(()=>j.value.trim().length>0),re=h(()=>ze.value&&se.value);function Ce(){j.value="My Custom Playlist",ee.value=!1,L.value="my-custom-playlist",$.value="create"}function Se(){if(!re.value)return;const a="cust-"+L.value+"-"+Date.now().toString(36);y.value=[{id:a,name:j.value.trim(),slug:L.value,channels:C.value.length,updated:"just now"},...y.value],n.value={kind:"create",text:`Created "${j.value.trim()}" · ${C.value.length} channels`},$.value=null,c.value=new Set}const X=b("");function Ae(){var a;X.value=((a=y.value[0])==null?void 0:a.id)||"",$.value="append"}const R=h(()=>y.value.find(a=>a.id===X.value)),ve=h(()=>R.value?R.value.channels+C.value.length:0);function Pe(){R.value&&(y.value=y.value.map(a=>a.id===R.value.id?{...a,channels:a.channels+C.value.length,updated:"just now"}:a),n.value={kind:"append",text:`Appended ${C.value.length} channel${C.value.length===1?"":"s"} to "${R.value.name}"`},$.value=null,c.value=new Set)}return(a,s)=>(i(),u("div",Fs,[e("div",Ys,[e("div",{class:K(["src-ico",{builtin:g.value.builtin}]),style:{width:"52px",height:"52px","border-radius":"12px"}},[l(f,{name:g.value.builtin?"tv":"playlist",size:22},null,8,["name"])],2),e("div",qs,[e("div",Js,[e("h2",Ws,o(g.value.name),1),l(le,{status:g.value.status,pulse:g.value.status==="good"},null,8,["status","pulse"]),g.value.builtin?(i(),T(x,{key:0,tone:"system"},{default:p(()=>[l(f,{name:"check",size:10}),s[22]||(s[22]=d("built-in",-1))]),_:1})):D("",!0),l(x,{tone:"cyan"},{default:p(()=>[d(o(g.value.interval),1)]),_:1})]),e("div",Xs,o(g.value.url),1),g.value.builtin?(i(),u("div",Zs," Ships with TVApp2 · channels are preconfigured and auto-updated with the app. ")):D("",!0)]),e("div",Qs,[l(k,{variant:"ghost",icon:"globe",onClick:s[0]||(s[0]=t=>r.value=!0)},{default:p(()=>[s[23]||(s[23]=d(" Status ",-1)),l(x,{tone:z.value.active?"active":"disabled",style:{"margin-left":"6px"}},{default:p(()=>[d(o(z.value.active?"Active":"Inactive"),1)]),_:1},8,["tone"])]),_:1}),l(W,{label:"Channels",value:g.value.channels},null,8,["value"]),l(W,{label:"Groups",value:g.value.groups},null,8,["value"]),l(W,{label:"Synced",value:g.value.lastSync,small:""},null,8,["value"])]),g.value.builtin?D("",!0):(i(),T(k,{key:0,variant:"ghost",icon:"refresh"},{default:p(()=>[...s[24]||(s[24]=[d("Sync now",-1)])]),_:1})),l(k,{variant:"ghost",icon:"more"})]),e("div",et,[e("div",st,[l(Ue,{value:G.value,onChange:s[1]||(s[1]=t=>G.value=t),placeholder:"Search channels"},null,8,["value"]),e("div",tt,[F(e("select",{"onUpdate:modelValue":s[2]||(s[2]=t=>I.value=t)},[s[25]||(s[25]=e("option",{value:"all"},"All groups",-1)),(i(!0),u(V,null,O(P(fe),t=>(i(),u("option",{key:t},o(t),1))),128))],512),[[ae,I.value]])]),l(x,null,{default:p(()=>[d(o(N.value.length)+" of "+o(M.value.length),1)]),_:1}),s[31]||(s[31]=e("span",{class:"spacer"},null,-1)),c.value.size>0?(i(),u(V,{key:0},[l(x,{tone:"cyan"},{default:p(()=>[d(o(c.value.size)+" selected",1)]),_:1}),l(k,{variant:"primary",size:"sm",icon:"plus",onClick:Ce},{default:p(()=>[...s[26]||(s[26]=[d("Create",-1)])]),_:1}),l(k,{variant:"ghost",size:"sm",icon:"playlist",onClick:Ae},{default:p(()=>[...s[27]||(s[27]=[d("Append",-1)])]),_:1}),s[30]||(s[30]=e("span",{class:"tbar-sep","aria-hidden":"true"},null,-1)),l(k,{variant:"ghost",size:"sm",icon:"trash"},{default:p(()=>[...s[28]||(s[28]=[d("Delete",-1)])]),_:1}),l(k,{variant:"ghost",size:"sm",onClick:s[3]||(s[3]=t=>c.value=new Set)},{default:p(()=>[...s[29]||(s[29]=[d("Clear",-1)])]),_:1})],64)):(i(),T(ge,{key:1,value:U.value,onChange:s[4]||(s[4]=t=>U.value=t),options:[{value:"table",label:"Table",icon:"list"},{value:"grid",label:"Grid",icon:"grid"}]},null,8,["value"]))]),U.value==="table"?(i(),u("table",lt,[e("thead",null,[e("tr",null,[e("th",nt,[l(ne,{on:c.value.size>0&&c.value.size===N.value.length,onChange:be},null,8,["on"])]),s[32]||(s[32]=e("th",{style:{width:"60px"}},"#",-1)),s[33]||(s[33]=e("th",null,"Channel",-1)),s[34]||(s[34]=e("th",null,"Group",-1)),s[35]||(s[35]=e("th",null,"Source",-1)),s[36]||(s[36]=e("th",null,"TVG-ID",-1)),s[37]||(s[37]=e("th",null,"State",-1)),s[38]||(s[38]=e("th",null,"EPG",-1)),s[39]||(s[39]=e("th",{style:{width:"80px"}},"Stream",-1)),s[40]||(s[40]=e("th",{style:{width:"60px"}},null,-1))])]),e("tbody",null,[(i(!0),u(V,null,O(N.value,t=>(i(),u("tr",{key:t.id,class:K({selected:c.value.has(t.id)}),onClick:w=>ie(t,w)},[e("td",{onClick:s[5]||(s[5]=H(()=>{},["stop"]))},[l(ne,{on:c.value.has(t.id),onChange:w=>Q(t.id)},null,8,["on","onChange"])]),e("td",ot,o(t.channel),1),e("td",null,[e("div",it,[l(me,{ch:t},null,8,["ch"]),A.value===t.id?(i(),u("input",{key:0,value:t.tvg_name,onBlur:w=>we(t.id,w),onKeydown:w=>ke(t.id,w),onClick:s[6]||(s[6]=H(()=>{},["stop"])),style:{background:"var(--bg-2)",border:"1px solid var(--accent)","border-radius":"6px",padding:"3px 8px",color:"var(--text-0)","font-weight":"500",width:"200px","box-shadow":"0 0 0 3px var(--accent-soft)"}},null,40,dt)):(i(),u("span",{key:1,style:{"font-weight":"500"},onDblclick:H(w=>A.value=t.id,["stop"]),title:"Double-click to rename"},o(t.tvg_name),41,ut)),l(x,null,{default:p(()=>[d(o(t.res),1)]),_:2},1024)])]),e("td",rt,o(t.group),1),e("td",null,[l(x,{tone:"cyan"},{default:p(()=>[d(o(t.source),1)]),_:2},1024)]),e("td",vt,[t.tvg_id?(i(),u(V,{key:0},[d(o(t.tvg_id),1)],64)):(i(),u("span",pt,"—"))]),e("td",null,[l(x,{tone:t.state==="active"?"active":"disabled"},{default:p(()=>[d(o(t.state==="active"?"active":"disabled"),1)]),_:2},1032,["tone"])]),e("td",null,[t.epg==="matched"?(i(),T(x,{key:0,tone:"good"},{default:p(()=>[l(f,{name:"check",size:11}),s[41]||(s[41]=d("matched",-1))]),_:1})):(i(),T(x,{key:1,tone:"warn"},{default:p(()=>[l(f,{name:"warn",size:11}),s[42]||(s[42]=d("no match",-1))]),_:1}))]),e("td",null,[e("div",ct,[l(le,{status:t.status,pulse:t.status==="good"},null,8,["status","pulse"]),e("span",mt,o(t.status==="good"?"live":t.status==="warn"?"slow":"down"),1)])]),e("td",{onClick:s[7]||(s[7]=H(()=>{},["stop"]))},[l(k,{variant:"ghost",size:"sm",icon:"more"})])],10,at))),128))])])):(i(),u("div",gt,[(i(!0),u(V,null,O(N.value,t=>(i(),u("div",{key:t.id,class:K(["ch-card",{selected:c.value.has(t.id)}]),onClick:w=>ie(t,w)},[e("div",yt,[l(ne,{on:c.value.has(t.id),onChange:w=>Q(t.id)},null,8,["on","onChange"])]),e("div",xt,[l(me,{ch:t,size:"lg"},null,8,["ch"]),e("div",ht,[e("div",bt,o(t.tvg_name),1),e("div",wt,"#"+o(t.channel)+" · "+o(t.res),1)])]),e("div",kt,o(t.group),1),e("div",_t,[l(x,{tone:t.state==="active"?"active":"disabled"},{default:p(()=>[d(o(t.state==="active"?"active":"disabled"),1)]),_:2},1032,["tone"]),t.epg==="matched"?(i(),T(x,{key:0,tone:"good"},{default:p(()=>[l(f,{name:"check",size:11}),s[43]||(s[43]=d("EPG",-1))]),_:1})):(i(),T(x,{key:1,tone:"warn"},{default:p(()=>[...s[44]||(s[44]=[d("no EPG",-1)])]),_:1})),l(x,{tone:"cyan"},{default:p(()=>[d(o(t.source),1)]),_:2},1024),s[45]||(s[45]=e("span",{class:"spacer"},null,-1)),l(le,{status:t.status,pulse:t.status==="good"},null,8,["status","pulse"])])],10,ft))),128))]))]),$.value==="create"?(i(),u("div",{key:0,class:"modal-bg",onClick:s[13]||(s[13]=t=>$.value=null)},[e("div",{class:"modal",onClick:s[12]||(s[12]=H(()=>{},["stop"])),style:{width:"520px","max-width":"92vw"}},[e("div",$t,[l(f,{name:"plus",size:18}),s[46]||(s[46]=e("h2",null,"New custom playlist",-1)),s[47]||(s[47]=e("span",{class:"spacer"},null,-1)),l(k,{variant:"ghost",size:"sm",icon:"x",onClick:s[8]||(s[8]=t=>$.value=null)})]),e("div",zt,[e("div",Ct,[l(f,{name:"playlist",size:13,style:{color:"var(--accent-hi)"}}),e("span",St,[e("b",At,o(C.value.length),1),d(" selected channel"+o(C.value.length===1?"":"s")+" will be added to the new playlist. ",1)])]),e("div",Pt,[s[48]||(s[48]=e("div",{class:"field-lbl"},"Playlist name",-1)),e("div",Dt,[F(e("input",{"onUpdate:modelValue":s[9]||(s[9]=t=>j.value=t),placeholder:"e.g. Saturday Football"},null,512),[[oe,j.value]])])]),e("div",Mt,[s[53]||(s[53]=e("div",{class:"field-lbl"},"URL path",-1)),e("div",{class:K(["input",{"input-bad":L.value&&!se.value}]),style:{"padding-left":"0"}},[s[49]||(s[49]=e("span",{class:"mono",style:{padding:"0 8px 0 12px",color:"var(--text-3)","font-size":"var(--fs-xs)","border-right":"1px solid var(--hairline)","align-self":"stretch",display:"flex","align-items":"center"}},"/playlists/",-1)),e("input",{class:"mono",style:{"font-size":"var(--fs-sm)"},value:L.value,onInput:s[10]||(s[10]=t=>{L.value=t.target.value.toLowerCase(),ee.value=!0}),placeholder:"my-playlist"},null,40,Et)],2),e("div",Ut,[ue.value?(i(),u("span",Lt,[l(f,{name:"x",size:11}),s[50]||(s[50]=d(" A custom playlist already uses this path.",-1))])):L.value&&!se.value?(i(),u("span",Vt,[l(f,{name:"x",size:11}),s[51]||(s[51]=d(" Use lowercase letters, numbers and dashes only.",-1))])):(i(),u(V,{key:2},[l(f,{name:"link",size:11}),s[52]||(s[52]=d(" Access at ",-1)),e("span",Gt,"https://tvapp2.example.com/playlists/"+o(L.value||"…")+".m3u",1)],64))])]),e("div",It,[e("div",Rt,[l(f,{name:"check",size:13,style:{color:"var(--good)"}}),s[54]||(s[54]=e("span",{style:{"font-weight":"600","font-size":"var(--fs-sm)"}},"Channels to include",-1)),s[55]||(s[55]=e("span",{class:"spacer"},null,-1)),l(x,{tone:"cyan"},{default:p(()=>[d(o(C.value.length),1)]),_:1})]),(i(!0),u(V,null,O(C.value.slice(0,8),t=>(i(),u("div",{key:t.id,class:"row",style:{gap:"8px",padding:"3px 0","font-size":"var(--fs-sm)"}},[e("span",Tt,"#"+o(t.channel),1),e("span",Ot,o(t.tvg_name),1),e("span",Bt,"· "+o(t.group),1)]))),128)),C.value.length>8?(i(),u("div",Nt," + "+o(C.value.length-8)+" more ",1)):D("",!0)])]),e("div",jt,[s[58]||(s[58]=e("span",{class:"spacer"},null,-1)),l(k,{variant:"ghost",onClick:s[11]||(s[11]=t=>$.value=null)},{default:p(()=>[...s[56]||(s[56]=[d("Cancel",-1)])]),_:1}),l(k,{variant:"primary",icon:"plus",disabled:!re.value,onClick:Se},{default:p(()=>[...s[57]||(s[57]=[d("Create playlist",-1)])]),_:1},8,["disabled"])])])])):D("",!0),$.value==="append"?(i(),u("div",{key:1,class:"modal-bg",onClick:s[18]||(s[18]=t=>$.value=null)},[e("div",{class:"modal",onClick:s[17]||(s[17]=H(()=>{},["stop"])),style:{width:"520px","max-width":"92vw"}},[e("div",Kt,[l(f,{name:"playlist",size:18}),s[59]||(s[59]=e("h2",null,"Append to custom playlist",-1)),s[60]||(s[60]=e("span",{class:"spacer"},null,-1)),l(k,{variant:"ghost",size:"sm",icon:"x",onClick:s[14]||(s[14]=t=>$.value=null)})]),e("div",Ht,[e("div",Ft,[l(f,{name:"playlist",size:13,style:{color:"var(--accent-hi)"}}),e("span",Yt,[e("b",qt,o(C.value.length),1),d(" selected channel"+o(C.value.length===1?"":"s")+" will be appended to the playlist you choose. ",1)])]),y.value.length===0?(i(),u("div",Jt,[...s[61]||(s[61]=[e("h3",{style:{margin:"0","font-size":"var(--fs-base)"}},"No custom playlists yet",-1),e("p",{class:"muted",style:{"font-size":"var(--fs-sm)",margin:"6px 0 0"}},[d(" Use "),e("b",null,"Create"),d(" to make your first custom playlist. ")],-1)])])):(i(),u(V,{key:1},[e("div",Wt,[s[62]||(s[62]=e("div",{class:"field-lbl"},"Destination playlist",-1)),e("div",Xt,[F(e("select",{"onUpdate:modelValue":s[15]||(s[15]=t=>X.value=t)},[(i(!0),u(V,null,O(y.value,t=>(i(),u("option",{key:t.id,value:t.id},o(t.name)+" — "+o(t.channels)+" channels",9,Zt))),128))],512),[[ae,X.value]])])]),R.value?(i(),u("div",Qt,[e("div",el,[e("div",sl,[l(f,{name:"playlist",size:16})]),e("div",tl,[e("div",ll,o(R.value.name),1),e("div",nl,"/playlists/"+o(R.value.slug)+".m3u",1)]),e("div",al,"updated "+o(R.value.updated),1)]),e("div",ol,[l(W,{label:"Now",value:R.value.channels,small:""},null,8,["value"]),s[63]||(s[63]=e("span",{style:{color:"var(--text-3)","font-size":"18px"}},"→",-1)),l(W,{label:"After append",value:ve.value,small:""},{default:p(()=>[e("span",il,o(ve.value),1)]),_:1},8,["value"]),s[64]||(s[64]=e("span",{class:"spacer"},null,-1)),l(x,{tone:"cyan"},{default:p(()=>[d("+"+o(C.value.length),1)]),_:1})])])):D("",!0)],64))]),e("div",dl,[s[66]||(s[66]=e("span",{class:"spacer"},null,-1)),l(k,{variant:"ghost",onClick:s[16]||(s[16]=t=>$.value=null)},{default:p(()=>[...s[65]||(s[65]=[d("Cancel",-1)])]),_:1}),l(k,{variant:"primary",icon:"check",disabled:!R.value,onClick:Pe},{default:p(()=>[d(" Append "+o(C.value.length)+" channel"+o(C.value.length===1?"":"s"),1)]),_:1},8,["disabled"])])])])):D("",!0),v.value?(i(),T(gs,{key:2,channels:C.value,onClose:s[19]||(s[19]=t=>v.value=!1),onApply:he},null,8,["channels"])):D("",!0),r.value?(i(),T(Hs,{key:3,playlist:g.value,channels:M.value,onClose:s[20]||(s[20]=t=>r.value=!1)},null,8,["playlist","channels"])):D("",!0),n.value?(i(),u("div",ul,[l(f,{name:n.value.kind==="create"?"plus":"playlist",size:14},null,8,["name"]),e("span",null,o(n.value.text),1),e("button",{class:"custom-toast-x",onClick:s[21]||(s[21]=t=>n.value=null),"aria-label":"Dismiss"},[l(f,{name:"x",size:12})])])):D("",!0)]))}});export{cl as default};
|