Repository navigation
v2.0.0 (latest)
New Features
-
Not exactly a feature but AudioAuditor now has a brand new logo and the website has been updated as well!
-
Settings search — a search box in the Settings header jumps straight to any setting by name, switching tabs and scrolling/highlighting the match, so you no longer have to hunt through all 7 tabs.
-
Sheet music lookup — right-click a file (or several) → Analyze / Identify → "Find Sheet Music...", or the new button on the Now Playing bar, searches IMSLP's public-domain/classical catalog for real matches with real download links, stepping through multi-selections one at a time with Prev/Next. Anything outside IMSLP's catalog (most modern/pop songs) falls back to a one-click web search.
-
ColorMatch scope controls — Now Playing and Main Window ColorMatch can each be restricted to just Backgrounds, Buttons & icons, and/or Text (Settings → Appearance → "ColorMatch Scope"), instead of recoloring everything. The Queue and Settings windows also got their own independent ColorMatch toggle instead of always following the Main Window's.
-
Custom fonts — pick from a built-in font list or add your own
.ttf/.otffile (Settings → Appearance → "App Font"); the chosen font applies across the whole app and custom files are copied into%APPDATA%\AudioAuditor\Fonts\so they survive the original file being moved or deleted. -
CD Rip Checker (replaces the old "Rip Quality" detector) — the previous signal-based rip check (which guessed at rip integrity from the waveform) is gone; reading the actual CD ripping log is the right way to verify a rip. AudioAuditor now scores EAC / XLD / whipper logs with the OPS deduction model via the bundled cambia checker, showing the 0–100 score and every deduction. Three ways to use it: a dedicated Tools → Check CD Rip Log… window (drop a
.logor browse), thechecklog/riplogCLI command, and an opt-in scan-time Rip Log column that auto-detects the log sitting next to your files (one cambia run per folder). The old--rip-qualityflag and "Rip Quality" column/setting are removed. -
**Batch Editor Overhaul - Many more options and bundled some previous settings into the same one while still keeping some of the older simple editor style window(s) for individual audio files.
- Manual Edit — set any tag field (Title, Artist, Album, Album Artist, Year, Genre, Composer, Comment, Disc) across the whole selection at once. Only the fields you check are written; everything else is left untouched. Includes track-number tools (set all to one number, or auto-number in list order) and full batch album-cover control: pick one image for all, fetch covers online per album, or strip covers from all. Also has a one-click "Fill missing fields online" that searches the metadata providers and auto-applies high-confidence matches to empty fields only, leaving everything you've already set untouched.
- Auto-Tag BETA — auto-searches MusicBrainz / iTunes / AcoustID + Cover Art Archive on open, pre-selects high-confidence matches, and adds a one-click "Apply High-Confidence" button so a folder of files can be tagged in a single action (still fully reviewable before writing). Auto-tagging now also parses messy/untagged filenames (junk-stripped, "Artist - Title" split) so files with little or no existing metadata match far more reliably.
- More sources — added Deezer and TheAudioDB (no key needed, on by default; great for covers and soundtrack coverage), plus optional Discogs and fanart.tv that activate once you enter a token/key (remembered between sessions; environment variables
DISCOGS_TOKEN/FANARTTV_API_KEYare also honored). When the best match is missing a cover, genre, or composer, one is borrowed from another source's result. - Soundtracks, OSTs & scores — the matcher now detects soundtrack context (from the album/folder name or a "Various Artists" artist), prefers soundtrack-typed releases, fills the Composer field, sets Album Artist to "Various Artists" for compilations, and gives soundtrack candidates a scoring nudge so an OST wins over a same-titled pop single.
- Live results — files now report success/failure as each one finishes (with the matched source), instead of the grid sitting empty until the whole batch is done. Results and cover thumbnails stream into the list progressively, the status bar shows a running matched/unmatched tally, and a "⚠ unmatched" button lists exactly which files couldn't be matched and why. Searching also runs several files in parallel (respecting each provider's rate limit) so large batches finish faster.
- Cover preview — proposed cover art is shown as a thumbnail in the changes list so you can vet artwork before it's written.
- Streaming link → Comment — optionally look the track up on a streaming service and embed its URL in the Comment field (and, for MP3s, an ID3v2
WXXXURL frame). Pick the platform per run: Deezer and Apple Music work with no setup; Spotify activates once you enter a Client ID + Secret, and YouTube with a Data API key (all remembered between sessions; env varsSPOTIFY_CLIENT_ID/SPOTIFY_CLIENT_SECRET/YOUTUBE_API_KEYhonored). The link is appended without clobbering an existing comment. CLI:--streaming-link <deezer|apple|spotify|youtube>with--spotify-id/--spotify-secret/--youtube-key.
- More sources — added Deezer and TheAudioDB (no key needed, on by default; great for covers and soundtrack coverage), plus optional Discogs and fanart.tv that activate once you enter a token/key (remembered between sessions; environment variables
- Rename — exposes the custom-pattern engine with more tokens (
{albumartist},{track3},{disc},{genre}), case modifiers ({title:upper|lower|title}), configurable track zero-padding, a find/replace box, and inline-editable proposed names. Now also has whole-name transforms that apply in both manual and smart modes: a case dropdown (as-is / lower / UPPER / Title), a spaces dropdown (keep / underscores / spaces), and a Strip "(feat. …)" toggle — all remembered between sessions and reflected live in the preview. - Convert — a new Convert tab converts the selected files between formats (MP3, FLAC, WAV, AAC/M4A, OGG Vorbis, Opus, WMA, AIFF) using FFmpeg — placed next to the app or installed on your PATH — carrying tags and embedded cover art over (
-map_metadata 0) where the target supports them. Per-codec quality/bitrate controls, a choice of output folder (or in-place), overwrite and "delete originals" options, and a live preview of the resulting filenames. FFmpeg is run as a separate process alongside AudioAuditor, if no FFmpeg is found the tab shows a notice and everything else keeps working. - Clean Up — strips download, source, and sponsor junk out of free-text tag fields: "downloaded from …", "ripped using …", bare website names, and promo stuff in the Comment and Title fields. Modest by design — only the matched span is removed rather than the whole field, a Title is never emptied, and a field containing no junk is left completely alone. Can also wipe the Comment field outright instead. Every change is previewed first.
- Paste metadata — a new "Paste metadata…" dialog (Manual Edit tab) takes a pasted blob and figures out what goes where. It auto-detects three shapes: a tracklist (numbered or
Artist - Titlelines, fuzzy-matched to your files by title/track), a CSV/table (one row per file, matched by a filename column or row order), and a single "Field: value" block (applied to every file). You can also copy from a master file — pull the album/album-artist/year/genre/disc/composer (and optionally the cover art) from one well-tagged file onto the rest. Every proposed change is shown in a reviewable, per-row checkable grid before anything is written.
-
Transfer metadata between sets of files — copy all the tags (and cover art) from one folder of files onto another, even when the two folders are in different formats. Point it at a source folder whose files are well-tagged (say, a lower-quality rip with great metadata) and it auto-matches each of your loaded files to its counterpart by title/filename (extension-agnostic, fuzzy, with positional fallback when the counts line up), then copies only the fields you tick onto the better-quality copies. Perfect for moving metadata onto pristine but untagged files. Reachable from the grid right-click → "Transfer metadata from another folder…", or via Paste metadata → From another folder; every change is reviewable before it's written, with optional per-file backups.
-
Write analysis to files — bake what AudioAuditor measured back into the audio files themselves. A new grid right-click → "Write Analysis to Files…" dialog lets you pick any analyzed fields — LUFS, True Peak, Dynamic Range, the real/measured bitrate, sample rate, bit depth, MQA, AI verdict, fake-stereo, clipping, rip log, BPM, ReplayGain, and more — and writes each as a dedicated custom tag (ID3v2
TXXXfor MP3, Vorbis comments for FLAC/OGG/Opus,----atoms for M4A/ALAC) plus a single human-readableAudioAuditor:summary line in the Comment field. Re-running replaces the summary instead of stacking it, your existing comment is preserved, and per-file backups are optional. (The measured bitrate is written as a tag/note — the stated bitrate lives in the audio header and can't be changed without re-encoding.) -
"Wrapped" export — the Wrapped stats dashboard can now be exported as a shareable PNG, JPEG, or one-page PDF (rendered with a solid background so it's never transparent/black), using a built-in dependency-free PDF writer.
-
Footer scan bar — scanning now shows a compact progress bar with a live ETA read-out centered in the status footer, alongside a pause/resume button, so you can watch (and pause) a scan without it shoving the rest of the footer around.
-
CLI
creditscommand —AudioAuditorCLI credits(also available in interactive mode) prints the same open-source library/author/license/link info as the GUI's Credits window. -
CLI
enrich— live results & more sources — the metadata enrich command now prints a per-file ✓/~/✗ line as each file finishes (with the matched source) instead of going quiet until the end, and lists any unmatched files at the end. New flags--deezer,--theaudiodb,--discogs-token <t>, and--fanarttv-key <k>(env varsDISCOGS_TOKEN/FANARTTV_API_KEYhonored) enable the same extra sources and soundtrack handling as the GUI — the scanner engine is shared, so results match. -
Color picker magnifier — while the eyedropper is active and you hover over the album cover, a small color circle follows your cursor showing the exact color you're about to pick, making it much easier to land on the right shade. The magnifier now sits closer to the cursor and is a touch smaller for finer aiming.
-
CLI
selfcheckcommand — runs the built-in assertion suite against the build you actually have, covering the tag-comment merge, the junk detector, file renaming, and the AI scoring rules. Handy for confirming a portable download isn't corrupt.
Improvements
- ColorMatch colors are now saved per album cover — picking or confirming a color scheme on one track automatically applies it to every track that has the exact same embedded cover, so whole albums theme consistently instead of needing the colors re-picked per file. Singles with their own cover stay independent, and any colors you'd already saved per-file migrate over automatically the first time you play the track.
AI detection — rebuilt scoring
- Confidence now reflects evidence strength instead of marker count. The detector always computed a strength-weighted score, but it was being discarded and re-derived from how many markers turned up. That inverted the whole hierarchy: one definitive AudioSeal / SynthID / Suno marker scored 65% and displayed as merely "Possible", while two vague generic phrases scored 100% and displayed as "Yes". A single verifiable marker now reads "Yes" on its own, and vague ones rank below it.
- Detectors no longer cancel each other out. Results used to be averaged, so a confirmed watermark sitting next to a barely-triggered spectral flag scored lower than the watermark alone. Independent evidence now reinforces instead of diluting — adding a signal can only raise the score.
- Each detector counts for what it can actually prove — a watermark or C2PA marker at full weight, the SH Labs model high, the spectral heuristics at half. The practical consequence: the experimental spectral checks can no longer produce a confident "Yes" on their own, only "Possible".
- The AI column names its evidence —
Yes - watermark (86%)orPossible - heuristic (52%)instead of a bare percentage, so a heuristic guess never looks like proof. The same detail reaches the tooltip, the CLI, and the JSON output. - A confident "human" verdict from SH Labs now clears a spectral flag. Its probability was previously only consulted when it happened to be incriminating, so the model could accuse a file but never exonerate one. It still never overrides an embedded watermark.
- AI markers are found in the middle of files. The raw-byte scan only ever read the first and last 64KB, so any marker written into the body of a file was invisible. It now covers 128KB at the start, 128KB at the end, and four 64KB slices spread through the body.
- Heavily limited human masters are no longer flagged on their own. The two obfuscation checks (hard limiting, crest-factor homogeneity) could satisfy the "two flags means suspicious" rule between themselves — and aggressive limiting is completely normal on loudness-war masters.
- The AI tally in the status bar counted only watermark hits, so it under-reported against the verdicts actually shown in the grid.
AI detection — a new spectral check, and a wider watermark scan
- A new check looks for the one artifact that usually gets left behind. The existing spectral checks all ask variations of "does this sound over-processed", which heavily-mastered human records also answer yes to. The new one asks something different: are there evenly spaced narrow ridges in the spectrum? That pattern comes from the upsampling layers inside the model itself — it's the audio equivalent of the checkerboard artifact in AI images — so it's tied to how the track was built rather than to how it was mixed. It also survives MP3 and AAC, unlike the ultrasonic check, which the encoder's lowpass usually erases.
- Measured against a small labeled set (each lossless file also tested as a 320 kbps MP3 so the format couldn't be doing the separating): it fired on all three AI tracks and none of the human ones, and each transcode scored within 0.02 of its original.
- What this does not do yet: a single check can't reach a verdict on its own — that rule is deliberate and unchanged — so a file where only this one fires still shows "No". The evidence now appears in the tooltip, the CLI, and the JSON output instead of being invisible. Turning it into a verdict on its own needs a much larger labeled set than six files, and that hasn't been done.
- The spectral checks now look at the whole track instead of the first 30 seconds. They read three ten-second regions from across the track, and — more importantly — each check now spreads its measurements over that whole span. Previously every check took its samples consecutively from the very beginning, which for most of them meant roughly the first three seconds. So checks asking "how much does this track vary" were answering about the intro and generalising to the song, and a sparse or slow-building opening read as machine-uniform. Measured effect: human tracks now score visibly further from AI ones than they did before, because real music varies across a track while a generator artifact stays put.
- UTF-16 AI markers are detected now , for real this time. An older version did do this, but the scan only ever decoded ASCII, so markers written in UTF-16 (common in ID3v2 frames and C2PA blobs) were invisible no matter how explicit they were. The scan now catches them regardless of encoding or byte alignment.
- Six more generators recognised — Riffusion, MusicGen, ElevenLabs Music, Mureka, CassetteAI, and Sonauto, plus
udio.ai. Suno's model marker is matched by prefix rather than by listingchirp-v2,v3,v4one at a time, so new Suno models are covered the day they ship instead of whenever the list gets updated. - Google's Lyria is matched only in its qualified forms ("Google Lyria", "DeepMind Lyria",
lyria-002). Plain "lyria" is a perfectly plausible artist or track name, and a match there counts as evidence — one missed detection is a far better trade than wrongly accusing someone's song, which is the reason it was designed this way. - Spectral findings are kept even when they fall short of a verdict. The checks' results were being computed and then thrown away unless they crossed the "suspicious" line, so a check that fired without corroboration left no trace anywhere. They're now recorded either way, and the AI column's tooltip names the specific checks that fired instead of showing only "Heuristic — spectral (52%)". This changes what you can see, not what the app concludes.
Fixes
- The automatic updater now fails if the SHA files do not match the offical source. Update files must come from this project's official GitHub releases, downloads are size-limited, and SHA-256 sidecar files are parsed strictly. A missing or mismatched hash blocks installation instead of offering an unsafe "install anyway" option, and temporary updater files are isolated and cleaned up (NOTE: that there is a slight potential for this to misfire so if it alerts for you, please dont automatically think that the download has been compromised, I'm just trying to make this software safer for you guys :) ).
- Custom service links can no longer launch arbitrary Windows protocols. User-configured search links are restricted to absolute HTTP/HTTPS URLs. Maloja connections require HTTPS, with plain HTTP allowed only for a server running on the local machine.
- Archive and playlist imports are hardened against malicious files. Archive extraction now blocks path traversal and symbolic links, limits entry counts and extracted sizes, and removes partial extraction directories after rejection. Large or excessively long playlists are rejected before they can exhaust memory or processing time.
- Unprotected Scrobbling API credentials are no longer left in plaintext settings. Existing plaintext credential entries are migrated into the encrypted Windows credential file without overwriting newer encrypted values, credential saves are atomic, and plaintext entries are removed only after encrypted storage succeeds, this was not an issue for every key but was for some newer ones.
- Single-instance file forwarding now rejects malformed IPC messages. Invalid, oddly sized, or oversized payloads are discarded before unmanaged memory is read.
- Fake lossless made from a 320 kbps source is caught now. Take a 320 kbps MP3, convert it to FLAC, WAV, or AIFF, and AudioAuditor had mistakenly called it lossless. Two separate things had to be fixed. The verdict accepted any file whose content reached roughly 19.8 kHz — but LAME at 320 kbps stops at about 20.5 kHz, so the transcode sat comfortably inside the tolerance and passed. Underneath that, the cutoff scan usually never found the edge at all: it set its search threshold relative to the file's own midrange, so on any track with a quiet top end it looked thousands of Hz below the real edge, correctly rejected the wrong answer it had found, and then reported "full bandwidth" instead. Both are fixed — the scan now looks for the edge directly, and the verdict weighs how steeply the spectrum stops rather than only where. A mastering engineer's gentle rolloff and an encoder's brick wall land at similar frequencies but look nothing alike, and that difference is what the check now reads. Nothing that passed before can fail without a genuine wall being measured.
- File details and exports now show "Cutoff Drop" — the measured steepness of that spectral edge, in dB. This is the evidence behind a fake-lossless verdict, so it sits next to the verdict instead of staying buried in the analyzer. A blank or small value means the file simply ends gradually, which is normal.
- Worth knowing: this catches lowpassed sources, which is nearly all of them, but it is not magic. An encoder deliberately run with its lowpass disabled leaves content all the way to the top and no cutoff-based check — this one included — can tell that apart from real lossless. That needs a different kind of analysis entirely.
- Wide-stereo tracks can't be falsely detected any more. The spectrum was measured by folding the channels down to a mono mix first, and mixing cancels anything the two channels hold out of phase. On a track with wide stereo effects that could carve a gap into the spectrum that exists in neither channel on its own — and a gap near the top is exactly what now reads as a lossy source. Each channel is measured separately now, so a frequency counts as present if any channel has it.
- DSD files (.dsf/.dff) now decode properly. Much of the old decoder for this was wrong. The DSF header was read at the wrong offsets, so the sample rate was picked up from a field that is always zero. Both file types were unpacked as though each channel's data sat in one contiguous run, when DSF actually alternates fixed-size blocks between channels and DFF alternates single bytes — so stereo came out as noise. Anything above DSD64 was labelled with half its real rate, putting every frequency reading an octave out. And the conversion to PCM used no filtering, so the huge amount of ultrasonic noise that DSD deliberately parks above the audible range folded straight back down into the music. All four are fixed, and files are now decoded a piece at a time instead of being loaded into memory whole — a DSD128 track used to need gigabytes of RAM.
- Mono Opus files are no longer reported as fake stereo. The Opus reader assumed every file was stereo instead of reading the channel count from the file, so a mono track was decoded into two identical channels and then flagged "Mono Duplicate" by the fake-stereo detector — a problem the reader had created itself.
- Correctly encoded MP2, AC-3, AMR and Speex files are no longer called fake. The cutoff-versus-bitrate curves describe encoders, but they were being picked by file extension, and anything unrecognized fell back to LAME's MP3 curve. Those formats genuinely roll off lower than MP3 does at the same bitrate, so honest files failed a test meant for a different codec — a normal 192 kbps MP2 was reported as fake. Formats without a curve of their own now report "unknown" rather than accusing the file.
- Audiobook and ringtone files are judged consistently.
.m4band.m4rhold ordinary AAC, the same as.m4a, but they weren't recognized as AAC and were measured against the MP3 curve instead — so identical audio could get a different verdict depending only on the file's extension..mp4,.3gp,.3g2and.webmwere mismatched the same way. - Dynamic Range now agrees with other DR meters. The measurement picked the 20% of the track with the widest gap between peak and average — which finds the quietest, most dynamic passages, like intros and fades. The established method uses the loudest 20%. Scores were coming out several points higher than foobar2000 or the standard DR meter would report for the same file.
- Batch Editor scrollbars are now themed — the scrollbars on the Rename tab, the Auto-Tag changes grid, the Manual Edit panel, and the "⚠ unmatched" failures popup now use the app's themed slider instead of the default Windows scrollbar, matching the rest of the window in both light and dark themes.
- Batch Editor now matches the app theme — every control in the Batch Editor (checkboxes, radio buttons, text boxes, dropdowns, tabs, buttons, and the changes/rename grids) is now fully themed, so nothing falls back to default Windows styling and no text blends into the background. Fixed several controls that referenced missing theme colors (invisible borders / wrong row colors) and verified readability across light and dark themes.
- Open-source credits/licenses now work in the portable build — the bundled license texts are embedded directly in the exe instead of shipping as loose files beside it, so "View license" in Settings → About → Open Source no longer fails on the portable build (it previously only worked in the installed version).
- Tag clean-up no longer rewrites files that had no junk in them. Any comment or title ending in punctuation ("Great song.") was reported as changed and written back, because trailing punctuation was being stripped even when no junk pattern had matched anything.
- Tag clean-up no longer destroys dot-separated titles. The bare-domain matcher treated ordinary English words as top-level domains, so
Back.To.Blackwas cleaned down toBlackandArtist.Title.Livewas emptied entirely. - Transferring metadata between folders no longer applies bad matches. When the two folders held different numbers of files, a barely-similar match was applied anyway and an unrelated file's tags were written over your own. Files without a close enough match are now left untouched and reported in the summary.
- Writing analysis to files no longer adds foreign tag containers. It created every tag type each format could hold, so MP3s came back with an APE tag attached and FLACs with both ID3v2 and APE — precisely the cruft the Metadata Strip tool exists to remove. Values now go into the tags a file already carries.
- Renaming can change letter case again. Every rename path in the app treated a case-only change as "nothing to do", so the Rename tab's case transform (lower / UPPER / Title) silently did nothing on Windows. All rename paths now share one implementation.
- The Convert tab explains itself when FFmpeg is missing — a link to a suitable build, the exact folder to drop the binary into, and a Re-check button, instead of a dead warning line that required restarting the app after installing it.
- Batch edits reject a non-numeric year, disc, or track number instead of quietly writing 0 and wiping that field across every selected file.
- Covers fetched per album no longer collide — grouping ignored the artist, so two different artists' "Greatest Hits" ended up sharing one piece of artwork.
- Out-of-phase files record their stereo correlation. Negative values were being skipped, which is exactly the case worth writing down.
- Interactive CLI help lists
checklogandconfig, both of which already worked but were missing from the command list.
Other
- Supporters list — added Jung and Pistachio to Settings → About → Supporters. (Support this project here through Github Sponsers or Ko-Fi, both attached in the repo, to get your name listed!)
- Scan cache file is now smaller on disk — cache entries no longer write empty strings or empty lists to JSON; fields that are not set for a given file are omitted entirely, reducing cache file size significantly for typical libraries.
- Fewer settings that only had one sensible answer — nine options were removed and the good behavior made unconditional. Battery Saver loses its "Entire program" checkbox and its five per-area checkboxes: turning it on now stops every ambient animation, with a single Keep the audio visualizer running option to spare the visualizer (the one exemption I think was actually used lol). If you were running per-area mode with the visualizer deliberately left animating, that choice is carried over automatically. Cache album art colors and Persist color cache to disk are gone — the color cache is always on and always saved, since turning it off only meant re-extracting the same palettes on every track change and every launch. Use region-aware store URLs is gone too; the separate Store region dropdown was always the real control, and switching it off just sent you to the wrong storefront. Existing settings files are read as-is, so nothing else is disturbed. Dont worry about these few settings being removed they wont effect anything and now that some of them are set to always on. It should be a large improvement for those who never went through the massive settings list to turn them on (I dont blame you guys, its pretty long lol), and they also are set to use very little storage in the kb to at most a few mb even for a large collection of info.
- Scan cache is rebuilt once on first launch — the AI scoring change and the fake-lossless fix both mean entries cached by an older version would carry stale results: the old AI confidence values, and lossless verdicts made before the spectral-edge check existed. They are recomputed rather than trusted.
- Version identification is now read from the assembly instead of four hardcoded strings that had drifted between 1.5 and 1.8.0.
- The AI detection DSP now has regression tests — the spectral maths had none, so thresholds could drift with nothing to catch it. There is now a test file covering the new grid-peak check (including the case most likely to produce false positives: an MP3's brick-wall lowpass, which must not be mistaken for a generator artifact) and the watermark scan's encoding handling. A separate, skipped-by-default harness prints raw measurements per file for re-tuning thresholds against your own labeled samples.
- Removed dead code — four superseded windows (the old standalone Now Playing window, Batch Metadata, Batch Rename, and the online/offline dialog) plus assorted unreferenced helpers were deleted; all of their functionality had already moved into the Batch Editor and the embedded Now Playing panel.