recap: cache transcribe/align + subtitle single-overlay-stream approach
transcribe.mjs + align.mjs now hash their inputs (recap.mp3 / words.json
+ segments) and skip work when outputs are already valid for the same
hash. --force overrides. Saves ~100s per rerun on the oven CPU.
Subtitles redesigned to fix the oven-encode bottleneck: subtitles.mjs
now renders full-frame 1080×1920 transparent PNGs (pill positioned at
y=1690) plus a blank.png. New subtitle-track.mjs emits a concat-demuxer
file that sequences subtitle PNGs and blank gaps with stored durations.
build-filter.mjs drops the 135-deep movie= overlay chain and replaces
it with a single overlay of the subtitle stream as input #2.
compose.fish takes the subtitle track as `-f concat -i subtitle-track.txt`
input #2, with waltz bumped to input #3.
Result: the compose ffmpeg's filter graph collapses from 276 lines to
~7. The previous 6+ hour projection drops to a few minutes — the deep
movie= chain was the wall, not the encoder.
See feedback memory:
- feedback_recap_subtitles_required.md
- feedback_recap_ac24_cli.md (next-iter cache layer)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>