@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.
- package/dist/VERSION.cjs +1 -1
- package/dist/VERSION.js +1 -1
- package/dist/commands/auth.cjs +14 -11
- package/dist/commands/auth.js +15 -12
- package/dist/commands/check.cjs +2 -2
- package/dist/commands/check.js +2 -2
- package/dist/commands/process.cjs +36 -0
- package/dist/commands/process.js +35 -0
- package/dist/commands/render.cjs +34 -25
- package/dist/commands/render.js +34 -25
- package/dist/index.cjs +1 -11
- package/dist/index.js +1 -12
- package/dist/operations/getRenderInfo.cjs +59 -0
- package/dist/operations/getRenderInfo.js +59 -0
- package/dist/operations/processRenderInfo.cjs +30 -0
- package/dist/operations/processRenderInfo.js +30 -0
- package/dist/operations/syncAssetsDirectory.cjs +83 -40
- package/dist/operations/syncAssetsDirectory.js +82 -39
- package/dist/utils/index.cjs +8 -15
- package/dist/utils/index.js +8 -15
- package/dist/utils/launchBrowserAndWaitForSDK.cjs +7 -3
- package/dist/utils/launchBrowserAndWaitForSDK.js +7 -3
- package/dist/utils/validateVideoResolution.cjs +27 -0
- package/dist/utils/validateVideoResolution.js +27 -0
- package/package.json +6 -12
- package/src/commands/auth.ts +14 -12
- package/src/commands/check.ts +2 -2
- package/src/commands/process.ts +43 -37
- package/src/commands/render.ts +32 -30
- package/src/operations/getRenderInfo.ts +80 -0
- package/src/operations/processRenderInfo.ts +37 -0
- package/src/operations/syncAssetsDirectory.ts +77 -40
- package/src/utils/index.ts +7 -16
- package/src/utils/launchBrowserAndWaitForSDK.ts +9 -3
- package/src/utils/validateVideoResolution.ts +33 -0
- package/dist/api/caption-file.cjs +0 -48
- package/dist/api/caption-file.js +0 -48
- package/dist/api/image-file.cjs +0 -49
- package/dist/api/image-file.js +0 -49
- package/dist/api/index.cjs +0 -12
- package/dist/api/index.js +0 -12
- package/dist/api/isobmff-file.cjs +0 -48
- package/dist/api/isobmff-file.js +0 -48
- package/dist/api/isobmff-track.cjs +0 -63
- package/dist/api/isobmff-track.js +0 -63
- package/dist/api/renders.cjs +0 -51
- package/dist/api/renders.js +0 -51
- package/src/api/caption-file.ts +0 -60
- package/src/api/image-file.ts +0 -58
- package/src/api/index.ts +0 -17
- package/src/api/isobmff-file.ts +0 -59
- package/src/api/isobmff-track.ts +0 -77
- package/src/api/renders.ts +0 -59
package/dist/VERSION.cjs
CHANGED
package/dist/VERSION.js
CHANGED
package/dist/commands/auth.cjs
CHANGED
|
@@ -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").
|
|
13
|
+
const authCommand = commander.program.command("auth").description("Fetch organization data using API token").action(async () => {
|
|
12
14
|
const options = authCommand.opts();
|
|
13
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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;
|
package/dist/commands/auth.js
CHANGED
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
import { program } from "commander";
|
|
2
2
|
import ora from "ora";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
-
import
|
|
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").
|
|
11
|
+
const authCommand = program.command("auth").description("Fetch organization data using API token").action(async () => {
|
|
10
12
|
const options = authCommand.opts();
|
|
11
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
+
process.stderr.write(error?.message);
|
|
27
|
+
process.stderr.write("\n");
|
|
28
|
+
log("Error:", error);
|
|
26
29
|
}
|
|
27
30
|
});
|
|
28
31
|
export {
|
package/dist/commands/check.cjs
CHANGED
|
@@ -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
|
-
|
|
112
|
-
|
|
111
|
+
process.stderr.write(chalk.red(check.message().join("\n\n")));
|
|
112
|
+
process.stderr.write("\n");
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
});
|
package/dist/commands/check.js
CHANGED
|
@@ -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
|
-
|
|
111
|
-
|
|
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
|
+
});
|
package/dist/commands/render.cjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
156
|
-
|
|
157
|
-
|
|
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
|
});
|
package/dist/commands/render.js
CHANGED
|
@@ -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 "
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
139
|
-
|
|
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
|
+
};
|