-
889e33355f
feat(discovery): SimilaritySource protocol + FakeSimilaritySource
Jonathan
2026-07-12 00:03:45 +02:00
-
0ddc9db611
feat(discovery): DiscoverySuggestion schema + WatchedArtist.lastDiscoveredAt
Jonathan
2026-07-11 23:58:45 +02:00
-
0d2b7f0ae5
docs: slice 3 discovery implementation plan (14 tasks, TDD)
Jonathan
2026-07-11 22:49:40 +02:00
-
0cf464aad0
docs: slice 3 discovery design — MetaBrainz-native (ListenBrainz), suggestion feed
Jonathan
2026-07-11 22:35:49 +02:00
-
48260c0fba
docs: update README status — slices 1 & 2 done, scan + release filter, monitor off by default
Jonathan
2026-07-11 18:34:00 +02:00
-
4c1d3c639e
fix: scan backfills release type metadata onto pre-existing rows
Jonathan
2026-07-11 18:12:37 +02:00
-
d65230ddfb
feat: artist page toggle to show all release types (default studio-only)
Jonathan
2026-07-11 18:07:38 +02:00
-
560fdaa4b0
feat: filter artist discography + counts to core releases unless showAllTypes
Jonathan
2026-07-11 18:05:46 +02:00
-
f2dbef047c
feat: WatchedArtist.showAllTypes toggle (default false)
Jonathan
2026-07-11 18:03:29 +02:00
-
28fc1ee1a8
fix: artists search marks already-followed artists instead of a Follow button
Jonathan
2026-07-11 17:50:53 +02:00
-
aafd8b15d5
fix: scan populates each followed artist's full discography (unmonitored)
Jonathan
2026-07-11 17:49:26 +02:00
-
2fb825140f
feat: auto-refresh the scan button until the worker finishes
Jonathan
2026-07-11 17:40:27 +02:00
-
612cd02b15
feat: Settings 'Scan library' button + last-result status
Jonathan
2026-07-11 17:14:37 +02:00
-
7cb99361a5
feat: /api/scan — request a library scan + read its result
Jonathan
2026-07-11 17:11:42 +02:00
-
c31c8b5249
feat: worker runs the library scan when Config scan.requested is set
Jonathan
2026-07-11 17:08:51 +02:00
-
4da0db4a1d
fix: scan records the probed format + skips hidden album dirs (probe once)
Jonathan
2026-07-11 17:06:48 +02:00
-
4907d0d5a4
feat: library scan — probe seam + scan_library (have + monitored + followed)
Jonathan
2026-07-11 17:00:33 +02:00
-
af67d01aa2
feat: LibraryItem.requestId nullable (scanned haves need no request) + test cleanup
Jonathan
2026-07-11 16:56:59 +02:00
-
446d54f819
feat: MBTarget exposes rgMbid + artistMbid from the resolver
Jonathan
2026-07-11 16:54:11 +02:00
-
f421904c9b
docs: add library-scan implementation plan
Jonathan
2026-07-11 16:50:57 +02:00
-
a4ae60a99e
docs: add library-scan design (ingest on-disk albums as have+monitored)
Jonathan
2026-07-11 16:45:58 +02:00
-
f59f972c1b
fix: guard test cleanup to a dedicated lyra_test DB (never wipe live data)
Jonathan
2026-07-11 16:16:12 +02:00
-
88ef4149d9
fix: atomic import swap, disk/DB replace consistency, guarded pipeline loop
Jonathan
2026-07-11 15:27:48 +02:00
-
fe973343ad
feat: sweep orphaned staging dirs on worker startup
Jonathan
2026-07-11 15:18:30 +02:00
-
29604db9cd
feat: download to staging + atomically promote complete album into the library
Jonathan
2026-07-11 15:13:31 +02:00
-
0eb36e8362
feat: staging-dir + clean import_album library helpers
Jonathan
2026-07-11 15:08:24 +02:00
-
1d847e2aeb
docs: add staged-download + atomic-import implementation plan
Jonathan
2026-07-11 15:07:01 +02:00
-
2614e32f55
docs: add staged-download + atomic-import design (pipeline fix)
Jonathan
2026-07-11 14:59:55 +02:00
-
9f895cfc10
fix: search-now dedupes against an active job (match worker enqueue invariant)
Jonathan
2026-07-11 14:19:31 +02:00
-
7087b2780e
feat: artist discography page + wanted page
Jonathan
2026-07-11 14:11:53 +02:00
-
f7135b9046
feat: artists page with live-search follow picker
Jonathan
2026-07-11 14:08:10 +02:00
-
cd652c7285
feat: wanted list API — list + standalone add
Jonathan
2026-07-11 14:04:35 +02:00
-
6615ecf3a7
feat: releases API — monitor toggle + search-now enqueue
Jonathan
2026-07-11 14:00:49 +02:00
-
f5ceea8fde
fix: narrow artist PATCH/DELETE 404 catch to Prisma P2025 (rethrow real errors)
Jonathan
2026-07-11 13:58:40 +02:00
-
1e39c74b16
feat: artist item API — detail, auto-monitor toggle, unfollow
Jonathan
2026-07-11 13:55:36 +02:00
-
7f0ac68657
feat: artists API — follow (persist discography) + list
Jonathan
2026-07-11 13:51:14 +02:00
-
8e97796bad
feat: MusicBrainz proxy API routes (artist search + discography browse)
Jonathan
2026-07-11 13:45:24 +02:00
-
341da71505
test: type the fetch mock so the MB test typechecks (tsc --noEmit clean)
Jonathan
2026-07-11 13:15:21 +02:00
-
cdcda9e501
feat: read-only MusicBrainz module + monitoring test cleanup
Jonathan
2026-07-11 13:11:11 +02:00
-
eb2a2207a1
docs: add monitoring-web implementation plan (slice 2, plan 2)
Jonathan
2026-07-11 13:08:19 +02:00
-
2273bf86ee
test: pin that an at-cutoff upgrade job short-circuits intake (no candidates)
Jonathan
2026-07-11 12:56:54 +02:00
-
4481f1d998
fix: make intake dedupe cutoff-aware so monitor upgrade path works end-to-end
Jonathan
2026-07-11 12:52:03 +02:00
-
3934a0c45d
feat: import stage upserts to replace lower-quality library items
Jonathan
2026-07-11 12:40:11 +02:00
-
133f6219ae
feat: monitor sweep, real MB browser, and worker-loop wiring
Jonathan
2026-07-11 12:35:07 +02:00
-
1f23aaa0e8
feat: monitor outcome reconcile
Jonathan
2026-07-11 12:29:26 +02:00
-
8f72568d87
feat: monitor retry/enqueue phase
Jonathan
2026-07-11 12:24:39 +02:00
-
7192752d8f
test: genuinely exercise discovery ON CONFLICT dedup + config defaults
Jonathan
2026-07-11 12:22:29 +02:00
-
9a4ce3d5b5
feat: monitor discovery phase + MonitorConfig
Jonathan
2026-07-11 12:16:17 +02:00
-
2ca0f7a385
feat: MbBrowser seam and FakeMbBrowser test double
Jonathan
2026-07-11 12:12:17 +02:00
-
ec85016d88
feat: monitoring data model (WatchedArtist, MonitoredRelease, Request link)
Jonathan
2026-07-11 12:07:09 +02:00
-
915bd96cd3
docs: add monitoring-core implementation plan (slice 2, plan 1)
Jonathan
2026-07-11 12:01:57 +02:00
-
dcddcac86c
docs: add library-manager design (slice 2)
Jonathan
2026-07-11 11:46:41 +02:00
-
c75b9d3562
fix: force IPv4 in worker, count real Qobuz files, flatten nested output
Jonathan
2026-07-11 01:01:23 +02:00
-
00b3dddca6
feat: Qobuz auth-token (user_id + token) login as a reliable alternative to email/password
Jonathan
2026-07-11 00:46:17 +02:00
-
caa0d542ea
fix: MD5-hash Qobuz password and never log credential-bearing login errors
Jonathan
2026-07-11 00:30:34 +02:00
-
f91117092b
refactor: use one album path for tagging and library record
Jonathan
2026-07-11 00:09:42 +02:00
-
1596bab23e
feat: wire the mutagen tagger into the worker loop
Jonathan
2026-07-10 23:59:28 +02:00
-
d1fcfd544f
fix: make album tagging best-effort per file
Jonathan
2026-07-10 23:57:28 +02:00
-
32deac65a6
feat: real mutagen tagger and MusicBrainz tracklist
Jonathan
2026-07-10 23:52:19 +02:00
-
1c02a870f3
feat: Tagger seam and pipeline tag-stage integration
Jonathan
2026-07-10 23:47:20 +02:00
-
2812695465
feat: organized album directory and persistent /music bind-mount
Jonathan
2026-07-10 23:43:15 +02:00
-
6cce95cec6
docs: add tagging, import & persistent library plan (slice 1, plan 4b)
Jonathan
2026-07-10 23:41:46 +02:00
-
fef8cf0681
feat: wire MusicBrainz resolver into the worker loop
Jonathan
2026-07-10 23:27:28 +02:00
-
85c74ba109
feat: add real MusicBrainz resolver and opt-in live test
Jonathan
2026-07-10 23:21:50 +02:00
-
c16e9f1035
feat: MusicBrainz-aware intake and completeness check against canonical track count
Jonathan
2026-07-10 23:17:06 +02:00
-
cf5632aa5f
fix: isolate per-adapter search failures in the pipeline match loop
Jonathan
2026-07-10 23:12:33 +02:00
-
6ea930ec7a
docs: add MusicBrainz intake + search-hardening plan (slice 1, plan 4a)
Jonathan
2026-07-10 23:10:10 +02:00
-
f93d71f78a
test: verify SoulseekAdapter through the pipeline and full ranking order
Jonathan
2026-07-10 22:56:23 +02:00
-
6b09047f64
feat: add Soulseek to the config-aware registry
Jonathan
2026-07-10 22:53:25 +02:00
-
ec1fc568ba
fix: scope slskd download polling to enqueued files and raise on timeout
Jonathan
2026-07-10 22:52:03 +02:00
-
7b4b7ef1aa
feat: add real slskd Soulseek client and opt-in live test
Jonathan
2026-07-10 22:45:36 +02:00
-
b5931a7b66
feat: add SoulseekAdapter with injectable client seam
Jonathan
2026-07-10 22:40:53 +02:00
-
9804f3bb90
docs: add Soulseek adapter plan (slice 1, plan 3d)
Jonathan
2026-07-10 22:39:34 +02:00
-
7510e7718b
test: verify real QobuzAdapter flows through the pipeline and outranks YouTube
Jonathan
2026-07-10 22:16:03 +02:00
-
71143dc15d
feat: config-aware registry gating Qobuz on credentials; wire config into worker
Jonathan
2026-07-10 22:13:11 +02:00
-
085193aa82
fix: run Qobuz login inside try/finally and reuse a single streamrip config
Jonathan
2026-07-10 22:11:25 +02:00
-
707038da64
feat: add real streamrip Qobuz client and opt-in live test
Jonathan
2026-07-10 22:05:36 +02:00
-
0091c4f5e7
feat: add QobuzAdapter with injectable client seam
Jonathan
2026-07-10 21:59:57 +02:00
-
50931c0cf5
docs: add Qobuz adapter plan (slice 1, plan 3c)
Jonathan
2026-07-10 21:58:44 +02:00
-
f3d718d9c0
test: verify real YouTubeAdapter flows through the pipeline
Jonathan
2026-07-10 21:33:05 +02:00
-
4b2b2888ca
feat: wire real YouTube adapter into the registry
Jonathan
2026-07-10 21:29:26 +02:00
-
a93c248aaf
feat: add real yt-dlp client and opt-in live test; ffmpeg in worker image
Jonathan
2026-07-10 21:24:05 +02:00
-
5a3e64b057
feat: add YouTubeAdapter with injectable client seam
Jonathan
2026-07-10 21:19:27 +02:00
-
da1ed5caba
docs: add YouTube adapter plan (slice 1, plan 3b)
Jonathan
2026-07-10 21:18:09 +02:00
-
feaff42010
feat: add worker config reader with secret decryption
Jonathan
2026-07-10 20:07:49 +02:00
-
c90e055343
feat: add worker AES-256-GCM crypto matching the web envelope
Jonathan
2026-07-10 20:03:28 +02:00
-
69a8835c86
feat: add settings page for credentials
Jonathan
2026-07-10 19:58:46 +02:00
-
1b11fa37bd
feat: add config API with encrypted secret storage
Jonathan
2026-07-10 19:54:27 +02:00
-
91ea32c4b8
feat: add web AES-256-GCM secret crypto and LYRA_SECRET_KEY plumbing
Jonathan
2026-07-10 19:50:16 +02:00
-
45cf9e8527
feat: add Config schema
Jonathan
2026-07-10 19:46:17 +02:00
-
349f699bb6
docs: add configuration & secrets plan (slice 1, plan 3a)
Jonathan
2026-07-10 19:45:08 +02:00
-
d3bec2ee10
refactor: make adapter .tier the single source of truth for ranking
Jonathan
2026-07-10 19:07:58 +02:00
-
fbd6a056a4
feat: wire adapter registry into worker loop
Jonathan
2026-07-10 18:59:28 +02:00
-
7c28eddd47
fix: persist all found candidates and guard duplicate adapter names
Jonathan
2026-07-10 18:54:15 +02:00
-
71c7945da2
feat: replace fake pipeline with staged adapter-driven pipeline
Jonathan
2026-07-10 18:45:01 +02:00
-
60f3cd0df9
feat: add Candidate and LibraryItem schema
Jonathan
2026-07-10 18:40:41 +02:00
-
991365e746
feat: add SourceAdapter contract and fake adapters
Jonathan
2026-07-10 18:35:52 +02:00
-
ffc4d1f483
feat: add candidate ranker with confidence gate
Jonathan
2026-07-10 18:31:09 +02:00
-
3888d2ab8a
feat: add confidence scoring
Jonathan
2026-07-10 18:26:52 +02:00
-
1c013dfdd1
feat: add domain types and quality ranking
Jonathan
2026-07-10 18:22:47 +02:00