@editframe/cli 0.7.0-beta.1 → 0.7.0-beta.11

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 (53) hide show
  1. package/dist/VERSION.cjs +1 -1
  2. package/dist/VERSION.js +1 -1
  3. package/dist/commands/auth.cjs +14 -11
  4. package/dist/commands/auth.js +15 -12
  5. package/dist/commands/check.cjs +2 -2
  6. package/dist/commands/check.js +2 -2
  7. package/dist/commands/process.cjs +36 -0
  8. package/dist/commands/process.js +35 -0
  9. package/dist/commands/render.cjs +34 -25
  10. package/dist/commands/render.js +34 -25
  11. package/dist/index.cjs +1 -11
  12. package/dist/index.js +1 -12
  13. package/dist/operations/getRenderInfo.cjs +59 -0
  14. package/dist/operations/getRenderInfo.js +59 -0
  15. package/dist/operations/processRenderInfo.cjs +30 -0
  16. package/dist/operations/processRenderInfo.js +30 -0
  17. package/dist/operations/syncAssetsDirectory.cjs +83 -40
  18. package/dist/operations/syncAssetsDirectory.js +82 -39
  19. package/dist/utils/index.cjs +8 -15
  20. package/dist/utils/index.js +8 -15
  21. package/dist/utils/launchBrowserAndWaitForSDK.cjs +7 -3
  22. package/dist/utils/launchBrowserAndWaitForSDK.js +7 -3
  23. package/dist/utils/validateVideoResolution.cjs +27 -0
  24. package/dist/utils/validateVideoResolution.js +27 -0
  25. package/package.json +6 -12
  26. package/src/commands/auth.ts +14 -12
  27. package/src/commands/check.ts +2 -2
  28. package/src/commands/process.ts +43 -37
  29. package/src/commands/render.ts +32 -30
  30. package/src/operations/getRenderInfo.ts +80 -0
  31. package/src/operations/processRenderInfo.ts +37 -0
  32. package/src/operations/syncAssetsDirectory.ts +77 -40
  33. package/src/utils/index.ts +7 -16
  34. package/src/utils/launchBrowserAndWaitForSDK.ts +9 -3
  35. package/src/utils/validateVideoResolution.ts +33 -0
  36. package/dist/api/caption-file.cjs +0 -48
  37. package/dist/api/caption-file.js +0 -48
  38. package/dist/api/image-file.cjs +0 -49
  39. package/dist/api/image-file.js +0 -49
  40. package/dist/api/index.cjs +0 -12
  41. package/dist/api/index.js +0 -12
  42. package/dist/api/isobmff-file.cjs +0 -48
  43. package/dist/api/isobmff-file.js +0 -48
  44. package/dist/api/isobmff-track.cjs +0 -63
  45. package/dist/api/isobmff-track.js +0 -63
  46. package/dist/api/renders.cjs +0 -51
  47. package/dist/api/renders.js +0 -51
  48. package/src/api/caption-file.ts +0 -60
  49. package/src/api/image-file.ts +0 -58
  50. package/src/api/index.ts +0 -17
  51. package/src/api/isobmff-file.ts +0 -59
  52. package/src/api/isobmff-track.ts +0 -77
  53. package/src/api/renders.ts +0 -59
package/dist/VERSION.cjs CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const VERSION = "0.7.0-beta.1";
3
+ const VERSION = "0.7.0-beta.11";
4
4
  exports.VERSION = VERSION;
package/dist/VERSION.js CHANGED
@@ -1,4 +1,4 @@
1
- const VERSION = "0.7.0-beta.1";
1
+ const VERSION = "0.7.0-beta.11";
2
2
  export {
3
3
  VERSION
4
4
  };
@@ -3,28 +3,31 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const commander = require("commander");
4
4
  const ora = require("ora");
5
5
  const chalk = require("chalk");
6
+ const debug = require("debug");
6
7
  const index = require("../utils/index.cjs");
8
+ const log = debug("ef:cli:auth");
7
9
  const getApiData = async () => {
8
- const response = await index.authenticatedFetch("/api/org");
10
+ const response = await index.getClient().authenticatedFetch("/api/org");
9
11
  return response.json();
10
12
  };
