PageSourceSearch

https://flowmo.ai/_next/static/chunks/81197-fbbd00db4e059d9b.js

js flowmo.ai collected 2026-10-05 12:02:41 UTC 37,687 bytes, 33 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[81197],{6880:(e,t,n)=>{n.d(t,{R:()=>$});var r=n(45709),a=n(22566),i=n(91541),o=n(74786),s=n(43831),l=n(38851),d=n(36595);function u(e,t){let n=0,r=0,a=0;for(;n<e.length&&r<t.length;){let i=Math.max(e[n].start,t[r].start),o=Math.min(e[n].end,t[r].end);o>i&&(a+=o-i),e[n].end<t[r].end?n++:r++}return a}let c=e=>Math.max(0,Math.min(1,e));var p=n(76378),h=n(7628),f=n(5864),m=n(61247),g=n(71753),w=n(16806);let b=new Map,y=new Map,x=()=>new DOMException("Caption generation stopped.","AbortError");function S(e,t){try{e.onPhase?.(t)}catch{}}var M=n(50534);function v(){let e=p.useEditorStore.getState();{let e=new URLSearchParams(window.location?.search??""),t=e.get("pid");if(t)return`project:${t}`;let n=e.get("doc");if(n)return`document:${e.get("room")??""}:${n}`}let t=e.projectSettings;return t?.project?.id?`project:${t.project.id}`:`root:${e.rootId??""}`}function A(e,t){let n=p.useEditorStore.getState(),r=n.timelines[e];if(!r)throw Error("The caption timeline no longer exists.");return JSON.stringify({userId:t,document:v(),duration:r.duration,prefs:Object.entries(r.captionsPrefs??{}).sort(([e],[t])=>e.localeCompare(t)),audio:(0,M.Z)(e,n.timelines,n.elements)})}function E(e){if(e?.aborted)throw new DOMException("Aborted","AbortError")}async function T(e,t){try{let n=window.AudioContext||window.webkitAudioContext||null;if(!n)return null;let r=new n;try{let n=await (0,w.$B)({label:"Checking caption audio",timeoutMs:3e4,signal:t},async()=>r.decodeAudioData(await e.arrayBuffer())),a=n.numberOfChannels;if(1===a)return{samples:n.getChannelData(0).slice(),sampleRate:n.sampleRate};let i=new Float32Array(n.length);for(let e=0;e<a;e++){let t=n.getChannelData(e);for(let e=0;e<n.length;e++)i[e]+=t[e]}for(let e=0;e<n.length;e++)i[e]/=a;return{samples:i,sampleRate:n.sampleRate}}finally{r.close()}}catch(e){if(t?.aborted)throw e;return console.warn("[captions] WAV decode for speech anchoring failed:",e.message),null}}async function $(e){E(e.signal);let t=m.auth.currentUser?.uid;if(!t)throw Error("Sign in to generate captions.");let n=(0,r.M)(e.timelineId);n!==e.timelineId&&console.log(`[captions] redirecting from precomp timeline ${e.timelineId} → page main timeline ${n} so the mix covers the whole video.`);let a=A(n,t);return function(e,t){let{timelineId:n,inputKey:r,signal:a}=e,i=e.scopeKey??n;if(a?.aborted)return Promise.reject(x());let o=b.get(i);if(o&&o.inputKey!==r)return Promise.reject(Error("Caption generation is already running for this timeline. Stop it before generating captions for changed audio or settings."));if(!o&&e.reuseIfUnchanged){let t=y.get(i);if(t?.inputKey===r&&t.captionSnapshot===JSON.stringify(e.readCaptions()??null)){try{e.onPhase?.({phase:"write",detail:"Using captions already generated for this audio."})}catch{}return Promise.resolve({...t.result,reused:!0})}}let s=!o;o||(o={inputKey:r,controller:new AbortController,subscribers:new Set},b.set(i,o));let l=o,d=new Promise((t,n)=>{let r={onPhase:e.onPhase,finish:(e,i)=>{l.subscribers.delete(r)&&(a?.removeEventListener("abort",o),void 0!==i?n(i):t(e))}},o=()=>{r.finish(void 0,x()),0===l.subscribers.size&&(l.controller.abort(),b.get(i)===l&&b.delete(i))};l.subscribers.add(r),a?.addEventListener("abort",o,{once:!0}),l.progress&&S(r,l.progress)});if(s){let n=e=>{if(!l.controller.signal.aborted)for(let t of(l.progress=e,l.subscribers))S(t,e)};Promise.resolve().then(()=>{if(l.controller.signal.aborted)throw x();return t(l.controller.signal,n)}).then(t=>{if(l.controller.signal.aborted)throw x();for(let n of(b.get(i)===l&&b.delete(i),y.delete(i),y.set(i,{inputKey:r,captionSnapshot:JSON.stringify(e.readCaptions()??null),result:t}),y.size>20&&y.delete(y.keys().next().value),l.subscribers))n.finish(t)}).catch(e=>{for(let t of(b.get(i)===l&&b.delete(i),l.subscribers))t.finish(void 0,e)}).finally(()=>{b.get(i)===l&&b.delete(i)})}return d}({...e,timelineId:n,inputKey:a,scopeKey:JSON.stringify([t,v(),n]),readCaptions:()=>p.useEditorStore.getState().timelines[n]?.captions},(e,r)=>k({timelineId:n,signal:e,onPhase:r},t,a))}
1async function k(e,t,n){let{timelineId:b,onPhase:y,signal:x}=e;E(x);let S=JSON.stringify(p.useEditorStore.getState().timelines[b]?.captions??null);y?.({phase:"mix",pct:0});let M=await (0,r.o)(b,{signal:x,includeMonoSamples:!0,onProgress:e=>{let t=e.total>0?e.done/e.total:0,n="decode"===e.phase?`Preparing audio sources (${e.done}/${e.total})…`:"render"===e.phase?"Mixing timeline audio…":"Encoding caption audio…";y?.({phase:"mix",pct:t,detail:n})}});if(0===M.participatingLayers)throw Error("No audio in this timeline — nothing to transcribe.");E(x);let v=p.useEditorStore.getState().timelines[b]?.captionsPrefs??{},$={maxChars:v.maxChars??i.a6,maxSeconds:v.maxSeconds??i.s3,maxWords:v.maxWords??i.WK};y?.({phase:"upload"});let k=await (0,w.$B)({label:"Uploading caption audio",signal:x,timeoutMs:Math.min(3e5,6e4+5e3*Math.ceil(M.file.size/1048576))},()=>(0,a.uploadChatMedia)(M.file,t,`caption-mix-${b}`,!0,!0));if(!k)throw Error("Failed to upload caption audio mix.");console.log(`[captions] mix WAV ready (${M.participatingLayers} layer${1===M.participatingLayers?"":"s"}, ${M.durationSec.toFixed(2)}s) — open to listen:`,k),y?.({phase:"transcribe"});let C=v.captionEngine??"auto",O=[],F="auto",N=!1;if("gemini"!==C)try{let e=await (0,o.xW)(k,$,{signal:x,durationSec:M.durationSec,onStatus:e=>y?.({phase:"transcribe",detail:e})});e&&e.segments.length>0?(O=e.segments.map(e=>({...e,text:(0,s.h)(e.text)})),F=e.language,N=!0,console.log(`[captions] fal Whisper transcription: ${O.length} utterance(s), language: ${F} — word timings are sample-clocked, VAD re-anchor skipped.`)):e?console.warn("[captions] fal Whisper returned no words — falling back to Gemini."):console.warn("[captions] fal Whisper unavailable (no api-server / empty result) — falling back to Gemini.")}catch(e){if(x?.aborted)throw e;console.warn("[captions] fal Whisper transcription failed — falling back to Gemini:",e.message)}if(E(x),!N){y?.({phase:"transcribe",detail:"Trying the backup speech transcription service…"});let e=await (0,i.vV)(k,{signal:x,durationSec:M.durationSec,onStatus:e=>y?.({phase:"transcribe",detail:e})});E(x),O=e.segments.map(e=>({...e,text:(0,s.h)(e.text)})),F=e.language&&"und"!==e.language?e.language:"auto",console.log(`[captions] Gemini transcription language: ${F}`)}y?.({phase:"transcribe",detail:"Checking caption timing…"});let L=M.monoSamples&&M.sampleRate?{samples:M.monoSamples,sampleRate:
1M.sampleRate}:await T(M.file,x);E(x);let R=L?(0,l.Z)(L.samples,L.sampleRate,{bridgeGapSec:v.vad?.bridgeGapSec,minSpeechSec:v.vad?.minSpeechSec,padSec:v.vad?.padSec}):[],D=!1;if(!N&&!1!==v.anchorToSpeech&&O.length>0&&R.length>0){let e=(0,d.x)(O,R,{totalDurationSec:M.durationSec});e&&(console.log(`[captions] re-anchored onto measured speech: ${e.regionsUsed}/${R.length} region(s), last end ${e.endBefore.toFixed(2)}s → ${e.endAfter.toFixed(2)}s (video ${M.durationSec.toFixed(2)}s).`),O=e.segments,D=!0)}if(!N&&!D&&O.length>0){let e=!1===v.anchorToSpeech?"anchorToSpeech is disabled in prefs":L?0===R.length?"VAD found no speech regions in the mix (continuous music/ambience?)":"anchoring found no usable region mapping":"the mix WAV failed to decode (no VAD possible)";console.warn(`[captions] NOT re-anchored — ${e}. Placement uses Gemini's silence-skipped estimates verbatim; captions will drift earlier wherever the timeline has silence.`)}E(x);let P=v.minSeconds??i.KN,I=!0===v.respectSentences,U=I?(0,i.fZ)(O,$):O,j=(0,i.vr)(U,$,{respectSentences:I}),B=(0,i.FY)(j,P),W=M.durationSec>0?M.durationSec:void 0,G=(W?B.map(e=>{let t=Math.min(e.start,W-.04),n=Math.min(e.end,W);return t<0||n<=t?{...e,start:Math.max(0,t),end:Math.max(Math.max(0,t)+.04,n)}:{...e,start:t,end:n}}).filter(e=>e.end>0):B).map(e=>({...e,id:(0,h.generateId)("cap")})),z=G;if(L){let e=function(e,t,n,r,a={}){let i=a.regions??(0,l.Z)(t,n),o=(0,l.O)(i),s=i.map(e=>({start:e.start,end:e.end})),d=function(e){let t=e.filter(e=>e.end>e.start).sort((e,t)=>e.start-t.start),n=[];for(let e of t){let t=n[n.length-1];t&&e.start<=t.end?t.end=Math.max(t.end,e.end):n.push({...e})}return n}(e.map(e=>({start:e.start,end:e.end}))),p=d.reduce((e,t)=>e+(t.end-t.start),0),h=u(d,s),f=o>0?c(h/o):0,m=p>0?c(h/p):0,g=[...e].sort((e,t)=>e.start-t.start),w=0,b=0;for(let e of i){let t=g.find(t=>t.end>e.start&&t.start<e.end);t&&(w+=Math.abs(t.start-e.start),b++)}let y=b>0?w/b:0,x=[],S=e=>e.trim().toLowerCase().replace(/\s+/g," ");for(let e=0;e<g.length;e++){let t=g[e],n=[],a=t.end-t.start,i=u([{start:t.start,end:t.end}],s);a>0&&i/a<.4&&n.push("on-silence");let o=g[e-1];if(o&&S(o.text)===S(t.text)&&t.text.trim()&&n.push("duplicate"),t.words&&t.words.length){for(let e of t.words)if(e.end-e.start>3){n.push("long-word");break}}t.end>
1r+.1&&n.push("overruns-video"),a<.05&&n.push("zero-length"),n.length&&x.push({id:t.id,reasons:n})}let M=x.map(e=>e.id),v=Math.max(0,e.reduce((e,t)=>Math.max(e,t.end),0)-r),A=100*(.55*m+.45*f);return A-=Math.min(20,v/Math.max(1,r)*100),A-=Math.min(15,y/.5*15),A-=e.length?M.length/e.length*15:0,{score:A=Math.max(0,Math.min(100,Math.round(A))),overrunSec:v,speechRecall:f,captionPrecision:m,onsetMaeSec:y,suspectIds:M,flags:x,regionCount:i.length,speechSec:o}}(G,L.samples,L.sampleRate,M.durationSec,{regions:R}),t=new Set(e.suspectIds),n=new Map(e.flags.map(e=>[e.id,e.reasons.join(", ")]));z=G.map(e=>t.has(e.id)?{...e,qaSuspect:!0,qaReason:n.get(e.id)}:e),console.log(`[captions] QA ${e.score}/100 — precision ${Math.round(100*e.captionPrecision)}%, recall ${Math.round(100*e.speechRecall)}%, overrun ${e.overrunSec.toFixed(2)}s; ${t.size} suspect chip(s) flagged for review.`)}else N||(z=G.map(e=>({...e,qaSuspect:!0,qaReason:"unverified: mix decode failed (no VAD anchor/QA)"})));if(E(x),y?.({phase:"write"}),E(x),m.auth.currentUser?.uid!==t||A(b,t)!==n)throw Error("The timeline audio or caption settings changed during transcription. Existing captions were kept; generate again for the updated audio.");if(JSON.stringify(p.useEditorStore.getState().timelines[b]?.captions??null)!==S)throw Error("Captions were edited during transcription. Your edits were kept; regenerate again if you want to replace them.");p.useEditorStore.getState().setTimelineCaptions(b,z,{language:F,generatedAt:Date.now(),replaceAll:!0});let V=(0,f.jz)(M.durationSec);return Promise.resolve().then(()=>(0,g.updateCurrentAiCredits)(t,"text",V)).then(()=>{console.log(`[captions] charged ${V} spark(s) for ${Math.round(M.durationSec)}s of audio.`)}).catch(e=>{console.warn("[captions] spark charge failed (captions were still written):",e.message)}),{segmentCount:z.length,durationSec:M.durationSec,language:F}}},9192:(e,t,n)=>{n.d(t,{S:()=>l});var r=n(95155),a=n(12115),i=n(47279),o=n(55638),s=n(40980);let l=a.forwardRef(({className:e,...t},n)=>(0,r.jsx)(i.Root,{ref:n,"data-slot":"checkbox",className:(0,s.cn)("peer h-4 w-4 shrink-0 rounded-sm border border-primary shadow focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",e),...t,children:(0,r.jsx)(i.Indicator,{className:(0,s.cn)("flex items-center justify-center text-current"),children:(0,r.jsx)(o.Srz,{className:"h-4 w-4"})})}));l.displayName=i.Root.displayName},9227:(e,t,n)=>{n.d(t,{d:()=>i});var r=n(76378),a=n(7628);function i(e){let t=r.useEditorStore.getState(),n=t.timelines[e];if(!n)return 0;for(let r of(n.stopPoints??[]).filter(e=>"auto"===e.kind))t.removeStopPoint(e,r.id);let i=n.duration??5,o=0;for(let r of n.layers){if("precomp"!==r.layerType)continue;let n=r.startOffset??0,s=r.precompTimelineId?t.timelines[r.precompTimelineId]:null,l=s?.duration??i,d=r.trimIn??0,u=n+Math.max(0,(r.trimOut??l)-d);t.addStopPoint(e,{id:(0,a.generateId)("sp"),time:u,name:r.name,kind:"auto"}),o+=1}return o}},16806:(e,t,n)=>{n.d(t,{$B:()=>i,sm:()=>r,vz:()=>a});class r extends Error{constructor(e){super(`${e} timed out. Please try again.`),this.name="CaptionTimeoutError"}}function a(e){return e instanceof Error&&"AbortError"===e.name}function i(e,t){let n=new AbortController,a=()=>new DOMException("Caption generation cancelled.","AbortError");return e.signal?.aborted?Promise.reject(a()):new Promise((i,o)=>{let s=!1,l=(t,n)=>{s||(s=!0,clearTimeout(c),e.signal?.removeEventListener("abort",u),void 0!==t?o(t):i(n))},d=e=>{l(e),n.abort(e)},u=()=>d(a());e.signal?.addEventListener("abort",u,{once:!0});let c=setTimeout(()=>d(new r(e.label)),Math.max(1,e.timeoutMs));Promise.resolve().then(()=>{if(n.signal.aborted)throw n.signal.reason;return t(n.signal)}).then(e=>l(void 0,e),e=>l(e))})}},19969:(e,t,n)=>{n.d(t,{Xx:()=>c,h5:()=>i,oy:()=>a});var r=n(16806);function a(e,t="whisper"){let n=Number.isFinite(e)&&e>0?e:120;return"whisper"===t?Math.min(3e5,Math.max(6e4,3e4+500*n)):Math.min(36e4,Math.max(9e4,6e4+750*n))}function i(e,t){try{e.onStatus?.(t)}catch{}}let o=["gemini-3.8-flash","gemini-3.5-flash-lite"],s=["global","us-central1","europe-west4"],l=e=>e instanceof Error?e.message:String(e),d=e=>/\b404\b|not found|(?:location|region).*(?:unavailable|unsupported|not supported)|not supported.*(?:location|region)/i.test(l(e)),u=e=>/\b(?:401|403)\b|unauthenticated|permission.?denied|(?:invalid|unsupported).*(?:audio|media|mime|file uri)/i.test(l(e));async function c(e,t,n=!1){let l=n?3e4:a(e.durationSec,"gemini");return(0,r.$B)({label:n?"Audio language detection":"Caption transcription",timeoutMs:l,signal:e.signal},async n=>{let a,c=Date.now()+l;for(let p of o){for(let o of s){if(n.aborted)throw n.reason;let h=c-Date.now();
1if(h<=0)throw new r.sm("Caption transcription");let f=Math.min(Math.ceil(l/2),h);try{return await (0,r.$B)({label:"Caption transcription request",timeoutMs:f,signal:n},e=>t({modelName:p,location:o,signal:e,timeoutMs:f}))}catch(t){if(n.aborted)throw n.reason;if(u(t))throw t;if(a=t,d(t)&&o!==s[s.length-1]){i(e,"Transcription model unavailable here; trying another supported location…");continue}break}}p!==o[o.length-1]&&i(e,"Transcription service is slow or unavailable; trying the fallback model…")}throw a??Error("Caption transcription failed.")})}},36595:(e,t,n)=>{n.d(t,{x:()=>i});var r=n(38851);function a(e,t,n){if(0===e.length||n<=e[0].start)return 0;for(let t of e){if(n<t.start)return t.before;if(n<=t.start+t.len)return t.before+(n-t.start)}return t}function i(e,t,n={}){if(0===e.length)return null;let o=(0,r.O)(t);if(0===t.length||o<=0)return null;let s=[...e].sort((e,t)=>e.start-t.start),{intervals:l,total:d}=function(e){let t=e.filter(e=>Number.isFinite(e.start)&&Number.isFinite(e.end)&&e.end>e.start).map(e=>({start:e.start,end:e.end})).sort((e,t)=>e.start-t.start),n=[],r=0;for(let e of t){let t=n[n.length-1];if(t&&e.start<=t.start+t.len){let n=Math.max(t.start+t.len,e.end);r+=n-(t.start+t.len),t.len=n-t.start}else n.push({start:e.start,before:r,len:e.end-e.start}),r+=e.end-e.start}return{intervals:n,total:r}}(s);if(d<=0)return null;let u=Math.max(...e.map(e=>e.end)),c=n.totalDurationSec&&n.totalDurationSec>0?n.totalDurationSec:t[t.length-1].end,p=[];{let e=0;for(let n of t)p.push(e),e+=n.end-n.start}let h=e=>{let n=Math.max(0,Math.min(o,e));for(let e=t.length-1;e>=0;e--)if(n>=p[e])return e;return 0},f=t.map(()=>[]);for(let e of s)f[h((a(l,d,e.start)+a(l,d,e.end))/2/d*o)].push(e);let m=[],g=0;for(let e=0;e<t.length;e++){let n=f[e];if(0===n.length)continue;g++;let r=t[e],a=Math.max(0,r.end-r.start),i=n[0].start,o=n[n.length-1].end-i,s=e=>o>0?r.start+(e-i)/o*a:r.start;for(let e of n){let t=Math.max(r.start,Math.min(s(e.start),r.end)),n=Math.max(t+Math.min(.12,a),Math.min(s(e.end),r.end));n>r.end&&(n=r.end),n<=t&&(n=Math.min(r.end,t+.04)),t=Math.min(t,c),n=Math.min(n,c);let i=e.words;if(i&&i.length>0){let e=t;i=i.map(r=>{let a=Math.max(t,Math.min(s(r.start),n)),i=Math.max(a,Math.min(s(r.end),n));return a<e&&(a=e),i<a&&(i=a),e=i,{word:r.word,start:a,end:i}})}m.push(i?{...e,start:t,end:n,words:i}:{...e,start:t,end:n})}}if(0===m.length)return null;let w=m[m.length-1].end;return{segments:m,gemSpeechSec:d,realSpeechSec:o,regionsUsed:g,endBefore:u,endAfter:w}}},38851:(e,t,n)=>{n.d(t,{O:()=>i,Z:()=>a});function r(e,t){if(0===e.length)return 0;let n=Math.min(e.length-1,Math.max(0,Math.round(t*(e.length-1))));return e[n]}function a(e,t,n={}){let i={frameSec:n.frameSec??.025,hopSec:n.hopSec??.01,bridgeGapSec:n.bridgeGapSec??.28,minSpeechSec:n.minSpeechSec??.12,padSec:n.padSec??.05};if(!Number.isFinite(t)||t<=0||0===e.length)return[];let o=Math.max(1,Math.round(i.frameSec*t)),s=Math.max(1,Math.round(i.hopSec*t)),l=Math.max(0,Math.floor((e.length-o)/s)+1);if(l<=0)return[];let d=new Float64Array(l);for(let t=0;t<l;t++){let n=t*s,r=0;for(let t=0;t<o;t++){let a=e[n+t];r+=a*a}d[t]=Math.sqrt(r/o)}let u=Float64Array.from(d).sort(),c=r(u,.1),p=r(u,.95);if(p<=1e-4)return[];let h=p>3*c+1e-4?Math.max(1e-4,c+(p-c)*.15):Math.max(1e-4,.1*p),f=e=>(e*s+o/2)/t,m=[],g=-1;for(let e=0;e<l;e++){let t=d[e]>=h;t&&g<0?g=e:!t&&g>=0&&(m.push({start:f(g),end:f(e)}),g=-1)}if(g>=0&&m.push({start:f(g),end:f(l)}),0===m.length)return[];let w=[m[0]];for(let e=1;e<m.length;e++){let t=w[w.length-1],n=m[e];n.start-t.end<=i.bridgeGapSec?t.end=n.end:w.push({...n})}let b=e.length/t,y=w.filter(e=>e.end-e.start>=i.minSpeechSec);if(0===y.length)return[];let x=[];for(let e=0;e<y.length;e++){let t=y[e],n=x.length>0?x[x.length-1].end:0,r=e<y.length-1?y[e+1].start:b,a=Math.max(n,t.start-i.padSec,0),o=Math.min(r,t.end+i.padSec,b);o>a&&x.push({start:a,end:o})}return x}function i(e){let t=0;for(let n of e)t+=Math.max(0,n.end-n.start);return t}},40403:(e,t,n)=>{function r(e,t){return n=>{e(e=>({[t]:"function"==typeof n?n(e[t]):n}))}}n.d(t,{Y:()=>a});let a=(0,n(41535).v)(e=>({messages:[],setMessages:r(e,"messages"),input:"",setInput:r(e,"input"),isLoading:!1,setIsLoading:r(e,"
1isLoading"),isAgentExecuting:!1,setIsAgentExecuting:r(e,"isAgentExecuting"),nextSuggestions:[],setNextSuggestions:r(e,"nextSuggestions"),streamingText:"",setStreamingText:r(e,"streamingText"),activeSubmissionMeta:null,setActiveSubmissionMeta:r(e,"activeSubmissionMeta"),conversations:[],setConversations:r(e,"conversations"),currentConversationId:null,setCurrentConversationId:r(e,"currentConversationId"),selectedAssistantType:"design",setSelectedAssistantType:r(e,"selectedAssistantType"),pendingSubmission:null,setPendingSubmission:r(e,"pendingSubmission")}))},43831:(e,t,n)=>{n.d(t,{h:()=>i});let r=/<\/?(?:p|div|br|li|ul|ol|h[1-6]|section|article|blockquote|tr)\b[^>]*>/gi,a=/<\/?[a-z!][^>]*>/gi;function i(e){if(!e||!e.includes("<")&&!e.includes("&"))return e;let t=e;return(t=(t=(t=t.replace(r,"\n")).replace(a,"")).replace(/&nbsp;/gi," ").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#0*39;|&apos;/gi,"'")).replace(/[ \t]+/g," ").replace(/ *\n */g,"\n").replace(/\n{2,}/g,"\n").trim()}},45709:(e,t,n)=>{n.d(t,{o:()=>h,M:()=>u});var r=n(76378),a=n(50534),i=n(16806);class o extends Error{}async function s(e,t,n){let r=await (0,i.$B)({label:"Downloading timeline audio source",timeoutMs:12e4,signal:n},async t=>{let n=await fetch(e,{mode:"cors",signal:t});if(t.aborted)throw t.reason;if(!n.ok)throw Error(`Timeline audio download failed (HTTP ${n.status}).`);return n.arrayBuffer()});try{return await (0,i.$B)({label:"Decoding timeline audio source",timeoutMs:6e4,signal:n},()=>t.decodeAudioData(r))}catch(e){if((0,i.vz)(e)||e instanceof i.sm)throw e;throw new o("An audio source could not be decoded. Check that the source contains a supported audio track.")}}async function l(e,t,n,r,a){let i=new AbortController,l=()=>i.abort(a?.reason);a?.aborted&&l(),a?.addEventListener("abort",l,{once:!0});let d=new Map,u=0,c=async()=>{for(;u<e.length;){if(i.signal.aborted)throw new DOMException("Aborted","AbortError");let a=e[u++];try{d.set(a,await s(a,n,i.signal))}catch(e){if(!(e instanceof o)||t.has(a))throw e;console.warn("[mix-timeline-audio] video has no decodable audio track")}i.signal.aborted||r()}},p=Array.from({length:Math.min(6,e.length)},c);try{return await Promise.all(p),d}catch(e){throw i.abort(),await Promise.allSettled(p),e}finally{a?.removeEventListener("abort",l)}}function d(e,t){let n=e.length,r=e[0].length,a=2*n,i=r*a,o=new ArrayBuffer(44+i),s=new DataView(o),l=(e,t)=>{for(let n=0;n<t.length;n++)s.setUint8(e+n,t.charCodeAt(n))};l(0,"RIFF"),s.setUint32(4,36+i,!0),l(8,"WAVE"),l(12,"fmt "),s.setUint32(16,16,!0),s.setUint16(20,1,!0),s.setUint16(22,n,!0),s.setUint32(24,t,!0),s.setUint32(28,t*a,!0),s.setUint16(32,a,!0),s.setUint16(34,16,!0),l(36,"data"),s.setUint32(40,i,!0);let d=44;for(let t=0;t<r;t++)for(let r=0;r<n;r++){let n=Math.max(-1,Math.min(1,e[r][t]));s.setInt16(d,n<0?32768*n:32767*n,!0),d+=2}return o}function u(e){return function(e,t){let n=t.timelines[e];if(!n||n.isAutoMain)return e;let r=Object.values(t.timelines).filter(e=>e.isAutoMain),a=e=>/^\[data-f0-id=["']([^"']+)["']\]$/.exec(e??"")?.[1],i=r.filter(n=>(n=>{let r=new Set,a=[n];for(;a.length;){let n=a.pop();if(n===e)return!0;if(!r.has(n))for(let e of(r.add(n),t.timelines[n]?.layers??[]))e.precompTimelineId&&a.push(e.precompTimelineId)}return!1})(n.id));if(!i.length){let e=new Set,o=a(n.rootSelector);for(;o&&!e.has(o);)e.add(o),o=t.elements[o]?.parentId??void 0;i=r.filter(t=>{let n=a(t.rootSelector);return!!n&&e.has(n)})}if(!i.length)return e;let o=t.pages.find(e=>e.id===t.activePageId),s=o?.rootElementId??o?.canvasElementId;return i.find(e=>a(e.rootSelector)===s)?.id??i[0].id}(e,r.useEditorStore.getState())}function c(e){if(e?.aborted)throw new DOMException("Aborted","AbortError")}function p(e){let t=e.numberOfChannels;if(1===t)return e.getChannelData(0);let n=new Float32Array(e.length);for(let r=0;r<t;r++){let t=e.getChannelData(r);for(let r=0;r<e.length;r++)n[r]+=t[r]}for(let r=0;r<e.length;r++)n[r]/=t;return n}async function h(e,t={}){let n,o,s,u=t.sampleRate??16e3,f=t.channels??1,{signal:m,onProgress:g}=t;c(m);let w=r.useEditorStore.getState(),b=w.timelines[e];if(!b)throw Error(`Timeline ${e} not found.`);let y=(0,a.Z)(e,w.timelines,w.elements),x=y.filter(e=>!e.muted&&(0!==e.volume||(e.volumeKeyframes??[]).some(e=>0!==e.value))&&"string"==typeof e.src&&e.src.length>0&&e.endTime>e.startTime),S=x.filter(e=>"audio"===e.layerType).length,M=x.filter(e=>"video"===e.layerType).length;for(let t of(console.log(`[mix-timeline-audio] timeline ${e}: ${x.length} audible layer(s) — ${S} audio, ${M} video. Total flattened: ${y.length}.`),x))console.log(`[mix-timeline-audio]   • ${t.layerType} ${t.id} @ ${(t.startTime/1e3).toFixed(2)}s–${(t.endTime/1e3).toFixed(2)}s (trim=${(t.mediaTrimStart/1e3).toFixed(2)}s, speed=${t.speed}, vol=${t.volume}) src=…${t.src.slice(-48)}`);let v=0;for(let e of x)v=Math.max(v,e.endTime/1e3);let A=Math.max(b.duration??v,.01),E=()=>({file:new File([d(Array.from({length:f},()=>new Float32Array(0)),u)],`timeline-mix-${e}.wav`,{type:"audio/wav"}),durationSec:A,participatingLayers:0,plannedLayers:x.length,...t.includeMonoSamples?{monoSamples:new Float32Array(0),sampleRate:u}:{}});if(!x.length)return E();let T=(s=window.electronAPI)&&"function"==typeof s.mixTimelineAudio?s:null;if(T&&x.length>0){g?.({done:0,total:x.length,phase:"decode"}),c(m),g?.({done:0,total:1,phase:"render"});let n=await (0,i.$B)({label:"Mixing timeline audio on desktop",timeoutMs:Math.max(12e4,1e3*A),signal:m},()=>T.mixTimelineAudio({timelineLayers:x}));if(c(m),!n.success||!n.buffer)throw Error(n.error||"Electron audio mix failed");g?.({done:1,total:1,phase:"encode"});let r=new File([n.buffer],`timeline-mix-${e}.wav`,{type:"audio/wav"}),a=t.includeMonoSamples?function(e){if(e.byteLength<44)return null;let t=new DataView(e),n=t=>String.fromCharCode(...new Uint8Array(e,t,4));if("RIFF"!==n(0)||"WAVE"!==n(8))return null;let r=0,a=0,i=0,o=0,s=0,l=-1,d=0;for(let u=12;u+8<=e.byteLength;){let c=n(u),p=t.getUint32(u+4,!0),h=u+8;if(p>e.byteLength-h)return null;"fmt "===c&&p>=16?(r=t.getUint16(h,!0),a=t.getUint16(h+2,!0),i=t.getUint32(h+4,!0),o=t.getUint16(h+12,!0),s=t.getUint16(h+14,!0)):"data"===c&&(l=h,d=p),u=h+p+p%2}if((1!==r||16!==s)&&(3!==r||32!==s)||a<1||i<1||o!==a*s/8||l<0)return null;let u=new Float32Array(Math.floor(d/o));for(let e=0;e<u.length;e++){let n=0;for(let i=0;i<a;i++){let a=l+e*o+i*s/8;n+=1===r?t.getInt16(a,!0)/32768:t.getFloat32(a,!0)}u[e]=n/a}return{samples:u,sampleRate:i}}(n.buffer):null;return{file:r,durationSec:A,...a?{monoSamples:a.samples,sampleRate:a.sampleRate}:{},participatingLayers:x.length,plannedLayers:x.length}}let $=Array.from(new Set(x.map(e=>e.src))),k=window.AudioContext||window.webkitAudioContext||null;if(!k)throw Error("Web Audio API not available in this environment");try{n=new k({sampleRate:u})}catch{n=new k}let C=0,O=$.length;try{o=await l($,new Set(x.filter(e=>"audio"===e.layerType).map(e=>e.src)),n,()=>{C++,g?.({done:C,total:O,phase:"decode"})},m)}finally{try{n.close().catch(()=>{})}catch{}}if(c(m),!o.size)return E();let F=new OfflineAudioContext(f,Math.max(1,Math.floor(A*u)),u),N=0,L=[],R=[];try{let n;
1for(let e of x){let t=o.get(e.src);if(!t)continue;let n=e.startTime/1e3,r=(e.endTime-e.startTime)/1e3,a=e.mediaTrimStart/1e3;if(r<=0)continue;let i=Math.min(Math.max(0,a),Math.max(0,t.duration-.001)),s=F.createBufferSource();s.buffer=t,s.playbackRate.value=e.speed??1;let l=F.createGain();R.push(s),L.push(s,l),function(e,t,n){e.value=t.volume??1;let r=(t.volumeKeyframes??[]).filter(e=>Number.isFinite(e.time)&&e.time>=0&&Number.isFinite(e.value)).sort((e,t)=>e.time-t.time);if(!(r.length<2))for(let t of(e.setValueAtTime(r[0].value,n),r))e.linearRampToValueAtTime(t.value,n+t.time)}(l.gain,e,Math.max(0,n)),s.connect(l).connect(F.destination),s.start(Math.max(0,n),i),s.stop(Math.max(0,n)+r),N++}g?.({done:O,total:O,phase:"render"});let r=await (0,i.$B)({label:"Rendering timeline audio",timeoutMs:Math.max(3e4,1e3*A),signal:m},()=>F.startRendering());c(m);let a=r.length/r.sampleRate;if(1===f)n=[p(r)];else{n=[];for(let e=0;e<Math.min(f,r.numberOfChannels);e++)n.push(r.getChannelData(e).slice());for(;n.length<f;)n.push(new Float32Array(r.length))}g?.({done:O,total:O,phase:"encode"});let s=d(n,u);return{file:new File([s],`timeline-mix-${e}.wav`,{type:"audio/wav"}),durationSec:a,participatingLayers:N,plannedLayers:x.length,...t.includeMonoSamples?{monoSamples:1===f?n[0]:p(r),sampleRate:r.sampleRate}:{}}}finally{for(let e of R)try{e.stop()}catch{}for(let e of L)try{e.disconnect()}catch{}}}},68113:(e,t,n)=>{n.d(t,{B4:()=>i,Ds:()=>r,LK:()=>u,QM:()=>p,cD:()=>h,zB:()=>a});let r=[{id:"crossfade",label:"Crossfade"},{id:"dip-to-black",label:"Dip to Black"},{id:"wipe",label:"Wipe"},{id:"whip-pan",label:"Whip Pan"},{id:"zoom-punch",label:"Zoom Punch"},{id:"object-wipe",label:"Object Wipe",menu:!1},{id:"morph",label:"Morph",menu:!1}],a=r.filter(e=>!1!==e.menu),i=.4,o="power1.inOut",s="power2.in",l="power2.out",d="power3.in",u=["opacity","clipPath","filter","xPercent","yPercent","scale"];function c(e){return Math.round(1e3*e)/1e3}function p(e,t){let n=Math.max(0,t);switch(e){case"crossfade":case"wipe":case"morph":return n;case"whip-pan":return n/2;case"zoom-punch":return n/4;default:return 0}}function h(e,t,n,r,a){let{genId:i,direction:u,blur:h}=a,f={aTracks:[],bTracks:[],bStartOffsetDelta:0,effectiveDuration:0};if(!(t.bodyLen>0)||!(n.bodyLen>0))return f;let m=c(Math.max(.05,Math.min(r,t.bodyLen,n.bodyLen)));if(!(m>0))return f;let g=(e,t,n)=>({id:i(),time:c(e),value:t,...n?{ease:n}:{}}),w=-p(e,m)||0;if("crossfade"===e||"dip-to-black"===e)return{aTracks:[{property:"opacity",type:"style",keyframes:[g(c(t.bodyLen-m),1),g(t.bodyLen,0,o)]}],bTracks:[{property:"opacity",type:"style",keyframes:[g(0,0),g(m,1,o)]}],bStartOffsetDelta:w,effectiveDuration:m};if("wipe"===e){let{from:e,to:t}=function(e){switch(e){case"left":return{from:"inset(0% 0% 0% 100%)",to:"inset(0% 0% 0% 0%)"};case"up":return{from:"inset(100% 0% 0% 0%)",to:"inset(0% 0% 0% 0%)"};case"down":return{from:"inset(0% 0% 100% 0%)",to:"inset(0% 0% 0% 0%)"};case"iris":return{from:"circle(0% at 50% 50%)",to:"circle(150% at 50% 50%)"};case"split-h":return{from:"inset(50% 0% 50% 0%)",to:"inset(0% 0% 0% 0%)"};case"split-v":return{from:"inset(0% 50% 0% 50%)",to:"inset(0% 0% 0% 0%)"};default:return{from:"inset(0% 100% 0% 0%)",to:"inset(0% 0% 0% 0%)"}}}(u??"right");return{aTracks:[],bTracks:[{property:"clipPath",type:"style",keyframes:[g(0,e),g(m,t,"power2.out")]}],bStartOffsetDelta:w,effectiveDuration:m}}if("whip-pan"===e){let e=c(m/2),n=u??"left",r="up"===n||"down"===n?"yPercent":"xPercent",a="left"===n||"up"===n?-100:100,i=c(t.bodyLen-e),o=[{property:r,type:"transform",keyframes:[g(i,0),g(t.bodyLen,a,s)]}],d=[{property:r,type:"transform",keyframes:[g(0,-a),g(e,0,l)]}];return!1!==h&&(o.push({property:"filter",type:"style",keyframes:[g(i,"blur(0px)"),g(t.bodyLen,"blur(12px)",s)]}),d.push({property:"filter",type:"style",keyframes:[g(0,"blur(12px)"),g(e,"blur(0px)",l)]})),{aTracks:o,bTracks:d,bStartOffsetDelta:w,effectiveDuration:m}}if("zoom-punch"===e){let e=c(m/2),n=c(t.bodyLen-e);return{aTracks:[{property:"scale",type:"transform",keyframes:[g(n,1),g(t.bodyLen,1.6,d)]},{property:"opacity",type:"style",keyframes:[g(n,1),g(t.bodyLen,0,d)]}],bTracks:[{property:"scale",type:"transform",keyframes:[g(0,.9),g(e,1,"power3.out")]}],bStartOffsetDelta:w,effectiveDuration:m}}return"object-wipe"===e?{aTracks:[],bTracks:[],bStartOffsetDelta:0,effectiveDuration:m}:"morph"===e?{aTracks:[],bTracks:[],bStartOffsetDelta:w,effectiveDuration:m}:f}},74786:(e,t,n)=>{n.d(t,{xW:()=>
1o});var r=n(48561),a=n(16806),i=n(19969);async function o(e,t,n={}){(0,i.h5)(n,"Transcribing audio with measured word timings…");let s=(0,i.oy)(n.durationSec),l=await (0,a.$B)({label:"Whisper transcription",timeoutMs:s,signal:n.signal},t=>(0,r.cmFetch)("/api/transcribe-fal",{method:"POST",json:{mediaUrl:e,durationSec:n.durationSec,...n.language&&"auto"!==n.language?{language:n.language}:{}},signal:t})),d=function(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e="string"==typeof n?.text?n.text.trim():"",r=Number(n?.start),a=Number(n?.end);e&&Number.isFinite(r)&&Number.isFinite(a)&&(r<0||a<=r||t.push({text:e,start:r,end:a}))}t.sort((e,t)=>e.start-t.start||e.end-t.end);for(let e=1;e<t.length;e++)t[e].start<t[e-1].end&&(t[e]={...t[e],start:t[e-1].end},t[e].end<=t[e].start&&(t[e]={...t[e],end:t[e].start+.05}));return t}(l.words);return 0===d.length?null:{segments:function(e,t,n=.6){let r=[],a=[],i=0,o=()=>{if(0===a.length)return;let e=a.map(e=>({word:e.text,start:e.start,end:e.end}));r.push({start:a[0].start,end:a[a.length-1].end,text:a.map(e=>e.text).join(" "),words:e}),a=[],i=0};for(let r of e){if(a.length>0){let e=a[a.length-1],s=r.start-e.end,l=i+1+r.text.length>t.maxChars||a.length+1>t.maxWords||r.end-a[0].start>t.maxSeconds;(s>n||l)&&o()}a.push(r),i+=+(i>0)+r.text.length}return o(),r}(d,t),language:"string"==typeof l.language&&l.language?l.language:"auto"}}},89437:(e,t,n)=>{n.d(t,{Nf:()=>i,UK:()=>l,UT:()=>s});var r=n(76378);let a=null;function i(e){a=e}function o(e){try{return e()}catch(e){if(e instanceof TypeError)return;throw e}}function s(e,t){let n=a;if(!n)return null;let i=o(()=>n.getContainer());if(!i)return null;let s=i.getBoundingClientRect();if(0===s.width||0===s.height)return null;let l=r.useEditorStore.getState().viewport.zoom||1,d=o(()=>n.getScrollLeft())??0,u=o(()=>n.getScrollTop())??0;return{x:d+(e-s.left)/l,y:u+(t-s.top)/l}}function l(e,t){let n=a;if(!n)return null;let i=o(()=>n.getContainer());if(!i)return null;let s=i.getBoundingClientRect(),l=r.useEditorStore.getState().viewport.zoom||1,d=o(()=>n.getScrollLeft())??0,u=o(()=>n.getScrollTop())??0;return{x:s.left+(e-d)*l,y:s.top+(t-u)*l}}},91541:(e,t,n)=>{n.d(t,{FY:()=>m,KN:()=>c,WK:()=>u,a6:()=>l,fZ:()=>h,s3:()=>d,vV:()=>g,vr:()=>f});var r=n(61247),a=n(240),i=n(79697),o=n(43831);n(16806);var s=n(19969);let l=80,d=6,u=16,c=0,p=/[.!?…؟。!?]+["”’)\]]*\s*$/;function h(e,t){if(e.length<2)return e;let n=Math.floor(1.5*t.maxChars),r=1.5*t.maxSeconds,a=Math.floor(1.5*t.maxWords),i=[];for(let t of e){var o;let e=i[i.length-1];if(!e||(o=e.text,p.test(o.trimEnd()))){i.push({...t,words:t.words?[...t.words]:void 0});continue}let s=`${e.text} ${t.text}`,l=s.split(/\s+/).filter(Boolean).length,d=t.end-e.start;if(s.length>n||d>r||l>a){i.push({...t,words:t.words?[...t.words]:void 0});continue}e.text=s,e.end=t.end,(e.words||t.words)&&(e.words=[...e.words??[],...t.words??[]])}return i}function f(e,t={maxChars:l,maxSeconds:d,maxWords:u},n={}){let r=[...e];for(let e=0;e<8;e++){let e=!1,a=[];for(let i of r){let r=i.text.length>t.maxChars,o=i.end-i.start>t.maxSeconds,s=i.text.split(/\s+/).filter(Boolean).length>t.maxWords;if(!r&&!o&&!s){a.push(i);continue}let[l,d]=function(e,t=!1){if(e.words&&e.words.length>=2){let n=Math.floor(e.words.length/2);if(t){let t=Math.max(1,Math.floor(.2*e.words.length)),r=Math.min(e.words.length-1,Math.ceil(.8*e.words.length)),a=-1,i=1/0;for(let o=t;o<=r;o++)if(p.test(e.words[o-1].word.trimEnd())){let e=Math.abs(o-n);e<i&&(i=e,a=o)}a>0&&(n=a)}let r=e.words.slice(0,n),a=e.words.slice(n);if(0===r.length||0===a.length)return[null,null];let i=r.map(e=>e.word).join(" "),o=a.map(e=>e.word).join(" "),s=a[0].start;return[{start:e.start,end:s,text:i,words:r},{start:s,end:e.end,text:o,words:a}]}let n=e.text.split(/(\s+)/);if(n.length<3)return[null,null];let r=Math.floor(e.text.length/2),a=0,i=0;for(let e=0;e<n.length;e++)if((a+=n[e].length)>=r){i=e;break}n[i]&&/\s/.test(n[i])&&(i+=1);let o=n.slice(0,i).join("").trim(),s=n.slice(i).join("").trim();if(!o||!s)return[null,null];let l=e.start+(e.end-e.start)*(o.length/e.text.length);return[{start:e.start,end:l,text:o},{start:l,end:e.end,text:s}]}(i,!0===n.respectSentences);l&&d?(a.push(l,d),e=!0):a.push(i)}if(r.length=0,r.push(...a),!e)break}return r}function m(e,t){if(!Number.isFinite(t)||t<=0)return e;let n=[...e].sort((e,t)=>
1e.start-t.start),r=0;for(;r<n.length;){let e=n[r];if(e.end-e.start>=t||1===n.length){r++;continue}let a=r>0?n[r-1]:null,i=r<n.length-1?n[r+1]:null,o=a?a.end-a.start:1/0,s=i?i.end-i.start:1/0;null!=a&&o<=s&&a?(a.end=e.end,a.text=`${a.text} ${e.text}`.trim(),a.words=a.words||e.words?[...a.words??[],...e.words??[]]:void 0,n.splice(r,1)):i?(i.start=e.start,i.text=`${e.text} ${i.text}`.trim(),i.words=e.words||i.words?[...e.words??[],...i.words??[]]:void 0,n.splice(r,1)):r++}return n}async function g(e,t={}){if(t.signal?.aborted)throw new DOMException("Aborted","AbortError");let n={fileData:{fileUri:function(e){try{let t=new URL(e).pathname.split("/"),n=t.indexOf("b"),r=t.indexOf("o");if(n<0||r<0||n+1>=t.length||r+1>=t.length)return null;let a=t[n+1],i=decodeURIComponent(t.slice(r+1).join("/"));return`gs://${a}/${i}`}catch{return null}}(e)??e,mimeType:"audio/wav"}};return(0,s.Xx)(t,async({modelName:e,location:s,timeoutMs:c})=>{var p;let h,m,g=(0,a.getVertexAI)(r.app,{location:s}),w=(0,i.P9)((0,a.getGenerativeModel)(g,{model:e,generationConfig:{temperature:.1,maxOutputTokens:32768,responseMimeType:"application/json"},safetySettings:[{category:"HARM_CATEGORY_HARASSMENT",threshold:"OFF"},{category:"HARM_CATEGORY_HATE_SPEECH",threshold:"OFF"},{category:"HARM_CATEGORY_SEXUALLY_EXPLICIT",threshold:"OFF"},{category:"HARM_CATEGORY_DANGEROUS_CONTENT",threshold:"OFF"}]},{timeout:c}),{modelName:e}),b=(await w.generateContent({contents:[{role:"user",parts:[n,{text:(m=(p=t.language)&&"auto"!==p?`The spoken language is ${p}. Transcribe it in its ORIGINAL script and do not translate it.`:"Auto-detect the spoken language. Transcribe in the ORIGINAL script (Hebrew, French, Japanese, English, etc.) — do not translate.",`You are transcribing a piece of audio for use as on-screen captions.
2
3Rules:
41. ${m}
52. Output every utterance, including filler words, but skip non-speech (music, silence, sound effects).
63. Break the transcript into READABLE caption segments. Each segment MUST satisfy ALL of these:
7   - At most ${l} characters of text (including spaces).
8   - At most ${d} seconds of duration (end - start).
9   - At most ${u} words.
10   - Breaks at natural clause/sentence boundaries — never mid-word, never mid-phrase if avoidable.
11   If an utterance is long, split it into multiple segments back-to-back.
124. Include word-level timings inside each segment.
135. Timecodes are in SECONDS with decimal precision (e.g. 3.45, not 3.5 rounded).
14
15Return ONLY valid JSON, no prose, no markdown fences. Shape:
16{
17  "language": "fr-FR",
18  "segments": [
19    {
20      "start": 0.0,
21      "end": 2.84,
22      "text": "Bonjour \xe0 tous, bienvenue.",
23      "words": [
24        { "word": "Bonjour", "start": 0.10, "end": 0.55 },
25        { "word": "\xe0", "start": 0.56, "end": 0.68 },
26        { "word": "tous,", "start": 0.69, "end": 0.92 },
27        { "word": "bienvenue.", "start": 1.10, "end": 2.84 }
28      ]
29    }
30  ]
31}
32
33If there is NO speech in the audio at all, return { "language": "und", "segments": [] }.`)}]}]})).response.text();try{h=JSON.parse(b)}catch{let e=b.match(/\{[\s\S]*\}/);if(!e)throw Error("Gemini response was not valid JSON");h=JSON.parse(e[0])}if(!Array.isArray(h.segments))throw Error("Gemini response did not contain caption segments");return{segments:f(function(e){if(!Array.isArray(e.segments))return[];let t=[];for(let n of e.segments){let e=Number(n.start),r=Number(n.end),a="string"==typeof n.text?(0,o.h)(n.text.trim()):"";if(!a||!Number.isFinite(e)||!Number.isFinite(r)||r<=e)continue;let i=Array.isArray(n.words)?n.words.map(e=>({word:String(e.word??""),start:Number(e.start??0),end:Number(e.end??0)})).filter(e=>e.word&&Number.isFinite(e.start)&&Number.isFinite(e.end)&&e.end>=e.start):void 0;t.push(i?{start:e,end:r,text:a,words:i}:{start:e,end:r,text:a})}return t}(h)),language:"string"==typeof h.language&&h.language?h.language:"und"}})}}}]);

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.