executor: disc=1 now generates '1-01' prefix (same as disc=2 → '2-01'),
so multi-disc albums have consistent D-TT scheme throughout.
Single-disc tracks without disc tag stay as plain 'TT'.
hint_extractor: tracklist pattern 2 now requires '.' ')' or ':' as separator
(not bare whitespace) — prevents false-positive matches like
'2 x CD, Compilation, Remastered' being parsed as track 2.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pop schema: TT_-_Artist_-_Title.ext
Classical schema: TT_-_Performer_-_Komponist_-_Werk[-_Orchester_Dirigent].ext
triggered when albumartist ≠ track artist (pianist vs composer)
All spaces in names → underscores; separator _-_ between parts.
Missing parts (orchestra, conductor) are omitted.
models.py: added conductor/orchestra optional fields to TrackProposal.
executor.py: sanitize_dir_names() tries NameToUnix first, falls back to detox.
Called after all renames in a directory are complete.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Filename schema now: TT - AlbumArtist - TrackArtist - Title when albumartist
differs from track artist (e.g. pianist vs. composer). Identical artist → old
two-part format unchanged.
metadata_resolver: removed Claude API fallback entirely from _claude_resolve.
Chain is now Ollama (local, free) → OpenRouter (DeepSeek V3, cheap) only.
music_enricher: updated status line and use_claude flag accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Strip non-timestamp characters (BOM, invisible chars) from date/year values
both when reading existing tags in metadata_resolver and when writing in
executor. Also harden the EasyID3 except block to not wipe existing tags
when adding a missing ID3 header, and add per-field try/except in MP3 tag
writing so one bad field doesn't abort the entire track.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AI-powered per-album pipeline: scan → local hints → MusicBrainz/Discogs/Claude
resolve → cover art → interactive or auto review → tag write + rename + report.
All external dependencies optional; 17/17 unit tests passing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>