Files
wehub-resource-sync 85453da49f
regression / regression-shards (style-16-prod style-9-prod style-17-prod iframe-render-compat variables-prod mp4-h265-sdr, shard-4) (push) Has been cancelled
regression / regression-shards (style-4-prod style-11-prod style-2-prod animejs-adapter typegpu-adapter parallel-capture-regression, shard-5) (push) Has been cancelled
regression / regression-shards (style-7-prod style-8-prod style-10-prod css-spinner-render-compat webm-transparency mp4-h264-sdr webm-vp9, shard-3) (push) Has been cancelled
regression / regression-shards (sub-composition-video style-18-prod raf-ball-render-compat font-variant-numeric sub-comp-t0 sub-comp-id-selector, shard-7) (push) Has been cancelled
Windows render verification / Detect changes (push) Has been cancelled
Windows render verification / Preflight (lint + format) (push) Has been cancelled
Windows render verification / Render on windows-latest (push) Has been cancelled
Windows render verification / Tests on windows-latest (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Fallow audit (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Producer: integration tests (push) Has been cancelled
CI / Producer: unit tests (push) Has been cancelled
CI / File size check (push) Has been cancelled
CI / Test: skills (push) Has been cancelled
CI / Skills: manifest in sync (push) Has been cancelled
CI / CLI: npx shim (macos-latest) (push) Has been cancelled
CI / CLI: npx shim (ubuntu-latest) (push) Has been cancelled
CI / CLI: npx shim (windows-latest) (push) Has been cancelled
CI / SDK: unit + contract + smoke (push) Has been cancelled
CI / Test: runtime contract (push) Has been cancelled
CI / Studio: load smoke (push) Has been cancelled
CI / Smoke: global install (push) Has been cancelled
CI / CLI smoke (required) (push) Has been cancelled
CI / Semantic PR title (push) Has been cancelled
Player perf / Detect changes (push) Has been cancelled
Player perf / Preflight (lint + format) (push) Has been cancelled
Player perf / player-perf (push) Has been cancelled
Player perf / Perf: drift (push) Has been cancelled
Player perf / Perf: fps (push) Has been cancelled
Player perf / Perf: parity (push) Has been cancelled
Player perf / Perf: scrub (push) Has been cancelled
Player perf / Perf: load (push) Has been cancelled
preview-regression / Detect changes (push) Has been cancelled
preview-regression / Preflight (lint + format) (push) Has been cancelled
preview-regression / Preview parity (push) Has been cancelled
preview-regression / preview-regression (push) Has been cancelled
regression / regression (push) Has been cancelled
regression / Detect changes (push) Has been cancelled
regression / Preflight (lint + format) (push) Has been cancelled
regression / regression-shards (hdr-regression style-5-prod style-3-prod mov-prores, shard-1) (push) Has been cancelled
regression / regression-shards (overlay-montage-prod style-12-prod chat missing-host-comp-id png-sequence portrait-edge-bleed, shard-6) (push) Has been cancelled
regression / regression-shards (style-13-prod style-6-prod vignelli-stacking gsap-letters-render-compat audio-mux-parity, shard-8) (push) Has been cancelled
regression / regression-shards (style-15-prod hdr-hlg-regression style-1-prod many-cuts vfr-screen-recording render-symlinked-assets, shard-2) (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Docs / Validate docs (push) Has been cancelled
Sync skills to ClawHub / Publish changed skills (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:58:35 +08:00

149 lines
4.0 KiB
JavaScript

import { strict as assert } from "node:assert";
import { execFileSync } from "node:child_process";
import { mkdtempSync, writeFileSync, rmSync } from "node:fs";
import { join, dirname } from "node:path";
import { tmpdir } from "node:os";
import { fileURLToPath } from "node:url";
import { test } from "node:test";
import { compileCutList } from "./cutlist.mjs";
const HERE = dirname(fileURLToPath(import.meta.url));
const SCRIPT = join(HERE, "..", "transcript-cut.mjs");
test("explicit --remove ranges invert to kept segments", () => {
const transcript = [
word("w0", "alpha", 0, 1),
word("w1", "beta", 1.2, 2),
word("w2", "gamma", 2.2, 5),
];
assert.deepEqual(compileCutList(transcript, { remove: "1-2.5" }), [
{ start: 0, end: 1 },
{ start: 2.5, end: 5 },
]);
});
test("--remove-words resolves inclusive word-index ranges to time ranges", () => {
const transcript = [
word("w0", "zero", 0, 0.5),
word("w1", "one", 0.6, 1),
word("w2", "two", 1.1, 1.5),
word("w3", "three", 2, 3),
];
assert.deepEqual(compileCutList(transcript, { removeWords: "1-2" }), [
{ start: 0, end: 0.6 },
{ start: 1.5, end: 3 },
]);
});
test("--remove-fillers drops case-insensitive matching words", () => {
const transcript = [
word("w0", "Hello", 0, 0.5),
word("w1", "Um", 0.5, 0.7),
word("w2", "world", 0.8, 1.2),
word("w3", "LIKE", 1.3, 1.5),
word("w4", "done", 1.6, 2),
];
assert.deepEqual(compileCutList(transcript, { removeFillers: "um,like" }), [
{ start: 0, end: 0.5 },
{ start: 0.7, end: 1.3 },
{ start: 1.5, end: 2 },
]);
});
test("--cut-silence removes only the center of long inter-word gaps", () => {
const transcript = [word("w0", "a", 0, 0.5), word("w1", "b", 2, 2.5), word("w2", "c", 2.7, 3)];
assert.deepEqual(compileCutList(transcript, { cutSilence: 0.8 }), [
{ start: 0, end: 0.65 },
{ start: 1.85, end: 3 },
]);
});
test("overlapping removal sources merge before inversion", () => {
const transcript = [
word("w0", "start", 0, 0.5),
word("w1", "um", 0.9, 1.1),
word("w2", "middle", 2.5, 2.8),
word("w3", "more", 3.1, 3.4),
word("w4", "end", 5.5, 6),
];
assert.deepEqual(
compileCutList(transcript, {
remove: "1-2.7",
removeWords: "2-3",
removeFillers: "um",
}),
[
{ start: 0, end: 0.9 },
{ start: 3.4, end: 6 },
],
);
});
test("kept slivers shorter than 0.2s are dropped", () => {
const transcript = [word("w0", "start", 0, 0.5), word("w1", "end", 2.5, 3)];
assert.deepEqual(compileCutList(transcript, { remove: "0.1-2.95" }), []);
});
test("--keep is inverse mode and coalesces direct kept ranges", () => {
const transcript = [word("w0", "start", 0, 0.5), word("w1", "end", 4.5, 5)];
assert.deepEqual(compileCutList(transcript, { keep: "3-4,1-2,1.5-2.5,4.1-4.2" }), [
{ start: 1, end: 2.5 },
{ start: 3, end: 4 },
]);
});
test("--plan on a fixture transcript prints the exact segment JSON", () => {
const dir = mkdtempSync(join(tmpdir(), "media-use-cutlist-"));
try {
const transcriptPath = join(dir, "fixture.json");
writeFileSync(
transcriptPath,
JSON.stringify([
word("w0", "hello", 0, 0.4),
word("w1", "um", 0.5, 0.65),
word("w2", "there", 0.7, 1),
word("w3", "pause", 2.2, 2.5),
word("w4", "end", 2.7, 3.2),
]),
);
const out = execFileSync(
process.execPath,
[
SCRIPT,
"--input",
"ignored.mp4",
"--transcript",
transcriptPath,
"--remove",
"0.9-1.2",
"--remove-fillers",
"um",
"--cut-silence",
"0.8",
"--plan",
],
{ encoding: "utf8" },
);
assert.deepEqual(JSON.parse(out), [
{ start: 0, end: 0.5 },
{ start: 0.65, end: 0.9 },
{ start: 2.05, end: 3.2 },
]);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
function word(id, text, start, end) {
return { id, text, start, end };
}