Skip to main content

SoundAudit

A Python-based music library health scanner and metadata repair tool for FLAC/MP3/M4A/OGG/WAV/APE/WV/AIFF/AAC collections.

⚠️ Beta — work in progress. Expect rough edges and breaking changes. Back up your library before using the tag writeback features (fix --apply, resolve --auto-write).

What It Does

SoundAudit scans your music library, extracts metadata, fingerprints audio, resolves canonical tags via MusicBrainz, detects transcodes and duplicates, then writes corrections back to your files all via terminal UI or scriptable CLI.

Supported formats: FLAC, MP3, M4A, OGG, WAVE, APE, WV (WavPack), AIFF, AAC

Feature
Parallel incremental directory scanning ✅
Content-hash duplicate detection ✅
AcoustID fingerprinting + fuzzy duplicates ✅
Spectral transcode detection (fake-FLAC) ✅
MusicBrainz metadata resolver ✅
Tag writeback with original backup ✅
Navidrome folder organizer ✅
Interactive TUI + JSON/CSV/Markdown export ✅

Quick Start

# Install from PyPI
pip install soundaudit

# Or install from source with uv
uv pip install -e ".[dev]"

# Launch the interactive TUI
soundaudit tui

# Scan your library
soundaudit scan ~/Music --workers 4

# Re-scan only changed files (near-instant)
soundaudit scan ~/Music

# Resolve MusicBrainz metadata + preview fixes
soundaudit resolve
soundaudit fix --fields artist,album,title,year

# Write corrected tags to files
soundaudit fix --apply

# Reports
soundaudit report                              # summary
soundaudit report --missing-tags               # incomplete metadata
soundaudit report --duplicates                 # duplicate groups with keeper recommendations
soundaudit report --transcodes                 # suspected fake-FLAC
soundaudit report --corrupt                    # unreadable files
soundaudit report --corrupt --delete-corrupt   # delete corrupt files
soundaudit report --duplicates -o dups.json    # export to JSON

# Navidrome Organizer (dry-run by default)
soundaudit organize ~/Downloads --output ~/Music/Navidrome
soundaudit organize --from-db --output ~/Music/Navidrome --apply --move
soundaudit organize ~/Downloads --output ~/Music/Navidrome --apply --copy

# Duplicate Cleanup
soundaudit clean-duplicates                    # preview deletions
soundaudit clean-duplicates --apply             # delete all DELETE-marked files

# Analysis passes (on already-scanned data)
soundaudit analyze --duplicates                # content-hash dups
soundaudit analyze --acoustid                  # fingerprint dups
soundaudit analyze --transcodes --workers 4    # spectral fake-FLAC detection

Requirements

  • Python 3.10+
  • ffmpeg — required for spectral transcode detection (analyze --transcodes)
  • fpcalc (chromaprint) — optional, for AcoustID fingerprinting (analyze --acoustid)

Hash Strategies

Strategy Speed Use Case
head-only (default) Fastest Daily scans, slow/network storage
head-tail Fast Better collision resistance
full Slow Bit-perfect deduplication
none Instant Tag-only scanning

Configuration

Create config.yaml in your platform config directory (e.g. ~/.config/soundaudit/config.yaml on Linux, ~/Library/Application Support/soundaudit/config.yaml on macOS, %APPDATA%\soundaudit\config.yaml on Windows) or pass --config:

scan:
  paths:
    - ~/Music
  extensions: [".flac", ".mp3", ".m4a", ".ogg", ".wav", ".ape", ".wv", ".aiff", ".aac"]
  workers: 4
  follow_symlinks: false
  hash_strategy: head-only

fingerprinting:
  enabled: false
  fpcalc_path: /usr/bin/fpcalc
  api_key: "your-acoustid-key"

resolvers:
  rate_limit: 1.0
  retry_count: 3

organize:
  output_path: ~/Music/Navidrome
  template: "{album_artist}/{album} [{year}]/{disc_track}. {title}.{format}"
  move: true
  extensions: [".flac", ".mp3", ".m4a", ".ogg", ".wav", ".ape", ".wv", ".aiff", ".aac"]
soundaudit scan --config config.yaml
soundaudit tui --config config.yaml

Default database and logs are stored in platform-standard directories (e.g. ~/.local/share/soundaudit/ on Linux).

Performance

  • Slow storage (network-attached, USB): Use --hash-strategy head-only. Full-file hashing over high-latency storage is dramatically slower.
  • Incremental scans: Unchanged files are skipped by mtime — subsequent scans are near-instant.
  • Parallel extraction: Uses ThreadPoolExecutor; overhead is hidden by I/O latency on slow storage.

License

MIT

Metadata

Release files for soundaudit 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for soundaudit 0.1.2
File Size Uploaded Provenance Actions
soundaudit-0.1.2.tar.gz 182.0 kB With provenance Details for soundaudit-0.1.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for soundaudit 0.1.2
File Interpreter ABI Platform Actions
soundaudit-0.1.2-py3-none-any.whl Python 3 none any Details for soundaudit-0.1.2-py3-none-any.whl

Total release size: 263.8 kB

Release files / soundaudit-0.1.2.tar.gz

Download URL soundaudit-0.1.2.tar.gz
Size 182.0 kB
Tags Source
SHA-256 checksum
How to use checksums
75c8fce13045dff0acc99749d3e6f14ee0b6407745ca4d4995a0b6a674dc224d
BLAKE2b-256 checksum
How to use checksums
abf4bff79bf3870c26918246fa3cb9959e705d6acfa0d7801dd17e8d4aea03c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 6, 2026.

Transparency log

Release files / soundaudit-0.1.2-py3-none-any.whl

Download URL soundaudit-0.1.2-py3-none-any.whl
Size 81.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9e233d3b0dec87f7ada5388a321b053ec2e0362510cbfa1510a663124c06a000
BLAKE2b-256 checksum
How to use checksums
260ea8680e2cd26e070f327c21fb9765cf53c11cdbcaaf92949af267130e72bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 6, 2026.

Transparency log

Security for soundaudit 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for soundaudit-0.1.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 6, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page