Generate professional shot lists from screenplays and scripts. Use when user uploads a screenplay (.fountain, .fdx, .txt, .pdf, .docx) or describes scenes for production planning. Parses scripts to extract scenes, helps determine camera setups, shot types, framing, and movement through collaborative discussion, then generates beautifully formatted PDF shot lists for production. Triggers include requests to create shot lists, plan shots, break down scripts for filming, or organize camera coverage.
Parse screenplays, collaboratively determine shots, and generate production-ready PDF shot lists.
Support formats: .fountain, .fdx, .txt, .pdf, .docx
Extract from script:
import re
def parse_screenplay(text):
"""Extract scenes from screenplay text."""
scenes = []
scene_pattern = r'^((?:INT\.|EXT\.|INT\./EXT\.|I/E\.)\s+.+)$'
lines = text.split('\n')
current_scene = None
scene_num = 0
for i, line in enumerate(lines):
line = line.strip()
if re.match(scene_pattern, line, re.IGNORECASE):
if current_scene:
scenes.append(current_scene)
scene_num += 1
current_scene = {
'number': scene_num,
'heading': line,
'characters': set(),
'action_beats': [],
'content': []
}
elif current_scene:
current_scene['content'].append(line)
if line.isupper() and len(line) > 1 and len(line) < 40:
if not any(t in line for t in ['CUT TO', 'FADE', 'DISSOLVE']):
current_scene['characters'].add(line.split('(')[0].strip())
if current_scene:
scenes.append(current_scene)
for s in scenes:
s['characters'] = list(s['characters'])
return scenes
After parsing, present scenes and discuss coverage. For each scene ask:
| Type | Code | Use For | |------|------|---------| | Wide/Establishing | WS | Location, groups | | Full Shot | FS | Full body, action | | Medium Shot | MS | Dialogue, interaction | | Medium Close-Up | MCU | Emotional dialogue | | Close-Up | CU | Reaction, emotion | | Extreme Close-Up | ECU | Critical detail | | Over-the-Shoulder | OTS | Dialogue coverage | | Two-Shot | 2S | Paired characters | | Insert | INS | Props, details | | POV | POV | Character perspective |
| Movement | Code | Effect | |----------|------|--------| | Static | STATIC | Stability | | Pan | PAN | Follow horizontally | | Tilt | TILT | Reveal height | | Dolly | DOLLY | Approach/retreat | | Tracking | TRACK | Follow movement | | Crane | CRANE | Epic scale | | Handheld | HH | Tension, energy | | Steadicam | STEDI | Fluid following |
| Angle | Effect | |-------|--------| | Eye Level | Neutral | | Low Angle | Power | | High Angle | Vulnerability | | Dutch | Unease |
shot_entry = {
'scene': 1,
'shot': 'A',
'setup': 1,
'shot_type': 'MS',
'framing': 'Medium on Sarah',
'angle': 'Eye Level',
'movement': 'STATIC',
'lens': '50mm',
'description': 'Sarah enters, sees the letter',
'characters': ['SARAH'],
'notes': 'Practical window light'
}
Master → Medium → Close-ups → Inserts
Use scripts/generate_shot_list_pdf.py for professional output.
| Column | Content | |--------|---------| | Shot # | Scene.Shot ID | | Setup | Camera setup | | Type | Shot type code | | Framing | Description | | Move | Camera movement | | Action | What happens | | Notes | Technical notes |
Output to /mnt/user-data/outputs/shot_list_{project}.pdf
references/shot_terminology.md - Complete glossaryreferences/coverage_patterns.md - Common coverage strategiesGenerate or edit images via Gemini 3 Pro Image (Nano Banana Pro).
Batch-generate images via OpenAI Images API. Random prompt sampler + `index.html` gallery.
Generate spectrograms and feature-panel visualizations from audio with the songsee CLI.
Extract frames or short clips from videos using ffmpeg.
Search GIF providers with CLI/TUI, download results, and extract stills/sheets.
Category:media-generate