@glissade/cli 0.41.0 → 0.41.1-pre.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/render.js CHANGED
@@ -920,6 +920,11 @@ async function planFinalAudio(opts, timelineClips, duration, container) {
920
920
  audioInputs: [],
921
921
  audioArgs: []
922
922
  };
923
+ const missing = mix.inputs.find((p) => !existsSync(p));
924
+ if (missing !== void 0) {
925
+ const isNarrationOrSfx = /(^|[/\\])hook-[^/\\]*\.wav$/i.test(missing) || /\.(narration|sfx)\b/i.test(missing);
926
+ throw new Error(`audio input not found: ${missing}\n` + (isNarrationOrSfx ? " A committed timing manifest references this cache file, but it is not on disk (the audio cache is usually git-ignored).\n Regenerate it with `gs narrate` (or `gs sfx`), or pass --narration off / --sfx off to skip the mix." : " Check the audio asset path, or pass --narration off / --music off / --sfx off to skip the mix."));
927
+ }
923
928
  const loud = await resolveLoudnessGainDb(opts, timelineClips);
924
929
  const filterComplex = loud !== null ? applyMixGainDb(mix.filterComplex, loud.gainDb, loud.limiter) : mix.filterComplex;
925
930
  if (loud !== null) process.stderr.write(`note: applying committed publish loudness gain ${loud.gainDb.toFixed(2)} dB${loud.limiter ? ` + true-peak limiter @ ${loud.limiter.ceilingDb} dBTP` : " (single-pass scalar)"}\n`);
package/dist/shards.js CHANGED
@@ -406,7 +406,7 @@ async function renderIncremental(a) {
406
406
  process.stderr.write(plan.kind === "splice" ? `incremental: ${renderFrames}/${total} frames changed — re-rendering those, splicing ${total - renderFrames} from the intermediate\n` : plan.kind === "unchanged" ? `incremental: 0/${total} frames changed — re-using the intermediate verbatim\n` : `incremental: full render (${prev ? "ineligible for splice" : "no prior intermediate"}) — building the intermediate for next time\n`);
407
407
  const work = mkdtempSync(join(tmpdir(), "glissade-incr-"));
408
408
  const segVideos = [];
409
- let done = 0;
409
+ let rendered = 0;
410
410
  try {
411
411
  for (let i = 0; i < segments.length; i++) {
412
412
  const seg = segments[i];
@@ -493,8 +493,10 @@ async function renderIncremental(a) {
493
493
  });
494
494
  }
495
495
  segVideos.push(segVideo);
496
- done += seg.end - seg.start + 1;
497
- opts.onProgress?.(Math.min(done, total), total);
496
+ if (seg.kind === "render" && renderFrames > 0) {
497
+ rendered += seg.end - seg.start + 1;
498
+ opts.onProgress?.(rendered, renderFrames);
499
+ }
498
500
  }
499
501
  const listFile = join(work, "concat.txt");
500
502
  writeFileSync(listFile, segVideos.map((p) => `file '${p.replace(/'/g, "'\\''")}'`).join("\n") + "\n");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glissade/cli",
3
- "version": "0.41.0",
3
+ "version": "0.41.1-pre.0",
4
4
  "description": "glissade CLI: headless rendering via backend-skia (+ FFmpeg mux).",
5
5
  "license": "Apache-2.0",
6
6
  "engines": {
@@ -28,15 +28,15 @@
28
28
  "@napi-rs/canvas": "^0.1.65",
29
29
  "esbuild": "0.28.0",
30
30
  "jiti": "^2.4.2",
31
- "@glissade/backend-skia": "0.41.0",
32
- "@glissade/core": "0.41.0",
33
- "@glissade/interact": "0.41.0",
34
- "@glissade/lottie": "0.41.0",
35
- "@glissade/narrate": "0.41.0",
36
- "@glissade/player": "0.41.0",
37
- "@glissade/scene": "0.41.0",
38
- "@glissade/sfx": "0.41.0",
39
- "@glissade/svg": "0.41.0"
31
+ "@glissade/backend-skia": "0.41.1-pre.0",
32
+ "@glissade/core": "0.41.1-pre.0",
33
+ "@glissade/interact": "0.41.1-pre.0",
34
+ "@glissade/lottie": "0.41.1-pre.0",
35
+ "@glissade/narrate": "0.41.1-pre.0",
36
+ "@glissade/player": "0.41.1-pre.0",
37
+ "@glissade/scene": "0.41.1-pre.0",
38
+ "@glissade/sfx": "0.41.1-pre.0",
39
+ "@glissade/svg": "0.41.1-pre.0"
40
40
  },
41
41
  "repository": {
42
42
  "type": "git",