Camera control and motion — what separates slop from craft — step 7 of 8
Write audit_shot_list(shots) that takes a list of shot dicts and
returns a list of suggestion strings — one per shot that has a
problem.
Each shot is a dict with these keys:
description(str): the subject and actioncamera_move(str): the camera moveduration_sec(float): clip duration in seconds
Apply these checks IN ORDER for each shot. As soon as ONE check fires, emit a suggestion and move to the next shot:
- If
camera_moveis one of the generic words —"cinematic","dramatic","beautiful","epic", or empty""— emit:"shot {i}: '{camera_move}' is not a camera move. Specify one (push-in / orbit / track / pan / tilt / static)." - If
camera_movecontains the substring"dolly zoom"ANDduration_sec < 3.0: emit:"shot {i}: dolly zoom in {duration_sec}s is too fast — needs >=3s to read." - If
camera_movecontains the substring"orbit"ANDduration_sec < 4.0: emit:"shot {i}: orbit in {duration_sec}s won't complete cleanly — needs >=4s." - If
camera_movecontains the substring"push-in"ANDduration_sec < 2.0: emit:"shot {i}: push-in in {duration_sec}s reads as a jump — needs >=2s for the slow read." - If
descriptionis shorter than 20 characters: emit:"shot {i}: description too short ({len} chars) — needs subject + action + framing detail."
Shots are numbered starting at 1. If a shot passes all checks, emit NOTHING for it. Return the list of suggestions in shot order.
Five shots run. Expected output:
shot 1: 'cinematic' is not a camera move. Specify one (push-in / orbit / track / pan / tilt / static).
shot 2: orbit in 2.0s won't complete cleanly — needs >=4s.
shot 3: push-in in 1.0s reads as a jump — needs >=2s for the slow read.
shot 5: description too short (8 chars) — needs subject + action + framing detail.
Write audit_shot_list(shots) that takes a list of shot dicts and
returns a list of suggestion strings — one per shot that has a
problem.
Each shot is a dict with these keys:
description(str): the subject and actioncamera_move(str): the camera moveduration_sec(float): clip duration in seconds
Apply these checks IN ORDER for each shot. As soon as ONE check fires, emit a suggestion and move to the next shot:
- If
camera_moveis one of the generic words —"cinematic","dramatic","beautiful","epic", or empty""— emit:"shot {i}: '{camera_move}' is not a camera move. Specify one (push-in / orbit / track / pan / tilt / static)." - If
camera_movecontains the substring"dolly zoom"ANDduration_sec < 3.0: emit:"shot {i}: dolly zoom in {duration_sec}s is too fast — needs >=3s to read." - If
camera_movecontains the substring"orbit"ANDduration_sec < 4.0: emit:"shot {i}: orbit in {duration_sec}s won't complete cleanly — needs >=4s." - If
camera_movecontains the substring"push-in"ANDduration_sec < 2.0: emit:"shot {i}: push-in in {duration_sec}s reads as a jump — needs >=2s for the slow read." - If
descriptionis shorter than 20 characters: emit:"shot {i}: description too short ({len} chars) — needs subject + action + framing detail."
Shots are numbered starting at 1. If a shot passes all checks, emit NOTHING for it. Return the list of suggestions in shot order.
Five shots run. Expected output:
shot 1: 'cinematic' is not a camera move. Specify one (push-in / orbit / track / pan / tilt / static).
shot 2: orbit in 2.0s won't complete cleanly — needs >=4s.
shot 3: push-in in 1.0s reads as a jump — needs >=2s for the slow read.
shot 5: description too short (8 chars) — needs subject + action + framing detail.
this step needs the editor
on desktop today; in the app (coming soon). save your spot and we'll bring you back here when you're ready.