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>
- Track model: add optional artist field (None = fall back to album artist)
- organizer: append _-_<artist> to each filename
- tagger: use track.artist over album.artist for the 'artist' tag
- playlist: widen glob pattern to match new _-_<artist> suffix
- tests: update assertions + add test for track-artist override
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
When no output_dir is given (or --in-place is set), files are renamed
and tagged directly in the source directory instead of being moved into
a separate Jellyfin library hierarchy.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
After the organizer was updated to use underscores in filenames,
the tagger (glob pattern "01 *") and playlist generator (pattern
"01 title.*") still used spaces and failed to find any files.
Updated both to use "01_*" / "01_title.*" patterns.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace all non-word characters (spaces, punctuation, brackets, etc.)
with underscores in track titles, album names and artist names.
Collapse consecutive underscores to one, strip leading/trailing ones.
Umlauts (ä, ö, ü, ß) and digits are preserved.
Also use underscore instead of space between track number and title.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Check audio file count vs JSON track count per disc before processing.
Aborts with a clear error showing which discs have discrepancies and
whether tracks are missing from the JSON or audio files are missing
from the directory.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Change default text-LLM from llama3 (not installed) to gemma3:12b
- Increase LLM timeout from 120s to 300s (large models need longer)
- Add explicit multi-column layout instruction to vision prompt to
prevent skipping columns on dense CD back-cover tracklists
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
cmd[-2] was overwriting the -a action value instead of the -o format
value when -P was appended last. Now output_fmt is computed upfront and
the cmd list is built cleanly without post-hoc index manipulation.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Replace capture_output=True with Popen+live streaming (_stream_abcde)
- Show track counter: "Track 3/14 Title..."
- Show cdparanoia progress bar: [████████░░░░░░░░░░░░░░░░░░░░░░] 45.2% 12.3 MB
- Show CDDB album header and track list as they appear
- Show tagging progress: "Tagging 14/14"
- Print abcde command for full transparency
- Collect CDDB track lines while streaming for later parsing
- Log warnings when CDDB returns no data
- Print full renamed file list after ripping
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
abcde's move action + OUTPUTFORMAT config failed because shell variables
like ${TRACKNUM} are evaluated immediately when the config is sourced.
Instead: skip move, search abcde's internal temp dir (abcde.XXXX/trackNN.flac)
and move files flat into output_dir ourselves.
- Replace _get_audio_files/_write_abcde_config with _extract_tracks()
- _rename_files() now matches track01.flac pattern (abcde naming)
- Fallback rename to 01.flac etc. when no CDDB data available
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add _clean_input(): strips ANSI escape codes (^[[D from arrow keys),
control characters and surrounding quotes from user input
- Add _write_abcde_config(): writes temp abcde config with OUTPUTDIR
and flat OUTPUTFORMAT so files land in the right directory
- Add 'move' action to abcde so encoded files are actually placed in
OUTPUTDIR instead of staying in abcde's internal temp directory
- Change _get_audio_files() to use rglob() (recursive) so files in
abcde subdirectories are found
- Improve error messages: include abcde output on failure
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove tests/ directory from version control (added to .gitignore)
- Add .idea/ to .gitignore
- Ripper: CDDB lookup, non-interactive mode, English UI, file renaming
- Config: abcde format mapping, per-format quality options
- CLI: English help texts, new --no-cddb / --pipes / --parallel / --quality options
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add --from-text/-t option to scan and process commands for
pre-formatted tracklists (e.g. from Perplexity)
- Refactor llm_parser to use Chat API instead of Generate API
- Reuse _extract_json() from vision_llm for robust JSON extraction
- Improve SYSTEM_PROMPT with strict rules (Various Artists, no
invented years, no composer info in titles, /no_think)
- Remove format:"json" constraint that caused empty responses
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tesseract OCR fails on rotated/low-contrast CD back covers.
New vision_llm module sends images directly to qwen3-vl via
Ollama chat API, bypassing OCR entirely. Robust JSON extraction
handles thinking tags, markdown blocks, and empty responses.
CLI scan/process commands gain --vision flag.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Modular Python package with Typer CLI (scan/apply/process commands),
Pydantic data models, OCR via Tesseract, LLM-based tracklist parsing,
mutagen audio tagging, M3U playlist generation, and cover processing.
Includes 8 passing tests and ruff lint config.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>