Repository navigation
Releases
MP3 CSV Tagger v1.5.0 — round 2: preview editing, tag sync, fingerprints (desktop), consistency, jobs
Round 2: desktop 1.4.0 + Android app 1.2.0. Everything works through the same preview → apply → change log → tag-snapshot undo path as CSV changes, on both platforms unless noted. No file renaming, no cleanup transforms — as always.
Highlights
- Edit values in the preview — double-click a preview cell (Android: tap it) and type the correction. A manual edit outranks every CSV candidate, is marked "✎ manual edit", and can be reverted to the candidate value. The change log gains a trailing Source column on both platforms — the CSV file name, or the feature that produced the value ("manual edit", "tag sync", …).
- Two-library tag sync — pair files by relative path (case/separator-insensitive), choose which tags to copy plus an optional cover-art copy, and get a normal preview of the target library. A tag copies only when the source value is non-empty and differs; unpaired files are listed and never touched.
- Fingerprint matching (desktop) — with the external
fpcalc(Chromaprint) tool detected on PATH: sync can pair leftover files by identical fingerprint + duration, and the library report gains a "Same recordings" section with a unify action through the preview. AcoustID lookup is opt-in with your own free API key, rate-limited, fills only empty fields, as a preview. No key = no network. Android does not fingerprint — the reason is recorded in ROADMAP.md. - Tags-vs-path consistency report — read-only on both platforms: apply a
{Tag}filename/path pattern to every file and list where the stored tags disagree with the path-implied values. The report has no write path at all. - Album-grouped preview + completeness — group preview rows by album, and get a per-album completeness report (Title, Lead Performer, Album, Year, Genre, Track Number, Cover Art) with a library-wide summary. Android's library report also covers duplicates and spelling variants now.
- Saved jobs — a named bundle of folders, CSV layers + roles and filename-pattern layers, rerun in one step (desktop Files tab or
jobs/job-save/job-run; Android "Jobs…", plus launcher shortcuts that open a job straight into its preview). - Small things — desktop drag & drop onto the Files tab when the optional
tkinterdnd2package is present ("Paste paths…" without it); "Open in player" / ▶ plays a preview row's file read-only; Android opens CSVs shared or opened from other apps (copied into app storage, layered from the copy).
Assets
MP3CsvTagger-v1.4.0-linux-x64.zip— standalone Linux build of the desktop program (PyInstaller onedir; the Windows build is produced from the same tree withbuild_windows.bat).MP3CsvTagger-v1.2.0.apk— Android app, signed with the app's per-app release key (same signer as 1.0.0/1.1.0, so it installs as an update).
Verified: 119 desktop tests (1 headless-GUI skip; 120 under a virtual display) and 43 Android JVM tests pass; the frozen Linux binary was smoke-tested end to end (run → apply → change log → undo) and its GUI launches with drag & drop active; the APK passed badging (versionCode 3 / 1.2.0), signer and dex-inventory gates against the 1.1.0 APK (zero classes removed). Not device-verified — as with every release here, the phone is the proof gate.
MP3 CSV Tagger v1.4.0 — append export (desktop 1.3.0, Android 1.1.0)
Append export — build one library CSV folder by folder
Library exports can now merge into an existing CSV instead of replacing it, on both the desktop program (v1.3.0) and the Android app (v1.1.0):
- Export one folder to a CSV, then append scans of other folders into the same file.
- Rows are keyed by FilePath: a re-scanned file's row updates in place (same position, fresh values); rows outside the scan are kept untouched; new files append at the end.
- New tag columns are added at the end of the header; a column the scan doesn't produce — including one you added by hand — keeps its values even on updated rows.
- If the CSV has no FilePath column, rows fall back to keying on the file-name column, with a clear warning.
- Both front-ends report rows added / updated / kept and columns added after each append.
Desktop: export --append on the CLI, and "Append to an existing CSV…" in the Files-tab Export dialog. Android: "Append to existing CSV" in the Export dialog (pick the target via SAF); the app's export now also writes the FilePath column the merge keys on.
Assets: the Linux standalone build of the desktop program (v1.3.0) and the Android APK (v1.1.0, signed with the app's per-app release key, same signer as v1.0.0).
MP3 CSV Tagger v1.3.0 — Android app
MP3 CSV Tagger for Android — v1.0.0
The Android companion app is here: a native Kotlin app that works with the
same CSV files, roles and rules as the desktop program.
Download: MP3CsvTagger-v1.0.0.apk (signed, sideload it) — package
com.devxen.mp3csvtagger, Android 8.0+.
What's in it:
- Pick a music folder once (Android's folder picker); MP3s are scanned
recursively, reading only their tag blocks — no library copying. - CSV layers with per-column Match / Write / Skip roles, reordering
and include/exclude — one CSV is enough for most jobs, layers compose
exactly as on desktop. - Filename-pattern layers:
{Artist}/{Album}/{Track} - {Title}
turns folder and file names into tag values. - Full preview with old → new values and tap-to-choose candidates.
- Apply writes each changed file once and saves the shared change-log
CSV format (mp3tag_*.log.csv). - Undo (tag snapshot — no file copies): only tag frames are
snapshotted; undo restores them, guarded by file size/mtime. - Export tags to CSV, and an extensive built-in Help screen.
- No account, no network permission, no analytics.
Files are never renamed, moved or deleted. Desktop feature-parity items
(role presets, library report, cover art, MusicBrainz fill) are tracked
in ROADMAP.md.
Verified by build + JVM engine tests + packaged-APK checks (badging,
signer, dex inventory). Real-device confirmation is the remaining proof
gate — reports welcome.
MP3 CSV Tagger v1.2.0
1.2.0 — 2026-10-15
- Undo (tag snapshots) — every Apply now writes a
mp3tag_*.undosnapshot next to the change log holding the tags it
replaced (never copies of the audio).mp3csvtagger undo/ the
Apply tab's "Undo a run…" restores them; files changed since the
run are skipped unless forced. - Export library → CSV — one row per file, one column per tag,
plus FileName/FilePath/Folder. The location columns work as Match
columns in any CSV (and can never be written — files are never
renamed or moved). - Tags from filenames & paths —
{Tag}patterns capture values
from names and folder layouts into a normal, undoable preview
(GUI dialog +from-filenameCLI). - Library report — duplicate tracks and spelling variants
(e.g.Beatlesvsbeatles); pick the spelling to keep and the
fix is built as a preview. Nothing changes automatically. - Role presets — saved column-role setups (JSON in
~/.mp3csvtagger/presets/) plus two built-ins; CSV tab controls,
add-csv --preset,presetscommand. - Cover art & lyrics — a
Cover ArtWrite column embeds front
covers from image paths (blank cell removes art, previewed and
undoable); lyrics write correctly as USLT (a frame-construction
bug that stored a list repr for string-text frames is fixed). - MusicBrainz fill (opt-in) — fills only EMPTY Album / Year /
Recording Date / Genre for files with Title + Lead Performer, at
1 request/second, into the preview. Offline = clear error, no
partial writes. - Help — the in-app Help tab is now a 20-topic browser; the same
text ships asdocs/HELP.md(generated fromhelptext.py). - Repository tidy-up: legacy material removed; the docs now describe
the current program only.
MP3 CSV Tagger v1.0.0
MP3 CSV Tagger v1.0.0
Bulk-edit MP3 ID3 tags from CSV files: Match rows to files, Write new
tag values, preview everything before anything is written.
- Layered CSVs with per-column roles — Match, Write, Skip — applied in
order, so later files can match on values earlier ones wrote. - Case- and punctuation-insensitive matching; unknown column headings
become custom TXXX tags. - Tkinter GUI and a full CLI (
runplus project commands). - Projects are readable JSON (
.mp3p.json). - Every Apply writes a change log (
mp3tag_*.log.csv) recording the
old and new value of every changed tag. - Fast engine: hash-index matching and in-memory preview — 600 files
against a 600-row CSV preview in about a second. - Standalone Linux build attached; Windows build via PyInstaller
(build_windows.batin the repo).
Also attached: the original beta release.