๐บ Media Stream Output (URL)
The upload node that only makes sense inside Nilor's own infrastructure
- images
- uploaded_url
Let's be straight about this one: MediaStreamOutput is not a node for you unless you're running inside Nilor Corp's own pipeline. It's the custom-node layer of a distributed ComfyUI farm - a worker renders images, and this node uploads them to object storage and pings a job queue so a "brain" API knows the work is done. If you found it by googling after a workflow error, the honest answer is that most of its inputs are auto-filled by the system that runs the workflow, not by you.
What it does mechanically
You feed it an images tensor, pick format (png or mp4), and it does two things:
- Uploads. PNG mode saves the first image of the batch and PUTs it to the
presigned_upload_url. MP4 mode encodes the whole batch into an MP4 via imageio at your chosenframerate(default 24, 1โ240) and uploads that. The URL is a pre-signed S3/object-storage PUT URL - that's why it's a plainrequests.putand needs no auth of its own. - Notifies. After the upload, it builds a JSON completion message (
content_id,status: completed,venue,canvas,scene, the uploaded object key) and sends it tojob_completions_queue_urlvia boto3, using SQS/ElasticMQ endpoints from the pack's config. It returns theuploaded_urlas a string.
The inputs content_id, venue, canvas, scene, presigned_upload_url, job_completions_queue_url, output_object_keys, and job_type all default to the literal string <auto-filled by system>. A companion script in the pack's web/js folder hides those widgets from the UI - the system is expected to fill them before the workflow runs. output_name is the key you care about: it's how the system matches this output to its entry in output_object_keys, which is a stringified dict the node parses back into JSON.
Why most people should skip it
If you're a normal local user, everything about this node is dead weight. It needs the .env / config wiring the pack documents (MinIO or S3-compatible endpoints, NILOR_SQS_* variables, AWS-style credentials), a pre-signed URL, and an SQS queue - infrastructure that exists to make a farm of ComfyUI workers coordinate. On a standalone install it will fail the moment it tries to talk to a queue that doesn't exist, and unlike the pack's utility nodes, this one can't fall back to anything. It's genuinely useful only if you're building exactly this: ComfyUI workers whose results get shipped back to a central service.
The one idea worth stealing even outside that setup: the whole pack's philosophy - upload via pre-signed URL (no long-lived credentials in the node) and signal completion through a queue rather than a direct callback - is a sane pattern for anyone wiring ComfyUI into an external API.
Install and dependencies
ComfyUI Manager (search "Nilor Nodes") or clone https://github.com/nilor-corp/nilor-nodes into custom_nodes. This node's runtime needs are real: boto3, imageio + imageio-ffmpeg (for MP4 encoding), requests, and the config loader - all in the pack's requirements.txt. It also reads a .env file the pack expects to be present for secrets, so a bare install won't have working credentials. Restart ComfyUI, and if you just need to silence the missing-node warnings from a workflow you don't actually want to run, uninstall rather than fighting it.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| output_name | STRING | default_output | โ |
| images | IMAGE | โ | |
| format | COMBO | 2 options: png, mp4 | |
| framerate | INT | 241โ240 | โ |
| content_id | STRING | <auto-filled by system> | โ |
| venue | STRING | <auto-filled by system> | โ |
| canvas | STRING | <auto-filled by system> | โ |
| scene | STRING | <auto-filled by system> | โ |
| presigned_upload_url | STRING | <auto-filled by system> | โ |
| job_completions_queue_url | STRING | <auto-filled by system> | โ |
| output_object_keys | STRING | <auto-filled by system> | โ |
| job_type | STRING | <auto-filled by system> | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| uploaded_url | STRING | โ |