Fix 'Unknown' track artists leaking from bad ID3 tags and classical schema
- hint_extractor: filter existing tags through _is_good() so 'Unknown',
'Unknown Artist' etc. in existing ID3 tags don't override filename-parsed
artist names
- executor: _is_classical() now returns False when track_artist is a placeholder
('unknown', 'unknown artist') — prevents pop albums from getting the
Performer-Composer-Work filename schema
- executor/music_enricher: pass albumartist to _proposed_filename() so fallback
works when track artist is missing; fix display to use albumartist fallback too
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b64a4d0922
commit
aaa32622b2
3 changed files with 14 additions and 5 deletions
|
|
@ -52,6 +52,8 @@ def _is_classical(albumartist: str, track_artist: str, genre: str) -> bool:
|
||||||
ta = (track_artist or "").casefold().strip()
|
ta = (track_artist or "").casefold().strip()
|
||||||
if not aa or aa in ("various artists", "unknown artist", "unknown"):
|
if not aa or aa in ("various artists", "unknown artist", "unknown"):
|
||||||
return False
|
return False
|
||||||
|
if not ta or ta in ("unknown artist", "unknown"):
|
||||||
|
return False # placeholder, not a real composer
|
||||||
if aa == ta:
|
if aa == ta:
|
||||||
return False
|
return False
|
||||||
return True # performer ≠ composer → classical naming
|
return True # performer ≠ composer → classical naming
|
||||||
|
|
@ -76,7 +78,7 @@ def _proposed_filename(
|
||||||
disc_prefix = f"{proposal.disc_number}-" if (proposal.disc_number and proposal.disc_number > 1) else ""
|
disc_prefix = f"{proposal.disc_number}-" if (proposal.disc_number and proposal.disc_number > 1) else ""
|
||||||
prefix = f"{disc_prefix}{tn}"
|
prefix = f"{disc_prefix}{tn}"
|
||||||
|
|
||||||
track_artist = _safe_name(proposal.artist or "Unknown")
|
track_artist = _safe_name(proposal.artist or albumartist or "Unknown")
|
||||||
aa = _safe_name(albumartist)
|
aa = _safe_name(albumartist)
|
||||||
title = _safe_name(proposal.title or "Unknown")
|
title = _safe_name(proposal.title or "Unknown")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -562,8 +562,10 @@ def extract_hints(scan: AlbumScan, use_ocr: bool = True) -> AlbumHints:
|
||||||
disc_num = int(dm.group(1))
|
disc_num = int(dm.group(1))
|
||||||
break
|
break
|
||||||
|
|
||||||
title = tags.get("title") or fn_hints.get("title")
|
title_raw = tags.get("title") or fn_hints.get("title")
|
||||||
artist = tags.get("artist") or fn_hints.get("artist")
|
title = title_raw if _is_good(title_raw) else fn_hints.get("title")
|
||||||
|
artist_raw = tags.get("artist") or fn_hints.get("artist")
|
||||||
|
artist = artist_raw if _is_good(artist_raw) else fn_hints.get("artist")
|
||||||
|
|
||||||
# Tracklist-Matching: Nummer → exakter Titel → fuzzy Titel
|
# Tracklist-Matching: Nummer → exakter Titel → fuzzy Titel
|
||||||
# Wenn ein Match gefunden: disc+track aus Tracklist übernehmen (Tracklist ist
|
# Wenn ein Match gefunden: disc+track aus Tracklist übernehmen (Tracklist ist
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,8 @@ def _print_proposal(proposal: AlbumProposal) -> None:
|
||||||
for tp in proposal.tracks[:8]:
|
for tp in proposal.tracks[:8]:
|
||||||
tn = f"{tp.disc_number}-{tp.track_number:02d}" if tp.disc_number and tp.disc_number > 1 else (
|
tn = f"{tp.disc_number}-{tp.track_number:02d}" if tp.disc_number and tp.disc_number > 1 else (
|
||||||
f"{tp.track_number:02d}" if tp.track_number else "??")
|
f"{tp.track_number:02d}" if tp.track_number else "??")
|
||||||
print(f" {tn} {tp.artist} – {tp.title}")
|
display_artist = tp.artist or proposal.albumartist or "Unknown"
|
||||||
|
print(f" {tn} {display_artist} – {tp.title}")
|
||||||
if len(proposal.tracks) > 8:
|
if len(proposal.tracks) > 8:
|
||||||
print(f" … und {len(proposal.tracks) - 8} weitere")
|
print(f" … und {len(proposal.tracks) - 8} weitere")
|
||||||
|
|
||||||
|
|
@ -156,7 +157,11 @@ def process_album(
|
||||||
if args.rename:
|
if args.rename:
|
||||||
from executor import _proposed_filename
|
from executor import _proposed_filename
|
||||||
for tp in proposal.tracks:
|
for tp in proposal.tracks:
|
||||||
tp.new_filename = _proposed_filename(tp, tp.path.suffix)
|
tp.new_filename = _proposed_filename(
|
||||||
|
tp, tp.path.suffix,
|
||||||
|
albumartist=proposal.albumartist or "",
|
||||||
|
genre=proposal.genre or "",
|
||||||
|
)
|
||||||
|
|
||||||
# Review step
|
# Review step
|
||||||
if args.dry_run:
|
if args.dry_run:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue