Commit Graph

93 Commits

Author SHA1 Message Date
Jonathan c75b9d3562 fix: force IPv4 in worker, count real Qobuz files, flatten nested output
- worker had no IPv6 route -> Qobuz CDN (dual-stack) failed ~half the tracks
  with 'Network is unreachable'; disable IPv6 in the container (IPv4 only).
- StreamripClient counted metadata tracks (always full) -> a partial download
  falsely imported; now count the actual files written (short count -> needs_attention).
- streamrip writes into a nested 'Artist - Album [..]/' folder the tagger never saw;
  flatten audio files up into the album dir so tagging/organization runs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 01:01:23 +02:00
Jonathan 00b3dddca6 feat: Qobuz auth-token (user_id + token) login as a reliable alternative to email/password
Qobuz's email/password API login returns 401 even with valid credentials
(a known Qobuz limitation, unaffected by streamrip version). Add settings
fields for a Qobuz user ID + auth token (token stored encrypted); when both
are present StreamripClient uses use_auth_token=True, else falls back to
email/password.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 00:46:17 +02:00
Jonathan caa0d542ea fix: MD5-hash Qobuz password and never log credential-bearing login errors
streamrip's email/password login expects the MD5 digest, not plaintext
(caused 'Invalid credentials'). Also wrap login() so streamrip's exception —
which embeds the email/password/app_id — can never reach the worker logs;
re-raise a clean credential-free RuntimeError instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 00:30:34 +02:00
Jonathan f91117092b refactor: use one album path for tagging and library record
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 00:09:42 +02:00
Jonathan 1596bab23e feat: wire the mutagen tagger into the worker loop 2026-07-10 23:59:28 +02:00
Jonathan d1fcfd544f fix: make album tagging best-effort per file
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 23:57:28 +02:00
Jonathan 32deac65a6 feat: real mutagen tagger and MusicBrainz tracklist 2026-07-10 23:52:19 +02:00
Jonathan 1c02a870f3 feat: Tagger seam and pipeline tag-stage integration
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 23:47:20 +02:00
Jonathan 2812695465 feat: organized album directory and persistent /music bind-mount
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 23:43:15 +02:00
Jonathan fef8cf0681 feat: wire MusicBrainz resolver into the worker loop 2026-07-10 23:27:28 +02:00
Jonathan 85c74ba109 feat: add real MusicBrainz resolver and opt-in live test 2026-07-10 23:21:50 +02:00
Jonathan c16e9f1035 feat: MusicBrainz-aware intake and completeness check against canonical track count 2026-07-10 23:17:06 +02:00
Jonathan cf5632aa5f fix: isolate per-adapter search failures in the pipeline match loop
Wrap each adapter's search() call in the match stage in try/except so
a down source (dead slskd, Qobuz auth error, etc.) contributes no
candidates instead of crashing run_pipeline and killing the worker.
2026-07-10 23:12:33 +02:00
Jonathan f93d71f78a test: verify SoulseekAdapter through the pipeline and full ranking order 2026-07-10 22:56:23 +02:00
Jonathan 6b09047f64 feat: add Soulseek to the config-aware registry 2026-07-10 22:53:25 +02:00
Jonathan ec1fc568ba fix: scope slskd download polling to enqueued files and raise on timeout
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 22:52:03 +02:00
Jonathan 7b4b7ef1aa feat: add real slskd Soulseek client and opt-in live test 2026-07-10 22:45:36 +02:00
Jonathan b5931a7b66 feat: add SoulseekAdapter with injectable client seam 2026-07-10 22:40:53 +02:00
Jonathan 7510e7718b test: verify real QobuzAdapter flows through the pipeline and outranks YouTube 2026-07-10 22:16:03 +02:00
Jonathan 71143dc15d feat: config-aware registry gating Qobuz on credentials; wire config into worker 2026-07-10 22:13:11 +02:00
Jonathan 085193aa82 fix: run Qobuz login inside try/finally and reuse a single streamrip config
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 22:11:25 +02:00
Jonathan 707038da64 feat: add real streamrip Qobuz client and opt-in live test 2026-07-10 22:05:36 +02:00
Jonathan 0091c4f5e7 feat: add QobuzAdapter with injectable client seam 2026-07-10 21:59:57 +02:00
Jonathan f3d718d9c0 test: verify real YouTubeAdapter flows through the pipeline 2026-07-10 21:33:05 +02:00
Jonathan 4b2b2888ca feat: wire real YouTube adapter into the registry 2026-07-10 21:29:26 +02:00
Jonathan a93c248aaf feat: add real yt-dlp client and opt-in live test; ffmpeg in worker image 2026-07-10 21:24:05 +02:00
Jonathan 5a3e64b057 feat: add YouTubeAdapter with injectable client seam 2026-07-10 21:19:27 +02:00
Jonathan feaff42010 feat: add worker config reader with secret decryption 2026-07-10 20:07:49 +02:00
Jonathan c90e055343 feat: add worker AES-256-GCM crypto matching the web envelope 2026-07-10 20:03:28 +02:00
Jonathan d3bec2ee10 refactor: make adapter .tier the single source of truth for ranking
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 19:07:58 +02:00
Jonathan fbd6a056a4 feat: wire adapter registry into worker loop 2026-07-10 18:59:28 +02:00
Jonathan 7c28eddd47 fix: persist all found candidates and guard duplicate adapter names
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 18:54:15 +02:00
Jonathan 71c7945da2 feat: replace fake pipeline with staged adapter-driven pipeline
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 18:45:01 +02:00
Jonathan 991365e746 feat: add SourceAdapter contract and fake adapters 2026-07-10 18:35:52 +02:00
Jonathan ffc4d1f483 feat: add candidate ranker with confidence gate 2026-07-10 18:31:09 +02:00
Jonathan 3888d2ab8a feat: add confidence scoring 2026-07-10 18:26:52 +02:00
Jonathan 1c013dfdd1 feat: add domain types and quality ranking 2026-07-10 18:22:47 +02:00
Jonathan 7532e20d1e fix: worker waits for schema before claiming; npm ci for reproducible builds
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 17:32:20 +02:00
Jonathan 3e44de093e feat: add worker loop and production Dockerfiles 2026-07-10 17:16:24 +02:00
Jonathan d441d0561f feat: add fake acquisition pipeline 2026-07-10 17:04:41 +02:00
Jonathan fc1229b885 test: clean worker test DB before each test to prevent flakiness
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 17:02:38 +02:00
Jonathan 49b69c592d feat: add worker job-claim logic 2026-07-10 16:58:28 +02:00
Jonathan 599cc76404 chore: scaffold web, worker, and compose stack
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 16:33:22 +02:00