mirror of
https://github.com/TheBinaryNinja/tvapp2.git
synced 2026-06-11 19:05:41 -04:00
2 lines
16 KiB
JavaScript
2 lines
16 KiB
JavaScript
import{v as ls,J as g,r,o as e,z as j,u as l,f as p,t as c,N as u,y as z,Y as A,U as H,e as y,X as v,n as ds,H as i,P as R,d as G,V as rs,D as us,m as M,B as vs,O as d,x as Q,T as cs,s as I,k as D,F as E,Z as F,K as U,q as k,l as ss,I as ps,p as T,_ as K}from"./index-CQPQcDLN.js";import{d as Y,a as h,b as es,e as ns}from"./useSettings-CPUgOpin.js";const ms={class:"endpoint-field"},ys={class:"endpoint-lbl"},fs=["readonly"],ts=ls({__name:"EndpointField",props:{label:{},icon:{},iconColor:{},defaultValue:{},modelValue:{},mono:{type:Boolean},readonly:{type:Boolean}},emits:["update:modelValue"],setup(b,{emit:_}){const $=b,L=_,P=g($.defaultValue??""),S=ds({get:()=>$.modelValue!==void 0?$.modelValue:P.value,set:f=>{$.modelValue!==void 0?L("update:modelValue",f):P.value=f}}),w=g(!1);function V(){var f;try{(f=navigator.clipboard)==null||f.writeText(S.value)}catch{}w.value=!0,setTimeout(()=>w.value=!1,1400)}return(f,C)=>(i(),r("div",ms,[e("div",ys,[e("div",{class:"endpoint-ico",style:j({color:b.iconColor||"var(--accent-hi)"})},[l(p,{name:b.icon,size:13},null,8,["name"])],4),c(" "+u(b.label),1)]),e("div",{class:z(["input",{mono:b.mono}]),style:j({flex:1,fontSize:b.mono?"12px":"var(--fs-base)"})},[l(p,{name:"globe",size:14}),A(e("input",{"onUpdate:modelValue":C[0]||(C[0]=m=>S.value=m),readonly:b.readonly},null,8,fs),[[H,S.value]])],6),l(y,{variant:"ghost",size:"sm",icon:w.value?"check":"copy",onClick:V,title:"Copy URL"},{default:v(()=>[c(u(w.value?"Copied":"Copy"),1)]),_:1},8,["icon"])]))}}),gs={class:"col",style:{"max-width":"760px"}},hs={class:"card"},bs={class:"form-grid-2"},xs={class:"form-row"},ks={class:"input"},ws={class:"form-row"},Cs={class:"input mono",style:{"font-size":"12px"}},Es={class:"form-row"},zs={class:"select"},_s={class:"card"},$s={class:"sync-grid"},Ps={class:"sync-row sync-row-lvl"},Ss={class:"sync-col-toggle"},Vs={class:"muted",style:{"font-size":"var(--fs-xs)","font-weight":"400","margin-left":"6px"}},Rs={class:"sync-meta"},Gs={class:"sync-lbl row",style:{gap:"8px"}},Us={class:"sync-hint",style:{display:"flex","align-items":"center",gap:"5px"}},Bs={style:{color:"var(--text-1)","font-weight":"500"}},Ds={class:"sync-col-sched"},Ts={key:0,class:"input mono",style:{height:"30px",width:"100%","font-size":"11px"}},Ls=["value","onBlur","onKeydown"],Ns={key:1,class:"select",style:{width:"100%"}},As=["value","onChange"],Ms=["value"],Is=["value"],Fs={class:"sync-col-cron"},Ks=["onClick"],Ys={class:"sync-col-toggle"},Hs={class:"muted",style:{"font-size":"var(--fs-xs)","font-weight":"400","margin-left":"6px"}},Ws={class:"sync-meta"},Os={class:"sync-lbl row",style:{gap:"8px"}},qs={class:"sync-hint",style:{display:"flex","align-items":"center",gap:"5px"}},Js={style:{color:"var(--text-1)","font-weight":"500"}},Xs={class:"sync-col-sched"},Zs={key:0,class:"input mono",style:{height:"30px",width:"100%","font-size":"11px"}},js=["value","onBlur","onKeydown"],Qs={key:1,class:"select",style:{width:"100%"}},se=["value","onChange"],ee=["value"],ne=["value"],te={class:"sync-col-cron"},le=["onClick"],oe={class:"sync-col-toggle"},ie={class:"sync-row sync-row-lvl"},ae={class:"sync-col-toggle"},de={class:"sync-row sync-row-lvl sync-row-last"},re={class:"sync-col-toggle"},ue={class:"card"},ve={class:"row"},ce={class:"modal-hd"},pe={class:"modal-body"},me={style:{display:"grid",gap:"10px"}},ye={class:"row",style:{gap:"8px","margin-bottom":"8px"}},fe={style:{"font-weight":"600","font-size":"var(--fs-sm)"}},ge={style:{"font-weight":"500"}},he={class:"mono muted",style:{"font-size":"var(--fs-xs)"}},be={class:"row",style:{gap:"8px",padding:"8px 10px",background:"var(--accent-soft)","border-radius":"8px","align-items":"flex-start"}},xe={style:{color:"var(--accent-hi)","margin-top":"1px"}},ke={class:"modal-ft"},Ee=ls({__name:"SettingsScreen",setup(b){const _=[{label:"Every 15 minutes",cron:"*/15 * * * *",next:"in 8 min"},{label:"Every 30 minutes",cron:"*/30 * * * *",next:"in 22 min"},{label:"Every hour",cron:"0 * * * *",next:"in 38 min"},{label:"Every 6 hours",cron:"0 */6 * * *",next:"in 3h 12m"},{label:"Every 12 hours",cron:"0 */12 * * *",next:"in 8h 41m"},{label:"Daily at 03:00",cron:"0 3 * * *",next:"tomorrow 03:00"},{label:"Daily at 06:00",cron:"0 6 * * *",next:"tomorrow 06:00"},{label:"Weekly (Sun 04:00)",cron:"0 4 * * 0",next:"Sun 04:00"}];function $(t){return t.interval==="Every 6 hours"?"0 */6 * * *":t.interval==="Every 12 hours"?"0 */12 * * *":t.interval==="Daily"?"0 3 * * *":t.interval==="Auto-updated"?"0 */6 * * *":"0 3 * * *"}function L(t){var s;return((s=_.find(n=>n.cron===t))==null?void 0:s.next)||"—"}const P=g(!0),S=g(!0),w=g(!1),V=g("Europe/London"),f=g(!1),C=g(!1),m=g("idle"),x=g(null),W=R.filter(t=>t.builtin).length,O=G.filter(t=>t.builtin).length,a=ps({});[...R,...G].forEach(t=>{a[t.id]={cron:$(t),enabled:!0}});function B(t,s){a[t]={...a[t],...s}}rs(m,t=>{t==="done"&&setTimeout(()=>m.value="idle",2200)});function q(){m.value="done"}us(()=>M.on("tvapp:restore-done",q)),vs(()=>M.off("tvapp:restore-done",q));function os(){const t=[];R.filter(s=>s.builtin).forEach(s=>{t.push({kind:"playlist",text:`Fetching playlist · ${s.name}`}),t.push({kind:"playlist",text:`Indexing channels · ${s.name}`})}),G.filter(s=>s.builtin).forEach(s=>{t.push({kind:"epg",text:`Downloading EPG · ${s.name}`}),t.push({kind:"epg",text:`Parsing programmes · ${s.name}`})}),t.push({kind:"refresh",text:"Rebuilding workspace cache"}),M.emit("tvapp:restore-start",{items:t}),m.value="restoring"}function N(t){return _.some(s=>s.cron===t)}function J(t,s){if(s==="__custom"){x.value=t;return}B(t,{cron:s})}function X(t,s){B(t,{cron:s.target.value}),x.value=null}function Z(t,s){s.key==="Enter"&&(B(t,{cron:s.target.value}),x.value=null),s.key==="Escape"&&(x.value=null)}const is=R.filter(t=>t.builtin),as=G.filter(t=>t.builtin);return(t,s)=>(i(),r("div",gs,[e("div",hs,[s[23]||(s[23]=e("h3",{class:"section-title"},"General",-1)),e("div",bs,[e("div",xs,[s[18]||(s[18]=e("div",{class:"field-lbl"},"Display name",-1)),e("div",ks,[A(e("input",{"onUpdate:modelValue":s[0]||(s[0]=n=>Q(Y)?Y.value=n:null)},null,512),[[H,d(Y)]])])]),e("div",ws,[s[19]||(s[19]=e("div",{class:"field-lbl"},"Domain",-1)),e("div",Cs,[l(p,{name:"globe",size:14}),A(e("input",{"onUpdate:modelValue":s[1]||(s[1]=n=>Q(h)?h.value=n:null),placeholder:"https://tvapp2.example.com"},null,512),[[H,d(h)]])]),s[20]||(s[20]=e("div",{class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"6px"}}," Base URL used by all hosted endpoints (M3U, EPG, per-playlist custom paths). ",-1))]),e("div",Es,[s[22]||(s[22]=e("div",{class:"field-lbl"},"Time zone",-1)),e("div",zs,[A(e("select",{"onUpdate:modelValue":s[2]||(s[2]=n=>V.value=n)},[...s[21]||(s[21]=[e("option",null,"Europe/London",-1),e("option",null,"America/New_York",-1),e("option",null,"Europe/Berlin",-1),e("option",null,"Asia/Tokyo",-1)])],512),[[cs,V.value]])])])]),s[24]||(s[24]=e("div",{class:"divider",style:{margin:"18px 0 14px"}},null,-1)),s[25]||(s[25]=e("div",{class:"field-lbl",style:{"margin-bottom":"10px"}},"Hosting endpoints",-1)),s[26]||(s[26]=e("div",{class:"muted",style:{"font-size":"var(--fs-xs)","margin-top":"-4px","margin-bottom":"12px"}}," Public URLs where TVApp2 will expose the consolidated M3U playlist and EPG guide to your downstream apps. ",-1)),l(ts,{label:"M3U endpoint",icon:"playlist","model-value":`${d(h).replace(/\/$/,"")}${d(es)}`,"onUpdate:modelValue":s[3]||(s[3]=n=>es.value=n.startsWith(d(h).replace(/\/$/,""))?n.slice(d(h).replace(/\/$/,"").length):n),mono:""},null,8,["model-value"]),s[27]||(s[27]=e("div",{style:{height:"10px"}},null,-1)),l(ts,{label:"EPG endpoint",icon:"epg","icon-color":"var(--good)","model-value":`${d(h).replace(/\/$/,"")}${d(ns)}`,"onUpdate:modelValue":s[4]||(s[4]=n=>ns.value=n.startsWith(d(h).replace(/\/$/,""))?n.slice(d(h).replace(/\/$/,"").length):n),mono:""},null,8,["model-value"])]),e("div",_s,[s[43]||(s[43]=e("h3",{class:"section-title"},"Syncing",-1)),e("div",$s,[e("div",Ps,[s[28]||(s[28]=I('<div class="sync-meta"><div class="sync-lbl">Auto-sync sources</div><div class="sync-hint">Refresh all playlists and EPG sources on their configured schedules.</div></div><div class="sync-col-sched"></div><div class="sync-col-cron"></div>',3)),e("div",Ss,[l(D,{on:P.value,onChange:s[5]||(s[5]=n=>P.value=n)},null,8,["on"])])]),P.value?(i(),r(E,{key:0},[e("div",{class:z(["sync-section-hd collapsible",{open:f.value}]),onClick:s[7]||(s[7]=n=>f.value=!f.value)},[l(p,{name:"chevron-r",size:12,class:"chev"}),l(p,{name:"playlist",size:13}),s[30]||(s[30]=e("span",null,"Playlists",-1)),e("span",Vs,u(d(R).length)+" sources · "+u(V.value),1),s[31]||(s[31]=e("span",{class:"spacer"},null,-1)),l(y,{variant:"ghost",size:"sm",icon:"refresh",onClick:s[6]||(s[6]=F(()=>{},["stop"]))},{default:v(()=>[...s[29]||(s[29]=[c("Sync all",-1)])]),_:1})],2),f.value?(i(!0),r(E,{key:0},U(d(R),n=>(i(),r("div",{key:n.id,class:z(["sync-row sync-row-sched",{disabled:!a[n.id].enabled}])},[e("div",{class:z(["sched-ico",{builtin:n.builtin}])},[l(p,{name:n.builtin?"tv":"playlist",size:14},null,8,["name"])],2),e("div",Rs,[e("div",Gs,[c(u(n.name)+" ",1),n.builtin?(i(),T(K,{key:0,tone:"system"},{default:v(()=>[l(p,{name:"check",size:10}),s[32]||(s[32]=c("built-in",-1))]),_:1})):k("",!0)]),e("div",Us,[l(p,{name:"refresh",size:11}),s[33]||(s[33]=c(" Next run ",-1)),e("b",Bs,u(L(a[n.id].cron)),1)])]),e("div",Ds,[x.value===n.id?(i(),r("div",Ts,[e("input",{value:a[n.id].cron,onBlur:o=>X(n.id,o),onKeydown:o=>Z(n.id,o)},null,40,Ls)])):(i(),r("div",Ns,[e("select",{value:N(a[n.id].cron)?a[n.id].cron:"__custom",onChange:o=>J(n.id,o.target.value)},[(i(),r(E,null,U(_,o=>e("option",{key:o.cron,value:o.cron},u(o.label),9,Ms)),64)),s[34]||(s[34]=e("option",{value:"__custom"},"Custom…",-1)),N(a[n.id].cron)?k("",!0):(i(),r("option",{key:0,value:a[n.id].cron},"Custom: "+u(a[n.id].cron),9,Is))],40,As)]))]),e("div",Fs,[e("code",{class:"cron-chip",onClick:o=>x.value=n.id,title:"Click to edit cron"},u(a[n.id].cron),9,Ks)]),e("div",Ys,[l(D,{on:a[n.id].enabled,onChange:o=>B(n.id,{enabled:o})},null,8,["on","onChange"])])],2))),128)):k("",!0),e("div",{class:z(["sync-section-hd collapsible",{open:C.value}]),onClick:s[9]||(s[9]=n=>C.value=!C.value)},[l(p,{name:"chevron-r",size:12,class:"chev"}),l(p,{name:"epg",size:13,style:{color:"var(--good)"}}),s[36]||(s[36]=e("span",null,"EPG Sources",-1)),e("span",Hs,u(d(G).length)+" sources · "+u(V.value),1),s[37]||(s[37]=e("span",{class:"spacer"},null,-1)),l(y,{variant:"ghost",size:"sm",icon:"refresh",onClick:s[8]||(s[8]=F(()=>{},["stop"]))},{default:v(()=>[...s[35]||(s[35]=[c("Sync all",-1)])]),_:1})],2),C.value?(i(!0),r(E,{key:1},U(d(G),n=>(i(),r("div",{key:n.id,class:z(["sync-row sync-row-sched",{disabled:!a[n.id].enabled}])},[e("div",{class:z(["sched-ico is-epg",{builtin:n.builtin,"epg-builtin":n.builtin}])},[l(p,{name:n.builtin?"tv":"epg",size:14},null,8,["name"])],2),e("div",Ws,[e("div",Os,[c(u(n.name)+" ",1),n.builtin?(i(),T(K,{key:0,tone:"system"},{default:v(()=>[l(p,{name:"check",size:10}),s[38]||(s[38]=c("built-in",-1))]),_:1})):k("",!0)]),e("div",qs,[l(p,{name:"refresh",size:11}),s[39]||(s[39]=c(" Next run ",-1)),e("b",Js,u(L(a[n.id].cron)),1)])]),e("div",Xs,[x.value===n.id?(i(),r("div",Zs,[e("input",{value:a[n.id].cron,onBlur:o=>X(n.id,o),onKeydown:o=>Z(n.id,o)},null,40,js)])):(i(),r("div",Qs,[e("select",{value:N(a[n.id].cron)?a[n.id].cron:"__custom",onChange:o=>J(n.id,o.target.value)},[(i(),r(E,null,U(_,o=>e("option",{key:o.cron,value:o.cron},u(o.label),9,ee)),64)),s[40]||(s[40]=e("option",{value:"__custom"},"Custom…",-1)),N(a[n.id].cron)?k("",!0):(i(),r("option",{key:0,value:a[n.id].cron},"Custom: "+u(a[n.id].cron),9,ne))],40,se)]))]),e("div",te,[e("code",{class:"cron-chip",onClick:o=>x.value=n.id,title:"Click to edit cron"},u(a[n.id].cron),9,le)]),e("div",oe,[l(D,{on:a[n.id].enabled,onChange:o=>B(n.id,{enabled:o})},null,8,["on","onChange"])])],2))),128)):k("",!0)],64)):k("",!0),e("div",ie,[s[41]||(s[41]=I('<div class="sync-meta"><div class="sync-lbl">Auto-match channels to EPG</div><div class="sync-hint">Run fuzzy name matching against EPG channel IDs after each import.</div></div><div class="sync-col-sched"></div><div class="sync-col-cron"></div>',3)),e("div",ae,[l(D,{on:S.value,onChange:s[10]||(s[10]=n=>S.value=n)},null,8,["on"])])]),e("div",de,[s[42]||(s[42]=I('<div class="sync-meta"><div class="sync-lbl">Email me about sync failures</div><div class="sync-hint">Send a summary if more than 3% of channels go offline.</div></div><div class="sync-col-sched"></div><div class="sync-col-cron"></div>',3)),e("div",re,[l(D,{on:w.value,onChange:s[11]||(s[11]=n=>w.value=n)},null,8,["on"])])])])]),e("div",ue,[s[60]||(s[60]=e("h3",{class:"section-title"},"Data",-1)),e("div",ve,[l(y,{variant:"ghost",icon:"upload"},{default:v(()=>[...s[44]||(s[44]=[c("Export all sources",-1)])]),_:1}),l(y,{variant:"ghost",icon:"refresh"},{default:v(()=>[...s[45]||(s[45]=[c("Rebuild EPG index",-1)])]),_:1}),l(y,{variant:"ghost",icon:"trash"},{default:v(()=>[...s[46]||(s[46]=[c("Clear cache",-1)])]),_:1})]),s[61]||(s[61]=e("div",{class:"divider"},null,-1)),l(ss,{label:"Restore built-in sources",hint:`Re-add the ${d(W)} default playlist${d(W)===1?"":"s"} and ${d(O)} default EPG source${d(O)===1?"":"s"} that ship with TVApp2. Your custom sources are untouched.`},{right:v(()=>[m.value==="done"?(i(),T(y,{key:0,variant:"ghost",icon:"check"},{default:v(()=>[...s[47]||(s[47]=[e("span",{style:{color:"var(--good)"}},"Restored",-1)])]),_:1})):m.value==="restoring"?(i(),T(y,{key:1,variant:"ghost",icon:"refresh",disabled:""},{default:v(()=>[...s[48]||(s[48]=[e("span",{class:"muted"},"Restoring…",-1)])]),_:1})):(i(),T(y,{key:2,variant:"ghost",icon:"refresh",onClick:s[12]||(s[12]=n=>m.value="confirm")},{default:v(()=>[...s[49]||(s[49]=[c("Restore defaults",-1)])]),_:1}))]),_:1},8,["hint"]),m.value==="confirm"?(i(),r("div",{key:0,class:"modal-bg",onClick:s[17]||(s[17]=n=>m.value="idle")},[e("div",{class:"modal",onClick:s[16]||(s[16]=F(()=>{},["stop"])),style:{width:"520px","max-width":"92vw"}},[e("div",ce,[l(p,{name:"refresh",size:18}),s[50]||(s[50]=e("h2",null,"Restore built-in sources?",-1)),s[51]||(s[51]=e("span",{class:"spacer"},null,-1)),l(y,{variant:"ghost",size:"sm",icon:"x",onClick:s[13]||(s[13]=n=>m.value="idle")})]),e("div",pe,[s[55]||(s[55]=e("div",{style:{"font-size":"var(--fs-base)",color:"var(--text-1)","line-height":"1.5"}}," TVApp2 will re-add the default playlist and EPG sources that ship with the app. If any of them were previously hidden or removed, they will reappear in your workspace. ",-1)),e("div",me,[(i(!0),r(E,null,U([{title:"Playlists",icon:"playlist",items:d(is)},{title:"EPG sources",icon:"epg",items:d(as)}],n=>(i(),r("div",{key:n.title,style:{border:"1px solid var(--hairline)","border-radius":"10px",padding:"10px 12px",background:"var(--bg-2)"}},[e("div",ye,[l(p,{name:n.icon,size:14},null,8,["name"]),e("span",fe,u(n.title),1),s[52]||(s[52]=e("span",{class:"spacer"},null,-1)),l(K,{tone:"cyan"},{default:v(()=>[c(u(n.items.length),1)]),_:2},1024)]),(i(!0),r(E,null,U(n.items,o=>(i(),r("div",{key:o.id,class:"row",style:{gap:"8px",padding:"4px 0","font-size":"var(--fs-sm)"}},[s[53]||(s[53]=e("span",{class:"dot good",style:{width:"6px",height:"6px"}},null,-1)),e("span",ge,u(o.name),1),e("span",he,u(o.url),1)]))),128))]))),128))]),e("div",be,[e("span",xe,[l(p,{name:"check",size:13})]),s[54]||(s[54]=e("span",{style:{"font-size":"var(--fs-xs)",color:"var(--text-1)","line-height":"1.5"}}," Your custom playlists, EPG sources, channel mappings, and viewing history will not be modified. ",-1))])]),e("div",ke,[s[58]||(s[58]=e("span",{class:"spacer"},null,-1)),l(y,{variant:"ghost",onClick:s[14]||(s[14]=n=>m.value="idle")},{default:v(()=>[...s[56]||(s[56]=[c("Cancel",-1)])]),_:1}),l(y,{variant:"primary",icon:"refresh",onClick:s[15]||(s[15]=n=>{os(),m.value="idle"})},{default:v(()=>[...s[57]||(s[57]=[c("Confirm restore",-1)])]),_:1})])])])):k("",!0),s[62]||(s[62]=e("div",{class:"divider"},null,-1)),l(ss,{label:"Danger zone",hint:"Permanently delete all playlists, EPG data, and mappings."},{right:v(()=>[l(y,{variant:"ghost",icon:"trash"},{default:v(()=>[...s[59]||(s[59]=[e("span",{style:{color:"var(--bad)"}},"Reset workspace",-1)])]),_:1})]),_:1})])]))}});export{Ee as default};
|