Nova Tag Writer ๐ท๏ธ
Write your database onto 200 FLACs โ without ruining them
- table
- files
- console
- written_count
- skipped_count
- files
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 aHigh Water Sessionsalbum folder and aHigh_Water_Sessionscolumn 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 = tagnameper line to override the automatic mapping. Useskipas 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.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| table | NOVA_TABLE | Rows from Nova SQLite Reader. | |
| files | NOVA_FILES | Batch from Nova Batch Load Audio. | |
| filename_column | STRING | FileName | Column holding the file name each row belongs to. |
| skip_columns | STRING | Length | Comma-separated columns to leave out. Length is skipped by default โ duration is not a settable tag. |
| column_map | STRING | One 'Column = tagname' per line to override the automatic mapping. Use 'skip' as the tag name to drop a column. | |
| skip_empty_values | BOOLEAN | true | On: empty/NULL cells leave the existing tag alone. Off: they overwrite it with an empty value. |
| dry_run | BOOLEAN | false | On: report exactly what would be written without opening any file for writing. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| console | STRING | Run log โ wire this into Nova Console. |
| written_count | INT | Files successfully tagged. |
| skipped_count | INT | Rows or files that were skipped. |
| files | NOVA_FILES | The same batch, passed through so you can chain Nova Tag Reader to verify. |