A homemade "AutoEdit" alternative: a folder full of clips + one sentence of briefing → a ready, roughly-cut Premiere timeline. Claude understands the content of your footage (via the transcripts), picks the strongest soundbites, orders them thematically and writes a Premiere-importable XML. You jump straight into the fine cut.
Built for content-driven videos — vlogs, explainers, podcasts: anything where the message matters, not the picture.
The actual editorial choice (which soundbites make it in, in what order, what gets dropped) is made by Claude in Claude Code, by reading the transcripts. This repo is not a standalone program — it's a Claude Code template. Without Claude Code you only have the two mechanical ends (transcribe + build XML), but not the selection. A fully automatic variant (local LLM / API) would be "stage 2" — deliberately not built (yet).
Folder of clips
│
▼ prep.py ── Whisper per clip (word timestamps) + ffprobe metadata
│ writes: transcripts.md + cut.py (scaffold)
▼ [Claude reads transcripts.md] ◄── the "brain": selection + ordering
│ fills the EDL in cut.py
▼ [you review & fix cut.py] ◄── your control stop before the build
│
▼ build_xml.py ── builds FCP7 XML (video + stereo audio + sequence format)
│ writes: cut.xml + cut_plan.md
▼
Import into Premiere → ready, roughly-cut sequence
| File | Role |
|---|---|
prep.py |
Front end. python prep.py "<folder>" --briefing "…" → walks every clip, runs Whisper per clip (JSON is cached/skipped), measures fps/resolution/aspect via ffprobe, writes transcripts.md and scaffolds cut.py. Suggests the sequence format and warns on mixed footage. |
cut.py |
The job (per project, generated by prep.py). Holds CLIPS_DIR, BRIEFING, SEQ_* and the EDL — the latter is filled by Claude while reading transcripts.md. cut.example.py shows a finished cut. |
build_xml.py |
Back end / translator. Imports from cut.py, builds the FCP7 XML + a human-readable cut_plan.md. |
transcribe.py is the (vendored) Whisper script; config.py holds the paths.
Edit Decision List — the list that says "from this file take the section from second X to second Y", per clip, in the order of the finished video:
EDL = [
("intro.mp4", 2.30, 16.35, "Hook: what today is about"),
("meeting.mov", 17.00, 29.32, "the strong take, repeat discarded"),
]- Setup once — see
docs/SETUP.md(two venvs: otio + Whisper, ffmpeg, paths inconfig.py). - In Claude Code: "Folder
D:\…\Footage, make a 90-sec recap, the best lines, casual tone." - Claude runs:
prep.py→ readstranscripts.md→ fillscut.py→ (you review) →build_xml.py. - In Premiere:
File → Import → cut.xml.
How Claude drives the flow is described in CLAUDE.md.
OpenTimelineIO's fcp_xml adapter writes an incomplete XML — three things had to
be added back via ffprobe measurement + XML post-processing, otherwise Premiere
refuses it:
- Audio channels/sample rate per
<file>— missing → "channel mismatch", Premiere guesses mono, relink fails. - Real audio clip items — the adapter only creates empty stubs → no sound; we build the stereo tracks from the video clip items and link them.
- Sequence
<format>— missing → Premiere assumes 640×480 / 4:3; we write in resolution/fps/pixel aspect and recompute clip positions to the target frame rate.
For mixed footage (e.g. 30 + 60 fps) the real rate is read per clip via
ffprobe and converted frame-accurately; the target sequence format is suggested
by prep.py, which asks when in doubt (guessing would be wrong).
- Claude judges only the transcript content — not picture, sharpness or framing. Strong for talking-head without B-roll, weak for picture-driven stories.
- Whisper does not label speakers (diarization would be a future stage).
- Premiere is picky about XML import — tested with FCP7 XML (
fcp_xml), confirmed frame-accurate.
