Repository navigation
Personal discovery, stage 1: sets and feed (MAD-815..819) - #65
Merged
Merged
Conversation
Seed sets of hand-picked artists, each its own feed of music you don't have yet (ADR 0017). The feed walks the music graph out from the seeds, ranks artists near several seeds first, and leaves out what's on your own Navidrome links, what you turned down, and artists you blocked. The library index lists each Navidrome link with search3, keeps it in memory and SQLite, and rebuilds daily or on demand, skipping libraries that haven't been scanned since. Deezer previews are fetched fresh and proxied with byte ranges, so the browser never talks to Deezer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Discover tab in the app shell, for members: make sets of artists you love, add any artist by searching, tune how far the feed explores, and scroll a feed of songs you don't have, each saying which seeds it's near. Play a 30-second preview here only (the room's playback and Media Session are left alone), open the whole song on YouTube, thumb it, or say an artist isn't for you. Artist pages can add the artist to a set. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 12 (MAD-814), stage 1: seed sets and a feed of music you don't have yet. See ADR 0017.
What's in it
discovery_sets,discovery_set_artists,discovery_feedback,discovery_blocksandwant_items, pluslibrary_indexesanddeezer_songs. Every query is scoped to its user. Includes store tests.internal/library). Uses a new optionalprovider.Cataloger, which Navidrome implements withsearch3, an empty query and 500 songs a page. The index lives in memory and in SQLite and is rebuilt daily or on demand. A rebuild is skipped whilegetScanStatus.lastScanhasn't changed. It answersHas,HasReleaseandKnowsArtist, matching by ISRC or MBID first, then by normalized artist and title (live takes count as different songs). A test builds a 60k-song index from a fake Subsonic server and checks that lookups take under 1ms.internal/discover). Walks the music graph out from a set's seeds. Artists near several seeds rank higher. A second hop happens at explore 35 or more, and the seeds' own songs are included as deep cuts. Deezer rank and fan counts are blended in, and a high explore leans toward less-known artists. Pages hold 20 songs: the seeds take turns, and no artist gets more than 2 songs a page. Each song carriesbecause. A build is capped at 15s and kept for 10 minutes. What you own, thumbed down or blocked is filtered again on every page served, so a thumbs-down takes effect at once.dzTracknow parses the preview, album and cover. Top songs keep their Deezer ID.GET /me/discover/preview/{id}gets a fresh signed URL each time and proxies it with byte ranges, accepting audio only from Deezer's CDN. Covers come through/me/discover/images/..., so the browser never talks to Deezer. Songs with no Deezer ID are looked up once, and misses are cached too.forbidden.Notes
dj.walk, which is built around a room's members and what they've heard. This one starts from seeds and swaps "playable on your links" for "not in your library". The ADR explains why.newMusicGraphnow also returns the Deezer source, so previews share its rate limiter.Testing
go test -race ./...andgolangci-lint runboth pass.pnpm typecheck,lintandtestpass.🤖 Generated with Claude Code