ComfyUI Node

Song Tags

Your MP3 Won't Know Its Own Title Until You Add This Node

By Kinburg·Created 3 months ago·Updated 6 days ago· 1
Song Tags
  • settings
  • tags
title
artist
album
album_artist
track
year
genre
comment
extra

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 shows song_00007 rather 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 - 3 or 3/12 both work.
  • year - 2026 or a full 2026-08-16 date; both are valid ID3v2.4 timestamps.
  • extra - one name: value per 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 where seed: 998877 belongs.

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.

CategoryKinburg-Nodes/audio

Inputs (10)

NameTypeDefaultDescription
titleSTRINGTrack title. Empty = Save Song uses the file's own name, so the player shows 'song_00007' rather than nothing at all.
artistSTRINGLeave empty to skip this tag.
albumSTRINGLeave empty to skip this tag.
album_artistSTRINGWho the ALBUM is credited to. Worth setting when the tracks have different artists, or a player will file each one separately.
trackSTRINGTrack number. '3' or '3/12' both work.
yearSTRINGYear, or a full date — '2026' and '2026-08-16' are both valid ID3v2.4 timestamps.
genreSTRINGFree text; ID3v2.4 dropped the numeric genre list.
commentSTRINGLeave empty to skip this tag.
extraSTRINGAnything 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.
settingsoptGEN_SETTINGSGeneration 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)

NameTypeDescription
tagsSONG_TAGS