@hyperframes/engine 0.7.34 → 0.7.35
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffmpegBinaries.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpegBinaries.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"ffmpegBinaries.d.ts","sourceRoot":"","sources":["../../src/utils/ffmpegBinaries.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,4BAA4B,CAAC;AACzD,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAoF3D,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,mCAAmC,IAAI,IAAI,CAgB1D"}
|
|
@@ -1,13 +1,61 @@
|
|
|
1
1
|
// fallow-ignore-file code-duplication
|
|
2
2
|
import { execFileSync } from "child_process";
|
|
3
|
-
import { existsSync } from "fs";
|
|
4
|
-
import { resolve } from "path";
|
|
3
|
+
import { accessSync, constants, existsSync } from "fs";
|
|
4
|
+
import { delimiter, join, resolve } from "path";
|
|
5
5
|
export const FFMPEG_PATH_ENV = "HYPERFRAMES_FFMPEG_PATH";
|
|
6
6
|
export const FFPROBE_PATH_ENV = "HYPERFRAMES_FFPROBE_PATH";
|
|
7
7
|
const pathCache = new Map();
|
|
8
|
+
function candidateFileName(candidate) {
|
|
9
|
+
return candidate.split(/[\\/]/).at(-1)?.toLowerCase() ?? candidate.toLowerCase();
|
|
10
|
+
}
|
|
11
|
+
function chooseBestPathCandidate(name, candidates) {
|
|
12
|
+
const normalized = candidates.map((candidate) => candidate.trim()).filter(Boolean);
|
|
13
|
+
return (normalized.find((candidate) => candidateFileName(candidate) === `${name}.exe`) ??
|
|
14
|
+
normalized.find((candidate) => candidateFileName(candidate) === name) ??
|
|
15
|
+
normalized.find((candidate) => !candidateFileName(candidate).match(/\.(cmd|bat)$/i)) ??
|
|
16
|
+
normalized[0]);
|
|
17
|
+
}
|
|
18
|
+
function scanPath(name) {
|
|
19
|
+
const pathValue = process.env.PATH;
|
|
20
|
+
if (!pathValue)
|
|
21
|
+
return undefined;
|
|
22
|
+
const extensions = process.platform === "win32"
|
|
23
|
+
? [
|
|
24
|
+
".exe",
|
|
25
|
+
...new Set((process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
|
|
26
|
+
.split(";")
|
|
27
|
+
.map((ext) => ext.trim().toLowerCase())
|
|
28
|
+
.filter(Boolean)),
|
|
29
|
+
"",
|
|
30
|
+
]
|
|
31
|
+
: [""];
|
|
32
|
+
const candidates = [];
|
|
33
|
+
for (const dir of pathValue.split(delimiter)) {
|
|
34
|
+
if (!dir)
|
|
35
|
+
continue;
|
|
36
|
+
for (const ext of extensions) {
|
|
37
|
+
const candidate = join(dir, `${name}${ext}`);
|
|
38
|
+
if (isExecutablePathCandidate(candidate))
|
|
39
|
+
candidates.push(candidate);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return chooseBestPathCandidate(name, candidates);
|
|
43
|
+
}
|
|
44
|
+
function isExecutablePathCandidate(candidate) {
|
|
45
|
+
if (process.platform === "win32")
|
|
46
|
+
return existsSync(candidate);
|
|
47
|
+
try {
|
|
48
|
+
accessSync(candidate, constants.X_OK);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
8
55
|
function findOnPath(name) {
|
|
9
56
|
if (pathCache.has(name))
|
|
10
57
|
return pathCache.get(name);
|
|
58
|
+
let found;
|
|
11
59
|
try {
|
|
12
60
|
const command = process.platform === "win32" ? "where" : "which";
|
|
13
61
|
const output = execFileSync(command, [name], {
|
|
@@ -15,18 +63,14 @@ function findOnPath(name) {
|
|
|
15
63
|
stdio: ["pipe", "pipe", "pipe"],
|
|
16
64
|
timeout: 5000,
|
|
17
65
|
});
|
|
18
|
-
|
|
19
|
-
.split(/\r?\n/)
|
|
20
|
-
.map((s) => s.trim())
|
|
21
|
-
.find(Boolean);
|
|
22
|
-
const resolved = first ? resolve(first) : undefined;
|
|
23
|
-
pathCache.set(name, resolved);
|
|
24
|
-
return resolved;
|
|
66
|
+
found = chooseBestPathCandidate(name, output.split(/\r?\n/));
|
|
25
67
|
}
|
|
26
68
|
catch {
|
|
27
|
-
|
|
28
|
-
return undefined;
|
|
69
|
+
found = scanPath(name);
|
|
29
70
|
}
|
|
71
|
+
const resolved = found ? resolve(found) : undefined;
|
|
72
|
+
pathCache.set(name, resolved);
|
|
73
|
+
return resolved;
|
|
30
74
|
}
|
|
31
75
|
function getConfiguredBinary(envName, binaryName) {
|
|
32
76
|
const configured = process.env[envName]?.trim();
|
|
@@ -44,12 +88,17 @@ export function assertConfiguredFfmpegBinariesExist() {
|
|
|
44
88
|
const ffmpegPath = process.env[FFMPEG_PATH_ENV]?.trim();
|
|
45
89
|
if (ffmpegPath && !existsSync(ffmpegPath)) {
|
|
46
90
|
throw new Error(`[FFmpeg] FFmpeg binary not found at ${FFMPEG_PATH_ENV}="${ffmpegPath}". ` +
|
|
47
|
-
|
|
91
|
+
`Install FFmpeg or unset the override.${pathEncodingHint(ffmpegPath)}`);
|
|
48
92
|
}
|
|
49
93
|
const ffprobePath = process.env[FFPROBE_PATH_ENV]?.trim();
|
|
50
94
|
if (ffprobePath && !existsSync(ffprobePath)) {
|
|
51
95
|
throw new Error(`[FFmpeg] FFprobe binary not found at ${FFPROBE_PATH_ENV}="${ffprobePath}". ` +
|
|
52
|
-
|
|
96
|
+
`Install FFmpeg or unset the override.${pathEncodingHint(ffprobePath)}`);
|
|
53
97
|
}
|
|
54
98
|
}
|
|
99
|
+
function pathEncodingHint(configuredPath) {
|
|
100
|
+
if (!configuredPath.includes("\uFFFD"))
|
|
101
|
+
return "";
|
|
102
|
+
return " The path contains a Unicode replacement character, which usually means it was mangled while being copied or decoded.";
|
|
103
|
+
}
|
|
55
104
|
//# sourceMappingURL=ffmpegBinaries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffmpegBinaries.js","sourceRoot":"","sources":["../../src/utils/ffmpegBinaries.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ffmpegBinaries.js","sourceRoot":"","sources":["../../src/utils/ffmpegBinaries.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperframes/engine",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.35",
|
|
4
4
|
"description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"linkedom": "^0.18.12",
|
|
39
39
|
"puppeteer": "^24.0.0",
|
|
40
40
|
"puppeteer-core": "^24.39.1",
|
|
41
|
-
"@hyperframes/core": "^0.7.
|
|
41
|
+
"@hyperframes/core": "^0.7.35"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^25.0.10",
|