Bulk music identification and tagging tool β bring order to your chaotic music collection.
Automatically identify unknown music files using Shazam, write ID3 tags, rename files, and organize into Artist/Album folders.
- π Identify tracks via Shazam API
- π Write ID3 tags β title, artist, album, year, genre
- π Rename files β customizable templates like
{artist} - {title}.mp3 - ποΈ Organize β automatic Artist/Album folder structure
- β‘ Async processing β concurrent requests with rate limiting
- π Format conversion β WAV, FLAC, M4A, OGG β MP3
- π Export reports β JSON/CSV for processed files
- π‘οΈ Safe β dry-run mode to preview changes
# From source
git clone https://github.com/formeo/music_recognition.git
cd music_recognition
pip install -e .
# Or install dependencies only
pip install -r requirements.txt- Python 3.9+
- FFmpeg (for audio conversion)
# Ubuntu/Debian
sudo apt install ffmpeg
# macOS
brew install ffmpeg
# Windows
winget install ffmpeg# Recognize and tag all files in a directory
music-recognize /path/to/music
# Also rename files to "Artist - Title.mp3"
music-recognize /path/to/music --rename
# Organize into Artist/Album folders
music-recognize /path/to/music --organize --output /sorted
# Preview changes without modifying files
music-recognize /path/to/music --rename --dry-run# Process single file
music-recognize song.mp3
# Process directory with custom template
music-recognize /music --rename --template "{artist}/{album}/{title}.mp3"
# Export results to JSON
music-recognize /music --output report.json
# Force re-recognition of already tagged files
music-recognize /music --force --overwrite
# Quiet mode (minimal output)
music-recognize /music -q
# Verbose mode (detailed logging)
music-recognize /music -vimport asyncio
from music_recognition import MusicRecognizer, recognize_and_tag
# Simple one-liner
asyncio.run(recognize_and_tag("/music", rename=True))
# Full control
async def process_collection():
recognizer = MusicRecognizer(
max_concurrent=5,
delay_between_requests=0.5,
)
stats = await recognizer.process_directory(
source_dir="/music",
output_dir="/sorted",
write_tags=True,
rename=True,
rename_template="{artist} - {title}.mp3",
organize=True,
skip_recognized=True,
dry_run=False,
)
print(f"Recognized: {stats.recognized}/{stats.processed}")
print(f"Success rate: {stats.success_rate:.1f}%")
asyncio.run(process_collection())usage: music-recognize [-h] [-o PATH] [--rename] [--template TPL] [--organize]
[--overwrite] [-f] [-c N] [--delay SEC] [-n] [-v] [-q]
path
Arguments:
path File or directory to process
Options:
-o, --output PATH Output directory or report file (.json/.csv)
--rename Rename files based on metadata
--template TPL Filename template (default: "{artist} - {title}.mp3")
--organize Organize files into Artist/Album folders
--overwrite Overwrite existing ID3 tags
-f, --force Process files even if they have valid tags
-c, --concurrent N Max concurrent requests (default: 5)
--delay SEC Delay between requests (default: 0.5)
-n, --dry-run Preview changes without modifying files
-v, --verbose Verbose output
-q, --quiet Minimal output
| Placeholder | Description | Example |
|---|---|---|
{artist} |
Artist name | Queen |
{title} |
Track title | Bohemian Rhapsody |
{album} |
Album name | A Night at the Opera |
{year} |
Release year | 1975 |
{genre} |
Genre | Rock |
{track} |
Track number | 01 |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π΅ Music Recognition v1.0.0 β
β Identify β’ Tag β’ Rename β’ Organize β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Processing: /music/old_collection
Actions: tag, rename
[150/150] 100.0% β Unknown Track.mp3
ββββββββββββββββββββββββββββββββββββββββββββββββββ
SUMMARY
ββββββββββββββββββββββββββββββββββββββββββββββββββ
Total files: 150
Processed: 150
Recognized: 142
Failed: 5
Skipped: 3
Success rate: 94.7%
Duration: 125.3s
ββββββββββββββββββββββββββββββββββββββββββββββββββ
- Digital hoarders: 50GB folder of
Track01.mp3from 2005 - DJs: Tracks from old mixtapes without metadata
- Media server admins: Plex/Jellyfin shows "Unknown Artist"
- Music collectors: Vinyl rips without proper tags
| Format | Read | Convert to MP3 |
|---|---|---|
| MP3 | β | β |
| WAV | β | β |
| FLAC | β | β |
| M4A | β | β |
| OGG | β | β |
| OPUS | β | β |
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest -v
# Run tests with coverage
pytest --cov=music_recognition --cov-report=html
# Format code
black src/
isort src/MIT License β use freely.
- ShazamIO β Python Shazam API wrapper
- Mutagen β Audio metadata library
- PyDub β Audio format conversion
Like this project? Give it a β on GitHub!