Skip to content

feat(editor): per-clip EDL editor — recut engine, /edl + /rerender endpoints, MCP tool + frontend - #62

Open
victorcavero14 wants to merge 2 commits into
mainfrom
feat/clip-editor
Open

feat(editor): per-clip EDL editor — recut engine, /edl + /rerender endpoints, MCP tool + frontend#62
victorcavero14 wants to merge 2 commits into
mainfrom
feat/clip-editor

Conversation

@victorcavero14

@victorcavero14 victorcavero14 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a per-clip editor: an EDL (edit decision list) recut engine on the backend and a full-screen ClipEditor overlay in the dashboard.

Backend (d9b15b4)

  • recut.py: cut/concat recut engine — segment-level re-render of an existing clip (fast recut inside the canonical range, full re-frame when segments reach back into the source)
  • New GET /api/clip/{job}/{index}/edl + POST /api/clip/rerender endpoints
  • Exposed as an MCP tool alongside the existing pipeline tools
  • Concat lists use absolute paths — the FFmpeg concat demuxer resolves relative entries against the list file's directory, not the process cwd

Frontend (b884131)

  • ClipEditor.jsx — full-screen editor overlay:
    • Dual-track timeline (clip track + source track) with draggable trim handles, drag-to-paint new segments on the source, split/reorder/delete, and a playhead mapped onto the last rendered recipe
    • Word-snapped cuts with an interactive transcript panel ("start here" / "end here" per word)
    • Undo/redo via reducer history (a whole drag undoes as one step), keyboard shortcuts (space / S / ⌫ / ⌘Z / Esc), dirty-state guard with discard confirmation
    • Fast-recut vs full-re-frame path indicator, caps/limits validation, quota-aware error handling
  • App.jsxeditingClip state + handleClipRerendered: after a recut, results, reopened-project state and per-clip edit state re-sync (burned layers reset, ResultCard remounts from the new file)
  • ResultCard.jsx — "edit clip" entry button (Scissors icon)

Visual style

The editor is built entirely on the app's existing design system — eyebrow / readout typography, btn-primary / btn-ghost / btn-quiet / btn-danger buttons, paper / ink / brass / rule tokens, rounded-input / rounded-card, lowercase labels, animate-fade, and the custom scrollbar — no new visual language introduced. Segment colors are oklch values anchored on the brand brass.

Verification

  • python3 -m py_compile recut.py
  • npm run build (production Vite build) ✓ — only pre-existing warnings
  • Manual review of the new component for design-system and codebase-convention consistency ✓

🤖 Generated with Claude Code

victorcavero14 and others added 2 commits August 5, 2026 11:03
…ndpoints, MCP tool

Every clip now exposes its recipe (which source segments it was cut from)
via GET /api/clip/{job}/{i}/edl, and POST /api/clip/rerender re-renders it
from an edited segment list: fast path recuts from the already-reframed
canonical file, source path re-reframes from the retained source
(--keep-original now passed for URL jobs). Captions/subtitles/transcript
remap piecewise through recut.virtual_transcript for multi-segment clips.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…sults

- ClipEditor.jsx: per-clip edit overlay driving the /edl + /rerender backend
- App.jsx: editingClip state, handleClipRerendered syncs results, reopened
  project state and per-clip edit state after a recut (burned layers reset)
- ResultCard.jsx: "edit clip" entry button (Scissors), layout tweak
- recut.py: write absolute paths in the concat list — the demuxer resolves
  relative entries against the list file's dir, not the process cwd

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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