String Resolution Seedance 2.5 Multimodal Video
A node that only outputs a string, and why you'd want it
- video
- string
Yes, it's a node whose entire output is one word. Pick 1080p and you get the string 1080p. That sounds useless until you've built a workflow around a closed video model and realised half your graph is now dropdowns that have to agree with each other by hand.
Seedance 2.5 has no open weights - it's ByteDance's API product, part of a commercial line where every flagship stays behind the API and only the accelerators and components go out free. So the node in your graph isn't a sampler, it's a client: it takes your reference media, your prompt and a resolution tier (480p / 720p / 1080p / 2k / 4k) and posts them somewhere. That tier is what this node solves. When your source clip changes, somebody has to re-pick the dropdown, and that somebody is you at 1am, after the third upscale.
String Resolution Seedance 2.5 Multimodal Video automates exactly that one dropdown. Its own description names its partner: it pairs with RunningHub Seedance 2.5 Multimodal Video in the author's separate ComfyUI-1hewOffice pack. This node is the string supplier; that node does the calling.
How it works
It reads the video's width and height - asking the VIDEO object for its dimensions first, and only decoding a frame tensor if that fails - then computes the pixel area and compares it against five target areas: 854x480, 1280x720, 1920x1080, 2560x1440, 3840x2160, which is 409,920 through 8,294,400 pixels.
The comparison is done in log space, picking the tier with the smallest |log(area) - log(target)|. That's a fancier way of saying the boundaries sit at the geometric midpoint between adjacent tiers, not the arithmetic one. Practically: 960x640 is 614,400 pixels, which is a hair under the 480p/720p midpoint of ~614,600, so it resolves to 480p - the technically correct answer under this rule, and slightly startling the first time you see it.
Matching on area rather than on the long side is the smart part. A portrait 1080x1920 clip is 2,073,600 pixels, identical to landscape 1080p, so it classifies as 1080p. Compare-and-judge-by-width logic would have called that 1920 and shoved it into a 2k tier, which is wrong for the aspect ratio you actually have.
There's no resize here, no network call, no math beyond a log and a min. It's a label picker.
Inputs and output
selection- the manual tier, default480p. This is a pass-through value, not a hint: with nothing connected tovideo, the node outputs exactly this and nothing else.video- optional. Connect it and the label is inferred from the clip; leave it off and you're using the node as a plain string selector, which is a legitimate way to have one place to change the tier from.string- the output. Wire it to the API node'sresolutioninput.
It's a plain STRING, so it plays nicely with the pack's other text plumbing - join it, compare it, route it through a switch if one workflow needs two possible tiers.
Installing it
Same pack, one install. Manager → search ComfyUI 1hewNodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/1hew/ComfyUI-1hewNodes
Fair warning: this node is a few dozen lines of Python and needs nothing, but the pack's requirements.txt pulls opencv-python, scikit-image, ultralytics, rembg, onnxruntime, av and friends because other nodes in the collection do. You're eating the whole dependency meal for the free bread roll. The paired Seedance node lives in a different repo (ComfyUI-1hewOffice), so you'll be installing two packs to use the pair as designed.
Where it goes wrong
The silent fallback is the one to know about. If the video's dimensions can't be read at all, the node doesn't warn you - it returns selection. Your auto-tracking workflow quietly becomes a fixed 480p workflow, and the only symptom is a soft video a few minutes and a few credits later. Keep selection set to a sensible tier rather than leaving it at the default.
Second: the label is not a request. Feeding a 4k clip tells the API node 4k, which is presumably slower and more expensive than 1080p. This node will happily report the tier you can least afford, because it's answering "how big is my input", not "how big should my output be". If you want a cap, put a fixed string in selection and don't connect video.
Third, treat the five tiers as exhaustive. The author's docs note that native1080p isn't part of the inference here, so if the API node's dropdown grows an option this node doesn't know about, it will never emit it. Two dropdowns to keep in sync is the problem this node removes - one tier list at a time.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| selection | COMBO | 480p | 5 options: 480p, 720p, 1080p, 2k, 4k |
| videoopt | VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| string | STRING | — |