@vibeframe/mcp-server 0.49.1 → 0.51.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.
- package/dist/index.js +2669 -430
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -6867,6 +6867,8 @@ function buildClipElements(state) {
|
|
|
6867
6867
|
return `<div id="${clip.id}" class="clip" style="z-index:${zIndex};"><video id="${clip.id}-media" src="${relAsset(source3.url)}" style="width:100%;height:100%;object-fit:cover;" muted playsinline></video></div>`;
|
|
6868
6868
|
case "audio":
|
|
6869
6869
|
return `<audio id="${clip.id}-media" src="${relAsset(source3.url)}"></audio><div id="${clip.id}" class="clip" style="z-index:${zIndex};background:#111;"></div>`;
|
|
6870
|
+
case "lottie":
|
|
6871
|
+
return `<div id="${clip.id}" class="clip" style="z-index:${zIndex};"><dotlottie-wc src="${relAsset(source3.url)}" autoplay loop style="width:100%;height:100%;"></dotlottie-wc></div>`;
|
|
6870
6872
|
default:
|
|
6871
6873
|
return `<!-- unsupported source type: ${source3.type} for clip ${clip.id} -->`;
|
|
6872
6874
|
}
|
|
@@ -6988,7 +6990,13 @@ function generateCompositionHtml(state) {
|
|
|
6988
6990
|
const mediaDecls = buildMediaDeclarations(state);
|
|
6989
6991
|
const clipData = buildClipRuntimeData(state);
|
|
6990
6992
|
const duration = state.project.duration;
|
|
6993
|
+
const hasLottie = state.sources.some((s) => s.type === "lottie");
|
|
6991
6994
|
const script = RUNTIME_SCRIPT.replace("/*CLIPS_JSON*/[]", JSON.stringify(clipData)).replace("/*DURATION*/0", String(duration)).replace("/*MEDIA_JSON*/[]", JSON.stringify(mediaDecls));
|
|
6995
|
+
const lottieRuntime = hasLottie ? `<script type="module">
|
|
6996
|
+
import { setWasmUrl } from "/vendor/dotlottie-wc/index.js";
|
|
6997
|
+
setWasmUrl("/vendor/dotlottie-player.wasm");
|
|
6998
|
+
</script>
|
|
6999
|
+
` : "";
|
|
6992
7000
|
return `<!DOCTYPE html>
|
|
6993
7001
|
<html><head>
|
|
6994
7002
|
<meta charset="utf-8">
|
|
@@ -6996,7 +7004,7 @@ function generateCompositionHtml(state) {
|
|
|
6996
7004
|
html, body { margin: 0; width: ${width}px; height: ${height}px; overflow: hidden; background: #000; }
|
|
6997
7005
|
.clip { position: absolute; inset: 0; display: none; }
|
|
6998
7006
|
</style>
|
|
6999
|
-
</head><body>
|
|
7007
|
+
${lottieRuntime}</head><body>
|
|
7000
7008
|
${clipMarkup}
|
|
7001
7009
|
<script>
|
|
7002
7010
|
${script}
|
|
@@ -7018,9 +7026,10 @@ __export(project_builder_exports, {
|
|
|
7018
7026
|
buildTempProject: () => buildTempProject,
|
|
7019
7027
|
resolveSourceUrl: () => resolveSourceUrl
|
|
7020
7028
|
});
|
|
7021
|
-
import { mkdtemp, mkdir, copyFile, writeFile as writeFile2, rm } from "node:fs/promises";
|
|
7029
|
+
import { mkdtemp, mkdir, copyFile, writeFile as writeFile2, rm, readdir } from "node:fs/promises";
|
|
7022
7030
|
import { existsSync } from "node:fs";
|
|
7023
7031
|
import { tmpdir } from "node:os";
|
|
7032
|
+
import { createRequire } from "node:module";
|
|
7024
7033
|
import * as path from "node:path";
|
|
7025
7034
|
async function buildTempProject(state, projectFileDir) {
|
|
7026
7035
|
const dir = await mkdtemp(path.join(tmpdir(), "vibeframe-hf-"));
|
|
@@ -7037,6 +7046,9 @@ async function buildTempProject(state, projectFileDir) {
|
|
|
7037
7046
|
await copyFile(resolved, dest);
|
|
7038
7047
|
copied.set(source3.id, dest);
|
|
7039
7048
|
}
|
|
7049
|
+
if (state.sources.some((s) => s.type === "lottie")) {
|
|
7050
|
+
await copyLottieRuntime(dir);
|
|
7051
|
+
}
|
|
7040
7052
|
const html = generateCompositionHtml(state);
|
|
7041
7053
|
await writeFile2(path.join(dir, "index.html"), html, "utf-8");
|
|
7042
7054
|
return {
|
|
@@ -7044,6 +7056,21 @@ async function buildTempProject(state, projectFileDir) {
|
|
|
7044
7056
|
cleanup: () => rm(dir, { recursive: true, force: true })
|
|
7045
7057
|
};
|
|
7046
7058
|
}
|
|
7059
|
+
async function copyLottieRuntime(tempDir) {
|
|
7060
|
+
const require2 = createRequire(import.meta.url);
|
|
7061
|
+
const wcPkgPath = require2.resolve("@lottiefiles/dotlottie-wc/package.json");
|
|
7062
|
+
const wcDistDir = path.join(path.dirname(wcPkgPath), "dist");
|
|
7063
|
+
const webEntry = require2.resolve("@lottiefiles/dotlottie-web");
|
|
7064
|
+
const wasmSrc = path.join(path.dirname(webEntry), "dotlottie-player.wasm");
|
|
7065
|
+
const vendorDir = path.join(tempDir, "vendor");
|
|
7066
|
+
const wcDest = path.join(vendorDir, "dotlottie-wc");
|
|
7067
|
+
await mkdir(wcDest, { recursive: true });
|
|
7068
|
+
for (const file of await readdir(wcDistDir)) {
|
|
7069
|
+
if (file.endsWith(".map") || file.endsWith(".d.ts")) continue;
|
|
7070
|
+
await copyFile(path.join(wcDistDir, file), path.join(wcDest, file));
|
|
7071
|
+
}
|
|
7072
|
+
await copyFile(wasmSrc, path.join(vendorDir, "dotlottie-player.wasm"));
|
|
7073
|
+
}
|
|
7047
7074
|
function resolveSourceUrl(url, baseDir) {
|
|
7048
7075
|
if (url.startsWith("file://")) return url.slice(7);
|
|
7049
7076
|
if (path.isAbsolute(url)) return url;
|
|
@@ -8616,12 +8643,12 @@ ${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`;
|
|
|
8616
8643
|
}
|
|
8617
8644
|
return result;
|
|
8618
8645
|
}
|
|
8619
|
-
function convertOutputFiles({ path: path33, contents, hash }) {
|
|
8646
|
+
function convertOutputFiles({ path: path33, contents, hash: hash2 }) {
|
|
8620
8647
|
let text = null;
|
|
8621
8648
|
return {
|
|
8622
8649
|
path: path33,
|
|
8623
8650
|
contents,
|
|
8624
|
-
hash,
|
|
8651
|
+
hash: hash2,
|
|
8625
8652
|
get text() {
|
|
8626
8653
|
const binary = this.contents;
|
|
8627
8654
|
if (text === null || binary !== contents) {
|
|
@@ -18089,12 +18116,12 @@ var require_common = __commonJS({
|
|
|
18089
18116
|
createDebug.skips = [];
|
|
18090
18117
|
createDebug.formatters = {};
|
|
18091
18118
|
function selectColor(namespace) {
|
|
18092
|
-
let
|
|
18119
|
+
let hash2 = 0;
|
|
18093
18120
|
for (let i = 0; i < namespace.length; i++) {
|
|
18094
|
-
|
|
18095
|
-
|
|
18121
|
+
hash2 = (hash2 << 5) - hash2 + namespace.charCodeAt(i);
|
|
18122
|
+
hash2 |= 0;
|
|
18096
18123
|
}
|
|
18097
|
-
return createDebug.colors[Math.abs(
|
|
18124
|
+
return createDebug.colors[Math.abs(hash2) % createDebug.colors.length];
|
|
18098
18125
|
}
|
|
18099
18126
|
createDebug.selectColor = selectColor;
|
|
18100
18127
|
function createDebug(namespace) {
|
|
@@ -68004,25 +68031,25 @@ var require_data = __commonJS({
|
|
|
68004
68031
|
var notmodified_1 = __importDefault3(require_notmodified());
|
|
68005
68032
|
var debug7 = (0, debug_1.default)("get-uri:data");
|
|
68006
68033
|
var DataReadable = class extends stream_1.Readable {
|
|
68007
|
-
constructor(
|
|
68034
|
+
constructor(hash2, buf) {
|
|
68008
68035
|
super();
|
|
68009
68036
|
this.push(buf);
|
|
68010
68037
|
this.push(null);
|
|
68011
|
-
this.hash =
|
|
68038
|
+
this.hash = hash2;
|
|
68012
68039
|
}
|
|
68013
68040
|
};
|
|
68014
68041
|
var data = async ({ href: uri }, { cache } = {}) => {
|
|
68015
68042
|
const shasum = (0, crypto_1.createHash)("sha1");
|
|
68016
68043
|
shasum.update(uri);
|
|
68017
|
-
const
|
|
68018
|
-
debug7('generated SHA1 hash for "data:" URI: %o',
|
|
68019
|
-
if (cache?.hash ===
|
|
68020
|
-
debug7("got matching cache SHA1 hash: %o",
|
|
68044
|
+
const hash2 = shasum.digest("hex");
|
|
68045
|
+
debug7('generated SHA1 hash for "data:" URI: %o', hash2);
|
|
68046
|
+
if (cache?.hash === hash2) {
|
|
68047
|
+
debug7("got matching cache SHA1 hash: %o", hash2);
|
|
68021
68048
|
throw new notmodified_1.default();
|
|
68022
68049
|
} else {
|
|
68023
68050
|
debug7('creating Readable stream from "data:" URI buffer');
|
|
68024
68051
|
const { buffer } = (0, data_uri_to_buffer_1.dataUriToBuffer)(uri);
|
|
68025
|
-
return new DataReadable(
|
|
68052
|
+
return new DataReadable(hash2, Buffer.from(buffer));
|
|
68026
68053
|
}
|
|
68027
68054
|
};
|
|
68028
68055
|
exports.data = data;
|
|
@@ -89270,14 +89297,14 @@ var require_dist10 = __commonJS({
|
|
|
89270
89297
|
(0, quickjs_emscripten_1.getQuickJS)(),
|
|
89271
89298
|
this.loadPacFile()
|
|
89272
89299
|
]);
|
|
89273
|
-
const
|
|
89274
|
-
if (this.resolver && this.resolverHash ===
|
|
89300
|
+
const hash2 = crypto3.createHash("sha1").update(code).digest("hex");
|
|
89301
|
+
if (this.resolver && this.resolverHash === hash2) {
|
|
89275
89302
|
debug7("Same sha1 hash for code - contents have not changed, reusing previous proxy resolver");
|
|
89276
89303
|
return this.resolver;
|
|
89277
89304
|
}
|
|
89278
89305
|
debug7("Creating new proxy resolver instance");
|
|
89279
89306
|
this.resolver = (0, pac_resolver_1.createPacResolver)(qjs, code, this.opts);
|
|
89280
|
-
this.resolverHash =
|
|
89307
|
+
this.resolverHash = hash2;
|
|
89281
89308
|
return this.resolver;
|
|
89282
89309
|
} catch (err) {
|
|
89283
89310
|
if (this.resolver && err.code === "ENOTMODIFIED") {
|
|
@@ -95672,7 +95699,7 @@ var require_tar_fs = __commonJS({
|
|
|
95672
95699
|
// ../../node_modules/.pnpm/@puppeteer+browsers@2.13.0/node_modules/@puppeteer/browsers/lib/esm/fileUtil.js
|
|
95673
95700
|
import { spawnSync, spawn } from "node:child_process";
|
|
95674
95701
|
import { createReadStream } from "node:fs";
|
|
95675
|
-
import { mkdir as mkdir2, readdir } from "node:fs/promises";
|
|
95702
|
+
import { mkdir as mkdir2, readdir as readdir2 } from "node:fs/promises";
|
|
95676
95703
|
import * as path8 from "node:path";
|
|
95677
95704
|
import { Stream } from "node:stream";
|
|
95678
95705
|
async function unpackArchive(archivePath, folderPath) {
|
|
@@ -95774,7 +95801,7 @@ async function installDMG(dmgPath, folderPath) {
|
|
|
95774
95801
|
}
|
|
95775
95802
|
const mountPath = volumes[0];
|
|
95776
95803
|
try {
|
|
95777
|
-
const fileNames = await
|
|
95804
|
+
const fileNames = await readdir2(mountPath);
|
|
95778
95805
|
const appName = fileNames.find((item) => {
|
|
95779
95806
|
return typeof item === "string" && item.endsWith(".app");
|
|
95780
95807
|
});
|
|
@@ -96394,18 +96421,18 @@ var init_cliui = __esm({
|
|
|
96394
96421
|
});
|
|
96395
96422
|
|
|
96396
96423
|
// ../../node_modules/.pnpm/escalade@3.2.0/node_modules/escalade/sync/index.mjs
|
|
96397
|
-
import { dirname, resolve as resolve6 } from "path";
|
|
96424
|
+
import { dirname as dirname2, resolve as resolve6 } from "path";
|
|
96398
96425
|
import { readdirSync, statSync } from "fs";
|
|
96399
96426
|
function sync_default(start, callback) {
|
|
96400
96427
|
let dir = resolve6(".", start);
|
|
96401
96428
|
let tmp, stats = statSync(dir);
|
|
96402
96429
|
if (!stats.isDirectory()) {
|
|
96403
|
-
dir =
|
|
96430
|
+
dir = dirname2(dir);
|
|
96404
96431
|
}
|
|
96405
96432
|
while (true) {
|
|
96406
96433
|
tmp = callback(dir, readdirSync(dir));
|
|
96407
96434
|
if (tmp) return resolve6(dir, tmp);
|
|
96408
|
-
dir =
|
|
96435
|
+
dir = dirname2(tmp = dir);
|
|
96409
96436
|
if (tmp === dir) break;
|
|
96410
96437
|
}
|
|
96411
96438
|
}
|
|
@@ -97667,7 +97694,7 @@ import { notStrictEqual, strictEqual } from "assert";
|
|
|
97667
97694
|
import { inspect } from "util";
|
|
97668
97695
|
import { readFileSync as readFileSync4 } from "fs";
|
|
97669
97696
|
import { fileURLToPath } from "url";
|
|
97670
|
-
import { basename as basename2, dirname as
|
|
97697
|
+
import { basename as basename2, dirname as dirname3, extname, relative as relative2, resolve as resolve9 } from "path";
|
|
97671
97698
|
var REQUIRE_ERROR, REQUIRE_DIRECTORY_ERROR, __dirname2, mainFilename, esm_default;
|
|
97672
97699
|
var init_esm2 = __esm({
|
|
97673
97700
|
"../../node_modules/.pnpm/yargs@17.7.2/node_modules/yargs/lib/platform-shims/esm.mjs"() {
|
|
@@ -97705,7 +97732,7 @@ var init_esm2 = __esm({
|
|
|
97705
97732
|
Parser: lib_default,
|
|
97706
97733
|
path: {
|
|
97707
97734
|
basename: basename2,
|
|
97708
|
-
dirname:
|
|
97735
|
+
dirname: dirname3,
|
|
97709
97736
|
extname,
|
|
97710
97737
|
relative: relative2,
|
|
97711
97738
|
resolve: resolve9
|
|
@@ -102785,7 +102812,7 @@ var init_PuppeteerNode = __esm({
|
|
|
102785
102812
|
import { spawn as spawn2, spawnSync as spawnSync3 } from "node:child_process";
|
|
102786
102813
|
import fs5 from "node:fs";
|
|
102787
102814
|
import os9 from "node:os";
|
|
102788
|
-
import { dirname as
|
|
102815
|
+
import { dirname as dirname4 } from "node:path";
|
|
102789
102816
|
import { PassThrough } from "node:stream";
|
|
102790
102817
|
var import_debug6, __runInitializers23, __esDecorate23, __setFunctionName6, CRF_VALUE, DEFAULT_FPS, debugFfmpeg, ScreenRecorder;
|
|
102791
102818
|
var init_ScreenRecorder = __esm({
|
|
@@ -102904,7 +102931,7 @@ var init_ScreenRecorder = __esm({
|
|
|
102904
102931
|
filters2.push(formatArgs.splice(vf, 2).at(-1) ?? "");
|
|
102905
102932
|
}
|
|
102906
102933
|
if (path15) {
|
|
102907
|
-
fs5.mkdirSync(
|
|
102934
|
+
fs5.mkdirSync(dirname4(path15), { recursive: overwrite });
|
|
102908
102935
|
}
|
|
102909
102936
|
this.#process = spawn2(
|
|
102910
102937
|
ffmpegPath,
|
|
@@ -110016,16 +110043,16 @@ var require_typescript2 = __commonJS({
|
|
|
110016
110043
|
}
|
|
110017
110044
|
const set = {
|
|
110018
110045
|
has(element) {
|
|
110019
|
-
const
|
|
110020
|
-
if (!multiMap.has(
|
|
110021
|
-
const candidates = multiMap.get(
|
|
110046
|
+
const hash2 = getHashCode(element);
|
|
110047
|
+
if (!multiMap.has(hash2)) return false;
|
|
110048
|
+
const candidates = multiMap.get(hash2);
|
|
110022
110049
|
if (isArray5(candidates)) return contains(candidates, element, equals);
|
|
110023
110050
|
return equals(candidates, element);
|
|
110024
110051
|
},
|
|
110025
110052
|
add(element) {
|
|
110026
|
-
const
|
|
110027
|
-
if (multiMap.has(
|
|
110028
|
-
const values = multiMap.get(
|
|
110053
|
+
const hash2 = getHashCode(element);
|
|
110054
|
+
if (multiMap.has(hash2)) {
|
|
110055
|
+
const values = multiMap.get(hash2);
|
|
110029
110056
|
if (isArray5(values)) {
|
|
110030
110057
|
if (!contains(values, element, equals)) {
|
|
110031
110058
|
values.push(element);
|
|
@@ -110034,27 +110061,27 @@ var require_typescript2 = __commonJS({
|
|
|
110034
110061
|
} else {
|
|
110035
110062
|
const value = values;
|
|
110036
110063
|
if (!equals(value, element)) {
|
|
110037
|
-
multiMap.set(
|
|
110064
|
+
multiMap.set(hash2, [value, element]);
|
|
110038
110065
|
size++;
|
|
110039
110066
|
}
|
|
110040
110067
|
}
|
|
110041
110068
|
} else {
|
|
110042
|
-
multiMap.set(
|
|
110069
|
+
multiMap.set(hash2, element);
|
|
110043
110070
|
size++;
|
|
110044
110071
|
}
|
|
110045
110072
|
return this;
|
|
110046
110073
|
},
|
|
110047
110074
|
delete(element) {
|
|
110048
|
-
const
|
|
110049
|
-
if (!multiMap.has(
|
|
110050
|
-
const candidates = multiMap.get(
|
|
110075
|
+
const hash2 = getHashCode(element);
|
|
110076
|
+
if (!multiMap.has(hash2)) return false;
|
|
110077
|
+
const candidates = multiMap.get(hash2);
|
|
110051
110078
|
if (isArray5(candidates)) {
|
|
110052
110079
|
for (let i = 0; i < candidates.length; i++) {
|
|
110053
110080
|
if (equals(candidates[i], element)) {
|
|
110054
110081
|
if (candidates.length === 1) {
|
|
110055
|
-
multiMap.delete(
|
|
110082
|
+
multiMap.delete(hash2);
|
|
110056
110083
|
} else if (candidates.length === 2) {
|
|
110057
|
-
multiMap.set(
|
|
110084
|
+
multiMap.set(hash2, candidates[1 - i]);
|
|
110058
110085
|
} else {
|
|
110059
110086
|
unorderedRemoveItemAt(candidates, i);
|
|
110060
110087
|
}
|
|
@@ -110065,7 +110092,7 @@ var require_typescript2 = __commonJS({
|
|
|
110065
110092
|
} else {
|
|
110066
110093
|
const candidate = candidates;
|
|
110067
110094
|
if (equals(candidate, element)) {
|
|
110068
|
-
multiMap.delete(
|
|
110095
|
+
multiMap.delete(hash2);
|
|
110069
110096
|
size--;
|
|
110070
110097
|
return true;
|
|
110071
110098
|
}
|
|
@@ -115731,9 +115758,9 @@ ${lanes.join("\n")}
|
|
|
115731
115758
|
}
|
|
115732
115759
|
}
|
|
115733
115760
|
function createSHA256Hash(data) {
|
|
115734
|
-
const
|
|
115735
|
-
|
|
115736
|
-
return
|
|
115761
|
+
const hash2 = _crypto.createHash("sha256");
|
|
115762
|
+
hash2.update(data);
|
|
115763
|
+
return hash2.digest("hex");
|
|
115737
115764
|
}
|
|
115738
115765
|
}
|
|
115739
115766
|
let sys2;
|
|
@@ -318920,7 +318947,7 @@ var init_puppeteer2 = __esm({
|
|
|
318920
318947
|
}
|
|
318921
318948
|
});
|
|
318922
318949
|
|
|
318923
|
-
// ../../node_modules/.pnpm/@hyperframes+producer@0.4.
|
|
318950
|
+
// ../../node_modules/.pnpm/@hyperframes+producer@0.4.10_typescript@5.9.3/node_modules/@hyperframes/producer/dist/index.js
|
|
318924
318951
|
var dist_exports = {};
|
|
318925
318952
|
__export(dist_exports, {
|
|
318926
318953
|
DEFAULT_CONFIG: () => DEFAULT_CONFIG,
|
|
@@ -318971,7 +318998,7 @@ import os42 from "node:os";
|
|
|
318971
318998
|
import readline3 from "node:readline";
|
|
318972
318999
|
import { spawnSync as spawnSync4, spawn as spawn3 } from "node:child_process";
|
|
318973
319000
|
import { createReadStream as createReadStream2 } from "node:fs";
|
|
318974
|
-
import { mkdir as mkdir4, readdir as
|
|
319001
|
+
import { mkdir as mkdir4, readdir as readdir3 } from "node:fs/promises";
|
|
318975
319002
|
import * as path72 from "node:path";
|
|
318976
319003
|
import { Stream as Stream2 } from "node:stream";
|
|
318977
319004
|
import assert22 from "node:assert";
|
|
@@ -318980,7 +319007,7 @@ import { existsSync as existsSync4, readFileSync as readFileSync5 } from "node:f
|
|
|
318980
319007
|
import { mkdir as mkdir22, unlink as unlink3 } from "node:fs/promises";
|
|
318981
319008
|
import os52 from "node:os";
|
|
318982
319009
|
import path82 from "node:path";
|
|
318983
|
-
import { dirname as
|
|
319010
|
+
import { dirname as dirname5, resolve as resolve22 } from "path";
|
|
318984
319011
|
import { readdirSync as readdirSync2, statSync as statSync3 } from "fs";
|
|
318985
319012
|
import { format as format3 } from "util";
|
|
318986
319013
|
import { normalize as normalize2, resolve as resolve32 } from "path";
|
|
@@ -319018,6 +319045,7 @@ import {
|
|
|
319018
319045
|
mkdirSync as mkdirSync10,
|
|
319019
319046
|
rmSync as rmSync3,
|
|
319020
319047
|
readFileSync as readFileSync9,
|
|
319048
|
+
readdirSync as readdirSync6,
|
|
319021
319049
|
writeFileSync as writeFileSync4,
|
|
319022
319050
|
copyFileSync as copyFileSync2,
|
|
319023
319051
|
appendFileSync
|
|
@@ -319027,10 +319055,10 @@ import { join as join32 } from "path";
|
|
|
319027
319055
|
import { homedir as homedir2 } from "os";
|
|
319028
319056
|
import { existsSync as existsSync42, mkdirSync, writeFileSync } from "fs";
|
|
319029
319057
|
import { join as join52 } from "path";
|
|
319030
|
-
import {
|
|
319058
|
+
import { posix } from "path";
|
|
319031
319059
|
import { spawn as spawn5 } from "child_process";
|
|
319032
319060
|
import { copyFileSync, existsSync as existsSync5, mkdirSync as mkdirSync2, readdirSync as readdirSync3, statSync as statSync32, writeFileSync as writeFileSync2 } from "fs";
|
|
319033
|
-
import { join as join6, dirname as
|
|
319061
|
+
import { join as join6, dirname as dirname52 } from "path";
|
|
319034
319062
|
import { spawn as spawn32 } from "child_process";
|
|
319035
319063
|
import { spawn as spawn4 } from "child_process";
|
|
319036
319064
|
import { spawn as spawn6 } from "child_process";
|
|
@@ -319057,7 +319085,8 @@ import { Http2ServerRequest as Http2ServerRequest2 } from "http2";
|
|
|
319057
319085
|
import { Http2ServerRequest } from "http2";
|
|
319058
319086
|
import { Readable as Readable2 } from "stream";
|
|
319059
319087
|
import crypto2 from "crypto";
|
|
319060
|
-
import {
|
|
319088
|
+
import { inflateSync } from "zlib";
|
|
319089
|
+
import { join as join15, dirname as dirname10, resolve as resolve102 } from "path";
|
|
319061
319090
|
import { randomUUID } from "crypto";
|
|
319062
319091
|
import { freemem as freemem2 } from "os";
|
|
319063
319092
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
@@ -319068,10 +319097,11 @@ import { existsSync as existsSync11, readFileSync as readFileSync52 } from "node
|
|
|
319068
319097
|
import { dirname as dirname8, resolve as resolve72 } from "node:path";
|
|
319069
319098
|
import { fileURLToPath as fileURLToPath22 } from "node:url";
|
|
319070
319099
|
import { readFileSync as readFileSync8, existsSync as existsSync14, mkdirSync as mkdirSync9 } from "fs";
|
|
319071
|
-
import { join as
|
|
319100
|
+
import { join as join14, dirname as dirname9, resolve as resolve92 } from "path";
|
|
319101
|
+
import { resolve as resolve82, basename as basename22, join as join12, relative as relative22, isAbsolute as isAbsolute22 } from "node:path";
|
|
319072
319102
|
import { existsSync as existsSync13, mkdirSync as mkdirSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync3 } from "node:fs";
|
|
319073
319103
|
import { homedir as homedir22 } from "node:os";
|
|
319074
|
-
import { join as
|
|
319104
|
+
import { join as join13 } from "node:path";
|
|
319075
319105
|
import {
|
|
319076
319106
|
existsSync as existsSync17,
|
|
319077
319107
|
mkdirSync as mkdirSync11,
|
|
@@ -319086,8 +319116,7 @@ import { tmpdir as tmpdir22 } from "node:os";
|
|
|
319086
319116
|
import { parseArgs } from "node:util";
|
|
319087
319117
|
import crypto22 from "node:crypto";
|
|
319088
319118
|
import { existsSync as existsSync16, readFileSync as readFileSync10, statSync as statSync6 } from "node:fs";
|
|
319089
|
-
import { resolve as
|
|
319090
|
-
import { resolve as resolve11, basename as basename22, join as join16 } from "node:path";
|
|
319119
|
+
import { resolve as resolve11, join as join16 } from "node:path";
|
|
319091
319120
|
function __extends3(d, b) {
|
|
319092
319121
|
if (typeof b !== "function" && b !== null)
|
|
319093
319122
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
@@ -323570,7 +323599,7 @@ async function installDMG2(dmgPath, folderPath) {
|
|
|
323570
323599
|
}
|
|
323571
323600
|
const mountPath = volumes[0];
|
|
323572
323601
|
try {
|
|
323573
|
-
const fileNames = await
|
|
323602
|
+
const fileNames = await readdir3(mountPath);
|
|
323574
323603
|
const appName = fileNames.find((item) => {
|
|
323575
323604
|
return typeof item === "string" && item.endsWith(".app");
|
|
323576
323605
|
});
|
|
@@ -323930,12 +323959,12 @@ function sync_default2(start, callback) {
|
|
|
323930
323959
|
let dir = resolve22(".", start);
|
|
323931
323960
|
let tmp, stats = statSync3(dir);
|
|
323932
323961
|
if (!stats.isDirectory()) {
|
|
323933
|
-
dir =
|
|
323962
|
+
dir = dirname5(dir);
|
|
323934
323963
|
}
|
|
323935
323964
|
while (true) {
|
|
323936
323965
|
tmp = callback(dir, readdirSync2(dir));
|
|
323937
323966
|
if (tmp) return resolve22(dir, tmp);
|
|
323938
|
-
dir =
|
|
323967
|
+
dir = dirname5(tmp = dir);
|
|
323939
323968
|
if (tmp === dir) break;
|
|
323940
323969
|
}
|
|
323941
323970
|
}
|
|
@@ -326021,10 +326050,10 @@ function compareDocumentPosition(nodeA, nodeB) {
|
|
|
326021
326050
|
function uniqueSort(nodes) {
|
|
326022
326051
|
nodes = nodes.filter((node, i, arr) => !arr.includes(node, i + 1));
|
|
326023
326052
|
nodes.sort((a, b) => {
|
|
326024
|
-
const
|
|
326025
|
-
if (
|
|
326053
|
+
const relative32 = compareDocumentPosition(a, b);
|
|
326054
|
+
if (relative32 & DocumentPosition.PRECEDING) {
|
|
326026
326055
|
return -1;
|
|
326027
|
-
} else if (
|
|
326056
|
+
} else if (relative32 & DocumentPosition.FOLLOWING) {
|
|
326028
326057
|
return 1;
|
|
326029
326058
|
}
|
|
326030
326059
|
return 0;
|
|
@@ -326738,6 +326767,12 @@ function resolveConfig(overrides) {
|
|
|
326738
326767
|
"FFMPEG_STREAMING_TIMEOUT_MS",
|
|
326739
326768
|
DEFAULT_CONFIG.ffmpegStreamingTimeout
|
|
326740
326769
|
),
|
|
326770
|
+
hdr: (() => {
|
|
326771
|
+
const raw2 = env22("PRODUCER_HDR_TRANSFER");
|
|
326772
|
+
if (raw2 === "hlg" || raw2 === "pq") return { transfer: raw2 };
|
|
326773
|
+
return void 0;
|
|
326774
|
+
})(),
|
|
326775
|
+
hdrAutoDetect: envBool("PRODUCER_HDR_AUTO_DETECT", DEFAULT_CONFIG.hdrAutoDetect),
|
|
326741
326776
|
audioGain: envNum("PRODUCER_AUDIO_GAIN", DEFAULT_CONFIG.audioGain),
|
|
326742
326777
|
frameDataUriCacheLimit: Math.max(
|
|
326743
326778
|
32,
|
|
@@ -326913,7 +326948,8 @@ function buildChromeArgs(options, config22) {
|
|
|
326913
326948
|
"--font-render-hinting=none",
|
|
326914
326949
|
"--force-color-profile=srgb",
|
|
326915
326950
|
`--window-size=${options.width},${options.height}`,
|
|
326916
|
-
//
|
|
326951
|
+
// Prevent Chrome from throttling background tabs/timers — critical when the
|
|
326952
|
+
// page is offscreen during headless capture
|
|
326917
326953
|
"--disable-background-timer-throttling",
|
|
326918
326954
|
"--disable-backgrounding-occluded-windows",
|
|
326919
326955
|
"--disable-renderer-backgrounding",
|
|
@@ -327643,6 +327679,81 @@ async function pageScreenshotCapture(page, options) {
|
|
|
327643
327679
|
});
|
|
327644
327680
|
return Buffer.from(result.data, "base64");
|
|
327645
327681
|
}
|
|
327682
|
+
async function initTransparentBackground(page) {
|
|
327683
|
+
const client = await getCdpSession(page);
|
|
327684
|
+
await client.send("Emulation.setDefaultBackgroundColorOverride", {
|
|
327685
|
+
color: { r: 0, g: 0, b: 0, a: 0 }
|
|
327686
|
+
});
|
|
327687
|
+
await page.evaluate((styleId) => {
|
|
327688
|
+
if (document.getElementById(styleId)) return;
|
|
327689
|
+
const style = document.createElement("style");
|
|
327690
|
+
style.id = styleId;
|
|
327691
|
+
style.textContent = "html,body,[data-composition-id]{background:transparent !important;background-color:transparent !important;background-image:none !important;}";
|
|
327692
|
+
document.head.appendChild(style);
|
|
327693
|
+
}, TRANSPARENT_BG_STYLE_ID);
|
|
327694
|
+
}
|
|
327695
|
+
async function captureAlphaPng(page, width, height) {
|
|
327696
|
+
const client = await getCdpSession(page);
|
|
327697
|
+
const result = await client.send("Page.captureScreenshot", {
|
|
327698
|
+
format: "png",
|
|
327699
|
+
fromSurface: true,
|
|
327700
|
+
captureBeyondViewport: false,
|
|
327701
|
+
optimizeForSpeed: false,
|
|
327702
|
+
// must be false to preserve alpha
|
|
327703
|
+
clip: { x: 0, y: 0, width, height, scale: 1 }
|
|
327704
|
+
});
|
|
327705
|
+
return Buffer.from(result.data, "base64");
|
|
327706
|
+
}
|
|
327707
|
+
async function applyDomLayerMask(page, showIds, extraHideIds) {
|
|
327708
|
+
await page.evaluate(
|
|
327709
|
+
(args) => {
|
|
327710
|
+
const existing = document.getElementById(args.styleId);
|
|
327711
|
+
if (existing) existing.remove();
|
|
327712
|
+
const showSelectors = [];
|
|
327713
|
+
for (const id of args.show) {
|
|
327714
|
+
const escaped = CSS.escape(id);
|
|
327715
|
+
showSelectors.push(`#${escaped}`, `#${escaped} *`);
|
|
327716
|
+
const renderEscaped = CSS.escape(`__render_frame_${id}__`);
|
|
327717
|
+
showSelectors.push(`#${renderEscaped}`, `#${renderEscaped} *`);
|
|
327718
|
+
}
|
|
327719
|
+
const massHideRule = "body *{visibility:hidden !important;}";
|
|
327720
|
+
const showRule = showSelectors.length === 0 ? "" : `${showSelectors.join(",")}{visibility:visible !important;}`;
|
|
327721
|
+
const style = document.createElement("style");
|
|
327722
|
+
style.id = args.styleId;
|
|
327723
|
+
style.textContent = `${massHideRule}
|
|
327724
|
+
${showRule}`;
|
|
327725
|
+
document.head.appendChild(style);
|
|
327726
|
+
for (const id of args.hide) {
|
|
327727
|
+
const el = document.getElementById(id);
|
|
327728
|
+
if (el) {
|
|
327729
|
+
el.style.setProperty("visibility", "hidden", "important");
|
|
327730
|
+
}
|
|
327731
|
+
const img = document.getElementById(`__render_frame_${id}__`);
|
|
327732
|
+
if (img) {
|
|
327733
|
+
img.style.setProperty("visibility", "hidden", "important");
|
|
327734
|
+
}
|
|
327735
|
+
}
|
|
327736
|
+
},
|
|
327737
|
+
{ show: showIds, hide: extraHideIds, styleId: DOM_LAYER_MASK_STYLE_ID }
|
|
327738
|
+
);
|
|
327739
|
+
}
|
|
327740
|
+
async function removeDomLayerMask(page, extraHideIds) {
|
|
327741
|
+
await page.evaluate(
|
|
327742
|
+
(args) => {
|
|
327743
|
+
const style = document.getElementById(args.styleId);
|
|
327744
|
+
if (style) style.remove();
|
|
327745
|
+
for (const id of args.hide) {
|
|
327746
|
+
const el = document.getElementById(id);
|
|
327747
|
+
if (el) {
|
|
327748
|
+
el.style.removeProperty("visibility");
|
|
327749
|
+
}
|
|
327750
|
+
const img = document.getElementById(`__render_frame_${id}__`);
|
|
327751
|
+
if (img) img.style.removeProperty("visibility");
|
|
327752
|
+
}
|
|
327753
|
+
},
|
|
327754
|
+
{ hide: extraHideIds, styleId: DOM_LAYER_MASK_STYLE_ID }
|
|
327755
|
+
);
|
|
327756
|
+
}
|
|
327646
327757
|
async function injectVideoFramesBatch(page, updates) {
|
|
327647
327758
|
if (updates.length === 0) return;
|
|
327648
327759
|
await page.evaluate(
|
|
@@ -327664,16 +327775,7 @@ async function injectVideoFramesBatch(page, updates) {
|
|
|
327664
327775
|
video.parentNode?.insertBefore(img, video.nextSibling);
|
|
327665
327776
|
}
|
|
327666
327777
|
if (!img) continue;
|
|
327667
|
-
|
|
327668
|
-
img.style.position = computedStyle.position;
|
|
327669
|
-
img.style.width = computedStyle.width;
|
|
327670
|
-
img.style.height = computedStyle.height;
|
|
327671
|
-
img.style.top = computedStyle.top;
|
|
327672
|
-
img.style.left = computedStyle.left;
|
|
327673
|
-
img.style.right = computedStyle.right;
|
|
327674
|
-
img.style.bottom = computedStyle.bottom;
|
|
327675
|
-
img.style.inset = computedStyle.inset;
|
|
327676
|
-
} else {
|
|
327778
|
+
{
|
|
327677
327779
|
const videoRect = video.getBoundingClientRect();
|
|
327678
327780
|
const offsetLeft = Number.isFinite(video.offsetLeft) ? video.offsetLeft : 0;
|
|
327679
327781
|
const offsetTop = Number.isFinite(video.offsetTop) ? video.offsetTop : 0;
|
|
@@ -327692,6 +327794,7 @@ async function injectVideoFramesBatch(page, updates) {
|
|
|
327692
327794
|
img.style.objectPosition = computedStyle.objectPosition;
|
|
327693
327795
|
img.style.zIndex = computedStyle.zIndex;
|
|
327694
327796
|
for (const property of visualProperties) {
|
|
327797
|
+
if (property === "opacity") continue;
|
|
327695
327798
|
if (sourceIsStatic && (property === "top" || property === "left" || property === "right" || property === "bottom" || property === "inset")) {
|
|
327696
327799
|
continue;
|
|
327697
327800
|
}
|
|
@@ -327724,14 +327827,22 @@ async function syncVideoFrameVisibility(page, activeVideoIds) {
|
|
|
327724
327827
|
const active = new Set(ids);
|
|
327725
327828
|
const videos = Array.from(document.querySelectorAll("video[data-start]"));
|
|
327726
327829
|
for (const video of videos) {
|
|
327727
|
-
if (active.has(video.id)) continue;
|
|
327728
|
-
video.style.removeProperty("display");
|
|
327729
|
-
video.style.setProperty("visibility", "hidden", "important");
|
|
327730
|
-
video.style.setProperty("opacity", "0", "important");
|
|
327731
|
-
video.style.setProperty("pointer-events", "none", "important");
|
|
327732
327830
|
const img = video.nextElementSibling;
|
|
327733
|
-
|
|
327734
|
-
|
|
327831
|
+
const hasImg = img && img.classList.contains("__render_frame__");
|
|
327832
|
+
if (active.has(video.id)) {
|
|
327833
|
+
video.style.setProperty("visibility", "hidden", "important");
|
|
327834
|
+
video.style.setProperty("pointer-events", "none", "important");
|
|
327835
|
+
if (hasImg) {
|
|
327836
|
+
img.style.visibility = "visible";
|
|
327837
|
+
}
|
|
327838
|
+
} else {
|
|
327839
|
+
video.style.removeProperty("display");
|
|
327840
|
+
video.style.setProperty("visibility", "hidden", "important");
|
|
327841
|
+
video.style.setProperty("opacity", "0", "important");
|
|
327842
|
+
video.style.setProperty("pointer-events", "none", "important");
|
|
327843
|
+
if (hasImg) {
|
|
327844
|
+
img.style.visibility = "hidden";
|
|
327845
|
+
}
|
|
327735
327846
|
}
|
|
327736
327847
|
}
|
|
327737
327848
|
}, activeVideoIds);
|
|
@@ -327804,6 +327915,15 @@ function isFontResourceError(type, text, locationUrl) {
|
|
|
327804
327915
|
`${locationUrl} ${text}`
|
|
327805
327916
|
);
|
|
327806
327917
|
}
|
|
327918
|
+
async function pollPageExpression(page, expression, timeoutMs, intervalMs = 100) {
|
|
327919
|
+
const deadline = Date.now() + timeoutMs;
|
|
327920
|
+
while (Date.now() < deadline) {
|
|
327921
|
+
const ready = Boolean(await page.evaluate(expression));
|
|
327922
|
+
if (ready) return true;
|
|
327923
|
+
await new Promise((resolve132) => setTimeout(resolve132, intervalMs));
|
|
327924
|
+
}
|
|
327925
|
+
return Boolean(await page.evaluate(expression));
|
|
327926
|
+
}
|
|
327807
327927
|
async function initializeSession(session) {
|
|
327808
327928
|
const { page, serverUrl } = session;
|
|
327809
327929
|
page.on("console", (msg) => {
|
|
@@ -327833,14 +327953,26 @@ async function initializeSession(session) {
|
|
|
327833
327953
|
if (session.captureMode === "screenshot") {
|
|
327834
327954
|
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 6e4 });
|
|
327835
327955
|
const pageReadyTimeout2 = session.config?.playerReadyTimeout ?? DEFAULT_CONFIG.playerReadyTimeout;
|
|
327836
|
-
await
|
|
327956
|
+
const pageReady2 = await pollPageExpression(
|
|
327957
|
+
page,
|
|
327837
327958
|
`!!(window.__hf && typeof window.__hf.seek === "function" && window.__hf.duration > 0)`,
|
|
327838
|
-
|
|
327959
|
+
pageReadyTimeout2
|
|
327839
327960
|
);
|
|
327840
|
-
|
|
327961
|
+
if (!pageReady2) {
|
|
327962
|
+
throw new Error(
|
|
327963
|
+
`[FrameCapture] window.__hf not ready after ${pageReadyTimeout2}ms. Page must expose window.__hf = { duration, seek }.`
|
|
327964
|
+
);
|
|
327965
|
+
}
|
|
327966
|
+
const videosReady = await pollPageExpression(
|
|
327967
|
+
page,
|
|
327841
327968
|
`document.querySelectorAll("video").length === 0 || Array.from(document.querySelectorAll("video")).every(v => v.readyState >= 1)`,
|
|
327842
|
-
|
|
327969
|
+
pageReadyTimeout2
|
|
327843
327970
|
);
|
|
327971
|
+
if (!videosReady) {
|
|
327972
|
+
throw new Error(
|
|
327973
|
+
`[FrameCapture] video metadata not ready after ${pageReadyTimeout2}ms. Video elements must load metadata before capture starts.`
|
|
327974
|
+
);
|
|
327975
|
+
}
|
|
327844
327976
|
await page.evaluate(`document.fonts?.ready`);
|
|
327845
327977
|
session.isInitialized = true;
|
|
327846
327978
|
return;
|
|
@@ -328144,7 +328276,7 @@ async function runFfmpeg(args, opts) {
|
|
|
328144
328276
|
});
|
|
328145
328277
|
});
|
|
328146
328278
|
}
|
|
328147
|
-
function getEncoderPreset(quality, format32 = "mp4") {
|
|
328279
|
+
function getEncoderPreset(quality, format32 = "mp4", hdr) {
|
|
328148
328280
|
const base = ENCODER_PRESETS[quality];
|
|
328149
328281
|
if (format32 === "webm") {
|
|
328150
328282
|
return {
|
|
@@ -328162,6 +328294,15 @@ function getEncoderPreset(quality, format32 = "mp4") {
|
|
|
328162
328294
|
pixelFormat: "yuva444p10le"
|
|
328163
328295
|
};
|
|
328164
328296
|
}
|
|
328297
|
+
if (hdr) {
|
|
328298
|
+
return {
|
|
328299
|
+
preset: base.preset === "ultrafast" ? "fast" : base.preset,
|
|
328300
|
+
quality: base.quality,
|
|
328301
|
+
codec: "h265",
|
|
328302
|
+
pixelFormat: "yuv420p10le",
|
|
328303
|
+
hdr
|
|
328304
|
+
};
|
|
328305
|
+
}
|
|
328165
328306
|
return { ...base, pixelFormat: "yuv420p" };
|
|
328166
328307
|
}
|
|
328167
328308
|
function buildEncoderArgs(options, inputArgs, outputPath, gpuEncoder = null) {
|
|
@@ -328219,6 +328360,9 @@ function buildEncoderArgs(options, inputArgs, outputPath, gpuEncoder = null) {
|
|
|
328219
328360
|
args.push(xParamsFlag, `aq-mode=3:aq-strength=0.8:deblock=1,1:${colorParams}`);
|
|
328220
328361
|
}
|
|
328221
328362
|
}
|
|
328363
|
+
if (codec === "h265") {
|
|
328364
|
+
args.push("-tag:v", "hvc1");
|
|
328365
|
+
}
|
|
328222
328366
|
} else if (codec === "vp9") {
|
|
328223
328367
|
args.push("-c:v", "libvpx-vp9", "-b:v", bitrate || "0", "-crf", String(quality));
|
|
328224
328368
|
args.push("-deadline", preset === "ultrafast" ? "realtime" : "good");
|
|
@@ -328261,7 +328405,7 @@ function buildEncoderArgs(options, inputArgs, outputPath, gpuEncoder = null) {
|
|
|
328261
328405
|
}
|
|
328262
328406
|
async function encodeFramesFromDir(framesDir, framePattern, outputPath, options, signal, config22) {
|
|
328263
328407
|
const startTime = Date.now();
|
|
328264
|
-
const outputDir =
|
|
328408
|
+
const outputDir = dirname52(outputPath);
|
|
328265
328409
|
if (!existsSync5(outputDir)) mkdirSync2(outputDir, { recursive: true });
|
|
328266
328410
|
const files = readdirSync3(framesDir).filter((f) => f.match(/\.(jpg|jpeg|png)$/i));
|
|
328267
328411
|
const frameCount = files.length;
|
|
@@ -328360,7 +328504,7 @@ async function encodeFramesChunkedConcat(framesDir, framePattern, outputPath, op
|
|
|
328360
328504
|
}
|
|
328361
328505
|
const chunkSize = Math.max(30, Math.floor(chunkSizeFrames));
|
|
328362
328506
|
const chunkCount = Math.ceil(files.length / chunkSize);
|
|
328363
|
-
const chunkDir = join6(
|
|
328507
|
+
const chunkDir = join6(dirname52(outputPath), "chunk-encode");
|
|
328364
328508
|
if (!existsSync5(chunkDir)) mkdirSync2(chunkDir, { recursive: true });
|
|
328365
328509
|
const chunkPaths = [];
|
|
328366
328510
|
for (let i = 0; i < chunkCount; i++) {
|
|
@@ -328467,7 +328611,7 @@ async function encodeFramesChunkedConcat(framesDir, framePattern, outputPath, op
|
|
|
328467
328611
|
};
|
|
328468
328612
|
}
|
|
328469
328613
|
async function muxVideoWithAudio(videoPath, audioPath, outputPath, signal, config22) {
|
|
328470
|
-
const outputDir =
|
|
328614
|
+
const outputDir = dirname52(outputPath);
|
|
328471
328615
|
if (!existsSync5(outputDir)) mkdirSync2(outputDir, { recursive: true });
|
|
328472
328616
|
const isWebm = outputPath.endsWith(".webm");
|
|
328473
328617
|
const isMov = outputPath.endsWith(".mov");
|
|
@@ -328520,31 +328664,75 @@ async function applyFaststart(inputPath, outputPath, signal, config22) {
|
|
|
328520
328664
|
error: !result.success ? result.exitCode !== null ? `FFmpeg exited with code ${result.exitCode}` : `[FFmpeg] ${result.stderr}` : void 0
|
|
328521
328665
|
};
|
|
328522
328666
|
}
|
|
328667
|
+
function isHdrColorSpace(cs) {
|
|
328668
|
+
if (!cs) return false;
|
|
328669
|
+
return cs.colorPrimaries.includes("bt2020") || cs.colorSpace.includes("bt2020") || cs.colorTransfer === "smpte2084" || cs.colorTransfer === "arib-std-b67";
|
|
328670
|
+
}
|
|
328671
|
+
function detectTransfer(cs) {
|
|
328672
|
+
if (cs?.colorTransfer === "smpte2084") return "pq";
|
|
328673
|
+
return "hlg";
|
|
328674
|
+
}
|
|
328675
|
+
function getHdrEncoderColorParams(transfer, mastering = DEFAULT_HDR10_MASTERING) {
|
|
328676
|
+
const colorTrc = transfer === "pq" ? "smpte2084" : "arib-std-b67";
|
|
328677
|
+
const tagging = `colorprim=bt2020:transfer=${colorTrc}:colormatrix=bt2020nc`;
|
|
328678
|
+
const metadata = `master-display=${mastering.masterDisplay}:max-cll=${mastering.maxCll}`;
|
|
328679
|
+
return {
|
|
328680
|
+
colorPrimaries: "bt2020",
|
|
328681
|
+
colorTrc,
|
|
328682
|
+
colorspace: "bt2020nc",
|
|
328683
|
+
pixelFormat: "yuv420p10le",
|
|
328684
|
+
x265ColorParams: `${tagging}:${metadata}`,
|
|
328685
|
+
mastering
|
|
328686
|
+
};
|
|
328687
|
+
}
|
|
328688
|
+
function analyzeCompositionHdr(colorSpaces) {
|
|
328689
|
+
let hasPq = false;
|
|
328690
|
+
let hasHdr = false;
|
|
328691
|
+
for (const cs of colorSpaces) {
|
|
328692
|
+
if (!isHdrColorSpace(cs)) continue;
|
|
328693
|
+
hasHdr = true;
|
|
328694
|
+
if (cs?.colorTransfer === "smpte2084") hasPq = true;
|
|
328695
|
+
}
|
|
328696
|
+
if (!hasHdr) return { hasHdr: false, dominantTransfer: null };
|
|
328697
|
+
const dominantTransfer = hasPq ? "pq" : "hlg";
|
|
328698
|
+
return { hasHdr: true, dominantTransfer };
|
|
328699
|
+
}
|
|
328523
328700
|
function createFrameReorderBuffer(startFrame, endFrame) {
|
|
328524
|
-
let
|
|
328525
|
-
|
|
328526
|
-
const
|
|
328527
|
-
|
|
328528
|
-
|
|
328529
|
-
|
|
328530
|
-
|
|
328531
|
-
|
|
328701
|
+
let cursor = startFrame;
|
|
328702
|
+
const pending = /* @__PURE__ */ new Map();
|
|
328703
|
+
const enqueueAt = (frame, resolve132) => {
|
|
328704
|
+
const list2 = pending.get(frame);
|
|
328705
|
+
if (list2 === void 0) {
|
|
328706
|
+
pending.set(frame, [resolve132]);
|
|
328707
|
+
} else {
|
|
328708
|
+
list2.push(resolve132);
|
|
328532
328709
|
}
|
|
328533
328710
|
};
|
|
328534
|
-
|
|
328535
|
-
|
|
328536
|
-
|
|
328537
|
-
|
|
328538
|
-
|
|
328539
|
-
|
|
328540
|
-
|
|
328541
|
-
|
|
328542
|
-
|
|
328543
|
-
|
|
328544
|
-
|
|
328545
|
-
|
|
328546
|
-
|
|
328711
|
+
const flushAt = (frame) => {
|
|
328712
|
+
const list2 = pending.get(frame);
|
|
328713
|
+
if (list2 === void 0) return;
|
|
328714
|
+
pending.delete(frame);
|
|
328715
|
+
for (const resolve132 of list2) resolve132();
|
|
328716
|
+
};
|
|
328717
|
+
const waitForFrame = (frame) => new Promise((resolve132) => {
|
|
328718
|
+
if (frame === cursor) {
|
|
328719
|
+
resolve132();
|
|
328720
|
+
return;
|
|
328721
|
+
}
|
|
328722
|
+
enqueueAt(frame, resolve132);
|
|
328723
|
+
});
|
|
328724
|
+
const advanceTo = (frame) => {
|
|
328725
|
+
cursor = frame;
|
|
328726
|
+
flushAt(frame);
|
|
328547
328727
|
};
|
|
328728
|
+
const waitForAllDone = () => new Promise((resolve132) => {
|
|
328729
|
+
if (cursor >= endFrame) {
|
|
328730
|
+
resolve132();
|
|
328731
|
+
return;
|
|
328732
|
+
}
|
|
328733
|
+
enqueueAt(endFrame, resolve132);
|
|
328734
|
+
});
|
|
328735
|
+
return { waitForFrame, advanceTo, waitForAllDone };
|
|
328548
328736
|
}
|
|
328549
328737
|
function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
|
|
328550
328738
|
const {
|
|
@@ -328557,19 +328745,36 @@ function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
|
|
|
328557
328745
|
useGpu = false,
|
|
328558
328746
|
imageFormat = "jpeg"
|
|
328559
328747
|
} = options;
|
|
328560
|
-
const
|
|
328561
|
-
|
|
328562
|
-
|
|
328563
|
-
"
|
|
328564
|
-
|
|
328565
|
-
|
|
328566
|
-
|
|
328567
|
-
|
|
328568
|
-
|
|
328569
|
-
|
|
328570
|
-
|
|
328571
|
-
|
|
328572
|
-
|
|
328748
|
+
const args = [];
|
|
328749
|
+
if (options.rawInputFormat) {
|
|
328750
|
+
const hdrTransfer = options.hdr?.transfer;
|
|
328751
|
+
const inputColorTrc = hdrTransfer === "pq" ? "smpte2084" : hdrTransfer === "hlg" ? "arib-std-b67" : void 0;
|
|
328752
|
+
args.push(
|
|
328753
|
+
"-f",
|
|
328754
|
+
"rawvideo",
|
|
328755
|
+
"-pix_fmt",
|
|
328756
|
+
options.rawInputFormat,
|
|
328757
|
+
"-s",
|
|
328758
|
+
`${options.width}x${options.height}`,
|
|
328759
|
+
"-framerate",
|
|
328760
|
+
String(fps)
|
|
328761
|
+
);
|
|
328762
|
+
if (inputColorTrc) {
|
|
328763
|
+
args.push(
|
|
328764
|
+
"-color_primaries",
|
|
328765
|
+
"bt2020",
|
|
328766
|
+
"-color_trc",
|
|
328767
|
+
inputColorTrc,
|
|
328768
|
+
"-colorspace",
|
|
328769
|
+
"bt2020nc"
|
|
328770
|
+
);
|
|
328771
|
+
}
|
|
328772
|
+
args.push("-i", "-");
|
|
328773
|
+
} else {
|
|
328774
|
+
const inputCodec = imageFormat === "png" ? "png" : "mjpeg";
|
|
328775
|
+
args.push("-f", "image2pipe", "-vcodec", inputCodec, "-framerate", String(fps), "-i", "-");
|
|
328776
|
+
}
|
|
328777
|
+
args.push("-r", String(fps));
|
|
328573
328778
|
const shouldUseGpu = useGpu && gpuEncoder !== null;
|
|
328574
328779
|
if (codec === "h264" || codec === "h265") {
|
|
328575
328780
|
if (shouldUseGpu) {
|
|
@@ -328607,12 +328812,15 @@ function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
|
|
|
328607
328812
|
if (bitrate) args.push("-b:v", bitrate);
|
|
328608
328813
|
else args.push("-crf", String(quality));
|
|
328609
328814
|
const xParamsFlag = codec === "h264" ? "-x264-params" : "-x265-params";
|
|
328610
|
-
const colorParams = "colorprim=bt709:transfer=bt709:colormatrix=bt709";
|
|
328815
|
+
const colorParams = options.rawInputFormat && options.hdr ? getHdrEncoderColorParams(options.hdr.transfer).x265ColorParams : "colorprim=bt709:transfer=bt709:colormatrix=bt709";
|
|
328611
328816
|
if (preset === "ultrafast") {
|
|
328612
328817
|
args.push(xParamsFlag, `aq-mode=3:${colorParams}`);
|
|
328613
328818
|
} else {
|
|
328614
328819
|
args.push(xParamsFlag, `aq-mode=3:aq-strength=0.8:deblock=1,1:${colorParams}`);
|
|
328615
328820
|
}
|
|
328821
|
+
if (codec === "h265") {
|
|
328822
|
+
args.push("-tag:v", "hvc1");
|
|
328823
|
+
}
|
|
328616
328824
|
}
|
|
328617
328825
|
} else if (codec === "vp9") {
|
|
328618
328826
|
args.push("-c:v", "libvpx-vp9", "-b:v", bitrate || "0", "-crf", String(quality));
|
|
@@ -328628,17 +328836,31 @@ function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
|
|
|
328628
328836
|
return [...args, "-y", outputPath];
|
|
328629
328837
|
}
|
|
328630
328838
|
if (codec === "h264" || codec === "h265") {
|
|
328631
|
-
|
|
328632
|
-
|
|
328633
|
-
|
|
328634
|
-
|
|
328635
|
-
|
|
328636
|
-
|
|
328637
|
-
|
|
328638
|
-
|
|
328639
|
-
|
|
328640
|
-
|
|
328641
|
-
|
|
328839
|
+
if (options.rawInputFormat && options.hdr) {
|
|
328840
|
+
args.push(
|
|
328841
|
+
"-colorspace:v",
|
|
328842
|
+
"bt2020nc",
|
|
328843
|
+
"-color_primaries:v",
|
|
328844
|
+
"bt2020",
|
|
328845
|
+
"-color_trc:v",
|
|
328846
|
+
options.hdr.transfer === "pq" ? "smpte2084" : "arib-std-b67",
|
|
328847
|
+
"-color_range",
|
|
328848
|
+
"tv"
|
|
328849
|
+
);
|
|
328850
|
+
} else {
|
|
328851
|
+
args.push(
|
|
328852
|
+
"-colorspace:v",
|
|
328853
|
+
"bt709",
|
|
328854
|
+
"-color_primaries:v",
|
|
328855
|
+
"bt709",
|
|
328856
|
+
"-color_trc:v",
|
|
328857
|
+
"bt709",
|
|
328858
|
+
"-color_range",
|
|
328859
|
+
"tv"
|
|
328860
|
+
);
|
|
328861
|
+
}
|
|
328862
|
+
if (options.rawInputFormat) {
|
|
328863
|
+
} else if (gpuEncoder === "vaapi") {
|
|
328642
328864
|
const vfIdx = args.indexOf("-vf");
|
|
328643
328865
|
if (vfIdx !== -1) {
|
|
328644
328866
|
args[vfIdx + 1] = `scale=in_range=pc:out_range=tv,${args[vfIdx + 1]}`;
|
|
@@ -328708,14 +328930,16 @@ Process error: ${err.message}`;
|
|
|
328708
328930
|
if (exitStatus !== "running" || !ffmpeg.stdin || ffmpeg.stdin.destroyed) {
|
|
328709
328931
|
return false;
|
|
328710
328932
|
}
|
|
328711
|
-
|
|
328933
|
+
const copy = Buffer.from(buffer);
|
|
328934
|
+
return ffmpeg.stdin.write(copy);
|
|
328712
328935
|
},
|
|
328713
328936
|
close: async () => {
|
|
328714
328937
|
clearTimeout(timer22);
|
|
328715
328938
|
if (signal) signal.removeEventListener("abort", onAbort);
|
|
328716
|
-
|
|
328939
|
+
const stdin = ffmpeg.stdin;
|
|
328940
|
+
if (stdin && !stdin.destroyed) {
|
|
328717
328941
|
await new Promise((resolve132) => {
|
|
328718
|
-
|
|
328942
|
+
stdin.end(() => resolve132());
|
|
328719
328943
|
});
|
|
328720
328944
|
}
|
|
328721
328945
|
await exitPromise;
|
|
@@ -328809,6 +329033,10 @@ async function extractVideoMetadata(filePath) {
|
|
|
328809
329033
|
const avgFps = parseFrameRate(videoStream.avg_frame_rate);
|
|
328810
329034
|
const fps = avgFps || rFps;
|
|
328811
329035
|
const isVFR = rFps > 0 && avgFps > 0 && Math.abs(rFps - avgFps) / Math.max(rFps, avgFps) > 0.1;
|
|
329036
|
+
const colorTransfer = videoStream.color_transfer || "";
|
|
329037
|
+
const colorPrimaries = videoStream.color_primaries || "";
|
|
329038
|
+
const colorSpaceVal = videoStream.color_space || "";
|
|
329039
|
+
const hasColorInfo = !!(colorTransfer || colorPrimaries || colorSpaceVal);
|
|
328812
329040
|
return {
|
|
328813
329041
|
durationSeconds: output22.format.duration ? parseFloat(output22.format.duration) : 0,
|
|
328814
329042
|
width: videoStream.width || 0,
|
|
@@ -328816,7 +329044,8 @@ async function extractVideoMetadata(filePath) {
|
|
|
328816
329044
|
fps,
|
|
328817
329045
|
videoCodec: videoStream.codec_name || "unknown",
|
|
328818
329046
|
hasAudio: output22.streams.some((s) => s.codec_type === "audio"),
|
|
328819
|
-
isVFR
|
|
329047
|
+
isVFR,
|
|
329048
|
+
colorSpace: hasColorInfo ? { colorTransfer, colorPrimaries, colorSpace: colorSpaceVal } : null
|
|
328820
329049
|
};
|
|
328821
329050
|
})();
|
|
328822
329051
|
videoMetadataCache.set(filePath, probePromise);
|
|
@@ -328911,10 +329140,10 @@ async function analyzeKeyframeIntervalsUncached(filePath) {
|
|
|
328911
329140
|
};
|
|
328912
329141
|
}
|
|
328913
329142
|
function getFilenameFromUrl(url) {
|
|
328914
|
-
const
|
|
329143
|
+
const hash2 = createHash("md5").update(url).digest("hex").slice(0, 12);
|
|
328915
329144
|
const urlObj = new URL(url);
|
|
328916
329145
|
const ext = extname22(urlObj.pathname) || ".mp4";
|
|
328917
|
-
return `download_${
|
|
329146
|
+
return `download_${hash2}${ext}`;
|
|
328918
329147
|
}
|
|
328919
329148
|
async function downloadToTemp(url, destDir, timeoutMs = 3e5) {
|
|
328920
329149
|
const cachedPath = downloadPathCache.get(url);
|
|
@@ -329012,18 +329241,20 @@ async function extractVideoFramesRange(videoPath, videoId, startTime, duration,
|
|
|
329012
329241
|
const metadata = await extractVideoMetadata(videoPath);
|
|
329013
329242
|
const framePattern = `frame_%05d.${format32}`;
|
|
329014
329243
|
const outputPattern = join8(videoOutputDir, framePattern);
|
|
329015
|
-
const
|
|
329016
|
-
|
|
329017
|
-
|
|
329018
|
-
|
|
329019
|
-
|
|
329020
|
-
|
|
329021
|
-
|
|
329022
|
-
|
|
329023
|
-
|
|
329024
|
-
"
|
|
329025
|
-
|
|
329026
|
-
|
|
329244
|
+
const isHdr = isHdrColorSpace(metadata.colorSpace);
|
|
329245
|
+
const isMacOS = process.platform === "darwin";
|
|
329246
|
+
const args = [];
|
|
329247
|
+
if (isHdr && isMacOS) {
|
|
329248
|
+
args.push("-hwaccel", "videotoolbox");
|
|
329249
|
+
}
|
|
329250
|
+
args.push("-ss", String(startTime), "-i", videoPath, "-t", String(duration));
|
|
329251
|
+
const vfFilters = [];
|
|
329252
|
+
if (isHdr && isMacOS) {
|
|
329253
|
+
vfFilters.push("format=nv12");
|
|
329254
|
+
}
|
|
329255
|
+
vfFilters.push(`fps=${fps}`);
|
|
329256
|
+
args.push("-vf", vfFilters.join(","));
|
|
329257
|
+
args.push("-q:v", format32 === "jpg" ? String(Math.ceil((100 - quality) / 3)) : "0");
|
|
329027
329258
|
if (format32 === "png") args.push("-compression_level", "6");
|
|
329028
329259
|
args.push("-y", outputPattern);
|
|
329029
329260
|
return new Promise((resolve132, reject) => {
|
|
@@ -329083,30 +329314,100 @@ async function extractVideoFramesRange(videoPath, videoId, startTime, duration,
|
|
|
329083
329314
|
});
|
|
329084
329315
|
});
|
|
329085
329316
|
}
|
|
329317
|
+
async function convertSdrToHdr(inputPath, outputPath, signal, config22) {
|
|
329318
|
+
const timeout22 = config22?.ffmpegProcessTimeout ?? DEFAULT_CONFIG.ffmpegProcessTimeout;
|
|
329319
|
+
const args = [
|
|
329320
|
+
"-i",
|
|
329321
|
+
inputPath,
|
|
329322
|
+
"-vf",
|
|
329323
|
+
"colorspace=all=bt2020:iall=bt709:range=tv",
|
|
329324
|
+
"-color_primaries",
|
|
329325
|
+
"bt2020",
|
|
329326
|
+
"-color_trc",
|
|
329327
|
+
"arib-std-b67",
|
|
329328
|
+
"-colorspace",
|
|
329329
|
+
"bt2020nc",
|
|
329330
|
+
"-c:v",
|
|
329331
|
+
"libx264",
|
|
329332
|
+
"-preset",
|
|
329333
|
+
"fast",
|
|
329334
|
+
"-crf",
|
|
329335
|
+
"16",
|
|
329336
|
+
"-c:a",
|
|
329337
|
+
"copy",
|
|
329338
|
+
"-y",
|
|
329339
|
+
outputPath
|
|
329340
|
+
];
|
|
329341
|
+
const result = await runFfmpeg(args, { signal, timeout: timeout22 });
|
|
329342
|
+
if (!result.success) {
|
|
329343
|
+
throw new Error(
|
|
329344
|
+
`SDR\u2192HDR conversion failed (exit ${result.exitCode}): ${result.stderr.slice(-300)}`
|
|
329345
|
+
);
|
|
329346
|
+
}
|
|
329347
|
+
}
|
|
329086
329348
|
async function extractAllVideoFrames(videos, baseDir, options, signal, config22, compiledDir) {
|
|
329087
329349
|
const startTime = Date.now();
|
|
329088
329350
|
const extracted = [];
|
|
329089
329351
|
const errors = [];
|
|
329090
329352
|
let totalFramesExtracted = 0;
|
|
329353
|
+
const resolvedVideos = [];
|
|
329354
|
+
for (const video of videos) {
|
|
329355
|
+
if (signal?.aborted) break;
|
|
329356
|
+
try {
|
|
329357
|
+
let videoPath = video.src;
|
|
329358
|
+
if (!videoPath.startsWith("/") && !isHttpUrl(videoPath)) {
|
|
329359
|
+
const fromCompiled = compiledDir ? join8(compiledDir, videoPath) : null;
|
|
329360
|
+
videoPath = fromCompiled && existsSync8(fromCompiled) ? fromCompiled : join8(baseDir, videoPath);
|
|
329361
|
+
}
|
|
329362
|
+
if (isHttpUrl(videoPath)) {
|
|
329363
|
+
const downloadDir = join8(options.outputDir, "_downloads");
|
|
329364
|
+
mkdirSync5(downloadDir, { recursive: true });
|
|
329365
|
+
videoPath = await downloadToTemp(videoPath, downloadDir);
|
|
329366
|
+
}
|
|
329367
|
+
if (!existsSync8(videoPath)) {
|
|
329368
|
+
errors.push({ videoId: video.id, error: `Video file not found: ${videoPath}` });
|
|
329369
|
+
continue;
|
|
329370
|
+
}
|
|
329371
|
+
resolvedVideos.push({ video, videoPath });
|
|
329372
|
+
} catch (err) {
|
|
329373
|
+
errors.push({ videoId: video.id, error: err instanceof Error ? err.message : String(err) });
|
|
329374
|
+
}
|
|
329375
|
+
}
|
|
329376
|
+
const videoColorSpaces = await Promise.all(
|
|
329377
|
+
resolvedVideos.map(async ({ videoPath }) => {
|
|
329378
|
+
const metadata = await extractVideoMetadata(videoPath);
|
|
329379
|
+
return metadata.colorSpace;
|
|
329380
|
+
})
|
|
329381
|
+
);
|
|
329382
|
+
const hasAnyHdr = videoColorSpaces.some(isHdrColorSpace);
|
|
329383
|
+
if (hasAnyHdr) {
|
|
329384
|
+
const convertDir = join8(options.outputDir, "_hdr_normalized");
|
|
329385
|
+
mkdirSync5(convertDir, { recursive: true });
|
|
329386
|
+
for (let i = 0; i < resolvedVideos.length; i++) {
|
|
329387
|
+
if (signal?.aborted) break;
|
|
329388
|
+
const cs = videoColorSpaces[i] ?? null;
|
|
329389
|
+
if (!isHdrColorSpace(cs)) {
|
|
329390
|
+
const entry = resolvedVideos[i];
|
|
329391
|
+
if (!entry) continue;
|
|
329392
|
+
const convertedPath = join8(convertDir, `${entry.video.id}_hdr.mp4`);
|
|
329393
|
+
try {
|
|
329394
|
+
await convertSdrToHdr(entry.videoPath, convertedPath, signal, config22);
|
|
329395
|
+
entry.videoPath = convertedPath;
|
|
329396
|
+
} catch (err) {
|
|
329397
|
+
errors.push({
|
|
329398
|
+
videoId: entry.video.id,
|
|
329399
|
+
error: `SDR\u2192HDR conversion failed: ${err instanceof Error ? err.message : String(err)}`
|
|
329400
|
+
});
|
|
329401
|
+
}
|
|
329402
|
+
}
|
|
329403
|
+
}
|
|
329404
|
+
}
|
|
329091
329405
|
const results = await Promise.all(
|
|
329092
|
-
|
|
329406
|
+
resolvedVideos.map(async ({ video, videoPath }) => {
|
|
329093
329407
|
if (signal?.aborted) {
|
|
329094
329408
|
throw new Error("Video frame extraction cancelled");
|
|
329095
329409
|
}
|
|
329096
329410
|
try {
|
|
329097
|
-
let videoPath = video.src;
|
|
329098
|
-
if (!videoPath.startsWith("/") && !isHttpUrl(videoPath)) {
|
|
329099
|
-
const fromCompiled = compiledDir ? join8(compiledDir, videoPath) : null;
|
|
329100
|
-
videoPath = fromCompiled && existsSync8(fromCompiled) ? fromCompiled : join8(baseDir, videoPath);
|
|
329101
|
-
}
|
|
329102
|
-
if (isHttpUrl(videoPath)) {
|
|
329103
|
-
const downloadDir = join8(options.outputDir, "_downloads");
|
|
329104
|
-
mkdirSync5(downloadDir, { recursive: true });
|
|
329105
|
-
videoPath = await downloadToTemp(videoPath, downloadDir);
|
|
329106
|
-
}
|
|
329107
|
-
if (!existsSync8(videoPath)) {
|
|
329108
|
-
return { error: { videoId: video.id, error: `Video file not found: ${videoPath}` } };
|
|
329109
|
-
}
|
|
329110
329411
|
let videoDuration = video.end - video.start;
|
|
329111
329412
|
if (!Number.isFinite(videoDuration) || videoDuration <= 0) {
|
|
329112
329413
|
const metadata = await extractVideoMetadata(videoPath);
|
|
@@ -329246,6 +329547,142 @@ function createVideoFrameInjector(frameLookup, config22) {
|
|
|
329246
329547
|
}
|
|
329247
329548
|
};
|
|
329248
329549
|
}
|
|
329550
|
+
async function queryElementStacking(page, nativeHdrVideoIds) {
|
|
329551
|
+
const hdrIds = Array.from(nativeHdrVideoIds);
|
|
329552
|
+
return page.evaluate((hdrIdList) => {
|
|
329553
|
+
const hdrSet = new Set(hdrIdList);
|
|
329554
|
+
const elements = document.querySelectorAll("[data-start]");
|
|
329555
|
+
const results = [];
|
|
329556
|
+
function getEffectiveZIndex(node) {
|
|
329557
|
+
let current = node;
|
|
329558
|
+
while (current) {
|
|
329559
|
+
const cs = window.getComputedStyle(current);
|
|
329560
|
+
const pos = cs.position;
|
|
329561
|
+
const z = parseInt(cs.zIndex);
|
|
329562
|
+
if (!Number.isNaN(z) && pos !== "static") return z;
|
|
329563
|
+
current = current.parentElement;
|
|
329564
|
+
}
|
|
329565
|
+
return 0;
|
|
329566
|
+
}
|
|
329567
|
+
function getEffectiveBorderRadius(node) {
|
|
329568
|
+
function resolveRadius(value, el) {
|
|
329569
|
+
if (value.includes("%")) {
|
|
329570
|
+
const pct = parseFloat(value) / 100;
|
|
329571
|
+
const htmlEl = el;
|
|
329572
|
+
const w = htmlEl.offsetWidth || 0;
|
|
329573
|
+
const h = htmlEl.offsetHeight || 0;
|
|
329574
|
+
return pct * Math.min(w, h);
|
|
329575
|
+
}
|
|
329576
|
+
return parseFloat(value) || 0;
|
|
329577
|
+
}
|
|
329578
|
+
const selfCs = window.getComputedStyle(node);
|
|
329579
|
+
const selfRadii = [
|
|
329580
|
+
resolveRadius(selfCs.borderTopLeftRadius, node),
|
|
329581
|
+
resolveRadius(selfCs.borderTopRightRadius, node),
|
|
329582
|
+
resolveRadius(selfCs.borderBottomRightRadius, node),
|
|
329583
|
+
resolveRadius(selfCs.borderBottomLeftRadius, node)
|
|
329584
|
+
];
|
|
329585
|
+
if (selfRadii[0] > 0 || selfRadii[1] > 0 || selfRadii[2] > 0 || selfRadii[3] > 0) {
|
|
329586
|
+
return selfRadii;
|
|
329587
|
+
}
|
|
329588
|
+
let current = node.parentElement;
|
|
329589
|
+
while (current) {
|
|
329590
|
+
const cs = window.getComputedStyle(current);
|
|
329591
|
+
if (cs.overflow !== "visible") {
|
|
329592
|
+
const tl = resolveRadius(cs.borderTopLeftRadius, current);
|
|
329593
|
+
const tr = resolveRadius(cs.borderTopRightRadius, current);
|
|
329594
|
+
const brr = resolveRadius(cs.borderBottomRightRadius, current);
|
|
329595
|
+
const bl = resolveRadius(cs.borderBottomLeftRadius, current);
|
|
329596
|
+
if (tl > 0 || tr > 0 || brr > 0 || bl > 0) {
|
|
329597
|
+
return [tl, tr, brr, bl];
|
|
329598
|
+
}
|
|
329599
|
+
}
|
|
329600
|
+
current = current.parentElement;
|
|
329601
|
+
}
|
|
329602
|
+
return [0, 0, 0, 0];
|
|
329603
|
+
}
|
|
329604
|
+
function getEffectiveOpacity(node) {
|
|
329605
|
+
let opacity = 1;
|
|
329606
|
+
let current = node;
|
|
329607
|
+
while (current) {
|
|
329608
|
+
const cs = window.getComputedStyle(current);
|
|
329609
|
+
const val = parseFloat(cs.opacity);
|
|
329610
|
+
opacity *= Number.isNaN(val) ? 1 : val;
|
|
329611
|
+
current = current.parentElement;
|
|
329612
|
+
}
|
|
329613
|
+
return opacity;
|
|
329614
|
+
}
|
|
329615
|
+
function getViewportMatrix(node) {
|
|
329616
|
+
const chain = [];
|
|
329617
|
+
let current = node;
|
|
329618
|
+
while (current instanceof HTMLElement) {
|
|
329619
|
+
chain.push(current);
|
|
329620
|
+
const next = current.offsetParent ?? current.parentElement;
|
|
329621
|
+
if (next === current) break;
|
|
329622
|
+
current = next;
|
|
329623
|
+
}
|
|
329624
|
+
let mat = new DOMMatrix();
|
|
329625
|
+
for (let i = chain.length - 1; i >= 0; i--) {
|
|
329626
|
+
const htmlEl = chain[i];
|
|
329627
|
+
if (!htmlEl) continue;
|
|
329628
|
+
mat = mat.translate(htmlEl.offsetLeft, htmlEl.offsetTop);
|
|
329629
|
+
const cs = window.getComputedStyle(htmlEl);
|
|
329630
|
+
if (cs.transform && cs.transform !== "none") {
|
|
329631
|
+
const origin = cs.transformOrigin.split(" ");
|
|
329632
|
+
const ox = resolveLength(origin[0] ?? "0", htmlEl.offsetWidth);
|
|
329633
|
+
const oy = resolveLength(origin[1] ?? "0", htmlEl.offsetHeight);
|
|
329634
|
+
try {
|
|
329635
|
+
const t = new DOMMatrix(cs.transform);
|
|
329636
|
+
if (Number.isFinite(t.a) && Number.isFinite(t.b) && Number.isFinite(t.c) && Number.isFinite(t.d) && Number.isFinite(t.e) && Number.isFinite(t.f)) {
|
|
329637
|
+
mat = mat.translate(ox, oy).multiply(t).translate(-ox, -oy);
|
|
329638
|
+
}
|
|
329639
|
+
} catch {
|
|
329640
|
+
}
|
|
329641
|
+
}
|
|
329642
|
+
}
|
|
329643
|
+
return mat.toString();
|
|
329644
|
+
}
|
|
329645
|
+
function resolveLength(value, basis) {
|
|
329646
|
+
if (value.endsWith("%")) {
|
|
329647
|
+
const pct = parseFloat(value) / 100;
|
|
329648
|
+
return Number.isFinite(pct) ? pct * basis : 0;
|
|
329649
|
+
}
|
|
329650
|
+
const n = parseFloat(value);
|
|
329651
|
+
return Number.isFinite(n) ? n : 0;
|
|
329652
|
+
}
|
|
329653
|
+
for (const el of elements) {
|
|
329654
|
+
const id = el.id;
|
|
329655
|
+
if (!id) continue;
|
|
329656
|
+
const rect = el.getBoundingClientRect();
|
|
329657
|
+
const style = window.getComputedStyle(el);
|
|
329658
|
+
const zIndex = getEffectiveZIndex(el);
|
|
329659
|
+
const isHdrEl = hdrSet.has(id);
|
|
329660
|
+
const opacityStartNode = isHdrEl ? el.parentElement : el;
|
|
329661
|
+
const opacity = opacityStartNode ? getEffectiveOpacity(opacityStartNode) : 1;
|
|
329662
|
+
const visible = style.visibility !== "hidden" && style.display !== "none" && rect.width > 0 && rect.height > 0;
|
|
329663
|
+
const htmlEl = el instanceof HTMLElement ? el : null;
|
|
329664
|
+
results.push({
|
|
329665
|
+
id,
|
|
329666
|
+
zIndex,
|
|
329667
|
+
x: Math.round(rect.x),
|
|
329668
|
+
y: Math.round(rect.y),
|
|
329669
|
+
width: Math.round(rect.width),
|
|
329670
|
+
height: Math.round(rect.height),
|
|
329671
|
+
layoutWidth: htmlEl?.offsetWidth || Math.round(rect.width),
|
|
329672
|
+
layoutHeight: htmlEl?.offsetHeight || Math.round(rect.height),
|
|
329673
|
+
opacity,
|
|
329674
|
+
visible,
|
|
329675
|
+
isHdr: hdrSet.has(id),
|
|
329676
|
+
// For HDR elements, use the full accumulated viewport matrix so the
|
|
329677
|
+
// affine blit can apply rotation/scale/translate properly. For DOM
|
|
329678
|
+
// elements, the element-level transform is sufficient for reference.
|
|
329679
|
+
transform: isHdrEl ? getViewportMatrix(el) : style.transform || "none",
|
|
329680
|
+
borderRadius: isHdrEl ? getEffectiveBorderRadius(el) : [0, 0, 0, 0]
|
|
329681
|
+
});
|
|
329682
|
+
}
|
|
329683
|
+
return results;
|
|
329684
|
+
}, hdrIds);
|
|
329685
|
+
}
|
|
329249
329686
|
function parseAudioElements(html) {
|
|
329250
329687
|
const elements = [];
|
|
329251
329688
|
const { document: document22 } = parseHTML(html);
|
|
@@ -329905,6 +330342,530 @@ function writeFromReadableStream(stream2, writable) {
|
|
|
329905
330342
|
}
|
|
329906
330343
|
return writeFromReadableStreamDefaultReader(stream2.getReader(), writable);
|
|
329907
330344
|
}
|
|
330345
|
+
function paeth(a, b, c) {
|
|
330346
|
+
const p = a + b - c;
|
|
330347
|
+
const pa = Math.abs(p - a);
|
|
330348
|
+
const pb = Math.abs(p - b);
|
|
330349
|
+
const pc = Math.abs(p - c);
|
|
330350
|
+
if (pa <= pb && pa <= pc) return a;
|
|
330351
|
+
if (pb <= pc) return b;
|
|
330352
|
+
return c;
|
|
330353
|
+
}
|
|
330354
|
+
function decodePngRaw(buf, caller) {
|
|
330355
|
+
if (buf[0] !== 137 || buf[1] !== 80 || buf[2] !== 78 || buf[3] !== 71 || buf[4] !== 13 || buf[5] !== 10 || buf[6] !== 26 || buf[7] !== 10) {
|
|
330356
|
+
throw new Error(`${caller}: not a PNG file`);
|
|
330357
|
+
}
|
|
330358
|
+
let pos = 8;
|
|
330359
|
+
let width = 0;
|
|
330360
|
+
let height = 0;
|
|
330361
|
+
let bitDepth = 0;
|
|
330362
|
+
let colorType = 0;
|
|
330363
|
+
let interlace = 0;
|
|
330364
|
+
let sawIhdr = false;
|
|
330365
|
+
const idatChunks = [];
|
|
330366
|
+
while (pos + 12 <= buf.length) {
|
|
330367
|
+
const chunkLen = buf.readUInt32BE(pos);
|
|
330368
|
+
const chunkType = buf.toString("ascii", pos + 4, pos + 8);
|
|
330369
|
+
const chunkData = buf.subarray(pos + 8, pos + 8 + chunkLen);
|
|
330370
|
+
if (chunkType === "IHDR") {
|
|
330371
|
+
width = chunkData.readUInt32BE(0);
|
|
330372
|
+
height = chunkData.readUInt32BE(4);
|
|
330373
|
+
bitDepth = chunkData[8] ?? 0;
|
|
330374
|
+
colorType = chunkData[9] ?? 0;
|
|
330375
|
+
interlace = chunkData[12] ?? 0;
|
|
330376
|
+
sawIhdr = true;
|
|
330377
|
+
} else if (chunkType === "IDAT") {
|
|
330378
|
+
idatChunks.push(Buffer.from(chunkData));
|
|
330379
|
+
} else if (chunkType === "IEND") {
|
|
330380
|
+
break;
|
|
330381
|
+
}
|
|
330382
|
+
pos += 12 + chunkLen;
|
|
330383
|
+
}
|
|
330384
|
+
if (!sawIhdr) {
|
|
330385
|
+
throw new Error(`${caller}: PNG missing IHDR chunk`);
|
|
330386
|
+
}
|
|
330387
|
+
if (colorType !== 2 && colorType !== 6) {
|
|
330388
|
+
throw new Error(`${caller}: unsupported color type ${colorType} (expected 2=RGB or 6=RGBA)`);
|
|
330389
|
+
}
|
|
330390
|
+
if (interlace !== 0) {
|
|
330391
|
+
throw new Error(
|
|
330392
|
+
`${caller}: Adam7-interlaced PNGs are not supported (interlace method ${interlace})`
|
|
330393
|
+
);
|
|
330394
|
+
}
|
|
330395
|
+
const channels = colorType === 6 ? 4 : 3;
|
|
330396
|
+
const bpp = channels * (bitDepth / 8);
|
|
330397
|
+
const stride = width * bpp;
|
|
330398
|
+
const compressed = Buffer.concat(idatChunks);
|
|
330399
|
+
const decompressed = inflateSync(compressed);
|
|
330400
|
+
const rawPixels = Buffer.allocUnsafe(height * stride);
|
|
330401
|
+
const prevRow = new Uint8Array(stride);
|
|
330402
|
+
const currRow = new Uint8Array(stride);
|
|
330403
|
+
let srcPos = 0;
|
|
330404
|
+
for (let y = 0; y < height; y++) {
|
|
330405
|
+
const filterType = decompressed[srcPos++] ?? 0;
|
|
330406
|
+
const rawRow = decompressed.subarray(srcPos, srcPos + stride);
|
|
330407
|
+
srcPos += stride;
|
|
330408
|
+
switch (filterType) {
|
|
330409
|
+
case 0:
|
|
330410
|
+
currRow.set(rawRow);
|
|
330411
|
+
break;
|
|
330412
|
+
case 1:
|
|
330413
|
+
for (let x = 0; x < stride; x++) {
|
|
330414
|
+
currRow[x] = (rawRow[x] ?? 0) + (x >= bpp ? currRow[x - bpp] ?? 0 : 0) & 255;
|
|
330415
|
+
}
|
|
330416
|
+
break;
|
|
330417
|
+
case 2:
|
|
330418
|
+
for (let x = 0; x < stride; x++) {
|
|
330419
|
+
currRow[x] = (rawRow[x] ?? 0) + (prevRow[x] ?? 0) & 255;
|
|
330420
|
+
}
|
|
330421
|
+
break;
|
|
330422
|
+
case 3:
|
|
330423
|
+
for (let x = 0; x < stride; x++) {
|
|
330424
|
+
const left22 = x >= bpp ? currRow[x - bpp] ?? 0 : 0;
|
|
330425
|
+
const up = prevRow[x] ?? 0;
|
|
330426
|
+
currRow[x] = (rawRow[x] ?? 0) + Math.floor((left22 + up) / 2) & 255;
|
|
330427
|
+
}
|
|
330428
|
+
break;
|
|
330429
|
+
case 4:
|
|
330430
|
+
for (let x = 0; x < stride; x++) {
|
|
330431
|
+
const left22 = x >= bpp ? currRow[x - bpp] ?? 0 : 0;
|
|
330432
|
+
const up = prevRow[x] ?? 0;
|
|
330433
|
+
const upLeft = x >= bpp ? prevRow[x - bpp] ?? 0 : 0;
|
|
330434
|
+
currRow[x] = (rawRow[x] ?? 0) + paeth(left22, up, upLeft) & 255;
|
|
330435
|
+
}
|
|
330436
|
+
break;
|
|
330437
|
+
default:
|
|
330438
|
+
throw new Error(`${caller}: unknown filter type ${filterType} at row ${y}`);
|
|
330439
|
+
}
|
|
330440
|
+
rawPixels.set(currRow, y * stride);
|
|
330441
|
+
prevRow.set(currRow);
|
|
330442
|
+
}
|
|
330443
|
+
return { width, height, bitDepth, colorType, rawPixels };
|
|
330444
|
+
}
|
|
330445
|
+
function decodePng(buf) {
|
|
330446
|
+
const { width, height, bitDepth, colorType, rawPixels } = decodePngRaw(buf, "decodePng");
|
|
330447
|
+
if (bitDepth !== 8) {
|
|
330448
|
+
throw new Error(`decodePng: unsupported bit depth ${bitDepth} (expected 8)`);
|
|
330449
|
+
}
|
|
330450
|
+
const output22 = new Uint8Array(width * height * 4);
|
|
330451
|
+
if (colorType === 6) {
|
|
330452
|
+
output22.set(rawPixels);
|
|
330453
|
+
} else {
|
|
330454
|
+
for (let i = 0; i < width * height; i++) {
|
|
330455
|
+
output22[i * 4 + 0] = rawPixels[i * 3 + 0] ?? 0;
|
|
330456
|
+
output22[i * 4 + 1] = rawPixels[i * 3 + 1] ?? 0;
|
|
330457
|
+
output22[i * 4 + 2] = rawPixels[i * 3 + 2] ?? 0;
|
|
330458
|
+
output22[i * 4 + 3] = 255;
|
|
330459
|
+
}
|
|
330460
|
+
}
|
|
330461
|
+
return { width, height, data: output22 };
|
|
330462
|
+
}
|
|
330463
|
+
function decodePngToRgb48le(buf) {
|
|
330464
|
+
const { width, height, bitDepth, colorType, rawPixels } = decodePngRaw(buf, "decodePngToRgb48le");
|
|
330465
|
+
if (bitDepth !== 16) {
|
|
330466
|
+
throw new Error(`decodePngToRgb48le: unsupported bit depth ${bitDepth} (expected 16)`);
|
|
330467
|
+
}
|
|
330468
|
+
const bpp = colorType === 6 ? 8 : 6;
|
|
330469
|
+
const output22 = Buffer.allocUnsafe(width * height * 6);
|
|
330470
|
+
for (let y = 0; y < height; y++) {
|
|
330471
|
+
const dstBase = y * width * 6;
|
|
330472
|
+
const srcRowBase = y * width * bpp;
|
|
330473
|
+
for (let x = 0; x < width; x++) {
|
|
330474
|
+
const srcBase = srcRowBase + x * bpp;
|
|
330475
|
+
output22[dstBase + x * 6 + 0] = rawPixels[srcBase + 1] ?? 0;
|
|
330476
|
+
output22[dstBase + x * 6 + 1] = rawPixels[srcBase + 0] ?? 0;
|
|
330477
|
+
output22[dstBase + x * 6 + 2] = rawPixels[srcBase + 3] ?? 0;
|
|
330478
|
+
output22[dstBase + x * 6 + 3] = rawPixels[srcBase + 2] ?? 0;
|
|
330479
|
+
output22[dstBase + x * 6 + 4] = rawPixels[srcBase + 5] ?? 0;
|
|
330480
|
+
output22[dstBase + x * 6 + 5] = rawPixels[srcBase + 4] ?? 0;
|
|
330481
|
+
}
|
|
330482
|
+
}
|
|
330483
|
+
return { width, height, data: output22 };
|
|
330484
|
+
}
|
|
330485
|
+
function buildSrgbToHdrLut(transfer) {
|
|
330486
|
+
const lut = new Uint16Array(256);
|
|
330487
|
+
const hlgA = 0.17883277;
|
|
330488
|
+
const hlgB = 1 - 4 * hlgA;
|
|
330489
|
+
const hlgC = 0.5 - hlgA * Math.log(4 * hlgA);
|
|
330490
|
+
const pqM1 = 0.1593017578125;
|
|
330491
|
+
const pqM2 = 78.84375;
|
|
330492
|
+
const pqC1 = 0.8359375;
|
|
330493
|
+
const pqC2 = 18.8515625;
|
|
330494
|
+
const pqC3 = 18.6875;
|
|
330495
|
+
const pqMaxNits = 1e4;
|
|
330496
|
+
const sdrNits = 203;
|
|
330497
|
+
for (let i = 0; i < 256; i++) {
|
|
330498
|
+
const v = i / 255;
|
|
330499
|
+
const linear = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
|
|
330500
|
+
let signal;
|
|
330501
|
+
if (transfer === "hlg") {
|
|
330502
|
+
signal = linear <= 1 / 12 ? Math.sqrt(3 * linear) : hlgA * Math.log(12 * linear - hlgB) + hlgC;
|
|
330503
|
+
} else {
|
|
330504
|
+
const Lp = Math.max(0, linear * sdrNits / pqMaxNits);
|
|
330505
|
+
const Lm1 = Math.pow(Lp, pqM1);
|
|
330506
|
+
signal = Math.pow((pqC1 + pqC2 * Lm1) / (1 + pqC3 * Lm1), pqM2);
|
|
330507
|
+
}
|
|
330508
|
+
lut[i] = Math.min(65535, Math.round(signal * 65535));
|
|
330509
|
+
}
|
|
330510
|
+
return lut;
|
|
330511
|
+
}
|
|
330512
|
+
function getSrgbToHdrLut(transfer) {
|
|
330513
|
+
return transfer === "pq" ? SRGB_TO_PQ : SRGB_TO_HLG;
|
|
330514
|
+
}
|
|
330515
|
+
function blitRgba8OverRgb48le(domRgba, canvas, width, height, transfer = "hlg") {
|
|
330516
|
+
const pixelCount = width * height;
|
|
330517
|
+
const lut = getSrgbToHdrLut(transfer);
|
|
330518
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
330519
|
+
const da = domRgba[i * 4 + 3] ?? 0;
|
|
330520
|
+
if (da === 0) {
|
|
330521
|
+
continue;
|
|
330522
|
+
} else if (da === 255) {
|
|
330523
|
+
const r16 = lut[domRgba[i * 4 + 0] ?? 0] ?? 0;
|
|
330524
|
+
const g16 = lut[domRgba[i * 4 + 1] ?? 0] ?? 0;
|
|
330525
|
+
const b16 = lut[domRgba[i * 4 + 2] ?? 0] ?? 0;
|
|
330526
|
+
canvas.writeUInt16LE(r16, i * 6);
|
|
330527
|
+
canvas.writeUInt16LE(g16, i * 6 + 2);
|
|
330528
|
+
canvas.writeUInt16LE(b16, i * 6 + 4);
|
|
330529
|
+
} else {
|
|
330530
|
+
const alpha = da / 255;
|
|
330531
|
+
const invAlpha = 1 - alpha;
|
|
330532
|
+
const hdrR = (canvas[i * 6 + 0] ?? 0) | (canvas[i * 6 + 1] ?? 0) << 8;
|
|
330533
|
+
const hdrG = (canvas[i * 6 + 2] ?? 0) | (canvas[i * 6 + 3] ?? 0) << 8;
|
|
330534
|
+
const hdrB = (canvas[i * 6 + 4] ?? 0) | (canvas[i * 6 + 5] ?? 0) << 8;
|
|
330535
|
+
const domR = lut[domRgba[i * 4 + 0] ?? 0] ?? 0;
|
|
330536
|
+
const domG = lut[domRgba[i * 4 + 1] ?? 0] ?? 0;
|
|
330537
|
+
const domB = lut[domRgba[i * 4 + 2] ?? 0] ?? 0;
|
|
330538
|
+
canvas.writeUInt16LE(Math.round(domR * alpha + hdrR * invAlpha), i * 6);
|
|
330539
|
+
canvas.writeUInt16LE(Math.round(domG * alpha + hdrG * invAlpha), i * 6 + 2);
|
|
330540
|
+
canvas.writeUInt16LE(Math.round(domB * alpha + hdrB * invAlpha), i * 6 + 4);
|
|
330541
|
+
}
|
|
330542
|
+
}
|
|
330543
|
+
}
|
|
330544
|
+
function cornerAlpha(px, py, cx, cy, r) {
|
|
330545
|
+
const dx = px - cx;
|
|
330546
|
+
const dy = py - cy;
|
|
330547
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
330548
|
+
if (dist > r + 0.5) return 0;
|
|
330549
|
+
if (dist > r - 0.5) return r + 0.5 - dist;
|
|
330550
|
+
return 1;
|
|
330551
|
+
}
|
|
330552
|
+
function roundedRectAlpha(px, py, w, h, radii) {
|
|
330553
|
+
const [tl, tr, br, bl] = radii;
|
|
330554
|
+
if (px < tl && py < tl) return cornerAlpha(px, py, tl, tl, tl);
|
|
330555
|
+
if (px >= w - tr && py < tr) return cornerAlpha(px, py, w - tr, tr, tr);
|
|
330556
|
+
if (px >= w - br && py >= h - br) return cornerAlpha(px, py, w - br, h - br, br);
|
|
330557
|
+
if (px < bl && py >= h - bl) return cornerAlpha(px, py, bl, h - bl, bl);
|
|
330558
|
+
return 1;
|
|
330559
|
+
}
|
|
330560
|
+
function blitRgb48leRegion(canvas, source22, dx, dy, sw, sh, canvasWidth, canvasHeight, opacity, borderRadius) {
|
|
330561
|
+
if (sw <= 0 || sh <= 0) return;
|
|
330562
|
+
const op = opacity ?? 1;
|
|
330563
|
+
const x0 = Math.max(0, dx);
|
|
330564
|
+
const y0 = Math.max(0, dy);
|
|
330565
|
+
const x1 = Math.min(canvasWidth, dx + sw);
|
|
330566
|
+
const y1 = Math.min(canvasHeight, dy + sh);
|
|
330567
|
+
if (x0 >= x1 || y0 >= y1) return;
|
|
330568
|
+
const clippedW = x1 - x0;
|
|
330569
|
+
const srcOffsetX = x0 - dx;
|
|
330570
|
+
const srcOffsetY = y0 - dy;
|
|
330571
|
+
const hasMask = borderRadius !== void 0;
|
|
330572
|
+
if (op >= 0.999 && !hasMask) {
|
|
330573
|
+
for (let y = 0; y < y1 - y0; y++) {
|
|
330574
|
+
const srcRowOff = ((srcOffsetY + y) * sw + srcOffsetX) * 6;
|
|
330575
|
+
const dstRowOff = ((y0 + y) * canvasWidth + x0) * 6;
|
|
330576
|
+
source22.copy(canvas, dstRowOff, srcRowOff, srcRowOff + clippedW * 6);
|
|
330577
|
+
}
|
|
330578
|
+
} else {
|
|
330579
|
+
for (let y = 0; y < y1 - y0; y++) {
|
|
330580
|
+
for (let x = 0; x < clippedW; x++) {
|
|
330581
|
+
let effectiveOp = op;
|
|
330582
|
+
if (hasMask) {
|
|
330583
|
+
const ma = roundedRectAlpha(srcOffsetX + x, srcOffsetY + y, sw, sh, borderRadius);
|
|
330584
|
+
if (ma <= 0) continue;
|
|
330585
|
+
effectiveOp *= ma;
|
|
330586
|
+
}
|
|
330587
|
+
const srcOff = ((srcOffsetY + y) * sw + srcOffsetX + x) * 6;
|
|
330588
|
+
const dstOff = ((y0 + y) * canvasWidth + x0 + x) * 6;
|
|
330589
|
+
if (effectiveOp >= 0.999) {
|
|
330590
|
+
source22.copy(canvas, dstOff, srcOff, srcOff + 6);
|
|
330591
|
+
} else {
|
|
330592
|
+
const invEff = 1 - effectiveOp;
|
|
330593
|
+
const sr = source22.readUInt16LE(srcOff);
|
|
330594
|
+
const sg = source22.readUInt16LE(srcOff + 2);
|
|
330595
|
+
const sb = source22.readUInt16LE(srcOff + 4);
|
|
330596
|
+
const dr = canvas.readUInt16LE(dstOff);
|
|
330597
|
+
const dg = canvas.readUInt16LE(dstOff + 2);
|
|
330598
|
+
const db = canvas.readUInt16LE(dstOff + 4);
|
|
330599
|
+
canvas.writeUInt16LE(Math.round(sr * effectiveOp + dr * invEff), dstOff);
|
|
330600
|
+
canvas.writeUInt16LE(Math.round(sg * effectiveOp + dg * invEff), dstOff + 2);
|
|
330601
|
+
canvas.writeUInt16LE(Math.round(sb * effectiveOp + db * invEff), dstOff + 4);
|
|
330602
|
+
}
|
|
330603
|
+
}
|
|
330604
|
+
}
|
|
330605
|
+
}
|
|
330606
|
+
}
|
|
330607
|
+
function blitRgb48leAffine(canvas, source22, matrix, srcW, srcH, canvasW, canvasH, opacity, borderRadius) {
|
|
330608
|
+
const a = matrix[0];
|
|
330609
|
+
const b = matrix[1];
|
|
330610
|
+
const c = matrix[2];
|
|
330611
|
+
const d = matrix[3];
|
|
330612
|
+
const tx = matrix[4];
|
|
330613
|
+
const ty = matrix[5];
|
|
330614
|
+
if (a === void 0 || b === void 0 || c === void 0 || d === void 0 || tx === void 0 || ty === void 0)
|
|
330615
|
+
return;
|
|
330616
|
+
const det = a * d - b * c;
|
|
330617
|
+
if (Math.abs(det) < 1e-10) return;
|
|
330618
|
+
const invA = d / det;
|
|
330619
|
+
const invB = -b / det;
|
|
330620
|
+
const invC = -c / det;
|
|
330621
|
+
const invD = a / det;
|
|
330622
|
+
const invTx = -(invA * tx + invC * ty);
|
|
330623
|
+
const invTy = -(invB * tx + invD * ty);
|
|
330624
|
+
const op = opacity ?? 1;
|
|
330625
|
+
const hasMask = borderRadius !== void 0;
|
|
330626
|
+
const corners = [
|
|
330627
|
+
[tx, ty],
|
|
330628
|
+
[a * srcW + tx, b * srcW + ty],
|
|
330629
|
+
[c * srcH + tx, d * srcH + ty],
|
|
330630
|
+
[a * srcW + c * srcH + tx, b * srcW + d * srcH + ty]
|
|
330631
|
+
];
|
|
330632
|
+
let minX = canvasW, maxX = 0, minY = canvasH, maxY = 0;
|
|
330633
|
+
for (const corner of corners) {
|
|
330634
|
+
const cx = corner[0] ?? 0;
|
|
330635
|
+
const cy = corner[1] ?? 0;
|
|
330636
|
+
if (cx < minX) minX = cx;
|
|
330637
|
+
if (cx > maxX) maxX = cx;
|
|
330638
|
+
if (cy < minY) minY = cy;
|
|
330639
|
+
if (cy > maxY) maxY = cy;
|
|
330640
|
+
}
|
|
330641
|
+
const startX = Math.max(0, Math.floor(minX));
|
|
330642
|
+
const endX = Math.min(canvasW, Math.ceil(maxX));
|
|
330643
|
+
const startY = Math.max(0, Math.floor(minY));
|
|
330644
|
+
const endY = Math.min(canvasH, Math.ceil(maxY));
|
|
330645
|
+
for (let dy = startY; dy < endY; dy++) {
|
|
330646
|
+
for (let dx = startX; dx < endX; dx++) {
|
|
330647
|
+
const sx = invA * dx + invC * dy + invTx;
|
|
330648
|
+
const sy = invB * dx + invD * dy + invTy;
|
|
330649
|
+
if (sx < 0 || sy < 0 || sx >= srcW || sy >= srcH) continue;
|
|
330650
|
+
let effectiveOp = op;
|
|
330651
|
+
if (hasMask) {
|
|
330652
|
+
const ma = roundedRectAlpha(sx, sy, srcW, srcH, borderRadius);
|
|
330653
|
+
if (ma <= 0) continue;
|
|
330654
|
+
effectiveOp *= ma;
|
|
330655
|
+
}
|
|
330656
|
+
const x0 = Math.floor(sx);
|
|
330657
|
+
const y0 = Math.floor(sy);
|
|
330658
|
+
const fx = sx - x0;
|
|
330659
|
+
const fy = sy - y0;
|
|
330660
|
+
const x1 = Math.min(x0 + 1, srcW - 1);
|
|
330661
|
+
const y1 = Math.min(y0 + 1, srcH - 1);
|
|
330662
|
+
const off00 = (y0 * srcW + x0) * 6;
|
|
330663
|
+
const off10 = (y0 * srcW + x1) * 6;
|
|
330664
|
+
const off01 = (y1 * srcW + x0) * 6;
|
|
330665
|
+
const off11 = (y1 * srcW + x1) * 6;
|
|
330666
|
+
const w00 = (1 - fx) * (1 - fy);
|
|
330667
|
+
const w10 = fx * (1 - fy);
|
|
330668
|
+
const w01 = (1 - fx) * fy;
|
|
330669
|
+
const w11 = fx * fy;
|
|
330670
|
+
const sr = source22.readUInt16LE(off00) * w00 + source22.readUInt16LE(off10) * w10 + source22.readUInt16LE(off01) * w01 + source22.readUInt16LE(off11) * w11;
|
|
330671
|
+
const sg = source22.readUInt16LE(off00 + 2) * w00 + source22.readUInt16LE(off10 + 2) * w10 + source22.readUInt16LE(off01 + 2) * w01 + source22.readUInt16LE(off11 + 2) * w11;
|
|
330672
|
+
const sb = source22.readUInt16LE(off00 + 4) * w00 + source22.readUInt16LE(off10 + 4) * w10 + source22.readUInt16LE(off01 + 4) * w01 + source22.readUInt16LE(off11 + 4) * w11;
|
|
330673
|
+
const dstOff = (dy * canvasW + dx) * 6;
|
|
330674
|
+
if (effectiveOp >= 0.999) {
|
|
330675
|
+
canvas.writeUInt16LE(Math.round(sr), dstOff);
|
|
330676
|
+
canvas.writeUInt16LE(Math.round(sg), dstOff + 2);
|
|
330677
|
+
canvas.writeUInt16LE(Math.round(sb), dstOff + 4);
|
|
330678
|
+
} else {
|
|
330679
|
+
const invEff = 1 - effectiveOp;
|
|
330680
|
+
const dr = canvas.readUInt16LE(dstOff);
|
|
330681
|
+
const dg = canvas.readUInt16LE(dstOff + 2);
|
|
330682
|
+
const db = canvas.readUInt16LE(dstOff + 4);
|
|
330683
|
+
canvas.writeUInt16LE(Math.round(sr * effectiveOp + dr * invEff), dstOff);
|
|
330684
|
+
canvas.writeUInt16LE(Math.round(sg * effectiveOp + dg * invEff), dstOff + 2);
|
|
330685
|
+
canvas.writeUInt16LE(Math.round(sb * effectiveOp + db * invEff), dstOff + 4);
|
|
330686
|
+
}
|
|
330687
|
+
}
|
|
330688
|
+
}
|
|
330689
|
+
}
|
|
330690
|
+
function parseTransformMatrix(css) {
|
|
330691
|
+
if (!css || css === "none") return null;
|
|
330692
|
+
const match2 = css.match(
|
|
330693
|
+
/^matrix\(\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,)]+)\s*\)$/
|
|
330694
|
+
);
|
|
330695
|
+
if (!match2) return null;
|
|
330696
|
+
const values = match2.slice(1, 7).map(Number);
|
|
330697
|
+
if (!values.every(Number.isFinite)) return null;
|
|
330698
|
+
return values;
|
|
330699
|
+
}
|
|
330700
|
+
function groupIntoLayers(elements) {
|
|
330701
|
+
const sorted = [...elements].sort((a, b) => a.zIndex - b.zIndex);
|
|
330702
|
+
const layers = [];
|
|
330703
|
+
for (const el of sorted) {
|
|
330704
|
+
if (el.isHdr) {
|
|
330705
|
+
layers.push({ type: "hdr", element: el });
|
|
330706
|
+
} else {
|
|
330707
|
+
const last22 = layers[layers.length - 1];
|
|
330708
|
+
if (last22 && last22.type === "dom") {
|
|
330709
|
+
last22.elementIds.push(el.id);
|
|
330710
|
+
} else {
|
|
330711
|
+
layers.push({ type: "dom", elementIds: [el.id] });
|
|
330712
|
+
}
|
|
330713
|
+
}
|
|
330714
|
+
}
|
|
330715
|
+
return layers;
|
|
330716
|
+
}
|
|
330717
|
+
function pqEotf(signal) {
|
|
330718
|
+
const sp = Math.pow(Math.max(0, signal), 1 / PQ_M2);
|
|
330719
|
+
const num = Math.max(sp - PQ_C1, 0);
|
|
330720
|
+
const den = PQ_C2 - PQ_C3 * sp;
|
|
330721
|
+
return den > 0 ? Math.pow(num / den, 1 / PQ_M1) : 0;
|
|
330722
|
+
}
|
|
330723
|
+
function pqOetf(linear) {
|
|
330724
|
+
const lp = Math.pow(Math.max(0, linear), PQ_M1);
|
|
330725
|
+
return Math.pow((PQ_C1 + PQ_C2 * lp) / (1 + PQ_C3 * lp), PQ_M2);
|
|
330726
|
+
}
|
|
330727
|
+
function hlgEotf(signal) {
|
|
330728
|
+
const a = 0.17883277;
|
|
330729
|
+
const b = 1 - 4 * a;
|
|
330730
|
+
const c = 0.5 - a * Math.log(4 * a);
|
|
330731
|
+
if (signal <= 0.5) {
|
|
330732
|
+
return signal * signal / 3;
|
|
330733
|
+
}
|
|
330734
|
+
return (Math.exp((signal - c) / a) + b) / 12;
|
|
330735
|
+
}
|
|
330736
|
+
function hlgOetf(linear) {
|
|
330737
|
+
const a = 0.17883277;
|
|
330738
|
+
const b = 1 - 4 * a;
|
|
330739
|
+
const c = 0.5 - a * Math.log(4 * a);
|
|
330740
|
+
if (linear <= 1 / 12) {
|
|
330741
|
+
return Math.sqrt(3 * linear);
|
|
330742
|
+
}
|
|
330743
|
+
return a * Math.log(12 * linear - b) + c;
|
|
330744
|
+
}
|
|
330745
|
+
function buildLut(fn) {
|
|
330746
|
+
const lut = new Uint16Array(65536);
|
|
330747
|
+
for (let i = 0; i < 65536; i++) {
|
|
330748
|
+
lut[i] = Math.round(fn(i / 65535) * 65535);
|
|
330749
|
+
}
|
|
330750
|
+
return lut;
|
|
330751
|
+
}
|
|
330752
|
+
function hlgSceneToPqDisplay(sceneLinear) {
|
|
330753
|
+
const displayNits = HLG_OOTF_LW * Math.pow(Math.max(0, sceneLinear), HLG_OOTF_GAMMA);
|
|
330754
|
+
return displayNits / 1e4;
|
|
330755
|
+
}
|
|
330756
|
+
function pqDisplayToHlgScene(displayNormalized) {
|
|
330757
|
+
const displayNits = displayNormalized * 1e4;
|
|
330758
|
+
return Math.pow(Math.max(0, displayNits / HLG_OOTF_LW), 1 / HLG_OOTF_GAMMA);
|
|
330759
|
+
}
|
|
330760
|
+
function getHlgToPqLut() {
|
|
330761
|
+
if (!hlgToPqLut) hlgToPqLut = buildLut((v) => pqOetf(hlgSceneToPqDisplay(hlgEotf(v))));
|
|
330762
|
+
return hlgToPqLut;
|
|
330763
|
+
}
|
|
330764
|
+
function getPqToHlgLut() {
|
|
330765
|
+
if (!pqToHlgLut) pqToHlgLut = buildLut((v) => hlgOetf(pqDisplayToHlgScene(pqEotf(v))));
|
|
330766
|
+
return pqToHlgLut;
|
|
330767
|
+
}
|
|
330768
|
+
function convertTransfer(buf, from22, to) {
|
|
330769
|
+
if (from22 === to) return;
|
|
330770
|
+
const lut = from22 === "hlg" ? getHlgToPqLut() : getPqToHlgLut();
|
|
330771
|
+
const len = buf.length / 2;
|
|
330772
|
+
for (let i = 0; i < len; i++) {
|
|
330773
|
+
const off = i * 2;
|
|
330774
|
+
buf.writeUInt16LE(lut[buf.readUInt16LE(off)] ?? 0, off);
|
|
330775
|
+
}
|
|
330776
|
+
}
|
|
330777
|
+
function sampleRgb48le(buf, u, v, w, h) {
|
|
330778
|
+
const uc = Math.max(0, Math.min(1, u));
|
|
330779
|
+
const vc = Math.max(0, Math.min(1, v));
|
|
330780
|
+
const sx = uc * (w - 1);
|
|
330781
|
+
const sy = vc * (h - 1);
|
|
330782
|
+
const x0 = Math.floor(sx);
|
|
330783
|
+
const y0 = Math.floor(sy);
|
|
330784
|
+
const x1 = Math.min(x0 + 1, w - 1);
|
|
330785
|
+
const y1 = Math.min(y0 + 1, h - 1);
|
|
330786
|
+
const fx = sx - x0;
|
|
330787
|
+
const fy = sy - y0;
|
|
330788
|
+
const w00 = (1 - fx) * (1 - fy);
|
|
330789
|
+
const w10 = fx * (1 - fy);
|
|
330790
|
+
const w01 = (1 - fx) * fy;
|
|
330791
|
+
const w11 = fx * fy;
|
|
330792
|
+
const off00 = (y0 * w + x0) * 6;
|
|
330793
|
+
const off10 = (y0 * w + x1) * 6;
|
|
330794
|
+
const off01 = (y1 * w + x0) * 6;
|
|
330795
|
+
const off11 = (y1 * w + x1) * 6;
|
|
330796
|
+
const r = Math.round(
|
|
330797
|
+
buf.readUInt16LE(off00) * w00 + buf.readUInt16LE(off10) * w10 + buf.readUInt16LE(off01) * w01 + buf.readUInt16LE(off11) * w11
|
|
330798
|
+
);
|
|
330799
|
+
const g = Math.round(
|
|
330800
|
+
buf.readUInt16LE(off00 + 2) * w00 + buf.readUInt16LE(off10 + 2) * w10 + buf.readUInt16LE(off01 + 2) * w01 + buf.readUInt16LE(off11 + 2) * w11
|
|
330801
|
+
);
|
|
330802
|
+
const b = Math.round(
|
|
330803
|
+
buf.readUInt16LE(off00 + 4) * w00 + buf.readUInt16LE(off10 + 4) * w10 + buf.readUInt16LE(off01 + 4) * w01 + buf.readUInt16LE(off11 + 4) * w11
|
|
330804
|
+
);
|
|
330805
|
+
return [r, g, b];
|
|
330806
|
+
}
|
|
330807
|
+
function mix16(a, b, t) {
|
|
330808
|
+
return Math.round(a * (1 - t) + b * t);
|
|
330809
|
+
}
|
|
330810
|
+
function clamp16(v) {
|
|
330811
|
+
return Math.max(0, Math.min(65535, v));
|
|
330812
|
+
}
|
|
330813
|
+
function smoothstep(edge0, edge1, x) {
|
|
330814
|
+
const t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0)));
|
|
330815
|
+
return t * t * (3 - 2 * t);
|
|
330816
|
+
}
|
|
330817
|
+
function hash(x, y) {
|
|
330818
|
+
return (Math.sin(x * 127.1 + y * 311.7) * 43758.5453 % 1 + 1) % 1;
|
|
330819
|
+
}
|
|
330820
|
+
function vnoise(px, py) {
|
|
330821
|
+
const ix = Math.floor(px);
|
|
330822
|
+
const iy = Math.floor(py);
|
|
330823
|
+
let fx = px - ix;
|
|
330824
|
+
let fy = py - iy;
|
|
330825
|
+
fx = fx * fx * fx * (fx * (fx * 6 - 15) + 10);
|
|
330826
|
+
fy = fy * fy * fy * (fy * (fy * 6 - 15) + 10);
|
|
330827
|
+
const h00 = hash(ix, iy);
|
|
330828
|
+
const h10 = hash(ix + 1, iy);
|
|
330829
|
+
const h01 = hash(ix, iy + 1);
|
|
330830
|
+
const h11 = hash(ix + 1, iy + 1);
|
|
330831
|
+
return h00 * (1 - fx) * (1 - fy) + h10 * fx * (1 - fy) + h01 * (1 - fx) * fy + h11 * fx * fy;
|
|
330832
|
+
}
|
|
330833
|
+
function fbm(px, py) {
|
|
330834
|
+
let value = 0;
|
|
330835
|
+
let amplitude = 0.5;
|
|
330836
|
+
let x = px;
|
|
330837
|
+
let y = py;
|
|
330838
|
+
for (let i = 0; i < 5; i++) {
|
|
330839
|
+
value += amplitude * vnoise(x, y);
|
|
330840
|
+
const nx = ROT_A * x - ROT_B * y;
|
|
330841
|
+
const ny = ROT_B * x + ROT_A * y;
|
|
330842
|
+
x = nx * 2.02;
|
|
330843
|
+
y = ny * 2.02;
|
|
330844
|
+
amplitude *= 0.5;
|
|
330845
|
+
}
|
|
330846
|
+
return value;
|
|
330847
|
+
}
|
|
330848
|
+
function glitchRand(x, y) {
|
|
330849
|
+
return (Math.sin(x * 12.9898 + y * 78.233) * 43758.5453 % 1 + 1) % 1;
|
|
330850
|
+
}
|
|
330851
|
+
function aces(x) {
|
|
330852
|
+
return Math.max(0, Math.min(1, x * (2.51 * x + 0.03) / (x * (2.43 * x + 0.59) + 0.14)));
|
|
330853
|
+
}
|
|
330854
|
+
function ridged(px, py) {
|
|
330855
|
+
let value = 0;
|
|
330856
|
+
let amplitude = 0.5;
|
|
330857
|
+
let x = px;
|
|
330858
|
+
let y = py;
|
|
330859
|
+
for (let i = 0; i < 5; i++) {
|
|
330860
|
+
value += amplitude * Math.abs(vnoise(x, y) * 2 - 1);
|
|
330861
|
+
const nx = ROT_A * x - ROT_B * y;
|
|
330862
|
+
const ny = ROT_B * x + ROT_A * y;
|
|
330863
|
+
x = nx * 2.02;
|
|
330864
|
+
y = ny * 2.02;
|
|
330865
|
+
amplitude *= 0.5;
|
|
330866
|
+
}
|
|
330867
|
+
return value;
|
|
330868
|
+
}
|
|
329908
330869
|
function resolveHyperframeManifestPath() {
|
|
329909
330870
|
if (process.env.PRODUCER_HYPERFRAME_MANIFEST_PATH) {
|
|
329910
330871
|
return process.env.PRODUCER_HYPERFRAME_MANIFEST_PATH;
|
|
@@ -330017,8 +330978,22 @@ function injectScriptsIntoHtml(html, headScripts, bodyScripts, stripEmbedded) {
|
|
|
330017
330978
|
}
|
|
330018
330979
|
return html;
|
|
330019
330980
|
}
|
|
330981
|
+
function injectScriptsAtHeadStart(html, scripts) {
|
|
330982
|
+
if (scripts.length === 0) return html;
|
|
330983
|
+
const headTags = scripts.map((src) => `<script>${src}</script>`).join("\n");
|
|
330984
|
+
if (html.includes("<head")) {
|
|
330985
|
+
return html.replace(/<head\b[^>]*>/i, (match2) => `${match2}
|
|
330986
|
+
${headTags}`);
|
|
330987
|
+
}
|
|
330988
|
+
if (html.includes("<body")) {
|
|
330989
|
+
return html.replace("<body", () => `${headTags}
|
|
330990
|
+
<body`);
|
|
330991
|
+
}
|
|
330992
|
+
return headTags + "\n" + html;
|
|
330993
|
+
}
|
|
330020
330994
|
function createFileServer2(options) {
|
|
330021
330995
|
const { projectDir, compiledDir, port = 0, stripEmbeddedRuntime = true } = options;
|
|
330996
|
+
const preHeadScripts = [HF_EARLY_STUB, ...options.preHeadScripts ?? []];
|
|
330022
330997
|
const headScripts = options.headScripts ?? [getVerifiedHyperframeRuntimeSource()];
|
|
330023
330998
|
const bodyScripts = options.bodyScripts ?? [RENDER_MODE_SCRIPT, HF_BRIDGE_SCRIPT];
|
|
330024
330999
|
const app = new Hono2();
|
|
@@ -330042,7 +331017,11 @@ function createFileServer2(options) {
|
|
|
330042
331017
|
if (ext === ".html") {
|
|
330043
331018
|
const rawHtml = readFileSync6(filePath, "utf-8");
|
|
330044
331019
|
const isIndex = relativePath === "index.html";
|
|
330045
|
-
|
|
331020
|
+
let html = rawHtml;
|
|
331021
|
+
if (preHeadScripts.length > 0) {
|
|
331022
|
+
html = injectScriptsAtHeadStart(html, preHeadScripts);
|
|
331023
|
+
}
|
|
331024
|
+
html = isIndex ? injectScriptsIntoHtml(html, headScripts, bodyScripts, stripEmbeddedRuntime) : html;
|
|
330046
331025
|
return c.text(html, 200, { "Content-Type": contentType });
|
|
330047
331026
|
}
|
|
330048
331027
|
const content = readFileSync6(filePath);
|
|
@@ -330070,6 +331049,30 @@ function createFileServer2(options) {
|
|
|
330070
331049
|
});
|
|
330071
331050
|
});
|
|
330072
331051
|
}
|
|
331052
|
+
function isPathInside(childPath, parentPath) {
|
|
331053
|
+
const absChild = resolve82(childPath);
|
|
331054
|
+
const absParent = resolve82(parentPath);
|
|
331055
|
+
if (absChild === absParent) return true;
|
|
331056
|
+
const rel = relative22(absParent, absChild);
|
|
331057
|
+
return rel !== "" && !rel.startsWith("..") && !isAbsolute22(rel);
|
|
331058
|
+
}
|
|
331059
|
+
function toExternalAssetKey(absPath) {
|
|
331060
|
+
if (absPath.startsWith("hf-ext/")) return absPath;
|
|
331061
|
+
let normalised = absPath.replace(/\\/g, "/");
|
|
331062
|
+
normalised = normalised.replace(/^\/\/\?\/UNC\//i, "//");
|
|
331063
|
+
normalised = normalised.replace(/^\/\/\?\//, "");
|
|
331064
|
+
normalised = normalised.replace(/^\/\/([^/]+)\//, "unc/$1/");
|
|
331065
|
+
normalised = normalised.replace(/^\/+/, "");
|
|
331066
|
+
normalised = normalised.replace(/^([A-Za-z]):\/?/, "$1/");
|
|
331067
|
+
return "hf-ext/" + normalised;
|
|
331068
|
+
}
|
|
331069
|
+
function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
|
|
331070
|
+
const absoluteProjectDir = resolve82(projectDir);
|
|
331071
|
+
const projectName = basename22(absoluteProjectDir);
|
|
331072
|
+
const resolvedOutputPath = outputPath ?? join12(rendersDir, `${projectName}.mp4`);
|
|
331073
|
+
const absoluteOutputPath = resolve82(resolvedOutputPath);
|
|
331074
|
+
return { absoluteProjectDir, absoluteOutputPath };
|
|
331075
|
+
}
|
|
330073
331076
|
function normalizeFamilyName(family) {
|
|
330074
331077
|
return family.trim().replace(/^['"]|['"]$/g, "").trim().toLowerCase();
|
|
330075
331078
|
}
|
|
@@ -330180,14 +331183,14 @@ function fontSlug(familyName) {
|
|
|
330180
331183
|
return familyName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
330181
331184
|
}
|
|
330182
331185
|
function fontCacheDir(slug) {
|
|
330183
|
-
const dir =
|
|
331186
|
+
const dir = join13(GOOGLE_FONTS_CACHE_DIR, slug);
|
|
330184
331187
|
if (!existsSync13(dir)) {
|
|
330185
331188
|
mkdirSync8(dir, { recursive: true });
|
|
330186
331189
|
}
|
|
330187
331190
|
return dir;
|
|
330188
331191
|
}
|
|
330189
331192
|
function cachedWoff2Path(slug, weight, style) {
|
|
330190
|
-
return
|
|
331193
|
+
return join13(fontCacheDir(slug), `${weight}-${style}.woff2`);
|
|
330191
331194
|
}
|
|
330192
331195
|
async function fetchGoogleFont(familyName) {
|
|
330193
331196
|
const slug = fontSlug(familyName);
|
|
@@ -330277,6 +331280,36 @@ function dedupeElementsById(elements) {
|
|
|
330277
331280
|
}
|
|
330278
331281
|
return Array.from(deduped.values());
|
|
330279
331282
|
}
|
|
331283
|
+
function stripJsComments(source22) {
|
|
331284
|
+
return source22.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
|
|
331285
|
+
}
|
|
331286
|
+
function detectRenderModeHints(html) {
|
|
331287
|
+
const reasons = [];
|
|
331288
|
+
const { document: document22 } = parseHTML(html);
|
|
331289
|
+
if (document22.querySelector("iframe")) {
|
|
331290
|
+
reasons.push({
|
|
331291
|
+
code: "iframe",
|
|
331292
|
+
message: "Detected <iframe> in the composition DOM. Nested iframe animation is routed through screenshot capture mode for compatibility."
|
|
331293
|
+
});
|
|
331294
|
+
}
|
|
331295
|
+
let scriptMatch;
|
|
331296
|
+
const scriptPattern = new RegExp(INLINE_SCRIPT_PATTERN.source, INLINE_SCRIPT_PATTERN.flags);
|
|
331297
|
+
while ((scriptMatch = scriptPattern.exec(html)) !== null) {
|
|
331298
|
+
const attrs = scriptMatch[1] || "";
|
|
331299
|
+
if (/\bsrc\s*=/i.test(attrs)) continue;
|
|
331300
|
+
const content = stripJsComments(scriptMatch[2] || "");
|
|
331301
|
+
if (!/requestAnimationFrame\s*\(/.test(content)) continue;
|
|
331302
|
+
reasons.push({
|
|
331303
|
+
code: "requestAnimationFrame",
|
|
331304
|
+
message: "Detected raw requestAnimationFrame() in an inline script. This render is routed through screenshot capture mode with virtual time enabled."
|
|
331305
|
+
});
|
|
331306
|
+
break;
|
|
331307
|
+
}
|
|
331308
|
+
return {
|
|
331309
|
+
recommendScreenshot: reasons.length > 0,
|
|
331310
|
+
reasons
|
|
331311
|
+
};
|
|
331312
|
+
}
|
|
330280
331313
|
async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagName19) {
|
|
330281
331314
|
let filePath = src;
|
|
330282
331315
|
if (isHttpUrl(src)) {
|
|
@@ -330287,7 +331320,7 @@ async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagNa
|
|
|
330287
331320
|
return { duration: 0, resolvedPath: src };
|
|
330288
331321
|
}
|
|
330289
331322
|
} else if (!filePath.startsWith("/")) {
|
|
330290
|
-
filePath =
|
|
331323
|
+
filePath = join14(baseDir, filePath);
|
|
330291
331324
|
}
|
|
330292
331325
|
if (!existsSync14(filePath)) {
|
|
330293
331326
|
return { duration: 0, resolvedPath: filePath };
|
|
@@ -330353,7 +331386,7 @@ async function parseSubCompositions(html, projectDir, downloadDir, parentOffset
|
|
|
330353
331386
|
const elEnd = elEndRaw ? parseFloat(elEndRaw) : Infinity;
|
|
330354
331387
|
const absoluteStart = parentOffset + elStart;
|
|
330355
331388
|
const absoluteEnd = Math.min(parentEnd, isFinite(elEnd) ? parentOffset + elEnd : Infinity);
|
|
330356
|
-
const filePath =
|
|
331389
|
+
const filePath = resolve92(projectDir, srcPath);
|
|
330357
331390
|
if (visited.has(filePath)) {
|
|
330358
331391
|
continue;
|
|
330359
331392
|
}
|
|
@@ -330553,7 +331586,7 @@ function inlineSubCompositions(html, subCompositions, projectDir) {
|
|
|
330553
331586
|
if (!srcPath) continue;
|
|
330554
331587
|
let compHtml = subCompositions.get(srcPath) || null;
|
|
330555
331588
|
if (!compHtml) {
|
|
330556
|
-
const filePath =
|
|
331589
|
+
const filePath = resolve92(projectDir, srcPath);
|
|
330557
331590
|
if (existsSync14(filePath)) {
|
|
330558
331591
|
compHtml = readFileSync8(filePath, "utf-8");
|
|
330559
331592
|
}
|
|
@@ -330766,7 +331799,7 @@ ${safeText}
|
|
|
330766
331799
|
return result;
|
|
330767
331800
|
}
|
|
330768
331801
|
function collectExternalAssets(html, projectDir) {
|
|
330769
|
-
const absProjectDir =
|
|
331802
|
+
const absProjectDir = resolve92(projectDir);
|
|
330770
331803
|
const externalAssets = /* @__PURE__ */ new Map();
|
|
330771
331804
|
const CSS_URL_RE2 = /\burl\(\s*(["']?)([^)"']+)\1\s*\)/g;
|
|
330772
331805
|
function processPath(rawPath) {
|
|
@@ -330774,12 +331807,12 @@ function collectExternalAssets(html, projectDir) {
|
|
|
330774
331807
|
if (!trimmed || trimmed.startsWith("/") || trimmed.startsWith("http://") || trimmed.startsWith("https://") || trimmed.startsWith("//") || trimmed.startsWith("data:") || trimmed.startsWith("#")) {
|
|
330775
331808
|
return null;
|
|
330776
331809
|
}
|
|
330777
|
-
const absPath =
|
|
330778
|
-
if (
|
|
331810
|
+
const absPath = resolve92(absProjectDir, trimmed);
|
|
331811
|
+
if (isPathInside(absPath, absProjectDir)) {
|
|
330779
331812
|
return null;
|
|
330780
331813
|
}
|
|
330781
331814
|
if (!existsSync14(absPath)) return null;
|
|
330782
|
-
const safeKey =
|
|
331815
|
+
const safeKey = toExternalAssetKey(absPath);
|
|
330783
331816
|
externalAssets.set(safeKey, absPath);
|
|
330784
331817
|
return safeKey;
|
|
330785
331818
|
}
|
|
@@ -330840,6 +331873,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
|
330840
331873
|
/(<(?:video|audio)\b[^>]*?)\s+preload\s*=\s*["']none["']/gi,
|
|
330841
331874
|
"$1"
|
|
330842
331875
|
);
|
|
331876
|
+
const renderModeHints = detectRenderModeHints(sanitizedHtml);
|
|
330843
331877
|
const coalescedHtml = await injectDeterministicFontFaces(
|
|
330844
331878
|
coalesceHeadStylesAndBodyScripts(promoteCssImportsToLinkTags(sanitizedHtml))
|
|
330845
331879
|
);
|
|
@@ -330851,7 +331885,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
|
330851
331885
|
const audios = dedupeElementsById([...mainAudios, ...subAudios]);
|
|
330852
331886
|
for (const video of videos) {
|
|
330853
331887
|
if (isHttpUrl(video.src)) continue;
|
|
330854
|
-
const videoPath =
|
|
331888
|
+
const videoPath = resolve92(projectDir, video.src);
|
|
330855
331889
|
const reencode = `ffmpeg -i "${video.src}" -c:v libx264 -r 30 -g 30 -keyint_min 30 -movflags +faststart -c:a copy output.mp4`;
|
|
330856
331890
|
Promise.all([analyzeKeyframeIntervals(videoPath), extractVideoMetadata(videoPath)]).then(([analysis, metadata]) => {
|
|
330857
331891
|
if (analysis.isProblematic) {
|
|
@@ -330883,7 +331917,8 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
|
|
|
330883
331917
|
externalAssets,
|
|
330884
331918
|
width,
|
|
330885
331919
|
height,
|
|
330886
|
-
staticDuration
|
|
331920
|
+
staticDuration,
|
|
331921
|
+
renderModeHints
|
|
330887
331922
|
};
|
|
330888
331923
|
}
|
|
330889
331924
|
async function discoverMediaFromBrowser(page) {
|
|
@@ -330977,7 +332012,8 @@ async function recompileWithResolutions(compiled, resolutions, projectDir, downl
|
|
|
330977
332012
|
subCompositions,
|
|
330978
332013
|
videos,
|
|
330979
332014
|
audios,
|
|
330980
|
-
unresolvedCompositions: remaining
|
|
332015
|
+
unresolvedCompositions: remaining,
|
|
332016
|
+
renderModeHints: compiled.renderModeHints
|
|
330981
332017
|
};
|
|
330982
332018
|
}
|
|
330983
332019
|
function createConsoleLogger(level = "info") {
|
|
@@ -331016,6 +332052,22 @@ async function safeCleanup(label, fn, log2 = defaultLogger) {
|
|
|
331016
332052
|
});
|
|
331017
332053
|
}
|
|
331018
332054
|
}
|
|
332055
|
+
function getMaxFrameIndex(frameDir) {
|
|
332056
|
+
const cached = frameDirMaxIndexCache.get(frameDir);
|
|
332057
|
+
if (cached !== void 0) return cached;
|
|
332058
|
+
let max = 0;
|
|
332059
|
+
try {
|
|
332060
|
+
for (const name of readdirSync6(frameDir)) {
|
|
332061
|
+
const m = FRAME_FILENAME_RE.exec(name);
|
|
332062
|
+
if (!m) continue;
|
|
332063
|
+
const n = Number(m[1]);
|
|
332064
|
+
if (Number.isFinite(n) && n > max) max = n;
|
|
332065
|
+
}
|
|
332066
|
+
} catch {
|
|
332067
|
+
}
|
|
332068
|
+
frameDirMaxIndexCache.set(frameDir, max);
|
|
332069
|
+
return max;
|
|
332070
|
+
}
|
|
331019
332071
|
function updateJobStatus(job, status, stage, progress, onProgress) {
|
|
331020
332072
|
job.status = status;
|
|
331021
332073
|
job.currentStage = stage;
|
|
@@ -331059,17 +332111,17 @@ function installDebugLogger(logPath, log2 = defaultLogger) {
|
|
|
331059
332111
|
};
|
|
331060
332112
|
}
|
|
331061
332113
|
function writeCompiledArtifacts(compiled, workDir, includeSummary) {
|
|
331062
|
-
const compileDir =
|
|
332114
|
+
const compileDir = join15(workDir, "compiled");
|
|
331063
332115
|
mkdirSync10(compileDir, { recursive: true });
|
|
331064
|
-
writeFileSync4(
|
|
332116
|
+
writeFileSync4(join15(compileDir, "index.html"), compiled.html, "utf-8");
|
|
331065
332117
|
for (const [srcPath, html] of compiled.subCompositions) {
|
|
331066
|
-
const outPath =
|
|
332118
|
+
const outPath = join15(compileDir, srcPath);
|
|
331067
332119
|
mkdirSync10(dirname10(outPath), { recursive: true });
|
|
331068
332120
|
writeFileSync4(outPath, html, "utf-8");
|
|
331069
332121
|
}
|
|
331070
332122
|
for (const [relativePath, absolutePath] of compiled.externalAssets) {
|
|
331071
|
-
const outPath =
|
|
331072
|
-
if (!outPath
|
|
332123
|
+
const outPath = resolve102(join15(compileDir, relativePath));
|
|
332124
|
+
if (!isPathInside(outPath, compileDir)) {
|
|
331073
332125
|
console.warn(`[Render] Skipping external asset with unsafe path: ${relativePath}`);
|
|
331074
332126
|
continue;
|
|
331075
332127
|
}
|
|
@@ -331095,9 +332147,75 @@ function writeCompiledArtifacts(compiled, workDir, includeSummary) {
|
|
|
331095
332147
|
end: a.end,
|
|
331096
332148
|
mediaStart: a.mediaStart
|
|
331097
332149
|
})),
|
|
331098
|
-
subCompositions: Array.from(compiled.subCompositions.keys())
|
|
332150
|
+
subCompositions: Array.from(compiled.subCompositions.keys()),
|
|
332151
|
+
renderModeHints: compiled.renderModeHints
|
|
331099
332152
|
};
|
|
331100
|
-
writeFileSync4(
|
|
332153
|
+
writeFileSync4(join15(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
|
|
332154
|
+
}
|
|
332155
|
+
}
|
|
332156
|
+
function applyRenderModeHints(cfg, compiled, log2 = defaultLogger) {
|
|
332157
|
+
if (cfg.forceScreenshot || !compiled.renderModeHints.recommendScreenshot) return;
|
|
332158
|
+
cfg.forceScreenshot = true;
|
|
332159
|
+
log2.warn("Auto-selected screenshot capture mode for render compatibility", {
|
|
332160
|
+
reasonCodes: compiled.renderModeHints.reasons.map((reason) => reason.code),
|
|
332161
|
+
reasons: compiled.renderModeHints.reasons.map((reason) => reason.message)
|
|
332162
|
+
});
|
|
332163
|
+
}
|
|
332164
|
+
function blitHdrVideoLayer(canvas, el, time, fps, hdrFrameDirs, hdrStartTimes, width, height, log2, sourceTransfer, targetTransfer) {
|
|
332165
|
+
const frameDir = hdrFrameDirs.get(el.id);
|
|
332166
|
+
const startTime = hdrStartTimes.get(el.id);
|
|
332167
|
+
if (!frameDir || startTime === void 0) {
|
|
332168
|
+
return;
|
|
332169
|
+
}
|
|
332170
|
+
const videoFrameIndex = Math.round((time - startTime) * fps) + 1;
|
|
332171
|
+
if (videoFrameIndex < 1) return;
|
|
332172
|
+
const maxIndex = getMaxFrameIndex(frameDir);
|
|
332173
|
+
const effectiveIndex = maxIndex > 0 ? Math.min(videoFrameIndex, maxIndex) : videoFrameIndex;
|
|
332174
|
+
const framePath = join15(frameDir, `frame_${String(effectiveIndex).padStart(4, "0")}.png`);
|
|
332175
|
+
if (!existsSync15(framePath)) {
|
|
332176
|
+
return;
|
|
332177
|
+
}
|
|
332178
|
+
try {
|
|
332179
|
+
const { data: hdrRgb, width: srcW, height: srcH } = decodePngToRgb48le(readFileSync9(framePath));
|
|
332180
|
+
if (sourceTransfer && targetTransfer && sourceTransfer !== targetTransfer) {
|
|
332181
|
+
convertTransfer(hdrRgb, sourceTransfer, targetTransfer);
|
|
332182
|
+
}
|
|
332183
|
+
const viewportMatrix = parseTransformMatrix(el.transform);
|
|
332184
|
+
const br = el.borderRadius;
|
|
332185
|
+
const hasBorderRadius = br[0] > 0 || br[1] > 0 || br[2] > 0 || br[3] > 0;
|
|
332186
|
+
const borderRadiusParam = hasBorderRadius ? br : void 0;
|
|
332187
|
+
if (viewportMatrix) {
|
|
332188
|
+
blitRgb48leAffine(
|
|
332189
|
+
canvas,
|
|
332190
|
+
hdrRgb,
|
|
332191
|
+
viewportMatrix,
|
|
332192
|
+
srcW,
|
|
332193
|
+
srcH,
|
|
332194
|
+
width,
|
|
332195
|
+
height,
|
|
332196
|
+
el.opacity < 0.999 ? el.opacity : void 0,
|
|
332197
|
+
borderRadiusParam
|
|
332198
|
+
);
|
|
332199
|
+
} else {
|
|
332200
|
+
blitRgb48leRegion(
|
|
332201
|
+
canvas,
|
|
332202
|
+
hdrRgb,
|
|
332203
|
+
el.x,
|
|
332204
|
+
el.y,
|
|
332205
|
+
srcW,
|
|
332206
|
+
srcH,
|
|
332207
|
+
width,
|
|
332208
|
+
height,
|
|
332209
|
+
el.opacity < 0.999 ? el.opacity : void 0,
|
|
332210
|
+
borderRadiusParam
|
|
332211
|
+
);
|
|
332212
|
+
}
|
|
332213
|
+
} catch (err) {
|
|
332214
|
+
if (log2) {
|
|
332215
|
+
log2.debug(`HDR blit failed for ${el.id}`, {
|
|
332216
|
+
error: err instanceof Error ? err.message : String(err)
|
|
332217
|
+
});
|
|
332218
|
+
}
|
|
331101
332219
|
}
|
|
331102
332220
|
}
|
|
331103
332221
|
function createRenderJob(config22) {
|
|
@@ -331141,9 +332259,9 @@ function extractStandaloneEntryFromIndex(indexHtml, entryFile) {
|
|
|
331141
332259
|
}
|
|
331142
332260
|
async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSignal) {
|
|
331143
332261
|
const moduleDir = dirname10(fileURLToPath3(import.meta.url));
|
|
331144
|
-
const producerRoot = process.env.PRODUCER_RENDERS_DIR ?
|
|
331145
|
-
const debugDir =
|
|
331146
|
-
const workDir = job.config.debug ?
|
|
332262
|
+
const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve102(process.env.PRODUCER_RENDERS_DIR, "..") : resolve102(moduleDir, "../..");
|
|
332263
|
+
const debugDir = join15(producerRoot, ".debug");
|
|
332264
|
+
const workDir = job.config.debug ? join15(debugDir, job.id) : join15(dirname10(outputPath), `work-${job.id}`);
|
|
331147
332265
|
const pipelineStart = Date.now();
|
|
331148
332266
|
const log2 = job.config.logger ?? defaultLogger;
|
|
331149
332267
|
let fileServer = null;
|
|
@@ -331151,7 +332269,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331151
332269
|
let lastBrowserConsole = [];
|
|
331152
332270
|
let restoreLogger = null;
|
|
331153
332271
|
const perfStages = {};
|
|
331154
|
-
const perfOutputPath =
|
|
332272
|
+
const perfOutputPath = join15(workDir, "perf-summary.json");
|
|
331155
332273
|
const cfg = { ...job.config.producerConfig ?? resolveConfig() };
|
|
331156
332274
|
const outputFormat = job.config.format ?? "mp4";
|
|
331157
332275
|
const isWebm = outputFormat === "webm";
|
|
@@ -331173,19 +332291,19 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331173
332291
|
assertNotAborted();
|
|
331174
332292
|
if (!existsSync15(workDir)) mkdirSync10(workDir, { recursive: true });
|
|
331175
332293
|
if (job.config.debug) {
|
|
331176
|
-
const logPath =
|
|
332294
|
+
const logPath = join15(workDir, "render.log");
|
|
331177
332295
|
restoreLogger = installDebugLogger(logPath, log2);
|
|
331178
332296
|
}
|
|
331179
332297
|
const entryFile = job.config.entryFile || "index.html";
|
|
331180
|
-
let htmlPath =
|
|
332298
|
+
let htmlPath = join15(projectDir, entryFile);
|
|
331181
332299
|
if (!existsSync15(htmlPath)) {
|
|
331182
332300
|
throw new Error(`Entry file not found: ${htmlPath}`);
|
|
331183
332301
|
}
|
|
331184
332302
|
assertNotAborted();
|
|
331185
332303
|
const rawEntry = readFileSync9(htmlPath, "utf-8");
|
|
331186
332304
|
if (entryFile !== "index.html" && rawEntry.trimStart().startsWith("<template")) {
|
|
331187
|
-
const wrapperPath =
|
|
331188
|
-
const projectIndexPath =
|
|
332305
|
+
const wrapperPath = join15(workDir, "standalone-entry.html");
|
|
332306
|
+
const projectIndexPath = join15(projectDir, "index.html");
|
|
331189
332307
|
if (!existsSync15(projectIndexPath)) {
|
|
331190
332308
|
throw new Error(
|
|
331191
332309
|
`Template entry file "${entryFile}" requires a project index.html to extract its render shell.`
|
|
@@ -331209,9 +332327,10 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331209
332327
|
const stage1Start = Date.now();
|
|
331210
332328
|
updateJobStatus(job, "preprocessing", "Compiling composition", 5, onProgress);
|
|
331211
332329
|
const compileStart = Date.now();
|
|
331212
|
-
let compiled = await compileForRender(projectDir, htmlPath,
|
|
332330
|
+
let compiled = await compileForRender(projectDir, htmlPath, join15(workDir, "downloads"));
|
|
331213
332331
|
assertNotAborted();
|
|
331214
332332
|
perfStages.compileOnlyMs = Date.now() - compileStart;
|
|
332333
|
+
applyRenderModeHints(cfg, compiled, log2);
|
|
331215
332334
|
writeCompiledArtifacts(compiled, workDir, Boolean(job.config.debug));
|
|
331216
332335
|
log2.info("Compiled composition metadata", {
|
|
331217
332336
|
entryFile,
|
|
@@ -331219,7 +332338,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331219
332338
|
width: compiled.width,
|
|
331220
332339
|
height: compiled.height,
|
|
331221
332340
|
videoCount: compiled.videos.length,
|
|
331222
|
-
audioCount: compiled.audios.length
|
|
332341
|
+
audioCount: compiled.audios.length,
|
|
332342
|
+
renderModeHints: compiled.renderModeHints
|
|
331223
332343
|
});
|
|
331224
332344
|
const composition = {
|
|
331225
332345
|
duration: compiled.staticDuration,
|
|
@@ -331238,8 +332358,9 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331238
332358
|
reasons.push(`${compiled.unresolvedCompositions.length} unresolved composition(s)`);
|
|
331239
332359
|
fileServer = await createFileServer2({
|
|
331240
332360
|
projectDir,
|
|
331241
|
-
compiledDir:
|
|
331242
|
-
port: 0
|
|
332361
|
+
compiledDir: join15(workDir, "compiled"),
|
|
332362
|
+
port: 0,
|
|
332363
|
+
preHeadScripts: [VIRTUAL_TIME_SHIM]
|
|
331243
332364
|
});
|
|
331244
332365
|
assertNotAborted();
|
|
331245
332366
|
const captureOpts = {
|
|
@@ -331251,7 +332372,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331251
332372
|
};
|
|
331252
332373
|
probeSession = await createCaptureSession(
|
|
331253
332374
|
fileServer.url,
|
|
331254
|
-
|
|
332375
|
+
join15(workDir, "probe"),
|
|
331255
332376
|
captureOpts,
|
|
331256
332377
|
null,
|
|
331257
332378
|
cfg
|
|
@@ -331283,7 +332404,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331283
332404
|
compiled,
|
|
331284
332405
|
resolutions,
|
|
331285
332406
|
projectDir,
|
|
331286
|
-
|
|
332407
|
+
join15(workDir, "downloads")
|
|
331287
332408
|
);
|
|
331288
332409
|
assertNotAborted();
|
|
331289
332410
|
composition.videos = compiled.videos;
|
|
@@ -331367,6 +332488,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331367
332488
|
perfStages.browserProbeMs = Date.now() - probeStart;
|
|
331368
332489
|
job.duration = composition.duration;
|
|
331369
332490
|
job.totalFrames = Math.ceil(composition.duration * job.config.fps);
|
|
332491
|
+
const totalFrames = job.totalFrames;
|
|
331370
332492
|
if (job.duration <= 0) {
|
|
331371
332493
|
const diagnostics = [];
|
|
331372
332494
|
try {
|
|
@@ -331395,7 +332517,10 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331395
332517
|
}
|
|
331396
332518
|
}
|
|
331397
332519
|
}
|
|
331398
|
-
} catch {
|
|
332520
|
+
} catch (err) {
|
|
332521
|
+
log2.warn("Failed to gather browser diagnostics for zero-duration composition", {
|
|
332522
|
+
error: err instanceof Error ? err.message : String(err)
|
|
332523
|
+
});
|
|
331399
332524
|
diagnostics.push("(Could not gather browser diagnostics \u2014 page may have crashed)");
|
|
331400
332525
|
}
|
|
331401
332526
|
const hint = diagnostics.length > 0 ? "\n\nDiagnostics:\n - " + diagnostics.join("\n - ") : "\n\nCheck that GSAP timelines are registered on window.__timelines.";
|
|
@@ -331418,12 +332543,32 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331418
332543
|
const stage2Start = Date.now();
|
|
331419
332544
|
updateJobStatus(job, "preprocessing", "Extracting video frames", 10, onProgress);
|
|
331420
332545
|
let frameLookup = null;
|
|
331421
|
-
const compiledDir =
|
|
332546
|
+
const compiledDir = join15(workDir, "compiled");
|
|
332547
|
+
let extractionResult = null;
|
|
332548
|
+
const nativeHdrVideoIds = /* @__PURE__ */ new Set();
|
|
332549
|
+
const videoTransfers = /* @__PURE__ */ new Map();
|
|
332550
|
+
if (job.config.hdr && composition.videos.length > 0) {
|
|
332551
|
+
await Promise.all(
|
|
332552
|
+
composition.videos.map(async (v) => {
|
|
332553
|
+
let videoPath = v.src;
|
|
332554
|
+
if (!videoPath.startsWith("/")) {
|
|
332555
|
+
const fromCompiled = existsSync15(join15(compiledDir, videoPath)) ? join15(compiledDir, videoPath) : join15(projectDir, videoPath);
|
|
332556
|
+
videoPath = fromCompiled;
|
|
332557
|
+
}
|
|
332558
|
+
if (!existsSync15(videoPath)) return;
|
|
332559
|
+
const meta = await extractVideoMetadata(videoPath);
|
|
332560
|
+
if (isHdrColorSpace(meta.colorSpace)) {
|
|
332561
|
+
nativeHdrVideoIds.add(v.id);
|
|
332562
|
+
videoTransfers.set(v.id, detectTransfer(meta.colorSpace));
|
|
332563
|
+
}
|
|
332564
|
+
})
|
|
332565
|
+
);
|
|
332566
|
+
}
|
|
331422
332567
|
if (composition.videos.length > 0) {
|
|
331423
|
-
|
|
332568
|
+
extractionResult = await extractAllVideoFrames(
|
|
331424
332569
|
composition.videos,
|
|
331425
332570
|
projectDir,
|
|
331426
|
-
{ fps: job.config.fps, outputDir:
|
|
332571
|
+
{ fps: job.config.fps, outputDir: join15(workDir, "video-frames") },
|
|
331427
332572
|
abortSignal,
|
|
331428
332573
|
void 0,
|
|
331429
332574
|
compiledDir
|
|
@@ -331455,15 +332600,38 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331455
332600
|
} else {
|
|
331456
332601
|
perfStages.videoExtractMs = Date.now() - stage2Start;
|
|
331457
332602
|
}
|
|
332603
|
+
let effectiveHdr;
|
|
332604
|
+
if (job.config.hdr && frameLookup) {
|
|
332605
|
+
const colorSpaces = (extractionResult?.extracted ?? []).map((ext) => ext.metadata.colorSpace);
|
|
332606
|
+
const info = analyzeCompositionHdr(colorSpaces);
|
|
332607
|
+
if (info.hasHdr && info.dominantTransfer) {
|
|
332608
|
+
effectiveHdr = { transfer: info.dominantTransfer };
|
|
332609
|
+
}
|
|
332610
|
+
}
|
|
332611
|
+
if (job.config.hdr && !effectiveHdr && nativeHdrVideoIds.size > 0) {
|
|
332612
|
+
const firstTransfer = videoTransfers.values().next().value;
|
|
332613
|
+
if (firstTransfer) {
|
|
332614
|
+
effectiveHdr = { transfer: firstTransfer };
|
|
332615
|
+
}
|
|
332616
|
+
}
|
|
332617
|
+
if (effectiveHdr && outputFormat !== "mp4") {
|
|
332618
|
+
log2.info(`[Render] HDR source detected but format is ${outputFormat} \u2014 using SDR`);
|
|
332619
|
+
effectiveHdr = void 0;
|
|
332620
|
+
}
|
|
332621
|
+
if (effectiveHdr) {
|
|
332622
|
+
log2.info(
|
|
332623
|
+
`[Render] HDR source detected \u2014 output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
|
|
332624
|
+
);
|
|
332625
|
+
}
|
|
331458
332626
|
const stage3Start = Date.now();
|
|
331459
332627
|
updateJobStatus(job, "preprocessing", "Processing audio tracks", 20, onProgress);
|
|
331460
|
-
const audioOutputPath =
|
|
332628
|
+
const audioOutputPath = join15(workDir, "audio.aac");
|
|
331461
332629
|
let hasAudio = false;
|
|
331462
332630
|
if (composition.audios.length > 0) {
|
|
331463
332631
|
const audioResult = await processCompositionAudio(
|
|
331464
332632
|
composition.audios,
|
|
331465
332633
|
projectDir,
|
|
331466
|
-
|
|
332634
|
+
join15(workDir, "audio-work"),
|
|
331467
332635
|
audioOutputPath,
|
|
331468
332636
|
job.duration,
|
|
331469
332637
|
abortSignal,
|
|
@@ -331481,12 +332649,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331481
332649
|
if (!fileServer) {
|
|
331482
332650
|
fileServer = await createFileServer2({
|
|
331483
332651
|
projectDir,
|
|
331484
|
-
compiledDir:
|
|
331485
|
-
port: 0
|
|
332652
|
+
compiledDir: join15(workDir, "compiled"),
|
|
332653
|
+
port: 0,
|
|
332654
|
+
preHeadScripts: [VIRTUAL_TIME_SHIM]
|
|
331486
332655
|
});
|
|
331487
332656
|
assertNotAborted();
|
|
331488
332657
|
}
|
|
331489
|
-
const framesDir =
|
|
332658
|
+
const framesDir = join15(workDir, "captured-frames");
|
|
331490
332659
|
if (!existsSync15(framesDir)) mkdirSync10(framesDir, { recursive: true });
|
|
331491
332660
|
const captureOptions = {
|
|
331492
332661
|
width,
|
|
@@ -331495,222 +332664,655 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331495
332664
|
format: needsAlpha ? "png" : "jpeg",
|
|
331496
332665
|
quality: needsAlpha ? void 0 : job.config.quality === "draft" ? 80 : 95
|
|
331497
332666
|
};
|
|
331498
|
-
const workerCount = calculateOptimalWorkers(
|
|
332667
|
+
const workerCount = calculateOptimalWorkers(totalFrames, job.config.workers, cfg);
|
|
331499
332668
|
const FORMAT_EXT = { mp4: ".mp4", webm: ".webm", mov: ".mov" };
|
|
331500
332669
|
const videoExt = FORMAT_EXT[outputFormat] ?? ".mp4";
|
|
331501
|
-
const videoOnlyPath =
|
|
331502
|
-
const
|
|
331503
|
-
const
|
|
331504
|
-
const
|
|
331505
|
-
const baseEncoderOpts = {
|
|
331506
|
-
fps: job.config.fps,
|
|
331507
|
-
width,
|
|
331508
|
-
height,
|
|
331509
|
-
codec: preset.codec,
|
|
331510
|
-
preset: preset.preset,
|
|
331511
|
-
quality: effectiveQuality,
|
|
331512
|
-
bitrate: effectiveBitrate,
|
|
331513
|
-
pixelFormat: preset.pixelFormat,
|
|
331514
|
-
useGpu: job.config.useGpu
|
|
331515
|
-
};
|
|
332670
|
+
const videoOnlyPath = join15(workDir, `video-only${videoExt}`);
|
|
332671
|
+
const hasHdrContent = effectiveHdr && nativeHdrVideoIds.size > 0;
|
|
332672
|
+
const encoderHdr = hasHdrContent ? effectiveHdr : void 0;
|
|
332673
|
+
const preset = getEncoderPreset(job.config.quality, outputFormat, encoderHdr);
|
|
331516
332674
|
job.framesRendered = 0;
|
|
331517
|
-
|
|
331518
|
-
|
|
331519
|
-
|
|
332675
|
+
if (hasHdrContent) {
|
|
332676
|
+
log2.info("[Render] HDR layered composite: z-ordered DOM + native HLG video layers");
|
|
332677
|
+
const hdrVideoIds = composition.videos.filter((v) => nativeHdrVideoIds.has(v.id)).map((v) => v.id);
|
|
332678
|
+
const hdrVideoSrcPaths = /* @__PURE__ */ new Map();
|
|
332679
|
+
for (const v of composition.videos) {
|
|
332680
|
+
if (!hdrVideoIds.includes(v.id)) continue;
|
|
332681
|
+
let srcPath = v.src;
|
|
332682
|
+
if (!srcPath.startsWith("/")) {
|
|
332683
|
+
const fromCompiled = join15(compiledDir, srcPath);
|
|
332684
|
+
srcPath = existsSync15(fromCompiled) ? fromCompiled : join15(projectDir, srcPath);
|
|
332685
|
+
}
|
|
332686
|
+
hdrVideoSrcPaths.set(v.id, srcPath);
|
|
332687
|
+
}
|
|
332688
|
+
if (!fileServer) throw new Error("fileServer must be initialized before HDR compositing");
|
|
332689
|
+
const domSession = await createCaptureSession(
|
|
332690
|
+
fileServer.url,
|
|
332691
|
+
framesDir,
|
|
332692
|
+
captureOptions,
|
|
332693
|
+
createVideoFrameInjector(frameLookup),
|
|
332694
|
+
cfg
|
|
332695
|
+
);
|
|
332696
|
+
await initializeSession(domSession);
|
|
332697
|
+
assertNotAborted();
|
|
332698
|
+
lastBrowserConsole = domSession.browserConsoleBuffer;
|
|
332699
|
+
await initTransparentBackground(domSession.page);
|
|
332700
|
+
const transitionMeta = await domSession.page.evaluate(() => {
|
|
332701
|
+
return window.__hf?.transitions ?? [];
|
|
332702
|
+
});
|
|
332703
|
+
const sceneElements = await domSession.page.evaluate(() => {
|
|
332704
|
+
const scenes = document.querySelectorAll(".scene");
|
|
332705
|
+
const map22 = {};
|
|
332706
|
+
for (const scene of scenes) {
|
|
332707
|
+
const els = scene.querySelectorAll("[data-start]");
|
|
332708
|
+
map22[scene.id] = Array.from(els).map((e) => e.id);
|
|
332709
|
+
}
|
|
332710
|
+
return map22;
|
|
332711
|
+
});
|
|
332712
|
+
const transitionRanges = transitionMeta.map((t) => ({
|
|
332713
|
+
...t,
|
|
332714
|
+
startFrame: Math.floor(t.time * job.config.fps),
|
|
332715
|
+
endFrame: Math.ceil((t.time + t.duration) * job.config.fps)
|
|
332716
|
+
}));
|
|
332717
|
+
if (transitionRanges.length > 0) {
|
|
332718
|
+
log2.info("[Render] Detected shader transitions for HDR compositing", {
|
|
332719
|
+
count: transitionRanges.length,
|
|
332720
|
+
transitions: transitionRanges.map((t) => ({
|
|
332721
|
+
shader: t.shader,
|
|
332722
|
+
from: t.fromScene,
|
|
332723
|
+
to: t.toScene,
|
|
332724
|
+
frames: `${t.startFrame}-${t.endFrame}`
|
|
332725
|
+
}))
|
|
332726
|
+
});
|
|
332727
|
+
}
|
|
332728
|
+
const hdrEncoder = await spawnStreamingEncoder(
|
|
331520
332729
|
videoOnlyPath,
|
|
331521
332730
|
{
|
|
331522
|
-
|
|
331523
|
-
|
|
332731
|
+
fps: job.config.fps,
|
|
332732
|
+
width,
|
|
332733
|
+
height,
|
|
332734
|
+
codec: preset.codec,
|
|
332735
|
+
preset: preset.preset,
|
|
332736
|
+
quality: preset.quality,
|
|
332737
|
+
pixelFormat: preset.pixelFormat,
|
|
332738
|
+
hdr: preset.hdr,
|
|
332739
|
+
rawInputFormat: "rgb48le"
|
|
331524
332740
|
},
|
|
331525
|
-
abortSignal
|
|
332741
|
+
abortSignal,
|
|
332742
|
+
{ ffmpegStreamingTimeout: 36e5 }
|
|
331526
332743
|
);
|
|
331527
332744
|
assertNotAborted();
|
|
331528
|
-
|
|
331529
|
-
|
|
331530
|
-
const
|
|
331531
|
-
|
|
331532
|
-
|
|
331533
|
-
const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
|
|
331534
|
-
const onFrameBuffer = async (frameIndex, buffer) => {
|
|
331535
|
-
await reorderBuffer.waitForFrame(frameIndex);
|
|
331536
|
-
currentEncoder.writeFrame(buffer);
|
|
331537
|
-
reorderBuffer.advanceTo(frameIndex + 1);
|
|
331538
|
-
};
|
|
331539
|
-
await executeParallelCapture(
|
|
331540
|
-
fileServer.url,
|
|
331541
|
-
workDir,
|
|
331542
|
-
tasks,
|
|
331543
|
-
captureOptions,
|
|
331544
|
-
() => createVideoFrameInjector(frameLookup),
|
|
331545
|
-
abortSignal,
|
|
331546
|
-
(progress) => {
|
|
331547
|
-
job.framesRendered = progress.capturedFrames;
|
|
331548
|
-
const frameProgress = progress.capturedFrames / progress.totalFrames;
|
|
331549
|
-
const progressPct = 25 + frameProgress * 55;
|
|
331550
|
-
if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
|
|
331551
|
-
updateJobStatus(
|
|
331552
|
-
job,
|
|
331553
|
-
"rendering",
|
|
331554
|
-
`Streaming frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
|
|
331555
|
-
Math.round(progressPct),
|
|
331556
|
-
onProgress
|
|
331557
|
-
);
|
|
331558
|
-
}
|
|
331559
|
-
},
|
|
331560
|
-
onFrameBuffer,
|
|
331561
|
-
cfg
|
|
331562
|
-
);
|
|
331563
|
-
if (probeSession) {
|
|
331564
|
-
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
331565
|
-
await closeCaptureSession(probeSession);
|
|
331566
|
-
probeSession = null;
|
|
332745
|
+
const hdrExtractionDims = /* @__PURE__ */ new Map();
|
|
332746
|
+
const hdrVideoStartTimes = /* @__PURE__ */ new Map();
|
|
332747
|
+
for (const v of composition.videos) {
|
|
332748
|
+
if (hdrVideoIds.includes(v.id)) {
|
|
332749
|
+
hdrVideoStartTimes.set(v.id, v.start);
|
|
331567
332750
|
}
|
|
331568
|
-
}
|
|
331569
|
-
|
|
331570
|
-
|
|
331571
|
-
|
|
331572
|
-
|
|
331573
|
-
|
|
331574
|
-
|
|
331575
|
-
|
|
331576
|
-
);
|
|
331577
|
-
if (probeSession) {
|
|
331578
|
-
prepareCaptureSessionForReuse(session, framesDir, videoInjector);
|
|
331579
|
-
probeSession = null;
|
|
332751
|
+
}
|
|
332752
|
+
const uniqueStartTimes = [...new Set(hdrVideoStartTimes.values())].sort((a, b) => a - b);
|
|
332753
|
+
for (const seekTime of uniqueStartTimes) {
|
|
332754
|
+
await domSession.page.evaluate((t) => {
|
|
332755
|
+
if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
|
|
332756
|
+
}, seekTime);
|
|
332757
|
+
if (domSession.onBeforeCapture) {
|
|
332758
|
+
await domSession.onBeforeCapture(domSession.page, seekTime);
|
|
331580
332759
|
}
|
|
331581
|
-
|
|
331582
|
-
|
|
331583
|
-
|
|
332760
|
+
const stacking = await queryElementStacking(domSession.page, nativeHdrVideoIds);
|
|
332761
|
+
for (const el of stacking) {
|
|
332762
|
+
if (el.isHdr && el.layoutWidth > 0 && el.layoutHeight > 0 && !hdrExtractionDims.has(el.id)) {
|
|
332763
|
+
hdrExtractionDims.set(el.id, { width: el.layoutWidth, height: el.layoutHeight });
|
|
331584
332764
|
}
|
|
332765
|
+
}
|
|
332766
|
+
}
|
|
332767
|
+
const hdrFrameDirs = /* @__PURE__ */ new Map();
|
|
332768
|
+
for (const [videoId, srcPath] of hdrVideoSrcPaths) {
|
|
332769
|
+
const video = composition.videos.find((v) => v.id === videoId);
|
|
332770
|
+
if (!video) continue;
|
|
332771
|
+
const frameDir = join15(framesDir, `hdr_${videoId}`);
|
|
332772
|
+
mkdirSync10(frameDir, { recursive: true });
|
|
332773
|
+
const duration = video.end - video.start;
|
|
332774
|
+
const dims = hdrExtractionDims.get(videoId) ?? { width, height };
|
|
332775
|
+
const ffmpegArgs = [
|
|
332776
|
+
"-ss",
|
|
332777
|
+
String(video.mediaStart),
|
|
332778
|
+
"-i",
|
|
332779
|
+
srcPath,
|
|
332780
|
+
"-t",
|
|
332781
|
+
String(duration),
|
|
332782
|
+
"-r",
|
|
332783
|
+
String(job.config.fps),
|
|
332784
|
+
"-vf",
|
|
332785
|
+
`scale=${dims.width}:${dims.height}:force_original_aspect_ratio=increase,crop=${dims.width}:${dims.height}`,
|
|
332786
|
+
"-pix_fmt",
|
|
332787
|
+
"rgb48le",
|
|
332788
|
+
"-c:v",
|
|
332789
|
+
"png",
|
|
332790
|
+
"-y",
|
|
332791
|
+
join15(frameDir, "frame_%04d.png")
|
|
332792
|
+
];
|
|
332793
|
+
const result = await runFfmpeg(ffmpegArgs, { signal: abortSignal });
|
|
332794
|
+
if (!result.success) {
|
|
332795
|
+
log2.warn("HDR frame pre-extraction failed; loop will fill with black", {
|
|
332796
|
+
videoId,
|
|
332797
|
+
srcPath,
|
|
332798
|
+
stderr: result.stderr.slice(-400)
|
|
332799
|
+
});
|
|
332800
|
+
}
|
|
332801
|
+
hdrFrameDirs.set(videoId, frameDir);
|
|
332802
|
+
}
|
|
332803
|
+
assertNotAborted();
|
|
332804
|
+
try {
|
|
332805
|
+
let countNonZeroAlpha2 = function(rgba) {
|
|
332806
|
+
let n = 0;
|
|
332807
|
+
for (let p = 3; p < rgba.length; p += 4) {
|
|
332808
|
+
if (rgba[p] !== 0) n++;
|
|
332809
|
+
}
|
|
332810
|
+
return n;
|
|
332811
|
+
}, countNonZeroRgb482 = function(buf) {
|
|
332812
|
+
let n = 0;
|
|
332813
|
+
for (let p = 0; p < buf.length; p += 6) {
|
|
332814
|
+
if (buf[p] !== 0 || buf[p + 1] !== 0 || buf[p + 2] !== 0) n++;
|
|
332815
|
+
}
|
|
332816
|
+
return n;
|
|
332817
|
+
};
|
|
332818
|
+
var countNonZeroAlpha = countNonZeroAlpha2, countNonZeroRgb48 = countNonZeroRgb482;
|
|
332819
|
+
const beforeCaptureHook = domSession.onBeforeCapture;
|
|
332820
|
+
const cleanedUpVideos = /* @__PURE__ */ new Set();
|
|
332821
|
+
const hdrVideoEndTimes = /* @__PURE__ */ new Map();
|
|
332822
|
+
for (const v of composition.videos) {
|
|
332823
|
+
if (hdrFrameDirs.has(v.id)) {
|
|
332824
|
+
hdrVideoEndTimes.set(v.id, v.end);
|
|
332825
|
+
}
|
|
332826
|
+
}
|
|
332827
|
+
const debugDumpEnabled = process.env.KEEP_TEMP === "1";
|
|
332828
|
+
const debugDumpDir = debugDumpEnabled ? join15(framesDir, "debug-composite") : null;
|
|
332829
|
+
if (debugDumpDir && !existsSync15(debugDumpDir)) {
|
|
332830
|
+
mkdirSync10(debugDumpDir, { recursive: true });
|
|
332831
|
+
}
|
|
332832
|
+
async function compositeToBuffer(canvas, time, fullStacking, elementFilter, debugFrameIndex = -1) {
|
|
332833
|
+
const filteredStacking = elementFilter ? fullStacking.filter((e) => elementFilter.has(e.id)) : fullStacking;
|
|
332834
|
+
const layers = groupIntoLayers(filteredStacking);
|
|
332835
|
+
const shouldLog = debugDumpEnabled && debugFrameIndex >= 0;
|
|
332836
|
+
if (shouldLog) {
|
|
332837
|
+
log2.info("[diag] compositeToBuffer plan", {
|
|
332838
|
+
frame: debugFrameIndex,
|
|
332839
|
+
time: time.toFixed(3),
|
|
332840
|
+
filterSize: elementFilter?.size,
|
|
332841
|
+
fullStackingCount: fullStacking.length,
|
|
332842
|
+
filteredCount: filteredStacking.length,
|
|
332843
|
+
layerCount: layers.length,
|
|
332844
|
+
layers: layers.map(
|
|
332845
|
+
(l) => l.type === "hdr" ? {
|
|
332846
|
+
type: "hdr",
|
|
332847
|
+
id: l.element.id,
|
|
332848
|
+
z: l.element.zIndex,
|
|
332849
|
+
visible: l.element.visible,
|
|
332850
|
+
opacity: l.element.opacity,
|
|
332851
|
+
bounds: `${Math.round(l.element.x)},${Math.round(l.element.y)} ${Math.round(l.element.width)}x${Math.round(l.element.height)}`
|
|
332852
|
+
} : { type: "dom", ids: l.elementIds }
|
|
332853
|
+
)
|
|
332854
|
+
});
|
|
332855
|
+
}
|
|
332856
|
+
for (let layerIdx = 0; layerIdx < layers.length; layerIdx++) {
|
|
332857
|
+
const layer = layers[layerIdx];
|
|
332858
|
+
if (layer.type === "hdr") {
|
|
332859
|
+
const before2 = shouldLog ? countNonZeroRgb482(canvas) : 0;
|
|
332860
|
+
blitHdrVideoLayer(
|
|
332861
|
+
canvas,
|
|
332862
|
+
layer.element,
|
|
332863
|
+
time,
|
|
332864
|
+
job.config.fps,
|
|
332865
|
+
hdrFrameDirs,
|
|
332866
|
+
hdrVideoStartTimes,
|
|
332867
|
+
width,
|
|
332868
|
+
height,
|
|
332869
|
+
log2,
|
|
332870
|
+
videoTransfers.get(layer.element.id),
|
|
332871
|
+
effectiveHdr?.transfer
|
|
332872
|
+
);
|
|
332873
|
+
if (shouldLog) {
|
|
332874
|
+
const after2 = countNonZeroRgb482(canvas);
|
|
332875
|
+
const frameDir = hdrFrameDirs.get(layer.element.id);
|
|
332876
|
+
const startTime = hdrVideoStartTimes.get(layer.element.id) ?? 0;
|
|
332877
|
+
const localTime = time - startTime;
|
|
332878
|
+
const frameNum = Math.floor(localTime * job.config.fps) + 1;
|
|
332879
|
+
const expectedFrame = frameDir ? join15(frameDir, `frame_${String(frameNum).padStart(4, "0")}.png`) : null;
|
|
332880
|
+
log2.info("[diag] hdr layer blit", {
|
|
332881
|
+
frame: debugFrameIndex,
|
|
332882
|
+
layerIdx,
|
|
332883
|
+
id: layer.element.id,
|
|
332884
|
+
pixelsAdded: after2 - before2,
|
|
332885
|
+
totalNonZero: after2,
|
|
332886
|
+
startTime,
|
|
332887
|
+
localTime: localTime.toFixed(3),
|
|
332888
|
+
hdrFrameNum: frameNum,
|
|
332889
|
+
expectedFrame,
|
|
332890
|
+
expectedFrameExists: expectedFrame ? existsSync15(expectedFrame) : false
|
|
332891
|
+
});
|
|
332892
|
+
}
|
|
332893
|
+
} else {
|
|
332894
|
+
const allElementIds = fullStacking.map((e) => e.id);
|
|
332895
|
+
const layerIds = new Set(layer.elementIds);
|
|
332896
|
+
const hideIds = allElementIds.filter((id) => !layerIds.has(id));
|
|
332897
|
+
await domSession.page.evaluate((t) => {
|
|
332898
|
+
if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
|
|
332899
|
+
}, time);
|
|
332900
|
+
if (beforeCaptureHook) {
|
|
332901
|
+
await beforeCaptureHook(domSession.page, time);
|
|
332902
|
+
}
|
|
332903
|
+
await applyDomLayerMask(domSession.page, layer.elementIds, hideIds);
|
|
332904
|
+
const domPng = await captureAlphaPng(domSession.page, width, height);
|
|
332905
|
+
await removeDomLayerMask(domSession.page, hideIds);
|
|
332906
|
+
try {
|
|
332907
|
+
const { data: domRgba } = decodePng(domPng);
|
|
332908
|
+
if (!effectiveHdr) {
|
|
332909
|
+
throw new Error(
|
|
332910
|
+
"Invariant violation: effectiveHdr is undefined inside HDR layer branch"
|
|
332911
|
+
);
|
|
332912
|
+
}
|
|
332913
|
+
const before2 = shouldLog ? countNonZeroRgb482(canvas) : 0;
|
|
332914
|
+
const alphaPixels = shouldLog ? countNonZeroAlpha2(domRgba) : 0;
|
|
332915
|
+
blitRgba8OverRgb48le(domRgba, canvas, width, height, effectiveHdr.transfer);
|
|
332916
|
+
if (shouldLog && debugDumpDir) {
|
|
332917
|
+
const after2 = countNonZeroRgb482(canvas);
|
|
332918
|
+
const dumpName = `frame_${String(debugFrameIndex).padStart(4, "0")}_layer_${String(layerIdx).padStart(2, "0")}_dom.png`;
|
|
332919
|
+
const dumpPath = join15(debugDumpDir, dumpName);
|
|
332920
|
+
writeFileSync4(dumpPath, domPng);
|
|
332921
|
+
log2.info("[diag] dom layer blit", {
|
|
332922
|
+
frame: debugFrameIndex,
|
|
332923
|
+
layerIdx,
|
|
332924
|
+
layerIds: layer.elementIds,
|
|
332925
|
+
hideCount: hideIds.length,
|
|
332926
|
+
pngBytes: domPng.length,
|
|
332927
|
+
alphaPixels,
|
|
332928
|
+
pixelsAdded: after2 - before2,
|
|
332929
|
+
totalNonZero: after2,
|
|
332930
|
+
dumpPath
|
|
332931
|
+
});
|
|
332932
|
+
}
|
|
332933
|
+
} catch (err) {
|
|
332934
|
+
log2.warn("DOM layer decode/blit failed; skipping overlay", {
|
|
332935
|
+
layerIds: layer.elementIds,
|
|
332936
|
+
error: err instanceof Error ? err.message : String(err)
|
|
332937
|
+
});
|
|
332938
|
+
}
|
|
332939
|
+
}
|
|
332940
|
+
}
|
|
332941
|
+
if (shouldLog && debugDumpDir) {
|
|
332942
|
+
const finalNonZero = countNonZeroRgb482(canvas);
|
|
332943
|
+
log2.info("[diag] compositeToBuffer end", {
|
|
332944
|
+
frame: debugFrameIndex,
|
|
332945
|
+
finalNonZeroPixels: finalNonZero,
|
|
332946
|
+
totalPixels: width * height,
|
|
332947
|
+
coverage: (finalNonZero / (width * height) * 100).toFixed(1) + "%"
|
|
332948
|
+
});
|
|
332949
|
+
}
|
|
332950
|
+
}
|
|
332951
|
+
const bufSize = width * height * 6;
|
|
332952
|
+
const hasTransitions = transitionRanges.length > 0;
|
|
332953
|
+
const transBufferA = hasTransitions ? Buffer.alloc(bufSize) : null;
|
|
332954
|
+
const transBufferB = hasTransitions ? Buffer.alloc(bufSize) : null;
|
|
332955
|
+
const transOutput = hasTransitions ? Buffer.alloc(bufSize) : null;
|
|
332956
|
+
const normalCanvas = Buffer.alloc(bufSize);
|
|
332957
|
+
for (let i = 0; i < totalFrames; i++) {
|
|
331585
332958
|
assertNotAborted();
|
|
331586
|
-
|
|
331587
|
-
|
|
331588
|
-
|
|
331589
|
-
|
|
331590
|
-
|
|
331591
|
-
await
|
|
331592
|
-
|
|
331593
|
-
|
|
331594
|
-
|
|
331595
|
-
|
|
331596
|
-
|
|
332959
|
+
const time = i / job.config.fps;
|
|
332960
|
+
await domSession.page.evaluate((t) => {
|
|
332961
|
+
if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
|
|
332962
|
+
}, time);
|
|
332963
|
+
if (beforeCaptureHook) {
|
|
332964
|
+
await beforeCaptureHook(domSession.page, time);
|
|
332965
|
+
}
|
|
332966
|
+
const stackingInfo = await queryElementStacking(domSession.page, nativeHdrVideoIds);
|
|
332967
|
+
const activeTransition = transitionRanges.find(
|
|
332968
|
+
(t) => i >= t.startFrame && i <= t.endFrame
|
|
332969
|
+
);
|
|
332970
|
+
if (i % 30 === 0) {
|
|
332971
|
+
const hdrEl = stackingInfo.find((e) => e.isHdr);
|
|
332972
|
+
log2.debug("[Render] HDR layer composite frame", {
|
|
332973
|
+
frame: i,
|
|
332974
|
+
time: time.toFixed(2),
|
|
332975
|
+
hdrElement: hdrEl ? { z: hdrEl.zIndex, visible: hdrEl.visible, width: hdrEl.width } : null,
|
|
332976
|
+
stackingCount: stackingInfo.length,
|
|
332977
|
+
activeTransition: activeTransition?.shader
|
|
332978
|
+
});
|
|
332979
|
+
}
|
|
332980
|
+
if (activeTransition && transBufferA && transBufferB && transOutput) {
|
|
332981
|
+
const progress = activeTransition.endFrame === activeTransition.startFrame ? 1 : (i - activeTransition.startFrame) / (activeTransition.endFrame - activeTransition.startFrame);
|
|
332982
|
+
const sceneAIds = new Set(sceneElements[activeTransition.fromScene] ?? []);
|
|
332983
|
+
const sceneBIds = new Set(sceneElements[activeTransition.toScene] ?? []);
|
|
332984
|
+
transBufferA.fill(0);
|
|
332985
|
+
transBufferB.fill(0);
|
|
332986
|
+
for (const [sceneBuf, sceneIds] of [
|
|
332987
|
+
[transBufferA, sceneAIds],
|
|
332988
|
+
[transBufferB, sceneBIds]
|
|
332989
|
+
]) {
|
|
332990
|
+
await domSession.page.evaluate((t) => {
|
|
332991
|
+
if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
|
|
332992
|
+
}, time);
|
|
332993
|
+
if (beforeCaptureHook) {
|
|
332994
|
+
await beforeCaptureHook(domSession.page, time);
|
|
332995
|
+
}
|
|
332996
|
+
for (const el of stackingInfo) {
|
|
332997
|
+
if (!el.isHdr || !sceneIds.has(el.id)) continue;
|
|
332998
|
+
blitHdrVideoLayer(
|
|
332999
|
+
sceneBuf,
|
|
333000
|
+
el,
|
|
333001
|
+
time,
|
|
333002
|
+
job.config.fps,
|
|
333003
|
+
hdrFrameDirs,
|
|
333004
|
+
hdrVideoStartTimes,
|
|
333005
|
+
width,
|
|
333006
|
+
height,
|
|
333007
|
+
log2,
|
|
333008
|
+
videoTransfers.get(el.id),
|
|
333009
|
+
effectiveHdr?.transfer
|
|
333010
|
+
);
|
|
333011
|
+
}
|
|
333012
|
+
const showIds = Array.from(sceneIds);
|
|
333013
|
+
const hideIds = stackingInfo.map((e) => e.id).filter((id) => !sceneIds.has(id) || nativeHdrVideoIds.has(id));
|
|
333014
|
+
await applyDomLayerMask(domSession.page, showIds, hideIds);
|
|
333015
|
+
const domPng = await captureAlphaPng(domSession.page, width, height);
|
|
333016
|
+
await removeDomLayerMask(domSession.page, hideIds);
|
|
333017
|
+
try {
|
|
333018
|
+
const { data: domRgba } = decodePng(domPng);
|
|
333019
|
+
if (!effectiveHdr) {
|
|
333020
|
+
throw new Error(
|
|
333021
|
+
"Invariant violation: effectiveHdr is undefined inside hasHdrVideo branch"
|
|
333022
|
+
);
|
|
333023
|
+
}
|
|
333024
|
+
blitRgba8OverRgb48le(
|
|
333025
|
+
domRgba,
|
|
333026
|
+
sceneBuf,
|
|
333027
|
+
width,
|
|
333028
|
+
height,
|
|
333029
|
+
effectiveHdr.transfer
|
|
333030
|
+
);
|
|
333031
|
+
} catch (err) {
|
|
333032
|
+
log2.warn("DOM layer decode/blit failed; skipping overlay for transition scene", {
|
|
333033
|
+
frameIndex: i,
|
|
333034
|
+
sceneIds: Array.from(sceneIds),
|
|
333035
|
+
error: err instanceof Error ? err.message : String(err)
|
|
333036
|
+
});
|
|
333037
|
+
}
|
|
333038
|
+
}
|
|
333039
|
+
const transitionFn = TRANSITIONS[activeTransition.shader] ?? crossfade;
|
|
333040
|
+
transitionFn(transBufferA, transBufferB, transOutput, width, height, progress);
|
|
333041
|
+
hdrEncoder.writeFrame(transOutput);
|
|
333042
|
+
} else {
|
|
333043
|
+
normalCanvas.fill(0);
|
|
333044
|
+
await compositeToBuffer(normalCanvas, time, stackingInfo, void 0, i);
|
|
333045
|
+
if (debugDumpEnabled && debugDumpDir && i % 30 === 0) {
|
|
333046
|
+
const previewPath = join15(
|
|
333047
|
+
debugDumpDir,
|
|
333048
|
+
`frame_${String(i).padStart(4, "0")}_final_rgb48le.bin`
|
|
333049
|
+
);
|
|
333050
|
+
writeFileSync4(previewPath, normalCanvas);
|
|
333051
|
+
}
|
|
333052
|
+
hdrEncoder.writeFrame(normalCanvas);
|
|
333053
|
+
}
|
|
333054
|
+
if (process.env.KEEP_TEMP !== "1") {
|
|
333055
|
+
for (const [videoId, endTime] of hdrVideoEndTimes) {
|
|
333056
|
+
if (time > endTime && !cleanedUpVideos.has(videoId)) {
|
|
333057
|
+
const stillNeeded = activeTransition && (sceneElements[activeTransition.fromScene]?.includes(videoId) || sceneElements[activeTransition.toScene]?.includes(videoId));
|
|
333058
|
+
if (!stillNeeded) {
|
|
333059
|
+
const frameDir = hdrFrameDirs.get(videoId);
|
|
333060
|
+
if (frameDir) {
|
|
333061
|
+
try {
|
|
333062
|
+
rmSync3(frameDir, { recursive: true, force: true });
|
|
333063
|
+
} catch (err) {
|
|
333064
|
+
log2.warn("Failed to clean up HDR frame directory", {
|
|
333065
|
+
videoId,
|
|
333066
|
+
frameDir,
|
|
333067
|
+
error: err instanceof Error ? err.message : String(err)
|
|
333068
|
+
});
|
|
333069
|
+
}
|
|
333070
|
+
}
|
|
333071
|
+
cleanedUpVideos.add(videoId);
|
|
333072
|
+
}
|
|
333073
|
+
}
|
|
333074
|
+
}
|
|
333075
|
+
}
|
|
333076
|
+
job.framesRendered = i + 1;
|
|
333077
|
+
if ((i + 1) % 10 === 0 || i + 1 === totalFrames) {
|
|
333078
|
+
const frameProgress = (i + 1) / totalFrames;
|
|
331597
333079
|
updateJobStatus(
|
|
331598
333080
|
job,
|
|
331599
333081
|
"rendering",
|
|
331600
|
-
`
|
|
331601
|
-
Math.round(
|
|
333082
|
+
`HDR composite frame ${i + 1}/${job.totalFrames}`,
|
|
333083
|
+
Math.round(25 + frameProgress * 55),
|
|
331602
333084
|
onProgress
|
|
331603
333085
|
);
|
|
331604
333086
|
}
|
|
331605
|
-
} finally {
|
|
331606
|
-
lastBrowserConsole = session.browserConsoleBuffer;
|
|
331607
|
-
await closeCaptureSession(session);
|
|
331608
333087
|
}
|
|
333088
|
+
} finally {
|
|
333089
|
+
lastBrowserConsole = domSession.browserConsoleBuffer;
|
|
333090
|
+
await closeCaptureSession(domSession);
|
|
331609
333091
|
}
|
|
331610
|
-
const
|
|
333092
|
+
const hdrEncodeResult = await hdrEncoder.close();
|
|
331611
333093
|
assertNotAborted();
|
|
331612
|
-
if (!
|
|
331613
|
-
throw new Error(`
|
|
333094
|
+
if (!hdrEncodeResult.success) {
|
|
333095
|
+
throw new Error(`HDR encode failed: ${hdrEncodeResult.error}`);
|
|
331614
333096
|
}
|
|
331615
333097
|
perfStages.captureMs = Date.now() - stage4Start;
|
|
331616
|
-
perfStages.encodeMs =
|
|
333098
|
+
perfStages.encodeMs = hdrEncodeResult.durationMs;
|
|
331617
333099
|
} else {
|
|
331618
|
-
|
|
331619
|
-
|
|
331620
|
-
await
|
|
331621
|
-
|
|
331622
|
-
|
|
331623
|
-
|
|
331624
|
-
|
|
331625
|
-
|
|
331626
|
-
|
|
331627
|
-
|
|
331628
|
-
|
|
331629
|
-
|
|
331630
|
-
|
|
331631
|
-
|
|
333100
|
+
let streamingEncoder = null;
|
|
333101
|
+
if (enableStreamingEncode) {
|
|
333102
|
+
streamingEncoder = await spawnStreamingEncoder(
|
|
333103
|
+
videoOnlyPath,
|
|
333104
|
+
{
|
|
333105
|
+
fps: job.config.fps,
|
|
333106
|
+
width,
|
|
333107
|
+
height,
|
|
333108
|
+
codec: preset.codec,
|
|
333109
|
+
preset: preset.preset,
|
|
333110
|
+
quality: preset.quality,
|
|
333111
|
+
pixelFormat: preset.pixelFormat,
|
|
333112
|
+
useGpu: job.config.useGpu,
|
|
333113
|
+
imageFormat: captureOptions.format || "jpeg",
|
|
333114
|
+
hdr: preset.hdr
|
|
333115
|
+
},
|
|
333116
|
+
abortSignal
|
|
333117
|
+
);
|
|
333118
|
+
assertNotAborted();
|
|
333119
|
+
}
|
|
333120
|
+
if (enableStreamingEncode && streamingEncoder) {
|
|
333121
|
+
const reorderBuffer = createFrameReorderBuffer(0, totalFrames);
|
|
333122
|
+
const currentEncoder = streamingEncoder;
|
|
333123
|
+
if (workerCount > 1) {
|
|
333124
|
+
const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
|
|
333125
|
+
const onFrameBuffer = async (frameIndex, buffer) => {
|
|
333126
|
+
await reorderBuffer.waitForFrame(frameIndex);
|
|
333127
|
+
currentEncoder.writeFrame(buffer);
|
|
333128
|
+
reorderBuffer.advanceTo(frameIndex + 1);
|
|
333129
|
+
};
|
|
333130
|
+
await executeParallelCapture(
|
|
333131
|
+
fileServer.url,
|
|
333132
|
+
workDir,
|
|
333133
|
+
tasks,
|
|
333134
|
+
captureOptions,
|
|
333135
|
+
() => createVideoFrameInjector(frameLookup),
|
|
333136
|
+
abortSignal,
|
|
333137
|
+
(progress) => {
|
|
333138
|
+
job.framesRendered = progress.capturedFrames;
|
|
333139
|
+
const frameProgress = progress.capturedFrames / progress.totalFrames;
|
|
333140
|
+
const progressPct = 25 + frameProgress * 55;
|
|
333141
|
+
if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
|
|
333142
|
+
updateJobStatus(
|
|
333143
|
+
job,
|
|
333144
|
+
"rendering",
|
|
333145
|
+
`Streaming frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
|
|
333146
|
+
Math.round(progressPct),
|
|
333147
|
+
onProgress
|
|
333148
|
+
);
|
|
333149
|
+
}
|
|
333150
|
+
},
|
|
333151
|
+
onFrameBuffer,
|
|
333152
|
+
cfg
|
|
333153
|
+
);
|
|
333154
|
+
if (probeSession) {
|
|
333155
|
+
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
333156
|
+
await closeCaptureSession(probeSession);
|
|
333157
|
+
probeSession = null;
|
|
333158
|
+
}
|
|
333159
|
+
} else {
|
|
333160
|
+
const videoInjector = createVideoFrameInjector(frameLookup);
|
|
333161
|
+
const session = probeSession ?? await createCaptureSession(
|
|
333162
|
+
fileServer.url,
|
|
333163
|
+
framesDir,
|
|
333164
|
+
captureOptions,
|
|
333165
|
+
videoInjector,
|
|
333166
|
+
cfg
|
|
333167
|
+
);
|
|
333168
|
+
if (probeSession) {
|
|
333169
|
+
prepareCaptureSessionForReuse(session, framesDir, videoInjector);
|
|
333170
|
+
probeSession = null;
|
|
333171
|
+
}
|
|
333172
|
+
try {
|
|
333173
|
+
if (!session.isInitialized) {
|
|
333174
|
+
await initializeSession(session);
|
|
333175
|
+
}
|
|
333176
|
+
assertNotAborted();
|
|
333177
|
+
lastBrowserConsole = session.browserConsoleBuffer;
|
|
333178
|
+
for (let i = 0; i < totalFrames; i++) {
|
|
333179
|
+
assertNotAborted();
|
|
333180
|
+
const time = i / job.config.fps;
|
|
333181
|
+
const { buffer } = await captureFrameToBuffer(session, i, time);
|
|
333182
|
+
await reorderBuffer.waitForFrame(i);
|
|
333183
|
+
currentEncoder.writeFrame(buffer);
|
|
333184
|
+
reorderBuffer.advanceTo(i + 1);
|
|
333185
|
+
job.framesRendered = i + 1;
|
|
333186
|
+
const frameProgress = (i + 1) / totalFrames;
|
|
333187
|
+
const progress = 25 + frameProgress * 55;
|
|
331632
333188
|
updateJobStatus(
|
|
331633
333189
|
job,
|
|
331634
333190
|
"rendering",
|
|
331635
|
-
`
|
|
331636
|
-
Math.round(
|
|
333191
|
+
`Streaming frame ${i + 1}/${job.totalFrames}`,
|
|
333192
|
+
Math.round(progress),
|
|
331637
333193
|
onProgress
|
|
331638
333194
|
);
|
|
331639
333195
|
}
|
|
331640
|
-
}
|
|
331641
|
-
|
|
331642
|
-
|
|
331643
|
-
|
|
331644
|
-
await mergeWorkerFrames(workDir, tasks, framesDir);
|
|
331645
|
-
if (probeSession) {
|
|
331646
|
-
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
331647
|
-
await closeCaptureSession(probeSession);
|
|
331648
|
-
probeSession = null;
|
|
333196
|
+
} finally {
|
|
333197
|
+
lastBrowserConsole = session.browserConsoleBuffer;
|
|
333198
|
+
await closeCaptureSession(session);
|
|
333199
|
+
}
|
|
331649
333200
|
}
|
|
331650
|
-
|
|
331651
|
-
|
|
331652
|
-
|
|
331653
|
-
|
|
331654
|
-
framesDir,
|
|
331655
|
-
captureOptions,
|
|
331656
|
-
videoInjector,
|
|
331657
|
-
cfg
|
|
331658
|
-
);
|
|
331659
|
-
if (probeSession) {
|
|
331660
|
-
prepareCaptureSessionForReuse(session, framesDir, videoInjector);
|
|
331661
|
-
probeSession = null;
|
|
333201
|
+
const encodeResult = await currentEncoder.close();
|
|
333202
|
+
assertNotAborted();
|
|
333203
|
+
if (!encodeResult.success) {
|
|
333204
|
+
throw new Error(`Streaming encode failed: ${encodeResult.error}`);
|
|
331662
333205
|
}
|
|
331663
|
-
|
|
331664
|
-
|
|
331665
|
-
|
|
333206
|
+
perfStages.captureMs = Date.now() - stage4Start;
|
|
333207
|
+
perfStages.encodeMs = encodeResult.durationMs;
|
|
333208
|
+
} else {
|
|
333209
|
+
if (workerCount > 1) {
|
|
333210
|
+
const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
|
|
333211
|
+
await executeParallelCapture(
|
|
333212
|
+
fileServer.url,
|
|
333213
|
+
workDir,
|
|
333214
|
+
tasks,
|
|
333215
|
+
captureOptions,
|
|
333216
|
+
() => createVideoFrameInjector(frameLookup),
|
|
333217
|
+
abortSignal,
|
|
333218
|
+
(progress) => {
|
|
333219
|
+
job.framesRendered = progress.capturedFrames;
|
|
333220
|
+
const frameProgress = progress.capturedFrames / progress.totalFrames;
|
|
333221
|
+
const progressPct = 25 + frameProgress * 45;
|
|
333222
|
+
if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
|
|
333223
|
+
updateJobStatus(
|
|
333224
|
+
job,
|
|
333225
|
+
"rendering",
|
|
333226
|
+
`Capturing frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
|
|
333227
|
+
Math.round(progressPct),
|
|
333228
|
+
onProgress
|
|
333229
|
+
);
|
|
333230
|
+
}
|
|
333231
|
+
},
|
|
333232
|
+
void 0,
|
|
333233
|
+
cfg
|
|
333234
|
+
);
|
|
333235
|
+
await mergeWorkerFrames(workDir, tasks, framesDir);
|
|
333236
|
+
if (probeSession) {
|
|
333237
|
+
lastBrowserConsole = probeSession.browserConsoleBuffer;
|
|
333238
|
+
await closeCaptureSession(probeSession);
|
|
333239
|
+
probeSession = null;
|
|
331666
333240
|
}
|
|
331667
|
-
|
|
331668
|
-
|
|
331669
|
-
|
|
333241
|
+
} else {
|
|
333242
|
+
const videoInjector = createVideoFrameInjector(frameLookup);
|
|
333243
|
+
const session = probeSession ?? await createCaptureSession(
|
|
333244
|
+
fileServer.url,
|
|
333245
|
+
framesDir,
|
|
333246
|
+
captureOptions,
|
|
333247
|
+
videoInjector,
|
|
333248
|
+
cfg
|
|
333249
|
+
);
|
|
333250
|
+
if (probeSession) {
|
|
333251
|
+
prepareCaptureSessionForReuse(session, framesDir, videoInjector);
|
|
333252
|
+
probeSession = null;
|
|
333253
|
+
}
|
|
333254
|
+
try {
|
|
333255
|
+
if (!session.isInitialized) {
|
|
333256
|
+
await initializeSession(session);
|
|
333257
|
+
}
|
|
331670
333258
|
assertNotAborted();
|
|
331671
|
-
|
|
331672
|
-
|
|
331673
|
-
|
|
331674
|
-
|
|
331675
|
-
|
|
331676
|
-
|
|
331677
|
-
job
|
|
331678
|
-
|
|
331679
|
-
|
|
331680
|
-
|
|
331681
|
-
|
|
331682
|
-
|
|
333259
|
+
lastBrowserConsole = session.browserConsoleBuffer;
|
|
333260
|
+
for (let i = 0; i < job.totalFrames; i++) {
|
|
333261
|
+
assertNotAborted();
|
|
333262
|
+
const time = i / job.config.fps;
|
|
333263
|
+
await captureFrame(session, i, time);
|
|
333264
|
+
job.framesRendered = i + 1;
|
|
333265
|
+
const frameProgress = (i + 1) / job.totalFrames;
|
|
333266
|
+
const progress = 25 + frameProgress * 45;
|
|
333267
|
+
updateJobStatus(
|
|
333268
|
+
job,
|
|
333269
|
+
"rendering",
|
|
333270
|
+
`Capturing frame ${i + 1}/${job.totalFrames}`,
|
|
333271
|
+
Math.round(progress),
|
|
333272
|
+
onProgress
|
|
333273
|
+
);
|
|
333274
|
+
}
|
|
333275
|
+
} finally {
|
|
333276
|
+
lastBrowserConsole = session.browserConsoleBuffer;
|
|
333277
|
+
await closeCaptureSession(session);
|
|
331683
333278
|
}
|
|
331684
|
-
} finally {
|
|
331685
|
-
lastBrowserConsole = session.browserConsoleBuffer;
|
|
331686
|
-
await closeCaptureSession(session);
|
|
331687
333279
|
}
|
|
333280
|
+
perfStages.captureMs = Date.now() - stage4Start;
|
|
333281
|
+
const stage5Start = Date.now();
|
|
333282
|
+
updateJobStatus(job, "encoding", "Encoding video", 75, onProgress);
|
|
333283
|
+
const frameExt = needsAlpha ? "png" : "jpg";
|
|
333284
|
+
const framePattern = `frame_%06d.${frameExt}`;
|
|
333285
|
+
const encoderOpts = {
|
|
333286
|
+
fps: job.config.fps,
|
|
333287
|
+
width,
|
|
333288
|
+
height,
|
|
333289
|
+
codec: preset.codec,
|
|
333290
|
+
preset: preset.preset,
|
|
333291
|
+
quality: preset.quality,
|
|
333292
|
+
pixelFormat: preset.pixelFormat,
|
|
333293
|
+
useGpu: job.config.useGpu,
|
|
333294
|
+
hdr: preset.hdr
|
|
333295
|
+
};
|
|
333296
|
+
const encodeResult = enableChunkedEncode ? await encodeFramesChunkedConcat(
|
|
333297
|
+
framesDir,
|
|
333298
|
+
framePattern,
|
|
333299
|
+
videoOnlyPath,
|
|
333300
|
+
encoderOpts,
|
|
333301
|
+
chunkedEncodeSize,
|
|
333302
|
+
abortSignal
|
|
333303
|
+
) : await encodeFramesFromDir(
|
|
333304
|
+
framesDir,
|
|
333305
|
+
framePattern,
|
|
333306
|
+
videoOnlyPath,
|
|
333307
|
+
encoderOpts,
|
|
333308
|
+
abortSignal
|
|
333309
|
+
);
|
|
333310
|
+
assertNotAborted();
|
|
333311
|
+
if (!encodeResult.success) {
|
|
333312
|
+
throw new Error(`Encoding failed: ${encodeResult.error}`);
|
|
333313
|
+
}
|
|
333314
|
+
perfStages.encodeMs = Date.now() - stage5Start;
|
|
331688
333315
|
}
|
|
331689
|
-
perfStages.captureMs = Date.now() - stage4Start;
|
|
331690
|
-
const stage5Start = Date.now();
|
|
331691
|
-
updateJobStatus(job, "encoding", "Encoding video", 75, onProgress);
|
|
331692
|
-
const frameExt = needsAlpha ? "png" : "jpg";
|
|
331693
|
-
const framePattern = `frame_%06d.${frameExt}`;
|
|
331694
|
-
const encoderOpts = baseEncoderOpts;
|
|
331695
|
-
const encodeResult = enableChunkedEncode ? await encodeFramesChunkedConcat(
|
|
331696
|
-
framesDir,
|
|
331697
|
-
framePattern,
|
|
331698
|
-
videoOnlyPath,
|
|
331699
|
-
encoderOpts,
|
|
331700
|
-
chunkedEncodeSize,
|
|
331701
|
-
abortSignal
|
|
331702
|
-
) : await encodeFramesFromDir(
|
|
331703
|
-
framesDir,
|
|
331704
|
-
framePattern,
|
|
331705
|
-
videoOnlyPath,
|
|
331706
|
-
encoderOpts,
|
|
331707
|
-
abortSignal
|
|
331708
|
-
);
|
|
331709
|
-
assertNotAborted();
|
|
331710
|
-
if (!encodeResult.success) {
|
|
331711
|
-
throw new Error(`Encoding failed: ${encodeResult.error}`);
|
|
331712
|
-
}
|
|
331713
|
-
perfStages.encodeMs = Date.now() - stage5Start;
|
|
331714
333316
|
}
|
|
331715
333317
|
if (probeSession !== null) {
|
|
331716
333318
|
const remainingProbeSession = probeSession;
|
|
@@ -331754,12 +333356,12 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331754
333356
|
chunkedEncode: enableChunkedEncode,
|
|
331755
333357
|
chunkSizeFrames: enableChunkedEncode ? chunkedEncodeSize : null,
|
|
331756
333358
|
compositionDurationSeconds: composition.duration,
|
|
331757
|
-
totalFrames
|
|
333359
|
+
totalFrames,
|
|
331758
333360
|
resolution: { width, height },
|
|
331759
333361
|
videoCount: composition.videos.length,
|
|
331760
333362
|
audioCount: composition.audios.length,
|
|
331761
333363
|
stages: perfStages,
|
|
331762
|
-
captureAvgMs:
|
|
333364
|
+
captureAvgMs: totalFrames > 0 ? Math.round((perfStages.captureMs ?? 0) / totalFrames) : void 0
|
|
331763
333365
|
};
|
|
331764
333366
|
job.perfSummary = perfSummary;
|
|
331765
333367
|
if (job.config.debug) {
|
|
@@ -331774,9 +333376,11 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
|
|
|
331774
333376
|
}
|
|
331775
333377
|
if (job.config.debug) {
|
|
331776
333378
|
if (existsSync15(outputPath)) {
|
|
331777
|
-
const debugOutput =
|
|
333379
|
+
const debugOutput = join15(workDir, `output${videoExt}`);
|
|
331778
333380
|
copyFileSync2(outputPath, debugOutput);
|
|
331779
333381
|
}
|
|
333382
|
+
} else if (process.env.KEEP_TEMP === "1") {
|
|
333383
|
+
log2.info("KEEP_TEMP=1 \u2014 leaving workDir on disk for inspection", { workDir });
|
|
331780
333384
|
} else {
|
|
331781
333385
|
await safeCleanup(
|
|
331782
333386
|
"remove workDir",
|
|
@@ -331892,7 +333496,7 @@ function pickEntryFile(files, preferredEntryFile) {
|
|
|
331892
333496
|
return null;
|
|
331893
333497
|
}
|
|
331894
333498
|
function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
331895
|
-
const absProjectDir =
|
|
333499
|
+
const absProjectDir = resolve11(projectDir);
|
|
331896
333500
|
if (!existsSync16(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
|
|
331897
333501
|
return { error: `Project directory not found: ${absProjectDir}` };
|
|
331898
333502
|
}
|
|
@@ -331900,7 +333504,7 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
|
331900
333504
|
(value) => typeof value === "string" && value.trim().length > 0
|
|
331901
333505
|
);
|
|
331902
333506
|
for (const entryFile of entryCandidates) {
|
|
331903
|
-
const absoluteEntryPath =
|
|
333507
|
+
const absoluteEntryPath = resolve11(absProjectDir, entryFile);
|
|
331904
333508
|
if (!absoluteEntryPath.startsWith(absProjectDir)) {
|
|
331905
333509
|
return { error: `Entry file must stay inside project directory: ${entryFile}` };
|
|
331906
333510
|
}
|
|
@@ -331913,7 +333517,7 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
|
|
|
331913
333517
|
}
|
|
331914
333518
|
}
|
|
331915
333519
|
return {
|
|
331916
|
-
error: `No HTML entry file found in project directory: ${
|
|
333520
|
+
error: `No HTML entry file found in project directory: ${join16(absProjectDir, preferredEntryFile || "index.html")}`
|
|
331917
333521
|
};
|
|
331918
333522
|
}
|
|
331919
333523
|
function prepareHyperframeLintBody(body) {
|
|
@@ -331952,13 +333556,6 @@ function prepareHyperframeLintBody(body) {
|
|
|
331952
333556
|
function runHyperframeLint(prepared) {
|
|
331953
333557
|
return lintHyperframeHtml(prepared.html, { filePath: prepared.entryFile });
|
|
331954
333558
|
}
|
|
331955
|
-
function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
|
|
331956
|
-
const absoluteProjectDir = resolve11(projectDir);
|
|
331957
|
-
const projectName = basename22(absoluteProjectDir);
|
|
331958
|
-
const resolvedOutputPath = outputPath ?? join16(rendersDir, `${projectName}.mp4`);
|
|
331959
|
-
const absoluteOutputPath = resolve11(resolvedOutputPath);
|
|
331960
|
-
return { absoluteProjectDir, absoluteOutputPath };
|
|
331961
|
-
}
|
|
331962
333559
|
function parseRenderOptions(body) {
|
|
331963
333560
|
const fps = [24, 30, 60].includes(body.fps) ? body.fps : 30;
|
|
331964
333561
|
const quality = ["draft", "standard", "high"].includes(body.quality) ? body.quality : "high";
|
|
@@ -332399,9 +333996,9 @@ function startServer(options = {}) {
|
|
|
332399
333996
|
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
332400
333997
|
return server3;
|
|
332401
333998
|
}
|
|
332402
|
-
var import_esbuild, __create2, __defProp2, __getOwnPropDesc2, __getOwnPropNames2, __getProtoOf2, __hasOwnProp2, __require2, __esm2, __commonJS2, __export2, __copyProps2, __toESM2, __toCommonJS2, require_boolbase, require_types3, require_parse3, require_stringify2, require_commonjs, require_StyleSheet, require_CSSRule, require_CSSStyleRule, require_CSSStyleSheet, require_MediaList, require_CSSImportRule, require_CSSGroupingRule, require_CSSConditionRule, require_CSSMediaRule, require_CSSSupportsRule, require_CSSFontFaceRule, require_CSSHostRule, require_CSSKeyframeRule, require_CSSKeyframesRule, require_CSSValue, require_CSSValueExpression, require_MatcherList, require_CSSDocumentRule, require_parse22, require_CSSStyleDeclaration, require_clone, require_lib3, require_canvas_shim, require_canvas, extendStatics3, UnsubscriptionError2, Subscription2, EMPTY_SUBSCRIPTION2, config2, timeoutProvider2, COMPLETE_NOTIFICATION2, context2, Subscriber2, _bind2, ConsumerObserver2, SafeSubscriber2, EMPTY_OBSERVER2, observable2, Observable2, OperatorSubscriber2, ObjectUnsubscribedError2, Subject2, AnonymousSubject2, dateTimestampProvider2, ReplaySubject2, Action2, intervalProvider2, AsyncAction2, Scheduler2, AsyncScheduler2, asyncScheduler2, async2, EMPTY2, isArrayLike2, iterator2, EmptyError2, isArray22, isArray222, getPrototypeOf2, objectProto2, getKeys2, nodeEventEmitterMethods2, eventTargetMethods2, jqueryMethods2, NEVER2, isArray32, init_rxjs2, init_mitt3, disposeSymbol2, asyncDisposeSymbol2, DisposableStackPolyfill2, DisposableStack2, AsyncDisposableStackPolyfill2, AsyncDisposableStack2, SuppressedErrorPolyfill2, SuppressedError22, init_disposable2, EventEmitter4, init_EventEmitter2, isNode2, environment2, init_environment2, assert3, init_assert2, init_encoding2, packageVersion3, init_version2, require_ms2, require_common5, require_browser2, require_has_flag2, require_supports_color2, require_node4, require_src2, debugModule2, debug6, capturedLogs2, captureLogs2, init_Debug2, PuppeteerError2, TimeoutError3, TouchError2, ProtocolError2, UnsupportedOperation2, TargetCloseError2, ConnectionClosedError2, init_Errors2, paperFormats2, init_PDFOptions2, debugError2, DEFAULT_VIEWPORT2, SOURCE_URL2, PuppeteerURL2, withSourcePuppeteerURLIfNone2, getSourcePuppeteerURLIfAvailable2, isString2, isNumber3, isPlainObject2, isRegExp2, isDate2, VALID_DIALOG_TYPES2, UTILITY_WORLD_NAME2, SOURCE_URL_REGEX2, NETWORK_IDLE_TIME2, unitToPixels2, init_util4, WEB_PERMISSION_TO_PROTOCOL_PERMISSION2, Browser4, init_Browser5, Deferred2, init_Deferred2, Mutex2, init_Mutex2, BrowserContext2, init_BrowserContext4, CDPSessionEvent2, CDPSession2, init_CDPSession3, DeviceRequestPrompt2, init_DeviceRequestPrompt4, Dialog2, init_Dialog4, AsyncIterableUtil2, init_AsyncIterableUtil2, _isElementHandle2, init_ElementHandleSymbol2, init_ErrorLike2, createdFunctions2, createFunction2, interpolateFunction2, init_Function2, __addDisposableResource21, __disposeResources21, DEFAULT_BATCH_SIZE2, init_HandleIterator2, LazyArg2, init_LazyArg2, __addDisposableResource22, __disposeResources22, QueryHandler2, init_QueryHandler2, isKnownAttribute2, ATTRIBUTE_REGEXP2, parseARIASelector2, ARIAQueryHandler2, init_AriaQueryHandler2, CSSQueryHandler2, init_CSSQueryHandler2, source2, init_injected2, ScriptInjector2, scriptInjector2, init_ScriptInjector2, CustomQueryHandlerRegistry2, customQueryHandlers2, init_CustomQueryHandler2, PierceQueryHandler2, init_PierceQueryHandler2, PQueryHandler2, init_PQueryHandler2, TOKENS2, TRIM_TOKENS2, getArgumentPatternByType2, STRING_PATTERN2, ESCAPE_PATTERN2, init_parsel_js2, ESCAPE_REGEXP2, unquote2, init_PSelectorParser2, TextQueryHandler2, init_TextQueryHandler2, XPathQueryHandler2, init_XPathQueryHandler2, BUILTIN_QUERY_HANDLERS2, QUERY_SEPARATORS2, init_GetQueryHandler2, __addDisposableResource32, __disposeResources32, instances2, bubbleHandlers2, bubbleInitializer2, init_decorators2, __runInitializers24, __esDecorate24, __addDisposableResource42, __disposeResources42, JSHandle2, init_JSHandle4, __addDisposableResource52, __disposeResources52, LocatorEvent2, Locator2, FunctionLocator2, DelegatedLocator2, FilteredLocator2, MappedLocator2, NodeLocator2, RaceLocator2, RETRY_DELAY2, init_locators2, __runInitializers25, __esDecorate25, __addDisposableResource62, __disposeResources62, __setFunctionName7, ElementHandle2, init_ElementHandle4, __runInitializers32, __esDecorate32, __addDisposableResource72, __disposeResources72, FrameEvent2, throwIfDetached2, Frame2, init_Frame4, DEFAULT_INTERCEPT_RESOLUTION_PRIORITY2, HTTPRequest2, InterceptResolutionAction2, STATUS_TEXTS2, errorReasons2, init_HTTPRequest4, HTTPResponse2, init_HTTPResponse4, init_incremental_id_generator2, Keyboard2, MouseButton2, Mouse2, Touchscreen2, init_Input4, DEFAULT_TIMEOUT2, TimeoutSettings2, init_TimeoutSettings2, __runInitializers42, __esDecorate42, __addDisposableResource82, __disposeResources82, Page2, supportedMetrics3, init_Page4, WaitTask2, TaskManager2, init_WaitTask2, Realm3, init_Realm4, TargetType2, Target2, init_Target4, WebWorker2, init_WebWorker4, init_api2, __addDisposableResource92, __disposeResources92, Accessibility2, AXNode2, init_Accessibility2, __addDisposableResource102, __disposeResources102, Binding2, init_Binding2, CdpBluetoothEmulation2, init_BluetoothEmulation3, ConsoleMessage2, init_ConsoleMessage2, FileChooser2, init_FileChooser2, NetworkManagerEvent2, init_NetworkManagerEvents2, CallbackRegistry2, Callback2, init_CallbackRegistry2, CdpCDPSession2, init_CdpSession2, debugProtocolSend3, debugProtocolReceive3, Connection2, init_Connection3, Coverage2, JSCoverage2, CSSCoverage2, init_Coverage2, CdpDialog2, init_Dialog22, __runInitializers52, __esDecorate52, __setFunctionName22, EmulatedState2, EmulationManager2, init_EmulationManager2, CdpPreloadScript2, init_CdpPreloadScript2, CdpDeviceRequestPrompt2, CdpDeviceRequestPromptManager2, init_DeviceRequestPrompt22, getErrorDetails2, CDP_BINDING_PREFIX2, init_utils2, CdpJSHandle2, init_JSHandle22, __runInitializers62, __esDecorate62, NON_ELEMENT_NODE_ROLES2, CdpElementHandle2, init_ElementHandle22, __addDisposableResource112, __disposeResources112, ariaQuerySelectorBinding2, ariaQuerySelectorAllBinding2, ExecutionContext2, rewriteError22, init_ExecutionContext2, FrameManagerEvent2, init_FrameManagerEvents2, IsolatedWorld2, init_IsolatedWorld2, MAIN_WORLD2, PUPPETEER_WORLD2, init_IsolatedWorlds2, puppeteerToProtocolLifecycle2, LifecycleWatcher2, init_LifecycleWatcher2, __runInitializers72, __esDecorate72, CdpFrame2, init_Frame22, FrameTree2, init_FrameTree2, CdpHTTPRequest2, init_HTTPRequest22, SecurityDetails2, init_SecurityDetails2, CdpHTTPResponse2, init_HTTPResponse22, NetworkEventManager2, init_NetworkEventManager2, NetworkManager2, init_NetworkManager2, TIME_FOR_WAITING_FOR_SWAP2, FrameManager2, init_FrameManager2, _keyDefinitions2, init_USKeyboardLayout2, CdpKeyboard2, getFlag2, getButtonFromPressedButtons2, CdpMouse2, CdpTouchHandle2, CdpTouchscreen2, init_Input22, Tracing2, init_Tracing2, CdpWebWorker2, init_WebWorker22, __addDisposableResource122, __disposeResources122, CdpPage2, supportedMetrics22, init_Page22, __addDisposableResource132, __disposeResources132, CdpBrowserContext2, init_BrowserContext22, InitializationStatus2, CdpTarget2, PageTarget2, DevToolsTarget2, WorkerTarget2, OtherTarget2, init_Target22, TargetManager2, init_TargetManager2, CdpBrowser2, init_Browser22, init_BrowserConnector4, tabTargetInfo2, pageTargetInfo2, ExtensionTransport2, init_ExtensionTransport2, PredefinedNetworkConditions2, init_PredefinedNetworkConditions2, init_TargetManageEvents2, init_cdp2, BrowserWebSocketTransport_exports2, BrowserWebSocketTransport2, init_BrowserWebSocketTransport2, knownDevices2, knownDevicesByName2, KnownDevices2, init_Device2, mitt_exports2, init_mitt22, require_EventEmitter2, require_log2, require_ProcessingQueue2, require_cdp2, require_chromium_bidi2, require_webdriver_bidi2, require_ErrorResponse2, require_webdriver_bidi_permissions2, require_webdriver_bidi_bluetooth2, require_webdriver_bidi_nav_speculation2, require_webdriver_bidi_ua_client_hints2, require_protocol2, require_BidiNoOpParser2, require_BrowserProcessor2, require_CdpProcessor2, require_BrowsingContextProcessor2, require_EmulationProcessor2, require_assert2, require_graphemeTools2, require_InputSource2, require_keyUtils2, require_USKeyboardLayout2, require_ActionDispatcher2, require_Mutex2, require_InputState2, require_InputStateManager2, require_InputProcessor2, require_base644, require_NetworkUtils2, require_NetworkProcessor2, require_PermissionsProcessor2, require_uuid2, require_ChannelProxy2, require_PreloadScript2, require_ScriptProcessor2, require_SessionProcessor2, require_StorageProcessor2, require_WebExtensionProcessor2, require_OutgoingMessage2, require_CommandProcessor2, require_BluetoothProcessor2, require_ContextConfig2, require_ContextConfigStorage2, require_UserContextStorage2, require_Deferred2, require_time2, require_unitConversions2, require_SharedId2, require_Realm2, require_WindowRealm2, require_urlHelpers2, require_NavigationTracker2, require_BrowsingContextImpl2, require_WorkerRealm2, require_logHelper2, require_LogManager2, require_CollectorsStorage2, require_DefaultMap2, require_NetworkRequest2, require_NetworkStorage2, require_CdpTarget2, require_CdpTargetManager2, require_BrowsingContextStorage2, require_PreloadScriptStorage2, require_RealmStorage2, require_Buffer2, require_IdWrapper2, require_events2, require_SubscriptionManager2, require_EventManager2, require_SpeculationProcessor2, require_BidiServer2, require_BidiMapper2, BidiCdpSession2, init_CDPSession22, debugProtocolSend22, debugProtocolReceive22, BidiConnection2, init_Connection22, BidiMapper2, bidiServerLogger2, CdpConnectionAdapter2, CDPClientAdapter2, NoOpTransport2, init_BidiOverCdp2, BidiBluetoothEmulation2, init_BluetoothEmulation22, BidiDeviceRequestPromptManager2, BidiDeviceRequestPrompt2, init_DeviceRequestPrompt32, __runInitializers82, __esDecorate82, Navigation2, init_Navigation2, __runInitializers92, __esDecorate92, _a32, Realm22, WindowRealm2, DedicatedWorkerRealm2, SharedWorkerRealm2, init_Realm22, __runInitializers102, __esDecorate102, Request22, init_Request2, __runInitializers112, __esDecorate112, UserPrompt2, init_UserPrompt2, __runInitializers122, __esDecorate122, BrowsingContext2, init_BrowsingContext2, __runInitializers132, __esDecorate132, UserContext2, init_UserContext2, BidiDeserializer2, init_Deserializer2, BidiJSHandle2, init_JSHandle32, __runInitializers142, __esDecorate142, __addDisposableResource142, __disposeResources142, BidiElementHandle2, init_ElementHandle32, BidiDialog2, init_Dialog32, __addDisposableResource152, __disposeResources152, ExposableFunction2, init_ExposedFunction2, __runInitializers152, __esDecorate152, BidiHTTPResponse2, init_HTTPResponse32, _a4, requests2, BidiHTTPRequest2, init_HTTPRequest32, UnserializableError2, BidiSerializer2, init_Serializer2, init_util22, __addDisposableResource162, __disposeResources162, BidiRealm2, BidiFrameRealm2, BidiWorkerRealm2, init_Realm32, BidiWebWorker2, init_WebWorker32, __runInitializers162, __esDecorate162, __setFunctionName32, BidiFrame2, init_Frame32, SourceActionsType2, ActionType2, getBidiKeyValue2, BidiKeyboard2, getBidiButton2, BidiMouse2, BidiTouchHandle2, BidiTouchscreen2, init_Input32, __esDecorate172, __runInitializers172, __addDisposableResource172, __disposeResources172, BidiPage2, CDP_SPECIFIC_PREFIX2, init_Page32, BidiBrowserTarget2, BidiPageTarget2, BidiFrameTarget2, BidiWorkerTarget2, init_Target32, __esDecorate182, __runInitializers182, __addDisposableResource182, __disposeResources182, BidiBrowserContext2, init_BrowserContext32, __runInitializers192, __esDecorate192, __addDisposableResource192, __disposeResources192, Browser22, init_Browser32, __runInitializers202, __esDecorate202, Session2, init_Session2, __esDecorate212, __runInitializers212, __setFunctionName42, BidiBrowser2, init_Browser42, bidi_exports2, init_bidi2, init_BrowserConnector22, require_constants7, require_buffer_util2, require_limiter2, require_permessage_deflate2, require_validation2, require_receiver2, require_sender2, require_event_target2, require_extension2, require_websocket2, require_stream2, require_subprotocol2, require_websocket_server2, import_stream4, import_receiver2, import_sender2, import_websocket2, import_websocket_server2, wrapper_default2, init_wrapper2, NodeWebSocketTransport_exports2, NodeWebSocketTransport2, init_NodeWebSocketTransport2, Browser32, BrowserPlatform2, BrowserTag2, ChromeReleaseChannel2, init_types2, require_constants22, require_debug3, require_re2, require_parse_options2, require_identifiers2, require_semver3, require_parse32, require_valid3, require_clean2, require_inc2, require_diff2, require_major2, require_minor2, require_patch2, require_prerelease2, require_compare2, require_rcompare2, require_compare_loose2, require_compare_build2, require_sort2, require_rsort2, require_gt2, require_lt2, require_eq2, require_neq2, require_gte2, require_lte2, require_cmp2, require_coerce2, require_lrucache2, require_range2, require_comparator2, require_satisfies2, require_to_comparators2, require_max_satisfying2, require_min_satisfying2, require_min_version2, require_valid22, require_outside2, require_gtr2, require_ltr2, require_intersects2, require_simplify2, require_subset2, require_semver22, require_lru_cache2, require_helpers4, require_dist13, require_proxy_from_env2, require_dist22, require_parse_proxy_response2, require_dist32, require_utils3, require_smartbuffer2, require_constants32, require_util6, require_common22, require_constants42, require_address_error2, require_ipv42, require_constants52, require_helpers22, require_regular_expressions2, require_ipv62, require_ip_address2, require_helpers32, require_receivebuffer2, require_socksclient2, require_build3, require_dist42, require_common32, require_node22, require_notmodified2, require_data2, require_notfound2, require_file2, require_parseControlResponse2, require_FtpContext2, require_FileInfo2, require_parseListDOS2, require_parseListUnix2, require_parseListMLSD2, require_parseList2, require_ProgressTracker2, require_StringWriter2, require_netUtils2, require_transfer2, require_Client2, require_StringEncoding2, require_dist52, require_ftp2, require_http_error2, require_http2, require_https2, require_dist62, require_estraverse2, require_ast2, require_code2, require_keyword3, require_utils22, require_base6422, require_base64_vlq3, require_util22, require_array_set3, require_mapping_list3, require_source_map_generator3, require_binary_search3, require_quick_sort3, require_source_map_consumer3, require_source_node3, require_source_map3, require_package2, require_escodegen2, require_esprima3, tslib_es6_exports2, extendStatics22, __assign2, __createBinding2, __setModuleDefault2, ownKeys2, _SuppressedError2, tslib_es6_default2, init_tslib_es62, require_types22, require_path2, require_scope2, require_node_path2, require_path_visitor2, require_equiv2, require_fork2, require_shared2, require_core3, require_es62, require_es72, require_es20202, require_jsx2, require_type_annotations2, require_flow2, require_esprima22, require_babel_core2, require_babel2, require_typescript3, require_es_proposals2, require_namedTypes2, require_main3, require_degenerator2, require_compile2, require_dist72, require_dateRange2, require_dnsDomainIs2, require_dnsDomainLevels2, require_util32, require_dnsResolve2, require_netmask2, require_isInNet2, require_isPlainHostName2, require_isResolvable2, require_localHostOrDomainIs2, require_ip2, require_myIpAddress2, require_shExpMatch2, require_timeRange2, require_weekdayRange2, require_dist82, require_esmHelpers2, require_debug22, require_errors2, require_asyncify_helpers2, require_lifetime2, require_deferred_promise2, require_memory2, require_types_ffi2, require_types32, require_context2, require_runtime2, require_module2, require_context_asyncify2, require_runtime_asyncify2, require_module_asyncify2, require_ffi_WASM_RELEASE_SYNC2, require_emscripten_module_WASM_RELEASE_SYNC2, require_variants2, require_vm_interface2, require_module_test2, require_dist92, require_dist102, require_dist112, import_proxy_agent2, init_httpUtil2, import_semver2, baseVersionUrl3, WINDOWS_ENV_PARAM_NAMES2, init_chrome2, init_chrome_headless_shell2, init_chromedriver2, init_chromium2, FirefoxChannel2, baseVersionUrl22, init_firefox2, downloadUrls2, downloadPaths2, executablePathByBrowser2, versionComparators2, init_browser_data2, init_detectPlatform2, import_debug7, debugCache2, InstalledBrowser2, Cache2, init_Cache2, import_debug22, init_debug2, debugLaunch2, CDP_WEBSOCKET_ENDPOINT_REGEX2, WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX2, processListeners2, dispatchers2, Process2, PROCESS_ERROR_EXPLANATION2, TimeoutError22, init_launch2, require_node_progress2, require_progress2, DefaultProvider2, init_DefaultProvider2, require_wrappy2, require_once2, require_end_of_stream2, require_pump2, require_buffer_stream2, require_get_stream2, require_pend2, require_fd_slicer2, require_buffer_crc322, require_yauzl2, require_extract_zip2, require_default3, require_fixed_size2, require_fast_fifo2, require_b4a2, require_pass_through_decoder2, require_utf8_decoder2, require_text_decoder2, require_streamx2, require_headers2, require_extract2, require_constants62, require_pack2, require_tar_stream2, require_tar_fs2, import_debug42, debugFileUtil2, internalConstantsForTesting2, init_fileUtil2, import_progress2, debugInstall2, times2, init_install2, align2, top2, right2, bottom2, left2, UI2, mixin3, init_lib4, ansi2, init_string_utils3, init_cliui2, init_sync2, init_string_utils22, init_tokenize_arg_string2, DefaultValuesForTypeKey2, init_yargs_parser_types2, mixin22, YargsParser2, init_yargs_parser2, _a5, _b2, _c2, minNodeVersion2, nodeVersion2, env3, parser2, yargsParser2, lib_default2, init_lib22, init_process_argv2, YError2, init_yerror2, node_default2, init_node3, shim3, Y18N2, init_lib32, y18n22, y18n_default2, init_y18n2, REQUIRE_ERROR2, REQUIRE_DIRECTORY_ERROR2, __dirname22, mainFilename2, esm_default3, init_esm3, init_common_types2, init_is_promise2, init_parse_command2, positionName2, init_argsert2, GlobalMiddleware2, init_middleware2, init_maybe_async_result2, init_which_module2, DEFAULT_MARKER2, CommandInstance2, init_command2, init_obj_filter2, init_set_blocking2, init_usage2, completionShTemplate2, completionZshTemplate2, init_completion_templates2, Completion2, init_completion2, init_levenshtein2, specialKeys2, init_validation2, previouslyVisitedConfigs2, shim22, init_apply_extends2, __classPrivateFieldSet22, __classPrivateFieldGet22, _YargsInstance_command2, _YargsInstance_cwd2, _YargsInstance_context2, _YargsInstance_completion2, _YargsInstance_completionCommand2, _YargsInstance_defaultShowHiddenOpt2, _YargsInstance_exitError2, _YargsInstance_detectLocale2, _YargsInstance_emittedWarnings2, _YargsInstance_exitProcess2, _YargsInstance_frozens2, _YargsInstance_globalMiddleware2, _YargsInstance_groups2, _YargsInstance_hasOutput2, _YargsInstance_helpOpt2, _YargsInstance_isGlobalContext2, _YargsInstance_logger2, _YargsInstance_output2, _YargsInstance_options2, _YargsInstance_parentRequire2, _YargsInstance_parserConfig2, _YargsInstance_parseFn2, _YargsInstance_parseContext2, _YargsInstance_pkgs2, _YargsInstance_preservedGroups2, _YargsInstance_processArgs2, _YargsInstance_recommendCommands2, _YargsInstance_shim2, _YargsInstance_strict2, _YargsInstance_strictCommands2, _YargsInstance_strictOptions2, _YargsInstance_usage2, _YargsInstance_usageConfig2, _YargsInstance_versionOpt2, _YargsInstance_validation2, kCopyDoubleDash2, kCreateLogger2, kDeleteFromParserHintObject2, kEmitWarning2, kFreeze2, kGetDollarZero2, kGetParserConfiguration2, kGetUsageConfiguration2, kGuessLocale2, kGuessVersion2, kParsePositionalNumbers2, kPkgUp2, kPopulateParserHintArray2, kPopulateParserHintSingleValueDictionary2, kPopulateParserHintArrayDictionary2, kPopulateParserHintDictionary2, kSanitizeKey2, kSetKey2, kUnfreeze2, kValidateAsync2, kGetCommandInstance2, kGetContext2, kGetHasOutput2, kGetLoggerInstance2, kGetParseContext2, kGetUsageInstance2, kGetValidationInstance2, kHasParseCallback2, kIsGlobalContext2, kPostProcess2, kRebase2, kReset2, kRunYargsParserAndExecuteCommands2, kRunValidation2, kSetHasOutput2, kTrackManuallySetKeys2, YargsInstance2, init_yargs_factory2, yargs_exports2, Yargs2, yargs_default2, init_yargs2, helpers_exports2, applyExtends22, init_helpers2, packageVersion22, CLI2, init_CLI2, init_provider2, main_exports2, init_main2, LaunchOptions_exports2, init_LaunchOptions2, getWebSocketTransportClass2, init_BrowserConnector32, Puppeteer2, init_Puppeteer2, TaskQueue2, init_TaskQueue2, init_common2, PUPPETEER_REVISIONS2, init_revisions2, init_util32, init_index_browser2, PipeTransport2, init_PipeTransport2, BrowserLauncher2, init_BrowserLauncher2, rmOptions2, init_fs2, ChromeLauncher2, init_ChromeLauncher2, FirefoxLauncher2, init_FirefoxLauncher2, PuppeteerNode2, init_PuppeteerNode2, import_debug62, __runInitializers232, __esDecorate232, __setFunctionName62, CRF_VALUE2, DEFAULT_FPS2, debugFfmpeg2, ScreenRecorder2, init_ScreenRecorder2, init_node22, init_puppeteer3, puppeteer_core_exports, puppeteer3, connect3, defaultArgs3, executablePath3, launch22, puppeteer_core_default, init_puppeteer_core2, CHANGED, CLASS_LIST, CUSTOM_ELEMENTS, CONTENT, DATASET, DOCTYPE, DOM_PARSER, END, EVENT_TARGET, GLOBALS, IMAGE, MIME, MUTATION_OBSERVER, NEXT, OWNER_ELEMENT, PREV, PRIVATE, SHEET, START, STYLE, UPGRADE, VALUE, esm_exports3, _a6, decodeMap, fromCodePoint, htmlDecodeTree, xmlDecodeTree, BinTrieFlags, CharCodes, TO_LOWER_BIT, EntityDecoderState, DecodingMode, EntityDecoder, CharCodes2, State, QuoteType, Sequences, Tokenizer, formTags, pTag, tableSectionTags, ddtTags, rtpTags, openImpliesClose, voidElements, foreignContextElements, htmlIntegrationElements, reNameEnd, Parser2, esm_exports, ElementType, Root2, Text, Directive, Comment2, Script, Style, Tag, CDATA, Doctype, Node22, DataNode, Text2, Comment22, ProcessingInstruction, NodeWithChildren, CDATA2, Document22, Element2, defaultOpts, DomHandler, esm_exports2, decode_data_html_default, decode_data_xml_default, _a22, decodeMap2, fromCodePoint2, CharCodes3, TO_LOWER_BIT2, BinTrieFlags2, EntityDecoderState2, DecodingMode2, EntityDecoder2, htmlDecoder, xmlDecoder, encode_html_default, xmlReplacer, xmlCodeMap, getCodePoint, escapeUTF8, escapeAttribute, escapeText, EntityLevel, EncodingMode, elementNames, attributeNames, unencodedElements, singleTag, esm_default2, foreignModeIntegrationPoints, foreignElements, Checks, DocumentPosition, MEDIA_KEYS_STRING, MEDIA_KEYS_INT, parseFeedDefaultOptions, NODE_END, ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, DOCUMENT_FRAGMENT_NODE, BLOCK_ELEMENTS, SHOW_ALL, SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION, SHOW_COMMENT, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, SVG_NAMESPACE, assign, create, defineProperties, entries, getOwnPropertyDescriptors, keys, setPrototypeOf, $String, getEnd, ignoreCase, knownAdjacent, knownBoundaries, knownSegment, knownSiblings, localCase, setAdjacent, htmlToFragment, shadowRoots, reactive, Classes, customElements, attributeChangedCallback, createTrigger, triggerConnected, connectedCallback, triggerDisconnected, disconnectedCallback, CustomElementRegistry, Parser22, notParsing, append2, attribute, parseFromString, htmlClasses, registerHTMLClass, loopSegment, attrAsJSON, characterDataAsJSON, nonElementAsJSON, documentTypeAsJSON, elementAsJSON, createRecord, queueAttribute, attributeChangedCallback2, moCallback, MutationObserverClass, emptyAttributes, setAttribute, removeAttribute, booleanAttribute, numericAttribute, stringAttribute, wm, DOMEventTarget, NodeList, getParentNodeCount, Node3, replace, ca, esca, pe, escape2, QUOTE, Attr, isConnected, parentElement, previousSibling, nextSibling, nextElementSibling2, previousElementSibling, asFragment, before, after, replaceWith, remove, CharacterData, CDATASection, Comment3, import_boolbase6, import_css_what4, import_boolbase5, import_css_what, procedure, attributes, import_boolbase, reChars, caseInsensitiveAttributes, attributeRules, import_css_what2, whitespace, ZERO, NINE, import_boolbase2, import_boolbase3, filters, pseudos, aliases, import_boolbase4, PLACEHOLDER_ELEMENT, is, subselects, import_css_what3, DESCENDANT_TOKEN, FLEXIBLE_DESCENDANT_TOKEN, SCOPE_TOKEN, defaultEquals, defaultOptions, compile3, _compileUnsafe, _compileToken, selectAll, selectOne, isArray4, isTag3, existsOne2, getAttributeValue2, getChildren2, getName2, getParent2, getSiblings2, getText22, hasAttrib2, removeSubsets2, findAll2, findOne2, adapter, prepareMatch, matches, Text3, isNode3, insert, ParentNode, NonElementParentNode, DocumentFragment2, DocumentType, getInnerHtml, setInnerHtml, esm_default22, refs, key, prop, handler, DOMStringMap, add, addTokens, update, DOMTokenList, refs2, getKeys3, updateKeys, handler2, CSSStyleDeclaration, prototype, BUBBLING_PHASE, AT_TARGET, CAPTURING_PHASE, NONE, GlobalEvent, NamedNodeMap, ShadowRoot, attributesHandler, create2, isVoid, Element3, classNames, handler3, SVGElement2, illegalConstructor, Facades, Level0, level0, HTMLElement2, tagName, HTMLTemplateElement, HTMLHtmlElement, toString, TextElement, tagName2, HTMLScriptElement, HTMLFrameElement2, tagName3, HTMLIFrameElement2, HTMLObjectElement, HTMLHeadElement, HTMLBodyElement, import_cssom, tagName4, HTMLStyleElement, HTMLTimeElement, HTMLFieldSetElement, HTMLEmbedElement, HTMLHRElement, HTMLProgressElement, HTMLParagraphElement, HTMLTableElement, HTMLFrameSetElement, HTMLLIElement, HTMLBaseElement, HTMLDataListElement, tagName5, HTMLInputElement2, HTMLParamElement, HTMLMediaElement, HTMLAudioElement, tagName6, HTMLHeadingElement, HTMLDirectoryElement, HTMLQuoteElement, import_canvas, createCanvas, tagName7, HTMLCanvasElement, HTMLLegendElement, tagName8, HTMLOptionElement, HTMLSpanElement, HTMLMeterElement, HTMLVideoElement, HTMLTableCellElement, tagName9, HTMLTitleElement, HTMLOutputElement, HTMLTableRowElement, HTMLDataElement, HTMLMenuElement, tagName10, HTMLSelectElement2, HTMLBRElement, tagName11, HTMLButtonElement, HTMLMapElement, HTMLOptGroupElement, HTMLDListElement, tagName12, HTMLTextAreaElement2, HTMLFontElement, HTMLDivElement, tagName13, HTMLLinkElement, tagName14, HTMLSlotElement, HTMLFormElement, tagName15, HTMLImageElement, HTMLPreElement, HTMLUListElement, tagName16, HTMLMetaElement, HTMLPictureElement, HTMLAreaElement, HTMLOListElement, HTMLTableCaptionElement, tagName17, HTMLAnchorElement, HTMLLabelElement, HTMLUnknownElement, HTMLModElement, HTMLDetailsElement, tagName18, HTMLSourceElement, HTMLTrackElement, HTMLMarqueeElement, HTMLClasses, voidElements2, Mime, CustomEvent, InputEvent, ImageClass, deleteContents, Range, isOK, TreeWalker, query, globalExports, window2, Document3, createHTMLElement, HTMLDocument, SVGDocument, XMLDocument, DOMParser2, parse5, parseHTML, DEFAULT_CONFIG, _puppeteer, pooledBrowser, pooledBrowserRefCount, pooledCaptureMode, ENABLE_BROWSER_POOL, BEGINFRAME_ONLY_FLAGS, GSAP_METHODS, SUPPORTED_PROPS, TAG_PATTERN, STYLE_BLOCK_PATTERN, SCRIPT_BLOCK_PATTERN, COMPOSITION_ID_IN_CSS_PATTERN, TIMELINE_REGISTRY_INIT_PATTERN, TIMELINE_REGISTRY_ASSIGN_PATTERN, WINDOW_TIMELINE_ASSIGN_PATTERN, INVALID_SCRIPT_CLOSE_PATTERN, coreRules, mediaRules, META_GSAP_KEYS, gsapRules, captionRules, compositionRules, adapterRules, ALL_RULES, PATH_ATTRS, CSS_URL_RE, MEDIA_VISUAL_STYLE_PROPERTIES, arabicScriptRe, combiningMarkRe, decimalDigitRe, emojiPresentationRe, cdpSessionCache, lastFrameCache, PENDING_FRAME_RETRIES, BROWSER_CONSOLE_BUFFER_SIZE, cachedGpuEncoder, DEFAULT_TIMEOUT22, ENCODER_PRESETS, videoMetadataCache, audioMetadataCache, keyframeCache, downloadPathCache, inFlightDownloads, FrameLookupTable, MEMORY_PER_WORKER_MB, MIN_WORKERS, ABSOLUTE_MAX_WORKERS, DEFAULT_SAFE_MAX_WORKERS, MIN_FRAMES_PER_WORKER, compose, GET_MATCH_RESULT, parseBody, handleParsingAllValues, handleParsingNestedValues, splitPath, splitRoutingPath, extractGroupsFromPath, replaceGroupMarks, patternCache, getPattern, tryDecode, tryDecodeURI, getPath, getPathNoStrict, mergePath, checkOptionalParameter, _decodeURI, _getQueryParam, getQueryParam, getQueryParams, decodeURIComponent_, tryDecodeURIComponent, HonoRequest, HtmlEscapedCallbackPhase, raw, resolveCallback, TEXT_PLAIN, setDefaultContentType, createResponseInstance, Context, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError, COMPOSED_HANDLER, notFoundHandler, errorHandler, Hono, emptyParam, LABEL_REG_EXP_STR, ONLY_WILDCARD_REG_EXP_STR, TAIL_WILDCARD_REG_EXP_STR, PATH_ERROR, regExpMetaChars, Node5, Trie, nullMatcher, wildcardRegExpCache, RegExpRouter, SmartRouter, emptyParams, hasChildren2, Node6, TrieRouter, Hono2, RequestError, toRequestError, GlobalRequest, Request3, newHeadersFromIncoming, wrapBodyStream, newRequestFromIncoming, getRequestCache, requestCache, incomingKey, urlKey, headersKey, abortControllerKey, getAbortController, requestPrototype, newRequest, responseCache, getResponseCache, cacheKey, GlobalResponse, Response2, buildOutgoingHttpHeaders, X_ALREADY_SENT, outgoingEnded, handleRequestError, handleFetchError, handleResponseError, flushHeaders, responseViaCache, isPromise32, responseViaResponseObject, getRequestListener, createAdaptorServer, serve, PRODUCER_DIR, SIBLING_MANIFEST_PATH, MODULE_RELATIVE_MANIFEST_PATH, CWD_RELATIVE_MANIFEST_PATHS, MIME_TYPES, RENDER_SEEK_MODE, RENDER_SEEK_DIAGNOSTICS, RENDER_SEEK_STEP, RENDER_SEEK_OFFSET_FRACTION, RENDER_MODE_SCRIPT, HF_BRIDGE_SCRIPT, EMBEDDED_FONT_DATA, GENERIC_FAMILIES, CANONICAL_FONTS, FONT_ALIASES, GOOGLE_FONTS_CACHE_DIR, WOFF2_USER_AGENT, LOG_LEVEL_PRIORITY, defaultLogger, RenderCancelledError, StreamingApi, isOldBunVersion, SSEStreamingApi, run, contextStash, streamSSE, DEFAULT_RENDERS_DIR, Semaphore, entryScript, isPublicServerEntry;
|
|
333999
|
+
var import_esbuild, __create2, __defProp2, __getOwnPropDesc2, __getOwnPropNames2, __getProtoOf2, __hasOwnProp2, __require2, __esm2, __commonJS2, __export2, __copyProps2, __toESM2, __toCommonJS2, require_boolbase, require_types3, require_parse3, require_stringify2, require_commonjs, require_StyleSheet, require_CSSRule, require_CSSStyleRule, require_CSSStyleSheet, require_MediaList, require_CSSImportRule, require_CSSGroupingRule, require_CSSConditionRule, require_CSSMediaRule, require_CSSSupportsRule, require_CSSFontFaceRule, require_CSSHostRule, require_CSSKeyframeRule, require_CSSKeyframesRule, require_CSSValue, require_CSSValueExpression, require_MatcherList, require_CSSDocumentRule, require_parse22, require_CSSStyleDeclaration, require_clone, require_lib3, require_canvas_shim, require_canvas, extendStatics3, UnsubscriptionError2, Subscription2, EMPTY_SUBSCRIPTION2, config2, timeoutProvider2, COMPLETE_NOTIFICATION2, context2, Subscriber2, _bind2, ConsumerObserver2, SafeSubscriber2, EMPTY_OBSERVER2, observable2, Observable2, OperatorSubscriber2, ObjectUnsubscribedError2, Subject2, AnonymousSubject2, dateTimestampProvider2, ReplaySubject2, Action2, intervalProvider2, AsyncAction2, Scheduler2, AsyncScheduler2, asyncScheduler2, async2, EMPTY2, isArrayLike2, iterator2, EmptyError2, isArray22, isArray222, getPrototypeOf2, objectProto2, getKeys2, nodeEventEmitterMethods2, eventTargetMethods2, jqueryMethods2, NEVER2, isArray32, init_rxjs2, init_mitt3, disposeSymbol2, asyncDisposeSymbol2, DisposableStackPolyfill2, DisposableStack2, AsyncDisposableStackPolyfill2, AsyncDisposableStack2, SuppressedErrorPolyfill2, SuppressedError22, init_disposable2, EventEmitter4, init_EventEmitter2, isNode2, environment2, init_environment2, assert3, init_assert2, init_encoding2, packageVersion3, init_version2, require_ms2, require_common5, require_browser2, require_has_flag2, require_supports_color2, require_node4, require_src2, debugModule2, debug6, capturedLogs2, captureLogs2, init_Debug2, PuppeteerError2, TimeoutError3, TouchError2, ProtocolError2, UnsupportedOperation2, TargetCloseError2, ConnectionClosedError2, init_Errors2, paperFormats2, init_PDFOptions2, debugError2, DEFAULT_VIEWPORT2, SOURCE_URL2, PuppeteerURL2, withSourcePuppeteerURLIfNone2, getSourcePuppeteerURLIfAvailable2, isString2, isNumber3, isPlainObject2, isRegExp2, isDate2, VALID_DIALOG_TYPES2, UTILITY_WORLD_NAME2, SOURCE_URL_REGEX2, NETWORK_IDLE_TIME2, unitToPixels2, init_util4, WEB_PERMISSION_TO_PROTOCOL_PERMISSION2, Browser4, init_Browser5, Deferred2, init_Deferred2, Mutex2, init_Mutex2, BrowserContext2, init_BrowserContext4, CDPSessionEvent2, CDPSession2, init_CDPSession3, DeviceRequestPrompt2, init_DeviceRequestPrompt4, Dialog2, init_Dialog4, AsyncIterableUtil2, init_AsyncIterableUtil2, _isElementHandle2, init_ElementHandleSymbol2, init_ErrorLike2, createdFunctions2, createFunction2, interpolateFunction2, init_Function2, __addDisposableResource21, __disposeResources21, DEFAULT_BATCH_SIZE2, init_HandleIterator2, LazyArg2, init_LazyArg2, __addDisposableResource22, __disposeResources22, QueryHandler2, init_QueryHandler2, isKnownAttribute2, ATTRIBUTE_REGEXP2, parseARIASelector2, ARIAQueryHandler2, init_AriaQueryHandler2, CSSQueryHandler2, init_CSSQueryHandler2, source2, init_injected2, ScriptInjector2, scriptInjector2, init_ScriptInjector2, CustomQueryHandlerRegistry2, customQueryHandlers2, init_CustomQueryHandler2, PierceQueryHandler2, init_PierceQueryHandler2, PQueryHandler2, init_PQueryHandler2, TOKENS2, TRIM_TOKENS2, getArgumentPatternByType2, STRING_PATTERN2, ESCAPE_PATTERN2, init_parsel_js2, ESCAPE_REGEXP2, unquote2, init_PSelectorParser2, TextQueryHandler2, init_TextQueryHandler2, XPathQueryHandler2, init_XPathQueryHandler2, BUILTIN_QUERY_HANDLERS2, QUERY_SEPARATORS2, init_GetQueryHandler2, __addDisposableResource32, __disposeResources32, instances2, bubbleHandlers2, bubbleInitializer2, init_decorators2, __runInitializers24, __esDecorate24, __addDisposableResource42, __disposeResources42, JSHandle2, init_JSHandle4, __addDisposableResource52, __disposeResources52, LocatorEvent2, Locator2, FunctionLocator2, DelegatedLocator2, FilteredLocator2, MappedLocator2, NodeLocator2, RaceLocator2, RETRY_DELAY2, init_locators2, __runInitializers25, __esDecorate25, __addDisposableResource62, __disposeResources62, __setFunctionName7, ElementHandle2, init_ElementHandle4, __runInitializers32, __esDecorate32, __addDisposableResource72, __disposeResources72, FrameEvent2, throwIfDetached2, Frame2, init_Frame4, DEFAULT_INTERCEPT_RESOLUTION_PRIORITY2, HTTPRequest2, InterceptResolutionAction2, STATUS_TEXTS2, errorReasons2, init_HTTPRequest4, HTTPResponse2, init_HTTPResponse4, init_incremental_id_generator2, Keyboard2, MouseButton2, Mouse2, Touchscreen2, init_Input4, DEFAULT_TIMEOUT2, TimeoutSettings2, init_TimeoutSettings2, __runInitializers42, __esDecorate42, __addDisposableResource82, __disposeResources82, Page2, supportedMetrics3, init_Page4, WaitTask2, TaskManager2, init_WaitTask2, Realm3, init_Realm4, TargetType2, Target2, init_Target4, WebWorker2, init_WebWorker4, init_api2, __addDisposableResource92, __disposeResources92, Accessibility2, AXNode2, init_Accessibility2, __addDisposableResource102, __disposeResources102, Binding2, init_Binding2, CdpBluetoothEmulation2, init_BluetoothEmulation3, ConsoleMessage2, init_ConsoleMessage2, FileChooser2, init_FileChooser2, NetworkManagerEvent2, init_NetworkManagerEvents2, CallbackRegistry2, Callback2, init_CallbackRegistry2, CdpCDPSession2, init_CdpSession2, debugProtocolSend3, debugProtocolReceive3, Connection2, init_Connection3, Coverage2, JSCoverage2, CSSCoverage2, init_Coverage2, CdpDialog2, init_Dialog22, __runInitializers52, __esDecorate52, __setFunctionName22, EmulatedState2, EmulationManager2, init_EmulationManager2, CdpPreloadScript2, init_CdpPreloadScript2, CdpDeviceRequestPrompt2, CdpDeviceRequestPromptManager2, init_DeviceRequestPrompt22, getErrorDetails2, CDP_BINDING_PREFIX2, init_utils2, CdpJSHandle2, init_JSHandle22, __runInitializers62, __esDecorate62, NON_ELEMENT_NODE_ROLES2, CdpElementHandle2, init_ElementHandle22, __addDisposableResource112, __disposeResources112, ariaQuerySelectorBinding2, ariaQuerySelectorAllBinding2, ExecutionContext2, rewriteError22, init_ExecutionContext2, FrameManagerEvent2, init_FrameManagerEvents2, IsolatedWorld2, init_IsolatedWorld2, MAIN_WORLD2, PUPPETEER_WORLD2, init_IsolatedWorlds2, puppeteerToProtocolLifecycle2, LifecycleWatcher2, init_LifecycleWatcher2, __runInitializers72, __esDecorate72, CdpFrame2, init_Frame22, FrameTree2, init_FrameTree2, CdpHTTPRequest2, init_HTTPRequest22, SecurityDetails2, init_SecurityDetails2, CdpHTTPResponse2, init_HTTPResponse22, NetworkEventManager2, init_NetworkEventManager2, NetworkManager2, init_NetworkManager2, TIME_FOR_WAITING_FOR_SWAP2, FrameManager2, init_FrameManager2, _keyDefinitions2, init_USKeyboardLayout2, CdpKeyboard2, getFlag2, getButtonFromPressedButtons2, CdpMouse2, CdpTouchHandle2, CdpTouchscreen2, init_Input22, Tracing2, init_Tracing2, CdpWebWorker2, init_WebWorker22, __addDisposableResource122, __disposeResources122, CdpPage2, supportedMetrics22, init_Page22, __addDisposableResource132, __disposeResources132, CdpBrowserContext2, init_BrowserContext22, InitializationStatus2, CdpTarget2, PageTarget2, DevToolsTarget2, WorkerTarget2, OtherTarget2, init_Target22, TargetManager2, init_TargetManager2, CdpBrowser2, init_Browser22, init_BrowserConnector4, tabTargetInfo2, pageTargetInfo2, ExtensionTransport2, init_ExtensionTransport2, PredefinedNetworkConditions2, init_PredefinedNetworkConditions2, init_TargetManageEvents2, init_cdp2, BrowserWebSocketTransport_exports2, BrowserWebSocketTransport2, init_BrowserWebSocketTransport2, knownDevices2, knownDevicesByName2, KnownDevices2, init_Device2, mitt_exports2, init_mitt22, require_EventEmitter2, require_log2, require_ProcessingQueue2, require_cdp2, require_chromium_bidi2, require_webdriver_bidi2, require_ErrorResponse2, require_webdriver_bidi_permissions2, require_webdriver_bidi_bluetooth2, require_webdriver_bidi_nav_speculation2, require_webdriver_bidi_ua_client_hints2, require_protocol2, require_BidiNoOpParser2, require_BrowserProcessor2, require_CdpProcessor2, require_BrowsingContextProcessor2, require_EmulationProcessor2, require_assert2, require_graphemeTools2, require_InputSource2, require_keyUtils2, require_USKeyboardLayout2, require_ActionDispatcher2, require_Mutex2, require_InputState2, require_InputStateManager2, require_InputProcessor2, require_base644, require_NetworkUtils2, require_NetworkProcessor2, require_PermissionsProcessor2, require_uuid2, require_ChannelProxy2, require_PreloadScript2, require_ScriptProcessor2, require_SessionProcessor2, require_StorageProcessor2, require_WebExtensionProcessor2, require_OutgoingMessage2, require_CommandProcessor2, require_BluetoothProcessor2, require_ContextConfig2, require_ContextConfigStorage2, require_UserContextStorage2, require_Deferred2, require_time2, require_unitConversions2, require_SharedId2, require_Realm2, require_WindowRealm2, require_urlHelpers2, require_NavigationTracker2, require_BrowsingContextImpl2, require_WorkerRealm2, require_logHelper2, require_LogManager2, require_CollectorsStorage2, require_DefaultMap2, require_NetworkRequest2, require_NetworkStorage2, require_CdpTarget2, require_CdpTargetManager2, require_BrowsingContextStorage2, require_PreloadScriptStorage2, require_RealmStorage2, require_Buffer2, require_IdWrapper2, require_events2, require_SubscriptionManager2, require_EventManager2, require_SpeculationProcessor2, require_BidiServer2, require_BidiMapper2, BidiCdpSession2, init_CDPSession22, debugProtocolSend22, debugProtocolReceive22, BidiConnection2, init_Connection22, BidiMapper2, bidiServerLogger2, CdpConnectionAdapter2, CDPClientAdapter2, NoOpTransport2, init_BidiOverCdp2, BidiBluetoothEmulation2, init_BluetoothEmulation22, BidiDeviceRequestPromptManager2, BidiDeviceRequestPrompt2, init_DeviceRequestPrompt32, __runInitializers82, __esDecorate82, Navigation2, init_Navigation2, __runInitializers92, __esDecorate92, _a32, Realm22, WindowRealm2, DedicatedWorkerRealm2, SharedWorkerRealm2, init_Realm22, __runInitializers102, __esDecorate102, Request22, init_Request2, __runInitializers112, __esDecorate112, UserPrompt2, init_UserPrompt2, __runInitializers122, __esDecorate122, BrowsingContext2, init_BrowsingContext2, __runInitializers132, __esDecorate132, UserContext2, init_UserContext2, BidiDeserializer2, init_Deserializer2, BidiJSHandle2, init_JSHandle32, __runInitializers142, __esDecorate142, __addDisposableResource142, __disposeResources142, BidiElementHandle2, init_ElementHandle32, BidiDialog2, init_Dialog32, __addDisposableResource152, __disposeResources152, ExposableFunction2, init_ExposedFunction2, __runInitializers152, __esDecorate152, BidiHTTPResponse2, init_HTTPResponse32, _a4, requests2, BidiHTTPRequest2, init_HTTPRequest32, UnserializableError2, BidiSerializer2, init_Serializer2, init_util22, __addDisposableResource162, __disposeResources162, BidiRealm2, BidiFrameRealm2, BidiWorkerRealm2, init_Realm32, BidiWebWorker2, init_WebWorker32, __runInitializers162, __esDecorate162, __setFunctionName32, BidiFrame2, init_Frame32, SourceActionsType2, ActionType2, getBidiKeyValue2, BidiKeyboard2, getBidiButton2, BidiMouse2, BidiTouchHandle2, BidiTouchscreen2, init_Input32, __esDecorate172, __runInitializers172, __addDisposableResource172, __disposeResources172, BidiPage2, CDP_SPECIFIC_PREFIX2, init_Page32, BidiBrowserTarget2, BidiPageTarget2, BidiFrameTarget2, BidiWorkerTarget2, init_Target32, __esDecorate182, __runInitializers182, __addDisposableResource182, __disposeResources182, BidiBrowserContext2, init_BrowserContext32, __runInitializers192, __esDecorate192, __addDisposableResource192, __disposeResources192, Browser22, init_Browser32, __runInitializers202, __esDecorate202, Session2, init_Session2, __esDecorate212, __runInitializers212, __setFunctionName42, BidiBrowser2, init_Browser42, bidi_exports2, init_bidi2, init_BrowserConnector22, require_constants7, require_buffer_util2, require_limiter2, require_permessage_deflate2, require_validation2, require_receiver2, require_sender2, require_event_target2, require_extension2, require_websocket2, require_stream2, require_subprotocol2, require_websocket_server2, import_stream4, import_receiver2, import_sender2, import_websocket2, import_websocket_server2, wrapper_default2, init_wrapper2, NodeWebSocketTransport_exports2, NodeWebSocketTransport2, init_NodeWebSocketTransport2, Browser32, BrowserPlatform2, BrowserTag2, ChromeReleaseChannel2, init_types2, require_constants22, require_debug3, require_re2, require_parse_options2, require_identifiers2, require_semver3, require_parse32, require_valid3, require_clean2, require_inc2, require_diff2, require_major2, require_minor2, require_patch2, require_prerelease2, require_compare2, require_rcompare2, require_compare_loose2, require_compare_build2, require_sort2, require_rsort2, require_gt2, require_lt2, require_eq2, require_neq2, require_gte2, require_lte2, require_cmp2, require_coerce2, require_lrucache2, require_range2, require_comparator2, require_satisfies2, require_to_comparators2, require_max_satisfying2, require_min_satisfying2, require_min_version2, require_valid22, require_outside2, require_gtr2, require_ltr2, require_intersects2, require_simplify2, require_subset2, require_semver22, require_lru_cache2, require_helpers4, require_dist13, require_proxy_from_env2, require_dist22, require_parse_proxy_response2, require_dist32, require_utils3, require_smartbuffer2, require_constants32, require_util6, require_common22, require_constants42, require_address_error2, require_ipv42, require_constants52, require_helpers22, require_regular_expressions2, require_ipv62, require_ip_address2, require_helpers32, require_receivebuffer2, require_socksclient2, require_build3, require_dist42, require_common32, require_node22, require_notmodified2, require_data2, require_notfound2, require_file2, require_parseControlResponse2, require_FtpContext2, require_FileInfo2, require_parseListDOS2, require_parseListUnix2, require_parseListMLSD2, require_parseList2, require_ProgressTracker2, require_StringWriter2, require_netUtils2, require_transfer2, require_Client2, require_StringEncoding2, require_dist52, require_ftp2, require_http_error2, require_http2, require_https2, require_dist62, require_estraverse2, require_ast2, require_code2, require_keyword3, require_utils22, require_base6422, require_base64_vlq3, require_util22, require_array_set3, require_mapping_list3, require_source_map_generator3, require_binary_search3, require_quick_sort3, require_source_map_consumer3, require_source_node3, require_source_map3, require_package2, require_escodegen2, require_esprima3, tslib_es6_exports2, extendStatics22, __assign2, __createBinding2, __setModuleDefault2, ownKeys2, _SuppressedError2, tslib_es6_default2, init_tslib_es62, require_types22, require_path2, require_scope2, require_node_path2, require_path_visitor2, require_equiv2, require_fork2, require_shared2, require_core3, require_es62, require_es72, require_es20202, require_jsx2, require_type_annotations2, require_flow2, require_esprima22, require_babel_core2, require_babel2, require_typescript3, require_es_proposals2, require_namedTypes2, require_main3, require_degenerator2, require_compile2, require_dist72, require_dateRange2, require_dnsDomainIs2, require_dnsDomainLevels2, require_util32, require_dnsResolve2, require_netmask2, require_isInNet2, require_isPlainHostName2, require_isResolvable2, require_localHostOrDomainIs2, require_ip2, require_myIpAddress2, require_shExpMatch2, require_timeRange2, require_weekdayRange2, require_dist82, require_esmHelpers2, require_debug22, require_errors2, require_asyncify_helpers2, require_lifetime2, require_deferred_promise2, require_memory2, require_types_ffi2, require_types32, require_context2, require_runtime2, require_module2, require_context_asyncify2, require_runtime_asyncify2, require_module_asyncify2, require_ffi_WASM_RELEASE_SYNC2, require_emscripten_module_WASM_RELEASE_SYNC2, require_variants2, require_vm_interface2, require_module_test2, require_dist92, require_dist102, require_dist112, import_proxy_agent2, init_httpUtil2, import_semver2, baseVersionUrl3, WINDOWS_ENV_PARAM_NAMES2, init_chrome2, init_chrome_headless_shell2, init_chromedriver2, init_chromium2, FirefoxChannel2, baseVersionUrl22, init_firefox2, downloadUrls2, downloadPaths2, executablePathByBrowser2, versionComparators2, init_browser_data2, init_detectPlatform2, import_debug7, debugCache2, InstalledBrowser2, Cache2, init_Cache2, import_debug22, init_debug2, debugLaunch2, CDP_WEBSOCKET_ENDPOINT_REGEX2, WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX2, processListeners2, dispatchers2, Process2, PROCESS_ERROR_EXPLANATION2, TimeoutError22, init_launch2, require_node_progress2, require_progress2, DefaultProvider2, init_DefaultProvider2, require_wrappy2, require_once2, require_end_of_stream2, require_pump2, require_buffer_stream2, require_get_stream2, require_pend2, require_fd_slicer2, require_buffer_crc322, require_yauzl2, require_extract_zip2, require_default3, require_fixed_size2, require_fast_fifo2, require_b4a2, require_pass_through_decoder2, require_utf8_decoder2, require_text_decoder2, require_streamx2, require_headers2, require_extract2, require_constants62, require_pack2, require_tar_stream2, require_tar_fs2, import_debug42, debugFileUtil2, internalConstantsForTesting2, init_fileUtil2, import_progress2, debugInstall2, times2, init_install2, align2, top2, right2, bottom2, left2, UI2, mixin3, init_lib4, ansi2, init_string_utils3, init_cliui2, init_sync2, init_string_utils22, init_tokenize_arg_string2, DefaultValuesForTypeKey2, init_yargs_parser_types2, mixin22, YargsParser2, init_yargs_parser2, _a5, _b2, _c2, minNodeVersion2, nodeVersion2, env3, parser2, yargsParser2, lib_default2, init_lib22, init_process_argv2, YError2, init_yerror2, node_default2, init_node3, shim3, Y18N2, init_lib32, y18n22, y18n_default2, init_y18n2, REQUIRE_ERROR2, REQUIRE_DIRECTORY_ERROR2, __dirname22, mainFilename2, esm_default3, init_esm3, init_common_types2, init_is_promise2, init_parse_command2, positionName2, init_argsert2, GlobalMiddleware2, init_middleware2, init_maybe_async_result2, init_which_module2, DEFAULT_MARKER2, CommandInstance2, init_command2, init_obj_filter2, init_set_blocking2, init_usage2, completionShTemplate2, completionZshTemplate2, init_completion_templates2, Completion2, init_completion2, init_levenshtein2, specialKeys2, init_validation2, previouslyVisitedConfigs2, shim22, init_apply_extends2, __classPrivateFieldSet22, __classPrivateFieldGet22, _YargsInstance_command2, _YargsInstance_cwd2, _YargsInstance_context2, _YargsInstance_completion2, _YargsInstance_completionCommand2, _YargsInstance_defaultShowHiddenOpt2, _YargsInstance_exitError2, _YargsInstance_detectLocale2, _YargsInstance_emittedWarnings2, _YargsInstance_exitProcess2, _YargsInstance_frozens2, _YargsInstance_globalMiddleware2, _YargsInstance_groups2, _YargsInstance_hasOutput2, _YargsInstance_helpOpt2, _YargsInstance_isGlobalContext2, _YargsInstance_logger2, _YargsInstance_output2, _YargsInstance_options2, _YargsInstance_parentRequire2, _YargsInstance_parserConfig2, _YargsInstance_parseFn2, _YargsInstance_parseContext2, _YargsInstance_pkgs2, _YargsInstance_preservedGroups2, _YargsInstance_processArgs2, _YargsInstance_recommendCommands2, _YargsInstance_shim2, _YargsInstance_strict2, _YargsInstance_strictCommands2, _YargsInstance_strictOptions2, _YargsInstance_usage2, _YargsInstance_usageConfig2, _YargsInstance_versionOpt2, _YargsInstance_validation2, kCopyDoubleDash2, kCreateLogger2, kDeleteFromParserHintObject2, kEmitWarning2, kFreeze2, kGetDollarZero2, kGetParserConfiguration2, kGetUsageConfiguration2, kGuessLocale2, kGuessVersion2, kParsePositionalNumbers2, kPkgUp2, kPopulateParserHintArray2, kPopulateParserHintSingleValueDictionary2, kPopulateParserHintArrayDictionary2, kPopulateParserHintDictionary2, kSanitizeKey2, kSetKey2, kUnfreeze2, kValidateAsync2, kGetCommandInstance2, kGetContext2, kGetHasOutput2, kGetLoggerInstance2, kGetParseContext2, kGetUsageInstance2, kGetValidationInstance2, kHasParseCallback2, kIsGlobalContext2, kPostProcess2, kRebase2, kReset2, kRunYargsParserAndExecuteCommands2, kRunValidation2, kSetHasOutput2, kTrackManuallySetKeys2, YargsInstance2, init_yargs_factory2, yargs_exports2, Yargs2, yargs_default2, init_yargs2, helpers_exports2, applyExtends22, init_helpers2, packageVersion22, CLI2, init_CLI2, init_provider2, main_exports2, init_main2, LaunchOptions_exports2, init_LaunchOptions2, getWebSocketTransportClass2, init_BrowserConnector32, Puppeteer2, init_Puppeteer2, TaskQueue2, init_TaskQueue2, init_common2, PUPPETEER_REVISIONS2, init_revisions2, init_util32, init_index_browser2, PipeTransport2, init_PipeTransport2, BrowserLauncher2, init_BrowserLauncher2, rmOptions2, init_fs2, ChromeLauncher2, init_ChromeLauncher2, FirefoxLauncher2, init_FirefoxLauncher2, PuppeteerNode2, init_PuppeteerNode2, import_debug62, __runInitializers232, __esDecorate232, __setFunctionName62, CRF_VALUE2, DEFAULT_FPS2, debugFfmpeg2, ScreenRecorder2, init_ScreenRecorder2, init_node22, init_puppeteer3, puppeteer_core_exports, puppeteer3, connect3, defaultArgs3, executablePath3, launch22, puppeteer_core_default, init_puppeteer_core2, CHANGED, CLASS_LIST, CUSTOM_ELEMENTS, CONTENT, DATASET, DOCTYPE, DOM_PARSER, END, EVENT_TARGET, GLOBALS, IMAGE, MIME, MUTATION_OBSERVER, NEXT, OWNER_ELEMENT, PREV, PRIVATE, SHEET, START, STYLE, UPGRADE, VALUE, esm_exports3, _a6, decodeMap, fromCodePoint, htmlDecodeTree, xmlDecodeTree, BinTrieFlags, CharCodes, TO_LOWER_BIT, EntityDecoderState, DecodingMode, EntityDecoder, CharCodes2, State, QuoteType, Sequences, Tokenizer, formTags, pTag, tableSectionTags, ddtTags, rtpTags, openImpliesClose, voidElements, foreignContextElements, htmlIntegrationElements, reNameEnd, Parser2, esm_exports, ElementType, Root2, Text, Directive, Comment2, Script, Style, Tag, CDATA, Doctype, Node22, DataNode, Text2, Comment22, ProcessingInstruction, NodeWithChildren, CDATA2, Document22, Element2, defaultOpts, DomHandler, esm_exports2, decode_data_html_default, decode_data_xml_default, _a22, decodeMap2, fromCodePoint2, CharCodes3, TO_LOWER_BIT2, BinTrieFlags2, EntityDecoderState2, DecodingMode2, EntityDecoder2, htmlDecoder, xmlDecoder, encode_html_default, xmlReplacer, xmlCodeMap, getCodePoint, escapeUTF8, escapeAttribute, escapeText, EntityLevel, EncodingMode, elementNames, attributeNames, unencodedElements, singleTag, esm_default2, foreignModeIntegrationPoints, foreignElements, Checks, DocumentPosition, MEDIA_KEYS_STRING, MEDIA_KEYS_INT, parseFeedDefaultOptions, NODE_END, ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, DOCUMENT_FRAGMENT_NODE, BLOCK_ELEMENTS, SHOW_ALL, SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION, SHOW_COMMENT, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, SVG_NAMESPACE, assign, create, defineProperties, entries, getOwnPropertyDescriptors, keys, setPrototypeOf, $String, getEnd, ignoreCase, knownAdjacent, knownBoundaries, knownSegment, knownSiblings, localCase, setAdjacent, htmlToFragment, shadowRoots, reactive, Classes, customElements, attributeChangedCallback, createTrigger, triggerConnected, connectedCallback, triggerDisconnected, disconnectedCallback, CustomElementRegistry, Parser22, notParsing, append2, attribute, parseFromString, htmlClasses, registerHTMLClass, loopSegment, attrAsJSON, characterDataAsJSON, nonElementAsJSON, documentTypeAsJSON, elementAsJSON, createRecord, queueAttribute, attributeChangedCallback2, moCallback, MutationObserverClass, emptyAttributes, setAttribute, removeAttribute, booleanAttribute, numericAttribute, stringAttribute, wm, DOMEventTarget, NodeList, getParentNodeCount, Node3, replace, ca, esca, pe, escape2, QUOTE, Attr, isConnected, parentElement, previousSibling, nextSibling, nextElementSibling2, previousElementSibling, asFragment, before, after, replaceWith, remove, CharacterData, CDATASection, Comment3, import_boolbase6, import_css_what4, import_boolbase5, import_css_what, procedure, attributes, import_boolbase, reChars, caseInsensitiveAttributes, attributeRules, import_css_what2, whitespace, ZERO, NINE, import_boolbase2, import_boolbase3, filters, pseudos, aliases, import_boolbase4, PLACEHOLDER_ELEMENT, is, subselects, import_css_what3, DESCENDANT_TOKEN, FLEXIBLE_DESCENDANT_TOKEN, SCOPE_TOKEN, defaultEquals, defaultOptions, compile3, _compileUnsafe, _compileToken, selectAll, selectOne, isArray4, isTag3, existsOne2, getAttributeValue2, getChildren2, getName2, getParent2, getSiblings2, getText22, hasAttrib2, removeSubsets2, findAll2, findOne2, adapter, prepareMatch, matches, Text3, isNode3, insert, ParentNode, NonElementParentNode, DocumentFragment2, DocumentType, getInnerHtml, setInnerHtml, esm_default22, refs, key, prop, handler, DOMStringMap, add, addTokens, update, DOMTokenList, refs2, getKeys3, updateKeys, handler2, CSSStyleDeclaration, prototype, BUBBLING_PHASE, AT_TARGET, CAPTURING_PHASE, NONE, GlobalEvent, NamedNodeMap, ShadowRoot, attributesHandler, create2, isVoid, Element3, classNames, handler3, SVGElement2, illegalConstructor, Facades, Level0, level0, HTMLElement2, tagName, HTMLTemplateElement, HTMLHtmlElement, toString, TextElement, tagName2, HTMLScriptElement, HTMLFrameElement2, tagName3, HTMLIFrameElement2, HTMLObjectElement, HTMLHeadElement, HTMLBodyElement, import_cssom, tagName4, HTMLStyleElement, HTMLTimeElement, HTMLFieldSetElement, HTMLEmbedElement, HTMLHRElement, HTMLProgressElement, HTMLParagraphElement, HTMLTableElement, HTMLFrameSetElement, HTMLLIElement, HTMLBaseElement, HTMLDataListElement, tagName5, HTMLInputElement2, HTMLParamElement, HTMLMediaElement, HTMLAudioElement, tagName6, HTMLHeadingElement, HTMLDirectoryElement, HTMLQuoteElement, import_canvas, createCanvas, tagName7, HTMLCanvasElement, HTMLLegendElement, tagName8, HTMLOptionElement, HTMLSpanElement, HTMLMeterElement, HTMLVideoElement, HTMLTableCellElement, tagName9, HTMLTitleElement, HTMLOutputElement, HTMLTableRowElement, HTMLDataElement, HTMLMenuElement, tagName10, HTMLSelectElement2, HTMLBRElement, tagName11, HTMLButtonElement, HTMLMapElement, HTMLOptGroupElement, HTMLDListElement, tagName12, HTMLTextAreaElement2, HTMLFontElement, HTMLDivElement, tagName13, HTMLLinkElement, tagName14, HTMLSlotElement, HTMLFormElement, tagName15, HTMLImageElement, HTMLPreElement, HTMLUListElement, tagName16, HTMLMetaElement, HTMLPictureElement, HTMLAreaElement, HTMLOListElement, HTMLTableCaptionElement, tagName17, HTMLAnchorElement, HTMLLabelElement, HTMLUnknownElement, HTMLModElement, HTMLDetailsElement, tagName18, HTMLSourceElement, HTMLTrackElement, HTMLMarqueeElement, HTMLClasses, voidElements2, Mime, CustomEvent, InputEvent, ImageClass, deleteContents, Range, isOK, TreeWalker, query, globalExports, window2, Document3, createHTMLElement, HTMLDocument, SVGDocument, XMLDocument, DOMParser2, parse5, parseHTML, DEFAULT_CONFIG, _puppeteer, pooledBrowser, pooledBrowserRefCount, pooledCaptureMode, ENABLE_BROWSER_POOL, BEGINFRAME_ONLY_FLAGS, GSAP_METHODS, SUPPORTED_PROPS, TAG_PATTERN, STYLE_BLOCK_PATTERN, SCRIPT_BLOCK_PATTERN, COMPOSITION_ID_IN_CSS_PATTERN, TIMELINE_REGISTRY_INIT_PATTERN, TIMELINE_REGISTRY_ASSIGN_PATTERN, WINDOW_TIMELINE_ASSIGN_PATTERN, INVALID_SCRIPT_CLOSE_PATTERN, coreRules, mediaRules, META_GSAP_KEYS, gsapRules, captionRules, compositionRules, adapterRules, ALL_RULES, join42, resolve62, dirname42, PATH_ATTRS, CSS_URL_RE, MEDIA_VISUAL_STYLE_PROPERTIES, arabicScriptRe, combiningMarkRe, decimalDigitRe, emojiPresentationRe, cdpSessionCache, lastFrameCache, PENDING_FRAME_RETRIES, TRANSPARENT_BG_STYLE_ID, DOM_LAYER_MASK_STYLE_ID, BROWSER_CONSOLE_BUFFER_SIZE, cachedGpuEncoder, DEFAULT_TIMEOUT22, ENCODER_PRESETS, DEFAULT_HDR10_MASTERING, videoMetadataCache, audioMetadataCache, keyframeCache, downloadPathCache, inFlightDownloads, FrameLookupTable, MEMORY_PER_WORKER_MB, MIN_WORKERS, ABSOLUTE_MAX_WORKERS, DEFAULT_SAFE_MAX_WORKERS, MIN_FRAMES_PER_WORKER, compose, GET_MATCH_RESULT, parseBody, handleParsingAllValues, handleParsingNestedValues, splitPath, splitRoutingPath, extractGroupsFromPath, replaceGroupMarks, patternCache, getPattern, tryDecode, tryDecodeURI, getPath, getPathNoStrict, mergePath, checkOptionalParameter, _decodeURI, _getQueryParam, getQueryParam, getQueryParams, decodeURIComponent_, tryDecodeURIComponent, HonoRequest, HtmlEscapedCallbackPhase, raw, resolveCallback, TEXT_PLAIN, setDefaultContentType, createResponseInstance, Context, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError, COMPOSED_HANDLER, notFoundHandler, errorHandler, Hono, emptyParam, LABEL_REG_EXP_STR, ONLY_WILDCARD_REG_EXP_STR, TAIL_WILDCARD_REG_EXP_STR, PATH_ERROR, regExpMetaChars, Node5, Trie, nullMatcher, wildcardRegExpCache, RegExpRouter, SmartRouter, emptyParams, hasChildren2, Node6, TrieRouter, Hono2, RequestError, toRequestError, GlobalRequest, Request3, newHeadersFromIncoming, wrapBodyStream, newRequestFromIncoming, getRequestCache, requestCache, incomingKey, urlKey, headersKey, abortControllerKey, getAbortController, requestPrototype, newRequest, responseCache, getResponseCache, cacheKey, GlobalResponse, Response2, buildOutgoingHttpHeaders, X_ALREADY_SENT, outgoingEnded, handleRequestError, handleFetchError, handleResponseError, flushHeaders, responseViaCache, isPromise32, responseViaResponseObject, getRequestListener, createAdaptorServer, serve, SRGB_TO_HLG, SRGB_TO_PQ, PQ_M1, PQ_M2, PQ_C1, PQ_C2, PQ_C3, HLG_OOTF_LW, HLG_OOTF_GAMMA, hlgToPqLut, pqToHlgLut, ROT_A, ROT_B, TRANSITIONS, crossfade, flashThroughWhite, chromaticSplit, sdfIris, glitch, lightLeak, crossWarpMorph, whipPan, cinematicZoom, gravitationalLens, rippleWaves, swirlVortex, thermalDistortion, domainWarp, ridgedBurn, PRODUCER_DIR, SIBLING_MANIFEST_PATH, MODULE_RELATIVE_MANIFEST_PATH, CWD_RELATIVE_MANIFEST_PATHS, MIME_TYPES, VIRTUAL_TIME_SHIM, RENDER_SEEK_MODE, RENDER_SEEK_DIAGNOSTICS, RENDER_SEEK_STEP, RENDER_SEEK_OFFSET_FRACTION, RENDER_MODE_SCRIPT, HF_EARLY_STUB, HF_BRIDGE_SCRIPT, DEFAULT_RENDERS_DIR, EMBEDDED_FONT_DATA, GENERIC_FAMILIES, CANONICAL_FONTS, FONT_ALIASES, GOOGLE_FONTS_CACHE_DIR, WOFF2_USER_AGENT, INLINE_SCRIPT_PATTERN, LOG_LEVEL_PRIORITY, defaultLogger, frameDirMaxIndexCache, FRAME_FILENAME_RE, RenderCancelledError, StreamingApi, isOldBunVersion, SSEStreamingApi, run, contextStash, streamSSE, Semaphore, entryScript, isPublicServerEntry;
|
|
332403
334000
|
var init_dist = __esm({
|
|
332404
|
-
"../../node_modules/.pnpm/@hyperframes+producer@0.4.
|
|
334001
|
+
"../../node_modules/.pnpm/@hyperframes+producer@0.4.10_typescript@5.9.3/node_modules/@hyperframes/producer/dist/index.js"() {
|
|
332405
334002
|
import_esbuild = __toESM(require_main(), 1);
|
|
332406
334003
|
init_postcss();
|
|
332407
334004
|
__create2 = Object.create;
|
|
@@ -335934,12 +337531,12 @@ var init_dist = __esm({
|
|
|
335934
337531
|
createDebug.skips = [];
|
|
335935
337532
|
createDebug.formatters = {};
|
|
335936
337533
|
function selectColor(namespace) {
|
|
335937
|
-
let
|
|
337534
|
+
let hash2 = 0;
|
|
335938
337535
|
for (let i = 0; i < namespace.length; i++) {
|
|
335939
|
-
|
|
335940
|
-
|
|
337536
|
+
hash2 = (hash2 << 5) - hash2 + namespace.charCodeAt(i);
|
|
337537
|
+
hash2 |= 0;
|
|
335941
337538
|
}
|
|
335942
|
-
return createDebug.colors[Math.abs(
|
|
337539
|
+
return createDebug.colors[Math.abs(hash2) % createDebug.colors.length];
|
|
335943
337540
|
}
|
|
335944
337541
|
createDebug.selectColor = selectColor;
|
|
335945
337542
|
function createDebug(namespace) {
|
|
@@ -383050,25 +384647,25 @@ ${sourceUrlComment}
|
|
|
383050
384647
|
var notmodified_1 = __importDefault22(require_notmodified2());
|
|
383051
384648
|
var debug62 = (0, debug_1.default)("get-uri:data");
|
|
383052
384649
|
var DataReadable = class extends stream_1.Readable {
|
|
383053
|
-
constructor(
|
|
384650
|
+
constructor(hash2, buf) {
|
|
383054
384651
|
super();
|
|
383055
384652
|
this.push(buf);
|
|
383056
384653
|
this.push(null);
|
|
383057
|
-
this.hash =
|
|
384654
|
+
this.hash = hash2;
|
|
383058
384655
|
}
|
|
383059
384656
|
};
|
|
383060
384657
|
var data = async ({ href: uri }, { cache } = {}) => {
|
|
383061
384658
|
const shasum = (0, crypto_1.createHash)("sha1");
|
|
383062
384659
|
shasum.update(uri);
|
|
383063
|
-
const
|
|
383064
|
-
debug62('generated SHA1 hash for "data:" URI: %o',
|
|
383065
|
-
if (cache?.hash ===
|
|
383066
|
-
debug62("got matching cache SHA1 hash: %o",
|
|
384660
|
+
const hash2 = shasum.digest("hex");
|
|
384661
|
+
debug62('generated SHA1 hash for "data:" URI: %o', hash2);
|
|
384662
|
+
if (cache?.hash === hash2) {
|
|
384663
|
+
debug62("got matching cache SHA1 hash: %o", hash2);
|
|
383067
384664
|
throw new notmodified_1.default();
|
|
383068
384665
|
} else {
|
|
383069
384666
|
debug62('creating Readable stream from "data:" URI buffer');
|
|
383070
384667
|
const { buffer } = (0, data_uri_to_buffer_1.dataUriToBuffer)(uri);
|
|
383071
|
-
return new DataReadable(
|
|
384668
|
+
return new DataReadable(hash2, Buffer.from(buffer));
|
|
383072
384669
|
}
|
|
383073
384670
|
};
|
|
383074
384671
|
exports.data = data;
|
|
@@ -386508,7 +388105,7 @@ Closing reason: ${this._closingError.stack}`;
|
|
|
386508
388105
|
}
|
|
386509
388106
|
path122 = url.path;
|
|
386510
388107
|
}
|
|
386511
|
-
var
|
|
388108
|
+
var isAbsolute32 = exports.isAbsolute(path122);
|
|
386512
388109
|
var parts = path122.split(/\/+/);
|
|
386513
388110
|
for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
|
|
386514
388111
|
part = parts[i];
|
|
@@ -386528,7 +388125,7 @@ Closing reason: ${this._closingError.stack}`;
|
|
|
386528
388125
|
}
|
|
386529
388126
|
path122 = parts.join("/");
|
|
386530
388127
|
if (path122 === "") {
|
|
386531
|
-
path122 =
|
|
388128
|
+
path122 = isAbsolute32 ? "/" : ".";
|
|
386532
388129
|
}
|
|
386533
388130
|
if (url) {
|
|
386534
388131
|
url.path = path122;
|
|
@@ -386573,7 +388170,7 @@ Closing reason: ${this._closingError.stack}`;
|
|
|
386573
388170
|
exports.isAbsolute = function(aPath) {
|
|
386574
388171
|
return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
|
|
386575
388172
|
};
|
|
386576
|
-
function
|
|
388173
|
+
function relative32(aRoot, aPath) {
|
|
386577
388174
|
if (aRoot === "") {
|
|
386578
388175
|
aRoot = ".";
|
|
386579
388176
|
}
|
|
@@ -386592,7 +388189,7 @@ Closing reason: ${this._closingError.stack}`;
|
|
|
386592
388189
|
}
|
|
386593
388190
|
return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
|
|
386594
388191
|
}
|
|
386595
|
-
exports.relative =
|
|
388192
|
+
exports.relative = relative32;
|
|
386596
388193
|
var supportsNullProto = (function() {
|
|
386597
388194
|
var obj = /* @__PURE__ */ Object.create(null);
|
|
386598
388195
|
return !("__proto__" in obj);
|
|
@@ -403454,14 +405051,14 @@ Attempted to suspend at:`);
|
|
|
403454
405051
|
(0, quickjs_emscripten_1.getQuickJS)(),
|
|
403455
405052
|
this.loadPacFile()
|
|
403456
405053
|
]);
|
|
403457
|
-
const
|
|
403458
|
-
if (this.resolver && this.resolverHash ===
|
|
405054
|
+
const hash2 = crypto3.createHash("sha1").update(code).digest("hex");
|
|
405055
|
+
if (this.resolver && this.resolverHash === hash2) {
|
|
403459
405056
|
debug62("Same sha1 hash for code - contents have not changed, reusing previous proxy resolver");
|
|
403460
405057
|
return this.resolver;
|
|
403461
405058
|
}
|
|
403462
405059
|
debug62("Creating new proxy resolver instance");
|
|
403463
405060
|
this.resolver = (0, pac_resolver_1.createPacResolver)(qjs, code, this.opts);
|
|
403464
|
-
this.resolverHash =
|
|
405061
|
+
this.resolverHash = hash2;
|
|
403465
405062
|
return this.resolver;
|
|
403466
405063
|
} catch (err) {
|
|
403467
405064
|
if (this.resolver && err.code === "ENOTMODIFIED") {
|
|
@@ -421802,6 +423399,8 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
|
|
|
421802
423399
|
ffmpegEncodeTimeout: 6e5,
|
|
421803
423400
|
ffmpegProcessTimeout: 3e5,
|
|
421804
423401
|
ffmpegStreamingTimeout: 6e5,
|
|
423402
|
+
hdr: false,
|
|
423403
|
+
hdrAutoDetect: true,
|
|
421805
423404
|
audioGain: 1.35,
|
|
421806
423405
|
frameDataUriCacheLimit: 256,
|
|
421807
423406
|
playerReadyTimeout: 45e3,
|
|
@@ -422109,6 +423708,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
|
|
|
422109
423708
|
const timedTagPositions = [];
|
|
422110
423709
|
for (const tag of tags) {
|
|
422111
423710
|
if (tag.name === "video" || tag.name === "audio") continue;
|
|
423711
|
+
if (readAttr(tag.raw, "data-composition-id")) continue;
|
|
422112
423712
|
if (readAttr(tag.raw, "data-start")) {
|
|
422113
423713
|
timedTagPositions.push({
|
|
422114
423714
|
name: tag.name,
|
|
@@ -423004,6 +424604,7 @@ ${right22.raw}`)
|
|
|
423004
424604
|
...compositionRules,
|
|
423005
424605
|
...adapterRules
|
|
423006
424606
|
];
|
|
424607
|
+
({ join: join42, resolve: resolve62, dirname: dirname42 } = posix);
|
|
423007
424608
|
PATH_ATTRS = ["src", "href"];
|
|
423008
424609
|
CSS_URL_RE = /\burl\(\s*(["']?)([^)"']+)\1\s*\)/g;
|
|
423009
424610
|
MEDIA_VISUAL_STYLE_PROPERTIES = [
|
|
@@ -423041,6 +424642,8 @@ ${right22.raw}`)
|
|
|
423041
424642
|
cdpSessionCache = /* @__PURE__ */ new WeakMap();
|
|
423042
424643
|
lastFrameCache = /* @__PURE__ */ new WeakMap();
|
|
423043
424644
|
PENDING_FRAME_RETRIES = 5;
|
|
424645
|
+
TRANSPARENT_BG_STYLE_ID = "__hf_transparent_bg__";
|
|
424646
|
+
DOM_LAYER_MASK_STYLE_ID = "__hf_dom_layer_mask__";
|
|
423044
424647
|
BROWSER_CONSOLE_BUFFER_SIZE = 200;
|
|
423045
424648
|
cachedGpuEncoder = void 0;
|
|
423046
424649
|
DEFAULT_TIMEOUT22 = 3e5;
|
|
@@ -423049,6 +424652,10 @@ ${right22.raw}`)
|
|
|
423049
424652
|
standard: { preset: "medium", quality: 18, codec: "h264" },
|
|
423050
424653
|
high: { preset: "slow", quality: 15, codec: "h264" }
|
|
423051
424654
|
};
|
|
424655
|
+
DEFAULT_HDR10_MASTERING = {
|
|
424656
|
+
masterDisplay: "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)",
|
|
424657
|
+
maxCll: "1000,400"
|
|
424658
|
+
};
|
|
423052
424659
|
videoMetadataCache = /* @__PURE__ */ new Map();
|
|
423053
424660
|
audioMetadataCache = /* @__PURE__ */ new Map();
|
|
423054
424661
|
keyframeCache = /* @__PURE__ */ new Map();
|
|
@@ -425543,6 +427150,485 @@ ${right22.raw}`)
|
|
|
425543
427150
|
});
|
|
425544
427151
|
return server3;
|
|
425545
427152
|
};
|
|
427153
|
+
SRGB_TO_HLG = buildSrgbToHdrLut("hlg");
|
|
427154
|
+
SRGB_TO_PQ = buildSrgbToHdrLut("pq");
|
|
427155
|
+
PQ_M1 = 0.1593017578125;
|
|
427156
|
+
PQ_M2 = 78.84375;
|
|
427157
|
+
PQ_C1 = 0.8359375;
|
|
427158
|
+
PQ_C2 = 18.8515625;
|
|
427159
|
+
PQ_C3 = 18.6875;
|
|
427160
|
+
HLG_OOTF_LW = 1e3;
|
|
427161
|
+
HLG_OOTF_GAMMA = 1.2 * Math.pow(1.111, Math.log2(HLG_OOTF_LW / 1e3));
|
|
427162
|
+
hlgToPqLut = null;
|
|
427163
|
+
pqToHlgLut = null;
|
|
427164
|
+
ROT_A = 0.8;
|
|
427165
|
+
ROT_B = 0.6;
|
|
427166
|
+
TRANSITIONS = {};
|
|
427167
|
+
crossfade = (from22, to, out, w, h, p) => {
|
|
427168
|
+
const inv = 1 - p;
|
|
427169
|
+
for (let i = 0; i < w * h; i++) {
|
|
427170
|
+
const o = i * 6;
|
|
427171
|
+
out.writeUInt16LE(Math.round(from22.readUInt16LE(o) * inv + to.readUInt16LE(o) * p), o);
|
|
427172
|
+
out.writeUInt16LE(
|
|
427173
|
+
Math.round(from22.readUInt16LE(o + 2) * inv + to.readUInt16LE(o + 2) * p),
|
|
427174
|
+
o + 2
|
|
427175
|
+
);
|
|
427176
|
+
out.writeUInt16LE(
|
|
427177
|
+
Math.round(from22.readUInt16LE(o + 4) * inv + to.readUInt16LE(o + 4) * p),
|
|
427178
|
+
o + 4
|
|
427179
|
+
);
|
|
427180
|
+
}
|
|
427181
|
+
};
|
|
427182
|
+
TRANSITIONS["crossfade"] = crossfade;
|
|
427183
|
+
flashThroughWhite = (from22, to, out, w, h, p) => {
|
|
427184
|
+
const toWhite = smoothstep(0, 0.45, p);
|
|
427185
|
+
const fromWhite = 1 - smoothstep(0.5, 1, p);
|
|
427186
|
+
const blend = smoothstep(0.35, 0.65, p);
|
|
427187
|
+
for (let i = 0; i < w * h; i++) {
|
|
427188
|
+
const o = i * 6;
|
|
427189
|
+
const fromR = mix16(from22.readUInt16LE(o), 65535, toWhite);
|
|
427190
|
+
const fromG = mix16(from22.readUInt16LE(o + 2), 65535, toWhite);
|
|
427191
|
+
const fromB = mix16(from22.readUInt16LE(o + 4), 65535, toWhite);
|
|
427192
|
+
const toR = mix16(to.readUInt16LE(o), 65535, fromWhite);
|
|
427193
|
+
const toG = mix16(to.readUInt16LE(o + 2), 65535, fromWhite);
|
|
427194
|
+
const toB = mix16(to.readUInt16LE(o + 4), 65535, fromWhite);
|
|
427195
|
+
out.writeUInt16LE(mix16(fromR, toR, blend), o);
|
|
427196
|
+
out.writeUInt16LE(mix16(fromG, toG, blend), o + 2);
|
|
427197
|
+
out.writeUInt16LE(mix16(fromB, toB, blend), o + 4);
|
|
427198
|
+
}
|
|
427199
|
+
};
|
|
427200
|
+
TRANSITIONS["flash-through-white"] = flashThroughWhite;
|
|
427201
|
+
chromaticSplit = (from22, to, out, w, h, p) => {
|
|
427202
|
+
for (let i = 0; i < w * h; i++) {
|
|
427203
|
+
const ux = i % w / w;
|
|
427204
|
+
const uy = Math.floor(i / w) / h;
|
|
427205
|
+
const o = i * 6;
|
|
427206
|
+
const cx = ux - 0.5;
|
|
427207
|
+
const cy = uy - 0.5;
|
|
427208
|
+
const fromShift = p * 0.06;
|
|
427209
|
+
const fr = sampleRgb48le(from22, ux + cx * fromShift, uy + cy * fromShift, w, h)[0];
|
|
427210
|
+
const fg = sampleRgb48le(from22, ux, uy, w, h)[1];
|
|
427211
|
+
const fb = sampleRgb48le(from22, ux - cx * fromShift, uy - cy * fromShift, w, h)[2];
|
|
427212
|
+
const toShift = (1 - p) * 0.06;
|
|
427213
|
+
const tr = sampleRgb48le(to, ux - cx * toShift, uy - cy * toShift, w, h)[0];
|
|
427214
|
+
const tg = sampleRgb48le(to, ux, uy, w, h)[1];
|
|
427215
|
+
const tb = sampleRgb48le(to, ux + cx * toShift, uy + cy * toShift, w, h)[2];
|
|
427216
|
+
out.writeUInt16LE(clamp16(mix16(fr, tr, p)), o);
|
|
427217
|
+
out.writeUInt16LE(clamp16(mix16(fg, tg, p)), o + 2);
|
|
427218
|
+
out.writeUInt16LE(clamp16(mix16(fb, tb, p)), o + 4);
|
|
427219
|
+
}
|
|
427220
|
+
};
|
|
427221
|
+
TRANSITIONS["chromatic-split"] = chromaticSplit;
|
|
427222
|
+
sdfIris = (from22, to, out, w, h, p) => {
|
|
427223
|
+
const accentBright = [65535, 55e3, 35e3];
|
|
427224
|
+
for (let i = 0; i < w * h; i++) {
|
|
427225
|
+
const ux = i % w / w;
|
|
427226
|
+
const uy = Math.floor(i / w) / h;
|
|
427227
|
+
const o = i * 6;
|
|
427228
|
+
const ax = (ux - 0.5) * (w / h);
|
|
427229
|
+
const ay = uy - 0.5;
|
|
427230
|
+
const d = Math.sqrt(ax * ax + ay * ay);
|
|
427231
|
+
const radius = p * 1.2;
|
|
427232
|
+
const fw = 3e-3;
|
|
427233
|
+
const edge = smoothstep(radius + fw, radius - fw, d);
|
|
427234
|
+
const ring1 = Math.exp(-Math.abs(d - radius) * 25);
|
|
427235
|
+
const ring2 = Math.exp(-Math.abs(d - radius + 0.04) * 20) * 0.5;
|
|
427236
|
+
const ring3 = Math.exp(-Math.abs(d - radius + 0.08) * 15) * 0.25;
|
|
427237
|
+
const glow = (ring1 + ring2 + ring3) * p * (1 - p) * 4;
|
|
427238
|
+
const [fromR, fromG, fromB] = sampleRgb48le(from22, ux, uy, w, h);
|
|
427239
|
+
const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
|
|
427240
|
+
out.writeUInt16LE(clamp16(mix16(fromR, toR, edge) + accentBright[0] * glow * 0.6), o);
|
|
427241
|
+
out.writeUInt16LE(clamp16(mix16(fromG, toG, edge) + accentBright[1] * glow * 0.6), o + 2);
|
|
427242
|
+
out.writeUInt16LE(clamp16(mix16(fromB, toB, edge) + accentBright[2] * glow * 0.6), o + 4);
|
|
427243
|
+
}
|
|
427244
|
+
};
|
|
427245
|
+
TRANSITIONS["sdf-iris"] = sdfIris;
|
|
427246
|
+
glitch = (from22, to, out, w, h, p) => {
|
|
427247
|
+
const intensity = p * (1 - p) * 4;
|
|
427248
|
+
for (let i = 0; i < w * h; i++) {
|
|
427249
|
+
const ux = i % w / w;
|
|
427250
|
+
const uy = Math.floor(i / w) / h;
|
|
427251
|
+
const o = i * 6;
|
|
427252
|
+
const lineY = Math.floor(uy * 60) / 60;
|
|
427253
|
+
const lineDisp = (glitchRand(lineY, Math.floor(p * 17)) - 0.5) * 0.18 * intensity;
|
|
427254
|
+
const blockX = Math.floor(ux * 12);
|
|
427255
|
+
const blockY = Math.floor(uy * 8);
|
|
427256
|
+
const progressStep = Math.floor(p * 11);
|
|
427257
|
+
const br = glitchRand(blockX + progressStep, blockY + progressStep);
|
|
427258
|
+
const ba = (br >= 0.83 ? 1 : 0) * intensity;
|
|
427259
|
+
const bdx = (glitchRand(blockX * 2.1, blockY * 2.1) - 0.5) * 0.35 * ba;
|
|
427260
|
+
const bdy = (glitchRand(blockX * 3.7, blockY * 3.7) - 0.5) * 0.35 * ba;
|
|
427261
|
+
const uvx = Math.max(0, Math.min(1, ux + lineDisp + bdx));
|
|
427262
|
+
const uvy = Math.max(0, Math.min(1, uy + bdy));
|
|
427263
|
+
const shift = intensity * 0.035;
|
|
427264
|
+
const r = sampleRgb48le(from22, uvx + shift, uvy, w, h)[0];
|
|
427265
|
+
const g = sampleRgb48le(from22, uvx, uvy, w, h)[1];
|
|
427266
|
+
const b = sampleRgb48le(from22, uvx - shift, uvy, w, h)[2];
|
|
427267
|
+
let cr = r / 65535;
|
|
427268
|
+
let cg = g / 65535;
|
|
427269
|
+
let cb = b / 65535;
|
|
427270
|
+
const scanline = (uy * h * 0.5 % 1 + 1) % 1 >= 0.5 ? 0.05 * intensity : 0;
|
|
427271
|
+
cr -= scanline;
|
|
427272
|
+
cg -= scanline;
|
|
427273
|
+
cb -= scanline;
|
|
427274
|
+
const flicker = 1 + (glitchRand(Math.floor(p * 23), 0) - 0.5) * 0.3 * intensity;
|
|
427275
|
+
cr *= flicker;
|
|
427276
|
+
cg *= flicker;
|
|
427277
|
+
cb *= flicker;
|
|
427278
|
+
const levels = 256 - (256 - 8) * (intensity * 0.5);
|
|
427279
|
+
cr = Math.floor(cr * levels) / levels;
|
|
427280
|
+
cg = Math.floor(cg * levels) / levels;
|
|
427281
|
+
cb = Math.floor(cb * levels) / levels;
|
|
427282
|
+
const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
|
|
427283
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(cr * 65535), toR, p)), o);
|
|
427284
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(cg * 65535), toG, p)), o + 2);
|
|
427285
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(cb * 65535), toB, p)), o + 4);
|
|
427286
|
+
}
|
|
427287
|
+
};
|
|
427288
|
+
TRANSITIONS["glitch"] = glitch;
|
|
427289
|
+
lightLeak = (from22, to, out, w, h, p) => {
|
|
427290
|
+
const accent = [5e4 / 65535, 25e3 / 65535, 5e3 / 65535];
|
|
427291
|
+
const accentBright = [65535 / 65535, 55e3 / 65535, 35e3 / 65535];
|
|
427292
|
+
const lpx = 1.3;
|
|
427293
|
+
const lpy = -0.2;
|
|
427294
|
+
for (let i = 0; i < w * h; i++) {
|
|
427295
|
+
const ux = i % w / w;
|
|
427296
|
+
const uy = Math.floor(i / w) / h;
|
|
427297
|
+
const o = i * 6;
|
|
427298
|
+
const dx = ux - lpx;
|
|
427299
|
+
const dy = uy - lpy;
|
|
427300
|
+
const dist = Math.sqrt(dx * dx + dy * dy);
|
|
427301
|
+
const leak = Math.max(0, Math.min(1, Math.exp(-dist * 1.8) * p * 4));
|
|
427302
|
+
const warmR = accent[0] + (accentBright[0] - accent[0]) * dist * 0.7;
|
|
427303
|
+
const warmG = accent[1] + (accentBright[1] - accent[1]) * dist * 0.7;
|
|
427304
|
+
const warmB = accent[2] + (accentBright[2] - accent[2]) * dist * 0.7;
|
|
427305
|
+
const flare = Math.exp(-Math.abs(uy - (-0.2 + ux * 0.3)) * 15) * leak * 0.3;
|
|
427306
|
+
const [fr, fg, fb] = sampleRgb48le(from22, ux, uy, w, h);
|
|
427307
|
+
const fromR = fr / 65535;
|
|
427308
|
+
const fromG = fg / 65535;
|
|
427309
|
+
const fromB = fb / 65535;
|
|
427310
|
+
const overR = aces(fromR + warmR * leak * 3 + accentBright[0] * flare);
|
|
427311
|
+
const overG = aces(fromG + warmG * leak * 3 + accentBright[1] * flare);
|
|
427312
|
+
const overB = aces(fromB + warmB * leak * 3 + accentBright[2] * flare);
|
|
427313
|
+
const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
|
|
427314
|
+
const blend = smoothstep(0.15, 0.85, p);
|
|
427315
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(overR * 65535), toR, blend)), o);
|
|
427316
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(overG * 65535), toG, blend)), o + 2);
|
|
427317
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(overB * 65535), toB, blend)), o + 4);
|
|
427318
|
+
}
|
|
427319
|
+
};
|
|
427320
|
+
TRANSITIONS["light-leak"] = lightLeak;
|
|
427321
|
+
crossWarpMorph = (from22, to, out, w, h, p) => {
|
|
427322
|
+
for (let i = 0; i < w * h; i++) {
|
|
427323
|
+
const ux = i % w / w;
|
|
427324
|
+
const uy = Math.floor(i / w) / h;
|
|
427325
|
+
const o = i * 6;
|
|
427326
|
+
const dispX = fbm(ux * 3, uy * 3) - 0.5;
|
|
427327
|
+
const dispY = fbm(ux * 3 + 7.3, uy * 3 + 3.7) - 0.5;
|
|
427328
|
+
const fromUx = Math.max(0, Math.min(1, ux + dispX * p * 0.5));
|
|
427329
|
+
const fromUy = Math.max(0, Math.min(1, uy + dispY * p * 0.5));
|
|
427330
|
+
const toUx = Math.max(0, Math.min(1, ux - dispX * (1 - p) * 0.5));
|
|
427331
|
+
const toUy = Math.max(0, Math.min(1, uy - dispY * (1 - p) * 0.5));
|
|
427332
|
+
const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, fromUy, w, h);
|
|
427333
|
+
const [toR, toG, toB] = sampleRgb48le(to, toUx, toUy, w, h);
|
|
427334
|
+
const n = fbm(ux * 4 + 3.1, uy * 4 + 1.7);
|
|
427335
|
+
const blend = smoothstep(0.4, 0.6, n + p * 1.2 - 0.6);
|
|
427336
|
+
out.writeUInt16LE(clamp16(mix16(fromR, toR, blend)), o);
|
|
427337
|
+
out.writeUInt16LE(clamp16(mix16(fromG, toG, blend)), o + 2);
|
|
427338
|
+
out.writeUInt16LE(clamp16(mix16(fromB, toB, blend)), o + 4);
|
|
427339
|
+
}
|
|
427340
|
+
};
|
|
427341
|
+
TRANSITIONS["cross-warp-morph"] = crossWarpMorph;
|
|
427342
|
+
whipPan = (from22, to, out, w, h, p) => {
|
|
427343
|
+
const fromOff = p * 1.5;
|
|
427344
|
+
const toOff = (1 - p) * 1.5;
|
|
427345
|
+
for (let i = 0; i < w * h; i++) {
|
|
427346
|
+
const ux = i % w / w;
|
|
427347
|
+
const uy = Math.floor(i / w) / h;
|
|
427348
|
+
const o = i * 6;
|
|
427349
|
+
let fromR = 0, fromG = 0, fromB = 0;
|
|
427350
|
+
for (let s = 0; s < 10; s++) {
|
|
427351
|
+
const f = s / 10;
|
|
427352
|
+
const fuv = Math.max(0, Math.min(1, ux + fromOff + p * 0.08 * f));
|
|
427353
|
+
const [r, g, b] = sampleRgb48le(from22, fuv, uy, w, h);
|
|
427354
|
+
fromR += r;
|
|
427355
|
+
fromG += g;
|
|
427356
|
+
fromB += b;
|
|
427357
|
+
}
|
|
427358
|
+
fromR /= 10;
|
|
427359
|
+
fromG /= 10;
|
|
427360
|
+
fromB /= 10;
|
|
427361
|
+
let toR = 0, toG = 0, toB = 0;
|
|
427362
|
+
for (let s = 0; s < 10; s++) {
|
|
427363
|
+
const f = s / 10;
|
|
427364
|
+
const tuv = Math.max(0, Math.min(1, ux - toOff - (1 - p) * 0.08 * f));
|
|
427365
|
+
const [r, g, b] = sampleRgb48le(to, tuv, uy, w, h);
|
|
427366
|
+
toR += r;
|
|
427367
|
+
toG += g;
|
|
427368
|
+
toB += b;
|
|
427369
|
+
}
|
|
427370
|
+
toR /= 10;
|
|
427371
|
+
toG /= 10;
|
|
427372
|
+
toB /= 10;
|
|
427373
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fromR), Math.round(toR), p)), o);
|
|
427374
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fromG), Math.round(toG), p)), o + 2);
|
|
427375
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fromB), Math.round(toB), p)), o + 4);
|
|
427376
|
+
}
|
|
427377
|
+
};
|
|
427378
|
+
TRANSITIONS["whip-pan"] = whipPan;
|
|
427379
|
+
cinematicZoom = (from22, to, out, w, h, p) => {
|
|
427380
|
+
const fromS = p * 0.08;
|
|
427381
|
+
const toS = (1 - p) * 0.06;
|
|
427382
|
+
for (let i = 0; i < w * h; i++) {
|
|
427383
|
+
const ux = i % w / w;
|
|
427384
|
+
const uy = Math.floor(i / w) / h;
|
|
427385
|
+
const o = i * 6;
|
|
427386
|
+
const dx = ux - 0.5;
|
|
427387
|
+
const dy = uy - 0.5;
|
|
427388
|
+
let fr = 0, fg = 0, fb = 0;
|
|
427389
|
+
for (let s = 0; s < 12; s++) {
|
|
427390
|
+
const f = s / 12;
|
|
427391
|
+
const rr = sampleRgb48le(
|
|
427392
|
+
from22,
|
|
427393
|
+
ux - dx * fromS * 1.06 * f,
|
|
427394
|
+
uy - dy * fromS * 1.06 * f,
|
|
427395
|
+
w,
|
|
427396
|
+
h
|
|
427397
|
+
)[0];
|
|
427398
|
+
const gg = sampleRgb48le(from22, ux - dx * fromS * f, uy - dy * fromS * f, w, h)[1];
|
|
427399
|
+
const bb = sampleRgb48le(
|
|
427400
|
+
from22,
|
|
427401
|
+
ux - dx * fromS * 0.94 * f,
|
|
427402
|
+
uy - dy * fromS * 0.94 * f,
|
|
427403
|
+
w,
|
|
427404
|
+
h
|
|
427405
|
+
)[2];
|
|
427406
|
+
fr += rr;
|
|
427407
|
+
fg += gg;
|
|
427408
|
+
fb += bb;
|
|
427409
|
+
}
|
|
427410
|
+
fr /= 12;
|
|
427411
|
+
fg /= 12;
|
|
427412
|
+
fb /= 12;
|
|
427413
|
+
let tr = 0, tg = 0, tb = 0;
|
|
427414
|
+
for (let s = 0; s < 12; s++) {
|
|
427415
|
+
const f = s / 12;
|
|
427416
|
+
const rr = sampleRgb48le(to, ux + dx * toS * 1.06 * f, uy + dy * toS * 1.06 * f, w, h)[0];
|
|
427417
|
+
const gg = sampleRgb48le(to, ux + dx * toS * f, uy + dy * toS * f, w, h)[1];
|
|
427418
|
+
const bb = sampleRgb48le(to, ux + dx * toS * 0.94 * f, uy + dy * toS * 0.94 * f, w, h)[2];
|
|
427419
|
+
tr += rr;
|
|
427420
|
+
tg += gg;
|
|
427421
|
+
tb += bb;
|
|
427422
|
+
}
|
|
427423
|
+
tr /= 12;
|
|
427424
|
+
tg /= 12;
|
|
427425
|
+
tb /= 12;
|
|
427426
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fr), Math.round(tr), p)), o);
|
|
427427
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fg), Math.round(tg), p)), o + 2);
|
|
427428
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fb), Math.round(tb), p)), o + 4);
|
|
427429
|
+
}
|
|
427430
|
+
};
|
|
427431
|
+
TRANSITIONS["cinematic-zoom"] = cinematicZoom;
|
|
427432
|
+
gravitationalLens = (from22, to, out, w, h, p) => {
|
|
427433
|
+
for (let i = 0; i < w * h; i++) {
|
|
427434
|
+
const ux = i % w / w;
|
|
427435
|
+
const uy = Math.floor(i / w) / h;
|
|
427436
|
+
const o = i * 6;
|
|
427437
|
+
const uvx = ux - 0.5;
|
|
427438
|
+
const uvy = uy - 0.5;
|
|
427439
|
+
const dist = Math.sqrt(uvx * uvx + uvy * uvy);
|
|
427440
|
+
const pull = p * 2;
|
|
427441
|
+
const warpStr = pull * 0.3 / (dist + 0.1);
|
|
427442
|
+
const warpedX = Math.max(0, Math.min(1, ux - uvx * warpStr));
|
|
427443
|
+
const warpedY = Math.max(0, Math.min(1, uy - uvy * warpStr));
|
|
427444
|
+
const [, ag] = sampleRgb48le(from22, warpedX, warpedY, w, h);
|
|
427445
|
+
const horizon = smoothstep(0, 0.3, dist / (1 - p * 0.85 + 1e-3));
|
|
427446
|
+
const shift = pull * 0.02 / (dist + 0.2);
|
|
427447
|
+
const rSampX = Math.max(0, Math.min(1, ux - uvx * (warpStr + shift)));
|
|
427448
|
+
const rSampY = Math.max(0, Math.min(1, uy - uvy * (warpStr + shift)));
|
|
427449
|
+
const bSampX = Math.max(0, Math.min(1, ux - uvx * (warpStr - shift)));
|
|
427450
|
+
const bSampY = Math.max(0, Math.min(1, uy - uvy * (warpStr - shift)));
|
|
427451
|
+
const ar = sampleRgb48le(from22, rSampX, rSampY, w, h)[0];
|
|
427452
|
+
const ab = sampleRgb48le(from22, bSampX, bSampY, w, h)[2];
|
|
427453
|
+
const lensedR = Math.round(ar * horizon);
|
|
427454
|
+
const lensedG = Math.round(ag * horizon);
|
|
427455
|
+
const lensedB = Math.round(ab * horizon);
|
|
427456
|
+
const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
|
|
427457
|
+
const blend = smoothstep(0.3, 0.9, p);
|
|
427458
|
+
out.writeUInt16LE(clamp16(mix16(lensedR, toR, blend)), o);
|
|
427459
|
+
out.writeUInt16LE(clamp16(mix16(lensedG, toG, blend)), o + 2);
|
|
427460
|
+
out.writeUInt16LE(clamp16(mix16(lensedB, toB, blend)), o + 4);
|
|
427461
|
+
}
|
|
427462
|
+
};
|
|
427463
|
+
TRANSITIONS["gravitational-lens"] = gravitationalLens;
|
|
427464
|
+
rippleWaves = (from22, to, out, w, h, p) => {
|
|
427465
|
+
const accentBright = [65535, 55e3, 35e3];
|
|
427466
|
+
for (let i = 0; i < w * h; i++) {
|
|
427467
|
+
const ux = i % w / w;
|
|
427468
|
+
const uy = Math.floor(i / w) / h;
|
|
427469
|
+
const o = i * 6;
|
|
427470
|
+
const uvx = ux - 0.5;
|
|
427471
|
+
const uvy = uy - 0.5;
|
|
427472
|
+
const dist = Math.sqrt(uvx * uvx + uvy * uvy);
|
|
427473
|
+
const nux = uvx + 1e-3;
|
|
427474
|
+
const nuy = uvy + 1e-3;
|
|
427475
|
+
const nlen = Math.sqrt(nux * nux + nuy * nuy);
|
|
427476
|
+
const dirx = nux / nlen;
|
|
427477
|
+
const diry = nuy / nlen;
|
|
427478
|
+
const fromAmp = p * 0.04;
|
|
427479
|
+
const fw1 = Math.exp(Math.sin(dist * 25 - p * 12) - 1);
|
|
427480
|
+
const fw2 = Math.exp(Math.sin(dist * 50 - p * 18) - 1) * 0.5;
|
|
427481
|
+
const fromUx = Math.max(0, Math.min(1, ux + dirx * (fw1 + fw2) * fromAmp));
|
|
427482
|
+
const fromUy = Math.max(0, Math.min(1, uy + diry * (fw1 + fw2) * fromAmp));
|
|
427483
|
+
const toAmp = (1 - p) * 0.04;
|
|
427484
|
+
const tw1 = Math.exp(Math.sin(dist * 25 + p * 12) - 1);
|
|
427485
|
+
const tw2 = Math.exp(Math.sin(dist * 50 + p * 18) - 1) * 0.5;
|
|
427486
|
+
const toUx = Math.max(0, Math.min(1, ux - dirx * (tw1 + tw2) * toAmp));
|
|
427487
|
+
const toUy = Math.max(0, Math.min(1, uy - diry * (tw1 + tw2) * toAmp));
|
|
427488
|
+
const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, fromUy, w, h);
|
|
427489
|
+
const [toR, toG, toB] = sampleRgb48le(to, toUx, toUy, w, h);
|
|
427490
|
+
const peak = fw1 * p;
|
|
427491
|
+
const tintR = accentBright[0] * peak * 0.1;
|
|
427492
|
+
const tintG = accentBright[1] * peak * 0.1;
|
|
427493
|
+
const tintB = accentBright[2] * peak * 0.1;
|
|
427494
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fromR + tintR), toR, p)), o);
|
|
427495
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fromG + tintG), toG, p)), o + 2);
|
|
427496
|
+
out.writeUInt16LE(clamp16(mix16(Math.round(fromB + tintB), toB, p)), o + 4);
|
|
427497
|
+
}
|
|
427498
|
+
};
|
|
427499
|
+
TRANSITIONS["ripple-waves"] = rippleWaves;
|
|
427500
|
+
swirlVortex = (from22, to, out, w, h, p) => {
|
|
427501
|
+
for (let i = 0; i < w * h; i++) {
|
|
427502
|
+
const ux = i % w / w;
|
|
427503
|
+
const uy = Math.floor(i / w) / h;
|
|
427504
|
+
const o = i * 6;
|
|
427505
|
+
const uvx = ux - 0.5;
|
|
427506
|
+
const uvy = uy - 0.5;
|
|
427507
|
+
const dist = Math.sqrt(uvx * uvx + uvy * uvy);
|
|
427508
|
+
const warp = fbm(ux * 4, uy * 4) * 0.5;
|
|
427509
|
+
const fromAng = p * (1 - dist) * 10 + warp * p * 3;
|
|
427510
|
+
const fs8 = Math.sin(fromAng);
|
|
427511
|
+
const fc = Math.cos(fromAng);
|
|
427512
|
+
const fromUx = Math.max(0, Math.min(1, uvx * fc - uvy * fs8 + 0.5));
|
|
427513
|
+
const fromUy = Math.max(0, Math.min(1, uvx * fs8 + uvy * fc + 0.5));
|
|
427514
|
+
const toAng = -(1 - p) * (1 - dist) * 10 - warp * (1 - p) * 3;
|
|
427515
|
+
const ts = Math.sin(toAng);
|
|
427516
|
+
const tc = Math.cos(toAng);
|
|
427517
|
+
const toUx = Math.max(0, Math.min(1, uvx * tc - uvy * ts + 0.5));
|
|
427518
|
+
const toUy = Math.max(0, Math.min(1, uvx * ts + uvy * tc + 0.5));
|
|
427519
|
+
const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, fromUy, w, h);
|
|
427520
|
+
const [toR, toG, toB] = sampleRgb48le(to, toUx, toUy, w, h);
|
|
427521
|
+
out.writeUInt16LE(clamp16(mix16(fromR, toR, p)), o);
|
|
427522
|
+
out.writeUInt16LE(clamp16(mix16(fromG, toG, p)), o + 2);
|
|
427523
|
+
out.writeUInt16LE(clamp16(mix16(fromB, toB, p)), o + 4);
|
|
427524
|
+
}
|
|
427525
|
+
};
|
|
427526
|
+
TRANSITIONS["swirl-vortex"] = swirlVortex;
|
|
427527
|
+
thermalDistortion = (from22, to, out, w, h, p) => {
|
|
427528
|
+
const accentBright = [65535, 55e3, 35e3];
|
|
427529
|
+
for (let i = 0; i < w * h; i++) {
|
|
427530
|
+
const ux = i % w / w;
|
|
427531
|
+
const uy = Math.floor(i / w) / h;
|
|
427532
|
+
const o = i * 6;
|
|
427533
|
+
const heat = p * 1.5;
|
|
427534
|
+
const yFade = smoothstep(1, 0, uy);
|
|
427535
|
+
const shimmer = Math.sin(uy * 40 + fbm(ux * 6, uy * 6) * 8) * fbm(ux * 3 + 0, uy * 3 + p * 2);
|
|
427536
|
+
const dispX = shimmer * heat * 0.03 * yFade;
|
|
427537
|
+
const fromUx = Math.max(0, Math.min(1, ux + dispX));
|
|
427538
|
+
const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, uy, w, h);
|
|
427539
|
+
const invShimmer = Math.sin(uy * 40 + fbm(ux * 6 + 3, uy * 6 + 3) * 8) * fbm(ux * 3 + 3, uy * 3 + p * 2);
|
|
427540
|
+
const dispX2 = invShimmer * (1 - p) * 0.03 * yFade;
|
|
427541
|
+
const toUx = Math.max(0, Math.min(1, ux + dispX2));
|
|
427542
|
+
const [toR, toG, toB] = sampleRgb48le(to, toUx, uy, w, h);
|
|
427543
|
+
const haze = heat * yFade * 0.15 * (1 - p);
|
|
427544
|
+
out.writeUInt16LE(clamp16(mix16(fromR, toR, p) + Math.round(accentBright[0] * haze)), o);
|
|
427545
|
+
out.writeUInt16LE(clamp16(mix16(fromG, toG, p) + Math.round(accentBright[1] * haze)), o + 2);
|
|
427546
|
+
out.writeUInt16LE(clamp16(mix16(fromB, toB, p) + Math.round(accentBright[2] * haze)), o + 4);
|
|
427547
|
+
}
|
|
427548
|
+
};
|
|
427549
|
+
TRANSITIONS["thermal-distortion"] = thermalDistortion;
|
|
427550
|
+
domainWarp = (from22, to, out, w, h, p) => {
|
|
427551
|
+
const accentDark = [25e3, 8e3, 2e3];
|
|
427552
|
+
const accentBright = [65535, 55e3, 35e3];
|
|
427553
|
+
for (let i = 0; i < w * h; i++) {
|
|
427554
|
+
const ux = i % w / w;
|
|
427555
|
+
const uy = Math.floor(i / w) / h;
|
|
427556
|
+
const o = i * 6;
|
|
427557
|
+
const qx = fbm(ux * 3, uy * 3);
|
|
427558
|
+
const qy = fbm(ux * 3 + 5.2, uy * 3 + 1.3);
|
|
427559
|
+
const rx = fbm(ux * 3 + qx * 4 + 1.7, uy * 3 + qy * 4 + 9.2);
|
|
427560
|
+
const ry = fbm(ux * 3 + qx * 4 + 8.3, uy * 3 + qy * 4 + 2.8);
|
|
427561
|
+
const n = fbm(ux * 3 + rx * 2, uy * 3 + ry * 2);
|
|
427562
|
+
const warpDirX = (qx - 0.5) * 0.4;
|
|
427563
|
+
const warpDirY = (qy - 0.5) * 0.4;
|
|
427564
|
+
const aUx = Math.max(0, Math.min(1, ux + warpDirX * p));
|
|
427565
|
+
const aUy = Math.max(0, Math.min(1, uy + warpDirY * p));
|
|
427566
|
+
const bUx = Math.max(0, Math.min(1, ux - warpDirX * (1 - p)));
|
|
427567
|
+
const bUy = Math.max(0, Math.min(1, uy - warpDirY * (1 - p)));
|
|
427568
|
+
const [aR, aG, aB] = sampleRgb48le(from22, aUx, aUy, w, h);
|
|
427569
|
+
const [bR, bG, bB] = sampleRgb48le(to, bUx, bUy, w, h);
|
|
427570
|
+
const e = smoothstep(p - 0.08, p + 0.08, n);
|
|
427571
|
+
const ed = Math.abs(n - p);
|
|
427572
|
+
const pStep = p >= 1 ? 1 : 0;
|
|
427573
|
+
const em = smoothstep(0.1, 0, ed) * (1 - pStep);
|
|
427574
|
+
const ecBlend = smoothstep(0, 0.1, ed);
|
|
427575
|
+
const ecR = accentDark[0] + (accentBright[0] - accentDark[0]) * (1 - ecBlend);
|
|
427576
|
+
const ecG = accentDark[1] + (accentBright[1] - accentDark[1]) * (1 - ecBlend);
|
|
427577
|
+
const ecB = accentDark[2] + (accentBright[2] - accentDark[2]) * (1 - ecBlend);
|
|
427578
|
+
out.writeUInt16LE(clamp16(mix16(bR, aR, e) + Math.round(ecR * em * 2)), o);
|
|
427579
|
+
out.writeUInt16LE(clamp16(mix16(bG, aG, e) + Math.round(ecG * em * 2)), o + 2);
|
|
427580
|
+
out.writeUInt16LE(clamp16(mix16(bB, aB, e) + Math.round(ecB * em * 2)), o + 4);
|
|
427581
|
+
}
|
|
427582
|
+
};
|
|
427583
|
+
TRANSITIONS["domain-warp"] = domainWarp;
|
|
427584
|
+
ridgedBurn = (from22, to, out, w, h, p) => {
|
|
427585
|
+
const accent = [5e4, 25e3, 5e3];
|
|
427586
|
+
const accentDark = [25e3, 8e3, 2e3];
|
|
427587
|
+
const accentBright = [65535, 55e3, 35e3];
|
|
427588
|
+
for (let i = 0; i < w * h; i++) {
|
|
427589
|
+
const ux = i % w / w;
|
|
427590
|
+
const uy = Math.floor(i / w) / h;
|
|
427591
|
+
const o = i * 6;
|
|
427592
|
+
const [aR, aG, aB] = sampleRgb48le(from22, ux, uy, w, h);
|
|
427593
|
+
const [bR, bG, bB] = sampleRgb48le(to, ux, uy, w, h);
|
|
427594
|
+
const n = ridged(ux * 4, uy * 4);
|
|
427595
|
+
const e = smoothstep(p - 0.04, p + 0.04, n);
|
|
427596
|
+
const heat = smoothstep(0.12, 0, Math.abs(n - p));
|
|
427597
|
+
const pStep = p >= 1 ? 1 : 0;
|
|
427598
|
+
const heatMasked = heat * (1 - pStep);
|
|
427599
|
+
let burnR = accentDark[0] + (accent[0] - accentDark[0]) * smoothstep(0, 0.25, heatMasked);
|
|
427600
|
+
let burnG = accentDark[1] + (accent[1] - accentDark[1]) * smoothstep(0, 0.25, heatMasked);
|
|
427601
|
+
let burnB = accentDark[2] + (accent[2] - accentDark[2]) * smoothstep(0, 0.25, heatMasked);
|
|
427602
|
+
const blend2 = smoothstep(0.25, 0.5, heatMasked);
|
|
427603
|
+
burnR = burnR + (accentBright[0] - burnR) * blend2;
|
|
427604
|
+
burnG = burnG + (accentBright[1] - burnG) * blend2;
|
|
427605
|
+
burnB = burnB + (accentBright[2] - burnB) * blend2;
|
|
427606
|
+
const blend3 = smoothstep(0.5, 1, heatMasked);
|
|
427607
|
+
burnR = burnR + (65535 - burnR) * blend3;
|
|
427608
|
+
burnG = burnG + (65535 - burnG) * blend3;
|
|
427609
|
+
burnB = burnB + (65535 - burnB) * blend3;
|
|
427610
|
+
const sparks = (vnoise(ux * 80, uy * 80) >= 0.92 ? 1 : 0) * heatMasked * 3;
|
|
427611
|
+
out.writeUInt16LE(
|
|
427612
|
+
clamp16(
|
|
427613
|
+
mix16(bR, aR, e) + Math.round(burnR * heatMasked * 3.5) + Math.round(accentBright[0] * sparks)
|
|
427614
|
+
),
|
|
427615
|
+
o
|
|
427616
|
+
);
|
|
427617
|
+
out.writeUInt16LE(
|
|
427618
|
+
clamp16(
|
|
427619
|
+
mix16(bG, aG, e) + Math.round(burnG * heatMasked * 3.5) + Math.round(accentBright[1] * sparks)
|
|
427620
|
+
),
|
|
427621
|
+
o + 2
|
|
427622
|
+
);
|
|
427623
|
+
out.writeUInt16LE(
|
|
427624
|
+
clamp16(
|
|
427625
|
+
mix16(bB, aB, e) + Math.round(burnB * heatMasked * 3.5) + Math.round(accentBright[2] * sparks)
|
|
427626
|
+
),
|
|
427627
|
+
o + 4
|
|
427628
|
+
);
|
|
427629
|
+
}
|
|
427630
|
+
};
|
|
427631
|
+
TRANSITIONS["ridged-burn"] = ridgedBurn;
|
|
425546
427632
|
PRODUCER_DIR = dirname8(fileURLToPath22(import.meta.url));
|
|
425547
427633
|
SIBLING_MANIFEST_PATH = resolve72(PRODUCER_DIR, "hyperframe.manifest.json");
|
|
425548
427634
|
MODULE_RELATIVE_MANIFEST_PATH = resolve72(
|
|
@@ -425579,6 +427665,102 @@ ${right22.raw}`)
|
|
|
425579
427665
|
".ttf": "font/ttf",
|
|
425580
427666
|
".otf": "font/otf"
|
|
425581
427667
|
};
|
|
427668
|
+
VIRTUAL_TIME_SHIM = String.raw`(function() {
|
|
427669
|
+
if (window.__HF_VIRTUAL_TIME__) return;
|
|
427670
|
+
|
|
427671
|
+
var virtualNowMs = 0;
|
|
427672
|
+
var rafId = 1;
|
|
427673
|
+
var rafQueue = [];
|
|
427674
|
+
var OriginalDate = Date;
|
|
427675
|
+
var originalSetTimeout = window.setTimeout.bind(window);
|
|
427676
|
+
var originalClearTimeout = window.clearTimeout.bind(window);
|
|
427677
|
+
var originalSetInterval = window.setInterval.bind(window);
|
|
427678
|
+
var originalClearInterval = window.clearInterval.bind(window);
|
|
427679
|
+
var originalRequestAnimationFrame = window.requestAnimationFrame
|
|
427680
|
+
? window.requestAnimationFrame.bind(window)
|
|
427681
|
+
: null;
|
|
427682
|
+
var originalCancelAnimationFrame = window.cancelAnimationFrame
|
|
427683
|
+
? window.cancelAnimationFrame.bind(window)
|
|
427684
|
+
: null;
|
|
427685
|
+
|
|
427686
|
+
function flushAnimationFrame() {
|
|
427687
|
+
if (!rafQueue.length) return;
|
|
427688
|
+
var current = rafQueue.slice();
|
|
427689
|
+
rafQueue.length = 0;
|
|
427690
|
+
for (var i = 0; i < current.length; i++) {
|
|
427691
|
+
var entry = current[i];
|
|
427692
|
+
if (entry.cancelled) continue;
|
|
427693
|
+
try {
|
|
427694
|
+
entry.callback(virtualNowMs);
|
|
427695
|
+
} catch {}
|
|
427696
|
+
}
|
|
427697
|
+
}
|
|
427698
|
+
|
|
427699
|
+
function VirtualDate() {
|
|
427700
|
+
var args = Array.prototype.slice.call(arguments);
|
|
427701
|
+
if (!(this instanceof VirtualDate)) {
|
|
427702
|
+
return OriginalDate.apply(null, args.length ? args : [virtualNowMs]);
|
|
427703
|
+
}
|
|
427704
|
+
var instance = args.length ? new (Function.prototype.bind.apply(OriginalDate, [null].concat(args)))() : new OriginalDate(virtualNowMs);
|
|
427705
|
+
Object.setPrototypeOf(instance, VirtualDate.prototype);
|
|
427706
|
+
return instance;
|
|
427707
|
+
}
|
|
427708
|
+
|
|
427709
|
+
VirtualDate.prototype = OriginalDate.prototype;
|
|
427710
|
+
Object.setPrototypeOf(VirtualDate, OriginalDate);
|
|
427711
|
+
VirtualDate.now = function() { return virtualNowMs; };
|
|
427712
|
+
VirtualDate.parse = OriginalDate.parse.bind(OriginalDate);
|
|
427713
|
+
VirtualDate.UTC = OriginalDate.UTC.bind(OriginalDate);
|
|
427714
|
+
|
|
427715
|
+
try {
|
|
427716
|
+
Object.defineProperty(window, "Date", {
|
|
427717
|
+
configurable: true,
|
|
427718
|
+
writable: true,
|
|
427719
|
+
value: VirtualDate,
|
|
427720
|
+
});
|
|
427721
|
+
} catch {}
|
|
427722
|
+
|
|
427723
|
+
if (window.performance && typeof window.performance.now === "function") {
|
|
427724
|
+
try {
|
|
427725
|
+
Object.defineProperty(window.performance, "now", {
|
|
427726
|
+
configurable: true,
|
|
427727
|
+
value: function() { return virtualNowMs; },
|
|
427728
|
+
});
|
|
427729
|
+
} catch {}
|
|
427730
|
+
}
|
|
427731
|
+
|
|
427732
|
+
window.requestAnimationFrame = function(callback) {
|
|
427733
|
+
if (typeof callback !== "function") return 0;
|
|
427734
|
+
var entry = { id: rafId++, callback: callback, cancelled: false };
|
|
427735
|
+
rafQueue.push(entry);
|
|
427736
|
+
return entry.id;
|
|
427737
|
+
};
|
|
427738
|
+
window.cancelAnimationFrame = function(id) {
|
|
427739
|
+
for (var i = 0; i < rafQueue.length; i++) {
|
|
427740
|
+
if (rafQueue[i].id === id) {
|
|
427741
|
+
rafQueue[i].cancelled = true;
|
|
427742
|
+
}
|
|
427743
|
+
}
|
|
427744
|
+
};
|
|
427745
|
+
|
|
427746
|
+
window.__HF_VIRTUAL_TIME__ = {
|
|
427747
|
+
originalSetTimeout: originalSetTimeout,
|
|
427748
|
+
originalClearTimeout: originalClearTimeout,
|
|
427749
|
+
originalSetInterval: originalSetInterval,
|
|
427750
|
+
originalClearInterval: originalClearInterval,
|
|
427751
|
+
originalRequestAnimationFrame: originalRequestAnimationFrame,
|
|
427752
|
+
originalCancelAnimationFrame: originalCancelAnimationFrame,
|
|
427753
|
+
seekToTime: function(nextTimeMs) {
|
|
427754
|
+
var safeTimeMs = Math.max(0, Number(nextTimeMs) || 0);
|
|
427755
|
+
virtualNowMs = safeTimeMs;
|
|
427756
|
+
flushAnimationFrame();
|
|
427757
|
+
return virtualNowMs;
|
|
427758
|
+
},
|
|
427759
|
+
getTime: function() {
|
|
427760
|
+
return virtualNowMs;
|
|
427761
|
+
},
|
|
427762
|
+
};
|
|
427763
|
+
})();`;
|
|
425582
427764
|
RENDER_SEEK_MODE = process.env.PRODUCER_RUNTIME_RENDER_SEEK_MODE === "strict-boundary" ? "strict-boundary" : "preview-phase";
|
|
425583
427765
|
RENDER_SEEK_DIAGNOSTICS = process.env.PRODUCER_DEBUG_SEEK_DIAGNOSTICS === "true";
|
|
425584
427766
|
RENDER_SEEK_STEP = Math.max(
|
|
@@ -425590,6 +427772,10 @@ ${right22.raw}`)
|
|
|
425590
427772
|
Math.min(0.95, Number(process.env.PRODUCER_RUNTIME_RENDER_SEEK_OFFSET_FRACTION || 0.5))
|
|
425591
427773
|
);
|
|
425592
427774
|
RENDER_MODE_SCRIPT = `(function() {
|
|
427775
|
+
var __realSetTimeout =
|
|
427776
|
+
window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.originalSetTimeout === "function"
|
|
427777
|
+
? window.__HF_VIRTUAL_TIME__.originalSetTimeout
|
|
427778
|
+
: window.setTimeout.bind(window);
|
|
425593
427779
|
var __seekMode = ${JSON.stringify(RENDER_SEEK_MODE)};
|
|
425594
427780
|
var __seekDiagnostics = ${RENDER_SEEK_DIAGNOSTICS ? "true" : "false"};
|
|
425595
427781
|
var __seekStep = ${RENDER_SEEK_STEP};
|
|
@@ -425683,42 +427869,91 @@ ${right22.raw}`)
|
|
|
425683
427869
|
window.__renderReady = true;
|
|
425684
427870
|
return;
|
|
425685
427871
|
}
|
|
425686
|
-
|
|
427872
|
+
__realSetTimeout(waitForPlayer, 50);
|
|
425687
427873
|
return;
|
|
425688
427874
|
}
|
|
425689
427875
|
if (installMediaFallbackPlayer()) {
|
|
425690
427876
|
return;
|
|
425691
427877
|
}
|
|
425692
|
-
|
|
427878
|
+
__realSetTimeout(waitForPlayer, 50);
|
|
425693
427879
|
}
|
|
425694
427880
|
waitForPlayer();
|
|
427881
|
+
})();`;
|
|
427882
|
+
HF_EARLY_STUB = `(function() {
|
|
427883
|
+
if (typeof window === "undefined") return;
|
|
427884
|
+
if (!window.__hf) window.__hf = {};
|
|
425695
427885
|
})();`;
|
|
425696
427886
|
HF_BRIDGE_SCRIPT = `(function() {
|
|
427887
|
+
var __realSetInterval =
|
|
427888
|
+
window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.originalSetInterval === "function"
|
|
427889
|
+
? window.__HF_VIRTUAL_TIME__.originalSetInterval
|
|
427890
|
+
: window.setInterval.bind(window);
|
|
427891
|
+
var __realClearInterval =
|
|
427892
|
+
window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.originalClearInterval === "function"
|
|
427893
|
+
? window.__HF_VIRTUAL_TIME__.originalClearInterval
|
|
427894
|
+
: window.clearInterval.bind(window);
|
|
425697
427895
|
function getDeclaredDuration() {
|
|
425698
427896
|
var root = document.querySelector('[data-composition-id]');
|
|
425699
427897
|
if (!root) return 0;
|
|
425700
427898
|
var d = Number(root.getAttribute('data-duration'));
|
|
425701
427899
|
return Number.isFinite(d) && d > 0 ? d : 0;
|
|
425702
427900
|
}
|
|
427901
|
+
function seekSameOriginChildFrames(frameWindow, nextTimeMs) {
|
|
427902
|
+
var frames;
|
|
427903
|
+
try {
|
|
427904
|
+
frames = frameWindow.frames;
|
|
427905
|
+
} catch (_error) {
|
|
427906
|
+
return;
|
|
427907
|
+
}
|
|
427908
|
+
if (!frames || typeof frames.length !== "number") return;
|
|
427909
|
+
for (var i = 0; i < frames.length; i++) {
|
|
427910
|
+
var childWindow = null;
|
|
427911
|
+
try {
|
|
427912
|
+
childWindow = frames[i];
|
|
427913
|
+
if (!childWindow || childWindow === frameWindow) continue;
|
|
427914
|
+
if (
|
|
427915
|
+
childWindow.__HF_VIRTUAL_TIME__ &&
|
|
427916
|
+
typeof childWindow.__HF_VIRTUAL_TIME__.seekToTime === "function"
|
|
427917
|
+
) {
|
|
427918
|
+
childWindow.__HF_VIRTUAL_TIME__.seekToTime(nextTimeMs);
|
|
427919
|
+
}
|
|
427920
|
+
} catch (_error) {
|
|
427921
|
+
continue;
|
|
427922
|
+
}
|
|
427923
|
+
seekSameOriginChildFrames(childWindow, nextTimeMs);
|
|
427924
|
+
}
|
|
427925
|
+
}
|
|
425703
427926
|
function bridge() {
|
|
425704
427927
|
var p = window.__player;
|
|
425705
427928
|
if (!p || typeof p.renderSeek !== "function" || typeof p.getDuration !== "function") {
|
|
425706
427929
|
return false;
|
|
425707
427930
|
}
|
|
425708
|
-
window.__hf
|
|
425709
|
-
|
|
427931
|
+
var hf = window.__hf || {};
|
|
427932
|
+
Object.defineProperty(hf, "duration", {
|
|
427933
|
+
configurable: true,
|
|
427934
|
+
enumerable: true,
|
|
427935
|
+
get: function() {
|
|
425710
427936
|
var d = p.getDuration();
|
|
425711
427937
|
return d > 0 ? d : getDeclaredDuration();
|
|
425712
427938
|
},
|
|
425713
|
-
|
|
427939
|
+
});
|
|
427940
|
+
hf.seek = function(t) {
|
|
427941
|
+
p.renderSeek(t);
|
|
427942
|
+
var nextTimeMs = (Math.max(0, Number(t) || 0)) * 1000;
|
|
427943
|
+
if (window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.seekToTime === "function") {
|
|
427944
|
+
window.__HF_VIRTUAL_TIME__.seekToTime(nextTimeMs);
|
|
427945
|
+
}
|
|
427946
|
+
seekSameOriginChildFrames(window, nextTimeMs);
|
|
425714
427947
|
};
|
|
427948
|
+
window.__hf = hf;
|
|
425715
427949
|
return true;
|
|
425716
427950
|
}
|
|
425717
427951
|
if (bridge()) return;
|
|
425718
|
-
var iv =
|
|
425719
|
-
if (bridge())
|
|
427952
|
+
var iv = __realSetInterval(function() {
|
|
427953
|
+
if (bridge()) __realClearInterval(iv);
|
|
425720
427954
|
}, 50);
|
|
425721
427955
|
})();`;
|
|
427956
|
+
DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve82(new URL(import.meta.url).pathname, "../../..", "renders");
|
|
425722
427957
|
EMBEDDED_FONT_DATA = /* @__PURE__ */ new Map([
|
|
425723
427958
|
["@fontsource/inter:400:normal", "data:font/woff2;base64,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"],
|
|
425724
427959
|
["@fontsource/inter:700:normal", "data:font/woff2;base64,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"],
|
|
@@ -425886,8 +428121,9 @@ ${right22.raw}`)
|
|
|
425886
428121
|
poppins: "poppins",
|
|
425887
428122
|
"segoe ui": "roboto"
|
|
425888
428123
|
};
|
|
425889
|
-
GOOGLE_FONTS_CACHE_DIR =
|
|
428124
|
+
GOOGLE_FONTS_CACHE_DIR = join13(homedir22(), ".cache", "hyperframes", "fonts");
|
|
425890
428125
|
WOFF2_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
|
|
428126
|
+
INLINE_SCRIPT_PATTERN = /<script\b([^>]*)>([\s\S]*?)<\/script>/gi;
|
|
425891
428127
|
LOG_LEVEL_PRIORITY = {
|
|
425892
428128
|
error: 0,
|
|
425893
428129
|
warn: 1,
|
|
@@ -425895,6 +428131,8 @@ ${right22.raw}`)
|
|
|
425895
428131
|
debug: 3
|
|
425896
428132
|
};
|
|
425897
428133
|
defaultLogger = createConsoleLogger("info");
|
|
428134
|
+
frameDirMaxIndexCache = /* @__PURE__ */ new Map();
|
|
428135
|
+
FRAME_FILENAME_RE = /^frame_(\d+)\.png$/;
|
|
425898
428136
|
RenderCancelledError = class extends Error {
|
|
425899
428137
|
reason;
|
|
425900
428138
|
constructor(message = "render_cancelled", reason = "aborted") {
|
|
@@ -426046,7 +428284,6 @@ ${right22.raw}`)
|
|
|
426046
428284
|
run(stream2, cb, onError);
|
|
426047
428285
|
return c.newResponse(stream2.responseReadable);
|
|
426048
428286
|
};
|
|
426049
|
-
DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve11(new URL(import.meta.url).pathname, "../../..", "renders");
|
|
426050
428287
|
Semaphore = class {
|
|
426051
428288
|
constructor(maxConcurrent) {
|
|
426052
428289
|
this.maxConcurrent = maxConcurrent;
|
|
@@ -429789,7 +432026,8 @@ Instruction: ${instruction}`
|
|
|
429789
432026
|
};
|
|
429790
432027
|
ClaudeProvider.MOTION_MODELS = {
|
|
429791
432028
|
sonnet: "claude-sonnet-4-6",
|
|
429792
|
-
opus: "claude-opus-4-
|
|
432029
|
+
opus: "claude-opus-4-7",
|
|
432030
|
+
"opus-4-6": "claude-opus-4-6"
|
|
429793
432031
|
};
|
|
429794
432032
|
claudeProvider = new ClaudeProvider();
|
|
429795
432033
|
}
|
|
@@ -447408,7 +449646,8 @@ var init_ai_motion = __esm({
|
|
|
447408
449646
|
init_validate();
|
|
447409
449647
|
MODEL_MAP2 = {
|
|
447410
449648
|
sonnet: { provider: "claude", modelId: "claude-sonnet-4-6" },
|
|
447411
|
-
opus: { provider: "claude", modelId: "claude-opus-4-
|
|
449649
|
+
opus: { provider: "claude", modelId: "claude-opus-4-7" },
|
|
449650
|
+
"opus-4-6": { provider: "claude", modelId: "claude-opus-4-6" },
|
|
447412
449651
|
gemini: { provider: "gemini", modelId: "gemini-2.5-pro" },
|
|
447413
449652
|
"gemini-3.1-pro": { provider: "gemini", modelId: "gemini-3.1-pro-preview" }
|
|
447414
449653
|
};
|