diff --git a/internal/playlists/system.go b/internal/playlists/system.go index 63c1f800..7bb03c20 100644 --- a/internal/playlists/system.go +++ b/internal/playlists/system.go @@ -151,14 +151,22 @@ var systemMixWeights = recommendation.ScoringWeights{ // forYouHeadN is the number of top-scored tracks that anchor the For-You // playlist; forYouTailN is the number sampled from positions 2*headN -// onward, daily-deterministic via tieBreakHash. The 12 + 13 split +// onward, daily-deterministic via tieBreakHash. The 50 + 50 split // (~50% from the tail) gives the user a substantially different mix // day-to-day while preserving a recognizable anchor of strong -// similarity matches. Songs-like-X keeps simple pickTopN (the +// similarity matches. +// +// Sized to 100 to match Discover so the shuffle-on-play default +// (system playlists shuffle when launched from a tile) has a deep +// enough pool that re-plays within a day feel varied. Libraries with +// a thin For-You candidate pool degrade gracefully: pickHeadAndTail +// returns top-N-by-score when the capped pool can't support a full +// head/tail split, exactly as Discover returns fewer than 100 when +// its buckets are thin. Songs-like-X keeps simple pickTopN (the // seed-artist context already frames the "you'll like this" promise). const ( - forYouHeadN = 12 - forYouTailN = 13 + forYouHeadN = 50 + forYouTailN = 50 ) // scoreAndSortCandidates scores every candidate with recommendation.Score