11
- const authCommand = commander.program.command("auth").description("Fetch organization data using API token").option("-d, --debug", "output extra debugging").action(async () => {
13
+ const authCommand = commander.program.command("auth").description("Fetch organization data using API token").action(async () => {
12
14
  const options = authCommand.opts();
13
- if (options.debug) {
14
- console.log("Options:", options);
15
- }
15
+ log("Options:", options);
16
16
  const spinner = ora("Loading...").start();
17
17
  try {
18
18
  const apiData = await getApiData();
19
19
  spinner.succeed("You are authenticated! 🎉");
20
- console.log(chalk.green(`Name: ${apiData.name}`));
21
- console.log(chalk.green(`Welcome to ${apiData.org_display_name}!`));
20
+ process.stderr.write(chalk.green(`Name: ${apiData.name}
21
+ `));
22
+ process.stderr.write(
23
+ chalk.green(`Welcome to ${apiData.org_display_name}!
24
+ `)
25
+ );
22
26
  } catch (error) {
23
27
  spinner.fail("Authentication failed!");
24
- console.error(error?.message);
25
- if (options.debug) {
26
- console.error(error);
27
- }
28
+ process.stderr.write(error?.message);
29
+ process.stderr.write("\n");
30
+ log("Error:", error);
28
31
  }
29
32
  });
30
33
  exports.getApiData = getApiData;
@@ -1,28 +1,31 @@
1
1
  import { program } from "commander";
2
2
  import ora from "ora";
3
3
  import chalk from "chalk";
4
- import { authenticatedFetch } from "../utils/index.js";
4
+ import debug from "debug";
5
+ import { getClient } from "../utils/index.js";
6
+ const log = debug("ef:cli:auth");
5
7
  const getApiData = async () => {
6
- const response = await authenticatedFetch("/api/org");
8
+ const response = await getClient().authenticatedFetch("/api/org");
7
9
  return response.json();
8
10
  };
9
- const authCommand = program.command("auth").description("Fetch organization data using API token").option("-d, --debug", "output extra debugging").action(async () => {
11
+ const authCommand = program.command("auth").description("Fetch organization data using API token").action(async () => {
10
12
  const options = authCommand.opts();
11
- if (options.debug) {
12
- console.log("Options:", options);
13
- }
13
+ log("Options:", options);
14
14
  const spinner = ora("Loading...").start();
15
15
  try {
16
16
  const apiData = await getApiData();
17
17
  spinner.succeed("You are authenticated! 🎉");
18
- console.log(chalk.green(`Name: ${apiData.name}`));
19
- console.log(chalk.green(`Welcome to ${apiData.org_display_name}!`));
18
+ process.stderr.write(chalk.green(`Name: ${apiData.name}
19
+ `));
20
+ process.stderr.write(
21
+ chalk.green(`Welcome to ${apiData.org_display_name}!
22
+ `)
23
+ );
20
24
  } catch (error) {
21
25
  spinner.fail("Authentication failed!");
22
- console.error(error?.message);
23
- if (options.debug) {
24
- console.error(error);
25
- }
26
+ process.stderr.write(error?.message);
27
+ process.stderr.write("\n");
28
+ log("Error:", error);
26
29
  }
27
30
  });
28
31
  export {
@@ -108,8 +108,8 @@ commander.program.command("check").description("Check on dependencies and other
108
108
  );
109
109
  } catch (error) {
110
110
  spinner.fail(chalk.white.bgRed(` Check for ${checkName} failed `));
111
- console.log(chalk.red(check.message().join("\n\n")));
112
- console.log();
111
+ process.stderr.write(chalk.red(check.message().join("\n\n")));
112
+ process.stderr.write("\n");
113
113
  }
114
114
  }
115
115
  });
@@ -107,8 +107,8 @@ program.command("check").description("Check on dependencies and other requiremen
107
107
  );
108
108
  } catch (error) {
109
109
  spinner.fail(chalk.white.bgRed(` Check for ${checkName} failed `));
110
- console.log(chalk.red(check.message().join("\n\n")));
111
- console.log();
110
+ process.stderr.write(chalk.red(check.message().join("\n\n")));
111
+ process.stderr.write("\n");
112
112
  }
