Two issues fixed:
1. Source frame rate was wrong. The script trusted ffprobe, which on this
re-wrapped proxy reports 25 fps. The real number for the EDL/FCPXML and
for what the cutter sees in the NLE comes from config.toml's
edl_frame_rate (here 23.976). Source fps now reads that value first;
ffprobe is only a fallback. Trailer fps still probes ffprobe (correct
for the trailer file) with optional config override.
2. Stills in CUTTER_REPORT.md showed as broken links because output/ is
gitignored, so the git server can't serve them. Stills are now embedded
as base64 data URIs directly in the markdown. The file is therefore
self-contained and renders in any markdown viewer including the git
server's web preview.
3. New CUTTER_REPORT.html alongside the markdown: same data, proper card
layout, side-by-side trailer/source columns per beat, base64-embedded
stills, and (with --with-clips) base64-embedded 3 s MP4 video previews
so the cutter can sight-check phase agreement directly in a browser.
The auto-regen on each match writes both files; --with-clips is opt-in
from the CLI for slower full renders.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
README: 550 -> 308 lines. The dense algorithm prose was moved verbatim to
docs/ALGORITHM.md and replaced in the README with a compact "Wenn ein Match
falsch wirkt" troubleshooting table and a link. The cutter-facing intro
points at the new in-report stills instead of the old HTML report.
Cutter report:
- Per-side frame rates: trailer timecodes use the trailer file's fps
(typically 25), source timecodes use the source file's fps. ffprobe is
used to detect each side; falls back to edl_frame_rate if unavailable.
- Side-by-side trailer/source preview stills extracted via ffmpeg, taken
~30% into the beat / match window. Stored under output/cutter_stills/
(gitignored). Re-rendered only when the underlying video is newer than
the cached jpg.
- Compact table at the top, detailed per-beat sections below with the
stills inline so the cutter can sight-check phase agreement directly.
- New --no-stills flag for fast text-only regeneration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- New CUTTER_REPORT.md: per-beat hand-off table for the video editor doing
the manual recut. Per beat: trailer SMPTE in/out, source SMPTE in/out,
scene id, score, status (OK / ? / MAN.), and a one-line phase
description from the cached vision text.
- New scripts/generate_cutter_report.py: pure renderer that reads the
current cache (match_results.json + trailer_beats.json + optional
vision_descriptions.json) and writes CUTTER_REPORT.md. No side effects on
the cache.
- cli.py: after every successful match the cutter report is regenerated
automatically (best-effort; failures are logged and do not abort).
- README.md: new top-section "Fuer den Cutter" describing exactly what the
editor needs (which two files to look at, how the status flag works,
the recommended NLE workflow). The technical algorithm description
follows below.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>