550W Video Task Query
Polling async jobs with 550W Video Task Query
- result_json
The boring node that saves you money
Cloud video work is rarely instant. The 550W service takes a video, runs the watermark erase server-side, and hands back a task id - which means the interesting part of the workflow is the part nobody wants to read about: asking "is it done yet?"
550W Video Task Query (FiftyWVideoQuery) is that node. It's the least glamorous member of the pack and the one that stops you paying twice, because the alternative to polling is hitting Queue on your submit node again - and that node charges credits.
It's also absurdly small: language, task_id, and an optional auth_mode. That's the whole surface. No progress bar, no percentages, no built-in sleep - you poll on your own schedule.
What it does under the hood
task_id is the one thing you must supply: a non-empty string, capped at 128 characters, which the node passes to the service's task-detail endpoint. Unlike the operation ids on the submit nodes, this is not validated against the strict [A-Za-z0-9._:-] pattern - a plain task id straight out of the JSON works.
Where does that id come from? The result_json of 550W Upload and Submit Video or 550W Resolve Share Link - read the task id off that JSON and paste it in. (Images have a sibling node, 550W Image Task Query, for the same job - though the image path runs synchronously often enough that you may never need it.)
The output is a plain result_json STRING, same as every other node in this pack: raw service JSON, non-ASCII preserved. You'll see the job's status in there, and on success a result link. And that's the whole vocabulary for video here - this pack returns links, not decodable video. There's no VIDEO output to hand to a video node, so the end of the chain is you opening the URL in a browser and downloading the file. If a run resolved the media but couldn't hand it over, the link surviving in the JSON is the fallback, not a bug.
There's one design detail worth knowing because it's invisible in the UI: this node overrides IS_CHANGED to return float("NaN"), which is the standard ComfyUI idiom for "never treat me as cached." Practically, that means every time you hit Queue, the graph re-queries the task instead of replaying the last cached answer - polling is exactly what the node is built for. The cost is the usual one with that trick: it defeats caching for whatever sits behind it too, so don't wire it into the middle of a long local pipeline.
Notice what's missing: no confirm_charge. Querying doesn't submit anything, so there's nothing to acknowledge. The money was spent at submit time.
Install
Same pack as the rest of the 550W nodes, so if you have one you have this one:
cd ComfyUI/custom_nodes
git clone https://github.com/sunshinehu/comfyui-550w-media-cn
python -m pip install -r comfyui-550w-media-cn/requirements.txt
Then restart. Dependencies are just requests, requests-toolbelt and keyring; there's no model to download and no GPU work happening locally at all.
Credentials are per-instance, not per-node. The default auth_mode: api_key reads FIFTYW_API_KEY and FIFTYW_USER_NO from the environment - set those before launching ComfyUI. If you'd rather use OAuth, python -m <installed-dir-name>.oauth_cli connect from the custom_nodes folder starts a local callback flow; it needs a real browser on the same machine and an OS keychain to store the token, and it will simply refuse to run without one.
Where it goes wrong
You re-queued the submit node instead. The service never auto-retries a paid job, and the submit node's own error message tells you what to do: query first. Pasting the id here costs nothing; resubmitting costs credits.
The task id got mangled. It's a string widget, so whitespace or a stray quote from a copy-paste is invisible until the service rejects it. Check the JSON, then check the widget.
Reading a pending task as a failure. The node gives you the service's JSON verbatim, including jobs that are still running, and it doesn't raise. You have to look at the payload. This is also true of tasks whose outcome is genuinely unknown after a timeout - query, don't assume.
Expecting the video in the graph. It isn't. You get a URL, and you download it yourself.
OAuth state living per process. The author's own note: credentials are tied to one region and one ComfyUI process. Restart-and-suddenly-everything-errors usually means the connection or the env vars aren't where that process can see them.
One realistic expectation to set: this pack has zero community footprint - search for it and you get graphics-card chatter - so when the service renames a field, there's no thread to find. The shipped Python is short; read it.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| language | COMBO | en | 2 options: zh-CN, en |
| task_id | STRING | — | |
| auth_modeopt | COMBO | api_key | 2 options: api_key, oauth |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| result_json | STRING | — |