Workflows
Import media from a folder
MediaPool.ImportMedia accepts a list of files or directories.
Agent: media_import with paths: ["/abs/folder"] or a list of files.
CLI/MCP will return imported clips (name, media_id, path once the Lua inspect fix is loaded — re-click the bridge after install-bridge).
The current bin is wherever the Media Pool selection is (inspect → media.current_folder). Switch bins in the UI first, or stay in Master.
App Store Lite may not see arbitrary volumes. Prefer paths under ~/Movies (Resolve already uses ~/Movies/DaVinci Resolve).
Create a timeline and put clips on it
There is no timeline until timeline_count > 0. Placement fails without a current timeline.
timeline_ensure("Rough_v1")
timeline_place([
{"media_id": "…", "track_type": "video", "track_index": 1, "record_frame": 86400, "source_in": 0, "source_out": 240}
])
Or one call:
timeline_assemble(timeline="Rough_v1", paths=["/abs/folder"])
That imports, ensures the timeline, then appends every imported clip on V1 in order.
Clip colors (clip_set_color) are timeline labels: Orange, Apricot, Yellow, Lime, Olive, Green, Teal, Navy, Blue, Purple, Violet, Pink, Tan, Beige, Brown, Chocolate. Marker names Cyan/Mint/Red map to Teal/Lime/Violet. Color after place, and do not fire several MCP color calls at once — the Lua queue is serial (the client now locks so they wait instead of colliding).
Titles: timeline_set_timecode then timeline_insert_title (Text+, optional text). Over picture (cinematic establishing cards): timeline_overlay_title. Transitions: timeline_add_transition (Cross Dissolve; needs Resolve 21.1+ or clip handles). Motion: timeline_set_item_property ZoomX/ZoomY. LUT: timeline_apply_lut with a Resolve-relative .cube. Empty path clears the node. Do not put Film Looks/ print cubes (Fujifilm 3513DI, Kodak 2383) on Rec.709 DJI — those LUTs expect log/film scan; on Rec.709 they look dead and over-cooked. Leave drone footage native or use a log-to-Rec.709 cube only if the clip is actually D-Log.
Cinematic assembly (after Joris Hermans, Resolve 19): cull junk; 2–3 wides to set a location; then closer/low shots; titles over those wides; soundtrack on A1 and cut to beats in the UI (this API cannot blade or ripple).
timeline_place fields:
| Field | Meaning |
|---|---|
media_id / clip_name / path | How to find the pool item |
track_type | video (default), audio, subtitle |
track_index | 1-based; extra tracks are added if needed |
record_frame | Timeline destination (subframe allowed). Omit to append at end |
source_in / source_out | Source frames (startFrame / endFrame) |
media_type | 1 video only, 2 audio only |
Resolve cannot razor, trim, or move an item already on the timeline. Changing position means lift + place; grades/Fusion on the old item are lost. timeline_lift is implemented only on the Python runtime.
Proxy media
Two different jobs:
A. Edit the proxy files as the source (supported)
Import the proxy folder and assemble a timeline from those clips. Delivery later is a recut/relink problem, not this harness.
B. Camera originals in the pool, proxies linked (not exposed yet)
Resolve API: MediaPoolItem.LinkProxyMedia(proxyPath) / UnlinkProxyMedia(). No MCP tool yet. Do not ask the agent to “set proxy mode” — it cannot.
Matching convention if/when that tool exists: same stem, e.g. A001C001.mov ↔ A001C001_proxy.mov.
Typed markers
Registry: src/video_harness/types.yaml (override with VIDEO_HARNESS_TYPES).
| Type | Color | Scope | Duration |
|---|---|---|---|
beat | Cyan | timeline | point |
dialogue | Green | item | range |
broll | Blue | timeline | range |
chapter | Purple | timeline | point |
qc.flash | Red | timeline | point |
qc.audio | Orange | item | range |
keyword | Yellow | clip | range |
Scopes:
- timeline — sequence (chapters, beats)
- item — this use of a clip on the timeline (
unique_idrequired) - clip — media pool item (survives recuts)
customData is JSON video-harness.marker/v1. Color is what you see in Resolve.
Sidecar → markers:
[
{"type": "beat", "id": "beat-004", "at": "01:00:02:12", "source": "audio.onset"},
{"type": "dialogue", "id": "dlg-12", "at": 48, "duration_frames": 36, "media_id": "…"}
]
at is a timecode (HH:MM:SS:FF) or a frame number. Timeline timecode 01:00:00:00 at 24fps is frame 86400.
markers_from_metadata(..., from_clips=true) also maps pool fields (Keywords, Comments, Shot, Scene, Good Take) onto keyword / chapter clip markers.