1import{r as c,Z as Vt,_ as lt,y as s,z as i,K as e,u as ie,G as q,C as Fe,F as Oe,J as y,H as p,L as ee,P as pe,A as ge,k as ot,w as re,c as x,V as J,W as Ne,X as Ze,N as xe,$ as Et,a3 as Le,a2 as Ft,a4 as Ye,a1 as It,Q as at,n as Dt}from"./vendor-misc-5pJBpqhN.js";import{e as Mt,u as At}from"./vendor-vue-BIDZeepx.js";import{_ as He,o as Ee,z as Ae,Q as Qe,k as oe}from"./index-BNPflmqD.js";import{p as yt}from"./publicUrl-6vd4sR6a.js";import{A as xt,a as Ot,C as Bt}from"./clock-j-oBUfoU.js";import{L as Nt,C as qt}from"./loader-circle-CKhT93oC.js";import{f as X,a as pt}from"./traceFans-CN0Tru1w.js";import{u as mt}from"./useTraceApi-C1njW2ae.js";import{E as Gt,a as zt}from"./EncodeStageProgress-27MWsx0Z.js";import{g as Wt,h as Ve}from"./traceApi-BoQZsKq1.js";import{u as jt}from"./useTraceJobs-C1JFdzAB.js";/* empty css */import"./vendor-tanstack-B6ELLr_Q.js";import"./vendor-sentry-84cD2ryj.js";import"./vendor-utils-CxkvrZ9U.js";const Te=c([]);let Kt=0;function gt(U){const te=Te.value.findIndex(Q=>Q.id===U);te!==-1&&(Te.value[te].visible=!1,setTimeout(()=>{const Q=Te.value.findIndex(L=>L.id===U);Q!==-1&&Te.value.splice(Q,1)},300))}function Be(U,te,Q,L=5e3){const T=++Kt,f={id:T,type:U,message:te,title:Q,duration:L,visible:!0};return Te.value.push(f),L>0&&setTimeout(()=>gt(T),L),T}function Jt(){const U=($,w=4e3,C="error")=>Be(C,$,void 0,w),te=($,w,C=4e3)=>Be("success",$,w||"Success",C),Q=($,w,C=6e3)=>Be("error",$,w||"Error",C),L=($,w,C=5e3)=>Be("warning",$,w||"Warning",C),T=($,w,C=4e3)=>Be("info",$,w,C),f=$=>{gt($)},O=()=>{Te.value.forEach($=>$.visible=!1),setTimeout(()=>{Te.value=[]},300)};return{toasts:Vt(Te),show:U,showSuccess:te,showError:Q,showWarning:L,showInfo:T,dismiss:f,dismissAll:O}}const Qt={class:"cloud-media-picker"},Yt={key:0,class:"connect-prompt"},Zt={class:"prompt-icon","aria-hidden":"true"},Ht=["src"],Xt=["src"],ea={key:1,class:"picker-content"},ta={class:"picker-header"},aa={class:"header-left"},la={class:"header-right"},oa={key:0,class:"selected-count"},sa={key:0,class:"loading-state"},na={key:1,class:"albums-grid"},ia=["onClick"],ua={class:"album-cover"},ra=["src","alt"],da={key:1,class:"no-cover"},ca=["src"],va={class:"album-info"},pa={class:"album-title"},fa={class:"album-count"},ba={class:"album-cover"},ha={key:2,class:"media-grid"},ya=["onClick"],ma=["src","alt"],ga={key:1,class:"video-thumb"},ka={key:2,class:"selected-overlay"},_a={key:3,class:"load-more"},wa={__name:"CloudMediaPicker",emits:["select","close"],setup(U,{emit:te}){const Q=te,{showError:L,showSuccess:T}=Jt(),f=yt("/icons/GooglePhotos.svg");function O(r){if(r==null)return{};if(typeof r=="object"&&"data"in r&&r.data!=null&&typeof r.data=="object"){const d=r.data;return"albums"in d||"mediaItems"in d||"authorization_url"in d||"downloadUrl"in d?d:"albums"in r||"mediaItems"in r||"authorization_url"in r?r:d}return r}const $=c(!1),w=c(!1),C=c([]),R=c([]),M=c(null),G=c(""),P=c(null),I=c([]);async function A(){var r;try{const d=await Ee.get("/api/connections/"),m=Array.isArray(d)?d:(d==null?void 0:d.connections)??((r=d==null?void 0:d.data)==null?void 0:r.connections)??[];$.value=m.some(E=>E.platform==="google_photos"&&(E.status==="CONNECTED"||E.status==="connected")),$.value&&await Z()}catch(d){Ae("CloudMediaPicker","error","Failed to check connection:",d)}}async function Y(){try{const r=await Ee.get("/api/oauth/google-photos/authorize"),{authorization_url:d}=O(r);if(!d){L("Google Photos sign-in is not configured for this deployment. Upload files directly, or ask your admin to enable OAuth credentials.");return}const m=window.open(d,"Connect Google Photos","width=600,height=700,scrollbars=yes"),E=setInterval(()=>{m!=null&&m.closed&&(clearInterval(E),A())},1e3);window.addEventListener("message",async W=>{var _,j;((_=W.data)==null?void 0:_.type)==="oauth_callback"&&((j=W.data)==null?void 0:j.platform)==="Google Photos"&&(clearInterval(E),m==null||m.close(),W.data.success?(T("Google Photos connected!"),await A()):L(W.data.message||"Connection failed"))})}catch(r){Ae("CloudMediaPicker","error","Failed to start OAuth:",r),(r==null?void 0:r.status)===404?L("Google Photos OAuth
1is not available on this server (route missing). Upload media directly or contact support."):L(Qe(r,"Failed to connect Google Photos. Please try again later."))}}async function Z(){w.value=!0;try{const r=O(await Ee.get("/api/oauth/google-photos/albums"));C.value=(r==null?void 0:r.albums)||[],P.value=r==null?void 0:r.nextPageToken}catch(r){Ae("CloudMediaPicker","error","Failed to load albums:",r),L(Qe(r,"Failed to load albums"))}finally{w.value=!1}}async function ue(r){M.value=r.id,G.value=r.title,R.value=[],P.value=null,await h()}async function V(){M.value="recent",G.value="Recent Photos",R.value=[],P.value=null,await h()}async function h(){w.value=!0;try{const r={};M.value&&M.value!=="recent"&&(r.album_id=M.value),P.value&&(r.page_token=P.value);const d=O(await Ee.get("/api/oauth/google-photos/media",{query:r}));R.value=[...R.value,...(d==null?void 0:d.mediaItems)||[]],P.value=d==null?void 0:d.nextPageToken}catch(r){Ae("CloudMediaPicker","error","Failed to load media:",r),L(Qe(r,"Failed to load media"))}finally{w.value=!1}}async function v(){if(M.value)await h();else{w.value=!0;try{const r={};P.value&&(r.page_token=P.value);const d=O(await Ee.get("/api/oauth/google-photos/albums",{query:r}));C.value=[...C.value,...(d==null?void 0:d.albums)||[]],P.value=d==null?void 0:d.nextPageToken}catch(r){Ae("CloudMediaPicker","error","Failed to load more:",r),L(Qe(r,"Failed to load more albums"))}finally{w.value=!1}}}function k(){M.value=null,G.value="",R.value=[],P.value=null,I.value=[]}function S(r){return I.value.some(d=>d.id===r.id)}function fe(r){S(r)?I.value=I.value.filter(d=>d.id!==r.id):I.value=[...I.value,r]}async function se(){const d=(await Promise.all(I.value.map(async m=>{try{const E=O(await Ee.get(`/api/oauth/google-photos/media/${m.id}/download-url`));return{id:m.id,filename:m.filename,mimeType:m.mimeType,downloadUrl:(E==null?void 0:E.downloadUrl)||(E==null?void 0:E.download_url),thumbnailUrl:m.baseUrl+"=w200-h200-c"}}catch(E){return Ae("CloudMediaPicker","error","Failed to get download URL:",E),null}}))).filter(Boolean);Q("select",d)}return lt(()=>{A()}),(r,d)=>(s(),i("div",Qt,[$.value?(s(),i("div",ea,[e("div",ta,[e("div",aa,[M.value?(s(),i("button",{key:0,type:"button",class:"btn-back","aria-label":"Go back",onClick:k},[(s(),Fe(Oe(ie(xt)),{size:16,"aria-hidden":"true"}))])):y("",!0),e("h4",null,p(M.value?G.value:"Albums"),1)]),e("div",la,[I.value.length>0?(s(),i("span",oa,p(I.value.length)+" selected ",1)):y("",!0),I.value.length>0?(s(),i("button",{key:1,type:"button",class:"btn-use-selected","aria-label":"Use selected media",onClick:se}," Use Selected ")):y("",!0)])]),w.value?(s(),i("div",sa,[(s(),Fe(Oe(ie(Nt)),{size:16})),d[3]||(d[3]=e("p",null,"Loading...",-1))])):M.value?(s(),i("div",ha,[(s(!0),i(ee,null,pe(R.value,m=>{var E;return s(),i("div",{key:m.id,class:ge(["media-item",{selected:S(m)}]),onClick:W=>fe(m)},[(E=m.mimeType)!=null&&E.startsWith("image")?(s(),i("img",{key:0,src:m.baseUrl+"=w200-h200-c",alt:m.filename},null,8,ma)):(s(),i("div",ga,[(s(),Fe(Oe(ie(Bt)),{size:22,"aria-hidden":"true"})),e("span",null,p(m.filename),1)])),S(m)?(s(),i("div",ka,[(s(),Fe(Oe(ie(qt)),{size:16}))])):y("",!0)],10,ya)}),128))])):(s(),i("div",na,[(s(!0),i(ee,null,pe(C.value,m=>(s(),i("div",{key:m.id,class:"album-card",onClick:E=>ue(m)},[e("div",ua,[m.coverPhotoBaseUrl?(s(),i("img",{key:0,src:m.coverPhotoBaseUrl+"=w200-h200-c",alt:m.title},null,8,ra)):(s(),i("div",da,[e("img",{src:ie(f),alt:"",width:"28",height:"28"},null,8,ca)]))]),e("div",va,[e("span",pa,p(m.title),1),e("span",fa,p(m.mediaItemsCount)+" items",1)])],8,ia))),128)),e("div",{class:"album-card recent",onClick:V},[e("div",ba,[(s(),Fe(Oe(ie(Ot)),{size:16}))]),d[4]||(d[4]=e("div",{class:"album-info"},[e("span",{class:"album-title"},"Recent Photos"),e("span",{class:"album-count"},"All recent uploads")],-1))])])),P.value&&!w.value?(s(),i("div",_a,[e("button",{type:"button",class:"btn-load-more","aria-label":"Load More",onClick:v}," Load More ")])):y("",!0)])):(s(),i("div",Yt,[e("div",Zt,[e("img",{src:ie(f),alt:"",class:"prompt-logo",width:"40",height:"40"},null,8,Ht)]),d[1]||(d[1]=e("h3",null,"Connect Google Photos",-1)),d[2]||(d[2]=e("p",null,"Access your media library without storing anything on our servers",-1)),e("button",{type:"button",class:"btn-connect","aria-label":"Connect Google Photos",onClick:Y},[e("img",{src:ie(f),alt:"",class:"btn-connect-logo",width:"18",height:"18"},null,8,Xt),d[0]||(d[0]=q(" Connect Google Photos ",-1))])]))]))}},$a=He(wa,[["__scopeId","data-v-0959aaf9"]]),Ca={class:"eap"},Pa={class:"field"},La=["disabled","onKeydown"],Ta={key:0,class:"hint"},Sa={key:1,class:"eap-list",role:"listbox"},Ua={key:0,class:"eap-group"},Ra=["disabled","onClick"],Va={key:1,class:"eap-group"},Ea=["disabled","onClick"],Fa={key:2,class:"eap-create"},Ia=["disabled"],Da={key:3,class:"eap-modal",role:"dialog","aria-label":"Confirm new account"},Ma={class:"eap-modal__panel"},Aa={class:"eap-modal__actions"},ft="trace.encode.recentFanIds",xa=ot({__name:"EncodeAccountPicker",props:{fans:{},modelValue:{},disabled:{type:Boolean}},emits:["update:modelValue","create"],setup(U,{expose:te,emit:Q}){const L=U,T=Q,f=c(L.modelValue),O=c(!1),$=c(""),w=c([]);re(()=>L.modelValue,h=>{f.value=h}),re(f,h=>T("update:modelValue",h)),lt(()=>{try{w.value=JSON.parse(localStorage.getItem(ft)||"[]")}catch{w.value=[]}});function C(h){return h.trim().toLowerCase()}const R=x(()=>{const h=C(f.value);return h&&L.fans.find(v=>C(X(v))===h)||null}),M=x(()=>{const h=C(f.value);return h?L.fans.filter(v=>C(X(v)).includes(h)).slice(0,40):L.fans.slice(0,40)}),G=x(()=>{const h=new Set(w.value);return M.value.filter(v=>h.has(v.id)).slice(0,5)}),P=x(()=>{const h=new Set(G.value.map(v=>v.id));return M.value.filter(v=>!h.has(v.id))}),I=x(()=>R.value?`Using ${X(R.value)}`:f.value.trim()?`Will ask before creating â${f.value.trim()}â`:"Search an account, or type a new name and confirm create.");function A(h){const v=[h,...w.value.filter(k=>k!==h)].slice(0,8);w.value=v;try{localStorage.setItem(ft,JSON.stringify(v))}catch{}}function Y(h){f.value=X(h),A(h.id),O.value=!1}function Z(){const h=f.value.trim();!h||R.value||($.value=h)}function ue(){const h=$.value;$.value="",h&&T("create",h),O.value=!1}function V(){if(R.value){Y(R.value);return}f.value.trim()&&Z()}return te({exactMatch:R,askCreate:Z}),(h,v)=>(s(),i("div",Ca,[e("label",Pa,[v[3]||(v[3]=e("span",{class:"lbl"},"Who is this for?",-1)),J(e("input",{"onUpdate:modelValue":v[0]||(v[0]=k=>f.value=k),type:"search",placeholder:"Search accountsâ¦",autocomplete:"off",disabled:U.disabled,onKeydown:Ze(xe(V,["prevent"]),["enter"]),onFocus:v[1]||(v[1]=k=>O.value=!0)},null,40,La),[[Ne,f.value]])]),I.value?(s(),i("p",Ta,p(I.value),1)):y("",!0),O.value&&M.value.length?(s(),i("ul",Sa,[G.value.length?(s(),i("li",Ua,"Recent")):y("",!0),(s(!0),i(ee,null,pe(G.value,k=>(s(),i("li",{key:"r-"+k.id},[e("button",{type:"button",class:"eap-item",disabled:U.disabled,onClick:S=>Y(k)},p(ie(X)(k)),9,Ra)]))),128)),P.value.length?(s(),i("li",Va,"Accounts")):y("",!0),(s(!0),i(ee,null,pe(P.value,k=>(s(),i("li",{key:k.id},[e("button",{type:"button",class:"eap-item",disabled:U.disabled,onClick:S=>Y(k)},p(ie(X)(k)),9,Ea)]))),128))])):y("",!0),O.value&&f.value.trim()&&!R.value?(s(),i("p",Fa,[v[4]||(v[4]=q(" No exact match â ",-1)),e("button",{type:"button",class:"linkish",disabled:U.disabled,onClick:Z}," Create â"+p(f.value.trim())+"â? ",9,Ia)])):y("",!0),$.value?(s(),i("div",Da,[e("div",Ma,[v[7]||(v[7]=e("h4",null,"Create account?",-1)),e("p",null,[v[5]||
1(v[5]=q(" Add ",-1)),e("strong",null,p($.value),1),v[6]||(v[6]=q(" and assign a watermark ID. This canât be undone for files already sent. ",-1))]),e("div",Aa,[e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:v[2]||(v[2]=k=>$.value="")}," Cancel "),e("button",{type:"button",class:"tp-btn tp-btn--primary",onClick:ue}," Create account ")])])])):y("",!0)]))}}),Oa=He(xa,[["__scopeId","data-v-3e0e3ee7"]]),Ba={class:"elib-head"},Na={class:"elib-tools"},qa={key:0,class:"elib-filters"},Ga=["value"],za={key:1,class:"elib-bulk"},Wa={key:2,class:"tp-muted"},ja={key:3,class:"tp-err"},Ka={key:4,class:"tp-muted"},Ja={key:5,class:"tp-muted"},Qa={key:6,class:"tp-table elib-table"},Ya={class:"elib-check"},Za=["checked"],Ha={class:"elib-check"},Xa=["value","aria-label"],el={class:"elib-thumb"},tl=["onClick"],al=["src"],ll={key:1,class:"elib-thumb-ph"},ol=["onClick"],sl={class:"esp-badge"},nl={key:0},il=["onKeydown"],ul={class:"elib-sub"},rl={key:0},dl={class:"elib-date"},cl={class:"elib-actions"},vl=["onClick"],pl=["onClick"],fl=["disabled","onClick"],bl=["onClick"],hl=["onClick"],yl=["onClick"],ml=["onClick"],gl={key:7,class:"elib-pager"},kl={class:"elib-pager__meta"},_l={key:0},wl={class:"elib-pager__controls"},$l={class:"elib-page-size"},Cl=["disabled"],Pl={class:"elib-pager__page"},Ll=["disabled"],Tl={key:8,class:"elib-drawer",role:"dialog","aria-label":"Encode detail"},Sl={class:"elib-drawer__panel"},Ul={class:"elib-drawer__head"},Rl={class:"tp-muted"},Vl={key:0},El={class:"elib-peek"},Fl=["src"],Il={key:1,class:"tp-muted"},Dl={key:0},Ml=["src"],Al=["src"],xl={class:"elib-drawer__actions"},Ol=["disabled"],Bl={key:9,class:"elib-modal",role:"dialog"},Nl={class:"elib-modal__panel"},ql=["value"],Gl={class:"elib-modal__actions"},zl=["disabled"],Wl=ot({__name:"EncodeLibraryPanel",props:{videos:{},fans:{},loading:{type:Boolean},error:{},highlightId:{},wmReady:{type:Boolean}},emits:["refresh","focusEncode","retry","reencode","gotoShare","gotoDecode","toast"],setup(U,{expose:te,emit:Q}){const L=U,T=Q,f=mt(),O=c(null),$=c(""),w=c("all"),C=c("all"),R=c("all"),M=c("all"),G=c("newest"),P=c(1),I=c(10),A=c([]),Y=c(null),Z=c(null),ue=c(""),V=c(null),h=c({}),v=c(""),k=c(!1),S=c([]),fe=c(!1),se=c(null),r=c(""),d=x(()=>k.value?S.value:L.videos),m=x(()=>{const n=new Set;for(const t of d.value)t.subscriber_watermark_id!=null&&n.add(t.subscriber_watermark_id);return[...n].map(t=>({value:String(t),label:pt(t,L.fans)||`Account #${t}`})).sort((t,l)=>t.label.localeCompare(l.label,void 0,{sensitivity:"base"}))}),E=x(()=>!!$.value.trim()||w.value!=="all"||C.value!=="all"||R.value!=="all"||M.value!=="all"||G.value!=="newest");function W(n){if(M.value==="all")return!0;if(!n)return!1;const t=new Date(n).getTime();if(Number.isNaN(t))return!1;const l=Date.now();if(M.value==="today"){const K=new Date;return K.setHours(0,0,0,0),t>=K.getTime()}const b=M.value==="7d"?7:30;return t>=l-b*24*60*60*1e3}const _=x(()=>{let n=[...d.value];const t=$.value.trim().toLowerCase();if(t&&(n=n.filter(l=>{const b=(l.title||"").toLowerCase(),K=ce(l).toLowerCase(),ae=(l.download_ext||"").toLowerCase();return b.includes(t)||K.includes(t)||ae.includes(t)||l.id.includes(t)})),w.value!=="all"&&(n=n.filter(l=>(l.media_kind||de(l))===w.value)),C.value!=="all"&&(n=n.filter(l=>{const b=(l.status||"").toLowerCase();return C.value==="failed"?b==="failed"||b==="error":C.value==="ready"?b==="ready"||b==="succeeded":C.value==="pending"?b==="pending"||b==="processing"||b==="queued"||b==="running":b.includes(C.value)})),R.value==="none")n=n.filter(l=>l.subscriber_watermark_id==null);else if(R.value!=="all"){const l=Number(R.value);n=n.filter(b=>b.subscriber_watermark_id===l)}return n=n.filter(l=>W(l.created_at)),n.sort((l,b)=>{if(G.value==="status"){const K=we(l)?0:1,ae=we(b)?0:1;return K!==ae?K-ae:(b.created_at||"").localeCompare(l.created_at||"")}if(G.value==="oldest")return(l.created_at||"").localeCompare(b.created_at||"");if(G.value==="title"){const K=(l.title||l.id).toLowerCase(),ae=(b.title||b.id).toLowerCase();return K.localeCompare(ae)}return G.value==="account"?ce(l).localeCompare(ce(b),void 0,{sensitivity:"base"}):(b.created_at||"").localeCompare(l.created_at||"")}),n}),j=x(()=>Math.max(1,Math.ceil(_.value.length/I.value))),B=x(()=>{const n=(P.value-1)*I.value;return _.value.slice(n,n+I.value)}),H=x(()=>
1{if(!_.value.length)return"0â0";const n=(P.value-1)*I.value+1,t=Math.min(P.value*I.value,_.value.length);return`${n}â${t}`}),Ie=x(()=>B.value.length>0&&B.value.every(n=>A.value.includes(n.id)));function ke(){$.value="",w.value="all",C.value="all",R.value="all",M.value="all",G.value="newest",P.value=1}function de(n){const t=(n.download_ext||n.marked_path||"").toLowerCase();return t.includes(".png")||t.includes(".jpg")||t.includes(".webp")?"image":"video"}function _e(n){return(n.media_kind||de(n))==="image"?"Photo":"Video"}function ce(n){return pt(n.subscriber_watermark_id,L.fans)||"â"}function we(n){const t=(n.status||"").toLowerCase();return t==="failed"||t==="error"}function De(n){const t=(n||"").toLowerCase();return t==="ready"||t==="succeeded"?"tp-pill--ok":t==="failed"||t==="error"?"tp-pill--bad":"tp-pill--warn"}function F(n){if(!n)return"";try{return new Date(n).toLocaleString()}catch{return n}}async function $e(n){if(!f.fetchTraceVideoPosterBlob)return;const t=n.filter(ae=>!h.value[ae.id]&&ae.status==="ready");if(!t.length)return;const l=Math.min(4,t.length);let b=0;async function K(){for(;b<t.length;){const ae=t[b++];try{const he=await f.fetchTraceVideoPosterBlob(ae.id);h.value={...h.value,[ae.id]:URL.createObjectURL(he)}}catch{}}}await Promise.all(Array.from({length:l},()=>K()))}re(()=>L.videos,()=>{P.value=1}),re(B,n=>{$e(n)}),re([$,w,C,R,M,G,I,k],()=>{P.value=1,A.value=[]}),re(j,n=>{P.value>n&&(P.value=n)});function Ce(n){const t=n.target.checked,l=B.value.map(b=>b.id);t?A.value=[...new Set([...A.value,...l])]:A.value=A.value.filter(b=>!l.includes(b))}async function ve(n){Y.value=n.id;try{const{blob:t,filename:l}=await f.downloadTraceVideo(n.id),b=URL.createObjectURL(t),K=document.createElement("a");K.href=b,K.download=l,K.click(),URL.revokeObjectURL(b)}catch(t){T("toast",oe(t,"Download failed"))}finally{Y.value=null}}async function Pe(){for(const n of A.value){const t=d.value.find(l=>l.id===n);t&&t.status==="ready"&&await ve(t)}}function Se(n){Z.value=n.id,ue.value=n.title||""}async function qe(n){if(!f.patchTraceVideo)return;const t=ue.value.trim();if(t)try{await f.patchTraceVideo(n.id,t),Z.value=null,T("refresh")}catch(l){T("toast",oe(l,"Rename failed"))}}async function Ue(n){if(f.deleteTraceVideo&&confirm(`Move â${n.title||n.id.slice(0,8)}â to trash?`))try{await f.deleteTraceVideo(n.id),T("refresh"),T("toast","Moved to trash (kept 7 days)")}catch(t){T("toast",oe(t,"Delete failed"))}}async function Re(n){if(f.deleteTraceVideo&&confirm("Delete forever? This cannot be undone."))try{await f.deleteTraceVideo(n.id,{hard:!0}),S.value=S.value.filter(t=>t.id!==n.id),T("toast","Deleted forever")}catch(t){T("toast",oe(t,"Delete failed"))}}async function Ge(n){if(f.restoreTraceVideo)try{await f.restoreTraceVideo(n.id),S.value=S.value.filter(t=>t.id!==n.id),T("refresh"),T("toast","Restored")}catch(t){T("toast",oe(t,"Restore failed"))}}async function ne(){for(const n of[...A.value]){const t=d.value.find(l=>l.id===n);t&&(k.value?await Re(t):await Ue(t))}A.value=[]}async function ze(){if(k.value=!k.value,A.value=[],k.value&&f.fetchTraceVideos){fe.value=!0;try{const n=await f.fetchTraceVideos({trash:!0,limit:200});S.value=n.videos||[],$e(S.value.slice(0,I.value))}catch(n){T("toast",oe(n,"Could not load trash"))}finally{fe.value=!1}}}function be(n){V.value=n,v.value&&(URL.revokeObjectURL(v.value),v.value=""),$e([n])}async function We(){if(!(!V.value||!f.fetchTraceVideoOriginalBlob))try{const n=await f.fetchTraceVideoOriginalBlob(V.value.id);v.value&&URL.revokeObjectURL(v.value),v.value=URL.createObjectURL(n)}catch(n){T("toast",oe(n,"Could not load original"))}}function je(n){se.value=n,r.value=""}function Xe(){const n=se.value,t=L.fans.find(l=>l.id===r.value);!n||!t||(T("reencode",n,t),se.value=null)}return Et(()=>{Object.values(h.value).forEach(n=>URL.revokeObjectURL(n)),v.value&&URL.revokeObjectURL(v.value)}),te({rootEl:O}),(n,t)=>(s(),i("section",{ref_key:"rootEl",ref:O,class:"elib"},[e("div",Ba,[t[20]||(t[20]=e("h4",{class:"lib-title"},"Encoded library",-1)),e("div",Na,[e("button",{type:"button",class:ge(["tp-btn tp-btn--ghost",{"is-on":k.value}]),onClick:ze},p(k.value?"Active library":"Trash"),3)])]),k.value?y("",!0):(s(),i("div",qa,[J(e("input",{"onUpdate:modelValue":t[0]||(t[0]=l=>$.value=l),type:"search",placeholder:"Search title or fileâ¦","aria-label":"Search f
1ile"},null,512),[[Ne,$.value]]),J(e("select",{"onUpdate:modelValue":t[1]||(t[1]=l=>R.value=l),"aria-label":"Filter by account"},[t[21]||(t[21]=e("option",{value:"all"},"All accounts",-1)),t[22]||(t[22]=e("option",{value:"none"},"No account linked",-1)),(s(!0),i(ee,null,pe(m.value,l=>(s(),i("option",{key:l.value,value:l.value},p(l.label),9,Ga))),128))],512),[[Le,R.value]]),J(e("select",{"onUpdate:modelValue":t[2]||(t[2]=l=>w.value=l),"aria-label":"Filter by type"},[...t[23]||(t[23]=[e("option",{value:"all"},"All types",-1),e("option",{value:"image"},"Photos",-1),e("option",{value:"video"},"Videos",-1)])],512),[[Le,w.value]]),J(e("select",{"onUpdate:modelValue":t[3]||(t[3]=l=>C.value=l),"aria-label":"Filter by status"},[...t[24]||(t[24]=[e("option",{value:"all"},"All statuses",-1),e("option",{value:"ready"},"Ready",-1),e("option",{value:"failed"},"Failed",-1),e("option",{value:"pending"},"Pending",-1)])],512),[[Le,C.value]]),J(e("select",{"onUpdate:modelValue":t[4]||(t[4]=l=>M.value=l),"aria-label":"Filter by date"},[...t[25]||(t[25]=[e("option",{value:"all"},"Any date",-1),e("option",{value:"today"},"Today",-1),e("option",{value:"7d"},"Last 7 days",-1),e("option",{value:"30d"},"Last 30 days",-1)])],512),[[Le,M.value]]),J(e("select",{"onUpdate:modelValue":t[5]||(t[5]=l=>G.value=l),"aria-label":"Sort"},[...t[26]||(t[26]=[Ft('<option value="newest" data-v-fd025af5>Newest first</option><option value="oldest" data-v-fd025af5>Oldest first</option><option value="status" data-v-fd025af5>Failed first</option><option value="title" data-v-fd025af5>File AâZ</option><option value="account" data-v-fd025af5>Account AâZ</option>',5)])],512),[[Le,G.value]]),E.value?(s(),i("button",{key:0,type:"button",class:"tp-btn tp-btn--ghost",onClick:ke}," Clear filters ")):y("",!0)])),A.value.length?(s(),i("div",za,[e("span",null,p(A.value.length)+" selected",1),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:Pe},"Download"),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:ne},"Delete"),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:t[6]||(t[6]=l=>A.value=[])},"Clear")])):y("",!0),U.loading||fe.value?(s(),i("p",Wa,"Loadingâ¦")):U.error?(s(),i("p",ja,p(U.error),1)):d.value.length?_.value.length?(s(),i("table",Qa,[e("thead",null,[e("tr",null,[e("th",Ya,[e("input",{type:"checkbox",checked:Ie.value,"aria-label":"Select all on this page",onChange:Ce},null,40,Za)]),t[29]||(t[29]=e("th",null,null,-1)),t[30]||(t[30]=e("th",null,"File",-1)),t[31]||(t[31]=e("th",null,"For",-1)),t[32]||(t[32]=e("th",null,"Status",-1)),t[33]||(t[33]=e("th",null,"Date",-1)),t[34]||(t[34]=e("th",null,null,-1))])]),e("tbody",null,[(s(!0),i(ee,null,pe(B.value,l=>(s(),i("tr",{key:l.id,class:ge({"elib-row--hi":U.highlightId===l.id,"elib-row--fail":we(l)})},[e("td",Ha,[J(e("input",{"onUpdate:modelValue":t[8]||(t[8]=b=>A.value=b),type:"checkbox",value:l.id,"aria-label":"Select "+(l.title||l.id)},null,8,Xa),[[Ye,A.value]])]),e("td",el,[e("button",{type:"button",class:"elib-thumb-btn",onClick:b=>be(l)},[h.value[l.id]?(s(),i("img",{key:0,src:h.value[l.id],alt:""},null,8,al)):(s(),i("span",ll,p(_e(l)==="Photo"?"ð¼":"â¶"),1))],8,tl)]),e("td",null,[e("button",{type:"button",class:"elib-title-btn",onClick:b=>be(l)},[e("span",sl,p(_e(l)),1),Z.value!==l.id?(s(),i("span",nl,p(l.title||l.id.slice(0,8)),1)):y("",!0)],8,ol),Z.value===l.id?J((s(),i("input",{key:0,"onUpdate:modelValue":t[9]||(t[9]=b=>ue.value=b),class:"elib-rename",onKeydown:[Ze(xe(b=>qe(l),["prevent"]),["enter"]),t[10]||(t[10]=Ze(xe(b=>Z.value=null,["prevent"]),["esc"]))]},null,40,il)),[[Ne,ue.value]]):y("",!0),e("div",ul,[l.download_ext?(s(),i("span",rl,p(l.download_ext),1)):y("",!0)])]),e("td",null,p(ce(l)),1),e("td",null,[e("span",{class:ge(["tp-pill",De(l.status)])},p(l.status),3)]),e("td",dl,p(F(l.created_at)),1),e("td",cl,[k.value?(s(),i(ee,{key:0},[e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:b=>Ge(l)}," Restore ",8,vl),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:b=>Re(l)}," Delete forever ",8,pl)],64)):(s(),i(ee,{key:1},[e("button",{type:"button",class:"tp-btn tp-btn--ghost",disabled:Y.value===l.id||l.status!=="ready",onClick:b=>ve(l)},p(Y.value===l.id?"â¦":"Download"),9,fl),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:b=>Se(l)}
1," Rename ",8,bl),we(l)?(s(),i("button",{key:0,type:"button",class:"tp-btn tp-btn--ghost",onClick:b=>n.$emit("retry",l)}," Retry ",8,hl)):y("",!0),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:b=>je(l)}," Encode again ",8,yl),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:b=>Ue(l)}," Delete ",8,ml)],64))])],2))),128))])])):(s(),i("p",Ja,[t[28]||(t[28]=q(" No encodes match these filters. ",-1)),e("button",{type:"button",class:"linkish",onClick:ke},"Clear filters")])):(s(),i("p",Ka,[k.value?(s(),i(ee,{key:0},[q("Trash is empty.")],64)):(s(),i(ee,{key:1},[t[27]||(t[27]=q(" No encoded files yet. ",-1)),e("button",{type:"button",class:"linkish",onClick:t[7]||(t[7]=l=>n.$emit("focusEncode"))}," Encode your first labeled copy ")],64))])),_.value.length?(s(),i("div",gl,[e("span",kl,[q(p(H.value)+" of "+p(_.value.length)+" ",1),d.value.length!==_.value.length?(s(),i("span",_l," (from "+p(d.value.length)+")",1)):y("",!0)]),e("div",wl,[e("label",$l,[t[36]||(t[36]=q(" Per page ",-1)),J(e("select",{"onUpdate:modelValue":t[11]||(t[11]=l=>I.value=l),"aria-label":"Rows per page"},[...t[35]||(t[35]=[e("option",{value:10},"10",-1),e("option",{value:25},"25",-1),e("option",{value:50},"50",-1)])],512),[[Le,I.value,void 0,{number:!0}]])]),e("button",{type:"button",class:"tp-btn tp-btn--ghost",disabled:P.value<=1,onClick:t[12]||(t[12]=l=>P.value-=1)}," Previous ",8,Cl),e("span",Pl,p(P.value)+" / "+p(j.value),1),e("button",{type:"button",class:"tp-btn tp-btn--ghost",disabled:P.value>=j.value,onClick:t[13]||(t[13]=l=>P.value+=1)}," Next ",8,Ll)])])):y("",!0),V.value?(s(),i("aside",Tl,[e("div",Sl,[e("div",Ul,[e("h4",null,p(V.value.title||"Labeled copy"),1),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:t[14]||(t[14]=l=>V.value=null)},"Close")]),e("p",Rl,[q(p(_e(V.value))+" for "+p(ce(V.value))+" · WM "+p(V.value.subscriber_watermark_id??"â")+" ",1),V.value.visible_text?(s(),i("span",Vl," · T-ID "+p(V.value.visible_text),1)):y("",!0)]),e("div",El,[e("div",null,[t[37]||(t[37]=e("span",{class:"lbl"},"Marked",-1)),h.value[V.value.id]?(s(),i("img",{key:0,src:h.value[V.value.id],alt:"Marked preview"},null,8,Fl)):(s(),i("p",Il,"Preview loadingâ¦"))]),v.value?(s(),i("div",Dl,[t[38]||(t[38]=e("span",{class:"lbl"},"Original",-1)),V.value.media_kind==="image"?(s(),i("img",{key:0,src:v.value,alt:"Original preview"},null,8,Ml)):(s(),i("video",{key:1,src:v.value,controls:"",playsinline:"",preload:"metadata"}
1,null,8,Al))])):y("",!0)]),e("div",xl,[e("button",{type:"button",class:"tp-btn tp-btn--primary",disabled:V.value.status!=="ready",onClick:t[15]||(t[15]=l=>ve(V.value))}," Download ",8,Ol),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:t[16]||(t[16]=l=>n.$emit("gotoShare",V.value))}," Share "),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:t[17]||(t[17]=l=>n.$emit("gotoDecode"))}," Decode "),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:We}," Before / after ")])])])):y("",!0),se.value?(s(),i("div",Bl,[e("div",Nl,[t[40]||(t[40]=e("h4",null,"Encode again forâ¦",-1)),t[41]||(t[41]=e("p",{class:"tp-muted"}," Uses the same master. Picks a new watermarked copy for another account. ",-1)),J(e("select",{"onUpdate:modelValue":t[18]||(t[18]=l=>r.value=l)},[t[39]||(t[39]=e("option",{disabled:"",value:""},"Select account",-1)),(s(!0),i(ee,null,pe(U.fans,l=>(s(),i("option",{key:l.id,value:l.id},p(ie(X)(l)),9,ql))),128))],512),[[Le,r.value]]),e("div",Gl,[e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:t[19]||(t[19]=l=>se.value=null)}," Cancel "),e("button",{type:"button",class:"tp-btn tp-btn--primary",disabled:!r.value,onClick:Xe}," Start encode ",8,zl)])])])):y("",!0)],512))}}),jl=He(Wl,[["__scopeId","data-v-fd025af5"]]),Kl={class:"tp-card encode-panel"},Jl={class:"encode-zones"},Ql={id:"encode-new",class:"encode-zone encode-zone--new"},Yl={key:0,class:"quota-meter","aria-live":"polite"},Zl={key:1,class:"tp-err"},Hl={key:2,class:"tp-muted"},Xl={key:3,class:"tp-err"},eo={key:4,class:"tp-err"},to={class:"mode-row"},ao=["disabled"],lo=["disabled"],oo={class:"tp-row encode-fields"},so={class:"field tp-grow"},no=["disabled","onKeydown"],io={key:0,class:"batch"},uo={class:"batch-head"},ro=["disabled"],co={class:"vip-only"},vo=["disabled"],po=["disabled"],fo={key:0,class:"hint"},bo={key:1,class:"tp-muted"},ho={key:2,class:"fan-checks"},yo=["value","disabled"],mo={class:"hint"},go={key:3,class:"batch-rows"},ko=["onClick"],_o={class:"tp-source-actions"},wo={class:"tp-file-btn"},$o=["disabled"],Co=["disabled"],Po=["src"],Lo={key:0,class:"visible-toggle"},To=["disabled"],So={key:1,class:"tp-muted source-note"},Uo={key:2,class:"still-strength"},Ro=["disabled"],Vo={key:3,class:"encode-go"},Eo=["disabled"],Fo={key:1,class:"masters-strip","aria-label":"Recent masters"},Io={class:"masters-row"},Do=["onClick"],Mo={class:"esp-badge"},Ao={class:"tp-muted"},xo={key:3,class:"tp-ok",role:"status"},Oo={key:4,class:"tp-ok"},Bo={key:5,class:"ready-cta",role:"status"},No={class:"ready-cta__text"},qo={class:"ready-cta__actions"},Go=["disabled"],zo={key:6,class:"tp-err"},Wo={key:0,class:"photos-modal",role:"dialog","aria-label":"Pick from Google Photos"},jo={class:"photos-modal__panel"},Ko={class:"photos-modal__head"},Jo=2e8,bt="trace.encode.draft",ht="trace.encode.prefillFan",Qo=ot({__name:"TracePackagePanel",props:{wmReady:{type:Boolean},statusLoading:{type:Boolean},statusMessage:{},canPackage:{type:Boolean},refreshKey:{},detectionMode:{},plan:{},freePackageCap:{},packagesUsed:{}},emits:["subscribe","refreshed"],setup(U,{emit:te}){const Q=yt("/icons/GooglePhotos.svg"),L=Mt(),T=At(),f=U,O=te,{addTraceSubscriber:$,encodeTraceVideo:w,encodeTraceVideoBatch:C,fetchTraceMasters:R,fetchTraceSubscribers:M,fetchTraceVideos:G,retryTraceVideo:P,reencodeTraceVideo:I}=mt(),A=x(()=>(f.detectionMode||"").toLowerCase()==="stub"),Y=x(()=>(f.plan||"").toLowerCase()==="free"),Z=x(()=>f.freePackageCap??2),ue=x(()=>f.packagesUsed??0),V=x(()=>Y.value?Math.max(0,Z.value-ue.value):999),h=x(()=>Y.value?`Free: ${ue.value} of ${Z.value} encodes used this month`:f.plan==="pro"?"Pro â unlimited encodes this month":""),v=c(!1),k=c(""),S=c([]),fe=c(""),se=c(!1),r=c([]),d=c(""),m=c(!0),E=c("default"),W=c(null),_=c(!1),j=c(""),B=c(""),H=c(""),Ie=c(!1),ke=c(!1),de=c([]),_e=c([]),ce=c(!0),we=c(""),De=c(null),F=c("idle"),$e=c(0),Ce=c(null),ve=c(null),Pe=c(null),Se=c(!1),qe=c(null),Ue=c([]),{pollJob:Re,stop:Ge}=jt(),ne=x(()=>W.value?W.value.type.startsWith("image/")?"image":"video":null),ze=x(()=>S.value.length),be=x(()=>{let u=r.value;se.value&&(u=u.filter(o=>(o.tier||"standard")==="vip"));const a=fe.value.trim().toLowerCase();return a?u.filter(o=>X(o).toLowerCase().includes(a)):u}),We=x(()=>be.value.length>0&&S.value.length===be.value.length&&be.value.every(u=>S.value.includes(u.id))),je=x(()=>W.value?v.value?S.value.length>0:k.value.trim().length>0:!1);function Xe(u){const a=(u||"").toLowerCase();return a==="ready"||a==="succeeded"||a==="success"?"tp-pill--ok":a==="failed"||a==="error"?"tp-pill--bad":"tp-pill--warn"}function n(){We.value?S.value=[]:S.value=be.value.map(u=>u.id)}function t(u){if(u.size>Jo){B.value=`File is too large (${Math.round(u.size/1e6)}MB). Max 200MB.`;return}if(!(u.type.startsWith("video/")||["image/jpeg","image/png","image/webp"].includes(u.type))){B.value="Use a video or JPEG/PNG/WebP still.";return}B.value="",W.value=u,d.value.trim()||(d.value=u.name.replace(/\.[^.]+$/,""))}function l(u){var g;const a=u.target,o=(g=a.files)==null?void 0:g[0];a.value="",o&&t(o)}function b(u){var o,g;Ie.value=!1;const a=(g=(o=u.dataTransfer)==null?void 0:o.files)==null?void 0:g[0];a&&t(a)}async function K(u){try{const a=await $({external_ref:u});r.value=[...r.value,a],k.value=X(a),O("refreshed"),H.value=`Account â${u}â created`}catch(a){B.value=oe(a,"Could not create account")}}async function ae(){const u=k.value.trim().toLowerCase(),a=r.value.find(o=>X(o).trim().toLowerCase()===u);if(a)return a;throw new Error("Confirm creating this account first (search â Create)")}async function he(){if(!f.wmReady){ce.value=!1;return}ce.value=!0,we.value="";const u=G().then(g=>{de.value=g.videos||[]}).catch(g=>{we.value=oe(g,"Could not load library"),de.value=[]}),a=M().then(g=>{r.value=g.subscribers||[]}).catch(()=>{}),o=((R==null?void 0:R())??Promise.resolve({masters:[]})).then(g=>{_e.value=g.masters||[]}).catch(()=>{_e.value=[]});await Promise.all([u,a,o]),ce.value=!1}async function st(u,a){u&&(Pe.value={videoId:u,fanLabel:a},await he(),de.value.some(o=>o.id===u)||(de.value=[{id:u,creator_id:"",title:d.value.trim()||"Labeled copy",status:"ready",content_class:"default",created_at:new Date().toISOString()},...de.value]),await Ke(u))}async function kt(){var a;const u=(a=Pe.value)==null?void 0:a.videoId;if(!(!u||Se.value)){Se.value=!0;try{const{blob:o,filename:g}=await Wt(u),z=URL.createObjectURL(o),D=document.createElement("a");D.href=z,D.download=g,D.click(),URL.revokeObjectURL(z),H.value=`Downloaded ${g}`}catch(o){B.value=oe(o,"Download failed â try the library row")}finally{Se.value=!1}}}function _t(){var a;const u=(a=Pe.value)==null?void 0:a.videoId;if(!u){T.push({path:"/trace",query:{tab:"share"}});return}T.push({path:"/trace",query:{tab:"share",video:u}})}function nt(){try{sessionStorage.setItem(bt,JSON.stringify({title:d.value,fanQuery:k.value,selectedFanIds:S.value,enableVisible:m.value,batchMode:v.value}))}catch{}}function wt(){try{const u=sessionStorage.getItem(bt);if(!u)return;const a=JSON.parse(u);d.value=a.title||"",k.value=a.fanQuery||"",S.value=a.selectedFanIds||[],m.value=a.enableVisible!==!1,v.value=!!a.batchMode}catch{}}function it(){try{const a=sessionStorage.getItem(ht);if(a){const o=JSON.parse(a);o.label&&(k.value=o.label,v.value=!1),o.id&&(S.value=[o.id]),sessionStorage.removeItem(ht)}}catch{}const u=L.query.fan;typeof u=="string"&&u.trim()&&(k.value=u.trim(),v.value=!1)}function $t(){Ge(),_.value=!1,j.value="Stopped waiting here â check the library shortly."}function Ct(){var u;(u=document.getElementById("encode-new"))==null||u.scrollIntoView({behavior:"smooth",block:"start"})}function Pt(u){T.push({path:"/trace",query:{tab:"share",video:u.id}})}function Lt(){T.push({path:"/trace",query:{tab:"decode"}})}async function Ke(u){var a,o;u&&(De.value=u,await Dt(),(o=(a=qe.value)==null?void 0:a.rootEl)==null||o.scrollIntoView({behavior:"smooth",block:"nearest"}),window.setTimeout(()=>{De.value===u&&(De.value=null)},6e3))}async function ut(){var a;const u=W.value;if(!(!u||!f.wmReady||!f.canPackage)){j.value="",B.value="",H.value="",ve.value=null,Pe.value=null,_.value=!0,F.value="upload",$e.value=0,Ce.value=null,nt();try{if(v.value){const o=r.value.filter(N=>S.value.includes(N.id));if(!o.length)throw new Error("Select at least one account for this drop");if(Y.value&&o.length>V.value)throw new Error(`This batch needs ${o.length} encodes but Free has ${V.value} left.`);Ue.value=o.map(N=>({fanId:N.id,label:X(N),status:"queued"}));const g=ne.value==="image"?!1:m.value,z=await C({file:u,subscriberWatermarkIds:o.map(N=>N.watermark_id),title:d.value.trim()||void 0,enableVisible:g,stillStrengthPreset:ne.value==="image"?E.value:void 0,onUploadProgress:N=>{$e.value=N}});F.value="queued";let D=0,ye=0;for(let N=0;N<z.length;N++){const Me=z[N],le=Ue.value[N];le&&(le.status="encoding",le.jobId=Me.id,le.videoId=Me.video_id||void 0),F.value="marking";const me=await Re(Me.id,{onUpdate:tt=>{var ct,vt;const dt=(tt.status||"").toLowerCase();dt==="queued"?F.value="queued":dt==="running"&&(F.value=((ct=tt.progress)==null?void 0:ct.stage)==="packaging"?"packaging":"marking",Ce.value=((vt=tt.progress)==null?void 0:vt.pct)??null)}}),rt=((me==null?void 0:me.status)||"").toLowerCase();rt==="failed"||rt==="error"?(ye+=1,le&&(le.status="failed"),ve.value=(me==null?void 0:me.video_id)||(le==null?void 0:le.videoId)||null):(D+=1,le&&(le.status="ready"))}if(F.value=ye&&!D?"failed":"ready",ye&&!D)throw new Error(Ve(`All ${ye} encode jobs failed`,ne.value||void 0));H.value=ye>0?`${D} ready, ${ye} failed â check the library.`:`${D} labeled copies ready`,j.value=H.value;const Je=(a=z.find(N=>N.video_id))==null?void 0:a.video_id;await st(Je,`${D} accounts`)}else{const o=await ae(),g=ne.value==="image"?!1:m.value,z=await w({file:u,subscriberWatermarkId:o.watermark_id,title:d.value.trim()||void 0,enableVisible:g,stillStrengthPreset:ne.value==="image"?E.value:void 0,onUploadProgress:N=>{$e.value=N}});F.value="queued",j.value=`Encoding labeled copy for ${X(o)}â¦`;const D=await Re(z.id,{onUpdate:N=>{var le,me;const Me=(N.status||"").toLowerCase();Me==="queued"?F.value="queued":Me==="running"&&(F.value=((le=N.progress)==null?void 0:le.stage)==="packaging"?"packaging":"marking",Ce.value=((me=N.progress)==null?void 0:me.pct)??null)}}),ye=((D==null?void 0:D.status)||"").toLowerCase();if(ye==="failed"||ye==="error")throw F.value="failed",ve.value=(D==null?void 0:D.video_id)||z.video_id||null,new Error(Ve(D==null?void 0:D.error,ne.value||void 0));F.value="ready";const Je=X(o);H.value=`Labeled copy ready for ${Je}`,j.value="",await st((D==null?void 0:D.video_id)||z.video_id,Je)}O("refreshed")}catch(o){F.value="failed",B.value=Ve(oe(o,"Encode failed"),ne.value||void 0)}finally{_.value=!1}}}function Tt(){!_.value&&je.value&&ut()}async function et(u){if(P){_.value=!0,F.value="queued",B.value="";try{const a=await P(u),o=await Re(a.id,{onUpdate:g=>{var z;F.value=(g.status||"").toLowerCase()==="running"?"marking":"queued",Ce.value=((z=g.progress)==null?void 0:z.pct)??null}});if(((o==null?void 0:o.status)||"").toLowerCase()==="failed")throw new Error(Ve(o==null?void 0:o.error));F.value="ready",H.value="Retry succeeded",await he(),await Ke(u),O("refreshed")}catch(a){F.value="failed",B.value=Ve(oe(a,"Retry failed")),ve.value=u}finally{_.value=!1}}}async function St(u,a){if(I){_.value=!0,F.value="queued";try{const o=await I(u.id,{subscriberWatermarkId:a.watermark_id,title:u.title,enableVisible:u.media_kind==="image"?!1:m.value}),g=await Re(o.id,{onUpdate:z=>{var D;F.value=(z.status||"").toLowerCase()==="running"?"marking":"queued",Ce.value=((D=z.progress)==null?void 0:D.pct)??null}});if(((g==null?void 0:g.status)||"").toLowerCase()==="failed")throw new Error(Ve(g==null?void 0:g.error));F.value="ready",H.value=`Encoded again for ${X(a)}`,await he(),await Ke((g==null?void 0:g.video_id)||o.video_id),O("refreshed")}catch(o){F.value="failed",B.value=Ve(oe(o,"Re-encode failed"))}finally{_.value=!1}}}function Ut(u){const a=de.value.find(o=>o.id===u.latest_video_id);if(!a){H.value="Open Encode again from the library row for that master.";return}H.value=`Use âEncode againâ on â${u.title}â in the library to pick an account.`,Ke(a.id)}async function Rt(u){ke.value=!1;const a=(u||[]).find(o=>(o==null?void 0:o.id)&&String(o.mimeType||"").startsWith("video"));if(!(a!=null&&a.id)){B.value="Pick a video from Google Photos for now â still photos: upload locally (TrustMark path).";return}B.value="",j.value="Downloading from Google Photosâ¦",F.value="upload";try{const{data:o}=await Ee.get(`/api/oauth/google-photos/media/${encodeURIComponent(a.id)}/content`,{responseType:"blob",timeout:12e4}),g=a.filename||`photos_${Date.now()}.mp4`,z=new File([o],g,{type:a.mimeType||o.type||"video/mp4"});t(z),j.value=""}catch(o){B.value=oe(o,"Could not pull that video from Google Photos"),j.value="",F.value="idle"}}return re([d,k,S,m,v],nt,{deep:!0}),re(se,u=>{if(u&&ne.value==="image"&&(E.value="print_lab"),u){const a=new Set(be.value.map(o=>o.id));S.value=S.value.filter(o=>a.has(o))}}),lt(()=>{wt(),it(),f.wmReady&&he()}),re(()=>L.query.fan,()=>it()),re(()=>f.wmReady,u=>{u&&he()}),re(()=>f.refreshKey,()=>{f.wmReady&&he()}),It(()=>Ge()),(u,a)=>(s(),i("section",Kl,[e("div",Jl,[e("div",Ql,[a[34]||(a[34]=e("h3",null,"New encode",-1)),a[35]||(a[35]=e("p",{class:"tp-muted"},[q(" Upload one "),e("strong",null,"master file"),q(" (video or photo), pick an account (or a whole PPV drop), and Trace prepares a unique watermarked copy for each person. Download below and send it yourself. ")],-1)),h.value?(s(),i("div",Yl,[e("span",null,p(h.value),1),Y.value&&V.value<=0?(s(),i("button",{key:0,t
1ype:"button",class:"tp-btn tp-btn--primary",onClick:a[0]||(a[0]=o=>u.$emit("subscribe"))}," Upgrade to Pro ")):y("",!0)])):y("",!0),A.value?(s(),i("p",Zl," Detection is in demo mode â encodes are for testing only. Full matching must be online before you rely on account attribution. ")):y("",!0),U.statusLoading?(s(),i("p",Hl,"Checking Traceâ¦")):U.wmReady?U.canPackage?A.value?y("",!0):(s(),i(ee,{key:5},[e("div",to,[e("button",{type:"button",class:ge(["mode",{"mode--on":!v.value}]),disabled:_.value,onClick:a[2]||(a[2]=o=>v.value=!1)}," One account ",10,ao),e("button",{type:"button",class:ge(["mode",{"mode--on":v.value}]),disabled:_.value,onClick:a[3]||(a[3]=o=>v.value=!0)}," Batch (one master à many accounts) ",10,lo)]),e("div",oo,[v.value?y("",!0):(s(),Fe(Oa,{key:0,modelValue:k.value,"onUpdate:modelValue":a[4]||(a[4]=o=>k.value=o),fans:r.value,disabled:_.value,onCreate:K},null,8,["modelValue","fans","disabled"])),e("label",so,[a[21]||(a[21]=e("span",{class:"lbl"},"Optional title",-1)),J(e("input",{"onUpdate:modelValue":a[5]||(a[5]=o=>d.value=o),type:"text",placeholder:"e.g. March drop",disabled:_.value,onKeydown:Ze(xe(Tt,["prevent"]),["enter"])},null,40,no),[[Ne,d.value]])])]),v.value?(s(),i("div",io,[e("div",uo,[a[23]||(a[23]=e("span",{class:"lbl"},"Accounts for this drop",-1)),J(e("input",{"onUpdate:modelValue":a[6]||(a[6]=o=>fe.value=o),type:"search",class:"batch-search",placeholder:"Filter accountsâ¦",disabled:_.value},null,8,ro),[[Ne,fe.value]]),e("label",co,[J(e("input",{"onUpdate:modelValue":a[7]||(a[7]=o=>se.value=o),type:"checkbox",disabled:_.value},null,8,vo),[[Ye,se.value]]),a[22]||(a[22]=q(" VIP scarcity only ",-1))]),e("button",{type:"button",class:"tp-btn tp-btn--ghost",disabled:_.value||!r.value.length,onClick:n},p(We.value?"Clear all":"Select all"),9,po)]),se.value?(s(),i("p",fo," Scarcity pack: only VIP roster accounts. Mid-tier does not get this exclusive file. ")):y("",!0),r.value.length?(s(),i("ul",ho,[(s(!0),i(ee,null,pe(be.value,o=>(s(),i("li",{key:o.id},[e("label",null,[J(e("input",{"onUpdate:modelValue":a[8]||(a[8]=g=>S.value=g),type:"checkbox",value:o.id,disabled:_.value},null,8,yo),[[Ye,S.value]]),q(" "+p(ie(X)(o)),1)])]))),128))])):(s(),i("p",bo," No accounts yet â switch to âOne accountâ and create one. ")),e("p",mo,[q(p(S.value.length)+" account(s) selected â one encode job each. ",1),Y.value?(s(),i("span",{key:0,class:ge({"tp-err":ze.value>V.value})}," Free: "+p(V.value)+" of "+p(Z.value)+" left this month â this batch needs "+p(ze.value)+". ",3)):y("",!0)]),Ue.value.length?(s(),i("ul",go,[(s(!0),i(ee,null,pe(Ue.value,o=>(s(),i("li",{key:o.fanId},[e("span",null,p(o.label),1),e("span",{class:ge(["tp-pill",Xe(o.status)])},p(o.status),3),o.status==="failed"&&o.videoId?(s(),i("button",{key:0,type:"button",class:"tp-btn tp-btn--ghost",onClick:g=>et(o.videoId)}," Retry ",8,ko)):y("",!0)]))),128))])):y("",!0)])):y("",!0),e("div",{class:ge(["tp-drop",{"tp-drop--active":Ie.value,"tp-drop--has":!!W.value}]),onDragover:a[13]||(a[13]=xe(o=>Ie.value=!0,["prevent"])),onDragleave:a[14]||(a[14]=o=>Ie.value=!1),onDrop:xe(b,["prevent"])},[a[30]||(a[30]=e("p",null,"Drop master file here",-1)),e("div",_o,[e("label",wo,[a[24]||(a[24]=q(" Choose file ",-1)),e("input",{type:"file",accept:"video/*,image/jpeg,image/png,image/webp",disabled:_.value,onChange:l},null,40,$o)]),e("button",{type:"button",class:"tp-btn tp-btn--ghost tp-photos-btn",disabled:_.value,onClick:a[9]||(a[9]=o=>ke.value=!0)},[e("img",{src:ie(Q),alt:"",width:"16",height:"16",class:"tp-photos-icon"},null,8,Po),a[25]||(a[25]=q(" Google Photos ",-1))],8,Co)]),a[31]||(a[31]=e("p",{class:"tp-muted source-note"}," Video â marked MP4 (VideoSeal). Still photo (JPEG/PNG/WebP) â marked PNG (TrustMark). Max 200MB. Digital stills lab-proven; not a physical print SLA. ",-1)),at(Gt,{file:W.value,disabled:_.value,onClear:a[10]||(a[10]=o=>W.value=null),onReplace:t},null,8,["file","disabled"]),ne.value!=="image"?(s(),i("label",Lo,[J(e("input",{"onUpdate:modelValue":a[11]||(a[11]=o=>m.value=o),type:"checkbox",disabled:_.value},null,8,To),[[Ye,m.value]]),a[26]||(a[26]=e("span",{class:"visible-toggle__text"}," Microscopic corner mark (T-ID) â default on. Near-invisible at normal size. ",-1)),a[27]||(a[27]=e("span",{class:"tid-mock","aria-hidden":"true"},[e("span",{class:"tid-mock__frame"},[e("span",{class:"tid-mock__mark"},"T-ID")])],-1))])):(s(),i("p",So," Photos use invisible TrustMark only (no corner T-ID). Survives typical JPEG / social re-saves in lab; not a physical print / camera-of-print SLA. ")),ne.value==="image"?(s(),i("label",Uo,[a[29]||(a[29]=e("span",{class:"still-strength__label"},"Photo mark strength",-1)),J(e("select",{"onUpdate:modelValue":a[12]||(a[12]=o=>E.value=o),disabled:_.value,class:"still-strength__select"},[...a[28]||(a[28]=[e("option",{value:"social"},"Social (softer, digital re-saves)",-1),e("option",{value:"default"},"Default",-1),e("option",{value:"print_lab"},"Print lab (stronger â lab only, not a print SLA)",-1)])],8,Ro),[[Le,E.value]])])):y("",!0),W.value?(s(),i("div",Vo,[e("button",{type:"button",class:"tp-btn tp-btn--primary",disabled:_.value||!je.value,onClick:ut},p(_.value?"Workingâ¦":"Encode labeled copy"),9,Eo)])):y("",!0)],34),_e.value.length&&!_.value?(s(),i("div",Fo,[a[32]||(a[32]=e("span",{class:"lbl"},"Recent masters",-1)),e("div",Io,[(s(!0),i(ee,null,pe(_e.value,o=>(s(),i("button",{key:o.original_sha256,type:"button",class:"master-chip",onClick:g=>Ut(o)},[e("span",Mo,p(o.media_kind==="image"?"Photo":"Video"),1),q(" "+p(o.title)+" ",1),e("span",Ao,"Ã"+p(o.encode_count),1)],8,Do))),128))])])):y("",!0),_.value||F.value==="ready"||F.value==="failed"?(s(),Fe(zt,{key:2,stage:F.value,"upload-pct":$e.value,"job-pct":Ce.value,"media-kind":ne.value,"leave-safe":_.value,onStopWaiting:$t},null,8,["stage","upload-pct","job-pct","media-kind","leave-safe"])):y("",!0),H.value?(s(),i("p",xo,p(H.value),1)):y("",!0),j.value?(s(),i("p",Oo,p(j.value),1)):y("",!0),Pe.value?(s(),i("div",Bo,[e("p",No,[a[33]||(a[33]=q(" Labeled copy ready for ",-1)),e("strong",null,p(Pe.value.fanLabel),1)]),e("div",qo,[e("button",{type:"button",class:"tp-btn tp-btn--primary",disabled:Se.value,onClick:kt},p(Se.value?"Downloadingâ¦":"Download labeled copy"),9,Go),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:_t},"Share")])])):y("",!0),B.value?(s(),i("p",zo,[q(p(B.value)+" ",1),ve.value?(s(),i("button",{key:0,t
1ype:"button",class:"tp-btn tp-btn--ghost",style:{"margin-left":"0.5rem"},onClick:a[15]||(a[15]=o=>et(ve.value))}," Retry ")):y("",!0)])):y("",!0)],64)):(s(),i("p",eo,[a[20]||(a[20]=q(" Upgrade to Pro if youâve hit your Free allowance, or wait until next month. ",-1)),e("button",{type:"button",class:"tp-btn tp-btn--primary",style:{"margin-left":"0.5rem"},onClick:a[1]||(a[1]=o=>u.$emit("subscribe"))}," Upgrade to Pro ")])):(s(),i("p",Xl,p(U.statusMessage||"Trace isnât available right now. Refresh, or email [email protected]."),1))]),at(jl,{ref_key:"libraryRef",ref:qe,videos:de.value,fans:r.value,loading:ce.value,error:we.value,"highlight-id":De.value,"wm-ready":U.wmReady,onRefresh:he,onFocusEncode:Ct,onRetry:a[16]||(a[16]=o=>et(o.id)),onReencode:St,onGotoShare:Pt,onGotoDecode:Lt,onToast:a[17]||(a[17]=o=>H.value=o)},null,8,["videos","fans","loading","error","highlight-id","wm-ready"])]),ke.value?(s(),i("div",Wo,[e("div",jo,[e("div",Ko,[a[36]||(a[36]=e("h4",null,"Pick a video from Google Photos",-1)),a[37]||(a[37]=e("p",{class:"tp-muted"}," Still photos: upload locally (TrustMark path). Google Photos picker is video-only for now. ",-1)),e("button",{type:"button",class:"tp-btn tp-btn--ghost",onClick:a[18]||(a[18]=o=>ke.value=!1)}," Close ")]),at($a,{onSelect:Rt,onClose:a[19]||(a[19]=o=>ke.value=!1)})])])):y("",!0)]))}}),cs=He(Qo,[["__scopeId","data-v-5c6eca9d"]]);export{cs as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.