Batch Audio Metadata
Unpack your audio manifest with Batch Audio Metadata
- manifest
- key
- media_type
- file_format
- created_at
- batch_size
- sample_rate
- channels
- duration_seconds
- description
- tags
- source
- derived
Every asset in ComfyUI_In-N-Out_Bucket carries a sidecar manifest - a JSON file stored next to it in the bucket that records things like the key, sample rate, channel count, duration, and any tags you've set. The Input, Load, and Output bucket nodes hand you that manifest as a BUCKET_MANIFEST value, but a dict is only useful if something can read it. Batch Audio Metadata is the thing that reads it.
Feed it a manifest, and it unpacks the whole thing into twelve separate typed outputs. That's it. There's no bucket I/O here, no S3 call, nothing clever. It's a pure pass-through node that exists because "get the duration as a FLOAT" and "get the key as a STRING" are things you keep wanting in a real workflow.
What the outputs actually are
The full output list, from the schema:
- key (STRING) - the asset key, e.g.
<subfolder>/<uuid>. Wire this into a save-name builder or an API response. - media_type, file_format - "audio" and "flac"/"mp3"/"opus".
- created_at (STRING) - the write timestamp, as an ISO string. Empty when the manifest was derived (see below).
- batch_size (INT) - how many objects the asset spans.
- sample_rate (INT), channels (INT), duration_seconds (FLOAT) - the audio-specific fields you'll actually use.
- description, tags (comma-separated), source - whatever metadata has been written.
- derived (BOOLEAN) -
truewhen no stored manifest existed and the node had to infer one from the audio at load time.
Where it fits
The obvious use is filename or routing logic: grab duration_seconds to decide whether a clip qualifies for the "long form" queue, pass tags into a text-encode node, or stuff key into an HTTP request so a downstream service can fetch the actual file. It also pairs with Set Audio Metadata - set tags on one branch, then read them back anywhere downstream.
One honest note: for a single-node workflow you rarely need this. Its value shows up when you're building ComfyUI as an API and the caller needs to know what it just got. That's exactly the scenario this pack is pointed at.
Install
ComfyUI Manager is the easy path (search In-N-Out Bucket), or:
cd ComfyUI/custom_nodes
git clone https://github.com/littleowl/ComfyUI_In-N-Out_Bucket.git
pip install -r ComfyUI_In-N-Out_Bucket/requirements.txt
cp ComfyUI_In-N-Out_Bucket/.env.example ComfyUI_In-N-Out_Bucket/.env
Then restart ComfyUI. Dependencies are just boto3 and python-dotenv - PyAV (the audio/video transcoder) already ships with ComfyUI. You'll find the node under buckets/audio.
Troubleshooting
The one thing that trips people up: if the Input node that produced your manifest hit a derived asset (no <key>.json in the bucket yet), created_at comes back empty and derived is true. That's not a bug - it means the metadata was inferred on the fly. Write a manifest with Set Audio Metadata (or re-save the asset) and the fields fill in. A manifest output that's None because S3 was unreachable will make the outputs default rather than crash, so if you see empty strings where data should be, check the endpoint and credentials first.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| manifest | BUCKET_MANIFEST | Audio manifest from a bucket node. |
Outputs (12)
| Name | Type | Description |
|---|---|---|
| key | STRING | — |
| media_type | STRING | — |
| file_format | STRING | — |
| created_at | STRING | — |
| batch_size | INT | — |
| sample_rate | INT | — |
| channels | INT | — |
| duration_seconds | FLOAT | — |
| description | STRING | — |
| tags | STRING | Comma-separated tags. |
| source | STRING | — |
| derived | BOOLEAN | — |