feat: unlisted tracks — exclude from discovery feeds (#1267)
Adds an `unlisted` boolean to Track (default false) that lets artists
opt specific tracks out of the latest, top, and for-you feeds while
keeping them accessible everywhere else (direct link, artist profile,
albums, playlists, search).
Backend:
- migration: add `unlisted` column (boolean, NOT NULL, DEFAULT false)
- list_tracks (GET /tracks/): filter unlisted on the discovery feed
(no artist_did param). artist profile pages (has artist_did) show all
tracks including unlisted
- list_top_tracks (GET /tracks/top): exclude unlisted
- get_for_you_feed (GET /for-you/): exclude unlisted from candidate
pool at the artist-did lookup step
- upload_track (POST /tracks/): new `unlisted` form field
- update_track_metadata (PATCH /tracks/{id}): new `unlisted` form field
- TrackResponse schema: includes `unlisted` in the response
Frontend:
- types.ts: Track type includes `unlisted?: boolean`
- uploader.svelte.ts: accepts `unlisted` param, appends to FormData
- upload page: checkbox "unlisted — won't appear in feeds" with hint
- portal track editor: same checkbox, pre-filled from track state
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
authored by