- ripper: replace per-call stdin daemon threads with a shared module-level
reader (_stdin_queue + _read_line), preventing orphan threads from stealing
stdin input after photo uploads; all 8 input() calls in interactive_rip
now use _read_line()
- ripper: _stream_abcde return type annotation fixed (2-tuple → 3-tuple)
- ripper: disc retry rejection now breaks gracefully instead of raising
unhandled RuntimeError that crashed the program
- ripper: int() on disc number input wrapped in try/except
- cddb: multi-line DTITLE/TTITLE values are now concatenated instead of
only keeping the last line (per CDDB/xmcd protocol spec)
- cli: removed unreachable dead code block in apply command
- scanner_server: upload form auto-resets after 3s for repeated uploads
- tests: _scanner_patches() updated to mock _read_line alongside
_input_or_scan (225 tests passing)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>