@editframe/cli 0.47.2 → 0.48.0

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.
Files changed (64) hide show
  1. package/dist/VERSION.js +2 -2
  2. package/dist/VERSION.js.map +1 -1
  3. package/dist/commands/auth.js +2 -3
  4. package/dist/commands/auth.js.map +1 -1
  5. package/dist/commands/check.js +5 -6
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/cloud-render.js +4 -5
  8. package/dist/commands/cloud-render.js.map +1 -1
  9. package/dist/commands/preview.js +2 -3
  10. package/dist/commands/preview.js.map +1 -1
  11. package/dist/commands/process-file.js +2 -3
  12. package/dist/commands/process-file.js.map +1 -1
  13. package/dist/commands/process.js +2 -3
  14. package/dist/commands/process.js.map +1 -1
  15. package/dist/commands/render.js +4 -5
  16. package/dist/commands/render.js.map +1 -1
  17. package/dist/commands/sync.js +2 -3
  18. package/dist/commands/sync.js.map +1 -1
  19. package/dist/commands/transcribe.js +2 -3
  20. package/dist/commands/transcribe.js.map +1 -1
  21. package/dist/commands/webhook.js +5 -6
  22. package/dist/commands/webhook.js.map +1 -1
  23. package/dist/index.d.ts +1 -3
  24. package/dist/index.js +2 -3
  25. package/dist/index.js.map +1 -1
  26. package/dist/operations/processRenderInfo.js +1 -2
  27. package/dist/operations/processRenderInfo.js.map +1 -1
  28. package/dist/operations/syncAssetsDirectory/SubAssetSync.js +1 -2
  29. package/dist/operations/syncAssetsDirectory/SubAssetSync.js.map +1 -1
  30. package/dist/operations/syncAssetsDirectory/SyncCaption.js +3 -4
  31. package/dist/operations/syncAssetsDirectory/SyncCaption.js.map +1 -1
  32. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.js +3 -4
  33. package/dist/operations/syncAssetsDirectory/SyncFragmentIndex.js.map +1 -1
  34. package/dist/operations/syncAssetsDirectory/SyncImage.js +3 -4
  35. package/dist/operations/syncAssetsDirectory/SyncImage.js.map +1 -1
  36. package/dist/operations/syncAssetsDirectory/SyncStatus.js +1 -2
  37. package/dist/operations/syncAssetsDirectory/SyncStatus.js.map +1 -1
  38. package/dist/operations/syncAssetsDirectory/SyncTrack.js +3 -4
  39. package/dist/operations/syncAssetsDirectory/SyncTrack.js.map +1 -1
  40. package/dist/operations/syncAssetsDirectory/doAssetSync.js +1 -1
  41. package/dist/operations/syncAssetsDirectory/doAssetSync.js.map +1 -1
  42. package/dist/operations/syncAssetsDirectory.js +4 -5
  43. package/dist/operations/syncAssetsDirectory.js.map +1 -1
  44. package/dist/utils/createReadableStreamFromReadable.js +1 -2
  45. package/dist/utils/createReadableStreamFromReadable.js.map +1 -1
  46. package/dist/utils/detectChrome.js +1 -2
  47. package/dist/utils/detectChrome.js.map +1 -1
  48. package/dist/utils/index.js +1 -2
  49. package/dist/utils/index.js.map +1 -1
  50. package/dist/utils/launchBrowserAndWaitForSDK.js +1 -2
  51. package/dist/utils/launchBrowserAndWaitForSDK.js.map +1 -1
  52. package/dist/utils/patchFragmentedMp4.js +1 -2
  53. package/dist/utils/patchFragmentedMp4.js.map +1 -1
  54. package/dist/utils/profileRender.js +1 -2
  55. package/dist/utils/profileRender.js.map +1 -1
  56. package/dist/utils/spawnViteServer.js +1 -2
  57. package/dist/utils/spawnViteServer.js.map +1 -1
  58. package/dist/utils/startPreviewServer.js +1 -2
  59. package/dist/utils/startPreviewServer.js.map +1 -1
  60. package/dist/utils/validateVideoResolution.js +1 -2
  61. package/dist/utils/validateVideoResolution.js.map +1 -1
  62. package/dist/utils/withSpinner.js +1 -2
  63. package/dist/utils/withSpinner.js.map +1 -1
  64. package/package.json +7 -9
package/dist/VERSION.js CHANGED
@@ -1,6 +1,6 @@
1
1
  //#region src/VERSION.ts
2
- const VERSION = "0.47.2";
3
-
2
+ const VERSION = "0.48.0";
4
3
  //#endregion
5
4
  export { VERSION };
5
+
6
6
  //# sourceMappingURL=VERSION.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VERSION.js","names":[],"sources":["../src/VERSION.ts"],"sourcesContent":["export const VERSION = \"0.47.2\";\n"],"mappings":";AAAA,MAAa,UAAU"}
1
+ {"version":3,"file":"VERSION.js","names":[],"sources":["../src/VERSION.ts"],"mappings":";AAAA,MAAa,UAAU"}
@@ -3,7 +3,6 @@ import { program } from "commander";
3
3
  import chalk from "chalk";
4
4
  import debug from "debug";
5
5
  import ora from "ora";
6
-
7
6
  //#region src/commands/auth.ts
8
7
  const log = debug("ef:cli:auth");
9
8
  const getApiData = async () => {
@@ -22,7 +21,7 @@ const authCommand = program.command("auth").description("Fetch organization data
22
21
  log("Error:", error);
23
22
  }
24
23
  });
25
-
26
24
  //#endregion
27
- export { };
25
+ export {};
26
+
28
27
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":["error: any"],"sources":["../../src/commands/auth.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { program } from \"commander\";\nimport debug from \"debug\";\nimport ora from \"ora\";\n\nimport { getClient } from \"../utils/index.js\";\n\nconst log = debug(\"ef:cli:auth\");\n\nexport interface APIOrgResult {\n apiKeyName: string;\n id: string;\n org_id: string;\n created_at: unknown;\n updated_at: unknown;\n displayName: string;\n}\n\nexport const getApiData = async () => {\n const response = await getClient().authenticatedFetch(\"/api/v1/organization\");\n return response.json() as Promise<APIOrgResult>;\n};\n\nconst authCommand = program\n .command(\"auth\")\n .description(\"Fetch organization data using API token\")\n .action(async () => {\n const options = authCommand.opts();\n log(\"Options:\", options);\n\n const spinner = ora(\"Loading...\").start();\n\n try {\n const apiData = await getApiData();\n spinner.succeed(\"You are authenticated! 🎉\");\n process.stderr.write(chalk.green(`You're using ${apiData.apiKeyName} API key 🚀\\n`));\n process.stderr.write(chalk.blue(`Welcome to ${apiData.displayName} organization 🎉\\n`));\n } catch (error: any) {\n spinner.fail(\"Authentication failed!\");\n log(\"Error:\", error);\n }\n });\n"],"mappings":";;;;;;;AAOA,MAAM,MAAM,MAAM,cAAc;AAWhC,MAAa,aAAa,YAAY;AAEpC,SADiB,MAAM,WAAW,CAAC,mBAAmB,uBAAuB,EAC7D,MAAM;;AAGxB,MAAM,cAAc,QACjB,QAAQ,OAAO,CACf,YAAY,0CAA0C,CACtD,OAAO,YAAY;AAElB,KAAI,YADY,YAAY,MAAM,CACV;CAExB,MAAM,UAAU,IAAI,aAAa,CAAC,OAAO;AAEzC,KAAI;EACF,MAAM,UAAU,MAAM,YAAY;AAClC,UAAQ,QAAQ,4BAA4B;AAC5C,UAAQ,OAAO,MAAM,MAAM,MAAM,gBAAgB,QAAQ,WAAW,eAAe,CAAC;AACpF,UAAQ,OAAO,MAAM,MAAM,KAAK,cAAc,QAAQ,YAAY,oBAAoB,CAAC;UAChFA,OAAY;AACnB,UAAQ,KAAK,yBAAyB;AACtC,MAAI,UAAU,MAAM;;EAEtB"}
1
+ {"version":3,"file":"auth.js","names":[],"sources":["../../src/commands/auth.ts"],"mappings":";;;;;;AAOA,MAAM,MAAM,MAAM,cAAc;AAWhC,MAAa,aAAa,YAAY;AAEpC,SADiB,MAAM,WAAW,CAAC,mBAAmB,uBAAuB,EAC7D,MAAM;;AAGxB,MAAM,cAAc,QACjB,QAAQ,OAAO,CACf,YAAY,0CAA0C,CACtD,OAAO,YAAY;AAElB,KAAI,YADY,YAAY,MAAM,CACV;CAExB,MAAM,UAAU,IAAI,aAAa,CAAC,OAAO;AAEzC,KAAI;EACF,MAAM,UAAU,MAAM,YAAY;AAClC,UAAQ,QAAQ,4BAA4B;AAC5C,UAAQ,OAAO,MAAM,MAAM,MAAM,gBAAgB,QAAQ,WAAW,eAAe,CAAC;AACpF,UAAQ,OAAO,MAAM,MAAM,KAAK,cAAc,QAAQ,YAAY,oBAAoB,CAAC;UAChF,OAAY;AACnB,UAAQ,KAAK,yBAAyB;AACtC,MAAI,UAAU,MAAM;;EAEtB"}
@@ -3,14 +3,13 @@ import chalk from "chalk";
3
3
  import ora from "ora";
4
4
  import { exec } from "node:child_process";
5
5
  import os from "node:os";
6
-
7
6
  //#region src/commands/check.ts
8
7
  const checks = {
9
8
  ffmpeg: {
10
9
  message: () => {
11
- const platform$1 = os.platform();
10
+ const platform = os.platform();
12
11
  const message = ["Processing assets for <ef-video>, <ef-audio>, <ef-captions>, and <ef-waveform>\n elements requires ffmpeg to be installed."];
13
- switch (platform$1) {
12
+ switch (platform) {
14
13
  case "darwin":
15
14
  message.push("On platform=darwin you can install ffmpeg using Homebrew:");
16
15
  message.push(" - brew install ffmpeg");
@@ -27,7 +26,7 @@ const checks = {
27
26
  message.push(" - winget install ffmpeg");
28
27
  break;
29
28
  default:
30
- message.push(`Unrecognized platform ${platform$1}`);
29
+ message.push(`Unrecognized platform ${platform}`);
31
30
  message.push("You can download ffmpeg from https://ffmpeg.org/download.html");
32
31
  message.push("Or try installing it from your operating system's package manager");
33
32
  break;
@@ -83,7 +82,7 @@ program.command("check").description("Check on dependencies and other requiremen
83
82
  }
84
83
  }
85
84
  });
86
-
87
85
  //#endregion
88
- export { };
86
+ export {};
87
+
89
88
  //# sourceMappingURL=check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","names":["checks: Record<string, CheckDescriptor>","platform"],"sources":["../../src/commands/check.ts"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport os from \"node:os\";\nimport chalk from \"chalk\";\nimport { program } from \"commander\";\nimport ora from \"ora\";\n\ninterface CheckDescriptor {\n check(): Promise<boolean>;\n message(): string[];\n}\n\nconst checks: Record<string, CheckDescriptor> = {\n ffmpeg: {\n message: () => {\n const platform = os.platform();\n const message = [\n \"Processing assets for <ef-video>, <ef-audio>, <ef-captions>, and <ef-waveform>\\n elements requires ffmpeg to be installed.\",\n ];\n switch (platform) {\n case \"darwin\": {\n message.push(\"On platform=darwin you can install ffmpeg using Homebrew:\");\n message.push(\" - brew install ffmpeg\");\n message.push(\"Or you can download ffmpeg from https://ffmpeg.org/download.html\");\n break;\n }\n case \"linux\": {\n message.push(\"You can install ffmpeg using your distribution's package manager.\");\n break;\n }\n case \"win32\": {\n message.push(\"You can download ffmpeg from https://ffmpeg.org/download.html\");\n message.push(\"You can use package managers like Chocolatey or Scoop to install ffmpeg.\");\n message.push(\" - choco install ffmpeg-full\");\n message.push(\" - scoop install ffmpeg\");\n message.push(\" - winget install ffmpeg\");\n break;\n }\n default: {\n message.push(`Unrecognized platform ${platform}`);\n message.push(\"You can download ffmpeg from https://ffmpeg.org/download.html\");\n message.push(\"Or try installing it from your operating system's package manager\");\n break;\n }\n }\n return message;\n },\n check: async () => {\n return new Promise((resolve, reject) => {\n exec(\"ffmpeg -version\", (error: any, stdout: any, _stderr: any) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(stdout);\n });\n });\n },\n },\n\n whisper_timestamped: {\n message: () => {\n const message = [\"<ef-captions> Requires whisper_timestamped to be installed.\"];\n\n message.push(\"whisper_timestamped depends on python3\");\n\n message.push(\" - pip3 install whisper_timestamped\");\n\n message.push(\"Alternate installation instructions are availble at:\");\n message.push(\"https://github.com/linto-ai/whisper-timestamped#installation\");\n\n return message;\n },\n check: async () => {\n return new Promise((resolve, reject) => {\n exec(\"whisper_timestamped --version\", (error: any, stdout: any, _stderr: any) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(stdout);\n });\n });\n },\n },\n};\n\nprogram\n .command(\"check\")\n .description(\"Check on dependencies and other requirements\")\n .action(async () => {\n for (const checkName in checks) {\n const check = checks[checkName];\n if (!check) {\n continue;\n }\n const spinner = ora(`Checking ${checkName}`).start();\n try {\n await check.check();\n spinner.succeed(chalk.white.bgGreen(` Check for ${checkName} passed `));\n } catch (_error) {\n spinner.fail(chalk.white.bgRed(` Check for ${checkName} failed `));\n process.stderr.write(chalk.red(check.message().join(\"\\n\\n\")));\n process.stderr.write(\"\\n\");\n }\n }\n });\n"],"mappings":";;;;;;;AAWA,MAAMA,SAA0C;CAC9C,QAAQ;EACN,eAAe;GACb,MAAMC,aAAW,GAAG,UAAU;GAC9B,MAAM,UAAU,CACd,6HACD;AACD,WAAQA,YAAR;IACE,KAAK;AACH,aAAQ,KAAK,4DAA4D;AACzE,aAAQ,KAAK,yBAAyB;AACtC,aAAQ,KAAK,mEAAmE;AAChF;IAEF,KAAK;AACH,aAAQ,KAAK,oEAAoE;AACjF;IAEF,KAAK;AACH,aAAQ,KAAK,gEAAgE;AAC7E,aAAQ,KAAK,2EAA2E;AACxF,aAAQ,KAAK,+BAA+B;AAC5C,aAAQ,KAAK,0BAA0B;AACvC,aAAQ,KAAK,2BAA2B;AACxC;IAEF;AACE,aAAQ,KAAK,yBAAyBA,aAAW;AACjD,aAAQ,KAAK,gEAAgE;AAC7E,aAAQ,KAAK,oEAAoE;AACjF;;AAGJ,UAAO;;EAET,OAAO,YAAY;AACjB,UAAO,IAAI,SAAS,SAAS,WAAW;AACtC,SAAK,oBAAoB,OAAY,QAAa,YAAiB;AACjE,SAAI,OAAO;AACT,aAAO,MAAM;AACb;;AAEF,aAAQ,OAAO;MACf;KACF;;EAEL;CAED,qBAAqB;EACnB,eAAe;GACb,MAAM,UAAU,CAAC,8DAA8D;AAE/E,WAAQ,KAAK,yCAAyC;AAEtD,WAAQ,KAAK,sCAAsC;AAEnD,WAAQ,KAAK,uDAAuD;AACpE,WAAQ,KAAK,+DAA+D;AAE5E,UAAO;;EAET,OAAO,YAAY;AACjB,UAAO,IAAI,SAAS,SAAS,WAAW;AACtC,SAAK,kCAAkC,OAAY,QAAa,YAAiB;AAC/E,SAAI,OAAO;AACT,aAAO,MAAM;AACb;;AAEF,aAAQ,OAAO;MACf;KACF;;EAEL;CACF;AAED,QACG,QAAQ,QAAQ,CAChB,YAAY,+CAA+C,CAC3D,OAAO,YAAY;AAClB,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;EAEF,MAAM,UAAU,IAAI,YAAY,YAAY,CAAC,OAAO;AACpD,MAAI;AACF,SAAM,MAAM,OAAO;AACnB,WAAQ,QAAQ,MAAM,MAAM,QAAQ,cAAc,UAAU,WAAW,CAAC;WACjE,QAAQ;AACf,WAAQ,KAAK,MAAM,MAAM,MAAM,eAAe,UAAU,WAAW,CAAC;AACpE,WAAQ,OAAO,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC;AAC7D,WAAQ,OAAO,MAAM,KAAK;;;EAG9B"}
1
+ {"version":3,"file":"check.js","names":[],"sources":["../../src/commands/check.ts"],"mappings":";;;;;;AAWA,MAAM,SAA0C;CAC9C,QAAQ;EACN,eAAe;GACb,MAAM,WAAW,GAAG,UAAU;GAC9B,MAAM,UAAU,CACd,6HACD;AACD,WAAQ,UAAR;IACE,KAAK;AACH,aAAQ,KAAK,4DAA4D;AACzE,aAAQ,KAAK,yBAAyB;AACtC,aAAQ,KAAK,mEAAmE;AAChF;IAEF,KAAK;AACH,aAAQ,KAAK,oEAAoE;AACjF;IAEF,KAAK;AACH,aAAQ,KAAK,gEAAgE;AAC7E,aAAQ,KAAK,2EAA2E;AACxF,aAAQ,KAAK,+BAA+B;AAC5C,aAAQ,KAAK,0BAA0B;AACvC,aAAQ,KAAK,2BAA2B;AACxC;IAEF;AACE,aAAQ,KAAK,yBAAyB,WAAW;AACjD,aAAQ,KAAK,gEAAgE;AAC7E,aAAQ,KAAK,oEAAoE;AACjF;;AAGJ,UAAO;;EAET,OAAO,YAAY;AACjB,UAAO,IAAI,SAAS,SAAS,WAAW;AACtC,SAAK,oBAAoB,OAAY,QAAa,YAAiB;AACjE,SAAI,OAAO;AACT,aAAO,MAAM;AACb;;AAEF,aAAQ,OAAO;MACf;KACF;;EAEL;CAED,qBAAqB;EACnB,eAAe;GACb,MAAM,UAAU,CAAC,8DAA8D;AAE/E,WAAQ,KAAK,yCAAyC;AAEtD,WAAQ,KAAK,sCAAsC;AAEnD,WAAQ,KAAK,uDAAuD;AACpE,WAAQ,KAAK,+DAA+D;AAE5E,UAAO;;EAET,OAAO,YAAY;AACjB,UAAO,IAAI,SAAS,SAAS,WAAW;AACtC,SAAK,kCAAkC,OAAY,QAAa,YAAiB;AAC/E,SAAI,OAAO;AACT,aAAO,MAAM;AACb;;AAEF,aAAQ,OAAO;MACf;KACF;;EAEL;CACF;AAED,QACG,QAAQ,QAAQ,CAChB,YAAY,+CAA+C,CAC3D,OAAO,YAAY;AAClB,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MACH;EAEF,MAAM,UAAU,IAAI,YAAY,YAAY,CAAC,OAAO;AACpD,MAAI;AACF,SAAM,MAAM,OAAO;AACnB,WAAQ,QAAQ,MAAM,MAAM,QAAQ,cAAc,UAAU,WAAW,CAAC;WACjE,QAAQ;AACf,WAAQ,KAAK,MAAM,MAAM,MAAM,eAAe,UAAU,WAAW,CAAC;AACpE,WAAQ,OAAO,MAAM,MAAM,IAAI,MAAM,SAAS,CAAC,KAAK,OAAO,CAAC,CAAC;AAC7D,WAAQ,OAAO,MAAM,KAAK;;;EAG9B"}
@@ -19,12 +19,11 @@ import { inspect } from "node:util";
19
19
  import { RenderInfoSchema, getRenderInfo } from "@editframe/elements/node";
20
20
  import { parse } from "node-html-parser";
21
21
  import * as tar from "tar";
22
-
23
22
  //#region src/commands/cloud-render.ts
24
23
  const log = debug("ef:cli:render");
25
- const buildAssetId = async (srcDir, src, basename$1) => {
24
+ const buildAssetId = async (srcDir, src, basename) => {
26
25
  log(`Building image asset id for ${src}\n`);
27
- const syncStatus = new SyncStatus(join(srcDir, "assets", ".cache", await md5FilePath(path.join(srcDir, src)), basename$1));
26
+ const syncStatus = new SyncStatus(join(srcDir, "assets", ".cache", await md5FilePath(path.join(srcDir, src)), basename));
28
27
  const info = await syncStatus.readInfo();
29
28
  if (!info) throw new Error(`SyncStatus info is not found for ${syncStatus.infoPath}`);
30
29
  return info.id;
@@ -127,7 +126,7 @@ program.command("cloud-render [directory]").description("Render a directory's in
127
126
  process.stderr.write("\n");
128
127
  });
129
128
  });
130
-
131
129
  //#endregion
132
- export { };
130
+ export {};
131
+
133
132
  //# sourceMappingURL=cloud-render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-render.js","names":["basename","parseHTML"],"sources":["../../src/commands/cloud-render.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport path, { basename, join } from \"node:path\";\nimport { PassThrough } from \"node:stream\";\nimport { inspect } from \"node:util\";\nimport { createRender, uploadRender } from \"@editframe/api\";\nimport { md5Directory, md5FilePath } from \"@editframe/assets\";\nimport { getRenderInfo, RenderInfoSchema } from \"@editframe/elements/node\";\nimport { Option, program } from \"commander\";\nimport debug from \"debug\";\nimport { parse as parseHTML } from \"node-html-parser\";\nimport * as tar from \"tar\";\nimport { processRenderInfo } from \"../operations/processRenderInfo.js\";\nimport { SyncStatus } from \"../operations/syncAssetsDirectory/SyncStatus.js\";\nimport { syncAssetDirectory } from \"../operations/syncAssetsDirectory.js\";\nimport { createReadableStreamFromReadable } from \"../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../utils/index.js\";\nimport { launchBrowserAndWaitForSDK } from \"../utils/launchBrowserAndWaitForSDK.js\";\nimport { PreviewServer } from \"../utils/startPreviewServer.js\";\nimport { validateVideoResolution } from \"../utils/validateVideoResolution.js\";\nimport { withSpinner } from \"../utils/withSpinner.js\";\n\nconst log = debug(\"ef:cli:render\");\n\nexport const buildAssetId = async (srcDir: string, src: string, basename: string) => {\n log(`Building image asset id for ${src}\\n`);\n const assetPath = path.join(srcDir, src);\n const assetMd5 = await md5FilePath(assetPath);\n const syncStatus = new SyncStatus(join(srcDir, \"assets\", \".cache\", assetMd5, basename));\n const info = await syncStatus.readInfo();\n if (!info) {\n throw new Error(`SyncStatus info is not found for ${syncStatus.infoPath}`);\n }\n\n return info.id;\n};\n\nprogram\n .command(\"cloud-render [directory]\")\n .description(\"Render a directory's index.html file as a video in the editframe cloud\")\n .addOption(\n new Option(\"-s, --strategy <strategy>\", \"Render strategy\").choices([\"v1\"]).default(\"v1\"),\n )\n .action(async (directory, options) => {\n directory ??= \".\";\n\n // If running from the dev script (via tsx), ORIGINAL_CWD contains the user's actual directory\n const baseCwd = process.env.ORIGINAL_CWD || process.cwd();\n const resolvedDirectory = path.resolve(baseCwd, directory);\n\n await syncAssetDirectory(join(resolvedDirectory, \"src\", \"assets\", \".cache\"));\n\n const srcDir = path.join(resolvedDirectory, \"src\");\n const distDir = path.join(resolvedDirectory, \"dist\");\n await withSpinner(\"Building\\n\", async () => {\n try {\n await withSpinner(\"Building\\n\", async () => {\n spawnSync(\n \"npx\",\n // biome-ignore format: Grouping CLI arguments\n [\"vite\", \"build\", resolvedDirectory, \"--clearScreen\", \"false\", \"--logLevel\", \"debug\"],\n {\n stdio: \"inherit\",\n },\n );\n });\n } catch (error) {\n console.error(\"Build failed:\", error);\n }\n });\n\n const previewServer = await PreviewServer.start(distDir);\n process.stderr.write(\"Preview server started at:\");\n process.stderr.write(previewServer.url);\n process.stderr.write(\"\\n\");\n await launchBrowserAndWaitForSDK(\n {\n url: previewServer.url,\n efInteractive: false,\n interactive: false,\n headless: true,\n },\n async (page) => {\n const renderInfo = RenderInfoSchema.parse(await page.evaluate(getRenderInfo));\n\n validateVideoResolution({\n width: renderInfo.width,\n height: renderInfo.height,\n });\n\n await processRenderInfo(renderInfo);\n\n const doc = parseHTML(await readFile(path.join(distDir, \"index.html\"), \"utf-8\"));\n\n log(\"Building file IDs\");\n for (const element of doc.querySelectorAll(\"ef-image, ef-audio, ef-video\")) {\n log(`Processing ${element.tagName}`);\n if (element.hasAttribute(\"file-id\") || element.hasAttribute(\"asset-id\")) {\n log(\n `File ID for ${element.tagName} ${element.getAttribute(\"src\")} is ${element.getAttribute(\"file-id\") || element.getAttribute(\"asset-id\")}`,\n );\n continue;\n }\n const src = element.getAttribute(\"src\");\n if (!src) {\n log(`No src attribute for ${element.tagName}`);\n continue;\n }\n\n switch (element.tagName) {\n case \"EF-IMAGE\":\n element.setAttribute(\"file-id\", await buildAssetId(srcDir, src, basename(src)));\n break;\n case \"EF-AUDIO\":\n case \"EF-VIDEO\":\n element.setAttribute(\"file-id\", await buildAssetId(srcDir, src, \"isobmff\"));\n break;\n default:\n log(`Unknown element type: ${element.tagName}`);\n }\n }\n\n await writeFile(path.join(distDir, \"index.html\"), doc.toString());\n\n const md5 = await md5Directory(distDir);\n const render = await createRender(getClient(), {\n md5,\n width: renderInfo.width,\n height: renderInfo.height,\n fps: renderInfo.fps,\n duration_ms: renderInfo.durationMs,\n work_slice_ms: 4_000,\n strategy: options.strategy,\n });\n if (render?.status !== \"created\") {\n process.stderr.write(\n `Render is in '${render?.status}' status. It cannot be recreated while in this status.\\n`,\n );\n return;\n }\n /**\n * This tar stream is created with the dist directory as the root.\n * This is acheived by setting the cwd option to the dist directory.\n * And the files to be included in the tar stream are all files in the dist directory.\n *\n * The renderer expects to find the index.html file at the root of the tar stream.\n */\n const tarStream = tar.create(\n {\n gzip: true,\n cwd: distDir,\n },\n [\".\"],\n );\n const readable = new PassThrough();\n tarStream.pipe(readable);\n\n await uploadRender(getClient(), render.id, createReadableStreamFromReadable(readable));\n process.stderr.write(\"Render assets uploaded\\n\");\n process.stderr.write(inspect(render));\n process.stderr.write(\"\\n\");\n },\n );\n });\n"],"mappings":"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"}
1
+ {"version":3,"file":"cloud-render.js","names":["parseHTML"],"sources":["../../src/commands/cloud-render.ts"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import { program } from "commander";
2
2
  import path from "node:path";
3
3
  import { spawn } from "node:child_process";
4
-
5
4
  //#region src/commands/preview.ts
6
5
  program.command("preview [directory]").description("Preview a directory's index.html file").action(async (projectDirectory = ".") => {
7
6
  const baseCwd = process.env.ORIGINAL_CWD || process.cwd();
@@ -11,7 +10,7 @@ program.command("preview [directory]").description("Preview a directory's index.
11
10
  stdio: "inherit"
12
11
  });
13
12
  });
14
-
15
13
  //#endregion
16
- export { };
14
+ export {};
15
+
17
16
  //# sourceMappingURL=preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","names":[],"sources":["../../src/commands/preview.ts"],"sourcesContent":["import path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { program } from \"commander\";\n\nprogram\n .command(\"preview [directory]\")\n .description(\"Preview a directory's index.html file\")\n .action(async (projectDirectory = \".\") => {\n // If running from the dev script (via tsx), ORIGINAL_CWD contains the user's actual directory\n // Resolve projectDirectory relative to where the user actually ran the command\n const baseCwd = process.env.ORIGINAL_CWD || process.cwd();\n const resolvedProjectDir = path.resolve(baseCwd, projectDirectory);\n\n spawn(\"npx\", [\"vite\", \"dev\"], {\n cwd: resolvedProjectDir,\n shell: true,\n stdio: \"inherit\",\n });\n });\n"],"mappings":";;;;;AAIA,QACG,QAAQ,sBAAsB,CAC9B,YAAY,wCAAwC,CACpD,OAAO,OAAO,mBAAmB,QAAQ;CAGxC,MAAM,UAAU,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;AAGzD,OAAM,OAAO,CAAC,QAAQ,MAAM,EAAE;EAC5B,KAHyB,KAAK,QAAQ,SAAS,iBAAiB;EAIhE,OAAO;EACP,OAAO;EACR,CAAC;EACF"}
1
+ {"version":3,"file":"preview.js","names":[],"sources":["../../src/commands/preview.ts"],"mappings":";;;;AAIA,QACG,QAAQ,sBAAsB,CAC9B,YAAY,wCAAwC,CACpD,OAAO,OAAO,mBAAmB,QAAQ;CAGxC,MAAM,UAAU,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;AAGzD,OAAM,OAAO,CAAC,QAAQ,MAAM,EAAE;EAC5B,KAHyB,KAAK,QAAQ,SAAS,iBAAiB;EAIhE,OAAO;EACP,OAAO;EACR,CAAC;EACF"}
@@ -2,7 +2,6 @@ import { getClient } from "../utils/index.js";
2
2
  import { program } from "commander";
3
3
  import ora from "ora";
4
4
  import { getFileDetail, getFileProcessingProgress, upload } from "@editframe/api/node";
5
-
6
5
  //#region src/commands/process-file.ts
7
6
  program.command("process-file <file>").description("Upload a audio/video to Editframe for processing.").action(async (path) => {
8
7
  const client = getClient();
@@ -24,7 +23,7 @@ program.command("process-file <file>").description("Upload a audio/video to Edit
24
23
  console.log("Processed file info");
25
24
  console.log(detail);
26
25
  });
27
-
28
26
  //#endregion
29
- export { };
27
+ export {};
28
+
30
29
  //# sourceMappingURL=process-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-file.js","names":[],"sources":["../../src/commands/process-file.ts"],"sourcesContent":["import { upload, getFileProcessingProgress, getFileDetail } from \"@editframe/api/node\";\nimport { program } from \"commander\";\nimport ora from \"ora\";\nimport { getClient } from \"../utils/index.js\";\n\nprogram\n .command(\"process-file <file>\")\n .description(\"Upload a audio/video to Editframe for processing.\")\n .action(async (path: string) => {\n const client = getClient();\n\n const uploadSpinner = ora(\"Creating file and uploading\").start();\n\n const { file, uploadIterator } = await upload(client, path);\n\n for await (const event of uploadIterator) {\n uploadSpinner.text = `Uploading file: ${(100 * event.progress).toFixed(2)}%`;\n }\n uploadSpinner.succeed(\"Upload complete\");\n\n if (file.type !== \"video\") {\n console.log(`File type \"${file.type}\" does not require processing.`);\n console.log(\"File ID:\", file.id);\n return;\n }\n\n const processSpinner = ora(\"Waiting for processing to complete\");\n processSpinner.start();\n const progress = await getFileProcessingProgress(client, file.id);\n\n for await (const event of progress) {\n if (event.type === \"progress\") {\n processSpinner.text = `Processing: ${(100 * event.data.progress).toFixed(2)}%`;\n } else if (event.type === \"complete\") {\n processSpinner.succeed(\"Processing complete\");\n }\n }\n\n const detail = await getFileDetail(client, file.id);\n\n console.log(\"Processed file info\");\n console.log(detail);\n });\n"],"mappings":";;;;;;AAKA,QACG,QAAQ,sBAAsB,CAC9B,YAAY,oDAAoD,CAChE,OAAO,OAAO,SAAiB;CAC9B,MAAM,SAAS,WAAW;CAE1B,MAAM,gBAAgB,IAAI,8BAA8B,CAAC,OAAO;CAEhE,MAAM,EAAE,MAAM,mBAAmB,MAAM,OAAO,QAAQ,KAAK;AAE3D,YAAW,MAAM,SAAS,eACxB,eAAc,OAAO,oBAAoB,MAAM,MAAM,UAAU,QAAQ,EAAE,CAAC;AAE5E,eAAc,QAAQ,kBAAkB;AAExC,KAAI,KAAK,SAAS,SAAS;AACzB,UAAQ,IAAI,cAAc,KAAK,KAAK,gCAAgC;AACpE,UAAQ,IAAI,YAAY,KAAK,GAAG;AAChC;;CAGF,MAAM,iBAAiB,IAAI,qCAAqC;AAChE,gBAAe,OAAO;CACtB,MAAM,WAAW,MAAM,0BAA0B,QAAQ,KAAK,GAAG;AAEjE,YAAW,MAAM,SAAS,SACxB,KAAI,MAAM,SAAS,WACjB,gBAAe,OAAO,gBAAgB,MAAM,MAAM,KAAK,UAAU,QAAQ,EAAE,CAAC;UACnE,MAAM,SAAS,WACxB,gBAAe,QAAQ,sBAAsB;CAIjD,MAAM,SAAS,MAAM,cAAc,QAAQ,KAAK,GAAG;AAEnD,SAAQ,IAAI,sBAAsB;AAClC,SAAQ,IAAI,OAAO;EACnB"}
1
+ {"version":3,"file":"process-file.js","names":[],"sources":["../../src/commands/process-file.ts"],"mappings":";;;;;AAKA,QACG,QAAQ,sBAAsB,CAC9B,YAAY,oDAAoD,CAChE,OAAO,OAAO,SAAiB;CAC9B,MAAM,SAAS,WAAW;CAE1B,MAAM,gBAAgB,IAAI,8BAA8B,CAAC,OAAO;CAEhE,MAAM,EAAE,MAAM,mBAAmB,MAAM,OAAO,QAAQ,KAAK;AAE3D,YAAW,MAAM,SAAS,eACxB,eAAc,OAAO,oBAAoB,MAAM,MAAM,UAAU,QAAQ,EAAE,CAAC;AAE5E,eAAc,QAAQ,kBAAkB;AAExC,KAAI,KAAK,SAAS,SAAS;AACzB,UAAQ,IAAI,cAAc,KAAK,KAAK,gCAAgC;AACpE,UAAQ,IAAI,YAAY,KAAK,GAAG;AAChC;;CAGF,MAAM,iBAAiB,IAAI,qCAAqC;AAChE,gBAAe,OAAO;CACtB,MAAM,WAAW,MAAM,0BAA0B,QAAQ,KAAK,GAAG;AAEjE,YAAW,MAAM,SAAS,SACxB,KAAI,MAAM,SAAS,WACjB,gBAAe,OAAO,gBAAgB,MAAM,MAAM,KAAK,UAAU,QAAQ,EAAE,CAAC;UACnE,MAAM,SAAS,WACxB,gBAAe,QAAQ,sBAAsB;CAIjD,MAAM,SAAS,MAAM,cAAc,QAAQ,KAAK,GAAG;AAEnD,SAAQ,IAAI,sBAAsB;AAClC,SAAQ,IAAI,OAAO;EACnB"}
@@ -6,7 +6,6 @@ import { program } from "commander";
6
6
  import path from "node:path";
7
7
  import { spawnSync } from "node:child_process";
8
8
  import { getRenderInfo } from "@editframe/elements/node";
9
-
10
9
  //#region src/commands/process.ts
11
10
  program.command("process [directory]").description("Process's a directory's index.html file, analyzing assets and processing them for rendering").action(async (directory) => {
12
11
  directory ??= ".";
@@ -33,7 +32,7 @@ program.command("process [directory]").description("Process's a directory's inde
33
32
  await processRenderInfo(await page.evaluate(getRenderInfo));
34
33
  });
35
34
  });
36
-
37
35
  //#endregion
38
- export { };
36
+ export {};
37
+
39
38
  //# sourceMappingURL=process.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","names":[],"sources":["../../src/commands/process.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport { getRenderInfo } from \"@editframe/elements/node\";\nimport { program } from \"commander\";\nimport { processRenderInfo } from \"../operations/processRenderInfo.js\";\nimport { launchBrowserAndWaitForSDK } from \"../utils/launchBrowserAndWaitForSDK.js\";\nimport { PreviewServer } from \"../utils/startPreviewServer.js\";\nimport { withSpinner } from \"../utils/withSpinner.js\";\n\nprogram\n .command(\"process [directory]\")\n .description(\n \"Process's a directory's index.html file, analyzing assets and processing them for rendering\",\n )\n .action(async (directory) => {\n directory ??= \".\";\n\n // If running from the dev script (via tsx), ORIGINAL_CWD contains the user's actual directory\n const baseCwd = process.env.ORIGINAL_CWD || process.cwd();\n const resolvedDirectory = path.resolve(baseCwd, directory);\n\n const distDir = path.join(resolvedDirectory, \"dist\");\n await withSpinner(\"Building\\n\", async () => {\n spawnSync(\"npx\", [\"vite\", \"build\", resolvedDirectory], {\n stdio: \"inherit\",\n });\n });\n\n const previewServer = await PreviewServer.start(distDir);\n process.stderr.write(\"Preview server started at \");\n process.stderr.write(previewServer.url);\n process.stderr.write(\"\\n\");\n await launchBrowserAndWaitForSDK(\n {\n url: previewServer.url,\n efInteractive: false,\n interactive: false,\n headless: true,\n },\n async (page) => {\n const renderInfo = await page.evaluate(getRenderInfo);\n await processRenderInfo(renderInfo);\n },\n );\n });\n"],"mappings":";;;;;;;;;;AASA,QACG,QAAQ,sBAAsB,CAC9B,YACC,8FACD,CACA,OAAO,OAAO,cAAc;AAC3B,eAAc;CAGd,MAAM,UAAU,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;CACzD,MAAM,oBAAoB,KAAK,QAAQ,SAAS,UAAU;CAE1D,MAAM,UAAU,KAAK,KAAK,mBAAmB,OAAO;AACpD,OAAM,YAAY,cAAc,YAAY;AAC1C,YAAU,OAAO;GAAC;GAAQ;GAAS;GAAkB,EAAE,EACrD,OAAO,WACR,CAAC;GACF;CAEF,MAAM,gBAAgB,MAAM,cAAc,MAAM,QAAQ;AACxD,SAAQ,OAAO,MAAM,6BAA6B;AAClD,SAAQ,OAAO,MAAM,cAAc,IAAI;AACvC,SAAQ,OAAO,MAAM,KAAK;AAC1B,OAAM,2BACJ;EACE,KAAK,cAAc;EACnB,eAAe;EACf,aAAa;EACb,UAAU;EACX,EACD,OAAO,SAAS;AAEd,QAAM,kBADa,MAAM,KAAK,SAAS,cAAc,CAClB;GAEtC;EACD"}
1
+ {"version":3,"file":"process.js","names":[],"sources":["../../src/commands/process.ts"],"mappings":";;;;;;;;;AASA,QACG,QAAQ,sBAAsB,CAC9B,YACC,8FACD,CACA,OAAO,OAAO,cAAc;AAC3B,eAAc;CAGd,MAAM,UAAU,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;CACzD,MAAM,oBAAoB,KAAK,QAAQ,SAAS,UAAU;CAE1D,MAAM,UAAU,KAAK,KAAK,mBAAmB,OAAO;AACpD,OAAM,YAAY,cAAc,YAAY;AAC1C,YAAU,OAAO;GAAC;GAAQ;GAAS;GAAkB,EAAE,EACrD,OAAO,WACR,CAAC;GACF;CAEF,MAAM,gBAAgB,MAAM,cAAc,MAAM,QAAQ;AACxD,SAAQ,OAAO,MAAM,6BAA6B;AAClD,SAAQ,OAAO,MAAM,cAAc,IAAI;AACvC,SAAQ,OAAO,MAAM,KAAK;AAC1B,OAAM,2BACJ;EACE,KAAK,cAAc;EACnB,eAAe;EACf,aAAa;EACb,UAAU;EACX,EACD,OAAO,SAAS;AAEd,QAAM,kBADa,MAAM,KAAK,SAAS,cAAc,CAClB;GAEtC;EACD"}
@@ -9,7 +9,6 @@ import ora from "ora";
9
9
  import path from "node:path";
10
10
  import { readFile } from "node:fs/promises";
11
11
  import { createWriteStream, mkdirSync } from "node:fs";
12
-
13
12
  //#region src/commands/render.ts
14
13
  const log = debug("ef:cli:render");
15
14
  async function sendTelemetry(efRenderHost, token, payload) {
@@ -168,10 +167,10 @@ program.command("render [directory]").description("Render a video composition lo
168
167
  throw error;
169
168
  }
170
169
  outputStream.end();
171
- await new Promise((resolve$1, reject) => {
170
+ await new Promise((resolve, reject) => {
172
171
  outputStream.on("finish", () => {
173
172
  log(`Render complete: ${chunkCount} chunks, ${totalBytes} bytes written to ${outputPath}`);
174
- resolve$1();
173
+ resolve();
175
174
  });
176
175
  outputStream.on("error", reject);
177
176
  });
@@ -188,7 +187,7 @@ program.command("render [directory]").description("Render a video composition lo
188
187
  }
189
188
  process.stderr.write(`\nRender complete: ${outputPath}\n`);
190
189
  });
191
-
192
190
  //#endregion
193
- export { };
191
+ export {};
192
+
194
193
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","names":["token: string | undefined","efRenderHost: string","renderData: Record<string, unknown> | undefined","renderUrl: string","viteServer: SpawnedViteServer | null","lastProgress: {\n currentFrame: number;\n totalFrames: number;\n renderedMs: number;\n totalDurationMs: number;\n elapsedMs: number;\n speedMultiplier: number;\n } | null","renderInfo: any","renderOptions: any"],"sources":["../../src/commands/render.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { createWriteStream, mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { program } from \"commander\";\nimport debug from \"debug\";\nimport ora from \"ora\";\nimport { launchBrowserAndWaitForSDK } from \"../utils/launchBrowserAndWaitForSDK.js\";\nimport { spawnViteServer, type SpawnedViteServer } from \"../utils/spawnViteServer.js\";\nimport { patchFragmentedMp4 } from \"../utils/patchFragmentedMp4.js\";\nimport { StreamTargetChunk } from \"mediabunny\";\nimport { withProfiling } from \"../utils/profileRender.js\";\nimport { VERSION } from \"../VERSION.js\";\n\ndeclare global {\n interface Window {\n EF_RENDER_DATA: any;\n EF_RENDER: any;\n }\n}\n\nconst log = debug(\"ef:cli:render\");\n\nexport async function sendTelemetry(\n efRenderHost: string,\n token: string | undefined,\n payload: Record<string, unknown>,\n): Promise<void> {\n if (process.env.EF_NO_TELEMETRY) return;\n try {\n await fetch(`${efRenderHost}/api/v1/telemetry`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(token && { Authorization: `Bearer ${token}` }),\n },\n body: JSON.stringify(payload),\n });\n } catch {\n // Telemetry must never fail the render — swallow all errors.\n }\n}\n\n/**\n * Format milliseconds as MM:SS or HH:MM:SS\n */\nfunction formatTime(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, \"0\")}:${seconds.toString().padStart(2, \"0\")}`;\n }\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`;\n}\n\nprogram\n .command(\"render [directory]\")\n .description(\"Render a video composition locally\")\n .option(\"-o, --output <path>\", \"Output file path\", \"output.mp4\")\n .option(\"--url <url>\", \"URL to render (bypasses directory/server startup)\")\n .option(\"-d, --data <json>\", \"Custom render data (JSON string)\")\n .option(\"--data-file <path>\", \"Custom render data from JSON file\")\n .option(\"--fps <number>\", \"Frame rate\", \"30\")\n .option(\"--scale <number>\", \"Resolution scale (0-1)\", \"1\")\n .option(\"--include-audio\", \"Include audio track\", true)\n .option(\"--no-include-audio\", \"Exclude audio track\")\n .option(\"--from-ms <number>\", \"Start time in milliseconds\")\n .option(\"--to-ms <number>\", \"End time in milliseconds\")\n .option(\"--experimental-native-render\", \"Use experimental canvas capture API (faster)\")\n .option(\"--profile\", \"Enable CPU profiling\")\n .option(\"--profile-output <path>\", \"Profile output path\", \"./render-profile.cpuprofile\")\n .action(async (directory = \".\", options) => {\n const programOpts = program.opts();\n const token: string | undefined = programOpts.token || process.env.EF_TOKEN;\n const efRenderHost: string =\n programOpts.efRenderHost || process.env.EF_RENDER_HOST || \"https://editframe.com\";\n\n // If running from the dev script (via tsx), ORIGINAL_CWD contains the user's actual directory\n const baseCwd = process.env.ORIGINAL_CWD || process.cwd();\n const outputPath = path.resolve(baseCwd, options.output);\n\n // Parse custom data if provided\n let renderData: Record<string, unknown> | undefined;\n if (options.dataFile) {\n const dataFileContent = await readFile(options.dataFile, \"utf-8\");\n renderData = JSON.parse(dataFileContent);\n log(\"Loaded render data from file:\", options.dataFile);\n } else if (options.data) {\n renderData = JSON.parse(options.data);\n log(\"Using render data from --data option\");\n }\n\n // Parse numeric options\n const fps = parseInt(options.fps, 10);\n const scale = parseFloat(options.scale);\n const fromMs = options.fromMs ? parseInt(options.fromMs, 10) : undefined;\n const toMs = options.toMs ? parseInt(options.toMs, 10) : undefined;\n\n // Single initialization spinner for all setup steps\n const initSpinner = ora(\"Initializing...\").start();\n\n let renderUrl: string;\n let viteServer: SpawnedViteServer | null = null;\n let renderStarted = false;\n\n try {\n // Determine URL to render\n if (options.url) {\n // Use provided URL directly\n renderUrl = options.url;\n log(\"Using provided URL:\", renderUrl);\n } else {\n // Spawn Vite dev server as subprocess\n // This allows Vite to run with full config resolution (including Tailwind)\n // while we maintain Playwright control for rendering\n const srcDir = path.resolve(baseCwd, directory);\n viteServer = await spawnViteServer(srcDir);\n renderUrl = viteServer.url;\n log(\"Vite server spawned at:\", renderUrl);\n }\n\n // Launch browser and load SDK (all within initialization)\n await launchBrowserAndWaitForSDK(\n {\n url: renderUrl,\n headless: true,\n interactive: false,\n efInteractive: false,\n nativeRender: options.experimentalNativeRender === true,\n profile: options.profile === true,\n profileOutput: options.profileOutput,\n silent: true, // Suppress individual spinners since we show unified \"Initializing...\"\n },\n async (page) => {\n initSpinner.succeed(\"Ready\");\n\n // Now handle the render\n await withProfiling(\n page,\n {\n enabled: options.profile === true,\n outputPath: options.profileOutput,\n },\n async () => {\n // Ensure output directory exists\n mkdirSync(path.dirname(outputPath), { recursive: true });\n\n // Open output file for streaming writes\n const outputStream = createWriteStream(outputPath);\n let chunkCount = 0;\n let totalBytes = 0;\n\n // Expose chunk handler - writes through the stream in order\n await page.exposeFunction(\"onRenderChunk\", (chunk: StreamTargetChunk) => {\n outputStream.write(Buffer.from(chunk.data));\n chunkCount++;\n totalBytes += chunk.data.length;\n log(\n `Received chunk ${chunkCount}: ${chunk.data.length} bytes (total: ${totalBytes} bytes)`,\n );\n });\n\n // Set custom render data if provided\n if (renderData) {\n await page.evaluate((data) => {\n window.EF_RENDER_DATA = data;\n }, renderData);\n log(\"Set EF_RENDER_DATA:\", renderData);\n }\n\n // Wait for EF_RENDER API to be available\n await page.waitForFunction(() => typeof window.EF_RENDER !== \"undefined\", {\n timeout: 10_000,\n });\n\n // Check if ready\n const isReady = await page.evaluate(() => window.EF_RENDER?.isReady());\n if (!isReady) {\n throw new Error(\"Render API is not ready. No ef-timegroup found.\");\n }\n\n // Create progress spinner\n const progressSpinner = ora(\"Rendering video...\").start();\n\n // Track last progress for completion message\n let lastProgress: {\n currentFrame: number;\n totalFrames: number;\n renderedMs: number;\n totalDurationMs: number;\n elapsedMs: number;\n speedMultiplier: number;\n } | null = null;\n\n // Expose progress callback\n await page.exposeFunction(\n \"onRenderProgress\",\n (progress: {\n progress: number;\n currentFrame: number;\n totalFrames: number;\n renderedMs: number;\n totalDurationMs: number;\n elapsedMs: number;\n estimatedRemainingMs: number;\n speedMultiplier: number;\n }) => {\n const percent = (progress.progress * 100).toFixed(1);\n const renderedTime = formatTime(progress.renderedMs);\n const totalTime = formatTime(progress.totalDurationMs);\n const remainingTime = formatTime(progress.estimatedRemainingMs);\n const speed = progress.speedMultiplier.toFixed(2);\n\n progressSpinner.text = `Rendering: ${progress.currentFrame}/${progress.totalFrames} frames (${percent}%) | ${renderedTime}/${totalTime} | ${remainingTime} remaining | ${speed}x speed`;\n\n // Store last progress for completion message\n lastProgress = {\n currentFrame: progress.currentFrame,\n totalFrames: progress.totalFrames,\n renderedMs: progress.renderedMs,\n totalDurationMs: progress.totalDurationMs,\n elapsedMs: progress.elapsedMs,\n speedMultiplier: progress.speedMultiplier,\n };\n },\n );\n\n // Render with streaming\n renderStarted = true;\n let renderInfo: any = null;\n try {\n const renderOptions: any = {\n fps,\n scale,\n includeAudio: options.includeAudio !== false,\n };\n\n if (fromMs !== undefined) {\n renderOptions.fromMs = fromMs;\n }\n if (toMs !== undefined) {\n renderOptions.toMs = toMs;\n }\n\n const renderStartTime = Date.now();\n await page.evaluate(async (opts) => {\n await window.EF_RENDER!.renderStreaming(opts);\n }, renderOptions);\n const renderDurationMs = Date.now() - renderStartTime;\n\n // Collect render info for telemetry and moov patching\n renderInfo = await page.evaluate(async () => {\n try {\n return await window.EF_RENDER!.getRenderInfo();\n } catch {\n return null;\n }\n });\n\n // Build completion message with performance stats\n if (lastProgress) {\n const p = lastProgress as {\n currentFrame: number;\n totalFrames: number;\n renderedMs: number;\n totalDurationMs: number;\n elapsedMs: number;\n speedMultiplier: number;\n };\n const renderedTime = formatTime(p.renderedMs);\n const totalTime = formatTime(p.totalDurationMs);\n const elapsedTime = formatTime(p.elapsedMs);\n const speed = p.speedMultiplier.toFixed(2);\n progressSpinner.succeed(\n `Render complete: ${p.currentFrame}/${p.totalFrames} frames | ${renderedTime}/${totalTime} | ${elapsedTime} elapsed | ${speed}x speed`,\n );\n } else {\n progressSpinner.succeed(\"Render complete\");\n }\n\n // Send telemetry (fire-and-forget)\n void sendTelemetry(efRenderHost, token, {\n render_path: \"cli\",\n duration_ms: renderDurationMs,\n ...(renderInfo?.width != null && { width: renderInfo.width }),\n ...(renderInfo?.height != null && {\n height: renderInfo.height,\n }),\n ...(renderInfo?.fps != null && { fps: renderInfo.fps }),\n feature_usage: {\n efMediaCount: renderInfo ? Object.keys(renderInfo.assets.efMedia).length : 0,\n efImageCount: renderInfo?.assets.efImage.length ?? 0,\n efCaptionsCount: renderInfo?.assets.efCaptions.length ?? 0,\n efTextCount: 0,\n },\n cli_version: VERSION,\n });\n } catch (error) {\n progressSpinner.fail(\"Render failed\");\n throw error;\n }\n\n // Close the output stream and wait for all chunks to flush\n outputStream.end();\n await new Promise<void>((resolve, reject) => {\n outputStream.on(\"finish\", () => {\n log(\n `Render complete: ${chunkCount} chunks, ${totalBytes} bytes written to ${outputPath}`,\n );\n resolve();\n });\n outputStream.on(\"error\", reject);\n });\n\n if (renderInfo?.durationMs) {\n await patchFragmentedMp4(outputPath, renderInfo.durationMs);\n }\n },\n );\n },\n );\n } catch (error) {\n if (!renderStarted) {\n initSpinner.fail(\"Initialization failed\");\n }\n throw error;\n }\n\n // Clean up spawned Vite process\n if (viteServer) {\n viteServer.kill();\n log(\"Vite server stopped\");\n }\n\n process.stderr.write(`\\nRender complete: ${outputPath}\\n`);\n });\n"],"mappings":"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"}
1
+ {"version":3,"file":"render.js","names":[],"sources":["../../src/commands/render.ts"],"mappings":"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"}
@@ -1,13 +1,12 @@
1
1
  import { syncAssetDirectory } from "../operations/syncAssetsDirectory.js";
2
2
  import { program } from "commander";
3
3
  import path, { join } from "node:path";
4
-
5
4
  //#region src/commands/sync.ts
6
5
  program.command("sync").description("Sync assets to Editframe servers for rendering").argument("[directory]", "Path to project directory to sync.").action(async (directory = ".") => {
7
6
  const baseCwd = process.env.ORIGINAL_CWD || process.cwd();
8
7
  await syncAssetDirectory(join(path.resolve(baseCwd, directory), "src", "assets", ".cache"));
9
8
  });
10
-
11
9
  //#endregion
12
- export { };
10
+ export {};
11
+
13
12
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","names":[],"sources":["../../src/commands/sync.ts"],"sourcesContent":["import path, { join } from \"node:path\";\nimport { program } from \"commander\";\nimport { syncAssetDirectory } from \"../operations/syncAssetsDirectory.js\";\n\nprogram\n .command(\"sync\")\n .description(\"Sync assets to Editframe servers for rendering\")\n .argument(\"[directory]\", \"Path to project directory to sync.\")\n .action(async (directory = \".\") => {\n // If running from the dev script (via tsx), ORIGINAL_CWD contains the user's actual directory\n const baseCwd = process.env.ORIGINAL_CWD || process.cwd();\n const resolvedDirectory = path.resolve(baseCwd, directory);\n\n await syncAssetDirectory(join(resolvedDirectory, \"src\", \"assets\", \".cache\"));\n });\n"],"mappings":";;;;;AAIA,QACG,QAAQ,OAAO,CACf,YAAY,iDAAiD,CAC7D,SAAS,eAAe,qCAAqC,CAC7D,OAAO,OAAO,YAAY,QAAQ;CAEjC,MAAM,UAAU,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;AAGzD,OAAM,mBAAmB,KAFC,KAAK,QAAQ,SAAS,UAAU,EAET,OAAO,UAAU,SAAS,CAAC;EAC5E"}
1
+ {"version":3,"file":"sync.js","names":[],"sources":["../../src/commands/sync.ts"],"mappings":";;;;AAIA,QACG,QAAQ,OAAO,CACf,YAAY,iDAAiD,CAC7D,SAAS,eAAe,qCAAqC,CAC7D,OAAO,OAAO,YAAY,QAAQ;CAEjC,MAAM,UAAU,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;AAGzD,OAAM,mBAAmB,KAFC,KAAK,QAAQ,SAAS,UAAU,EAET,OAAO,UAAU,SAAS,CAAC;EAC5E"}
@@ -4,7 +4,6 @@ import ora from "ora";
4
4
  import { resolve } from "node:path";
5
5
  import { writeFile } from "node:fs/promises";
6
6
  import { generateCaptionDataFromPath } from "@editframe/assets";
7
-
8
7
  //#region src/commands/transcribe.ts
9
8
  program.command("transcribe <input>").description("Generate captions from audio/video file using whisper_timestamped").option("-o, --output <file>", "Output JSON file", "captions.json").option("-l, --language <lang>", "Language code (e.g., en, es, fr)", "en").action(async (input, options) => {
10
9
  const spinner = ora("Generating captions...").start();
@@ -31,7 +30,7 @@ program.command("transcribe <input>").description("Generate captions from audio/
31
30
  process.exit(1);
32
31
  }
33
32
  });
34
-
35
33
  //#endregion
36
- export { };
34
+ export {};
35
+
37
36
  //# sourceMappingURL=transcribe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcribe.js","names":[],"sources":["../../src/commands/transcribe.ts"],"sourcesContent":["import { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { program } from \"commander\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport { generateCaptionDataFromPath } from \"@editframe/assets\";\n\nprogram\n .command(\"transcribe <input>\")\n .description(\"Generate captions from audio/video file using whisper_timestamped\")\n .option(\"-o, --output <file>\", \"Output JSON file\", \"captions.json\")\n .option(\"-l, --language <lang>\", \"Language code (e.g., en, es, fr)\", \"en\")\n .action(async (input: string, options: { output: string; language: string }) => {\n const spinner = ora(\"Generating captions...\").start();\n\n try {\n const absoluteInput = resolve(input);\n const absoluteOutput = resolve(options.output);\n\n spinner.text = `Transcribing ${input}...`;\n\n // Generate captions using the same function as the vite plugin\n const captionData = await generateCaptionDataFromPath(absoluteInput);\n\n spinner.text = `Writing captions to ${options.output}...`;\n await writeFile(absoluteOutput, captionData, \"utf-8\");\n\n spinner.succeed(chalk.green(`✓ Captions generated successfully: ${options.output}`));\n\n // Parse to show stats\n const parsed = JSON.parse(captionData);\n console.log(chalk.dim(` ${parsed.segments.length} segments`));\n console.log(chalk.dim(` ${parsed.word_segments.length} words`));\n } catch (error) {\n spinner.fail(chalk.red(\"Failed to generate captions\"));\n\n if ((error as Error).message.includes(\"whisper_timestamped\")) {\n console.error(chalk.red(\"\\nwhisper_timestamped is not installed or not in PATH\"));\n console.error(chalk.yellow(\"\\nInstall it with:\"));\n console.error(chalk.white(\" pip3 install whisper-timestamped\"));\n console.error(chalk.dim(\"\\nOr check installation instructions at:\"));\n console.error(chalk.dim(\" https://github.com/linto-ai/whisper-timestamped#installation\"));\n } else {\n console.error(chalk.red(`\\n${(error as Error).message}`));\n }\n\n process.exit(1);\n }\n });\n"],"mappings":";;;;;;;;AAOA,QACG,QAAQ,qBAAqB,CAC7B,YAAY,oEAAoE,CAChF,OAAO,uBAAuB,oBAAoB,gBAAgB,CAClE,OAAO,yBAAyB,oCAAoC,KAAK,CACzE,OAAO,OAAO,OAAe,YAAkD;CAC9E,MAAM,UAAU,IAAI,yBAAyB,CAAC,OAAO;AAErD,KAAI;EACF,MAAM,gBAAgB,QAAQ,MAAM;EACpC,MAAM,iBAAiB,QAAQ,QAAQ,OAAO;AAE9C,UAAQ,OAAO,gBAAgB,MAAM;EAGrC,MAAM,cAAc,MAAM,4BAA4B,cAAc;AAEpE,UAAQ,OAAO,uBAAuB,QAAQ,OAAO;AACrD,QAAM,UAAU,gBAAgB,aAAa,QAAQ;AAErD,UAAQ,QAAQ,MAAM,MAAM,sCAAsC,QAAQ,SAAS,CAAC;EAGpF,MAAM,SAAS,KAAK,MAAM,YAAY;AACtC,UAAQ,IAAI,MAAM,IAAI,KAAK,OAAO,SAAS,OAAO,WAAW,CAAC;AAC9D,UAAQ,IAAI,MAAM,IAAI,KAAK,OAAO,cAAc,OAAO,QAAQ,CAAC;UACzD,OAAO;AACd,UAAQ,KAAK,MAAM,IAAI,8BAA8B,CAAC;AAEtD,MAAK,MAAgB,QAAQ,SAAS,sBAAsB,EAAE;AAC5D,WAAQ,MAAM,MAAM,IAAI,wDAAwD,CAAC;AACjF,WAAQ,MAAM,MAAM,OAAO,qBAAqB,CAAC;AACjD,WAAQ,MAAM,MAAM,MAAM,qCAAqC,CAAC;AAChE,WAAQ,MAAM,MAAM,IAAI,2CAA2C,CAAC;AACpE,WAAQ,MAAM,MAAM,IAAI,iEAAiE,CAAC;QAE1F,SAAQ,MAAM,MAAM,IAAI,KAAM,MAAgB,UAAU,CAAC;AAG3D,UAAQ,KAAK,EAAE;;EAEjB"}
1
+ {"version":3,"file":"transcribe.js","names":[],"sources":["../../src/commands/transcribe.ts"],"mappings":";;;;;;;AAOA,QACG,QAAQ,qBAAqB,CAC7B,YAAY,oEAAoE,CAChF,OAAO,uBAAuB,oBAAoB,gBAAgB,CAClE,OAAO,yBAAyB,oCAAoC,KAAK,CACzE,OAAO,OAAO,OAAe,YAAkD;CAC9E,MAAM,UAAU,IAAI,yBAAyB,CAAC,OAAO;AAErD,KAAI;EACF,MAAM,gBAAgB,QAAQ,MAAM;EACpC,MAAM,iBAAiB,QAAQ,QAAQ,OAAO;AAE9C,UAAQ,OAAO,gBAAgB,MAAM;EAGrC,MAAM,cAAc,MAAM,4BAA4B,cAAc;AAEpE,UAAQ,OAAO,uBAAuB,QAAQ,OAAO;AACrD,QAAM,UAAU,gBAAgB,aAAa,QAAQ;AAErD,UAAQ,QAAQ,MAAM,MAAM,sCAAsC,QAAQ,SAAS,CAAC;EAGpF,MAAM,SAAS,KAAK,MAAM,YAAY;AACtC,UAAQ,IAAI,MAAM,IAAI,KAAK,OAAO,SAAS,OAAO,WAAW,CAAC;AAC9D,UAAQ,IAAI,MAAM,IAAI,KAAK,OAAO,cAAc,OAAO,QAAQ,CAAC;UACzD,OAAO;AACd,UAAQ,KAAK,MAAM,IAAI,8BAA8B,CAAC;AAEtD,MAAK,MAAgB,QAAQ,SAAS,sBAAsB,EAAE;AAC5D,WAAQ,MAAM,MAAM,IAAI,wDAAwD,CAAC;AACjF,WAAQ,MAAM,MAAM,OAAO,qBAAqB,CAAC;AACjD,WAAQ,MAAM,MAAM,MAAM,qCAAqC,CAAC;AAChE,WAAQ,MAAM,MAAM,IAAI,2CAA2C,CAAC;AACpE,WAAQ,MAAM,MAAM,IAAI,iEAAiE,CAAC;QAE1F,SAAQ,MAAM,MAAM,IAAI,KAAM,MAAgB,UAAU,CAAC;AAG3D,UAAQ,KAAK,EAAE;;EAEjB"}
@@ -4,7 +4,6 @@ import chalk from "chalk";
4
4
  import debug from "debug";
5
5
  import ora from "ora";
6
6
  import { input, select } from "@inquirer/prompts";
7
-
8
7
  //#region src/commands/webhook.ts
9
8
  const log = debug("ef:cli:auth");
10
9
  const topics = [
@@ -30,9 +29,9 @@ const webhookCommand = program.command("webhook").description("Test webhook URL
30
29
  if (!webhookURL) webhookURL = await input({ message: "Enter a webhook URL:" });
31
30
  if (!topic) topic = await select({
32
31
  message: "Select a topic:",
33
- choices: topics.map((topic$1) => ({
34
- title: topic$1,
35
- value: topic$1
32
+ choices: topics.map((topic) => ({
33
+ title: topic,
34
+ value: topic
36
35
  }))
37
36
  });
38
37
  const spinner = ora("Testing...").start();
@@ -50,7 +49,7 @@ const webhookCommand = program.command("webhook").description("Test webhook URL
50
49
  log("Error:", error);
51
50
  }
52
51
  });
53
-
54
52
  //#endregion
55
- export { };
53
+ export {};
54
+
56
55
  //# sourceMappingURL=webhook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","names":["topic","error: any"],"sources":["../../src/commands/webhook.ts"],"sourcesContent":["import { input, select } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport { Option, program } from \"commander\";\nimport debug from \"debug\";\nimport ora from \"ora\";\n\nimport { getClient } from \"../utils/index.js\";\n\nconst log = debug(\"ef:cli:auth\");\n\nexport interface APITestWebhhokResult {\n message: string;\n}\nconst topics = [\n \"render.created\",\n \"render.rendering\",\n \"render.pending\",\n \"render.failed\",\n \"render.completed\",\n];\n\nexport const testWebhookURL = async ({\n webhookURL,\n topic,\n}: {\n webhookURL: string;\n topic: string;\n}) => {\n const response = await getClient().authenticatedFetch(\"/api/v1/test_webhook\", {\n method: \"POST\",\n body: JSON.stringify({\n webhookURL,\n topic,\n }),\n });\n return response.json() as Promise<APITestWebhhokResult>;\n};\n\nconst webhookCommand = program\n .command(\"webhook\")\n .description(\"Test webhook URL with a topic\")\n .option(\"-u, --webhookURL <webhookURL>\", \"Webhook URL\")\n .addOption(new Option(\"-t, --topic <topic>\", \"Topic\").choices(topics))\n .action(async () => {\n const options = webhookCommand.opts();\n log(\"Options:\", options);\n let { webhookURL, topic } = options;\n\n if (!webhookURL) {\n const answer = await input({ message: \"Enter a webhook URL:\" });\n webhookURL = answer;\n }\n\n if (!topic) {\n const answer = await select({\n message: \"Select a topic:\",\n choices: topics.map((topic) => ({ title: topic, value: topic })),\n });\n topic = answer;\n }\n\n const spinner = ora(\"Testing...\").start();\n try {\n const apiData = await testWebhookURL({ webhookURL, topic });\n spinner.succeed(\"Webhook URL is working! 🎉\");\n process.stderr.write(chalk.green(`${apiData.message}\\n`));\n } catch (error: any) {\n spinner.fail(\"Webhook URL is not working!\");\n process.stderr.write(error?.message);\n process.stderr.write(\"\\n\");\n log(\"Error:\", error);\n }\n });\n"],"mappings":";;;;;;;;AAQA,MAAM,MAAM,MAAM,cAAc;AAKhC,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAAO,EACnC,YACA,YAII;AAQJ,SAPiB,MAAM,WAAW,CAAC,mBAAmB,wBAAwB;EAC5E,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB;GACA;GACD,CAAC;EACH,CAAC,EACc,MAAM;;AAGxB,MAAM,iBAAiB,QACpB,QAAQ,UAAU,CAClB,YAAY,gCAAgC,CAC5C,OAAO,iCAAiC,cAAc,CACtD,UAAU,IAAI,OAAO,uBAAuB,QAAQ,CAAC,QAAQ,OAAO,CAAC,CACrE,OAAO,YAAY;CAClB,MAAM,UAAU,eAAe,MAAM;AACrC,KAAI,YAAY,QAAQ;CACxB,IAAI,EAAE,YAAY,UAAU;AAE5B,KAAI,CAAC,WAEH,cADe,MAAM,MAAM,EAAE,SAAS,wBAAwB,CAAC;AAIjE,KAAI,CAAC,MAKH,SAJe,MAAM,OAAO;EAC1B,SAAS;EACT,SAAS,OAAO,KAAK,aAAW;GAAE,OAAOA;GAAO,OAAOA;GAAO,EAAE;EACjE,CAAC;CAIJ,MAAM,UAAU,IAAI,aAAa,CAAC,OAAO;AACzC,KAAI;EACF,MAAM,UAAU,MAAM,eAAe;GAAE;GAAY;GAAO,CAAC;AAC3D,UAAQ,QAAQ,6BAA6B;AAC7C,UAAQ,OAAO,MAAM,MAAM,MAAM,GAAG,QAAQ,QAAQ,IAAI,CAAC;UAClDC,OAAY;AACnB,UAAQ,KAAK,8BAA8B;AAC3C,UAAQ,OAAO,MAAM,OAAO,QAAQ;AACpC,UAAQ,OAAO,MAAM,KAAK;AAC1B,MAAI,UAAU,MAAM;;EAEtB"}
1
+ {"version":3,"file":"webhook.js","names":[],"sources":["../../src/commands/webhook.ts"],"mappings":";;;;;;;AAQA,MAAM,MAAM,MAAM,cAAc;AAKhC,MAAM,SAAS;CACb;CACA;CACA;CACA;CACA;CACD;AAED,MAAa,iBAAiB,OAAO,EACnC,YACA,YAII;AAQJ,SAPiB,MAAM,WAAW,CAAC,mBAAmB,wBAAwB;EAC5E,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB;GACA;GACD,CAAC;EACH,CAAC,EACc,MAAM;;AAGxB,MAAM,iBAAiB,QACpB,QAAQ,UAAU,CAClB,YAAY,gCAAgC,CAC5C,OAAO,iCAAiC,cAAc,CACtD,UAAU,IAAI,OAAO,uBAAuB,QAAQ,CAAC,QAAQ,OAAO,CAAC,CACrE,OAAO,YAAY;CAClB,MAAM,UAAU,eAAe,MAAM;AACrC,KAAI,YAAY,QAAQ;CACxB,IAAI,EAAE,YAAY,UAAU;AAE5B,KAAI,CAAC,WAEH,cADe,MAAM,MAAM,EAAE,SAAS,wBAAwB,CAAC;AAIjE,KAAI,CAAC,MAKH,SAJe,MAAM,OAAO;EAC1B,SAAS;EACT,SAAS,OAAO,KAAK,WAAW;GAAE,OAAO;GAAO,OAAO;GAAO,EAAE;EACjE,CAAC;CAIJ,MAAM,UAAU,IAAI,aAAa,CAAC,OAAO;AACzC,KAAI;EACF,MAAM,UAAU,MAAM,eAAe;GAAE;GAAY;GAAO,CAAC;AAC3D,UAAQ,QAAQ,6BAA6B;AAC7C,UAAQ,OAAO,MAAM,MAAM,MAAM,GAAG,QAAQ,QAAQ,IAAI,CAAC;UAClD,OAAY;AACnB,UAAQ,KAAK,8BAA8B;AAC3C,UAAQ,OAAO,MAAM,OAAO,QAAQ;AACpC,UAAQ,OAAO,MAAM,KAAK;AAC1B,MAAI,UAAU,MAAM;;EAEtB"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1 @@
1
- #!/usr/bin/env node
2
- import "./commands/render.js";
3
- import "dotenv/config";
1
+ export { };
package/dist/index.js CHANGED
@@ -12,11 +12,10 @@ import "./commands/webhook.js";
12
12
  import "./commands/transcribe.js";
13
13
  import "dotenv/config";
14
14
  import { Option, program } from "commander";
15
-
16
15
  //#region src/index.ts
17
16
  program.name("editframe").addOption(new Option("-t, --token <token>", "API Token").env("EF_TOKEN")).addOption(new Option("--ef-host <host>", "Editframe Host").env("EF_HOST").default("https://editframe.com")).addOption(new Option("--ef-render-host <host>", "Editframe Render Host").env("EF_RENDER_HOST").default("https://editframe.com")).version(VERSION);
18
17
  program.parse(process.argv);
19
-
20
18
  //#endregion
21
- export { };
19
+ export {};
20
+
22
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"dotenv/config\";\nimport { Option, program } from \"commander\";\n\nimport { VERSION } from \"./VERSION.js\";\n\nprogram\n .name(\"editframe\")\n .addOption(new Option(\"-t, --token <token>\", \"API Token\").env(\"EF_TOKEN\"))\n .addOption(\n new Option(\"--ef-host <host>\", \"Editframe Host\")\n .env(\"EF_HOST\")\n .default(\"https://editframe.com\"),\n )\n .addOption(\n new Option(\"--ef-render-host <host>\", \"Editframe Render Host\")\n .env(\"EF_RENDER_HOST\")\n .default(\"https://editframe.com\"),\n )\n .version(VERSION);\n\nimport \"./commands/auth.js\";\nimport \"./commands/sync.js\";\nimport \"./commands/cloud-render.js\";\nimport \"./commands/render.js\";\nimport \"./commands/preview.js\";\nimport \"./commands/process.js\";\nimport \"./commands/process-file.js\";\nimport \"./commands/check.js\";\nimport \"./commands/webhook.js\";\nimport \"./commands/transcribe.js\";\n\nprogram.parse(process.argv);\n"],"mappings":";;;;;;;;;;;;;;;;AAMA,QACG,KAAK,YAAY,CACjB,UAAU,IAAI,OAAO,uBAAuB,YAAY,CAAC,IAAI,WAAW,CAAC,CACzE,UACC,IAAI,OAAO,oBAAoB,iBAAiB,CAC7C,IAAI,UAAU,CACd,QAAQ,wBAAwB,CACpC,CACA,UACC,IAAI,OAAO,2BAA2B,wBAAwB,CAC3D,IAAI,iBAAiB,CACrB,QAAQ,wBAAwB,CACpC,CACA,QAAQ,QAAQ;AAanB,QAAQ,MAAM,QAAQ,KAAK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;;;;;;;AAMA,QACG,KAAK,YAAY,CACjB,UAAU,IAAI,OAAO,uBAAuB,YAAY,CAAC,IAAI,WAAW,CAAC,CACzE,UACC,IAAI,OAAO,oBAAoB,iBAAiB,CAC7C,IAAI,UAAU,CACd,QAAQ,wBAAwB,CACpC,CACA,UACC,IAAI,OAAO,2BAA2B,wBAAwB,CAC3D,IAAI,iBAAiB,CACrB,QAAQ,wBAAwB,CACpC,CACA,QAAQ,QAAQ;AAanB,QAAQ,MAAM,QAAQ,KAAK"}
@@ -1,5 +1,4 @@
1
1
  import { cacheImage, findOrCreateCaptions, generateTrack } from "@editframe/assets";
2
-
3
2
  //#region src/operations/processRenderInfo.ts
4
3
  const processRenderInfo = async (renderInfo) => {
5
4
  for (const [src, tracks] of Object.entries(renderInfo.assets.efMedia)) {
@@ -26,7 +25,7 @@ const processRenderInfo = async (renderInfo) => {
26
25
  await findOrCreateCaptions("./src/assets", `./src${captionsAsset}`);
27
26
  }
28
27
  };
29
-
30
28
  //#endregion
31
29
  export { processRenderInfo };
30
+
32
31
  //# sourceMappingURL=processRenderInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"processRenderInfo.js","names":[],"sources":["../../src/operations/processRenderInfo.ts"],"sourcesContent":["import { cacheImage, findOrCreateCaptions, generateTrack } from \"@editframe/assets\";\nimport type { getRenderInfo } from \"@editframe/elements/node\";\n\nexport const processRenderInfo = async (renderInfo: Awaited<ReturnType<typeof getRenderInfo>>) => {\n for (const [src, tracks] of Object.entries(renderInfo.assets.efMedia)) {\n process.stderr.write(\"Processing media asset: \");\n process.stderr.write(src);\n process.stderr.write(\"\\n\");\n for (const trackId in tracks) {\n process.stderr.write(\"Generating track: \");\n process.stderr.write(trackId);\n process.stderr.write(\"\\n\");\n await generateTrack(\"./src/assets\", `./src${src}`, `src?trackId=${trackId}`);\n }\n }\n\n for (const imageAsset of renderInfo.assets.efImage) {\n process.stderr.write(\"Processing image asset: \");\n process.stderr.write(imageAsset);\n process.stderr.write(\"\\n\");\n await cacheImage(\"./src/assets\", `./src${imageAsset}`);\n }\n\n for (const captionsAsset of renderInfo.assets.efCaptions) {\n process.stderr.write(\"Processing captions asset: \");\n process.stderr.write(captionsAsset);\n process.stderr.write(\"\\n\");\n await findOrCreateCaptions(\"./src/assets\", `./src${captionsAsset}`);\n }\n};\n"],"mappings":";;;AAGA,MAAa,oBAAoB,OAAO,eAA0D;AAChG,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,WAAW,OAAO,QAAQ,EAAE;AACrE,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,KAAK;AAC1B,OAAK,MAAM,WAAW,QAAQ;AAC5B,WAAQ,OAAO,MAAM,qBAAqB;AAC1C,WAAQ,OAAO,MAAM,QAAQ;AAC7B,WAAQ,OAAO,MAAM,KAAK;AAC1B,SAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,UAAU;;;AAIhF,MAAK,MAAM,cAAc,WAAW,OAAO,SAAS;AAClD,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,WAAW;AAChC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,WAAW,gBAAgB,QAAQ,aAAa;;AAGxD,MAAK,MAAM,iBAAiB,WAAW,OAAO,YAAY;AACxD,UAAQ,OAAO,MAAM,8BAA8B;AACnD,UAAQ,OAAO,MAAM,cAAc;AACnC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,qBAAqB,gBAAgB,QAAQ,gBAAgB"}
1
+ {"version":3,"file":"processRenderInfo.js","names":[],"sources":["../../src/operations/processRenderInfo.ts"],"mappings":";;AAGA,MAAa,oBAAoB,OAAO,eAA0D;AAChG,MAAK,MAAM,CAAC,KAAK,WAAW,OAAO,QAAQ,WAAW,OAAO,QAAQ,EAAE;AACrE,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,KAAK;AAC1B,OAAK,MAAM,WAAW,QAAQ;AAC5B,WAAQ,OAAO,MAAM,qBAAqB;AAC1C,WAAQ,OAAO,MAAM,QAAQ;AAC7B,WAAQ,OAAO,MAAM,KAAK;AAC1B,SAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,UAAU;;;AAIhF,MAAK,MAAM,cAAc,WAAW,OAAO,SAAS;AAClD,UAAQ,OAAO,MAAM,2BAA2B;AAChD,UAAQ,OAAO,MAAM,WAAW;AAChC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,WAAW,gBAAgB,QAAQ,aAAa;;AAGxD,MAAK,MAAM,iBAAiB,WAAW,OAAO,YAAY;AACxD,UAAQ,OAAO,MAAM,8BAA8B;AACnD,UAAQ,OAAO,MAAM,cAAc;AACnC,UAAQ,OAAO,MAAM,KAAK;AAC1B,QAAM,qBAAqB,gBAAgB,QAAQ,gBAAgB"}
@@ -3,7 +3,6 @@ import { SyncFragmentIndex } from "./SyncFragmentIndex.js";
3
3
  import { SyncImage } from "./SyncImage.js";
4
4
  import { SyncTrack } from "./SyncTrack.js";
5
5
  import debug from "debug";
6
-
7
6
  //#region src/operations/syncAssetsDirectory/SubAssetSync.ts
8
7
  const trackMatch = /\.track-[\d]+.mp4$/i;
9
8
  const fragmentIndexMatch = /\.tracks.json$/i;
@@ -21,7 +20,7 @@ const getAssetSync = (subAssetPath, md5) => {
21
20
  if (captionsMatch.test(subAssetPath)) return new SyncCaption(subAssetPath, md5);
22
21
  throw new Error(`Unrecognized sub-asset type: ${subAssetPath}`);
23
22
  };
24
-
25
23
  //#endregion
26
24
  export { getAssetSync };
25
+
27
26
  //# sourceMappingURL=SubAssetSync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubAssetSync.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SubAssetSync.ts"],"sourcesContent":["import debug from \"debug\";\nimport { SyncCaption } from \"./SyncCaption.js\";\nimport { SyncFragmentIndex } from \"./SyncFragmentIndex.js\";\nimport { SyncImage } from \"./SyncImage.js\";\nimport type { SyncStatus } from \"./SyncStatus.js\";\nimport { SyncTrack } from \"./SyncTrack.js\";\n\nexport interface SubAssetSync<CreationType> {\n icon: string;\n label: string;\n path: string;\n md5: string;\n prepare: () => Promise<void>;\n validate: () => Promise<void>;\n create: () => Promise<void>;\n upload: () => Promise<void>;\n syncStatus: SyncStatus;\n isComplete: () => boolean;\n markSynced: () => Promise<void>;\n created: CreationType | null;\n}\n\nconst trackMatch = /\\.track-[\\d]+.mp4$/i;\nconst fragmentIndexMatch = /\\.tracks.json$/i;\nconst captionsMatch = /\\.captions.json$/i;\nconst imageMatch = /\\.(png|jpe?g|gif|webp)$/i;\n\nconst log = debug(\"ef:SubAssetSync\");\n\nexport const getAssetSync = (subAssetPath: string, md5: string) => {\n log(\"getAssetSync\", { subAssetPath, md5 });\n if (imageMatch.test(subAssetPath)) {\n return new SyncImage(subAssetPath, md5);\n }\n if (trackMatch.test(subAssetPath)) {\n return new SyncTrack(subAssetPath, md5);\n }\n if (fragmentIndexMatch.test(subAssetPath)) {\n return new SyncFragmentIndex(subAssetPath, md5);\n }\n if (captionsMatch.test(subAssetPath)) {\n return new SyncCaption(subAssetPath, md5);\n }\n throw new Error(`Unrecognized sub-asset type: ${subAssetPath}`);\n};\n"],"mappings":";;;;;;;AAsBA,MAAM,aAAa;AACnB,MAAM,qBAAqB;AAC3B,MAAM,gBAAgB;AACtB,MAAM,aAAa;AAEnB,MAAM,MAAM,MAAM,kBAAkB;AAEpC,MAAa,gBAAgB,cAAsB,QAAgB;AACjE,KAAI,gBAAgB;EAAE;EAAc;EAAK,CAAC;AAC1C,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,mBAAmB,KAAK,aAAa,CACvC,QAAO,IAAI,kBAAkB,cAAc,IAAI;AAEjD,KAAI,cAAc,KAAK,aAAa,CAClC,QAAO,IAAI,YAAY,cAAc,IAAI;AAE3C,OAAM,IAAI,MAAM,gCAAgC,eAAe"}
1
+ {"version":3,"file":"SubAssetSync.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SubAssetSync.ts"],"mappings":";;;;;;AAsBA,MAAM,aAAa;AACnB,MAAM,qBAAqB;AAC3B,MAAM,gBAAgB;AACtB,MAAM,aAAa;AAEnB,MAAM,MAAM,MAAM,kBAAkB;AAEpC,MAAa,gBAAgB,cAAsB,QAAgB;AACjE,KAAI,gBAAgB;EAAE;EAAc;EAAK,CAAC;AAC1C,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,WAAW,KAAK,aAAa,CAC/B,QAAO,IAAI,UAAU,cAAc,IAAI;AAEzC,KAAI,mBAAmB,KAAK,aAAa,CACvC,QAAO,IAAI,kBAAkB,cAAc,IAAI;AAEjD,KAAI,cAAc,KAAK,aAAa,CAClC,QAAO,IAAI,YAAY,cAAc,IAAI;AAE3C,OAAM,IAAI,MAAM,gCAAgC,eAAe"}
@@ -5,11 +5,10 @@ import { createFile, lookupFileByMd5, uploadFile } from "@editframe/api";
5
5
  import { basename } from "node:path";
6
6
  import fs from "node:fs/promises";
7
7
  import { Readable } from "node:stream";
8
-
9
8
  //#region src/operations/syncAssetsDirectory/SyncCaption.ts
10
9
  var SyncCaption = class {
11
- constructor(path$1, md5) {
12
- this.path = path$1;
10
+ constructor(path, md5) {
11
+ this.path = path;
13
12
  this.md5 = md5;
14
13
  this.icon = "📝";
15
14
  this.label = "captions";
@@ -54,7 +53,7 @@ var SyncCaption = class {
54
53
  });
55
54
  }
56
55
  };
57
-
58
56
  //#endregion
59
57
  export { SyncCaption };
58
+
60
59
  //# sourceMappingURL=SyncCaption.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncCaption.js","names":["path: string","md5: string"],"sources":["../../../src/operations/syncAssetsDirectory/SyncCaption.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport { basename } from \"node:path\";\n\nimport { Readable } from \"node:stream\";\nimport {\n type CreateFileResult,\n createFile,\n type LookupFileByMd5Result,\n lookupFileByMd5,\n uploadFile,\n} from \"@editframe/api\";\nimport { createReadableStreamFromReadable } from \"../../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../../utils/index.js\";\nimport type { SubAssetSync } from \"./SubAssetSync.js\";\nimport { SyncStatus } from \"./SyncStatus.js\";\nexport class SyncCaption implements SubAssetSync<CreateFileResult> {\n icon = \"📝\";\n label = \"captions\";\n syncStatus: SyncStatus = new SyncStatus(this.path);\n created: CreateFileResult | LookupFileByMd5Result | null = null;\n constructor(\n public path: string,\n public md5: string,\n ) {}\n\n async byteSize() {\n return (await fs.stat(this.path)).size;\n }\n\n async prepare() {}\n\n async validate() {}\n\n async create() {\n const maybeFile = await lookupFileByMd5(getClient(), this.md5);\n if (maybeFile) {\n this.created = maybeFile;\n } else {\n this.created = await createFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path).replace(/\\.captions.json$/, \"\"),\n type: \"caption\",\n byte_size: await this.byteSize(),\n });\n }\n }\n\n isComplete() {\n return this.created?.status === \"ready\";\n }\n\n async upload() {\n if (!this.created) {\n throw new Error(\"Caption not created. Should have been prevented by .isComplete()\");\n }\n await uploadFile(\n getClient(),\n {\n id: this.created.id,\n byte_size: await this.byteSize(),\n type: \"caption\",\n },\n // It's not clear why we need to use Readable.from here, but it seems\n // to fix an issue where the request is closed early in tests\n createReadableStreamFromReadable(Readable.from(await fs.readFile(this.path))),\n ).whenUploaded();\n }\n\n async markSynced() {\n if (!this.created) {\n throw new Error(\"Caption not created. Should have been prevented by .isComplete()\");\n }\n const byteSize = await this.byteSize();\n await this.syncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAeA,IAAa,cAAb,MAAmE;CAKjE,YACE,AAAOA,QACP,AAAOC,KACP;EAFO;EACA;cANF;eACC;oBACiB,IAAI,WAAW,KAAK,KAAK;iBACS;;CAM3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,oBAAoB,GAAG;GAC7D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;AAErF,QAAM,WACJ,WAAW,EACX;GACE,IAAI,KAAK,QAAQ;GACjB,WAAW,MAAM,KAAK,UAAU;GAChC,MAAM;GACP,EAGD,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAC9E,CAAC,cAAc;;CAGlB,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;EAErF,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,KAAK,WAAW,WAAW;GAC/B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC"}
1
+ {"version":3,"file":"SyncCaption.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncCaption.ts"],"mappings":";;;;;;;;AAeA,IAAa,cAAb,MAAmE;CAKjE,YACE,MACA,KACA;AAFO,OAAA,OAAA;AACA,OAAA,MAAA;cANF;eACC;oBACiB,IAAI,WAAW,KAAK,KAAK;iBACS;;CAM3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,oBAAoB,GAAG;GAC7D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;AAErF,QAAM,WACJ,WAAW,EACX;GACE,IAAI,KAAK,QAAQ;GACjB,WAAW,MAAM,KAAK,UAAU;GAChC,MAAM;GACP,EAGD,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAC9E,CAAC,cAAc;;CAGlB,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,mEAAmE;EAErF,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,KAAK,WAAW,WAAW;GAC/B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC"}
@@ -5,11 +5,10 @@ import { createFile, lookupFileByMd5, uploadFileIndex } from "@editframe/api";
5
5
  import { basename, dirname, join } from "node:path";
6
6
  import fs from "node:fs/promises";
7
7
  import { Readable } from "node:stream";
8
-
9
8
  //#region src/operations/syncAssetsDirectory/SyncFragmentIndex.ts
10
9
  var SyncFragmentIndex = class {
11
- constructor(path$1, md5) {
12
- this.path = path$1;
10
+ constructor(path, md5) {
11
+ this.path = path;
13
12
  this.md5 = md5;
14
13
  this.icon = "📋";
15
14
  this.label = "fragment index";
@@ -57,7 +56,7 @@ var SyncFragmentIndex = class {
57
56
  })]);
58
57
  }
59
58
  };
60
-
61
59
  //#endregion
62
60
  export { SyncFragmentIndex };
61
+
63
62
  //# sourceMappingURL=SyncFragmentIndex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncFragmentIndex.js","names":["path: string","md5: string"],"sources":["../../../src/operations/syncAssetsDirectory/SyncFragmentIndex.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport { Readable } from \"node:stream\";\n\nimport {\n type CreateFileResult,\n createFile,\n type LookupFileByMd5Result,\n lookupFileByMd5,\n uploadFileIndex,\n} from \"@editframe/api\";\n\nimport { createReadableStreamFromReadable } from \"../../utils/createReadableStreamFromReadable.js\";\nimport { getClient } from \"../../utils/index.js\";\nimport type { SubAssetSync } from \"./SubAssetSync.js\";\nimport { SyncStatus } from \"./SyncStatus.js\";\n\nexport class SyncFragmentIndex implements SubAssetSync<CreateFileResult> {\n icon = \"📋\";\n label = \"fragment index\";\n syncStatus = new SyncStatus(this.path);\n fileSyncStatus = new SyncStatus(join(dirname(this.path), \"isobmff\"));\n created: CreateFileResult | LookupFileByMd5Result | null = null;\n\n constructor(\n public path: string,\n public md5: string,\n ) {}\n\n async byteSize() {\n return (await fs.stat(this.path)).size;\n }\n\n async prepare() {}\n\n async validate() {}\n\n async create() {\n const maybeFile = await lookupFileByMd5(getClient(), this.md5);\n if (maybeFile) {\n this.created = maybeFile;\n } else {\n this.created = await createFile(getClient(), {\n md5: this.md5,\n filename: basename(this.path).replace(/\\.tracks.json$/, \"\"),\n type: \"video\",\n byte_size: await this.byteSize(),\n });\n }\n }\n\n isComplete() {\n return this.created?.status === \"ready\";\n }\n\n async upload() {\n if (!this.created) {\n throw new Error(\"Fragment index not created. Should have been prevented by .isComplete()\");\n }\n await uploadFileIndex(\n getClient(),\n this.created.id,\n // It is unclear why we need to use Readable.from here\n // Tests fail when using createReadStream\n createReadableStreamFromReadable(Readable.from(await fs.readFile(this.path))),\n await this.byteSize(),\n );\n }\n\n async markSynced() {\n if (!this.created) {\n throw new Error(\"Fragment index not created. Should have been prevented by .isComplete()\");\n }\n const byteSize = await this.byteSize();\n await Promise.all([\n this.syncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n }),\n this.fileSyncStatus.markSynced({\n version: \"1\",\n complete: true,\n id: this.created.id,\n md5: this.md5,\n byte_size: byteSize,\n }),\n ]);\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAa,oBAAb,MAAyE;CAOvE,YACE,AAAOA,QACP,AAAOC,KACP;EAFO;EACA;cARF;eACC;oBACK,IAAI,WAAW,KAAK,KAAK;wBACrB,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK,EAAE,UAAU,CAAC;iBACT;;CAO3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,kBAAkB,GAAG;GAC3D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;AAE5F,QAAM,gBACJ,WAAW,EACX,KAAK,QAAQ,IAGb,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,EAC7E,MAAM,KAAK,UAAU,CACtB;;CAGH,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;EAE5F,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,QAAQ,IAAI,CAChB,KAAK,WAAW,WAAW;GACzB,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,EACF,KAAK,eAAe,WAAW;GAC7B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,CACH,CAAC"}