113
113
  }
114
114
  });
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ const node_child_process = require("node:child_process");
3
+ const path = require("node:path");
4
+ const commander = require("commander");
5
+ const withSpinner = require("../utils/withSpinner.cjs");
6
+ const launchBrowserAndWaitForSDK = require("../utils/launchBrowserAndWaitForSDK.cjs");
7
+ const startPreviewServer = require("../utils/startPreviewServer.cjs");
8
+ const getRenderInfo = require("../operations/getRenderInfo.cjs");
9
+ const processRenderInfo = require("../operations/processRenderInfo.cjs");
10
+ commander.program.command("process [directory]").description(
11
+ "Process's a directory's index.html file, analyzing assets and processing them for rendering"
12
+ ).action(async (directory) => {
13
+ directory ??= ".";
14
+ const distDir = path.join(directory, "dist");
15
+ await withSpinner.withSpinner("Building\n", async () => {
16
+ node_child_process.spawnSync("npx", ["vite", "build", directory], {
17
+ stdio: "inherit"
18
+ });
19
+ });
20
+ const previewServer = await startPreviewServer.PreviewServer.start(distDir);
21
+ process.stderr.write("Preview server started at ");
22
+ process.stderr.write(previewServer.url);
23
+ process.stderr.write("\n");
24
+ await launchBrowserAndWaitForSDK.launchBrowserAndWaitForSDK(
25
+ {
26
+ url: previewServer.url,
27
+ efInteractive: false,
28
+ interactive: false,
29
+ headless: true
30
+ },
31
+ async (page) => {
32
+ const renderInfo = await page.evaluate(getRenderInfo.getRenderInfo);
33
+ await processRenderInfo.processRenderInfo(renderInfo);
34
+ }
35
+ );
36
+ });
@@ -0,0 +1,35 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+ import { program } from "commander";
4
+ import { withSpinner } from "../utils/withSpinner.js";
5
+ import { launchBrowserAndWaitForSDK } from "../utils/launchBrowserAndWaitForSDK.js";
6
+ import { PreviewServer } from "../utils/startPreviewServer.js";
7
+ import { getRenderInfo } from "../operations/getRenderInfo.js";
8
+ import { processRenderInfo } from "../operations/processRenderInfo.js";
9
+ program.command("process [directory]").description(
10
+ "Process's a directory's index.html file, analyzing assets and processing them for rendering"
11
+ ).action(async (directory) => {
12
+ directory ??= ".";
13
+ const distDir = path.join(directory, "dist");
14
+ await withSpinner("Building\n", async () => {
15
+ spawnSync("npx", ["vite", "build", directory], {
16
+ stdio: "inherit"
17
+ });
18
+ });
19
+ const previewServer = await PreviewServer.start(distDir);
20
+ process.stderr.write("Preview server started at ");
21
+ process.stderr.write(previewServer.url);
22
+ process.stderr.write("\n");
23
+ await launchBrowserAndWaitForSDK(
24
+ {
25
+ url: previewServer.url,
26
+ efInteractive: false,
27
+ interactive: false,
28
+ headless: true
29
+ },
30
+ async (page) => {
31
+ const renderInfo = await page.evaluate(getRenderInfo);
32
+ await processRenderInfo(renderInfo);
33
+ }
34
+ );
35
+ });
@@ -1,17 +1,22 @@
1
1
  "use strict";
2
- const node_child_process = require("node:child_process");
3
2
  const path = require("node:path");
4
3
  const fs = require("node:fs/promises");
5
4
  const tar = require("tar");
6
5
  const commander = require("commander");
7
6
  const nodeHtmlParser = require("node-html-parser");
7
+ const vite = require("vite");
8
8
  const assets = require("@editframe/assets");
9
9
  const withSpinner = require("../utils/withSpinner.cjs");
10
- const renders = require("../api/renders.cjs");
10
+ const api = require("@editframe/api");
11
11
  const launchBrowserAndWaitForSDK = require("../utils/launchBrowserAndWaitForSDK.cjs");
12
12
  const startPreviewServer = require("../utils/startPreviewServer.cjs");
13
13
  const node_stream = require("node:stream");
14
14
  const syncAssetsDirectory = require("../operations/syncAssetsDirectory.cjs");
15
+ const index = require("../utils/index.cjs");
16
+ const getRenderInfo = require("../operations/getRenderInfo.cjs");
17
+ const processRenderInfo = require("../operations/processRenderInfo.cjs");
18
+ const node_util = require("node:util");
19
+ const validateVideoResolution = require("../utils/validateVideoResolution.cjs");
15
20
  function _interopNamespaceDefault(e) {
16
21
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
17
22
  if (e) {
@@ -78,12 +83,22 @@ commander.program.command("render [directory]").description(
78
83
  return;
79
84
  }
80
85
  await withSpinner.withSpinner("Building\n", async () => {
81
- node_child_process.spawnSync("npx", ["vite", "build", directory], {
82
- stdio: "inherit"
83
- });
86
+ try {
87
+ await vite.build({
88
+ root: directory,
89
+ logLevel: "info",
90
+ // Optional: adjust log level as needed
91
+ clearScreen: false
92
+ // Optional: keep console output clean
93
+ });
94
+ } catch (error) {
95
+ console.error("Build failed:", error);
96
+ }
84
97
  });
85
98
  const previewServer = await startPreviewServer.PreviewServer.start(distDir);
86
- console.log("Preview server started at", previewServer.url);
99
+ process.stderr.write("Preview server started at:");
100
+ process.stderr.write(previewServer.url);
101
+ process.stderr.write("\n");
87
102
  await launchBrowserAndWaitForSDK.launchBrowserAndWaitForSDK(
88
103
  {
89
104
  url: previewServer.url,
@@ -92,20 +107,12 @@ commander.program.command("render [directory]").description(
92
107
  headless: true
93
108
  },
94
109
  async (page) => {
95
- const renderInfo = await page.evaluate(async () => {
96
- const rootTimeGroup = document.querySelector("ef-timegroup");
97
- if (!rootTimeGroup) {
98
- throw new Error("No ef-timegroup found");
99
- }
100
- console.log("Waiting for media durations", rootTimeGroup);
101
- await rootTimeGroup.waitForMediaDurations();
102
- const width = rootTimeGroup.clientWidth;
103
- const height = rootTimeGroup.clientHeight;
104
- const fps = 30;
105
- const durationMs = Math.round(rootTimeGroup.durationMs);
106
- return { width, height, fps, durationMs };
110
+ const renderInfo = await page.evaluate(getRenderInfo.getRenderInfo);
111
+ validateVideoResolution.validateVideoResolution({
112
+ width: renderInfo.width,
113
+ height: renderInfo.height
107
114
  });
108
- console.log("RENDER INFO", renderInfo);
115
+ await processRenderInfo.processRenderInfo(renderInfo);
109
116
  const doc = nodeHtmlParser.parse(
110
117
  await fs.readFile(path.join(distDir, "index.html"), "utf-8")
111
118
  );
@@ -128,7 +135,7 @@ commander.program.command("render [directory]").description(
128
135
  }
129
136
  await fs.writeFile(path.join(distDir, "index.html"), doc.toString());
130
137
  const md5 = await assets.md5Directory(distDir);
131
- const render = await renders.createRender({
138
+ const render = await api.createRender(index.getClient(), {
132
139
  id: md5,
133
140
  width: renderInfo.width,
134
141
  height: renderInfo.height,
@@ -138,8 +145,9 @@ commander.program.command("render [directory]").description(
138
145
  strategy: options.strategy
139
146
  });
140
147
  if (render?.status !== "created") {
141
- console.error(
142
- `Render is in '${render?.status}' status. It cannot be recreated while in this status.`
148
+ process.stderr.write(
149
+ `Render is in '${render?.status}' status. It cannot be recreated while in this status.
150
+ `
143
151
  );
144
152
  return;
145
153
  }
@@ -152,9 +160,10 @@ commander.program.command("render [directory]").description(
152
160
  );
153
161
  const readable = new node_stream.PassThrough();
154
162
  tarStream.pipe(readable);
155
- await renders.uploadRender(md5, readable);
156
- console.log("Render assets uploaded");
157
- console.log(render);
163
+ await api.uploadRender(index.getClient(), md5, readable);
164
+ process.stderr.write("Render assets uploaded\n");
165
+ process.stderr.write(node_util.inspect(render));
166
+ process.stderr.write("\n");
158
167
  }
159
168
  );
160
169
  });
@@ -1,16 +1,21 @@
1
- import { spawnSync } from "node:child_process";
2
1
  import path from "node:path";
3
2
  import { readFile, writeFile } from "node:fs/promises";
4
3
  import * as tar from "tar";
5
4
  import { program, Option } from "commander";
6
5
  import { parse } from "node-html-parser";
6
+ import { build } from "vite";
7
7
  import { md5Directory, md5FilePath } from "@editframe/assets";
8
8
  import { withSpinner } from "../utils/withSpinner.js";
9
- import { createRender, uploadRender } from "../api/renders.js";
9
+ import { createRender, uploadRender } from "@editframe/api";
10
10
  import { launchBrowserAndWaitForSDK } from "../utils/launchBrowserAndWaitForSDK.js";
11
11
  import { PreviewServer } from "../utils/startPreviewServer.js";
12
12
  import { PassThrough } from "node:stream";
13
13
  import { syncAssetDirectory } from "../operations/syncAssetsDirectory.js";
14
+ import { getClient } from "../utils/index.js";
15
+ import { getRenderInfo } from "../operations/getRenderInfo.js";
16
+ import { processRenderInfo } from "../operations/processRenderInfo.js";
17
+ import { inspect } from "node:util";
18
+ import { validateVideoResolution } from "../utils/validateVideoResolution.js";
14
19
  const buildProductionUrl = async (origin, tagName, assetPath) => {
15
20
  const md5Sum = await md5FilePath(assetPath);
16
21
  const basename = path.basename(assetPath);
@@ -60,12 +65,22 @@ program.command("render [directory]").description(
60
65
  return;
61
66
  }
62
67
  await withSpinner("Building\n", async () => {
63
- spawnSync("npx", ["vite", "build", directory], {
64
- stdio: "inherit"
65
- });
68
+ try {
69
+ await build({
70
+ root: directory,
71
+ logLevel: "info",
72
+ // Optional: adjust log level as needed
73
+ clearScreen: false
74
+ // Optional: keep console output clean
75
+ });
76
+ } catch (error) {
77
+ console.error("Build failed:", error);
78
+ }
66
79
  });
67
80
  const previewServer = await PreviewServer.start(distDir);
68
- console.log("Preview server started at", previewServer.url);
81
+ process.stderr.write("Preview server started at:");
82
+ process.stderr.write(previewServer.url);
83
+ process.stderr.write("\n");
69
84
  await launchBrowserAndWaitForSDK(
70
85
  {
71
86
  url: previewServer.url,
@@ -74,20 +89,12 @@ program.command("render [directory]").description(
74
89
  headless: true
75
90
  },
76
91
  async (page) => {
77
- const renderInfo = await page.evaluate(async () => {
78
- const rootTimeGroup = document.querySelector("ef-timegroup");
79
- if (!rootTimeGroup) {
80
- throw new Error("No ef-timegroup found");
81
- }
82
- console.log("Waiting for media durations", rootTimeGroup);
83
- await rootTimeGroup.waitForMediaDurations();
84
- const width = rootTimeGroup.clientWidth;
85
- const height = rootTimeGroup.clientHeight;
86
- const fps = 30;
87
- const durationMs = Math.round(rootTimeGroup.durationMs);
88
- return { width, height, fps, durationMs };
92
+ const renderInfo = await page.evaluate(getRenderInfo);
93
+ validateVideoResolution({
94
+ width: renderInfo.width,
95
+ height: renderInfo.height
89
96
  });
90
- console.log("RENDER INFO", renderInfo);
97
+ await processRenderInfo(renderInfo);
91
98
  const doc = parse(
92
99
  await readFile(path.join(distDir, "index.html"), "utf-8")
93
100
  );
@@ -110,7 +117,7 @@ program.command("render [directory]").description(
110
117
  }
111
118
  await writeFile(path.join(distDir, "index.html"), doc.toString());
112
119
  const md5 = await md5Directory(distDir);
113
- const render = await createRender({
120
+ const render = await createRender(getClient(), {
114
121
  id: md5,
115
122
  width: renderInfo.width,
116
123
  height: renderInfo.height,
@@ -120,8 +127,9 @@ program.command("render [directory]").description(
120
127
  strategy: options.strategy
121
128
  });
122
129
  if (render?.status !== "created") {
123
- console.error(
124
- `Render is in '${render?.status}' status. It cannot be recreated while in this status.`
130
+ process.stderr.write(
131
+ `Render is in '${render?.status}' status. It cannot be recreated while in this status.
132
+ `
125
133
  );
126
134
  return;
127
135
  }
@@ -134,9 +142,10 @@ program.command("render [directory]").description(
134
142
  );
135
143
  const readable = new PassThrough();
136
144
  tarStream.pipe(readable);
137
- await uploadRender(md5, readable);
138
- console.log("Render assets uploaded");
139
- console.log(render);
145
+ await uploadRender(getClient(), md5, readable);
146
+ process.stderr.write("Render assets uploaded\n");
147
+ process.stderr.write(inspect(render));
148
+ process.stderr.write("\n");
140
149
  }
141
150
  );
142
151
  });
package/dist/index.cjs CHANGED
@@ -1,18 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
3
  require("dotenv/config");
5
4
  const commander = require("commander");
6
- const captionFile = require("./api/caption-file.cjs");
7
- const imageFile = require("./api/image-file.cjs");
8
- const isobmffFile = require("./api/isobmff-file.cjs");
9
- const isobmffTrack = require("./api/isobmff-track.cjs");
10
- const renders = require("./api/renders.cjs");
11
5
  const VERSION = require("./VERSION.cjs");
12
6
  require("./commands/auth.cjs");
13
7
  require("./commands/sync.cjs");
14
8
  require("./commands/render.cjs");
15
9
  require("./commands/preview.cjs");
10
+ require("./commands/process.cjs");
16
11
  require("./commands/check.cjs");
17
12
  commander.program.name("editframe").addOption(new commander.Option("-t, --token <token>", "API Token").env("EF_TOKEN")).addOption(
18
13
  new commander.Option("--ef-host <host>", "Editframe Host").env("EF_HOST").default("https://editframe.dev")
@@ -20,8 +15,3 @@ commander.program.name("editframe").addOption(new commander.Option("-t, --token
20
15
  new commander.Option("--ef-render-host <host>", "Editframe Render Host").env("EF_RENDER_HOST").default("https://editframe.dev")
21
16
  ).version(VERSION.VERSION);
22
17
  commander.program.parse(process.argv);
23
- exports.CreateCaptionFilePayload = captionFile.CreateCaptionFilePayload;
24
- exports.CreateImageFilePayload = imageFile.CreateImageFilePayload;
25
- exports.CreateISOBMFFFilePayload = isobmffFile.CreateISOBMFFFilePayload;
26
- exports.CreateISOBMFFTrackPayload = isobmffTrack.CreateISOBMFFTrackPayload;
27
- exports.CreateRenderPayload = renders.CreateRenderPayload;
package/dist/index.js CHANGED
@@ -1,16 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import "dotenv/config";
3
3
  import { program, Option } from "commander";
4
- import { CreateCaptionFilePayload } from "./api/caption-file.js";
5
- import { CreateImageFilePayload } from "./api/image-file.js";
6
- import { CreateISOBMFFFilePayload } from "./api/isobmff-file.js";
7
- import { CreateISOBMFFTrackPayload } from "./api/isobmff-track.js";
8
- import { CreateRenderPayload } from "./api/renders.js";
9
4
  import { VERSION } from "./VERSION.js";
10
5
  import "./commands/auth.js";
11
6
  import "./commands/sync.js";
12
7
  import "./commands/render.js";
13
8
  import "./commands/preview.js";
9
+ import "./commands/process.js";
14
10
  import "./commands/check.js";
15
11
  program.name("editframe").addOption(new Option("-t, --token <token>", "API Token").env("EF_TOKEN")).addOption(
16
12
  new Option("--ef-host <host>", "Editframe Host").env("EF_HOST").default("https://editframe.dev")
@@ -18,10 +14,3 @@ program.name("editframe").addOption(new Option("-t, --token <token>", "API Token
18
14
  new Option("--ef-render-host <host>", "Editframe Render Host").env("EF_RENDER_HOST").default("https://editframe.dev")
19
15
  ).version(VERSION);
20
16
  program.parse(process.argv);
21
- export {
22
- CreateCaptionFilePayload,
23
- CreateISOBMFFFilePayload,
24
- CreateISOBMFFTrackPayload,
25
- CreateImageFilePayload,
26
- CreateRenderPayload
27
- };
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const getRenderInfo = async () => {
4
+ const rootTimeGroup = document.querySelector("ef-timegroup");
5
+ if (!rootTimeGroup) {
6
+ throw new Error("No ef-timegroup found");
7
+ }
8
+ console.error("Waiting for media durations", rootTimeGroup);
9
+ await rootTimeGroup.waitForMediaDurations();
10
+ const width = rootTimeGroup.clientWidth;
11
+ const height = rootTimeGroup.clientHeight;
12
+ const fps = 30;
13
+ const durationMs = Math.round(rootTimeGroup.durationMs);
14
+ const elements = document.querySelectorAll(
15
+ "ef-audio, ef-video, ef-image, ef-captions"
16
+ );
17
+ const assets = {
18
+ efMedia: {},
19
+ efCaptions: /* @__PURE__ */ new Set(),
20
+ efImage: /* @__PURE__ */ new Set()
21
+ };
22
+ for (const element of elements) {
23
+ switch (element.tagName) {
24
+ case "EF-AUDIO":
25
+ case "EF-VIDEO": {
26
+ const src = element.src;
27
+ console.error("Processing element", element.tagName, src);
28
+ assets.efMedia[src] = element.trackFragmentIndexLoader.value;
29
+ break;
30
+ }
31
+ case "EF-IMAGE": {
32
+ const src = element.src;
33
+ console.error("Processing element", element.tagName, src);
34
+ assets.efImage.add(src);
35
+ break;
36
+ }
37
+ case "EF-CAPTIONS": {
38
+ const src = element.targetElement?.src;
39
+ console.error("Processing element", element.tagName, src);
40
+ assets.efCaptions.add(src);
41
+ break;
42
+ }
43
+ }
44
+ }
45
+ const renderInfo = {
46
+ width,
47
+ height,
48
+ fps,
49
+ durationMs,
50
+ assets: {
51
+ efMedia: assets.efMedia,
52
+ efCaptions: Array.from(assets.efCaptions),
53
+ efImage: Array.from(assets.efImage)
54
+ }
55
+ };
56
+ console.error("Render info", renderInfo);
57
+ return renderInfo;
58
+ };
59
+ exports.getRenderInfo = getRenderInfo;
@@ -0,0 +1,59 @@
1
+ const getRenderInfo = async () => {
2
+ const rootTimeGroup = document.querySelector("ef-timegroup");
3
+ if (!rootTimeGroup) {
4
+ throw new Error("No ef-timegroup found");
5
+ }
6
+ console.error("Waiting for media durations", rootTimeGroup);
7
+ await rootTimeGroup.waitForMediaDurations();
8
+ const width = rootTimeGroup.clientWidth;
9
+ const height = rootTimeGroup.clientHeight;
10
+ const fps = 30;
11
+ const durationMs = Math.round(rootTimeGroup.durationMs);
12
+ const elements = document.querySelectorAll(
13
+ "ef-audio, ef-video, ef-image, ef-captions"
14
+ );
15
+ const assets = {
16
+ efMedia: {},
17
+ efCaptions: /* @__PURE__ */ new Set(),
18
+ efImage: /* @__PURE__ */ new Set()
19
+ };
20
+ for (const element of elements) {
21
+ switch (element.tagName) {
22
+ case "EF-AUDIO":
23
+ case "EF-VIDEO": {
24
+ const src = element.src;
25
+ console.error("Processing element", element.tagName, src);
26
+ assets.efMedia[src] = element.trackFragmentIndexLoader.value;
27
+ break;
28
+ }
29
+ case "EF-IMAGE": {
30
+ const src = element.src;
31
+ console.error("Processing element", element.tagName, src);
32
+ assets.efImage.add(src);
33
+ break;
34
+ }
35
+ case "EF-CAPTIONS": {
36
+ const src = element.targetElement?.src;
37
+ console.error("Processing element", element.tagName, src);
38
+ assets.efCaptions.add(src);
39
+ break;
40
+ }
41
+ }
42
+ }
43
+ const renderInfo = {
44
+ width,
45
+ height,
46
+ fps,
47
+ durationMs,
48
+ assets: {
49
+ efMedia: assets.efMedia,
50
+ efCaptions: Array.from(assets.efCaptions),
51
+ efImage: Array.from(assets.efImage)
52
+ }
53
+ };
54
+ console.error("Render info", renderInfo);
55
+ return renderInfo;
56
+ };
57
+ export {
58
+ getRenderInfo
59
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const assets = require("@editframe/assets");
4
+ const processRenderInfo = async (renderInfo) => {
5
+ for (const [src, tracks] of Object.entries(renderInfo.assets.efMedia)) {
6
+ process.stderr.write("Processing media asset: ");
7
+ process.stderr.write(src);
8
+ process.stderr.write("\n");
9
+ for (const trackId in tracks) {
10
+ await assets.generateTrack(
11
+ "./src/assets",
12
+ `./src${src}`,
13
+ `src?trackId=${trackId}`
14
+ );
15
+ }
16
+ }
17
+ for (const imageAsset of renderInfo.assets.efImage) {
18
+ process.stderr.write("Processing image asset: ");
19
+ process.stderr.write(imageAsset);
20
+ process.stderr.write("\n");
21
+ await assets.cacheImage("./src/assets", `./src${imageAsset}`);
22
+ }
23
+ for (const captionsAsset of renderInfo.assets.efCaptions) {
24
+ process.stderr.write("Processing captions asset: ");
25
+ process.stderr.write(captionsAsset);
26
+ process.stderr.write("\n");
27
+ await assets.findOrCreateCaptions("./src/assets", `./src${captionsAsset}`);
28
+ }
29
+ };
30
+ exports.processRenderInfo = processRenderInfo;
@@ -0,0 +1,30 @@
1
+ import { generateTrack, cacheImage, findOrCreateCaptions } from "@editframe/assets";
2
+ const processRenderInfo = async (renderInfo) => {
3
+ for (const [src, tracks] of Object.entries(renderInfo.assets.efMedia)) {
4
+ process.stderr.write("Processing media asset: ");
5
+ process.stderr.write(src);
6
+ process.stderr.write("\n");
7
+ for (const trackId in tracks) {
8
+ await generateTrack(
9
+ "./src/assets",
10
+ `./src${src}`,
11
+ `src?trackId=${trackId}`
12
+ );
13
+ }
14
+ }
15
+ for (const imageAsset of renderInfo.assets.efImage) {
16
+ process.stderr.write("Processing image asset: ");
17
+ process.stderr.write(imageAsset);
18
+ process.stderr.write("\n");
19
+ await cacheImage("./src/assets", `./src${imageAsset}`);
20
+ }
21
+ for (const captionsAsset of renderInfo.assets.efCaptions) {
22
+ process.stderr.write("Processing captions asset: ");
23
+ process.stderr.write(captionsAsset);
24
+ process.stderr.write("\n");
25
+ await findOrCreateCaptions("./src/assets", `./src${captionsAsset}`);
26
+ }
27
+ };
28
+ export {
29
+ processRenderInfo
30
+ };