-
feat(release): Slopmotion renders the release videos, not a still I found lying around · e794a441
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.PLN (Algolia) authorede794a441
×