Nodes/S42 CutFlow/🎞 S42 CutFlow Thumbnail Strip
ComfyUI Node

🎞 S42 CutFlow Thumbnail Strip

A contact sheet for your clip — see every important frame at once

By GeekyGhost·Created 6 months ago·Updated 4 months ago· 3
🎞 S42 CutFlow Thumbnail Strip
  • clip
  • filmstrip
  • info
columns8
thumb_height120
max_frames24
show_frame_numbersyes
border2

A thumbnail strip - a filmstrip contact sheet - is the fastest way to see what your clip actually contains. Instead of scrubbing through frames, you get a grid of evenly sampled frames in one image, with frame numbers stamped on so you know exactly where each one lives. S42CF_ThumbnailStrip is S42 CutFlow's version, and it's the debug view you'll want after any operation that changes timing or content: check your trim points, verify a transition landed right, or confirm a speed ramp actually did what the curve said.

It's a Preview node, so it doesn't touch your footage - it takes a clip and emits a different kind of thing: a single image that's a summary. You connect the filmstrip output to any image preview or saver and read it like a contact sheet.

The inputs

  • clip - the footage to sample.
  • columns (int, default 8, max 20) - thumbnails per row. 8 is a good default; you'll drop it for tall clips or raise it for long ones.
  • thumb_height (int, default 120, range 32–480) - thumbnail height in pixels; width scales to match aspect. 120 is a working size; go bigger if you need to actually read detail in the frames.
  • max_frames (int, default 24, max 200) - total thumbnails. Here's the behavior worth noting: frames are evenly sampled across the whole clip, not taken from the start. So with max_frames=8 on a 121-frame clip you get frames 0, 17, 34, 51, 68, 86, 103, 120 - a true overview, not just the first 8 frames.
  • show_frame_numbers (yes/no, default yes) - stamps each thumbnail with its frame index. Keep it on; the whole point is knowing where things are.
  • border (int, default 2) - gap between thumbnails, drawn on a dark background.

How it works

Under the hood it computes evenly spaced indices, resizes each sampled frame with Lanczos, and pastes them into a grid with the frame-number labels drawn in. The output filmstrip is a single IMAGE frame (a one-frame batch), plus an info string reporting how many frames, rows, and the final grid size. If PIL is unavailable it degrades to returning the first frame - but PIL ships with ComfyUI, so you'll never hit that in practice.

Installing it

The whole S42 CutFlow suite installs together:

cd ComfyUI/custom_nodes/
git clone https://github.com/GeekyGhost/S42-CutFlow.git
pip install -r S42-CutFlow/requirements.txt   # Windows portable: python_embeded\python.exe -m pip

Or ComfyUI Manager, search S42 CutFlow, install, restart. It's under S42 CutFlow/Preview.

Gotchas

The main trap is the sampling model: because frames are evenly sampled across the whole clip, a 2-second clip with max_frames=24 samples every ~2 frames, while a 30-second clip with the same setting samples every ~30. That's a feature for overviews and a bug if you expected a fine-grained look at one region - for that, trim first, then thumbnail. Second, the default 8 columns × 24 max_frames gives you a 3-row strip at 120px tall, which fits a preview canvas nicely; bump max_frames to 200 and you get a big sheet, which is fine for saving but unwieldy on screen. Third, this is a low-res overview by design - use it to find problem frames, then pull the actual frame with a frame-extract node to inspect it. The workflow that saves me hours: Thumbnail Strip after a speed ramp or transition, so a bad curve or a glitched wipe shows up as one wrong-looking tile instead of a subtle artifact you'd have to scrub to find.

CategoryS42 CutFlow/Preview

Inputs (6)

NameTypeDefaultDescription
clipIMAGEVideo clip to create filmstrip from.
columnsINT82–20Number of thumbnails per row.
thumb_heightINT12032–480Height of each thumbnail in pixels.
max_framesINT242–200Maximum number of thumbnails. Frames are evenly sampled across clip.
show_frame_numbersCOMBOyesOverlay frame number on each thumbnail.
borderINT20–8Border/gap between thumbnails in pixels.

Outputs (2)

NameTypeDescription
filmstripIMAGE
infoSTRING