Music_Metadata_Enricher/README.md
2026-04-29 05:26:59 +02:00

204 lines
6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Music Metadata Enricher
KI-gestützter Musik-Metadaten-Enricher für Jellyfin-Bibliotheken.
Analysiert Album-Verzeichnisse, vervollständigt Tags, besorgt Cover-Art und
benennt Dateien optional nach einem einheitlichen Schema um — vollständig ohne
API-Key nutzbar, mit optionaler Claude-KI für lückenhafte Metadaten.
---
## Features
- **Lokale Analyse** — Verzeichnisname, Dateinamen, bestehende ID3/FLAC/M4A-Tags,
Tracklist-Textdateien (.txt, .htm, .html)
- **MusicBrainz-Lookup** — Textsuche + AcoustID-Fingerprinting (optional)
- **Discogs-Fallback** — bei MusicBrainz-Misses
- **Claude API** — Reasoning-Schritt für unklare / widersprüchliche Daten (optional)
- **Cover-Art** — lokal → MusicBrainz Cover Art Archive → einbetten in MP3/FLAC/M4A
- **Tag-Schreiben** — title, artist, album, albumartist, tracknumber, discnumber,
date, genre, label (mutagen, ID3v2.4)
- **Umbenennen** — `01 - Artist - Title.ext` / `2-07 - Artist - Title.ext` (Multi-CD)
- **Backup** — Sicherungskopien vor jeder Änderung
- **CSV-Report** — vollständiges Protokoll aller Änderungen
- **Interaktiver / Auto-Modus** — mit Konfidenz-Schwellwert
---
## Voraussetzungen
```bash
pip install mutagen musicbrainzngs pyacoustid discogs_client \
anthropic Pillow requests tqdm
sudo apt install libchromaprint-tools # fpcalc für AcoustID-Fingerprinting
```
| Paket | Zweck | Optional? |
|-------|-------|-----------|
| `mutagen` | Tags lesen/schreiben | nein |
| `musicbrainzngs` | MusicBrainz-API | ja |
| `pyacoustid` | AcoustID-Fingerprinting | ja |
| `discogs_client` | Discogs-API | ja |
| `anthropic` | Claude API | ja |
| `Pillow` | Cover-Bildgröße prüfen | ja |
| `requests` | Cover-Art-Download | ja |
| `tqdm` | Fortschrittsbalken | ja |
| `fpcalc` | Audio-Fingerprinting-Binary | ja |
---
## Umgebungsvariablen (optional)
| Variable | Beschreibung |
|----------|-------------|
| `ANTHROPIC_API_KEY` | Claude API (Reasoning für Metadaten-Lücken) |
| `ACOUSTID_API_KEY` | AcoustID-Fingerprinting |
| `DISCOGS_TOKEN` | Discogs-API |
---
## CLI
```
music_enricher.py [Optionen] PFAD [PFAD ...]
music_enricher.py --album PFAD [Optionen]
```
| Option | Beschreibung |
|--------|-------------|
| `--dry-run` | Vorschläge anzeigen, nichts schreiben |
| `--auto` | Kein interaktiver Review-Schritt |
| `--confidence FLOAT` | Min-Konfidenz für `--auto` (default: 0.85) |
| `--rename` | Dateien nach Schema umbenennen |
| `--embed-cover` | Cover-Art in Audiodatei einbetten |
| `--backup PFAD` | Backup-Verzeichnis vor Änderungen |
| `--report PFAD` | CSV-Report der Änderungen |
| `--no-fingerprint` | AcoustID-Fingerprinting überspringen |
| `--no-api` | Keine externen API-Calls |
| `--no-cover` | Kein Cover-Art-Download |
| `--album PFAD` | Einzelnes Album verarbeiten |
| `--no-tqdm` | Fortschrittsanzeige deaktivieren |
---
## Verwendung
```bash
# Einzelnes Album — Dry-Run, kein API-Key nötig
python3 music_enricher.py --dry-run --no-api \
--album ~/Musik/Abba_-_Greatest_Hits
# Mit MusicBrainz-Lookup
python3 music_enricher.py --dry-run \
--album ~/Musik/Bach_Organ_-_Peter_Hurford
# Vollständig: Tags + Cover einbetten + umbenennen, mit Backup und Report
python3 music_enricher.py --embed-cover --rename \
--backup /tmp/musik_backup \
--report report.csv \
~/Musik
# Auto-Modus: nur Vorschläge ≥ 90% Konfidenz anwenden
python3 music_enricher.py --auto --confidence 0.90 \
--embed-cover --backup /tmp/backup \
~/Musik
# Mit Claude API (ANTHROPIC_API_KEY setzen)
export ANTHROPIC_API_KEY=sk-ant-...
python3 music_enricher.py --dry-run --album ~/Musik/UnbekanntesAlbum
```
---
## Verarbeitungs-Pipeline
```
Album-Verzeichnis
1. AlbumScanner — Dateitypen klassifizieren
2. HintExtractor — lokal, keine API
├─ Verzeichnisname → Artist, Album, Jahr
├─ Dateinamen → Tracknummer, Artist, Titel
├─ ID3/FLAC-Tags → bestehende Werte
└─ Tracklist .txt → Tracklisten parsen
3. MetadataResolver
├─ AcoustID → MusicBrainz via Fingerprint
├─ Textsuche → MusicBrainz-API
├─ Discogs → Fallback
└─ Claude API → Reasoning-Schritt (optional)
4. CoverHandler — lokal → MusicBrainz → einbetten
5. ReviewStep — interaktiv oder --auto mit Konfidenz
6. Executor — Backup → Tags → Cover → Umbenennen → Report
```
---
## Konfidenz-Modell
| Quelle | Bonus |
|--------|-------|
| AcoustID-Match ≥ 90% | +0.20 |
| MusicBrainz via Fingerprint | +0.25 |
| MusicBrainz-Texttreffer (Score/100) | +0.30 × Score |
| Discogs | +0.15 |
| Claude-Reasoning | +0.10 |
| Lokale Hints (Ordner-/Dateiname) | +0.05 |
---
## Dateinamen-Schema (mit `--rename`)
```
01 - ABBA - Dancing Queen.mp3
2-07 - Bach - Toccata And Fugue In D Minor BWV 565.flac
```
Bei Single-Disc entfällt die Disc-Nummer. Bei Multi-CD-Alben (Unterordner `CD1/`, `CD2/` etc.)
wird die Disc-Nummer automatisch erkannt.
---
## Projektstruktur
```
Music_Metadata_Enricher/
├── music_enricher.py Haupt-CLI, Pipeline-Orchestrierung
├── models.py Dataclasses: AlbumScan, AlbumHints, TrackProposal, …
├── scanner.py Dateisystem-Scanner, Typ-Klassifikation
├── hint_extractor.py Dateiname/Tag/Tracklist-Auswertung
├── metadata_resolver.py MusicBrainz + Discogs + Claude API
├── cover_handler.py Cover-Art: Suche, Download, Einbettung
├── executor.py Backup, Tag-Schreiben, Umbenennen, CSV-Report
└── test_suite_enricher.py 17 Unit-/Integrationstests
```
---
## Tests
```bash
python3 test_suite_enricher.py
# 📊 17/17 Tests erfolgreich
```
---
## Unterstützte Formate
| Format | Tags | Cover-Einbettung |
|--------|------|-----------------|
| MP3 | ID3v2.4 (EasyID3) | APIC-Frame |
| FLAC | Vorbis-Comments | METADATA_BLOCK_PICTURE |
| M4A/AAC | MP4-Tags | covr-Atom |
| Sonstige | mutagen generic | |