feat(release): Slopmotion renders the release videos, not a still I found lying around
I had `master yt render` wrap each track in a still image, and picked that still
from `output/*.jpg`. PLN: "i dont like these covers, wait where are tehse genai
images from? these are not great sources! we wanna use slopmotion for videos
remember?" Both objections land, and the first is the one worth recording:
* Those nine illustrations are UNTRACKED and have no recorded provenance.
`6c3272c9 refactor: Remove covers from git` had deliberately taken covers out
of this repo, so "sitting in output/" was evidence against using them, not
for it. I built a per-bank rights ledger for the audio this same session —
one that refuses a sample bank precisely because its origin is unrecorded —
and then reached for pictures off the floor. The discipline has to apply to
every asset in a release or it is not a discipline.
* Slopmotion already does this properly, already supports `--shape landscape`
at 1920x1080 explicitly "for YouTube", and has already produced a real
7m26s landscape render. Nothing needed inventing.
So this bridges the release plan to `visuals/slop/render_slop_clip.mjs`, naming
its output exactly what `tidal_ears.yt.video_path` produces — imported from the
adapter rather than reimplemented, because two copies of a filename rule is how
a renderer and an uploader come to disagree about which file is track 7.
## Realtime is the whole scheduling story
Slopmotion captures in realtime by design: Hydra's clock is wall time, so
frame-stepping runs motion ~3x fast and drifts off the audio it reacts to. A
full-length render therefore costs the track's own duration. OPAL-26 measures
**2h25m** of headless Chromium for the landscape shape — 1h12m of continuous mix
plus 1h13m of tracks. Too long for a shell job that dies with its terminal, so
`--unit` writes a `systemd --user` service with `TimeoutStartSec=0`. Renders are
resumable, so an interruption costs one clip.
Preflight refuses before spending any of that: node >= 22 (system node is 16 and
fails), the dev server actually answering on :5173, every audio file present,
the playset known to the 24-pack catalog.
## The join that had to stay explicit
`clip_ideas.json` agrees with the release plan on neither axis. Its titles are
shorter or French ("Sunshine", "La Revolution Sera Samplee") and its
`setlist_pos` follows an EARLIER running order — its 4 is Take five Drops where
the plan's performance 4 is Am i Doing it Right. So position is not a join and
title equality only catches 4 of 6 live ideas. Fuzzy matching would be worse
than nothing: it puts a look on the wrong track silently. A two-entry alias
table takes it to 6 of 15; the other 9 report no playset and the tool refuses to
guess, because which visual goes with which track is PLN's call.
Showing
armada/tide-table/render_release_videos.py
0 → 100644
This diff is collapsed.
Click to expand it.
Please
register
or
sign in
to comment