Shot Selector v3.6 (DP) - Akki
The 'data provider' that slices one shot out of your production CSV — and hands you the numbers around it
- SEL_shot_details
- SEL_character_count
- SEL_shot_name
- SEL_scene_number
- SEL_scene_name
- SEL_shot_number_in_scene
- SEL_shot_data_JSON
- total_shot_count
- total_character_count
- total_scene_count
- scene_start_indices
- scene_shot_counts
- unique_set_indices
- total_shot_count_list
Your production shot list is one CSV, but you don't render the whole film in one pass - you render shot by shot. Shot Selector is the node that turns "which shot are we on?" into a single row's worth of data you can feed the rest of the pipeline. It's the Phase 4 entry point in the AkkiNodes workflow: after the Pro Shot List Parser produces the canonical CSV, this node's job is to pull out shot 7 (or 42, or 113) and hand you everything about it, plus a batch of global stats so loops know where they are.
The "(DP)" in the display name is the giveaway - it calls itself the Data Provider, and that's the honest job description. It's not an LLM node; it's a fast, deterministic CSV reader with opinions about how the numbers should be shaped.
How it works
Two inputs, both simple:
- csv_report - the canonical shot list CSV, usually wired from
ProShotListParser'sfull_report_csv(or read back from disk with a loader). - shot_index (default
1) - which shot, 1-based, to select.
It parses the CSV once and computes all the global stats from that single pass, then processes the target row. The 14 outputs split cleanly into two groups, and the naming tells you which is which:
Selected (the SEL_ prefix - data for the current shot):
- SEL_shot_details - a formatted block of the shot's key fields (scene, shot type, location, description, characters, dialogue…).
- SEL_shot_name, SEL_scene_number, SEL_scene_name, SEL_shot_number_in_scene - the identity fields you'll use as filename tokens or keys for other loaders.
- SEL_character_count - how many characters are in this shot.
- SEL_shot_data_JSON - an enriched JSON dump of the row, including
CHARACTERS_LIST,PROPS_AGGREGATED_LISTandCOSTUMES_AGGREGATED_LIST. This is the one a serious workflow reaches for.
Global (everything about the whole production):
- total_shot_count, total_character_count, total_scene_count - the headline numbers.
- scene_start_indices, scene_shot_counts, unique_set_indices, total_shot_count_list - list outputs for looping.
total_shot_count_listis literally[1..N], which makes "loop over every shot" a trivial ListIterator problem.unique_set_indicesgives you the first index of each distinct location, handy for set-by-set rendering.
Installing
It ships with the AkkiNodes suite, so you install the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/routhakash/AkkiNodes-LLM-Suite-for-ComfyUI
Windows: right-click install.bat and Run as administrator once (installs llama-cpp-python==0.3.9 and openai), drop a GGUF model into ComfyUI/models/llms/, restart. Linux/macOS: pip-install those two packages into your ComfyUI environment manually.
Gotchas
- The CSV column names matter and they're uppercase-ish. The parser reads
CHARACTERS,SCENE,LOCATIONcase-insensitively, but it expects those columns to exist. If your CSV came from a different source with different headers,SEL_character_countand the scene stats will quietly come back as zeros. - It's defensive to the point of being terse. A bad or empty CSV returns an error tuple -
("ERROR: Invalid CSV", 0, "ERROR", ...)across all 14 outputs - rather than throwing. If your loop suddenly starts feeding "ERROR" strings everywhere, check thatcsv_reportis actually a CSV and not a filename or a prose report. shot_indexis 1-based and out-of-range is an error, not a silent wrap. That's intentional: an out-of-range index means your loop is mis-sized, and you want to know.- Empty cells come back as blank strings, not "None". v3.6 deliberately cleaned that up - the docs note earlier versions returned literal
Nonetext that polluted prompts. If you seeNonein outputs, you're on an old cached node definition; refresh the pack.
Zero community discussion exists for this node - the source is the spec. It's unglamorous, but for a shot-by-shot render loop, it's the node that turns a static CSV into a controllable iteration variable.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| csv_report | STRING | — | |
| shot_index | INT | 1 | — |
Outputs (14)
| Name | Type | Description |
|---|---|---|
| SEL_shot_details | STRING | — |
| SEL_character_count | INT | — |
| SEL_shot_name | STRING | — |
| SEL_scene_number | INT | — |
| SEL_scene_name | STRING | — |
| SEL_shot_number_in_scene | STRING | — |
| SEL_shot_data_JSON | STRING | — |
| total_shot_count | INT | — |
| total_character_count | INT | — |
| total_scene_count | INT | — |
| scene_start_indices | INT | — |
| scene_shot_counts | INT | — |
| unique_set_indices | INT | — |
| total_shot_count_list | INT | — |