Music_Metadata_Enricher/BEDIENUNGSANLEITUNG.md
dschlueter 0ca05e91d4 Add --except PATTERN option and update documentation
- --except filters albums by directory name (glob or substring, repeatable)
- README.md: new options table entries, new cover sources, updated pipeline,
  corrected test count (33), added batch example
- BEDIENUNGSANLEITUNG.md: new options table, sections E (batch+except),
  F (--status), LASTFM_API_KEY env var, corrected test count

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 11:38:52 +02:00

295 lines
9.3 KiB
Markdown
Raw Permalink 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.

# Bedienungsanleitung — Music Metadata Enricher
## Überblick
Das Programm liest ein Album-Verzeichnis ein, analysiert alle verfügbaren Quellen
(Dateinamen, Tags, Tracklisten, Bilder, YouTube-Metadaten) und schreibt saubere
Metadaten-Tags in die Audiodateien. Optional benennt es die Dateien nach einem
einheitlichen Schema um und bettet Cover-Art ein.
---
## Voraussetzungen
```bash
pip install mutagen musicbrainzngs Pillow requests tqdm beautifulsoup4
```
Für YouTube-Metadaten:
```bash
sudo apt install yt-dlp
```
Für LLM-Reasoning: **Ollama** muss laufen (`http://localhost:11434`),
Modell `qwen3:8b` empfohlen:
```bash
ollama pull qwen3:8b
ollama pull qwen3-vl:latest # für OCR (optional)
```
---
## Album-Verzeichnis — Was wird erkannt?
Das Programm versteht eine Vielzahl von Verzeichnis-Layouts:
| Datei / Muster | Wird genutzt für |
|----------------|-----------------|
| Verzeichnisname `Artist_-_Album` | Künstler, Albumtitel |
| Dateiname `01_-_Artist_-_Titel.flac` | Tracknummer, Artist, Titel |
| Dateiname mit YouTube-ID am Ende | Metadaten via yt-dlp |
| `tracklist.txt` / `tracklist.htm` | Vollständige Trackliste |
| `back.jpg` / `booklet.jpg` | OCR-Trackliste via Ollama Vision |
| `Front.jpg` / `folder.jpg` / `Front.webp` | Cover-Art |
| `*.m3u` / `*.m3u8` | Wiedergabereihenfolge |
| ID3/FLAC/M4A-Tags | Bestehende Metadaten |
### YouTube-IDs im Dateinamen
Dateien, die mit `yt-dlp` oder `musikvideo2audio` heruntergeladen wurden,
enthalten oft eine 11-stellige YouTube-ID am Ende des Dateinamens:
```
Hohe_Tannen_BxmOrMN-Kss.flac → ID: BxmOrMN-Kss
Ade_zur_guten_Nacht_SOx8dgI2gGU.flac → ID: SOx8dgI2gGU
```
Das Programm entfernt die ID aus dem Titel und holt automatisch Titel,
Uploader und Kapitel (= Trackliste) via `yt-dlp`.
---
## Grundprinzip: erst Dry-Run, dann scharf
**Immer zuerst mit `--dry-run` testen**, bevor Dateien verändert werden:
```bash
# Schritt 1: Vorschau
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--dry-run --no-fingerprint \
--album ~/nvme2n1p7_home/Musik/MEIN_ALBUM
# Schritt 2: Scharf (wenn Vorschau OK)
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--auto --confidence 0.1 --rename --embed-cover --no-fingerprint \
--backup /tmp/mein_backup \
--album ~/nvme2n1p7_home/Musik/MEIN_ALBUM
```
> **Tipp:** Der `--backup`-Ordner enthält Kopien aller Originaldateien vor der
> Änderung. Bei Problemen können Dateien von dort wiederhergestellt werden.
---
## Alle Optionen
| Option | Beschreibung |
|--------|-------------|
| `--album PFAD` | Einzelnes Album-Verzeichnis verarbeiten |
| `PFAD [PFAD ...]` | Mehrere Root-Verzeichnisse (Unterordner = Alben) |
| `--dry-run` | Nur anzeigen, nichts schreiben |
| `--auto` | Ohne interaktive Rückfrage ausführen |
| `--confidence 0.X` | Minimale Konfidenz für `--auto` (default: 0.85) |
| `--rename` | Dateien nach Namens-Schema umbenennen |
| `--embed-cover` | Cover-Art in Audiodatei einbetten |
| `--backup PFAD` | Backup-Verzeichnis vor Änderungen |
| `--report PFAD` | CSV-Protokoll aller Änderungen |
| `--no-fingerprint` | AcoustID-Fingerprinting überspringen (schneller) |
| `--no-api` | Keine externen Zugriffe (MusicBrainz, OCR, YouTube) |
| `--no-cover` | Kein Cover-Art-Download |
| `--no-tqdm` | Fortschrittsbalken deaktivieren |
| `--status` | Bibliotheksstatus anzeigen (fehlende Cover, schlechte Tags) — nichts schreiben |
| `--skip-complete` | Alben überspringen, die bereits Cover + gute Tags haben |
| `--except PATTERN` | Album ausschließen, dessen Verzeichnisname das Muster enthält (Glob oder Substring, mehrfach verwendbar) |
---
## Typische Anwendungsfälle
### A) Album mit YouTube-IDs in Dateinamen
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--auto --confidence 0.1 --rename --embed-cover --no-fingerprint \
--backup /tmp/backup \
--album ~/nvme2n1p7_home/Musik/Die_Bergvagabunden_Am_Lagefeuer.audio
```
Das Programm erkennt die YouTube-IDs, lädt Titel und Künstler, entfernt die
IDs aus den Dateinamen und benennt die Dateien sauber um.
### B) Klassik-Album (Komponist ≠ Performer)
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--auto --confidence 0.5 --rename --embed-cover \
--backup /tmp/backup \
--album ~/nvme2n1p7_home/Musik/Bach_Organ_-_Peter_Hurford
```
Bei Klassik-Alben (Performer ≠ Komponist) wird automatisch das Klassik-Schema
verwendet:
```
01_-_Peter_Hurford_-_Johann_Sebastian_Bach_-_Toccata_And_Fugue_In_D_Minor_BWV_565.mp3
```
### C) Album ohne Cover — Cover nachträglich hinzufügen
Wenn kein Cover gefunden wurde:
1. Cover-Bild in das Album-Verzeichnis kopieren (Name: `Front.jpg` oder `Front.webp`)
2. Programm erneut laufen lassen — es erkennt das neue Bild und bettet es ein
```bash
cp /pfad/zum/cover.jpg ~/nvme2n1p7_home/Musik/MEIN_ALBUM/Front.jpg
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--auto --confidence 0.1 --embed-cover --no-fingerprint \
--album ~/nvme2n1p7_home/Musik/MEIN_ALBUM
```
### D) Ganze Bibliothek verarbeiten
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--auto --confidence 0.85 --embed-cover --no-fingerprint \
--backup /tmp/bibliothek_backup \
--report /tmp/report.csv \
~/nvme2n1p7_home/Musik
```
Alben mit Konfidenz unter 0.85 werden übersprungen und müssen manuell
mit `--album` und niedrigerem `--confidence`-Wert bearbeitet werden.
### E) Batch-Lauf mit Ausschlüssen und Überspringen bereits fertiger Alben
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--auto --confidence 0.5 --rename --embed-cover --no-fingerprint \
--skip-complete \
--except 'Eigene_Aufnahmen*' \
--except Hoerbuch \
--backup /tmp/backup \
~/nvme2n1p7_home/Musik
```
- `--skip-complete` überspringt Alben, die bereits Cover und gute Tags haben.
- `--except` schließt Alben anhand des Verzeichnisnamens aus.
Glob-Muster (`*`, `?`) und einfache Substrings werden beide unterstützt.
Die Option kann mehrfach angegeben werden.
### F) Bibliotheksstatus anzeigen
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--status ~/nvme2n1p7_home/Musik
```
Zeigt alle Alben mit fehlenden Covern oder schlechten Tags — ohne etwas zu schreiben.
### G) Interaktiver Modus (ohne --auto)
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/music_enricher.py \
--rename --embed-cover --no-fingerprint \
--album ~/nvme2n1p7_home/Musik/MEIN_ALBUM
```
Das Programm zeigt den Vorschlag und fragt:
```
[Enter] Akzeptieren [s] Überspringen [q] Abbrechen:
```
---
## Dateinamen-Schema (mit `--rename`)
### Pop / Volkslieder / Standard
```
TT_-_Künstler_-_Titel.ext
01_-_ABBA_-_Dancing_Queen.mp3
14_-_Die_Bergvagabunden_-_Wir_sind_durch_Deutschland_gefahren.flac
```
### Klassik (Performer ≠ Komponist)
```
TT_-_Performer_-_Komponist_-_Werk.ext
01_-_Peter_Hurford_-_Johann_Sebastian_Bach_-_Toccata_And_Fugue_In_D_Minor_BWV_565.mp3
```
### Multi-CD
```
D-TT_-_Künstler_-_Titel.ext
1-01_-_..._-_....mp3 ← CD 1, Track 1
2-01_-_..._-_....mp3 ← CD 2, Track 1
```
Regeln:
- Leerzeichen → Unterstriche
- Teile durch `_-_` getrennt
- Sonderzeichen (`/ : " * ? < >`) → Unterstriche
- Nachbereinigung durch `NameToUnix` (falls installiert)
---
## Konfidenz-Anzeige verstehen
```
Konfidenz: [████░░░░░░] 40% Quellen: local-hints, musicbrainz-text, llm-resolve
```
| Konfidenz | Bedeutung |
|-----------|-----------|
| < 20% | Nur Dateiname/Ordnername bekannt, LLM hat geraten |
| 2050% | MusicBrainz-Treffer mit mittlerem Score |
| 5075% | Guter MusicBrainz-Treffer oder AcoustID-Match |
| > 75% | AcoustID-Fingerprint + MusicBrainz bestätigt |
Für Albums die nicht in MusicBrainz sind (Eigenaufnahmen, YouTube-Downloads):
`--confidence 0.1` verwenden.
---
## Fehlerbehandlung
### "Cover nicht gefunden"
`Front.jpg` oder `Front.webp` manuell ins Album-Verzeichnis legen,
dann erneut mit `--embed-cover` laufen lassen.
### "Artist: F.R. David" (falscher Künstler)
→ Das LLM hat falsch geraten. Im Interaktiv-Modus mit `s` überspringen
oder Tags nachträglich mit einem Tag-Editor (z.B. Kid3, MusicBrainz Picard)
korrigieren.
### Programm läuft, aber nichts passiert
→ Prüfen ob Ollama läuft: `ollama list`
`--no-api` verwenden wenn kein Netzwerk / kein Ollama verfügbar
### Backup wiederherstellen
```bash
cp /tmp/mein_backup/ALBUMNAME__dateiname.flac \
~/nvme2n1p7_home/Musik/ALBUMNAME/dateiname.flac
```
---
## Umgebungsvariablen
```bash
export OLLAMA_HOST=http://localhost:11434 # Ollama-Server
export OLLAMA_RESOLVE_MODEL=qwen3:8b # LLM für Metadaten
export OLLAMA_OCR_MODEL=qwen3-vl:latest # Vision-Modell für OCR
export OPENROUTER_API_KEY=sk-or-... # OpenRouter-Fallback (optional)
export ACOUSTID_API_KEY=... # AcoustID-Fingerprinting (optional)
export DISCOGS_TOKEN=... # Discogs-API (optional)
export LASTFM_API_KEY=... # Last.fm Cover + Tracklist (optional)
```
Kostenloser Last.fm API-Key: https://www.last.fm/api/account/create
---
## Tests ausführen
```bash
python3 ~/nvme2n1p7_home/Musik/Music_Metadata_Enricher/test_suite_enricher.py
# 📊 33/33 Tests erfolgreich
```