CDDB→album.json + LLM-Prompts mit Track-Künstler

ripper: nach erfolgreichem CDDB-Rip album.json im Album-Verzeichnis
speichern (Artist, Titel, alle Discs mit Track-Künstlern) — Workflow-
Lücke zwischen rip und apply geschlossen.

llm_parser, vision_llm: Prompts erklären das optionale Track-artist-
Feld; LLM setzt es nur wenn Track-Interpret vom Album-Künstler abweicht.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Dieter Schlüter 2026-02-18 00:16:44 +01:00
commit bafea5f335
3 changed files with 40 additions and 8 deletions

View file

@ -11,6 +11,9 @@ from typing import NamedTuple
from pydantic import BaseModel
from musiksammlung.config import AudioFormat
from musiksammlung.models import Album as AlbumModel
from musiksammlung.models import Disc as DiscModel
from musiksammlung.models import Track as TrackModel
logger = logging.getLogger(__name__)
@ -433,6 +436,7 @@ def interactive_rip(config: RipperConfig) -> None:
album_name = f"Album{album_counter}"
disc_counter = 1
all_discs: list[DiscModel] = []
while True:
print(f"\n Album: {album_name}")
@ -466,6 +470,17 @@ def interactive_rip(config: RipperConfig) -> None:
print(f" ✓ Done — {len(tracks)} tracks")
for t in tracks:
print(f" {t.track_number:2d}. {t.title} [{t.artist}]")
all_discs.append(DiscModel(
disc_number=disc_num,
tracks=[
TrackModel(
track_number=t.track_number,
title=t.title,
artist=t.artist,
)
for t in tracks
],
))
else:
print(" ✓ Done (no CDDB data)")
@ -483,6 +498,17 @@ def interactive_rip(config: RipperConfig) -> None:
disc_counter += 1
if all_discs:
artist = all_discs[0].tracks[0].artist or album_name
album_model = AlbumModel(artist=artist, album=album_name, discs=all_discs)
album_root = config.output_dir / _sanitize_name(album_name)
json_path = album_root / "album.json"
json_path.write_text(
album_model.model_dump_json(indent=2), encoding="utf-8"
)
print(f"\n album.json gespeichert: {json_path}")
print(" → Weiter mit: musiksammlung apply <album-verzeichnis> album.json")
raw_album = input("\nNext album? (y/n): ")
if _clean_input(raw_album).lower() != "y":
break