Song Tags
Your MP3 Won't Know Its Own Title Until You Add This Node
- settings
- tags
If you've generated a song in ComfyUI and copied the .flac onto your phone, you know the feeling: a player full of files named song_00007 with no title, no artist, no cover. Song Tags is the node that fixes that. It's the metadata side of Kinburg's Save Song - a single node you fill in once that carries title, artist, album, year, genre and anything else into the actual file tags, so the song keeps its identity when it leaves ComfyUI.
Why it's a separate node
Save Song is the node you keep re-running while you iterate on a track. Tags are the node you fill in once and leave alone. Sticking eight more widgets on Save Song would be eight rows of a node you stare at constantly, so the pack split them: wire Song Tags' tags output into Save Song's tags input, and you're done.
The fields
Everything is optional - empty fields are simply not written. The ones worth actually setting:
title- if you leave it empty, Save Song falls back to the file's own name, so the player showssong_00007rather than nothing. That's the one field with a fallback, and it's the difference between a player that works and a player that lies.artist,album,album_artist- album_artist matters when your tracks have different artists; without it a player files each one separately.track-3or3/12both work.year-2026or a full2026-08-16date; both are valid ID3v2.4 timestamps.extra- onename: valueper line. Names players actually understand (bpm,composer,publisher,copyright,isrc,disc,language,mood,key) land in the real field; anything else becomes a custom tag - which is whereseed: 998877belongs.
There's also an optional settings input that takes Generation Info Filter's settings_data, so every setting that made the song rides along inside the file. Only the first dump is used - this node describes one song, not a batch.
How the tags get written
MP3 gets real ID3v2.4 (title/artist as TIT2/TPE1, lyrics as USLT, cover as APIC); FLAC and Opus get Vorbis comments with the cover as a picture block. The pack writes these containers by hand rather than reaching for mutagen, because the cover needs an attached-picture stream that PyAV can't mux - so tagging.py builds an ID3 tag and a Vorbis picture block as raw bytes. No new dependency: PyAV already ships with ComfyUI (it's what ComfyUI's own Save Audio encodes with), so this all works on a stock install.
Install & gotchas
Part of the Kinburg-Nodes pack - ComfyUI Manager (search "Kinburg-Nodes") or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes, restart. No extra dependencies.
One trap the pack calls out: FLAC keeps its comments on the container, Opus on the stream. Set Opus's on the wrong layer and the tags vanish with no error at all. Also worth knowing - the cover JPEG and lyrics .txt sit beside the audio in ComfyUI/output, but the copies inside the file are what survive being moved around. That's the whole point of the node, and it works: both were verified by writing files and reading them back with ffmpeg.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| title | STRING | Track title. Empty = Save Song uses the file's own name, so the player shows 'song_00007' rather than nothing at all. | |
| artist | STRING | Leave empty to skip this tag. | |
| album | STRING | Leave empty to skip this tag. | |
| album_artist | STRING | Who the ALBUM is credited to. Worth setting when the tracks have different artists, or a player will file each one separately. | |
| track | STRING | Track number. '3' or '3/12' both work. | |
| year | STRING | Year, or a full date — '2026' and '2026-08-16' are both valid ID3v2.4 timestamps. | |
| genre | STRING | Free text; ID3v2.4 dropped the numeric genre list. | |
| comment | STRING | Leave empty to skip this tag. | |
| extra | STRING | Anything else, one 'name: value' per line. Names a player actually understands land in the real field — bpm, composer, publisher, copyright, isrc, disc, language, mood, key — and everything else is written as a custom tag (TXXX / a named Vorbis comment), which is where 'seed: 12345' or 'sampler: chimera' belongs. | |
| settingsopt | GEN_SETTINGS | Generation Info Filter's 'settings_data' — every field it selected is written as a custom tag, so the song carries the settings that made it. Takes the FIRST dump: this node describes one song, not a batch. The 'extra' lines win where the names collide. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| tags | SONG_TAGS | — |