Automatically fetch and safely complete music metadata, cover art, and synced lyrics from the CLI.
Project description
meta-sonata
English | 简体中文
Automatically fetch and fill missing music metadata, cover art, and synced lyrics for your music folders. Preview the changes, then apply them with one command.
Two Commands
Query and preview the metadata meta-sonata finds. Nothing is written:
meta-sonata enrich "/music/album"
Fetch and write metadata, cover art, and lyrics in one step:
meta-sonata enrich "/music/album" --write
Both commands accept an album folder or a larger music directory. Existing tags, filenames, and folder structure are trusted first; online sources fill the gaps.
Why meta-sonata?
- Local first: existing tags, folder names, and track structure anchor the match.
- Conservative: track count, duration, live/studio, and ambiguity checks prevent risky writes.
- Complete: metadata, cover art, and synced lyrics in one command.
- Automation-ready: dry runs, external incremental state, recursive discovery, and JSON audit plans.
Quick Start
pipx install meta-sonata
Or install it with uv:
uv tool install meta-sonata
Typical output:
scan: root=/music/album files=12 album_groups=1 loose_tracks=0 max_depth=3
resolve: 1/1 /music/album
lyrics: 1/1 /music/album
dry run: 1 plan(s)
- album: Artist / Album: artist=Artist album=Album year=2006 tracks=12 confidence=0.96 lyrics=11/12
nothing written; pass --write to apply
enrich enables metadata lookup, cover lookup, and lyrics by default. It scans
up to three directory levels; use --max-depth N or --recursive when needed.
What It Can Fill
| Area | Fields |
|---|---|
| Identity | title, artist, album artist, album, track/disc number |
| Release | date, label, catalog number, barcode, release type |
| Sources | MusicBrainz release/track IDs and provenance tags |
| Media | embedded cover art, synced LRC, plain lyrics |
Album metadata sources: MusicBrainz, iTunes, and NetEase.
Lyric sources: QQ Music, NetEase, KuGou, KuWo, and Migu.
meta-sonata sources
Put It in a Pipeline
Run it after download/extraction/CUE splitting and before the final library sync:
meta-sonata enrich "/staging/new-music" \
--changed-only \
--state-dir "/var/lib/meta-sonata" \
--write
Incremental state stays outside music folders. No marker files are added to albums.
Optional Metadata Browser
meta-sonata web "/music" --host 127.0.0.1 --port 8765
Open http://127.0.0.1:8765/ to browse audio files, core tags, source IDs,
technical details, covers, and embedded lyrics. The web UI has no write endpoints.
Shown with generated silent FLAC demo files and public-domain work metadata.
Safety
- Every write command is a dry run unless
--writeis present. - Low-confidence lyrics and ambiguous release identities are skipped.
- Mixed loose tracks are not forced into a fake album.
- Real libraries can be protected with
META_SONATA_PROTECTED_PATHS. - Tests generate silent FLAC files; no copyrighted media is committed.
More
Python 3.9+ is supported. The project is currently an early 0.1.x release;
unofficial provider endpoints may change or be rate-limited.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file meta_sonata-0.1.1.tar.gz.
File metadata
- Download URL: meta_sonata-0.1.1.tar.gz
- Upload date:
- Size: 57.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9d4a523859c5b342aaca5652601a20e80aa5375ceeabbea8bbf676146f4d4b2
|
|
| MD5 |
6da80b7caad4e1cefd9cff1673570b5d
|
|
| BLAKE2b-256 |
e83018c23bee38227f138f0e847d2ee74a773fb05f712ba70b6cc9e647c799e4
|
Provenance
The following attestation bundles were made for meta_sonata-0.1.1.tar.gz:
Publisher:
publish.yml on sendingE/meta-sonata
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meta_sonata-0.1.1.tar.gz -
Subject digest:
e9d4a523859c5b342aaca5652601a20e80aa5375ceeabbea8bbf676146f4d4b2 - Sigstore transparency entry: 2211239176
- Sigstore integration time:
-
Permalink:
sendingE/meta-sonata@005e926f620e434b1483af9a8e2ed96d0f03a9b3 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/sendingE
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@005e926f620e434b1483af9a8e2ed96d0f03a9b3 -
Trigger Event:
release
-
Statement type:
File details
Details for the file meta_sonata-0.1.1-py3-none-any.whl.
File metadata
- Download URL: meta_sonata-0.1.1-py3-none-any.whl
- Upload date:
- Size: 50.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4128639a90449b7cf4d2c0a9164cafeecc987c8cb2c79fceff9b07d7fe21ff9f
|
|
| MD5 |
f24d7c4946fa7d3a050ae1c47ef3ca33
|
|
| BLAKE2b-256 |
c735b4b2db9f0266ef5d612b4be14abef46e545743e6314a5f81678361ff04ea
|
Provenance
The following attestation bundles were made for meta_sonata-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on sendingE/meta-sonata
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
meta_sonata-0.1.1-py3-none-any.whl -
Subject digest:
4128639a90449b7cf4d2c0a9164cafeecc987c8cb2c79fceff9b07d7fe21ff9f - Sigstore transparency entry: 2211239200
- Sigstore integration time:
-
Permalink:
sendingE/meta-sonata@005e926f620e434b1483af9a8e2ed96d0f03a9b3 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/sendingE
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@005e926f620e434b1483af9a8e2ed96d0f03a9b3 -
Trigger Event:
release
-
Statement type: