Nodes/Nova Audio Player/Nova Tag Writer ๐Ÿท๏ธ
ComfyUI Node

Nova Tag Writer ๐Ÿท๏ธ

Write your database onto 200 FLACs โ€” without ruining them

By NovaFemmeยทCreated 20 days agoยทUpdated 2 days agoยท 0
Nova Tag Writer ๐Ÿท๏ธ
  • table
  • files
  • console
  • written_count
  • skipped_count
  • files
โ—„filename_columnFileNameโ–บ
โ—„skip_columnsLengthโ–บ
โ—„column_mapโ–บ
โ—„skip_empty_valuestrueโ–บ
โ—„dry_runfalseโ–บ

Tagging a release by hand in a file manager is the kind of task that feels fine for three tracks and becomes a small tragedy by track forty. The data already exists - you typed it into a database or a CSV months ago - it just needs to end up on the files, in the right tags, without a typo or a half-written album.

Nova Tag Writer ๐Ÿท๏ธ takes a NOVA_TABLE of rows and a NOVA_FILES batch, matches them by filename, and writes each row's columns onto its file as tags. It's the node form of a script the author was evidently running by hand, which is usually the sign that a node is worth having.

Inputs

  • table - rows from Nova SQLite Reader.
  • files - the batch from Nova Batch Load Audio (or passed through from here, so you can chain).
  • filename_column - default FileName. Rows are matched to files by this column, and the matching tolerates the space/underscore difference in either direction, and case - which matters more than it sounds, because a High Water Sessions album folder and a High_Water_Sessions column value are the same album and nobody wants to rename files to satisfy a matcher.
  • skip_columns - default Length. Duration isn't a settable text tag; it comes from the audio stream. The default is already correct.
  • column_map - one Column = tagname per line to override the automatic mapping. Use skip as the tag name to drop a column. This is your escape hatch when a database column is named something no tag system has ever heard of.
  • skip_empty_values - on by default: empty or NULL cells leave the existing tag alone. Turn it off and they overwrite with an empty value, which is occasionally what you want when you're deliberately clearing a field. Keep it on.
  • dry_run - on, it reports exactly what would be written without opening a single file for writing.

Under the hood, every column is auto-mapped to a tag name, with aliases for the cases where the obvious lowercase form is wrong (Track Number โ†’ tracknumber, Encoded By โ†’ encodedby, Year โ†’ date). FLAC and Ogg take the native Vorbis-comment path; MP4/M4A and ID3-carrying formats are mapped to their own frames. Anything mutagen can't tag gets reported and left untouched rather than half-written.

Outputs: console (wire it into Nova Console), written_count, skipped_count, and files passed through so you can chain Nova Tag Reader and verify the write in the same run.

Run it in dry_run first. Then run it again.

This is the one piece of advice I'd put on a sticker. dry_run tells you exactly what would be written, to which file, from which row - including the rows that matched nothing. Every horror story about automated tagging is a mismatch story: the wrong album's metadata written across a folder because a column held stems and the files were named with numbers.

Once the dry run looks right, run it, then chain a Nova Tag Reader ๐Ÿ”– onto the passthrough and read what's actually on the files now. Verify, don't assume. That's the same principle the rest of this pack is built on, applied to metadata instead of audio.

Install

ComfyUI Manager โ†’ Nova Audio Player โ†’ install โ†’ restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git

Under โ–ถ๏ธ Nova Audio โ†’ ๐Ÿ“ฆ Delivery & Metadata. This one has a real dependency: mutagen, which the pack declares in pyproject.toml. Manager installs it; a bare git clone does not, so:

<venv>/bin/python -m pip install mutagen

There's no degraded mode here - tag work without mutagen simply isn't possible, and the node says so rather than pretending. The import is guarded, so a missing mutagen costs you this node rather than the whole pack.

Where it fits

Nova Batch Load Audio ๐ŸŽผ โ”€โ”€โ–ถ Nova SQLite Reader ๐Ÿ—ƒ๏ธ โ”€โ”€โ–ถ Nova Tag Writer ๐Ÿท๏ธ
                                                              โ”‚ files
                                                              โ–ผ
                                                       Nova Tag Reader ๐Ÿ”– โ”€โ”€โ–ถ ๐Ÿ–ฅ๏ธ

The pack ships example workflows and a sample database for exactly this chain, so you can run the shape on real files before you point it at your library. Worth knowing as a general habit from the metadata side of this ecosystem: tags are the payload, not a footnote - a file whose tags are wrong is functionally an unnamed file, no matter how good the render inside it is.

Categoryโ–ถ๏ธ Nova Audio/๐Ÿ“ฆ Delivery & Metadata

Inputs (7)

NameTypeDefaultDescription
tableNOVA_TABLERows from Nova SQLite Reader.
filesNOVA_FILESBatch from Nova Batch Load Audio.
filename_columnSTRINGFileNameColumn holding the file name each row belongs to.
skip_columnsSTRINGLengthComma-separated columns to leave out. Length is skipped by default โ€” duration is not a settable tag.
column_mapSTRINGOne 'Column = tagname' per line to override the automatic mapping. Use 'skip' as the tag name to drop a column.
skip_empty_valuesBOOLEANtrueOn: empty/NULL cells leave the existing tag alone. Off: they overwrite it with an empty value.
dry_runBOOLEANfalseOn: report exactly what would be written without opening any file for writing.

Outputs (4)

NameTypeDescription
consoleSTRINGRun log โ€” wire this into Nova Console.
written_countINTFiles successfully tagged.
skipped_countINTRows or files that were skipped.
filesNOVA_FILESThe same batch, passed through so you can chain Nova Tag Reader to verify.