Zura · Load Reviewed Shot
The approval gate that re-hashes your source before rendering
- source_clip
- performer_mask
- seedance_guide
- clip_details
- genuine_performer_mask
Most "load a clip" nodes will happily load whatever path you give them. GenjLoadReviewedShot ("Zura · Load Reviewed Shot") is stricter in a way that's worth understanding, because it's the node that stands between the mask you approved and the 20-minute render you're about to start.
Two IDs, and why they're separate
It takes shot_id (the reviewed shot from GenjSaveReview) and approved_shot_id. The second one exists because Studio fills in the approval after you click through the review, and the node refuses to run unless the two agree:
Approve the reviewed mask in Zura Studio before generation. Standalone graphs require matching reviewed and approved shot IDs.
In a hand-built graph, that means wiring the same string into both fields. It's a two-field handshake you'd normally do with a boolean, but a boolean can't tell you which shot you approved - and that's the failure this is designed to prevent.
Before returning anything it re-reads review.json and re-hashes every file in the shot folder, then re-hashes the original source video against the hash recorded at selection time. Change the clip on disk, re-encode it, or move it, and you get The original source changed. Prepare and review the shot again. Same story for a reference audio track: The reference audio changed. Prepare the shot again. The node also sets IS_CHANGED to a NaN sentinel when the IDs don't match, which forces ComfyUI to re-execute it rather than serving a cached result.
The three optional knobs
- render_long_edge (0–1920, default 0).
0 uses the reviewed preview.Set it to 1280 or 1920 and the node re-reads the original footage at full resolution, scales it with lanczos, and resizes the approved mask to match - so you review at 768 and render at 1280 without losing the approval. It's cached per size, so the re-read only happens once. Note the model canvas is rounded to a 64-pixel grid here, unlike the even-pixel rounding inGenjSelectClip, because this raster feeds a diffusion model. - output_scale (1 or 2). 2 halves the model canvas, which is the escape hatch when you're about to blow out VRAM. Delivery resolution is tracked separately and restored at export.
- preview_seconds (0–30). Trims everything - source, mask, guide - down to a short test take from the start of the shot. This is what the pack's H3 two-second preview uses.
Outputs
Five of them, and the names are honest:
source_clip- aVIDEOof the reviewed footage at your chosen render size.performer_mask- a video (not aMASK), the approved combined mask rendered as frames. It's what you feed to the nodes that expect a mask video.seedance_guide- theguide.mp4from the review: guidance frames plus the guidance audio, ready as a reference clip for a hosted model.clip_details-GENJ_CLIP, now carryingreview_shot_idand the export raster. Everything downstream that needs to prove provenance reads this.genuine_performer_mask- the separately saved performance-only mask, or the combined mask as a fallback if the review didn't include one.
Install
This node ships with Zura Nodes: ComfyUI Manager → search Zura Nodes → install → restart. Manual install:
cd ComfyUI/custom_nodes
git clone https://github.com/ZURAVFX/ComfyUI_zura_nodes
python -m pip install -r ComfyUI/custom_nodes/ComfyUI_zura_nodes/requirements.txt
PyAV and ffmpeg on PATH do the re-read and rescale; there's no model involved, so this one works on a box that has the pack installed and nothing else downloaded.
Gotchas
Don't delete the shot folder. The approved mask lives in output/genj/reviews/<shot_id>/, and clearing your outputs breaks the gate with an unhelpful-looking file error. If you're short on disk, delete takes from genj/final, not genj/reviews.
Mismatched IDs after an edit. If you tweak the mask and re-run GenjSaveReview, the shot ID changes and the old approval no longer validates. That's the feature working; paste the new ID.
Expecting a MASK from performer_mask. It's a video. If a node wants a MASK, that's what ZuraWanReviewedFrames and friends are for - a very common wiring mistake when you're reading the outputs cold.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| shot_id | STRING | — | |
| approved_shot_id | STRING | Studio fills this automatically after review. Standalone graphs must use matching reviewed and approved IDs. | |
| render_long_edgeopt | INT | 00–1920 | 0 uses the reviewed preview. Higher values reread the original footage and resize the approved mask. |
| output_scaleopt | INT | 11–2 | — |
| preview_secondsopt | FLOAT | 0.000–30 | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| source_clip | VIDEO | — |
| performer_mask | VIDEO | — |
| seedance_guide | VIDEO | — |
| clip_details | GENJ_CLIP | — |
| genuine_performer_mask | VIDEO | — |