1
+ {"version":3,"file":"SyncFragmentIndex.js","names":[],"sources":["../../../src/operations/syncAssetsDirectory/SyncFragmentIndex.ts"],"mappings":";;;;;;;;AAiBA,IAAa,oBAAb,MAAyE;CAOvE,YACE,MACA,KACA;AAFO,OAAA,OAAA;AACA,OAAA,MAAA;cARF;eACC;oBACK,IAAI,WAAW,KAAK,KAAK;wBACrB,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK,EAAE,UAAU,CAAC;iBACT;;CAO3D,MAAM,WAAW;AACf,UAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,EAAE;;CAGpC,MAAM,UAAU;CAEhB,MAAM,WAAW;CAEjB,MAAM,SAAS;EACb,MAAM,YAAY,MAAM,gBAAgB,WAAW,EAAE,KAAK,IAAI;AAC9D,MAAI,UACF,MAAK,UAAU;MAEf,MAAK,UAAU,MAAM,WAAW,WAAW,EAAE;GAC3C,KAAK,KAAK;GACV,UAAU,SAAS,KAAK,KAAK,CAAC,QAAQ,kBAAkB,GAAG;GAC3D,MAAM;GACN,WAAW,MAAM,KAAK,UAAU;GACjC,CAAC;;CAIN,aAAa;AACX,SAAO,KAAK,SAAS,WAAW;;CAGlC,MAAM,SAAS;AACb,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;AAE5F,QAAM,gBACJ,WAAW,EACX,KAAK,QAAQ,IAGb,iCAAiC,SAAS,KAAK,MAAM,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,EAC7E,MAAM,KAAK,UAAU,CACtB;;CAGH,MAAM,aAAa;AACjB,MAAI,CAAC,KAAK,QACR,OAAM,IAAI,MAAM,0EAA0E;EAE5F,MAAM,WAAW,MAAM,KAAK,UAAU;AACtC,QAAM,QAAQ,IAAI,CAChB,KAAK,WAAW,WAAW;GACzB,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,EACF,KAAK,eAAe,WAAW;GAC7B,SAAS;GACT,UAAU;GACV,IAAI,KAAK,QAAQ;GACjB,KAAK,KAAK;GACV,WAAW;GACZ,CAAC,CACH,CAAC"}