Skip to content

reelee target: camera-track motion, a commentary-production manifest, and the studio tour - #35

Merged
thorwhalen merged 3 commits into
mainfrom
commentary-tour
Sep 25, 2026
Merged

thorwhalen merged 3 commits into
mainfrom
commentary-tour

Conversation

@thorwhalen

Copy link
Copy Markdown
Collaborator

A walkthru tour can now be delivered as a commentary production: a Ken Burns film whose camera follows the document's camera track, packaged as the manifest braidio imports. The first one is a narrated tour of reelee-studio's Commentary screen, using actually-romantic as the example (examples/reelee_studio_tour/).

What

  • render_plans(..., path_builder=) is the camera strategy. index_path_builder is the default and exactly the old behaviour (a test pins it). camera_path_builder(Framing(...)) projects each step's CameraKeyframe (focus rect plus zoom) onto a named burns move and frames it with burns.resolve_move. That is the resolver braidio's render and the studio's move preview also use, so the camera closes on the element a step is about. audio_out= keeps the assembled recording.
  • to_production_manifest(plans, ..., framing=) returns braidio's ProductionManifest built from the same plans. It takes the same Framing, gets the film size the way burns does, and refuses an easing a panel record can't carry. It declares moves: "rendered" (needs importing: a manifest may declare its moves were rendered (moves="rendered") braidio#91) and imports nothing from braidio.
  • examples/reelee_studio_tour/: studio_tour.py is the authoring source (35 shots, pure core, run by test_examples). make_studio_tour.py runs capture (walkthru play() over the studio's acture commands, in Chrome, with a synthetic cursor), then narrate (ElevenLabs eleven_v3), render, manifest, and import. The README says how to re-record the tour.
  • DECISIONS D16.

Gate

pytest: 200 passed (7 new tests in tests/test_reelee_production.py, and the tour document in test_examples.py), plus ruff check. End to end: 35 shots captured against a throwaway copy of actually-romantic, 35 lines voiced (each transcribed with Whisper and matched to its script), a 4:02 film rendered, imported, npm run smoke:studio green (7 screens and 5 dialogs × 3 widths) against a backend bound to the result, and the film and recording served by the live server's reelee code.

An independent adversarial review found no blockers. It rendered a synthetic screenshot through both paths and got identical camera rects at every t checked. All six should-fixes are folded in (one Framing for both sides, a size check, easing refused, a zero-zoom guard, an off-screen focus failing capture, braidio refusing a bad move before writing).

Not covered: CI does not install the reelee extra, so the render-target tests skip there and ran locally only.

…st; the studio tour example

- render_plans takes a path_builder: index_path_builder (default, unchanged)
  or camera_path_builder, which frames each step's CameraKeyframe (focus rect
  + zoom) with burns.resolve_move, the resolver braidio's render and the
  studio's move preview share. audio_out keeps the assembled recording.
- to_production_manifest: braidio's ProductionManifest from the same plans,
  moves declared 'rendered', so a rendered demo imports as a commentary
  production that opens and edits in reelee-studio.
- examples/reelee_studio_tour: a narrated tour of the studio's Commentary
  screen (actually-romantic), captured through the studio's acture commands
  with walkthru's play(), voiced with ElevenLabs, rendered, packaged.
- DECISIONS D16.
From the adversarial review:
- Framing (default move, aspect, pixel density, easing) is taken by BOTH
  camera_path_builder and to_production_manifest, so the records cannot drift
  from the render; an easing no panel record can carry is refused.
- The film size is worked out the way burns does (first picture at the
  framing's aspect), no longer a free parameter that could disagree.
- A non-positive keyframe zoom names no move (no ZeroDivisionError on the
  default path).
- Tour: a shot whose focus is off screen fails at capture, naming the shot;
  the recording ships as mp3 (braidio serves episodes as audio/mpeg); the
  README says to import into a fresh root.
…refuses it, capture reports it on screen

The product never labels a cost 'free' (reelee-web#372). build_document
refuses a line saying a banned cost word; capture saves each shot's words on
screen beside the picture and flags one the studio still shows.
@thorwhalen
thorwhalen merged commit a996213 into main Sep 25, 2026
12 checks passed
@thorwhalen
thorwhalen deleted the commentary-tour branch September 25, 2026 12:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant