@tikagent/video-editor-cli 1.5.0-preview.3 → 1.5.0-preview.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser.js +1 -1
- package/dist/lib/cli.js +1 -1
- package/dist/lib/processes.js +1 -1
- package/dist/lib/telemetry.js +1 -1
- package/dist/runtime/app.js +1 -1
- package/dist/runtime/cli/lib/browser.js +1 -1
- package/dist/runtime/cli/lib/processes.js +1 -1
- package/dist/runtime/cli/lib/telemetry.js +1 -1
- package/dist/runtime/export-pipeline.js +1 -1
- package/dist/runtime/optimized-export.js +1 -1
- package/dist/runtime/server.js +1 -1
- package/dist/runtime/webcodecs-export.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const e=require("fs"),r=require("os"),o=require("path"),t=require("http"),n=require("https"),{spawn:s}=require("./processes"),{Transform:i}=require("stream"),{pipeline:a}=require("stream/promises"),{extractZip:c}=require("./browser-zip"),l="153.0.8010.52";function m(e=process.platform,r=process.arch){return{"darwin-arm64":"mac-arm64","darwin-x64":"mac-x64","linux-x64":"linux64","linux-arm64":"linux-arm64","win32-x64":"win64","win32-ia32":"win32"}[`${e}-${r}`]}function u(e){return o.join("chrome-"+e,e.startsWith("mac-")?"Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing":e.startsWith("win")?"chrome.exe":"chrome")}function w(r){try{return!!e.statSync(r).isFile()&&(e.accessSync(r,"win32"===process.platform?e.constants.F_OK:e.constants.X_OK),!0)}catch{return!1}}function d(e){if(o.isAbsolute(e)||/[/\\]/.test(e))return w(o.resolve(e))?o.resolve(e):null;for(const r of(process.env.PATH||"").split(o.delimiter).filter(Boolean))for(const t of"win32"===process.platform?["",".exe"]:[""]){const n=o.resolve(r,e+t);if(w(n))return n}return null}function p(){return["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium",...[process.env.PROGRAMFILES,process.env["PROGRAMFILES(X86)"],process.env.LOCALAPPDATA].filter(Boolean).map(e=>o.join(e,"Google/Chrome/Application/chrome.exe")),"google-chrome","google-chrome-stable","chromium","chromium-browser","chrome"]}async function h(r,o,t){const s=new AbortController,c=setTimeout(()=>s.abort(),9e5);try{const c=await async function e(r,o=0){const t=new URL(r);if("https:"!==t.protocol||t.username||t.password)throw new Error("Browser downloads require an HTTPS URL without credentials");return new Promise((r,i)=>{const a=n.get(t,{signal:s.signal,timeout:3e4},n=>{if(n.on("error",i),[301,302,303,307,308].includes(n.statusCode)){if(n.resume(),!n.headers.location||o>=5)return i(new Error("Too many browser download redirects"));try{r(e(new URL(n.headers.location,t),o+1))}catch(e){i(e)}}else 200!==n.statusCode?(n.resume(),i(new Error(`Browser download returned HTTP ${n.statusCode}`))):r(n)});a.on("timeout",()=>a.destroy(new Error("Browser download timed out"))),a.on("error",i)})}(r),l=Number(c.headers["content-length"]||0);let m=0,u=Date.now();const w=new i({transform(e,r,o){if(m+=e.length,m>536870912)return o(new Error("Browser download exceeds 512 MiB"));Date.now()-u>2e3&&(t(`Downloading browser: ${Math.round(m/1048576)}${l?"/"+Math.round(l/1048576):""} MiB`),u=Date.now()),o(null,e)}});if(await a(c,w,e.createWriteStream(o,{flags:"wx"}),{signal:s.signal}),!m||l&&m!==l)throw new Error("Incomplete browser download")}finally{clearTimeout(c),s.abort()}}async function f(n){const i=e.mkdtempSync(o.join(r.tmpdir(),"tik-browser-check-")),a=require("crypto").randomBytes(16).toString("hex");let c,l,m,u,w="";const d=new Promise(e=>{u=e}),p=t.createServer((e,r)=>{e.url==="/"+a?(r.writeHead(200,{"Content-Type":"text/html"}),r.end(`<script>fetch("/${a}/ready")<\/script>`)):e.url===`/${a}/ready`?(r.end("ok"),u()):(r.writeHead(404),r.end())});try{await new Promise((e,r)=>{p.once("error",r),p.listen(0,"127.0.0.1",e)}),c=s(n,["--headless=new","--no-first-run","--no-default-browser-check",..."darwin"===process.platform?["--use-mock-keychain"]:[],"--user-data-dir="+i,`http://127.0.0.1:${p.address().port}/${a}`],{stdio:["ignore","ignore","pipe"],windowsHide:!0}),l=new Promise(e=>c.once("close",e)),c.stderr.on("data",e=>{w=(w+e).slice(-600)}),await Promise.race([d,new Promise((e,r)=>{c.once("error",r),c.once("close",e=>r(new Error(`Chrome exited (${e})`))),m=setTimeout(()=>r(new Error("Chrome startup timed out")),3e4)})])}catch(e){throw new Error(`Downloaded Chrome could not run: ${e.message}. Check OS compatibility and, on Linux, required system libraries. ${w}`)}finally{if(clearTimeout(m),c&&null===c.exitCode&&null===c.signalCode){c.kill();const e=setTimeout(()=>c.kill("SIGKILL"),3e3);await l,clearTimeout(e)}p.closeAllConnections?.(),await new Promise(e=>p.close(e)),e.rmSync(i,{recursive:!0,force:!0})}}function y(e,r){try{require("./telemetry").reportError("BrowserSetupFailed",e,r)}catch{}}module.exports={ensureBrowser:async function(t,{cacheRoot:n=o.join(r.homedir(),".tik-video-editor-cli","browsers"),env:s=process.env,platform:i=process.platform,arch:a=process.arch,candidates:g=p(),download:C=h,verify:b=f,log:x=e=>process.stderr.write(e+"\n")}={}){const E=t||s.CHROME_PATH;if(E){const e=d(E);if(!e){const e=new Error("Browser is not executable: "+E+"; fix --browser / CHROME_PATH or unset it for automatic setup");throw y(e,{source:"explicit"}),e}return e}const A=m(i,a),T=A&&o.join(n,l,A),$=A&&o.join(T,u(A)),S=()=>{try{return w($)&&e.readFileSync(o.join(T,".complete"),"utf8")===l}catch{return!1}};if(A&&S())return $;for(const e of g){const r=d(e);if(r)return r}if(!A)throw new Error(`Automatic browser setup is unavailable on ${i}/${a}; pass --browser <path> or set CHROME_PATH`);const B=`${(s.FABLECUT_BROWSER_DOWNLOAD_BASE_URL||"https://cdn.npmmirror.com/binaries/chrome-for-testing").replace(/\/+$/,"")}/${l}/${A}/chrome-${A}.zip`,v=o.dirname(T);await e.promises.mkdir(v,{recursive:!0});const O=await e.promises.mkdtemp(o.join(v,".install-"));try{x(`Preparing Chrome for Testing ${l} (${A}); this download is cached for future exports.`);const r=o.join(O,"browser.zip"),t=o.join(O,"unpacked");await C(B,r,x),await e.promises.mkdir(t),x("Extracting browser…"),await c(r,t);const n=o.join(t,u(A));if(!w(n))throw new Error("Browser archive is missing its executable");if(await b(n),await e.promises.writeFile(o.join(t,".complete"),l),!S())try{await e.promises.rename(t,T)}catch(e){if(!S())throw new Error(`${e.message}; remove the incomplete cache at ${T} and retry`)}return x("Browser ready."),$}catch(e){throw y(e,{source:"download",platform:A}),new Error(`Automatic browser setup failed: ${e.message}. Retry export, set FABLECUT_BROWSER_DOWNLOAD_BASE_URL to a trusted HTTPS mirror, or use --browser <path>.`)}finally{await e.promises.rm(O,{recursive:!0,force:!0})}},downloadArchive:h,verifyBrowser:f,platformKey:m,executable:u,VERSION:l};
|
|
1
|
+
"use strict";const e=require("fs"),r=require("os"),t=require("path"),n=require("http"),o=require("https"),{spawn:i,spawnSync:s}=require("./processes"),{Transform:a}=require("stream"),{pipeline:c}=require("stream/promises"),{extractZip:l}=require("./browser-zip"),u="153.0.8010.52",d=["S-1-15-3-1024-3424233489-972189580-2057154623-747635277-1604371224-316187997-3786583170-1043257646","S-1-15-3-1024-2302894289-466761758-1166120688-1039016420-2430351297-4240214049-4028510897-3317428798"];function m(){return t.join(process.env.SystemRoot||"C:\\Windows","System32","icacls.exe")}function f(r){try{if(!e.statSync(r).isFile())return!1}catch{return!1}const t=s(m(),[r],{encoding:"utf8",timeout:3e4});if(t.error||0!==t.status)return!1;const n=`${t.stdout||""}${t.stderr||""}`.replace(/\s+/g,"");return d.every(e=>n.includes(e))}function p(e){for(const r of d){const t=s(m(),[e,"/grant",`*${r}:(OI)(CI)(RX)`,"/C","/Q"],{encoding:"utf8",timeout:12e4});if(t.error||0!==t.status){const e=`${t.stdout||""}${t.stderr||""}`.trim()||t.error?.message||"icacls failed";throw new Error("Could not grant Chrome sandbox access: "+e)}}}async function w(r,t,n,o){if(!await o(t)&&(await n(r),e.existsSync(t)&&!await o(t)))throw new Error("Chrome sandbox access was not applied to the browser executable")}function h(e=process.platform,r=process.arch){return{"darwin-arm64":"mac-arm64","darwin-x64":"mac-x64","linux-x64":"linux64","linux-arm64":"linux-arm64","win32-x64":"win64","win32-ia32":"win32"}[`${e}-${r}`]}function g(e){return t.join("chrome-"+e,e.startsWith("mac-")?"Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing":e.startsWith("win")?"chrome.exe":"chrome")}function y(r){try{return!!e.statSync(r).isFile()&&(e.accessSync(r,"win32"===process.platform?e.constants.F_OK:e.constants.X_OK),!0)}catch{return!1}}function E(e){if(t.isAbsolute(e)||/[/\\]/.test(e))return y(t.resolve(e))?t.resolve(e):null;for(const r of(process.env.PATH||"").split(t.delimiter).filter(Boolean))for(const n of"win32"===process.platform?["",".exe"]:[""]){const o=t.resolve(r,e+n);if(y(o))return o}return null}function S(e){return[process.env.PROGRAMFILES,process.env["PROGRAMFILES(X86)"],process.env.LOCALAPPDATA].filter(Boolean).flatMap(r=>e.map(e=>t.join(r,e)))}function A(){return[["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Chromium.app/Contents/MacOS/Chromium",...S(["Google/Chrome/Application/chrome.exe","Microsoft/Edge/Application/msedge.exe","Chromium/Application/chrome.exe"]),"google-chrome","google-chrome-stable","microsoft-edge","microsoft-edge-stable","msedge","chromium","chromium-browser","chrome"],["/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta","/Applications/Microsoft Edge Beta.app/Contents/MacOS/Microsoft Edge Beta",...S(["Google/Chrome Beta/Application/chrome.exe","Microsoft/Edge Beta/Application/msedge.exe"]),"google-chrome-beta","microsoft-edge-beta"],["/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev","/Applications/Microsoft Edge Dev.app/Contents/MacOS/Microsoft Edge Dev",...S(["Google/Chrome Dev/Application/chrome.exe","Microsoft/Edge Dev/Application/msedge.exe"]),"google-chrome-unstable","microsoft-edge-dev"]]}function C(e){const r=String(e??"").match(/(\d+)\.(\d+)\.(\d+)\.(\d+)/);return r?[r[1],r[2],r[3],r[4]].map(Number):null}function x(e){const r=String(e??"").match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);return r?[r[1],r[2],r[3],r[4]].map(Number):null}function b(e,r){if(!e&&!r)return 0;if(!e)return-1;if(!r)return 1;for(let t=0;t<4;t++){const n=(e[t]||0)-(r[t]||0);if(n)return n}return 0}function L(r,t,n,o){if(t<0||n<=0||t>o||t+n>o)return null;const i=Buffer.alloc(n);return e.readSync(r,i,0,n,t)!==n?null:i}function v(e,r){for(const t of r){const r=Math.max(t.virtualSize,t.rawSize);if(t.rawPointer>0&&r>0&&e>=t.virtualAddress&&e<t.virtualAddress+r)return t.rawPointer+(e-t.virtualAddress)}return null}function B(e,r,t,n,o){if(o<0||o+16>t)return null;const i=L(e,r+o,16,n);if(!i)return null;const s=i.readUInt16LE(12),a=i.readUInt16LE(14),c=s+a;if(c<1||c>512||o+16+8*c>t)return null;const l=L(e,r+o+16,8*c,n);return l?{named:s,ids:a,entries:l}:null}function $(e,r){return e.entries.readUInt32LE(8*r+4)}function I(e){return s(e,["--version"],{encoding:"utf8",timeout:2e3,windowsHide:!0})}function U(e,r){if(!r&&"win32"===process.platform)return null;try{const t=(r||I)(e);return!t||t.error?null:C(`${t.stdout||""}\n${t.stderr||""}`)}catch{return null}}function M(r){try{return function(r){const n=t.join(t.dirname(r),t.basename(r,t.extname(r))+".VisualElementsManifest.xml");try{return C(e.readFileSync(n,"utf8"))}catch{return null}}(r)||function(r){let n;try{n=e.readdirSync(t.dirname(r),{withFileTypes:!0})}catch{return null}let o=null;for(const e of n){if(!e.isDirectory())continue;const r=x(e.name);b(r,o)>0&&(o=r)}return o}(r)||function(r){try{const n=e.readFileSync(t.join(t.dirname(r),"..","Info.plist"),"utf8").match(/<key>\s*CFBundleShortVersionString\s*<\/key>\s*<string>\s*([^<]+?)\s*<\/string>/);return n?C(n[1]):null}catch{return null}}(r)||function(r){let t;try{const n=e.statSync(r);if(!n.isFile()||n.size<128||n.size>536870912)return null;t=e.openSync(r,"r");const o=L(t,0,64,n.size);if(!o||23117!==o.readUInt16LE(0))return null;const i=o.readUInt32LE(60),s=L(t,i,24,n.size);if(!s||17744!==s.readUInt32LE(0))return null;const a=s.readUInt16LE(6),c=s.readUInt16LE(20);if(a<1||a>96||c<96||c>1024)return null;const l=L(t,i+24,c,n.size);if(!l)return null;const u=l.readUInt16LE(0),d=267===u?96:523===u?112:-1;if(d<0||l.length<d+24||l.readUInt32LE(d-4)<3)return null;const m=l.readUInt32LE(d+16),f=l.readUInt32LE(d+20);if(!m||!f||f>n.size)return null;const p=L(t,i+24+c,40*a,n.size);if(!p)return null;const w=[];for(let e=0;e<a;e++){const r=40*e;w.push({virtualSize:p.readUInt32LE(r+8),virtualAddress:p.readUInt32LE(r+12),rawSize:p.readUInt32LE(r+16),rawPointer:p.readUInt32LE(r+20)})}const h=v(m,w);if(null===h)return null;const g=B(t,h,f,n.size,0),y=g&&function(e){for(let r=0;r<e.ids;r++){const t=8*(e.named+r);if(16===e.entries.readUInt32LE(t))return e.entries.readUInt32LE(t+4)}return null}(g);if(null===y||!(2147483648&y))return null;const E=B(t,h,f,n.size,2147483647&y),S=E&&$(E,0);if(null===S||!(2147483648&S))return null;const A=B(t,h,f,n.size,2147483647&S),C=A&&$(A,0);if(null===C||2147483648&C||C+8>f)return null;const x=L(t,h+C,8,n.size);if(!x)return null;const b=x.readUInt32LE(4),I=v(x.readUInt32LE(0),w);return b&&null!==I?function(e){if(!e)return null;for(let r=0;r+16<=e.length;r+=4){if(4277077181!==e.readUInt32LE(r))continue;const t=e.readUInt32LE(r+8),n=e.readUInt32LE(r+12),o=[t>>>16,65535&t,n>>>16,65535&n];if(o.some(e=>e>0))return o}return null}(L(t,I,Math.min(b,4096),n.size)):null}catch{return null}finally{if(void 0!==t)try{e.closeSync(t)}catch{}}}(r)||U(r)}catch{return null}}function T(e){const r=t.resolve(e);return"win32"===process.platform?r.toLowerCase():r}function O(e,r){try{const t=e(r);return Array.isArray(t)&&t.length>=4?t.slice(0,4).map(Number):null}catch{return null}}function R(e,r){let t=e[0],n=O(r,t);for(let o=1;o<e.length;o++){const i=O(r,e[o]);b(i,n)>0&&(t=e[o],n=i)}return t}async function P(r,t,n){const i=new AbortController,s=setTimeout(()=>i.abort(),9e5);try{const s=await async function e(r,t=0){const n=new URL(r);if("https:"!==n.protocol||n.username||n.password)throw new Error("Browser downloads require an HTTPS URL without credentials");return new Promise((r,s)=>{const a=o.get(n,{signal:i.signal,timeout:3e4},o=>{if(o.on("error",s),[301,302,303,307,308].includes(o.statusCode)){if(o.resume(),!o.headers.location||t>=5)return s(new Error("Too many browser download redirects"));try{r(e(new URL(o.headers.location,n),t+1))}catch(e){s(e)}}else 200!==o.statusCode?(o.resume(),s(new Error(`Browser download returned HTTP ${o.statusCode}`))):r(o)});a.on("timeout",()=>a.destroy(new Error("Browser download timed out"))),a.on("error",s)})}(r),l=Number(s.headers["content-length"]||0);let u=0,d=Date.now();const m=new a({transform(e,r,t){if(u+=e.length,u>536870912)return t(new Error("Browser download exceeds 512 MiB"));Date.now()-d>2e3&&(n(`Downloading browser: ${Math.round(u/1048576)}${l?"/"+Math.round(l/1048576):""} MiB`),d=Date.now()),t(null,e)}});if(await c(s,m,e.createWriteStream(t,{flags:"wx"}),{signal:i.signal}),!u||l&&u!==l)throw new Error("Incomplete browser download")}finally{clearTimeout(s),i.abort()}}async function z(o){const s=e.mkdtempSync(t.join(r.tmpdir(),"tik-browser-check-")),a=require("crypto").randomBytes(16).toString("hex");let c,l,u,d,m="";const f=new Promise(e=>{d=e}),p=n.createServer((e,r)=>{e.url==="/"+a?(r.writeHead(200,{"Content-Type":"text/html"}),r.end(`<script>fetch("/${a}/ready")<\/script>`)):e.url===`/${a}/ready`?(r.end("ok"),d()):(r.writeHead(404),r.end())});try{await new Promise((e,r)=>{p.once("error",r),p.listen(0,"127.0.0.1",e)}),c=i(o,["--headless=new","--no-first-run","--no-default-browser-check",..."darwin"===process.platform?["--use-mock-keychain"]:[],"--user-data-dir="+s,`http://127.0.0.1:${p.address().port}/${a}`],{stdio:["ignore","ignore","pipe"],windowsHide:!0}),l=new Promise(e=>c.once("close",e)),c.stderr.on("data",e=>{m=(m+e).slice(-600)}),await Promise.race([f,new Promise((e,r)=>{c.once("error",r),c.once("close",e=>r(new Error(`Chrome exited (${e})`))),u=setTimeout(()=>r(new Error("Chrome startup timed out")),3e4)})])}catch(e){throw new Error(`Downloaded Chrome could not run: ${e.message}. Check OS compatibility and, on Linux, required system libraries. ${m}`)}finally{if(clearTimeout(u),c&&null===c.exitCode&&null===c.signalCode){c.kill();const e=setTimeout(()=>c.kill("SIGKILL"),3e3);await l,clearTimeout(e)}p.closeAllConnections?.(),await new Promise(e=>p.close(e)),e.rmSync(s,{recursive:!0,force:!0})}}function D(e,r){try{require("./telemetry").reportError("BrowserSetupFailed",e,r)}catch{}}module.exports={ensureBrowser:async function(n,{cacheRoot:o=t.join(r.homedir(),".tik-video-editor-cli","browsers"),env:i=process.env,platform:s=process.platform,arch:a=process.arch,candidates:c=A(),download:d=P,verify:m=z,grantSandboxAccess:S=p,sandboxGranted:C=f,versionOf:x=M,log:b=e=>process.stderr.write(e+"\n")}={}){const L=n||i.CHROME_PATH;if(L){const e=E(L);if(!e){const e=new Error("Browser is not executable: "+L+"; fix --browser / CHROME_PATH or unset it for automatic setup");throw D(e,{source:"explicit"}),e}return e}const v=function(e,r){for(const t of e){if(!Array.isArray(t))continue;const e=new Set,n=[];for(const r of t){if("string"!=typeof r||!r)continue;const t=E(r);if(!t)continue;const o=T(t);e.has(o)||(e.add(o),n.push(t))}if(1===n.length)return n[0];if(n.length>1)return R(n,r)}return null}(function(e){return Array.isArray(e)?e.length&&Array.isArray(e[0])?e:e.length?[e]:[]:A()}(c),x);if(v)return v;const B=h(s,a),$=B&&t.join(o,u,B),I=B&&t.join($,g(B)),U=()=>{try{return y(I)&&e.readFileSync(t.join($,".complete"),"utf8")===u}catch{return!1}};if(B&&U()){if("win32"===s)try{await w($,I,S,C)}catch(e){throw D(e,{source:"sandbox-access",platform:B}),new Error(`Automatic browser setup failed: ${e.message}. Retry export, set FABLECUT_BROWSER_DOWNLOAD_BASE_URL to a trusted HTTPS mirror, or use --browser <path>.`)}return I}if(!B)throw new Error(`Automatic browser setup is unavailable on ${s}/${a}; pass --browser <path> or set CHROME_PATH`);const O=`${(i.FABLECUT_BROWSER_DOWNLOAD_BASE_URL||"https://cdn.npmmirror.com/binaries/chrome-for-testing").replace(/\/+$/,"")}/${u}/${B}/chrome-${B}.zip`,k=t.dirname($);await e.promises.mkdir(k,{recursive:!0});const F=await e.promises.mkdtemp(t.join(k,".install-"));try{b(`Preparing Chrome for Testing ${u} (${B}); this download is cached for future exports.`);const r=t.join(F,"browser.zip"),n=t.join(F,"unpacked");await d(O,r,b),await e.promises.mkdir(n),"win32"===s&&await w(n,t.join(n,g(B)),S,C),b("Extracting browser…"),await l(r,n);const o=t.join(n,g(B));if(!y(o))throw new Error("Browser archive is missing its executable");if("win32"===s&&await w(n,o,S,C),await m(o),await e.promises.writeFile(t.join(n,".complete"),u),!U())try{await e.promises.rename(n,$)}catch(e){if(!U())throw new Error(`${e.message}; remove the incomplete cache at ${$} and retry`)}return b("Browser ready."),I}catch(e){throw D(e,{source:"download",platform:B}),new Error(`Automatic browser setup failed: ${e.message}. Retry export, set FABLECUT_BROWSER_DOWNLOAD_BASE_URL to a trusted HTTPS mirror, or use --browser <path>.`)}finally{await e.promises.rm(F,{recursive:!0,force:!0})}},downloadArchive:P,verifyBrowser:z,platformKey:h,executable:g,VERSION:u,chromeSandboxSids:d,systemCandidateTiers:A,detectBrowserVersion:M,compareVersions:b,versionFromCommand:U};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const e=require("node:fs"),r=require("node:os"),t=require("node:path"),o=require("node:child_process"),n=()=>t.join(r.homedir(),".tik-video-editor-cli-processes"),i=()=>"1"===process.env.TIK_VIDEO_EDITOR_MANAGED,s=e=>new Promise(r=>setTimeout(r,e));function c(){try{e.rmdirSync(n())}catch{}}function p(e){let r;if("win32"===process.platform){const n=t.join(process.env.SystemRoot||"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe"),i=`Get-CimInstance Win32_Process${e?` -Filter 'ProcessId=${Number(e)}'`:""} | Select-Object ProcessId,ParentProcessId,@{n='Birth';e={$_.CreationDate.ToUniversalTime().Ticks.ToString()}} | ConvertTo-Json -Compress`;if(r=o.spawnSync(n,["-NoProfile","-NonInteractive","-Command",i],{encoding:"utf8",windowsHide:!0,timeout:1e4,maxBuffer:8<<20}),r.error||0!==r.status)throw new Error("Cannot inspect CLI processes: "+(r.error?.message||r.stderr));const s=JSON.parse(r.stdout.trim()||"[]");return new Map([].concat(s).filter(Boolean).map(e=>[e.ProcessId,{pid:e.ProcessId,ppid:e.ParentProcessId,birth:e.Birth,group:0}]))}if(r=o.spawnSync("/bin/ps",[...e?["-p",String(e)]:["-ax"],"-o","pid=,ppid=,pgid=,stat=,lstart="],{encoding:"utf8",env:{...process.env,LC_ALL:"C",TZ:"UTC"},timeout:5e3,maxBuffer:8<<20}),r.error||0!==r.status&&(!e||1!==r.status||r.stdout.trim()))throw new Error("Cannot inspect CLI processes: "+(r.error?.message||r.stderr));const n=new Map;for(const e of r.stdout.trim().split("\n")){const r=e.trim().match(/^(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(.+)$/);if(!r||r[4].includes("Z"))continue;const[,t,o,i,,s]=r;n.set(+t,{pid:+t,ppid:+o,group:+i,birth:s.trim()})}return n}const d=(e,r)=>!!r&&e.pid===r.pid&&e.birth===r.birth;function a(r){try{return JSON.parse(e.readFileSync(r,"utf8"))}catch(e){if("ENOENT"===e.code||e instanceof SyntaxError)return null;throw e}}function f(r){const o=t.join(n(),r),i=a(o);if(!i)return null;let s;try{s=p(i.pid).get(i.pid)}catch{return i}return d(i,s)?i:(e.rmSync(o,{force:!0}),null)}function u(){if(f("shutdown.json"))throw new Error("CLI shutdown is in progress; retry after it finishes");const e=f("migration.json");if(e&&e.pid!==process.pid)throw new Error("CLI storage migration is in progress; retry after it finishes")}function l(e){try{return process.kill(e,0),!0}catch{return!1}}function w(r,o=!1){const i=p(r).get(r);if(!i)return null;i.group=o&&i.group===r?r:0,e.mkdirSync(n(),{recursive:!0,mode:448});const s=t.join(n(),`${r}.json`),c=`${s}.${process.pid}.tmp`;try{e.writeFileSync(c,JSON.stringify(i),{mode:384})}catch(r){if("ENOENT"!==r.code)throw r;e.mkdirSync(n(),{recursive:!0,mode:448}),e.writeFileSync(c,JSON.stringify(i),{mode:384})}return e.renameSync(c,s),{record:i,file:s}}function h(e){const r={...e};return"win32"===process.platform&&(r.windowsHide=!0),r}function g(r,t,n){const s=h(t[n]);if(!i()){const e=t.slice();return e[n]=s,o[r](...e)}u(),"win32"!==process.platform&&(s.detached=!0),t[n]=s;const c=o[r](...t);let d;try{c.pid&&(d=w(c.pid,!0))}catch
|
|
1
|
+
"use strict";const e=require("node:fs"),r=require("node:os"),t=require("node:path"),o=require("node:child_process"),n=()=>t.join(r.homedir(),".tik-video-editor-cli-processes"),i=()=>"1"===process.env.TIK_VIDEO_EDITOR_MANAGED,s=e=>new Promise(r=>setTimeout(r,e));function c(){try{e.rmdirSync(n())}catch{}}function p(e){let r;if("win32"===process.platform){const n=t.join(process.env.SystemRoot||"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe"),i=`Get-CimInstance Win32_Process${e?` -Filter 'ProcessId=${Number(e)}'`:""} | Select-Object ProcessId,ParentProcessId,@{n='Birth';e={$_.CreationDate.ToUniversalTime().Ticks.ToString()}} | ConvertTo-Json -Compress`;if(r=o.spawnSync(n,["-NoProfile","-NonInteractive","-Command",i],{encoding:"utf8",windowsHide:!0,timeout:e?4e3:1e4,maxBuffer:8<<20}),r.error||0!==r.status)throw new Error("Cannot inspect CLI processes: "+(r.error?.message||r.stderr));const s=JSON.parse(r.stdout.trim()||"[]");return new Map([].concat(s).filter(Boolean).map(e=>[e.ProcessId,{pid:e.ProcessId,ppid:e.ParentProcessId,birth:e.Birth,group:0}]))}if(r=o.spawnSync("/bin/ps",[...e?["-p",String(e)]:["-ax"],"-o","pid=,ppid=,pgid=,stat=,lstart="],{encoding:"utf8",env:{...process.env,LC_ALL:"C",TZ:"UTC"},timeout:5e3,maxBuffer:8<<20}),r.error||0!==r.status&&(!e||1!==r.status||r.stdout.trim()))throw new Error("Cannot inspect CLI processes: "+(r.error?.message||r.stderr));const n=new Map;for(const e of r.stdout.trim().split("\n")){const r=e.trim().match(/^(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(.+)$/);if(!r||r[4].includes("Z"))continue;const[,t,o,i,,s]=r;n.set(+t,{pid:+t,ppid:+o,group:+i,birth:s.trim()})}return n}const d=(e,r)=>!!r&&e.pid===r.pid&&e.birth===r.birth;function a(r){try{return JSON.parse(e.readFileSync(r,"utf8"))}catch(e){if("ENOENT"===e.code||e instanceof SyntaxError)return null;throw e}}function f(r){const o=t.join(n(),r),i=a(o);if(!i)return null;if(!l(i.pid)){try{e.rmSync(o,{force:!0})}catch{}return null}let s;try{s=p(i.pid).get(i.pid)}catch{return i}return d(i,s)?i:(e.rmSync(o,{force:!0}),null)}function u(){if(f("shutdown.json"))throw new Error("CLI shutdown is in progress; retry after it finishes");const e=f("migration.json");if(e&&e.pid!==process.pid)throw new Error("CLI storage migration is in progress; retry after it finishes")}function l(e){try{return process.kill(e,0),!0}catch{return!1}}function w(r,o=!1){const i=p(r).get(r);if(!i)return null;i.group=o&&i.group===r?r:0,e.mkdirSync(n(),{recursive:!0,mode:448});const s=t.join(n(),`${r}.json`),c=`${s}.${process.pid}.tmp`;try{e.writeFileSync(c,JSON.stringify(i),{mode:384})}catch(r){if("ENOENT"!==r.code)throw r;e.mkdirSync(n(),{recursive:!0,mode:448}),e.writeFileSync(c,JSON.stringify(i),{mode:384})}return e.renameSync(c,s),{record:i,file:s}}function h(e){const r={...e};return"win32"===process.platform&&(r.windowsHide=!0),r}function g(r,t,n){const s=h(t[n]);if(!i()){const e=t.slice();return e[n]=s,o[r](...e)}u(),"win32"!==process.platform&&(s.detached=!0),t[n]=s;const c=o[r](...t);let d=null;try{c.pid&&(d=w(c.pid,!0))}catch{d=null}return c.once("close",()=>{if(d)try{const r=p();d.record.group&&[...r.values()].some(e=>e.group===d.record.group)||e.rmSync(d.file,{force:!0})}catch{}}),c}function m(r,o,i){for(const i of e.readdirSync(n())){if(!/^\d+\.json$/.test(i))continue;const s=t.join(n(),i),c=a(s);if(!c||!Number.isInteger(c.pid)||c.pid<=1||"string"!=typeof c.birth)continue;const p=r.get(c.pid);if(d(c,p))o.set(c.pid,p);else if(p){e.rmSync(s,{force:!0});continue}if(c.group===c.pid)for(const e of r.values())e.group===c.group&&o.set(e.pid,e);p||[...r.values()].some(e=>c.group&&e.group===c.group)||e.rmSync(s,{force:!0})}let s;do{s=!1;for(const e of r.values())o.has(e.pid)||i.has(e.pid)||!d(o.get(e.ppid)||{},r.get(e.ppid))||(o.set(e.pid,e),s=!0)}while(s);for(const e of i)o.delete(e);return[...o.values()].filter(e=>d(e,r.get(e.pid)))}module.exports={registerCurrent:function(){u();let r=null;try{r=w(process.pid,i())}catch{r=null}process.env.TIK_VIDEO_EDITOR_MANAGED="1",process.once("exit",()=>{if(r)try{r.record.group&&[...p().values()].some(e=>e.pid!==process.pid&&e.group===r.record.group)||e.rmSync(r.file,{force:!0}),c()}catch{}}),u()},shutdown:async function(){e.mkdirSync(n(),{recursive:!0,mode:448});const r=t.join(n(),"shutdown.json"),i=p(),f=i.get(process.pid),u=a(r);if(u&&d(u,i.get(u.pid)))throw new Error("CLI shutdown is already in progress");u&&e.rmSync(r,{force:!0}),e.writeFileSync(r,JSON.stringify(f),{flag:"wx",mode:384});const l=new Map,w=new Set,h=new Set,g=new Map,y=new Set([process.pid]);let S=i.get(process.ppid);for(;S&&!y.has(S.pid);)y.add(S.pid),S=i.get(S.ppid);try{if("win32"!==process.platform)for(;;){const e=m(p(),l,y).filter(e=>!g.has(e.pid));if(!e.length)break;for(const r of e)try{process.kill(r.pid,"SIGSTOP"),g.set(r.pid,r)}catch(e){if("ESRCH"!==e.code)throw e}}const e=Date.now()+3e3;let r,t="win32"===process.platform?i:null;do{r=m(t||p(),l,y),t=null;for(const e of r.reverse())if(!w.has(e.pid))try{process.kill(e.pid,"SIGTERM"),w.add(e.pid),g.has(e.pid)&&(process.kill(e.pid,"SIGCONT"),g.delete(e.pid))}catch(e){if("ESRCH"!==e.code)throw e}if(!r.length)break;await s(100)}while(Date.now()<e);if(r.length){const e=Date.now()+3e3;do{r=m(p(),l,y);for(const e of r.reverse())try{if("win32"===process.platform){const r=o.spawnSync("taskkill.exe",["/PID",String(e.pid),"/T","/F"],{encoding:"utf8",windowsHide:!0,timeout:5e3});if(r.error)throw r.error}else process.kill(e.pid,"SIGKILL");w.add(e.pid),h.add(e.pid)}catch(e){if("ESRCH"!==e.code)throw e}if(!r.length)break;await s(100)}while(Date.now()<e)}const n=r.length?m(p(),l,y).map(e=>e.pid):[];return{ok:0===n.length,stopped:[...w],forced:[...h],remaining:n}}finally{for(const e of g.values())try{d(e,p(e.pid).get(e.pid))&&process.kill(e.pid,"SIGCONT")}catch{}e.rmSync(r,{force:!0}),c()}},spawn:(e,r,t)=>g("spawn",[e,r,t],2),fork:(e,r,t)=>g("fork",[e,r,t],2),execFile:(e,r,t,o)=>g("execFile",[e,r,t,o],2),spawnSync:function(e,r,t){return o.spawnSync(e,r,h(t))},listManaged:function(){return e.existsSync(n())?m(p(),new Map,new Set):[]},descendantPids:function(e){const r=new Set;if(!e)return r;const t=p();r.add(e);let o=!0;for(;o;){o=!1;for(const e of t.values())r.has(e.ppid)&&!r.has(e.pid)&&(r.add(e.pid),o=!0)}return r},extraManaged:function(r){const o=r||new Set;return function(){if(!e.existsSync(n()))return[];const r=p(),o=[];for(const i of e.readdirSync(n())){if(!/^\d+\.json$/.test(i))continue;const e=a(t.join(n(),i)),s=e&&r.get(e.pid);e&&d(e,s)&&o.push(e.pid)}return o}().filter(e=>e!==process.pid&&!o.has(e))},beginMigration:function(){u(),e.mkdirSync(n(),{recursive:!0,mode:448});const r=t.join(n(),"migration.json"),o=p(process.pid).get(process.pid);if(!o)throw new Error("Cannot record the migration process");const i=a(r);if(i&&i.pid!==process.pid&&f("migration.json"))throw new Error("CLI storage migration is in progress; retry after it finishes");return e.writeFileSync(r,JSON.stringify(o),{mode:384}),()=>{try{e.rmSync(r,{force:!0})}catch{}}},migrationOwnedByOther:function(){const e=f("migration.json");return!(!e||e.pid===process.pid)},stopPids:async function(e){const r=[...new Set(e)].filter(e=>e&&e!==process.pid&&l(e));for(const e of r)try{process.kill(e,"SIGTERM")}catch{}const t=Date.now()+2e3;for(;Date.now()<t&&r.some(l);)await s(100);for(const e of r)if(l(e))try{process.kill(e,"SIGKILL")}catch{}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const e=require("node:crypto"),{execFile:t}=require("node:child_process"),r=require("node:fs"),n=require("node:os"),o=require("node:path"),s=require("./otlp"),i="https://proj-xtrace-1e4934416a1cedff5956b1291b66128-cn-hangzhou.cn-hangzhou.log.aliyuncs.com/apm/trace/opentelemetry/v1/traces",a={"x-arms-license-key":"dw8wc4ogzr@98f7fc56a7038eb","x-arms-project":"proj-xtrace-1e4934416a1cedff5956b1291b66128-cn-hangzhou","x-cms-workspace":"default-cms-1411252257529863-cn-hangzhou"},c=a["x-cms-workspace"],u=2e3,d=4096,l=72e5,p=5e3,m=4e3,f=new Set(["preparing-browser","preparing-media","rendering","finalizing"]),g={queued:6e4,starting:45e3,"preparing-browser":45e3,"preparing-media":45e3,rendering:3e4,finalizing:6e4},h=["wait","stats","stderr","activity","browserGpu","detail","metrics","stack","clipIds","timeSec","browser","exitCode","project","engine"],b=/^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;let y={},k={},S=!1,v=null,I=null,j=null,w={},x=Promise.resolve(),E="",T=null,_=null,A=!1;function N(){return y.env||process.env}function M(){return o.join(y.home||n.homedir(),".tik-video-editor-cli")}function O(){return o.join(M(),"telemetry-state.json")}function F(){return o.join(M(),"telemetry-queue")}function C(e){try{const t=JSON.parse(r.readFileSync(e,"utf8").replace(/^\uFEFF/,""));return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function P(){return C(O())}function R(e){try{r.mkdirSync(M(),{recursive:!0,mode:448});const t={...P(),...e},n=O(),o=n+"."+process.pid+".tmp";r.writeFileSync(o,JSON.stringify(t)+"\n",{mode:384}),r.renameSync(o,n)}catch{}}function D(e){const t=String(e||"").trim();if(!t)return"";try{const e=new URL(t);return!["https:","http:"].includes(e.protocol)||e.username||e.password?"":e.href}catch{return""}}function L(e){const t={};for(const r of String(e||"").split(",")){const e=r.indexOf("=");if(!(e<=0))try{const n=decodeURIComponent(r.slice(0,e).trim()),o=decodeURIComponent(r.slice(e+1).trim());n&&(t[n]=o)}catch{}}return t}function U(e=N(),t=function(){return C(o.join(M(),"telemetry.json"))}()){const r={...a};if(t.headers&&"object"==typeof t.headers&&!Array.isArray(t.headers))for(const e of Object.keys(t.headers))r[e]=String(t.headers[e]);if(Object.assign(r,L(e.OTEL_EXPORTER_OTLP_TRACES_HEADERS)),"true"===String(e.OTEL_SDK_DISABLED||"").trim().toLowerCase()||!1===t.enabled)return{disabled:!0,endpoint:"",headers:r};let n=D(i);return null!=t.endpoint&&String(t.endpoint).trim()&&(n=D(t.endpoint),!n)||String(e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT||"").trim()&&(n=D(e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT),!n)?{disabled:!0,endpoint:"",headers:r}:{disabled:!1,endpoint:n,headers:r}}function $(){if((null!=N().NODE_TEST_CONTEXT||process.execArgv.includes("--test"))&&!y.env)return!1;const e=U();return!e.disabled&&""!==e.endpoint}function B(e){let t=String(e??"");const r=N();for(const e of[r.TIK_API_KEY,r.FABLECUT_TOKEN]){const r=String(e||"").trim();r&&(t=t.split(r).join("[redacted]"))}t=t.replace(/\bhttps?:\/\/[^\s]+/gi,e=>{try{const t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.href}catch{return"[redacted-url]"}}),t=t.replace(/\bBearer\s+\S+/gi,"Bearer [redacted]"),t=t.replace(/\bsk-[A-Za-z0-9-]{8,}/g,"[redacted]"),t=t.replace(/\b[a-fA-F0-9]{64}\b/g,"[redacted]");const o=y.home||n.homedir();return o&&(t=t.split(o).join("~"),"win32"===process.platform&&(t=t.split(o.toLowerCase()).join("~"))),t}function z(e){if(!Array.isArray(e))return"";const t=[];for(const r of e){const e=String(r);e.startsWith("-")?t.push(e.split("=")[0]):t.length||t.push(e)}return t.join(" ").slice(0,500)}function J(e){if(!Array.isArray(e))return{command:"",subcommand:"",projectId:"",check:!1,help:!1};const t=[];let r="",n=!1,o=!1,s=!1;for(let i=0;i<e.length;i++){const a=String(e[i]??"");a&&("--check"===a?n=!0:"--help"===a||"-h"===a?o=!0:"--version"===a||"-v"===a?s=!0:"--project-id"===a&&i+1<e.length?r=String(e[++i]??"").trim():a.startsWith("--project-id=")?r=a.slice(13).trim():a.startsWith("-")||t.push(a))}return{command:t[0]||(s?"version":o?"help":""),subcommand:t[1]||"",projectId:r,check:n,help:o}}function V(e=k.command,t=k.rawArgv){const r=J(t),n=e||r.command;return!(n&&"version"!==n&&"help"!==n&&!r.help)||!("status"!==n||!r.check)||"storage"===n&&"info"===r.subcommand||"list-projects"===n||"auth"===n&&"status"===r.subcommand}function q(e){const t={};if(!e||"object"!=typeof e||Array.isArray(e))return t;for(const r of Object.keys(e)){if(Object.keys(t).length>=20)break;const n=String(r).slice(0,50),o=e[r];if("number"==typeof o&&Number.isFinite(o))t[n]=o;else if("boolean"==typeof o)t[n]=o?1:0;else if("string"==typeof o&&o)t[n]=B(o).slice(0,u);else{if(null==o||""===o)continue;try{t[n]=B(JSON.stringify(o)).slice(0,u)}catch{}}}return t}function G(e){if("string"==typeof e)return B(e).slice(0,d);if("number"==typeof e||"boolean"==typeof e||null==e)return e;if(Array.isArray(e))return e.slice(0,40).map(G);if("object"==typeof e){const t={};for(const r of Object.keys(e).slice(0,40))t[r]=G(e[r]);return t}return B(e)}function W(e){let t="";try{t=JSON.stringify(G(e))}catch{t=""}if(t&&"{}"!==t&&"null"!==t)return t.length>d?t.slice(0,d):t}function K(e){const t=b.exec(String(e||"").trim().toLowerCase());return t?/^0+$/.test(t[1])||/^0+$/.test(t[2])?null:{traceId:t[1],spanId:t[2],sampled:!(1&~Number.parseInt(t[3],16))}:null}function H(){return"function"==typeof y.now?y.now():Date.now()}function X(){return String(1000000n*BigInt(Math.trunc(H())))}function Q(e){const t=String(e||"").trim().slice(0,80);return!t||/[/\\]|\.\.|\s/.test(t)?"":t}function Y(e=k.projectId){const t=Q(e);if(!t)return null;const r=P().projectTraces;if(!r||"object"!=typeof r||Array.isArray(r))return null;const n=r[t];if(!n||"object"!=typeof n)return null;const o=String(n.traceId||"").toLowerCase(),s=String(n.spanId||"").toLowerCase();if(!/^[0-9a-f]{32}$/.test(o)||!/^[0-9a-f]{16}$/.test(s))return null;const i=Number(n.updatedAt)||0;return H()-i>l?null:{traceId:o,spanId:s,linked:!1!==n.linked}}function Z(e,t){const r=Q(e);if(!r||!t?.traceId||!t?.spanId)return;const n=P(),o=n.projectTraces&&"object"==typeof n.projectTraces&&!Array.isArray(n.projectTraces)?{...n.projectTraces}:{},s=H();for(const e of Object.keys(o))(!o[e]||s-(Number(o[e].updatedAt)||0)>l)&&delete o[e];o[r]={traceId:t.traceId,spanId:t.spanId,linked:!1!==t.linked,updatedAt:s};const i=Object.keys(o).sort((e,t)=>(Number(o[e]?.updatedAt)||0)-(Number(o[t]?.updatedAt)||0));for(;i.length>20;)delete o[i.shift()];R({projectTraces:o})}function ee(e){const t=String(e||"").trim().toLowerCase();return"x86_64"===t||"amd64"===t?"x64":"aarch64"===t?"arm64":String(e||"").trim()}function te(e,t,r){const n=ee(e);if(!n)return"";const o=ee(t),s=ee(r);return o&&o!==n?`${n}(rosetta:${o})`:s&&s!==n?`${n}(proc:${s})`:n}function re(){try{return String(n.cpus()?.[0]?.model||"").trim().slice(0,80)}catch{return""}}function ne(e=process.platform){return{darwin:"macOS",win32:"Windows",linux:"Linux"}[e]||e}function oe(e,t){if(!t)return"";const r=Number(t.bsize||t.frsize),n=Number(t.blocks)*r,o=Number(t.bavail)*r;if(!Number.isFinite(n)||n<=0)return"";const s=Math.max(0,Math.min(100,Math.round((n-o)/n*100)));return`${e}:${Math.round(n/1024**3)}G/${s}%`}function se(){const e=y.statfs||r.statfsSync;if("function"!=typeof e)return"";const t=[],s=function(){try{const e=require("./storage");return e.readRoot(e.configDir(y.home||n.homedir()))}catch{return o.join(M(),"storage")}}();let i=null;try{i=e(s);const r=oe("st",i);r&&t.push(r)}catch{i=null}const a=n.tmpdir();try{if(!i||!function(e,t,n=process.platform){try{return o.resolve(e)===o.resolve(t)||("win32"===n?o.parse(e).root.toLowerCase()===o.parse(t).root.toLowerCase():r.statSync(e).dev===r.statSync(t).dev)}catch{return!1}}(s,a)){const r=oe("tmp",e(a));r&&t.push(r)}}catch{}return t.join(";")}function ie(){if(y.channel)return y.channel;const e=L(N().OTEL_RESOURCE_ATTRIBUTES);if("managed"===e["tik.channel"]||"desktop"===e["tik.launcher"])return"managed";if(E)return E;const t=[o.join(__dirname,"..","package.json"),o.join(__dirname,"..","..","package.json"),o.join(__dirname,"..","..","..","package.json")];for(const e of t)try{if("@tikagent/video-editor-cli"!==JSON.parse(r.readFileSync(e,"utf8")).name)continue;let t=o.dirname(e);for(let e=0;e<4;e++){t=o.dirname(t);try{if("tikagent-managed-tik-video-editor-cli"===JSON.parse(r.readFileSync(o.join(t,"package.json"),"utf8")).name)return E="managed",E}catch{}}return E="standalone",E}catch{}return E="standalone",E}function ae(){const e=L(N().OTEL_RESOURCE_ATTRIBUTES)["tik.launcher"];return"desktop"===e||"standalone"===e?e:"managed"===ie()?"desktop":"standalone"}function ce(){const e=L(N().OTEL_RESOURCE_ATTRIBUTES),t=String(e["user.id"]||e["enduser.id"]||"").trim().slice(0,80);return t&&!/sk-|api[_-]?key|token/i.test(t)?(P().userName!==t&&R({userName:t}),t):String(P().userName||"").trim()}function ue(e=N()){return L(e.OTEL_RESOURCE_ATTRIBUTES)["deployment.environment"]||("test"===String(e.TIK_ENV||"").trim().toLowerCase()?"test":function(){if(null!=T)return T;let e=__dirname;for(let t=0;t<6;t++){try{if("fablecut"===JSON.parse(r.readFileSync(o.join(e,"package.json"),"utf8")).name)return T=!0,!0}catch{}const t=o.dirname(e);if(t===e)break;e=t}return T=!1,!1}()?"dev":"prod")}function de(){const e=String(N().FABLECUT_VERSION||"").trim();if(e)return e;const t=[o.join(__dirname,"..","package.json"),o.join(__dirname,"..","..","package.json"),o.join(__dirname,"..","..","..","package.json")];for(const e of t)try{const t=JSON.parse(r.readFileSync(e,"utf8"));if("@tikagent/video-editor-cli"===t.name&&t.version)return String(t.version)}catch{}return""}function le(){const t=P();if("string"==typeof t.deviceId&&t.deviceId.startsWith("uid_"))return t.deviceId;const r="uid_"+e.randomBytes(12).toString("hex");return R({deviceId:r}),r}function pe(e){const t=P()[e];return t&&"number"==typeof t.at?Date.now()-t.at>=(t.value||t.version||t.encoders?6048e5:864e5)?{}:t:{}}function me(){const e=N(),t=function(){if(j){try{j.memFreeMb=Math.round(n.freemem()/1048576)}catch{}return j.disk=se(),j}const e=(()=>{try{return n.cpus()||[]}catch{return[]}})();let t="";try{t="function"==typeof n.machine?n.machine():""}catch{t=""}const r=Number(e[0]?.speed);return j={cpuArch:te(n.arch(),t,process.arch),cpuCores:e.length||"",cpuMhz:r>0?r:"",cpuModel:re(),memTotalMb:Math.round(n.totalmem()/1048576)||"",memFreeMb:Math.round(n.freemem()/1048576)||"",disk:se(),locale:(()=>{try{return Intl.DateTimeFormat().resolvedOptions().locale||""}catch{return""}})()},j}(),r=U(),o=w.ffmpegVer?w:pe("ffmpeg"),s=w.gpu||pe("gpu").value||"",i=ce();return{"service.name":"tik-video-editor-cli","service.version":de(),"deployment.environment":ue(e),"acs.cms.workspace":r.headers["x-cms-workspace"]||c,"tik.role":k.role||"","tik.device_id":le(),"enduser.id":i,"user.id":i,"tik.channel":ie(),"tik.launcher":ae(),"tik.cpu.arch":t.cpuArch,"tik.cpu.cores":t.cpuCores,"tik.cpu.mhz":t.cpuMhz,"tik.cpu.model":t.cpuModel,"tik.mem.total_mb":t.memTotalMb,"tik.mem.free_mb":t.memFreeMb,"tik.disk":t.disk,"tik.locale":t.locale,"tik.gpu":s,"tik.ffmpeg.version":o.version||o.ffmpegVer||"","tik.ffprobe.version":o.probe||o.ffprobeVer||"","tik.hw.encoders":o.encoders||o.hwEncoders||"","tik.browser.gpu":w.browserGpu||k.browserGpu||"","tik.os":ne(),"tik.os.version":n.release(),"process.runtime.version":process.version,...L(e.OTEL_RESOURCE_ATTRIBUTES)}}function fe(e){return(String(e||"").split(/\r?\n/).find(Boolean)||"").replace(/\s+Copyright\b[\s\S]*$/i,"").trim().slice(0,160)}function ge(e){const t=["h264_nvenc","h264_qsv","h264_amf","h264_videotoolbox"].filter(t=>new RegExp("\\b"+t+"\\b").test(String(e||"")));return t.length?t.map(e=>e.replace(/^h264_/,"")).join(","):"none"}function he(e){const t=String(e||"").search(/[\[{]/);if(t<0)return null;try{return JSON.parse(String(e).slice(t))}catch{return null}}function be(e,r,n){const o=y.execFile||t;return new Promise(t=>{try{o(e,r,{encoding:"utf8",timeout:n,windowsHide:!0,maxBuffer:1048576},(e,r,n)=>{t({status:e?1:0,stdout:String(r||""),stderr:String(n||e?.message||"")})})}catch(e){t({status:1,stdout:"",stderr:e.message})}})}function ye(e){return(Array.isArray(e)?e:e?[e]:[]).slice(0,2).map(e=>{const t=String(e.Name||e.sppci_model||"").trim(),r=String(e.DriverVersion||"").trim();return t?r?`${t}(${r})`:t:""}).filter(Boolean).join(";").slice(0,200)}async function ke(e=process.platform){if("win32"===e){const e=o.join(process.env.SystemRoot||"C:\\Windows","System32","WindowsPowerShell","v1.0","powershell.exe"),t="Get-CimInstance Win32_VideoController | Select-Object Name,DriverVersion | ConvertTo-Json -Compress";return ye(he((await be(e,["-NoProfile","-NonInteractive","-Command",t],p)).stdout))}if("darwin"===e){const e=await be("system_profiler",["SPDisplaysDataType","-json"],p);return ye(he(e.stdout)?.SPDisplaysDataType)}const t=await be("lspci",["-mm"],p);return String(t.stdout||"").split(/\r?\n/).filter(e=>/VGA|3D|Display/i.test(e)).slice(0,2).map(e=>{const t=[...e.matchAll(/"([^"]*)"/g)].map(e=>e[1]);return[t[2],t[3]].filter(Boolean).join(" ")}).filter(Boolean).join(";").slice(0,200)}async function Se(){const e=await be("ffmpeg",["-version"],m),t=await be("ffprobe",["-version"],m),r=await be("ffmpeg",["-hide_banner","-encoders"],m),n=0===e.status&&e.stdout;return{version:n?fe(e.stdout):"",probe:0===t.status?fe(t.stdout):"",encoders:n?ge(r.stdout):""}}async function ve(e,t){const r=pe(e);if(r.at)return r;const n={...await t(),at:Date.now()};return R({[e]:n}),n}function Ie(e){e.attributes["tik.launcher"]=ae(),e.attributes["tik.trace.linked"]=e.linked?1:0;const t=ce();t&&(e.attributes["user.id"]=t),k.projectId&&!e.attributes["tik.project.id"]&&(e.attributes["tik.project.id"]=k.projectId),k.role&&(e.attributes["tik.role"]=k.role),k.command&&(e.attributes["tik.command"]=k.command),k.argvSummary&&(e.attributes["tik.argv"]=k.argvSummary)}function je(t,r={}){const n=r.parent||null,o={traceId:n?.traceId||e.randomBytes(16).toString("hex"),spanId:e.randomBytes(8).toString("hex"),parentSpanId:n?.spanId||"",name:String(t||"span").slice(0,120),kind:1,flags:1,startTimeUnixNano:X(),attributes:{...r.attributes||{}},events:[],linked:null!=r.linked?!!r.linked:!(!n||!n.linked),ended:!1};return Ie(o),o}function we(e){const t=e instanceof Error?e:new Error(B(e||"Error"));return{timeUnixNano:X(),name:"exception",attributes:{"exception.type":String(t.name||"Error").slice(0,120),"exception.message":B(t.message||"").slice(0,u),"exception.stacktrace":B(t.stack||"").slice(0,d)}}}function xe(e,t={}){if(!e||e.ended)return Promise.resolve(!1);if(e.ended=!0,e.endTimeUnixNano=X(),t.attributes&&Object.assign(e.attributes,t.attributes),t.events&&e.events.push(...t.events),t.error){const r=t.error instanceof Error?t.error:new Error(B(t.error));e.status={code:2,message:B(r.message||"").slice(0,u)},e.events.push(we(r))}else e.status=t.status||{code:1};return Ie(e),$()?((I||(I=s.createTraceExporter({resource:me,scope:()=>({name:"tik-video-editor-cli",version:de()}),endpoint:()=>U().endpoint,headers:()=>U().headers,fetchImpl:()=>y.fetch||globalThis.fetch,onFailure:e=>Ae(e)})),I).add(e),Promise.resolve(!0)):Promise.resolve(!1)}function Ee(){return v&&!v.ended?{traceId:v.traceId,spanId:v.spanId,linked:v.linked}:null}function Te(){if(v)return k.command&&"cli"===v.name&&(v.name=`cli ${k.command}`.slice(0,120)),Ie(v),v;const e=function(){const e=K(N().TRACEPARENT);return e?{traceId:e.traceId,spanId:e.spanId,linked:!0}:null}(),t=!e&&k.projectId?Y(k.projectId):null,r=e||t;return v=je(k.command?`cli ${k.command}`:"cli",{parent:r,linked:!!r,attributes:{"tik.trace.linked":r?1:0,...k.projectId?{"tik.project.id":k.projectId}:{}}}),k.projectId&&Z(k.projectId,e?{traceId:v.traceId,spanId:v.spanId,linked:!0}:t||{traceId:v.traceId,spanId:v.spanId,linked:!0}),v}function _e(e={}){if(!e.name)return Promise.resolve(!1);const t=process.memoryUsage(),r=je(e.name,{parent:Ee(),attributes:q({role:k.role,command:k.command,...e.group?{group:e.group}:{},...Number.isFinite(e.value)?{value:e.value}:{},...e.properties})}),n=W({rssMb:Math.round(t.rss/1048576),heapUsedMb:Math.round(t.heapUsed/1048576),...e.snapshots});return n&&(r.attributes["tik.snapshot"]=n),xe(r,{status:{code:1}}).then(()=>!0,()=>!1)}function Ae(t){try{r.mkdirSync(F(),{recursive:!0,mode:448});const n=r.readdirSync(F()).filter(e=>e.endsWith(".json")||e.includes(".sending-")).sort();for(;n.length>=50;)r.rmSync(o.join(F(),n.shift()),{force:!0});const s=o.join(F(),Date.now()+"-"+e.randomBytes(4).toString("hex")+".json");return r.writeFileSync(s,JSON.stringify(t),{mode:384,flag:"wx"}),s}catch{return""}}function Ne(e){const t=Number(String(e).split("-")[0]);return Number.isFinite(t)?t:0}function Me(e,t=process.pid,n=Date.now()){const s=o.basename(e),i=/\.sending-\d+$/.test(s);if(!i&&!s.endsWith(".json"))return"";if(i){let t=0;try{t=r.statSync(e).mtimeMs}catch{return""}if(n-t<6e5)return""}const a=s.replace(/\.json$/,"").replace(/\.sending-\d+$/,""),c=o.join(o.dirname(e),a+".sending-"+t);try{return r.renameSync(e,c),c}catch{return""}}async function Oe(e,t){const r=U(),n=y.fetch||globalThis.fetch;await s.postExport(r.endpoint,r.headers,e,{fetchImpl:n,signal:t})}function Fe(e){return _||(_=async function(e){if(!$())return;let t=[];try{t=r.readdirSync(F()).sort()}catch{return}let n=0;for(const s of t){if(e?.aborted||n>=10)return;const t=o.join(F(),s),i=Ne(s);if(!i||Date.now()-i>6048e5){r.rmSync(t,{force:!0});continue}const a=Me(t);if(!a)continue;let c;try{c=JSON.parse(r.readFileSync(a,"utf8"))}catch{r.rmSync(a,{force:!0});continue}try{await Oe(c,e),r.rmSync(a,{force:!0}),n+=1}catch{const e=a.replace(/\.sending-\d+$/,".json");try{e!==a&&r.renameSync(a,e)}catch{}return}}}(e)),_}function Ce(e,t){if(!e||e.done)return null;const r=g[e.state];if(!r)return null;const n=e.lastProgressAt??e.startedAt??t,o=Math.max(0,t-n);if(o<r)return null;const s="rendering"===e.state?o>=12e4:o>=2*r;return{state:e.state,idleMs:o,severe:s,threshold:r}}function Pe(e,t){if(!e||e.done)return!1;if(e.wait&&e.wait.reason)return!0;const r=e.lastProgressAt??e.startedAt??t,n=Math.max(0,t-r);return"rendering"===e.state?n>=1e4:n>=15e3&&Object.prototype.hasOwnProperty.call(g,e.state)}function Re(e){I&&I.stop(),y={...e},k={},S=!1,v=null,I=null,j=null,w={},x=Promise.resolve(),E="",T=null,_=null,A=!1}module.exports={EXPORT_WAIT_REASONS:["source-block","video-seek","source-image","frame-assets","audio-mix","encoder"],DEFAULT_ENDPOINT:i,DEFAULT_HEADERS:a,initTelemetry:function(e={}){if(k={...k,...e},Array.isArray(k.argv)){k.rawArgv=k.argv.slice();const e=J(k.argv);!k.command&&e.command&&(k.command=e.command),!k.projectId&&e.projectId&&(k.projectId=Q(e.projectId)),k.argvSummary=z(k.argv),delete k.argv}return!!$()&&(S||(S=!0,le(),ce(),function(){if(A||"cli"!==k.role||"managed"===ie())return;if(P().noticeShown)return void(A=!0);A=!0;const e=y.stderr||process.stderr;try{e.write('tik-video-editor-cli 会向阿里云 ARMS 上报命令名、导出摘要和机器信息,不含参数值与工程内容。关闭:设置 OTEL_SDK_DISABLED=true,或在 ~/.tik-video-editor-cli/telemetry.json 写入 {"enabled":false}。\n')}catch{}R({noticeShown:!0})}(),"server"===k.role&&("server"===k.role&&(x=Promise.allSettled([(async()=>{const e=await ve("gpu",async()=>({value:await ke()}));w.gpu=e.value||""})(),(async()=>{const e=await ve("ffmpeg",Se);w.ffmpegVer=e.version||"",w.ffprobeVer=e.probe||"",w.hwEncoders=e.encoders||""})()]).then(()=>{})),Fe())),"cli"===k.role&&k.command&&!V()&&Te(),!0)},isTelemetryEnabled:$,rememberUser:function(e){const t=String(e??"").trim().slice(0,80);t&&!/sk-|api[_-]?key|token/i.test(t)&&R({userName:t})},noteBrowserGpu:function(e){const t=B(e).trim().slice(0,180);t&&(w.browserGpu=t,k.browserGpu=t)},reportError:function(e,t,r,n){const o=t instanceof Error?t:new Error(B(t||e)),s=process.memoryUsage(),i=je(String(e||o.name||"Error"),{parent:Ee(),attributes:q({role:k.role,command:k.command,...r})}),a=W({rssMb:Math.round(s.rss/1048576),heapUsedMb:Math.round(s.heapUsed/1048576),...n});return a&&(i.attributes["tik.snapshot"]=a),xe(i,{error:o})},reportCustom:_e,reportFatalSync:function(e,t,r,n){if(!$())return!1;const o=t instanceof Error?t:new Error(B(t||e)),i=je(String(e||"Error"),{parent:Ee(),attributes:q({role:k.role,command:k.command,...r})});i.ended=!0,i.endTimeUnixNano=X(),i.status={code:2,message:B(o.message||"").slice(0,u)},i.events.push(we(o));const a=W(n);return a&&(i.attributes["tik.snapshot"]=a),Ie(i),Ae(s.encodeExport(me(),[i],{name:"tik-video-editor-cli",version:de()})),!0},flushTelemetry:async function(e=500){if(!$())return!1;const t=new AbortController;let r;const n=new Promise(n=>{r=setTimeout(()=>{t.abort(),n("timeout")},Math.max(0,e)),r.unref?.()}),o=(async()=>(I&&await I.flush(t.signal),await Fe(t.signal),"done"))();return await Promise.race([o,n]),clearTimeout(r),I&&I.salvage(),!0},finishCommand:function(e){if(!$())return Promise.resolve(!1);const t=e?Number.isInteger(e.exitCode)?e.exitCode:1:Number(process.exitCode)||0;if(!e&&!t&&V())return v&&(v.ended=!0),Promise.resolve(!1);if(Te(),!v||v.ended)return Promise.resolve(!1);if(e||t){const r=e instanceof Error?e:new Error(t?"exit "+t:"command failed");return xe(v,{error:r,attributes:{"tik.exit.code":t||1}})}return xe(v,{status:{code:1},attributes:{"tik.exit.code":0}})},startSpan:je,endSpan:xe,currentParent:Ee,bindProjectTrace:function(e){const t=Q(e);if(!t)return null;if(k.projectId=t,!$())return null;if(Te(),!v)return null;v.attributes["tik.project.id"]=t;const r=Y(t);if(r&&r.traceId===v.traceId)return Z(t,r),r;const n={traceId:v.traceId,spanId:v.spanId,linked:!0};return Z(t,n),n},resolveProjectTrace:Y,isQuietSuccessCommand:V,traceparent:function(){return v?`00-${v.traceId}-${v.spanId}-01`:""},createExportMonitor:function(e={}){if(!e.report&&!$())return{stop(){},upsert(){},note(){},cancel:()=>!1,fail(){},complete(){},scan(){}};const t=new Map,r=e.now||Date.now;function n(t,r){try{if(e.report)return void e.report(r.error?"exception":"custom",{name:t.name,status:r.error?2:r.status?.code??1,attributes:t.attributes,events:t.events,error:r.error,properties:t.attributes});xe(t,r)}catch{}}function o(e,t={}){for(const r of h)void 0!==t[r]&&(e[r]=t[r])}function s(t,r){!e.report&&f.has(r)&&(t.stageSpan=je(`export.${r}`,{parent:{traceId:t.span.traceId,spanId:t.span.spanId,linked:t.span.linked},linked:t.span.linked,attributes:{"tik.export.id":t.id,"tik.export.engine":t.engine||"","tik.export.stage":r,...t.projectId?{"tik.project.id":t.projectId}:{}}}))}function i(e,t={}){if(!e?.stageSpan)return;const r=e.stageSpan;e.stageSpan=null,xe(r,{status:t.error?void 0:{code:1},error:t.error,attributes:{"tik.export.id":e.id,"tik.export.engine":e.engine||"","tik.export.frames":e.frames||0,...e.totalFrames?{"tik.export.total_frames":e.totalFrames}:{}}})}function a(e,n){let o=t.get(e);if(!o){const i=Q(n.projectId),a=K(n.traceparent),c=a?{traceId:a.traceId,spanId:a.spanId,linked:!0}:i?Y(i):null,u=n.state||"queued";o={id:e,projectId:i,engine:n.engine||"",state:u,startedAt:n.startedAt??r(),lastProgressAt:n.startedAt??r(),frames:0,reported:new Set,stalled:!1,maxStallMs:0,done:!1,stageSpan:null,span:je("export",{parent:c,linked:!!c,attributes:{"tik.export.id":e,"tik.export.engine":n.engine||"",...i?{"tik.project.id":i}:{}}})},s(o,u),t.set(e,o)}return n.projectId&&!o.projectId&&(o.projectId=Q(n.projectId),o.projectId&&(o.span.attributes["tik.project.id"]=o.projectId)),n.traceparent&&function(e,t){const r=K(t);r&&!e.span.parentSpanId&&(e.span.traceId=r.traceId,e.span.parentSpanId=r.spanId,e.span.linked=!0,e.span.attributes["tik.trace.linked"]=1,e.stageSpan&&(e.stageSpan.traceId=r.traceId,e.stageSpan.linked=!0,e.stageSpan.attributes["tik.trace.linked"]=1))}(o,n.traceparent),o}function c(e){return W({project:e.project,wait:e.wait,stats:e.stats,stderr:e.stderr,activity:e.activity,detail:e.detail,browser:e.browser,browserGpu:e.browserGpu,stack:e.stack,clipIds:e.clipIds,metrics:e.metrics,timeSec:e.timeSec})}function u(t){try{const r=e.enrich?.(t.id,t);r&&"object"==typeof r&&o(t,r)}catch{}}function d(e,r){if(!e||e.done)return;i(e,r);const o=c(e);o&&(e.span.attributes["tik.snapshot"]=o),Object.assign(e.span.attributes,{"tik.export.id":e.id,"tik.export.engine":e.engine||"","tik.export.frames":e.frames||0,"tik.export.total_frames":e.totalFrames||0,"tik.export.state":e.state||"",...e.projectId?{"tik.project.id":e.projectId}:{},...r.attributes||{}}),e.done=!0,n(e.span,r),t.delete(e.id)}function l(){const o=r();for(const r of t.values()){if(r.done)continue;u(r);const t=Ce(r,o);if(!t)continue;r.maxStallMs=Math.max(r.maxStallMs,t.idleMs);const s=t.severe?"severe":"warn";if(r.reported.has(s))continue;r.reported.add(s),r.stalled=!0;const i={stage:r.state||"",stallMs:t.idleMs,frames:r.frames||0,totalFrames:r.totalFrames||0,waitReason:r.wait?.reason||"",engine:r.engine||"",severe:t.severe?1:0,"tik.export.id":r.id};if(r.span.events.push({timeUnixNano:X(),name:"export_stall",attributes:i}),e.report&&e.report("custom",{name:"export_stall",properties:i,severe:i.severe}),!t.severe)continue;const a=je("ExportStalled",{parent:{traceId:r.span.traceId,spanId:r.span.spanId,linked:r.span.linked},linked:r.span.linked,attributes:i}),d=c(r);d&&(a.attributes["tik.snapshot"]=d),n(a,{error:new Error(`导出在 ${r.state} 停滞 ${Math.round(t.idleMs/1e3)} 秒`)})}}const p=setInterval(l,e.interval||5e3);return p.unref?.(),{stop(){clearInterval(p)},upsert:function(t,n={}){if(!t)return null;const c=r(),u=a(t,n);n.engine&&(u.engine=n.engine);const d=n.state||u.state,l=d!==u.state,p=Number.isFinite(n.frames)&&n.frames>(u.frames||0),m="string"==typeof n.detail&&n.detail&&n.detail!==u.detail;if(l||p||m){const t=c-u.lastProgressAt;u.stalled&&(u.maxStallMs=Math.max(u.maxStallMs,t),u.span.events.push({timeUnixNano:X(),name:"export_stall_recovered",attributes:{stage:u.state,maxStallMs:u.maxStallMs,engine:u.engine||""}}),e.report&&e.report("custom",{name:"export_stall_recovered",properties:{stage:u.state,maxStallMs:u.maxStallMs}}),u.stalled=!1,u.reported.clear()),u.lastProgressAt=c}return p&&(u.frames=n.frames),Number.isFinite(n.totalFrames)&&(u.totalFrames=n.totalFrames),l&&(i(u),u.state=d,s(u,d)),o(u,n),u},note:function(e,r){const n=t.get(e);n&&o(n,r)},scan:l,cancel:function(e){const n=t.get(e);if(!n||n.done)return!1;u(n);const o=Pe(n,r()),s=Math.max(0,r()-n.lastProgressAt);return o?(d(n,{error:new Error(`导出在 ${n.state} 等待 ${Math.round(s/1e3)} 秒后被取消`),attributes:{"tik.export.outcome":"cancelled-stalled",stallMs:s,waitReason:n.wait?.reason||""}}),!0):(d(n,{status:{code:1},attributes:{"tik.export.outcome":"cancelled",stallMs:s}}),!1)},fail:function(e,r,n={}){const s=t.get(e)||a(e,{state:n.stage||"starting"});s&&!s.done&&(o(s,n),u(s),d(s,{error:r instanceof Error?r:new Error(String(r||"export failed")),attributes:{"tik.export.outcome":"failed",stage:n.stage||s.state||"",origin:n.origin||"server"}}))},complete:function(e,r={}){const n=t.get(e)||a(e,{});if(!n||n.done)return;o(n,r),Number.isFinite(r.frames)&&(n.frames=r.frames),Number.isFinite(r.totalFrames)&&(n.totalFrames=r.totalFrames);const s=r.metrics||n.metrics;d(n,{status:{code:1},attributes:{"tik.export.outcome":"complete",...Number.isFinite(Number(s?.totalMs))?{"tik.export.elapsed_ms":Number(s.totalMs)}:{}}});const i=s?.fallbacks||s?.cache?.fallbacks;i&&"object"==typeof i&&Object.keys(i).length&&_e({name:"export_cache_fallback",type:"export",properties:{engine:n.engine||"",count:Object.keys(i).length},snapshots:{fallbacks:i}})}}},summarizeExportProject:function(e,t={}){const r=Array.isArray(e?.clips)?e.clips:[],n=Array.isArray(e?.media)?e.media:[],o={};let s=0,i=0,a=0,c=0,u=0;for(const e of r){const t=e?.kind||"unknown";o[t]=(o[t]||0)+1;const r=e?.props||{};r.bgRemove&&(s+=1),r.chromaKey&&(i+=1),(r.filterPreset&&"none"!==r.filterPreset||r.shake||r.rgbSplit||r.grain)&&(a+=1),(Number(r.speed)&&1!==Number(r.speed)||e?.keyframes?.speed)&&(c+=1),(e?.transitionIn||e?.transitionOut)&&(u+=1)}const d=r.reduce((e,t)=>Math.max(e,(Number(t?.start)||0)+(Number(t?.duration)||0)),0),l=Number(e?.fps)||0;return{width:e?.width,height:e?.height,fps:l,revision:e?.revision,durationSec:Math.round(1e3*d)/1e3,totalFrames:l>0&&d>0?Math.max(1,Math.round(d*l)):void 0,clips:r.length,kinds:o,tracks:Array.isArray(e?.tracks)?e.tracks.length:void 0,bgRemove:s,chroma:i,effects:a,speed:c,transitions:u,media:n.length,...Number.isFinite(t.mediaBytes)?{mediaBytes:t.mediaBytes}:{}}},resolveTelemetryConfig:U,parseTraceparent:K,summarizeArgv:z,sanitizeTelemetryText:B,clipTelemetryProperties:q,evaluateExportHealth:Ce,isExportCancelStalled:Pe,formatCpuArch:te,formatDiskSegment:oe,parseFfmpegVersionLine:fe,parseHardwareEncoders:ge,tryClaimQueueFile:Me,setTelemetryDeps:Re,resetTelemetryForTests:function(){Re({})}};
|
|
1
|
+
"use strict";const e=require("node:crypto"),t=require("node:fs"),r=require("node:os"),n=require("node:path"),o=require("./otlp"),s="https://proj-xtrace-1e4934416a1cedff5956b1291b66128-cn-hangzhou.cn-hangzhou.log.aliyuncs.com/apm/trace/opentelemetry/v1/traces",i={"x-arms-license-key":"dw8wc4ogzr@98f7fc56a7038eb","x-arms-project":"proj-xtrace-1e4934416a1cedff5956b1291b66128-cn-hangzhou","x-cms-workspace":"default-cms-1411252257529863-cn-hangzhou"},a=i["x-cms-workspace"],c=2e3,d=4096,u=72e5,l=new Set(["preparing-browser","preparing-media","rendering","finalizing"]),p={queued:6e4,starting:45e3,"preparing-browser":45e3,"preparing-media":45e3,rendering:3e4,finalizing:6e4},m=["wait","stats","stderr","activity","browserGpu","detail","metrics","stack","clipIds","timeSec","browser","exitCode","project","engine"],f=/^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;let g={},h={},b=!1,k=null,y=null,S=null,v={},I="",j=null,x=null,w=!1;function E(){return g.env||process.env}function T(){return n.join(g.home||r.homedir(),".tik-video-editor-cli")}function _(){return n.join(T(),"telemetry-state.json")}function N(){return n.join(T(),"telemetry-queue")}function A(e){try{const r=JSON.parse(t.readFileSync(e,"utf8").replace(/^\uFEFF/,""));return r&&"object"==typeof r&&!Array.isArray(r)?r:{}}catch{return{}}}function F(){return A(_())}function M(e){try{t.mkdirSync(T(),{recursive:!0,mode:448});const r={...F(),...e},n=_(),o=n+"."+process.pid+".tmp";t.writeFileSync(o,JSON.stringify(r)+"\n",{mode:384}),t.renameSync(o,n)}catch{}}function O(e){const t=String(e||"").trim();if(!t)return"";try{const e=new URL(t);return!["https:","http:"].includes(e.protocol)||e.username||e.password?"":e.href}catch{return""}}function R(e){const t={};for(const r of String(e||"").split(",")){const e=r.indexOf("=");if(!(e<=0))try{const n=decodeURIComponent(r.slice(0,e).trim()),o=decodeURIComponent(r.slice(e+1).trim());n&&(t[n]=o)}catch{}}return t}function C(e=E(),t=function(){return A(n.join(T(),"telemetry.json"))}()){const r={...i};if(t.headers&&"object"==typeof t.headers&&!Array.isArray(t.headers))for(const e of Object.keys(t.headers))r[e]=String(t.headers[e]);if(Object.assign(r,R(e.OTEL_EXPORTER_OTLP_TRACES_HEADERS)),"true"===String(e.OTEL_SDK_DISABLED||"").trim().toLowerCase()||!1===t.enabled)return{disabled:!0,endpoint:"",headers:r};let o=O(s);return null!=t.endpoint&&String(t.endpoint).trim()&&(o=O(t.endpoint),!o)||String(e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT||"").trim()&&(o=O(e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT),!o)?{disabled:!0,endpoint:"",headers:r}:{disabled:!1,endpoint:o,headers:r}}function P(){if((null!=E().NODE_TEST_CONTEXT||process.execArgv.includes("--test"))&&!g.env)return!1;const e=C();return!e.disabled&&""!==e.endpoint}function L(e){let t=String(e??"");const n=E();for(const e of[n.TIK_API_KEY,n.FABLECUT_TOKEN]){const r=String(e||"").trim();r&&(t=t.split(r).join("[redacted]"))}t=t.replace(/\bhttps?:\/\/[^\s]+/gi,e=>{try{const t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.href}catch{return"[redacted-url]"}}),t=t.replace(/\bBearer\s+\S+/gi,"Bearer [redacted]"),t=t.replace(/\bsk-[A-Za-z0-9-]{8,}/g,"[redacted]"),t=t.replace(/\b[a-fA-F0-9]{64}\b/g,"[redacted]");const o=g.home||r.homedir();return o&&(t=t.split(o).join("~"),"win32"===process.platform&&(t=t.split(o.toLowerCase()).join("~"))),t}function U(e){if(!Array.isArray(e))return"";const t=[];for(const r of e){const e=String(r);e.startsWith("-")?t.push(e.split("=")[0]):t.length||t.push(e)}return t.join(" ").slice(0,500)}function $(e){if(!Array.isArray(e))return{command:"",subcommand:"",projectId:"",check:!1,help:!1};const t=[];let r="",n=!1,o=!1,s=!1;for(let i=0;i<e.length;i++){const a=String(e[i]??"");a&&("--check"===a?n=!0:"--help"===a||"-h"===a?o=!0:"--version"===a||"-v"===a?s=!0:"--project-id"===a&&i+1<e.length?r=String(e[++i]??"").trim():a.startsWith("--project-id=")?r=a.slice(13).trim():a.startsWith("-")||t.push(a))}return{command:t[0]||(s?"version":o?"help":""),subcommand:t[1]||"",projectId:r,check:n,help:o}}function D(e=h.command,t=h.rawArgv){const r=$(t),n=e||r.command;return!(n&&"version"!==n&&"help"!==n&&!r.help)||!("status"!==n||!r.check)||"storage"===n&&"info"===r.subcommand||"list-projects"===n||"auth"===n&&"status"===r.subcommand}function B(e){const t={};if(!e||"object"!=typeof e||Array.isArray(e))return t;for(const r of Object.keys(e)){if(Object.keys(t).length>=20)break;const n=String(r).slice(0,50),o=e[r];if("number"==typeof o&&Number.isFinite(o))t[n]=o;else if("boolean"==typeof o)t[n]=o?1:0;else if("string"==typeof o&&o)t[n]=L(o).slice(0,c);else{if(null==o||""===o)continue;try{t[n]=L(JSON.stringify(o)).slice(0,c)}catch{}}}return t}function z(e){if("string"==typeof e)return L(e).slice(0,d);if("number"==typeof e||"boolean"==typeof e||null==e)return e;if(Array.isArray(e))return e.slice(0,40).map(z);if("object"==typeof e){const t={};for(const r of Object.keys(e).slice(0,40))t[r]=z(e[r]);return t}return L(e)}function q(e){let t="";try{t=JSON.stringify(z(e))}catch{t=""}if(t&&"{}"!==t&&"null"!==t)return t.length>d?t.slice(0,d):t}function J(e){const t=f.exec(String(e||"").trim().toLowerCase());return t?/^0+$/.test(t[1])||/^0+$/.test(t[2])?null:{traceId:t[1],spanId:t[2],sampled:!(1&~Number.parseInt(t[3],16))}:null}function G(){return"function"==typeof g.now?g.now():Date.now()}function W(){return String(1000000n*BigInt(Math.trunc(G())))}function K(e){const t=String(e||"").trim().slice(0,80);return!t||/[/\\]|\.\.|\s/.test(t)?"":t}function V(e=h.projectId){const t=K(e);if(!t)return null;const r=F().projectTraces;if(!r||"object"!=typeof r||Array.isArray(r))return null;const n=r[t];if(!n||"object"!=typeof n)return null;const o=String(n.traceId||"").toLowerCase(),s=String(n.spanId||"").toLowerCase();if(!/^[0-9a-f]{32}$/.test(o)||!/^[0-9a-f]{16}$/.test(s))return null;const i=Number(n.updatedAt)||0;return G()-i>u?null:{traceId:o,spanId:s,linked:!1!==n.linked}}function X(e,t){const r=K(e);if(!r||!t?.traceId||!t?.spanId)return;const n=F(),o=n.projectTraces&&"object"==typeof n.projectTraces&&!Array.isArray(n.projectTraces)?{...n.projectTraces}:{},s=G();for(const e of Object.keys(o))(!o[e]||s-(Number(o[e].updatedAt)||0)>u)&&delete o[e];o[r]={traceId:t.traceId,spanId:t.spanId,linked:!1!==t.linked,updatedAt:s};const i=Object.keys(o).sort((e,t)=>(Number(o[e]?.updatedAt)||0)-(Number(o[t]?.updatedAt)||0));for(;i.length>20;)delete o[i.shift()];M({projectTraces:o})}function H(e){const t=String(e||"").trim().toLowerCase();return"x86_64"===t||"amd64"===t?"x64":"aarch64"===t?"arm64":String(e||"").trim()}function Q(e,t,r){const n=H(e);if(!n)return"";const o=H(t),s=H(r);return o&&o!==n?`${n}(rosetta:${o})`:s&&s!==n?`${n}(proc:${s})`:n}function Y(){try{return String(r.cpus()?.[0]?.model||"").trim().slice(0,80)}catch{return""}}function Z(e=process.platform){return{darwin:"macOS",win32:"Windows",linux:"Linux"}[e]||e}function ee(e,t){if(!t)return"";const r=Number(t.bsize||t.frsize),n=Number(t.blocks)*r,o=Number(t.bavail)*r;if(!Number.isFinite(n)||n<=0)return"";const s=Math.max(0,Math.min(100,Math.round((n-o)/n*100)));return`${e}:${Math.round(n/1024**3)}G/${s}%`}function te(){const e=g.statfs||t.statfsSync;if("function"!=typeof e)return"";const o=[],s=function(){try{const e=require("./storage");return e.readRoot(e.configDir(g.home||r.homedir()))}catch{return n.join(T(),"storage")}}();let i=null;try{i=e(s);const t=ee("st",i);t&&o.push(t)}catch{i=null}const a=r.tmpdir();try{if(!i||!function(e,r,o=process.platform){try{return n.resolve(e)===n.resolve(r)||("win32"===o?n.parse(e).root.toLowerCase()===n.parse(r).root.toLowerCase():t.statSync(e).dev===t.statSync(r).dev)}catch{return!1}}(s,a)){const t=ee("tmp",e(a));t&&o.push(t)}}catch{}return o.join(";")}function re(){if(g.channel)return g.channel;const e=R(E().OTEL_RESOURCE_ATTRIBUTES);if("managed"===e["tik.channel"]||"desktop"===e["tik.launcher"])return"managed";if(I)return I;const r=[n.join(__dirname,"..","package.json"),n.join(__dirname,"..","..","package.json"),n.join(__dirname,"..","..","..","package.json")];for(const e of r)try{if("@tikagent/video-editor-cli"!==JSON.parse(t.readFileSync(e,"utf8")).name)continue;let r=n.dirname(e);for(let e=0;e<4;e++){r=n.dirname(r);try{if("tikagent-managed-tik-video-editor-cli"===JSON.parse(t.readFileSync(n.join(r,"package.json"),"utf8")).name)return I="managed",I}catch{}}return I="standalone",I}catch{}return I="standalone",I}function ne(){const e=R(E().OTEL_RESOURCE_ATTRIBUTES)["tik.launcher"];return"desktop"===e||"standalone"===e?e:"managed"===re()?"desktop":"standalone"}function oe(){const e=R(E().OTEL_RESOURCE_ATTRIBUTES),t=String(e["user.id"]||e["enduser.id"]||"").trim().slice(0,80);return t&&!/sk-|api[_-]?key|token/i.test(t)?(F().userName!==t&&M({userName:t}),t):String(F().userName||"").trim()}function se(e=E()){return R(e.OTEL_RESOURCE_ATTRIBUTES)["deployment.environment"]||("test"===String(e.TIK_ENV||"").trim().toLowerCase()?"test":function(){if(null!=j)return j;let e=__dirname;for(let r=0;r<6;r++){try{if("fablecut"===JSON.parse(t.readFileSync(n.join(e,"package.json"),"utf8")).name)return j=!0,!0}catch{}const r=n.dirname(e);if(r===e)break;e=r}return j=!1,!1}()?"dev":"prod")}function ie(){const e=String(E().FABLECUT_VERSION||"").trim();if(e)return e;const r=[n.join(__dirname,"..","package.json"),n.join(__dirname,"..","..","package.json"),n.join(__dirname,"..","..","..","package.json")];for(const e of r)try{const r=JSON.parse(t.readFileSync(e,"utf8"));if("@tikagent/video-editor-cli"===r.name&&r.version)return String(r.version)}catch{}return""}function ae(){const t=F();if("string"==typeof t.deviceId&&t.deviceId.startsWith("uid_"))return t.deviceId;const r="uid_"+e.randomBytes(12).toString("hex");return M({deviceId:r}),r}function ce(e){const t=F()[e];return t&&"number"==typeof t.at?Date.now()-t.at>=(t.value||t.version||t.encoders?6048e5:864e5)?{}:t:{}}function de(){const e=E(),t=function(){if(S){try{S.memFreeMb=Math.round(r.freemem()/1048576)}catch{}return S.disk=te(),S}const e=(()=>{try{return r.cpus()||[]}catch{return[]}})();let t="";try{t="function"==typeof r.machine?r.machine():""}catch{t=""}const n=Number(e[0]?.speed);return S={cpuArch:Q(r.arch(),t,process.arch),cpuCores:e.length||"",cpuMhz:n>0?n:"",cpuModel:Y(),memTotalMb:Math.round(r.totalmem()/1048576)||"",memFreeMb:Math.round(r.freemem()/1048576)||"",disk:te(),locale:(()=>{try{return Intl.DateTimeFormat().resolvedOptions().locale||""}catch{return""}})()},S}(),n=C(),o=v.ffmpegVer?v:ce("ffmpeg"),s=v.gpu||ce("gpu").value||"",i=oe();return{"service.name":"tik-video-editor-cli","service.version":ie(),"deployment.environment":se(e),"acs.cms.workspace":n.headers["x-cms-workspace"]||a,"tik.role":h.role||"","tik.device_id":ae(),"enduser.id":i,"user.id":i,"tik.channel":re(),"tik.launcher":ne(),"tik.cpu.arch":t.cpuArch,"tik.cpu.cores":t.cpuCores,"tik.cpu.mhz":t.cpuMhz,"tik.cpu.model":t.cpuModel,"tik.mem.total_mb":t.memTotalMb,"tik.mem.free_mb":t.memFreeMb,"tik.disk":t.disk,"tik.locale":t.locale,"tik.gpu":s,"tik.ffmpeg.version":o.version||o.ffmpegVer||"","tik.ffprobe.version":o.probe||o.ffprobeVer||"","tik.hw.encoders":o.encoders||o.hwEncoders||"","tik.browser.gpu":v.browserGpu||h.browserGpu||"","tik.os":Z(),"tik.os.version":r.release(),"process.runtime.version":process.version,...R(e.OTEL_RESOURCE_ATTRIBUTES)}}function ue(e){e.attributes["tik.launcher"]=ne(),e.attributes["tik.trace.linked"]=e.linked?1:0;const t=oe();t&&(e.attributes["user.id"]=t),h.projectId&&!e.attributes["tik.project.id"]&&(e.attributes["tik.project.id"]=h.projectId),h.role&&(e.attributes["tik.role"]=h.role),h.command&&(e.attributes["tik.command"]=h.command),h.argvSummary&&(e.attributes["tik.argv"]=h.argvSummary)}function le(t,r={}){const n=r.parent||null,o={traceId:n?.traceId||e.randomBytes(16).toString("hex"),spanId:e.randomBytes(8).toString("hex"),parentSpanId:n?.spanId||"",name:String(t||"span").slice(0,120),kind:1,flags:1,startTimeUnixNano:W(),attributes:{...r.attributes||{}},events:[],linked:null!=r.linked?!!r.linked:!(!n||!n.linked),ended:!1};return ue(o),o}function pe(e){const t=e instanceof Error?e:new Error(L(e||"Error"));return{timeUnixNano:W(),name:"exception",attributes:{"exception.type":String(t.name||"Error").slice(0,120),"exception.message":L(t.message||"").slice(0,c),"exception.stacktrace":L(t.stack||"").slice(0,d)}}}function me(e,t={}){if(!e||e.ended)return Promise.resolve(!1);if(e.ended=!0,e.endTimeUnixNano=W(),t.attributes&&Object.assign(e.attributes,t.attributes),t.events&&e.events.push(...t.events),t.error){const r=t.error instanceof Error?t.error:new Error(L(t.error));e.status={code:2,message:L(r.message||"").slice(0,c)},e.events.push(pe(r))}else e.status=t.status||{code:1};return ue(e),P()?((y||(y=o.createTraceExporter({resource:de,scope:()=>({name:"tik-video-editor-cli",version:ie()}),endpoint:()=>C().endpoint,headers:()=>C().headers,fetchImpl:()=>g.fetch||globalThis.fetch,onFailure:e=>be(e)})),y).add(e),Promise.resolve(!0)):Promise.resolve(!1)}function fe(){return k&&!k.ended?{traceId:k.traceId,spanId:k.spanId,linked:k.linked}:null}function ge(){if(k)return h.command&&"cli"===k.name&&(k.name=`cli ${h.command}`.slice(0,120)),ue(k),k;const e=function(){const e=J(E().TRACEPARENT);return e?{traceId:e.traceId,spanId:e.spanId,linked:!0}:null}(),t=!e&&h.projectId?V(h.projectId):null,r=e||t;return k=le(h.command?`cli ${h.command}`:"cli",{parent:r,linked:!!r,attributes:{"tik.trace.linked":r?1:0,...h.projectId?{"tik.project.id":h.projectId}:{}}}),h.projectId&&X(h.projectId,e?{traceId:k.traceId,spanId:k.spanId,linked:!0}:t||{traceId:k.traceId,spanId:k.spanId,linked:!0}),k}function he(e={}){if(!e.name)return Promise.resolve(!1);const t=process.memoryUsage(),r=le(e.name,{parent:fe(),attributes:B({role:h.role,command:h.command,...e.group?{group:e.group}:{},...Number.isFinite(e.value)?{value:e.value}:{},...e.properties})}),n=q({rssMb:Math.round(t.rss/1048576),heapUsedMb:Math.round(t.heapUsed/1048576),...e.snapshots});return n&&(r.attributes["tik.snapshot"]=n),me(r,{status:{code:1}}).then(()=>!0,()=>!1)}function be(r){try{t.mkdirSync(N(),{recursive:!0,mode:448});const o=t.readdirSync(N()).filter(e=>e.endsWith(".json")||e.includes(".sending-")).sort();for(;o.length>=50;)t.rmSync(n.join(N(),o.shift()),{force:!0});const s=n.join(N(),Date.now()+"-"+e.randomBytes(4).toString("hex")+".json");return t.writeFileSync(s,JSON.stringify(r),{mode:384,flag:"wx"}),s}catch{return""}}function ke(e){const t=Number(String(e).split("-")[0]);return Number.isFinite(t)?t:0}function ye(e,r=process.pid,o=Date.now()){const s=n.basename(e),i=/\.sending-\d+$/.test(s);if(!i&&!s.endsWith(".json"))return"";if(i){let r=0;try{r=t.statSync(e).mtimeMs}catch{return""}if(o-r<6e5)return""}const a=s.replace(/\.json$/,"").replace(/\.sending-\d+$/,""),c=n.join(n.dirname(e),a+".sending-"+r);try{return t.renameSync(e,c),c}catch{return""}}async function Se(e,t){const r=C(),n=g.fetch||globalThis.fetch;await o.postExport(r.endpoint,r.headers,e,{fetchImpl:n,signal:t})}function ve(e){return x||(x=async function(e){if(!P())return;let r=[];try{r=t.readdirSync(N()).sort()}catch{return}let o=0;for(const s of r){if(e?.aborted||o>=10)return;const r=n.join(N(),s),i=ke(s);if(!i||Date.now()-i>6048e5){t.rmSync(r,{force:!0});continue}const a=ye(r);if(!a)continue;let c;try{c=JSON.parse(t.readFileSync(a,"utf8"))}catch{t.rmSync(a,{force:!0});continue}try{await Se(c,e),t.rmSync(a,{force:!0}),o+=1}catch{const e=a.replace(/\.sending-\d+$/,".json");try{e!==a&&t.renameSync(a,e)}catch{}return}}}(e)),x}function Ie(e,t){if(!e||e.done)return null;const r=p[e.state];if(!r)return null;const n=e.lastProgressAt??e.startedAt??t,o=Math.max(0,t-n);if(o<r)return null;const s="rendering"===e.state?o>=12e4:o>=2*r;return{state:e.state,idleMs:o,severe:s,threshold:r}}function je(e,t=64){const r=L(e).replace(/\s+/g," ").trim();return!r||r.length>t||/[{}[\]"]/.test(r)?"":r}function xe(e,t={}){if(!e||!t||"object"!=typeof t)return;e.settings||={};for(const r of["decode","profile","preset","range","bitrateMode","codec"]){if(void 0===t[r])continue;const n=je(t[r]);n&&(e.settings[r]=n)}if(void 0!==t.bitrate){const r=Number(t.bitrate);Number.isSafeInteger(r)&&r>=1&&r<=2e8&&(e.settings.bitrate=r)}if(void 0!==t.outputs){const r=Number(t.outputs);Number.isSafeInteger(r)&&r>=1&&r<=64&&(e.settings.outputs=r)}const r=t.delivery;if(r&&"object"==typeof r){"boolean"==typeof r.ok&&(e.settings.deliveryOk=r.ok?1:0);const t=Number(r.failed);Number.isSafeInteger(t)&&t>=0&&t<=1e3&&(e.settings.deliveryFailed=t);const n=Number(r.outputs);Number.isSafeInteger(n)&&n>=1&&n<=64&&(e.settings.outputs=n)}}function we(e){const t=e?.settings||{},r={};return t.decode&&(r["tik.export.decode"]=t.decode),t.profile&&(r["tik.export.profile"]=t.profile),t.preset&&(r["tik.export.preset"]=t.preset),t.range&&(r["tik.export.range"]=t.range),t.bitrateMode&&(r["tik.export.bitrate_mode"]=t.bitrateMode),t.codec&&(r["tik.export.codec"]=t.codec),Number.isSafeInteger(t.bitrate)&&(r["tik.export.bitrate"]=t.bitrate),Number.isSafeInteger(t.outputs)&&(r["tik.export.outputs"]=t.outputs),0!==t.deliveryOk&&1!==t.deliveryOk||(r["tik.export.delivery_ok"]=t.deliveryOk),Number.isSafeInteger(t.deliveryFailed)&&(r["tik.export.delivery_failed"]=t.deliveryFailed),r}function Ee(e,t){if(!e||!t||"object"!=typeof t)return;const r=je(t.clipId,80),n=je(t.reason,180);(r||n)&&(e.decodeFallbacks||=[],e.decodeFallbacks.length>=8||e.decodeFallbacks.some(e=>e.clipId===r&&e.reason===n)||e.decodeFallbacks.push({clipId:r,reason:n}))}function Te(e,t){if(!e||e.done)return!1;if(e.wait&&e.wait.reason)return!0;const r=e.lastProgressAt??e.startedAt??t,n=Math.max(0,t-r);return"rendering"===e.state?n>=1e4:n>=15e3&&Object.prototype.hasOwnProperty.call(p,e.state)}function _e(e){y&&y.stop(),g={...e},h={},b=!1,k=null,y=null,S=null,v={},I="",j=null,x=null,w=!1}module.exports={EXPORT_WAIT_REASONS:["source-block","video-seek","source-image","frame-assets","audio-mix","encoder"],DEFAULT_ENDPOINT:s,DEFAULT_HEADERS:i,initTelemetry:function(e={}){if(h={...h,...e},Array.isArray(h.argv)){h.rawArgv=h.argv.slice();const e=$(h.argv);!h.command&&e.command&&(h.command=e.command),!h.projectId&&e.projectId&&(h.projectId=K(e.projectId)),h.argvSummary=U(h.argv),delete h.argv}return!!P()&&(b||(b=!0,ae(),oe(),function(){if(w||"cli"!==h.role||"managed"===re())return;if(F().noticeShown)return void(w=!0);w=!0;const e=g.stderr||process.stderr;try{e.write('tik-video-editor-cli 会向阿里云 ARMS 上报命令名、导出摘要和机器信息,不含参数值与工程内容。关闭:设置 OTEL_SDK_DISABLED=true,或在 ~/.tik-video-editor-cli/telemetry.json 写入 {"enabled":false}。\n')}catch{}M({noticeShown:!0})}(),"server"===h.role&&ve()),"cli"===h.role&&h.command&&!D()&&ge(),!0)},isTelemetryEnabled:P,rememberUser:function(e){const t=String(e??"").trim().slice(0,80);t&&!/sk-|api[_-]?key|token/i.test(t)&&M({userName:t})},noteBrowserGpu:function(e){const t=L(e).trim().slice(0,180);t&&(v.browserGpu=t,h.browserGpu=t)},reportError:function(e,t,r,n){const o=t instanceof Error?t:new Error(L(t||e)),s=process.memoryUsage(),i=le(String(e||o.name||"Error"),{parent:fe(),attributes:B({role:h.role,command:h.command,...r})}),a=q({rssMb:Math.round(s.rss/1048576),heapUsedMb:Math.round(s.heapUsed/1048576),...n});return a&&(i.attributes["tik.snapshot"]=a),me(i,{error:o})},reportCustom:he,reportFatalSync:function(e,t,r,n){if(!P())return!1;const s=t instanceof Error?t:new Error(L(t||e)),i=le(String(e||"Error"),{parent:fe(),attributes:B({role:h.role,command:h.command,...r})});i.ended=!0,i.endTimeUnixNano=W(),i.status={code:2,message:L(s.message||"").slice(0,c)},i.events.push(pe(s));const a=q(n);return a&&(i.attributes["tik.snapshot"]=a),ue(i),be(o.encodeExport(de(),[i],{name:"tik-video-editor-cli",version:ie()})),!0},flushTelemetry:async function(e=500){if(!P())return!1;const t=new AbortController;let r;const n=new Promise(n=>{r=setTimeout(()=>{t.abort(),n("timeout")},Math.max(0,e)),r.unref?.()}),o=(async()=>(y&&await y.flush(t.signal),await ve(t.signal),"done"))();return await Promise.race([o,n]),clearTimeout(r),y&&y.salvage(),!0},finishCommand:function(e){if(!P())return Promise.resolve(!1);const t=e?Number.isInteger(e.exitCode)?e.exitCode:1:Number(process.exitCode)||0;if(!e&&!t&&D())return k&&(k.ended=!0),Promise.resolve(!1);if(ge(),!k||k.ended)return Promise.resolve(!1);if(e||t){const r=e instanceof Error?e:new Error(t?"exit "+t:"command failed");return me(k,{error:r,attributes:{"tik.exit.code":t||1}})}return me(k,{status:{code:1},attributes:{"tik.exit.code":0}})},startSpan:le,endSpan:me,currentParent:fe,bindProjectTrace:function(e){const t=K(e);if(!t)return null;if(h.projectId=t,!P())return null;if(ge(),!k)return null;k.attributes["tik.project.id"]=t;const r=V(t);if(r&&r.traceId===k.traceId)return X(t,r),r;const n={traceId:k.traceId,spanId:k.spanId,linked:!0};return X(t,n),n},resolveProjectTrace:V,isQuietSuccessCommand:D,traceparent:function(){return k?`00-${k.traceId}-${k.spanId}-01`:""},createExportMonitor:function(e={}){if(!e.report&&!P())return{stop(){},upsert(){},note(){},cancel:()=>!1,fail(){},complete(){},scan(){}};const t=new Map,r=e.now||Date.now;function n(t,r){try{if(e.report)return void e.report(r.error?"exception":"custom",{name:t.name,status:r.error?2:r.status?.code??1,attributes:t.attributes,events:t.events,error:r.error,properties:t.attributes});me(t,r)}catch{}}function o(e,t={}){for(const r of m)void 0!==t[r]&&(e[r]=t[r])}function s(t,r){!e.report&&l.has(r)&&(t.stageSpan=le(`export.${r}`,{parent:{traceId:t.span.traceId,spanId:t.span.spanId,linked:t.span.linked},linked:t.span.linked,attributes:{"tik.export.id":t.id,"tik.export.engine":t.engine||"","tik.export.stage":r,...t.projectId?{"tik.project.id":t.projectId}:{}}}))}function i(e,t={}){if(!e?.stageSpan)return;const r=e.stageSpan;e.stageSpan=null,me(r,{status:t.error?void 0:{code:1},error:t.error,attributes:{"tik.export.id":e.id,"tik.export.engine":e.engine||"","tik.export.frames":e.frames||0,...e.totalFrames?{"tik.export.total_frames":e.totalFrames}:{}}})}function a(e,n){let o=t.get(e);if(!o){const i=K(n.projectId),a=J(n.traceparent),c=a?{traceId:a.traceId,spanId:a.spanId,linked:!0}:i?V(i):null,d=n.state||"queued";o={id:e,projectId:i,engine:n.engine||"",state:d,startedAt:n.startedAt??r(),lastProgressAt:n.startedAt??r(),frames:0,reported:new Set,stalled:!1,maxStallMs:0,done:!1,stageSpan:null,span:le("export",{parent:c,linked:!!c,attributes:{"tik.export.id":e,"tik.export.engine":n.engine||"",...i?{"tik.project.id":i}:{}}})},s(o,d),t.set(e,o)}return n.projectId&&!o.projectId&&(o.projectId=K(n.projectId),o.projectId&&(o.span.attributes["tik.project.id"]=o.projectId)),n.traceparent&&function(e,t){const r=J(t);r&&!e.span.parentSpanId&&(e.span.traceId=r.traceId,e.span.parentSpanId=r.spanId,e.span.linked=!0,e.span.attributes["tik.trace.linked"]=1,e.stageSpan&&(e.stageSpan.traceId=r.traceId,e.stageSpan.linked=!0,e.stageSpan.attributes["tik.trace.linked"]=1))}(o,n.traceparent),o}function c(e){return q({project:e.project,wait:e.wait,stats:e.stats,stderr:e.stderr,activity:e.activity,detail:e.detail,browser:e.browser,browserGpu:e.browserGpu,stack:e.stack,clipIds:e.clipIds,metrics:e.metrics,timeSec:e.timeSec,decodeFallbacks:e.decodeFallbacks})}function d(t){try{const r=e.enrich?.(t.id,t);r&&"object"==typeof r&&o(t,r)}catch{}}function u(e,r){if(!e||e.done)return;i(e,r);const o=c(e);o&&(e.span.attributes["tik.snapshot"]=o),Object.assign(e.span.attributes,{"tik.export.id":e.id,"tik.export.engine":e.engine||"","tik.export.frames":e.frames||0,"tik.export.total_frames":e.totalFrames||0,"tik.export.state":e.state||"",...e.projectId?{"tik.project.id":e.projectId}:{},...we(e),...r.attributes||{}}),e.done=!0,n(e.span,r),t.delete(e.id)}function p(){const o=r();for(const r of t.values()){if(r.done)continue;d(r);const t=Ie(r,o);if(!t)continue;r.maxStallMs=Math.max(r.maxStallMs,t.idleMs);const s=t.severe?"severe":"warn";if(r.reported.has(s))continue;r.reported.add(s),r.stalled=!0;const i={stage:r.state||"",stallMs:t.idleMs,frames:r.frames||0,totalFrames:r.totalFrames||0,waitReason:r.wait?.reason||"",engine:r.engine||"",severe:t.severe?1:0,"tik.export.id":r.id};if(r.span.events.push({timeUnixNano:W(),name:"export_stall",attributes:i}),e.report&&e.report("custom",{name:"export_stall",properties:i,severe:i.severe}),!t.severe)continue;const a=le("ExportStalled",{parent:{traceId:r.span.traceId,spanId:r.span.spanId,linked:r.span.linked},linked:r.span.linked,attributes:i}),u=c(r);u&&(a.attributes["tik.snapshot"]=u),n(a,{error:new Error(`导出在 ${r.state} 停滞 ${Math.round(t.idleMs/1e3)} 秒`)})}}const f=setInterval(p,e.interval||5e3);return f.unref?.(),{stop(){clearInterval(f)},upsert:function(t,n={}){if(!t)return null;const c=r(),d=a(t,n);n.engine&&(d.engine=n.engine);const u=n.state||d.state,l=u!==d.state,p=Number.isFinite(n.frames)&&n.frames>(d.frames||0),m="string"==typeof n.detail&&n.detail&&n.detail!==d.detail;if(l||p||m){const t=c-d.lastProgressAt;d.stalled&&(d.maxStallMs=Math.max(d.maxStallMs,t),d.span.events.push({timeUnixNano:W(),name:"export_stall_recovered",attributes:{stage:d.state,maxStallMs:d.maxStallMs,engine:d.engine||""}}),e.report&&e.report("custom",{name:"export_stall_recovered",properties:{stage:d.state,maxStallMs:d.maxStallMs}}),d.stalled=!1,d.reported.clear()),d.lastProgressAt=c}return p&&(d.frames=n.frames),Number.isFinite(n.totalFrames)&&(d.totalFrames=n.totalFrames),l&&(i(d),d.state=u,s(d,u)),o(d,n),xe(d,n),Ee(d,n.decodeFallback),d},note:function(e,r={}){const n=t.get(e);n&&(o(n,r),xe(n,r),Ee(n,r.decodeFallback))},scan:p,cancel:function(e){const n=t.get(e);if(!n||n.done)return!1;d(n);const o=Te(n,r()),s=Math.max(0,r()-n.lastProgressAt);return o?(u(n,{error:new Error(`导出在 ${n.state} 等待 ${Math.round(s/1e3)} 秒后被取消`),attributes:{"tik.export.outcome":"cancelled-stalled",stallMs:s,waitReason:n.wait?.reason||""}}),!0):(u(n,{status:{code:1},attributes:{"tik.export.outcome":"cancelled",stallMs:s}}),!1)},fail:function(e,r,n={}){const s=t.get(e)||a(e,{state:n.stage||"starting"});s&&!s.done&&(o(s,n),xe(s,n),Ee(s,n.decodeFallback),d(s),u(s,{error:r instanceof Error?r:new Error(String(r||"export failed")),attributes:{"tik.export.outcome":"failed",stage:n.stage||s.state||"",origin:n.origin||"server"}}))},complete:function(e,r={}){const n=t.get(e)||a(e,{});if(!n||n.done)return;o(n,r),xe(n,r),r.metrics&&"object"==typeof r.metrics&&xe(n,r.metrics),Ee(n,r.decodeFallback),Number.isFinite(r.frames)&&(n.frames=r.frames),Number.isFinite(r.totalFrames)&&(n.totalFrames=r.totalFrames);const s=r.metrics||n.metrics,i=n.decodeFallbacks;u(n,{status:{code:1},attributes:{"tik.export.outcome":"complete",...Number.isFinite(Number(s?.totalMs))?{"tik.export.elapsed_ms":Number(s.totalMs)}:{}}});const c=s?.fallbacks||s?.cache?.fallbacks;c&&"object"==typeof c&&Object.keys(c).length&&he({name:"export_cache_fallback",type:"export",properties:{engine:n.engine||"",count:Object.keys(c).length},snapshots:{fallbacks:c}}),i?.length&&he({name:"export_decode_fallback",type:"export",properties:{engine:n.engine||"",count:i.length},snapshots:{decodeFallbacks:i}})}}},summarizeExportProject:function(e,t={}){const r=Array.isArray(e?.clips)?e.clips:[],n=Array.isArray(e?.media)?e.media:[],o={};let s=0,i=0,a=0,c=0,d=0;for(const e of r){const t=e?.kind||"unknown";o[t]=(o[t]||0)+1;const r=e?.props||{};r.bgRemove&&(s+=1),r.chromaKey&&(i+=1),(r.filterPreset&&"none"!==r.filterPreset||r.shake||r.rgbSplit||r.grain)&&(a+=1),(Number(r.speed)&&1!==Number(r.speed)||e?.keyframes?.speed)&&(c+=1),(e?.transitionIn||e?.transitionOut)&&(d+=1)}const u=r.reduce((e,t)=>Math.max(e,(Number(t?.start)||0)+(Number(t?.duration)||0)),0),l=Number(e?.fps)||0;return{width:e?.width,height:e?.height,fps:l,revision:e?.revision,durationSec:Math.round(1e3*u)/1e3,totalFrames:l>0&&u>0?Math.max(1,Math.round(u*l)):void 0,clips:r.length,kinds:o,tracks:Array.isArray(e?.tracks)?e.tracks.length:void 0,bgRemove:s,chroma:i,effects:a,speed:c,transitions:d,media:n.length,...Number.isFinite(t.mediaBytes)?{mediaBytes:t.mediaBytes}:{}}},resolveTelemetryConfig:C,parseTraceparent:J,summarizeArgv:U,sanitizeTelemetryText:L,clipTelemetryProperties:B,evaluateExportHealth:Ie,isExportCancelStalled:Te,formatCpuArch:Q,formatDiskSegment:ee,parseFfmpegVersionLine:function(e){return(String(e||"").split(/\r?\n/).find(Boolean)||"").replace(/\s+Copyright\b[\s\S]*$/i,"").trim().slice(0,160)},parseHardwareEncoders:function(e){const t=["h264_nvenc","h264_qsv","h264_amf","h264_videotoolbox"].filter(t=>new RegExp("\\b"+t+"\\b").test(String(e||"")));return t.length?t.map(e=>e.replace(/^h264_/,"")).join(","):"none"},tryClaimQueueFile:ye,setTelemetryDeps:_e,resetTelemetryForTests:function(){_e({})}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";let exportDecodeState=null,exportDecodedFrames=new Map;function exportDecodeBegin(e,t="auto"){exportDecodeEnd(),"video"!==t&&"cache"!==t&&(exportDecodeState={signal:e,sources:new Map})}function exportDecodeEnd(){if(exportDecodeState)for(const e of exportDecodeState.sources.values())e?.close();exportDecodeState=null,exportDecodedFrames.clear()}async function decodeExportVideo(e,t){const r=exportDecodeState;if(!r||evalProps(e,t).bgRemove)return!1;for(const[e,o]of r.sources){const a=project.clips.find(t=>t.id===e);(!a||a.start+a.duration<=t)&&(o?.close(),r.sources.delete(e),exportDecodedFrames.delete(e))}if(!r.sources.has(e.id)){const t=getMedia(e.mediaId)?.src,o=t?await FableCutExportDecode.ExportFrameSource.open(t,r.signal):null;if(r.signal.aborted)throw o?.close(),new Error("cancelled");r.sources.set(e.id,o)}const o=r.sources.get(e.id);if(!o)return!1;try{const r=await o.frameAt(mediaTimeAt(e,t));if(!r)throw new Error("empty decoded frame");return exportDecodedFrames.set(e.id,r),!0}catch(t){if(o.close(),r.sources.set(e.id,null),exportDecodedFrames.delete(e.id),r.signal.aborted)throw t;return console.warn("视频解码回退到浏览器寻址:",t.message),!1}}function exportWindow(e={}){const t=e.fps||project.fps;let r=0,o=projDur();if("in-out"===e.range){const e=playRange();r=Math.min(o,Math.max(0,e.start)),o=Math.min(o,Math.max(r,e.end))}const a=Math.max("in-out"===e.range?0:1,Math.round((o-r)*t));if(!a)throw new Error("export range is empty");return{fps:t,start:r,frames:a,dur:a/t}}async function renderExportAudio(e,t,r){const o=await renderAudioMix(e+t,r);if(!o||!e)return o;const a=await o.arrayBuffer(),s=new DataView(a),n=s.getUint32(24,!0),i=s.getUint16(32,!0),c=Math.round(e*n)*i,p=Math.min(Math.round(t*n)*i,a.byteLength-44-c),d=new Uint8Array(44+Math.max(0,p));d.set(new Uint8Array(a,0,44)),d.set(new Uint8Array(a,44+c,Math.max(0,p)),44);const u=new DataView(d.buffer);return u.setUint32(4,d.length-8,!0),u.setUint32(40,Math.max(0,p),!0),new Blob([d],{type:"audio/wav"})}function exportBeginOptions(e,t,r,o="fast"){return{...t,totalFrames:t.frames,width:project.width,height:project.height,mode:"webcodecs"===o?"annexb":"jpeg",engine:o,name:e.name||project.name||"export",requestId:e.requestId,group:e.group||0,profile:e.profile,deliveries:e.deliveries?.length?e.deliveries:void 0,hasAudio:!!r}}class BatchFrameUploader{constructor(e){this.parts=[],this.bytes=0,this.frames=0,this.queue=new OrderedFrameQueue(t=>e(t.body,t.frames))}async push(e,t=1){this.parts.length&&this.bytes+e.size>33554432&&await this.flush(),this.parts.push(e),this.bytes+=e.size,this.frames+=t,(this.parts.length>=8||this.bytes>=524288)&&await this.flush()}async flush(){if(!this.parts.length)return;const e={body:new Blob(this.parts),size:this.bytes,frames:this.frames};this.parts=[],this.bytes=0,this.frames=0,await this.queue.push(e)}async finish(){await this.flush(),await this.queue.finish()}cancel(){this.parts=[],this.bytes=0,this.frames=0,this.queue.cancel()}get peakBytes(){return this.queue.peakBytes}}function createExportPipeline(e,t,r,o=()=>{}){const a=new BatchFrameUploader(r),s=createSnapshotEncoder(t,e.jpegQuality??.95),n=Math.max(1,Math.min(2,Math.floor(67108864/(project.width*project.height*4)))),i=new SnapshotPipeline(async t=>{const r=performance.now();if("rgba"===e.input){const e=t.getContext("2d").getImageData(0,0,t.width,t.height).data;return o("snapshot",performance.now()-r),{result:Promise.resolve(new Blob([e]))}}const a=await s.capture(t);return o("snapshot",performance.now()-r),a.result=a.result.then(e=>(o("jpeg",performance.now()-r),e)),a},async e=>{if(!e?.size)throw new Error("Canvas returned an empty frame");const t=performance.now();await a.push(e),o("queueWait",performance.now()-t)},n);return{queue:a,pipeline:i,encoder:s,depth:n}}function waitExportTask(e,t,r,o){return new Promise((a,s)=>{let n=!1;const i=(e,r)=>{n||(n=!0,clearTimeout(p),t.removeEventListener("abort",c),e?s(e):a(r))},c=()=>i(new Error("cancelled")),p=setTimeout(()=>i(new Error(o+" timed out")),r);t.addEventListener("abort",c,{once:!0}),t.aborted&&c(),Promise.resolve(e).then(e=>i(null,e),e=>i(e))})}async function runExportPlan(e,t,r){try{if(!new URLSearchParams(location.search).has("exportJob"))return("webcodecs"===r?webCodecsExport:"optimized"===r?optimizedExport:fastExport)({requestId:e,name:t});const o=await fetch(projectApi("/api/export/options"));if(!o.ok)throw new Error("could not load export settings");const a=await o.json(),s=a.groups||[{}];for(const[o,n]of s.entries()){const s={...a,...n,requestId:e,name:t,group:o};"webcodecs"===r?await webCodecsExport(s):await("optimized"===r?optimizedExport:fastExport)(s);const i=await fetch(projectApi("/api/export/status")+"&id="+e).then(e=>e.json());if(["error","cancelled"].includes(i.state))break}}catch(t){await fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e,error:t.message}),signal:AbortSignal.timeout(15e3)}).catch(()=>{})}}
|
|
1
|
+
"use strict";let exportDecodeState=null,exportDecodedFrames=new Map;function exportDecodeBegin(e,t="auto",r){exportDecodeEnd(),"video"!==t&&"cache"!==t&&(exportDecodeState={signal:e,requestId:r,sources:new Map})}function exportDecodeEnd(){if(exportDecodeState)for(const e of exportDecodeState.sources.values())e?.close();exportDecodeState=null,exportDecodedFrames.clear()}async function decodeExportVideo(e,t){const r=exportDecodeState;if(!r||evalProps(e,t).bgRemove)return!1;for(const[e,o]of r.sources){const a=project.clips.find(t=>t.id===e);(!a||a.start+a.duration<=t)&&(o?.close(),r.sources.delete(e),exportDecodedFrames.delete(e))}if(!r.sources.has(e.id)){const t=getMedia(e.mediaId)?.src,o=t?await FableCutExportDecode.ExportFrameSource.open(t,r.signal):null;if(r.signal.aborted)throw o?.close(),new Error("cancelled");r.sources.set(e.id,o)}const o=r.sources.get(e.id);if(!o)return!1;try{const r=await o.frameAt(mediaTimeAt(e,t));if(!r)throw new Error("empty decoded frame");return exportDecodedFrames.set(e.id,r),!0}catch(t){if(o.close(),r.sources.set(e.id,null),exportDecodedFrames.delete(e.id),r.signal.aborted)throw t;return console.warn("视频解码回退到浏览器寻址:",t.message),r.requestId&&"function"==typeof reportExportDiagnostic&&reportExportDiagnostic(r.requestId,{decodeFallback:{clipId:e.id,reason:String(t?.message||"decode fallback").slice(0,180)}}),!1}}function exportWindow(e={}){const t=e.fps||project.fps;let r=0,o=projDur();if("in-out"===e.range){const e=playRange();r=Math.min(o,Math.max(0,e.start)),o=Math.min(o,Math.max(r,e.end))}const a=Math.max("in-out"===e.range?0:1,Math.round((o-r)*t));if(!a)throw new Error("export range is empty");return{fps:t,start:r,frames:a,dur:a/t}}async function renderExportAudio(e,t,r){const o=await renderAudioMix(e+t,r);if(!o||!e)return o;const a=await o.arrayBuffer(),s=new DataView(a),n=s.getUint32(24,!0),i=s.getUint16(32,!0),c=Math.round(e*n)*i,p=Math.min(Math.round(t*n)*i,a.byteLength-44-c),d=new Uint8Array(44+Math.max(0,p));d.set(new Uint8Array(a,0,44)),d.set(new Uint8Array(a,44+c,Math.max(0,p)),44);const u=new DataView(d.buffer);return u.setUint32(4,d.length-8,!0),u.setUint32(40,Math.max(0,p),!0),new Blob([d],{type:"audio/wav"})}function exportBeginOptions(e,t,r,o="fast"){return{...t,totalFrames:t.frames,width:project.width,height:project.height,mode:"webcodecs"===o?"annexb":"jpeg",engine:o,name:e.name||project.name||"export",requestId:e.requestId,group:e.group||0,profile:e.profile,deliveries:e.deliveries?.length?e.deliveries:void 0,hasAudio:!!r}}class BatchFrameUploader{constructor(e){this.parts=[],this.bytes=0,this.frames=0,this.queue=new OrderedFrameQueue(t=>e(t.body,t.frames))}async push(e,t=1){this.parts.length&&this.bytes+e.size>33554432&&await this.flush(),this.parts.push(e),this.bytes+=e.size,this.frames+=t,(this.parts.length>=8||this.bytes>=524288)&&await this.flush()}async flush(){if(!this.parts.length)return;const e={body:new Blob(this.parts),size:this.bytes,frames:this.frames};this.parts=[],this.bytes=0,this.frames=0,await this.queue.push(e)}async finish(){await this.flush(),await this.queue.finish()}cancel(){this.parts=[],this.bytes=0,this.frames=0,this.queue.cancel()}get peakBytes(){return this.queue.peakBytes}}function createExportPipeline(e,t,r,o=()=>{}){const a=new BatchFrameUploader(r),s=createSnapshotEncoder(t,e.jpegQuality??.95),n=Math.max(1,Math.min(2,Math.floor(67108864/(project.width*project.height*4)))),i=new SnapshotPipeline(async t=>{const r=performance.now();if("rgba"===e.input){const e=t.getContext("2d").getImageData(0,0,t.width,t.height).data;return o("snapshot",performance.now()-r),{result:Promise.resolve(new Blob([e]))}}const a=await s.capture(t);return o("snapshot",performance.now()-r),a.result=a.result.then(e=>(o("jpeg",performance.now()-r),e)),a},async e=>{if(!e?.size)throw new Error("Canvas returned an empty frame");const t=performance.now();await a.push(e),o("queueWait",performance.now()-t)},n);return{queue:a,pipeline:i,encoder:s,depth:n}}function waitExportTask(e,t,r,o){return new Promise((a,s)=>{let n=!1;const i=(e,r)=>{n||(n=!0,clearTimeout(p),t.removeEventListener("abort",c),e?s(e):a(r))},c=()=>i(new Error("cancelled")),p=setTimeout(()=>i(new Error(o+" timed out")),r);t.addEventListener("abort",c,{once:!0}),t.aborted&&c(),Promise.resolve(e).then(e=>i(null,e),e=>i(e))})}async function runExportPlan(e,t,r){try{if(!new URLSearchParams(location.search).has("exportJob"))return("webcodecs"===r?webCodecsExport:"optimized"===r?optimizedExport:fastExport)({requestId:e,name:t});const o=await fetch(projectApi("/api/export/options"));if(!o.ok)throw new Error("could not load export settings");const a=await o.json(),s=a.groups||[{}];for(const[o,n]of s.entries()){const s={...a,...n,requestId:e,name:t,group:o};"webcodecs"===r?await webCodecsExport(s):await("optimized"===r?optimizedExport:fastExport)(s);const i=await fetch(projectApi("/api/export/status")+"&id="+e).then(e=>e.json());if(["error","cancelled"].includes(i.state))break}}catch(t){await fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e,error:t.message}),signal:AbortSignal.timeout(15e3)}).catch(()=>{})}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";class OrderedFrameQueue{constructor(e,t=4,a=33554432){this.write=e,this.maxFrames=t,this.maxBytes=a,this.pending=[],this.bytes=0,this.peakBytes=0,this.error=null}async push(e){for(;this.pending.length&&(this.pending.length>=this.maxFrames||this.bytes+e.size>this.maxBytes);)await this.pending[0];if(this.error)throw this.error;this.bytes+=e.size,this.peakBytes=Math.max(this.peakBytes,this.bytes);const t=(this.pending.at(-1)||Promise.resolve()).then(()=>{if(this.error)throw this.error;return this.write(e)}).catch(e=>{this.error=e}).finally(()=>{this.bytes-=e.size,this.pending.shift()});this.pending.push(t)}async finish(){if(await Promise.all(this.pending),this.error)throw this.error}cancel(){this.error=this.error||new Error("cancelled")}}function cachedFrameIndex(e,t){let a=0,s=e.length;for(;a<s;){const i=a+s>>>1;e[i]<=t+1e-5?a=i+1:s=i}return a-1}function sourceBlockPlan(e,t){const a=[];for(const s of e){const e=Math.max(.1,Math.min(8,Number(s.props?.speed)||1)),i=s.start+s.duration;let r=Math.max(0,Math.ceil(s.start*t-1e-7));for(;r/t<i;){const i=r/t,o=s.in+(i-s.start)*e,n=Math.floor(o/5);a.push({clip:s,time:o,block:n,neededAt:i}),r=Math.max(r+1,Math.ceil((s.start+(5*(n+1)-s.in)/e)*t-1e-7))}}return a.sort((e,t)=>e.neededAt-t.neededAt)}function sourceReadAhead(e,t,a){return sourceBlockPlan(e,a).filter(e=>e.neededAt>t).slice(0,3)}class SourceReadAhead{constructor(e,t,{concurrency:a=3,syncPlan:s=async()=>{},key:i=e=>e}={}){this.load=e,this.requested=t,this.concurrency=a,this.syncPlan=s,this.key=i,this.plan=[],this.active=new Map,this.stopped=!1,this.sequence=0,this.readySequence=0,this.syncing=Promise.resolve(),this.signature=""}update(e,t=[]){if(this.stopped)return;const a=JSON.stringify([e.map(this.key),t]);if(a===this.signature)return;this.signature=a,this.plan=e;const s=++this.sequence;this.syncing=this.syncing.catch(()=>{}).then(()=>this.syncPlan(e,t,s)).then(()=>{s===this.sequence&&(this.readySequence=s,this.pump())}).catch(()=>{})}pump(){if(!this.stopped&&this.readySequence===this.sequence)for(const e of this.plan){if(this.active.size>=this.concurrency)break;const t=this.key(e);if(this.active.has(t)||this.requested(e))continue;const a=this.sequence,s=Promise.resolve().then(()=>this.load(e,a)).catch(()=>{}).finally(()=>{this.active.delete(t),this.pump()});this.active.set(t,s)}}async stop(){this.stopped=!0,this.plan=[],await this.syncing,await Promise.allSettled(this.active.values())}}class ExportWaitTracker{constructor(e,{now:t=()=>performance.now(),interval:a=500,threshold:s=250}={}){this.report=e,this.now=t,this.threshold=s,this.active=new Set,this.sequence=0,this.last=null,this.timer=setInterval(()=>this.flush(),a)}async track(e,t){const a={reason:e,started:this.now()};this.active.add(a);try{return await t()}finally{this.active.delete(a)}}flush(){const e=[...this.active].filter(e=>this.now()-e.started>=this.threshold).sort((e,t)=>["source-block","video-seek","source-image","frame-assets","audio-mix","encoder"].indexOf(e.reason)-["source-block","video-seek","source-image","frame-assets","audio-mix","encoder"].indexOf(t.reason)||e.started-t.started)[0];(e||null)!==this.last&&(this.last=e||null,Promise.resolve(this.report({sequence:++this.sequence,reason:e?.reason||null,elapsedMs:e?Math.max(0,this.now()-e.started):0})).catch(()=>{this.last===(e||null)&&(this.last=void 0)}))}stop(){clearInterval(this.timer),this.active.clear(),this.flush()}}class FrameReadAhead{constructor(e,t=2){this.load=e,this.concurrency=t,this.plan=[],this.active=new Map,this.stopped=!1}update(e){this.stopped||(this.plan=e,this.pump())}pump(){for(;!this.stopped&&this.active.size<this.concurrency&&this.plan.length;){const e=this.plan.shift();if(this.active.has(e.key))continue;const t=Promise.resolve().then(()=>this.load(e)).catch(()=>{}).finally(()=>{this.active.delete(e.key),this.pump()});this.active.set(e.key,t)}}async stop(){this.stopped=!0,this.plan=[],await Promise.all(this.active.values())}}class SnapshotPipeline{constructor(e,t,a=2){this.capture=e,this.write=t,this.depth=a,this.pending=[]}async push(e){for(;this.pending.length>=this.depth;)await this.drain();const t=await this.capture(e);t.result.catch(()=>{}),this.pending.push(t)}async drain(){const e=this.pending.shift();e&&await this.write(await e.result)}async finish(){for(;this.pending.length;)await this.drain()}async settle(){await Promise.allSettled(this.pending.splice(0).map(e=>e.result))}}function createSnapshotEncoder(e,t=.95){let a,s=0;const i=new Map,r=()=>{a?.terminate(),a=null;for(const{reject:e}of i.values())e(new Error("snapshot encoder stopped"));i.clear(),e.removeEventListener("abort",r)};if("function"==typeof Worker&&"function"==typeof OffscreenCanvas&&"function"==typeof createImageBitmap)try{a=new Worker("optimized-encoder-worker.js"),a.onmessage=({data:e})=>{const t=i.get(e.id);t&&(i.delete(e.id),e.error?t.reject(new Error(e.error)):t.resolve(e.blob))},a.onerror=e=>{e.preventDefault(),r()},e.addEventListener("abort",r,{once:!0})}catch{r()}return{close:r,async capture(o){if(e.aborted)throw new Error("cancelled");if(!a)return{result:Promise.resolve(await new Promise(e=>o.toBlob(e,"image/jpeg",t)))};const n=await createImageBitmap(o);if(e.aborted)throw n.close(),new Error("cancelled");const c=s++,d=(async()=>{const s=await createImageBitmap(n);return new Promise((r,o)=>{if(e.aborted||!a)return s.close(),void o(new Error("snapshot encoder stopped"));i.set(c,{resolve:r,reject:o});try{a.postMessage({id:c,bitmap:s,quality:t},[s])}catch(e){s.close(),i.delete(c),o(e)}})})().catch(async a=>{if(e.aborted)throw a;r();const s=document.createElement("canvas");s.width=n.width,s.height=n.height;try{return s.getContext("2d").drawImage(n,0,0),await new Promise(e=>s.toBlob(e,"image/jpeg",t))}finally{s.width=s.height=0}}).finally(()=>n.close());return d.catch(()=>{}),{result:d}}}}let optimizedSources=null,optimizedAbort=null,optimizedMaskCanvas=null;function optimizedMaskSource(e){return optimizedMaskCanvas||(optimizedMaskCanvas=document.createElement("canvas")),optimizedMaskCanvas.width!==e.width&&(optimizedMaskCanvas.width=e.width),optimizedMaskCanvas.height!==e.height&&(optimizedMaskCanvas.height=e.height),optimizedMaskCanvas.getContext("2d").drawImage(e,0,0),optimizedMaskCanvas}async function optimizedExport(e={}){if(state.exporting)return;pause(),state.exporting=!0,state.rendering=!0,renderCancelled=!1;const t=performance.now(),a=new AbortController;optimizedAbort=a;const s={engine:"optimized",frames:0,phases:{},samples:{},peakDecodedBytes:0,peakQueueBytes:0},i=(e,t)=>{const a=s.samples[e]||(s.samples[e]={count:0,totalMs:0,maxMs:0,histogram:Array(24).fill(0)});a.count++,a.totalMs+=t,a.maxMs=Math.max(a.maxMs,t),a.histogram[Math.min(23,Math.max(0,Math.ceil(Math.log2(Math.max(1,t)))))]++};let r,o=!1,n=!1;const c=()=>{if(r)throw r;if(renderCancelled||a.signal.aborted)throw new Error("cancelled")},d=async(e,t,s)=>{c();const i=await fetch(e,{method:s||(void 0===t?"GET":"POST"),body:void 0===t?void 0:t instanceof Blob?t:JSON.stringify(t),signal:a.signal}),r=await i.json();if(!i.ok||r.error)throw Object.assign(new Error(r.error||"Export request failed"),{status:i.status});return r};let p,l,h,m,u,f,w,g,y,k,x,v=0,b=new Set;const M=new Map,E=new Map,S=new Map,P=new Set,A=new Set,z=(e,t="")=>projectApi(`/api/export/cache/${e}`)+`&id=${p}${t}`,T=()=>{p&&fetch(z("release"),{method:"POST",keepalive:!0}).catch(()=>{}),l&&fetch(`/api/export/end?id=${l}&discard=1`,{method:"POST",keepalive:!0}).catch(()=>{})},j=()=>{a.abort(),T()},C=e=>{"Escape"===e.key&&(renderCancelled=!0,a.abort()),e.stopImmediatePropagation(),e.preventDefault()};window.addEventListener("pagehide",j),window.addEventListener("keydown",C,!0),els.exportOverlay.classList.remove("hidden"),els.exportProgress.style.width="0%",els.exportTitle.textContent=uiText("Preparing source frames…"),els.exportNote.textContent=uiText("Pre-decoding video and caching frames. You can switch tabs.");try{if(e.requestId&&"function"==typeof readBrowserGpu){try{runtime.browserGpu=readBrowserGpu()}catch{}fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e.requestId,diagnostic:!0,browserGpu:runtime.browserGpu})}).catch(()=>{})}const T=performance.now()+5e3;for(;;){c();const e=await d(projectApi("/api/project"));if(!runtime.saveTimer&&e.revision===project.revision)break;if(performance.now()>T)throw new Error("Project is not saved or changed externally. Reload/save before exporting.");await new Promise(e=>setTimeout(e,100))}u={...project},Object.assign(project,JSON.parse(JSON.stringify(project)));const j=await d("/api/export/ffmpeg");if(!j.available||!j.ffprobe)throw new Error("Optimized export needs ffmpeg and ffprobe");p=(await d(projectApi("/api/export/cache/begin"),{revision:project.revision})).id,x=new ExportWaitTracker(e=>d(z("wait"),e)),h=setInterval(async()=>{if(!o&&!a.signal.aborted){o=!0;try{if(f=await d(z("status")),"error"===f.state)throw Object.assign(new Error(f.error),{status:400})}catch(e){!n&&e.status>=400&&e.status<500&&(r=e,a.abort())}finally{o=!1}}},15e3);do{if(f=await d(z("status")),"error"===f.state)throw new Error(f.error);"ready"!==f.state&&await new Promise(e=>setTimeout(e,100))}while("ready"!==f.state);const C=new Set("webcodecs"===e.decode||"video"===e.decode?[]:f.clips);exportDecodeBegin(a.signal,e.decode);const I=(e,t)=>{P.add(e.id),s.fallbacks||={},s.fallbacks[e.id]=t},O=(e,t,a=!1,s=0,i)=>{const r=Math.floor(t/5),o=e.id+":"+r,n=!a&&!A.has(o);if(n&&A.add(o),!E.has(o)||n){const t=S.get(o);t?.skipped&&S.delete(o);const n=d(z("block"),{clipId:e.id,block:r,priority:a?"prefetch":"demand",neededAt:s,sequence:i}).then(t=>(t.fallback&&!a&&I(e,t.fallback),E.get(o)===n&&S.set(o,t),t)).catch(t=>a?{skipped:t.message}:(I(e,t.message),{fallback:t.message}));E.set(o,n);for(const t of E.keys())t.startsWith(e.id+":")&&!a&&Number(t.slice(e.id.length+1))<r-1&&(E.delete(t),S.delete(t),A.delete(t))}return E.get(o)},B=(e,t=0)=>{for(const[a,s]of M){if(v+t<=134217728)break;!e.has(a)&&s.img&&(s.img.close(),v-=s.bytes,M.delete(a))}},q=async(e,t,r,o=!1)=>{const n=e.id+":"+Math.floor(t/5);if(o&&!S.has(n))return null;!o&&!S.has(n)&&s.frames>0&&(els.exportTitle.textContent=uiText("Preparing video frames…"),els.exportNote.textContent=uiText("Preparing the next part of your video. Export will continue automatically."));const d=!S.has(n)||S.get(n)?.skipped,p=performance.now(),l=o?S.get(n):await x.track("source-block",()=>O(e,t));if(!o&&d&&i("blockWait",performance.now()-p),l.fallback||l.skipped)return null;const h=cachedFrameIndex(l.times,t);if(h<0||t>l.times.at(-1)+(l.times.length>1?l.times[1]-l.times[0]:.1)+1e-5)return o||I(e,"source time outside cached coverage"),null;const m=l.key+":"+h;o||r.add(m);let u=M.get(m);if(u)M.delete(m),M.set(m,u);else{if(B(r,l.width*l.height*4),o&&v+l.width*l.height*4>134217728)return null;u={bytes:l.width*l.height*4,img:null},v+=u.bytes,s.peakDecodedBytes=Math.max(s.peakDecodedBytes,v),u.promise=(async()=>{let e;try{let t=performance.now();const s=await fetch(z("frame",`&key=${l.key}&index=${h}`),{signal:a.signal});if(!s.ok)throw new Error("Cached source frame unavailable");const r=await s.blob();return i("sourceFetch",performance.now()-t),t=performance.now(),e=await createImageBitmap(r),i("sourceDecode",performance.now()-t),c(),u.img=e,e}catch(t){throw e?.close(),v-=u.bytes,M.delete(m),t}})(),M.set(m,u)}return o?u.promise:x.track("source-image",()=>u.promise)},F=e.fps||project.fps,R=Math.max(1/F,projDur()),N=(Math.max(1,Math.round(R*F)),project.clips.filter(e=>"video"===e.kind&&isTrackEnabled(e.track))),$=sourceBlockPlan(N.filter(e=>C.has(e.id)),F),D=e=>e.clip.id+":"+e.block;g=new SourceReadAhead((e,t)=>O(e.clip,e.time,!0,e.neededAt,t),e=>P.has(e.clip.id)||E.has(D(e)),{key:D,syncPlan:async(e,t,a)=>{const s=new Set([...e.map(D),...t.map(e=>e.clipId+":"+e.block)]);for(const e of E.keys())A.has(e)||s.has(e)||(E.delete(e),S.delete(e));await d(z("retain"),{sequence:a,blocks:e.map(e=>({clipId:e.clip.id,block:e.block})),current:t})}});const W=new Set,L=async e=>{const t=N.filter(t=>activeAt(t,e));g.update($.filter(t=>t.neededAt>e&&!P.has(t.clip.id)).slice(0,3),t.filter(e=>C.has(e.id)&&!P.has(e.id)).map(t=>({clipId:t.id,block:Math.floor(mediaTimeAt(t,e)/5)})));const a=N.filter(t=>t.start+t.duration<=e&&!W.has(t.id));if(a.length){await d(z("drop"),{clipIds:a.map(e=>e.id)});for(const e of a)W.add(e.id)}optimizedSources=new Map;const s=b=new Set;for(const a of t)stealExportVideo(a,e);return releaseFinishedExportVideos(e),await Promise.all(t.map(async t=>{const a=mediaTimeAt(t,e);if(C.has(t.id)&&!P.has(t.id))try{const e=await q(t,a,s);if(e)return void optimizedSources.set(t.id,e)}catch(e){c(),I(t,e.message)}await x.track("video-seek",async()=>{await decodeExportVideo(t,e)||await prepareVideoFrame(t,acquireExportVideo(t,e),a)})})),B(s),s},G=exportWindow(e);await L(G.start),s.phases.prepareMs=performance.now()-t,els.exportTitle.textContent=uiText("Mixing audio…");let J=performance.now();const Q=await x.track("audio-mix",()=>renderExportAudio(G.start,G.dur,a.signal));c(),s.phases.audioMs=performance.now()-J,e.name||project.name;const V=await d(projectApi("/api/export/begin"),{...exportBeginOptions(e,G,Q,"optimized"),cacheId:p});l=V.id,Q&&await d(`/api/export/audio?id=${l}`,Q),await loadLibraryFonts(),await document.fonts.ready,project.clips.some(e=>isTrackEnabled(e.track)&&e.props?.bgRemove)&&await ensureBgSeg();const U=createExportPipeline(V,a.signal,async(e,t)=>{const a=performance.now();await d(`/api/export/frame?id=${l}&frames=${t}`,e),i("upload",performance.now()-a)},i);({queue:m,encoder:w,pipeline:k}=U),s.snapshotDepth=U.depth,y=new FrameReadAhead(async({clip:e,time:t})=>{if(P.has(e.id)||W.has(e.id))return;const a=performance.now();await q(e,t,b,!0),i("prefetch",performance.now()-a)});const Y=performance.now();for(let e=0;e<G.frames;e++){c();const t=G.start+e/G.fps;state.time=t,J=performance.now();const a=await L(t);i("source",performance.now()-J),N.some(a=>a.start>G.start+(e-1)/G.fps&&a.start<=t)&&i("cutSourceWait",performance.now()-J),J=performance.now(),await x.track("frame-assets",()=>prepareFrameAssets(t)),i("assets",performance.now()-J),J=performance.now(),drawFrame(t),i("composite",performance.now()-J),J=performance.now();const r=[];for(let t=1;t<=4&&e+t<G.frames;t++){const a=G.start+(e+t)/G.fps;for(const s of N)activeAt(s,a)&&C.has(s.id)&&!P.has(s.id)&&r.push({key:`${s.id}:${e+t}`,clip:s,time:mediaTimeAt(s,a)})}y.update(r),await x.track("encoder",()=>k.push(els.preview)),i("pipeline",performance.now()-J),s.frames++,B(a);const o=(e+1)/G.frames*100;els.exportProgress.style.width=o.toFixed(1)+"%",els.exportTitle.textContent=uiText("Rendering… {percent}%",{percent:o.toFixed(0)}),els.exportNote.textContent=uiText("Cached video frames · {count} compatibility fallbacks · You can switch tabs.",{count:new Set([...Object.keys(f.stats.fallbacks),...P]).size})}await x.track("encoder",async()=>{await k.finish(),await m.finish()}),await y.stop(),s.peakQueueBytes=m.peakBytes,s.phases.renderMs=performance.now()-Y,f=await d(z("status")),s.cache=f.stats;for(const e of Object.values(s.samples)){let t=0;e.meanMs=e.totalMs/e.count;for(let a=0;a<e.histogram.length;a++)if(t+=e.histogram[a],t>=.95*e.count){e.p95UpperMs=2**a;break}}els.exportTitle.textContent=uiText("Encoding…"),J=performance.now(),s.totalMs=performance.now()-t,n=!0;const K=await d(`/api/export/end?id=${l}`,{metrics:s});if(l=null,s.phases.finalizeMs=performance.now()-J,s.totalMs=performance.now()-t,s.fps=G.frames/(s.totalMs/1e3),!e.requestId){const e=document.createElement("a");e.href=K.src,e.download=decodeURIComponent(K.src.split("/").pop()),e.click(),toast(uiText("Optimized export complete: {seconds}s · {hits} cache hits",{seconds:(s.totalMs/1e3).toFixed(1),hits:s.cache.hits}))}console.info("Optimized export",s)}catch(t){m?.cancel(),a.abort(),await(m?.finish().catch(()=>{}));const i=r?.message||(renderCancelled||"AbortError"===t.name?"cancelled":t.message);if(e.requestId){let a;try{a=project.clips.filter(e=>activeAt(e,state.time)).map(e=>e.id).slice(0,12)}catch{}await fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e.requestId,group:e.group||0,error:i,stack:t.stack,frame:s.frames,timeSec:state.time,browserGpu:runtime.browserGpu,clipIds:a})}).catch(()=>{})}else"cancelled"!==i&&alert(uiText("Optimized export failed: ")+i)}finally{clearInterval(h),x?.stop(),T(),w?.close(),a.abort(),await(g?.stop()),await(y?.stop()),await(k?.settle()),optimizedAbort=null,optimizedSources=null,exportDecodeEnd();for(const e of M.values())e.img&&e.img.close();M.clear(),optimizedMaskCanvas&&(optimizedMaskCanvas.width=0,optimizedMaskCanvas.height=0,optimizedMaskCanvas=null),u&&Object.assign(project,u),state.exporting=!1,state.rendering=!1,window.removeEventListener("pagehide",j),window.removeEventListener("keydown",C,!0),els.exportOverlay.classList.add("hidden"),els.exportNote.textContent=uiText("Rendering your sequence in real time. Keep this tab focused."),runtime.pendingSync&&syncFromServer()}}"undefined"!=typeof module&&(module.exports={ExportWaitTracker,OrderedFrameQueue,cachedFrameIndex,sourceBlockPlan,sourceReadAhead,SourceReadAhead,FrameReadAhead,SnapshotPipeline,createSnapshotEncoder});
|
|
1
|
+
"use strict";class OrderedFrameQueue{constructor(e,t=4,a=33554432){this.write=e,this.maxFrames=t,this.maxBytes=a,this.pending=[],this.bytes=0,this.peakBytes=0,this.error=null}async push(e){for(;this.pending.length&&(this.pending.length>=this.maxFrames||this.bytes+e.size>this.maxBytes);)await this.pending[0];if(this.error)throw this.error;this.bytes+=e.size,this.peakBytes=Math.max(this.peakBytes,this.bytes);const t=(this.pending.at(-1)||Promise.resolve()).then(()=>{if(this.error)throw this.error;return this.write(e)}).catch(e=>{this.error=e}).finally(()=>{this.bytes-=e.size,this.pending.shift()});this.pending.push(t)}async finish(){if(await Promise.all(this.pending),this.error)throw this.error}cancel(){this.error=this.error||new Error("cancelled")}}function cachedFrameIndex(e,t){let a=0,s=e.length;for(;a<s;){const i=a+s>>>1;e[i]<=t+1e-5?a=i+1:s=i}return a-1}function sourceBlockPlan(e,t){const a=[];for(const s of e){const e=Math.max(.1,Math.min(8,Number(s.props?.speed)||1)),i=s.start+s.duration;let r=Math.max(0,Math.ceil(s.start*t-1e-7));for(;r/t<i;){const i=r/t,o=s.in+(i-s.start)*e,n=Math.floor(o/5);a.push({clip:s,time:o,block:n,neededAt:i}),r=Math.max(r+1,Math.ceil((s.start+(5*(n+1)-s.in)/e)*t-1e-7))}}return a.sort((e,t)=>e.neededAt-t.neededAt)}function sourceReadAhead(e,t,a){return sourceBlockPlan(e,a).filter(e=>e.neededAt>t).slice(0,3)}class SourceReadAhead{constructor(e,t,{concurrency:a=3,syncPlan:s=async()=>{},key:i=e=>e}={}){this.load=e,this.requested=t,this.concurrency=a,this.syncPlan=s,this.key=i,this.plan=[],this.active=new Map,this.stopped=!1,this.sequence=0,this.readySequence=0,this.syncing=Promise.resolve(),this.signature=""}update(e,t=[]){if(this.stopped)return;const a=JSON.stringify([e.map(this.key),t]);if(a===this.signature)return;this.signature=a,this.plan=e;const s=++this.sequence;this.syncing=this.syncing.catch(()=>{}).then(()=>this.syncPlan(e,t,s)).then(()=>{s===this.sequence&&(this.readySequence=s,this.pump())}).catch(()=>{})}pump(){if(!this.stopped&&this.readySequence===this.sequence)for(const e of this.plan){if(this.active.size>=this.concurrency)break;const t=this.key(e);if(this.active.has(t)||this.requested(e))continue;const a=this.sequence,s=Promise.resolve().then(()=>this.load(e,a)).catch(()=>{}).finally(()=>{this.active.delete(t),this.pump()});this.active.set(t,s)}}async stop(){this.stopped=!0,this.plan=[],await this.syncing,await Promise.allSettled(this.active.values())}}class ExportWaitTracker{constructor(e,{now:t=()=>performance.now(),interval:a=500,threshold:s=250}={}){this.report=e,this.now=t,this.threshold=s,this.active=new Set,this.sequence=0,this.last=null,this.timer=setInterval(()=>this.flush(),a)}async track(e,t){const a={reason:e,started:this.now()};this.active.add(a);try{return await t()}finally{this.active.delete(a)}}flush(){const e=[...this.active].filter(e=>this.now()-e.started>=this.threshold).sort((e,t)=>["source-block","video-seek","source-image","frame-assets","audio-mix","encoder"].indexOf(e.reason)-["source-block","video-seek","source-image","frame-assets","audio-mix","encoder"].indexOf(t.reason)||e.started-t.started)[0];(e||null)!==this.last&&(this.last=e||null,Promise.resolve(this.report({sequence:++this.sequence,reason:e?.reason||null,elapsedMs:e?Math.max(0,this.now()-e.started):0})).catch(()=>{this.last===(e||null)&&(this.last=void 0)}))}stop(){clearInterval(this.timer),this.active.clear(),this.flush()}}class FrameReadAhead{constructor(e,t=2){this.load=e,this.concurrency=t,this.plan=[],this.active=new Map,this.stopped=!1}update(e){this.stopped||(this.plan=e,this.pump())}pump(){for(;!this.stopped&&this.active.size<this.concurrency&&this.plan.length;){const e=this.plan.shift();if(this.active.has(e.key))continue;const t=Promise.resolve().then(()=>this.load(e)).catch(()=>{}).finally(()=>{this.active.delete(e.key),this.pump()});this.active.set(e.key,t)}}async stop(){this.stopped=!0,this.plan=[],await Promise.all(this.active.values())}}class SnapshotPipeline{constructor(e,t,a=2){this.capture=e,this.write=t,this.depth=a,this.pending=[]}async push(e){for(;this.pending.length>=this.depth;)await this.drain();const t=await this.capture(e);t.result.catch(()=>{}),this.pending.push(t)}async drain(){const e=this.pending.shift();e&&await this.write(await e.result)}async finish(){for(;this.pending.length;)await this.drain()}async settle(){await Promise.allSettled(this.pending.splice(0).map(e=>e.result))}}function createSnapshotEncoder(e,t=.95){let a,s=0;const i=new Map,r=()=>{a?.terminate(),a=null;for(const{reject:e}of i.values())e(new Error("snapshot encoder stopped"));i.clear(),e.removeEventListener("abort",r)};if("function"==typeof Worker&&"function"==typeof OffscreenCanvas&&"function"==typeof createImageBitmap)try{a=new Worker("optimized-encoder-worker.js"),a.onmessage=({data:e})=>{const t=i.get(e.id);t&&(i.delete(e.id),e.error?t.reject(new Error(e.error)):t.resolve(e.blob))},a.onerror=e=>{e.preventDefault(),r()},e.addEventListener("abort",r,{once:!0})}catch{r()}return{close:r,async capture(o){if(e.aborted)throw new Error("cancelled");if(!a)return{result:Promise.resolve(await new Promise(e=>o.toBlob(e,"image/jpeg",t)))};const n=await createImageBitmap(o);if(e.aborted)throw n.close(),new Error("cancelled");const c=s++,d=(async()=>{const s=await createImageBitmap(n);return new Promise((r,o)=>{if(e.aborted||!a)return s.close(),void o(new Error("snapshot encoder stopped"));i.set(c,{resolve:r,reject:o});try{a.postMessage({id:c,bitmap:s,quality:t},[s])}catch(e){s.close(),i.delete(c),o(e)}})})().catch(async a=>{if(e.aborted)throw a;r();const s=document.createElement("canvas");s.width=n.width,s.height=n.height;try{return s.getContext("2d").drawImage(n,0,0),await new Promise(e=>s.toBlob(e,"image/jpeg",t))}finally{s.width=s.height=0}}).finally(()=>n.close());return d.catch(()=>{}),{result:d}}}}let optimizedSources=null,optimizedAbort=null,optimizedMaskCanvas=null;function optimizedMaskSource(e){return optimizedMaskCanvas||(optimizedMaskCanvas=document.createElement("canvas")),optimizedMaskCanvas.width!==e.width&&(optimizedMaskCanvas.width=e.width),optimizedMaskCanvas.height!==e.height&&(optimizedMaskCanvas.height=e.height),optimizedMaskCanvas.getContext("2d").drawImage(e,0,0),optimizedMaskCanvas}async function optimizedExport(e={}){if(state.exporting)return;pause(),state.exporting=!0,state.rendering=!0,renderCancelled=!1;const t=performance.now(),a=new AbortController;optimizedAbort=a;const s={engine:"optimized",frames:0,phases:{},samples:{},peakDecodedBytes:0,peakQueueBytes:0},i=(e,t)=>{const a=s.samples[e]||(s.samples[e]={count:0,totalMs:0,maxMs:0,histogram:Array(24).fill(0)});a.count++,a.totalMs+=t,a.maxMs=Math.max(a.maxMs,t),a.histogram[Math.min(23,Math.max(0,Math.ceil(Math.log2(Math.max(1,t)))))]++};let r,o=!1,n=!1;const c=()=>{if(r)throw r;if(renderCancelled||a.signal.aborted)throw new Error("cancelled")},d=async(e,t,s)=>{c();const i=await fetch(e,{method:s||(void 0===t?"GET":"POST"),body:void 0===t?void 0:t instanceof Blob?t:JSON.stringify(t),signal:a.signal}),r=await i.json();if(!i.ok||r.error)throw Object.assign(new Error(r.error||"Export request failed"),{status:i.status});return r};let p,l,h,m,u,f,w,g,y,k,x,v=0,b=new Set;const M=new Map,E=new Map,S=new Map,P=new Set,A=new Set,z=(e,t="")=>projectApi(`/api/export/cache/${e}`)+`&id=${p}${t}`,T=()=>{p&&fetch(z("release"),{method:"POST",keepalive:!0}).catch(()=>{}),l&&fetch(`/api/export/end?id=${l}&discard=1`,{method:"POST",keepalive:!0}).catch(()=>{})},j=()=>{a.abort(),T()},C=e=>{"Escape"===e.key&&(renderCancelled=!0,a.abort()),e.stopImmediatePropagation(),e.preventDefault()};window.addEventListener("pagehide",j),window.addEventListener("keydown",C,!0),els.exportOverlay.classList.remove("hidden"),els.exportProgress.style.width="0%",els.exportTitle.textContent=uiText("Preparing source frames…"),els.exportNote.textContent=uiText("Pre-decoding video and caching frames. You can switch tabs.");try{if(e.requestId&&"function"==typeof readBrowserGpu){try{runtime.browserGpu=readBrowserGpu()}catch{}fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e.requestId,diagnostic:!0,browserGpu:runtime.browserGpu})}).catch(()=>{})}const T=performance.now()+5e3;for(;;){c();const e=await d(projectApi("/api/project"));if(!runtime.saveTimer&&e.revision===project.revision)break;if(performance.now()>T)throw new Error("Project is not saved or changed externally. Reload/save before exporting.");await new Promise(e=>setTimeout(e,100))}u={...project},Object.assign(project,JSON.parse(JSON.stringify(project)));const j=await d("/api/export/ffmpeg");if(!j.available||!j.ffprobe)throw new Error("Optimized export needs ffmpeg and ffprobe");p=(await d(projectApi("/api/export/cache/begin"),{revision:project.revision})).id,x=new ExportWaitTracker(e=>d(z("wait"),e)),h=setInterval(async()=>{if(!o&&!a.signal.aborted){o=!0;try{if(f=await d(z("status")),"error"===f.state)throw Object.assign(new Error(f.error),{status:400})}catch(e){!n&&e.status>=400&&e.status<500&&(r=e,a.abort())}finally{o=!1}}},15e3);do{if(f=await d(z("status")),"error"===f.state)throw new Error(f.error);"ready"!==f.state&&await new Promise(e=>setTimeout(e,100))}while("ready"!==f.state);const C=new Set("webcodecs"===e.decode||"video"===e.decode?[]:f.clips);exportDecodeBegin(a.signal,e.decode,e.requestId);const I=(e,t)=>{P.add(e.id),s.fallbacks||={},s.fallbacks[e.id]=t},O=(e,t,a=!1,s=0,i)=>{const r=Math.floor(t/5),o=e.id+":"+r,n=!a&&!A.has(o);if(n&&A.add(o),!E.has(o)||n){const t=S.get(o);t?.skipped&&S.delete(o);const n=d(z("block"),{clipId:e.id,block:r,priority:a?"prefetch":"demand",neededAt:s,sequence:i}).then(t=>(t.fallback&&!a&&I(e,t.fallback),E.get(o)===n&&S.set(o,t),t)).catch(t=>a?{skipped:t.message}:(I(e,t.message),{fallback:t.message}));E.set(o,n);for(const t of E.keys())t.startsWith(e.id+":")&&!a&&Number(t.slice(e.id.length+1))<r-1&&(E.delete(t),S.delete(t),A.delete(t))}return E.get(o)},q=(e,t=0)=>{for(const[a,s]of M){if(v+t<=134217728)break;!e.has(a)&&s.img&&(s.img.close(),v-=s.bytes,M.delete(a))}},B=async(e,t,r,o=!1)=>{const n=e.id+":"+Math.floor(t/5);if(o&&!S.has(n))return null;!o&&!S.has(n)&&s.frames>0&&(els.exportTitle.textContent=uiText("Preparing video frames…"),els.exportNote.textContent=uiText("Preparing the next part of your video. Export will continue automatically."));const d=!S.has(n)||S.get(n)?.skipped,p=performance.now(),l=o?S.get(n):await x.track("source-block",()=>O(e,t));if(!o&&d&&i("blockWait",performance.now()-p),l.fallback||l.skipped)return null;const h=cachedFrameIndex(l.times,t);if(h<0||t>l.times.at(-1)+(l.times.length>1?l.times[1]-l.times[0]:.1)+1e-5)return o||I(e,"source time outside cached coverage"),null;const m=l.key+":"+h;o||r.add(m);let u=M.get(m);if(u)M.delete(m),M.set(m,u);else{if(q(r,l.width*l.height*4),o&&v+l.width*l.height*4>134217728)return null;u={bytes:l.width*l.height*4,img:null},v+=u.bytes,s.peakDecodedBytes=Math.max(s.peakDecodedBytes,v),u.promise=(async()=>{let e;try{let t=performance.now();const s=await fetch(z("frame",`&key=${l.key}&index=${h}`),{signal:a.signal});if(!s.ok)throw new Error("Cached source frame unavailable");const r=await s.blob();return i("sourceFetch",performance.now()-t),t=performance.now(),e=await createImageBitmap(r),i("sourceDecode",performance.now()-t),c(),u.img=e,e}catch(t){throw e?.close(),v-=u.bytes,M.delete(m),t}})(),M.set(m,u)}return o?u.promise:x.track("source-image",()=>u.promise)},F=e.fps||project.fps,R=Math.max(1/F,projDur()),N=(Math.max(1,Math.round(R*F)),project.clips.filter(e=>"video"===e.kind&&isTrackEnabled(e.track))),$=sourceBlockPlan(N.filter(e=>C.has(e.id)),F),D=e=>e.clip.id+":"+e.block;g=new SourceReadAhead((e,t)=>O(e.clip,e.time,!0,e.neededAt,t),e=>P.has(e.clip.id)||E.has(D(e)),{key:D,syncPlan:async(e,t,a)=>{const s=new Set([...e.map(D),...t.map(e=>e.clipId+":"+e.block)]);for(const e of E.keys())A.has(e)||s.has(e)||(E.delete(e),S.delete(e));await d(z("retain"),{sequence:a,blocks:e.map(e=>({clipId:e.clip.id,block:e.block})),current:t})}});const W=new Set,L=async e=>{const t=N.filter(t=>activeAt(t,e));g.update($.filter(t=>t.neededAt>e&&!P.has(t.clip.id)).slice(0,3),t.filter(e=>C.has(e.id)&&!P.has(e.id)).map(t=>({clipId:t.id,block:Math.floor(mediaTimeAt(t,e)/5)})));const a=N.filter(t=>t.start+t.duration<=e&&!W.has(t.id));if(a.length){await d(z("drop"),{clipIds:a.map(e=>e.id)});for(const e of a)W.add(e.id)}optimizedSources=new Map;const s=b=new Set;for(const a of t)stealExportVideo(a,e);return releaseFinishedExportVideos(e),await Promise.all(t.map(async t=>{const a=mediaTimeAt(t,e);if(C.has(t.id)&&!P.has(t.id))try{const e=await B(t,a,s);if(e)return void optimizedSources.set(t.id,e)}catch(e){c(),I(t,e.message)}await x.track("video-seek",async()=>{await decodeExportVideo(t,e)||await prepareVideoFrame(t,acquireExportVideo(t,e),a)})})),q(s),s},G=exportWindow(e);await L(G.start),s.phases.prepareMs=performance.now()-t,els.exportTitle.textContent=uiText("Mixing audio…");let J=performance.now();const Q=await x.track("audio-mix",()=>renderExportAudio(G.start,G.dur,a.signal));c(),s.phases.audioMs=performance.now()-J,e.name||project.name;const V=await d(projectApi("/api/export/begin"),{...exportBeginOptions(e,G,Q,"optimized"),cacheId:p});l=V.id,Q&&await d(`/api/export/audio?id=${l}`,Q),await loadLibraryFonts(),await document.fonts.ready,project.clips.some(e=>isTrackEnabled(e.track)&&e.props?.bgRemove)&&await ensureBgSeg();const U=createExportPipeline(V,a.signal,async(e,t)=>{const a=performance.now();await d(`/api/export/frame?id=${l}&frames=${t}`,e),i("upload",performance.now()-a)},i);({queue:m,encoder:w,pipeline:k}=U),s.snapshotDepth=U.depth,y=new FrameReadAhead(async({clip:e,time:t})=>{if(P.has(e.id)||W.has(e.id))return;const a=performance.now();await B(e,t,b,!0),i("prefetch",performance.now()-a)});const Y=performance.now();for(let e=0;e<G.frames;e++){c();const t=G.start+e/G.fps;state.time=t,J=performance.now();const a=await L(t);i("source",performance.now()-J),N.some(a=>a.start>G.start+(e-1)/G.fps&&a.start<=t)&&i("cutSourceWait",performance.now()-J),J=performance.now(),await x.track("frame-assets",()=>prepareFrameAssets(t)),i("assets",performance.now()-J),J=performance.now(),drawFrame(t),i("composite",performance.now()-J),J=performance.now();const r=[];for(let t=1;t<=4&&e+t<G.frames;t++){const a=G.start+(e+t)/G.fps;for(const s of N)activeAt(s,a)&&C.has(s.id)&&!P.has(s.id)&&r.push({key:`${s.id}:${e+t}`,clip:s,time:mediaTimeAt(s,a)})}y.update(r),await x.track("encoder",()=>k.push(els.preview)),i("pipeline",performance.now()-J),s.frames++,q(a);const o=(e+1)/G.frames*100;els.exportProgress.style.width=o.toFixed(1)+"%",els.exportTitle.textContent=uiText("Rendering… {percent}%",{percent:o.toFixed(0)}),els.exportNote.textContent=uiText("Cached video frames · {count} compatibility fallbacks · You can switch tabs.",{count:new Set([...Object.keys(f.stats.fallbacks),...P]).size})}await x.track("encoder",async()=>{await k.finish(),await m.finish()}),await y.stop(),s.peakQueueBytes=m.peakBytes,s.phases.renderMs=performance.now()-Y,f=await d(z("status")),s.cache=f.stats;for(const e of Object.values(s.samples)){let t=0;e.meanMs=e.totalMs/e.count;for(let a=0;a<e.histogram.length;a++)if(t+=e.histogram[a],t>=.95*e.count){e.p95UpperMs=2**a;break}}els.exportTitle.textContent=uiText("Encoding…"),J=performance.now(),s.totalMs=performance.now()-t,n=!0;const K=await d(`/api/export/end?id=${l}`,{metrics:s});if(l=null,s.phases.finalizeMs=performance.now()-J,s.totalMs=performance.now()-t,s.fps=G.frames/(s.totalMs/1e3),!e.requestId){const e=document.createElement("a");e.href=K.src,e.download=decodeURIComponent(K.src.split("/").pop()),e.click(),toast(uiText("Optimized export complete: {seconds}s · {hits} cache hits",{seconds:(s.totalMs/1e3).toFixed(1),hits:s.cache.hits}))}console.info("Optimized export",s)}catch(t){m?.cancel(),a.abort(),await(m?.finish().catch(()=>{}));const i=r?.message||(renderCancelled||"AbortError"===t.name?"cancelled":t.message);if(e.requestId){let a;try{a=project.clips.filter(e=>activeAt(e,state.time)).map(e=>e.id).slice(0,12)}catch{}await fetch(projectApi("/api/export/report"),{method:"POST",body:JSON.stringify({requestId:e.requestId,group:e.group||0,error:i,stack:t.stack,frame:s.frames,timeSec:state.time,browserGpu:runtime.browserGpu,clipIds:a})}).catch(()=>{})}else"cancelled"!==i&&alert(uiText("Optimized export failed: ")+i)}finally{clearInterval(h),x?.stop(),T(),w?.close(),a.abort(),await(g?.stop()),await(y?.stop()),await(k?.settle()),optimizedAbort=null,optimizedSources=null,exportDecodeEnd();for(const e of M.values())e.img&&e.img.close();M.clear(),optimizedMaskCanvas&&(optimizedMaskCanvas.width=0,optimizedMaskCanvas.height=0,optimizedMaskCanvas=null),u&&Object.assign(project,u),state.exporting=!1,state.rendering=!1,window.removeEventListener("pagehide",j),window.removeEventListener("keydown",C,!0),els.exportOverlay.classList.add("hidden"),els.exportNote.textContent=uiText("Rendering your sequence in real time. Keep this tab focused."),runtime.pendingSync&&syncFromServer()}}"undefined"!=typeof module&&(module.exports={ExportWaitTracker,OrderedFrameQueue,cachedFrameIndex,sourceBlockPlan,sourceReadAhead,SourceReadAhead,FrameReadAhead,SnapshotPipeline,createSnapshotEncoder});
|