diff --git a/shanty-playlist/src/scoring.rs b/shanty-playlist/src/scoring.rs index 908aee1..41aa5e8 100644 --- a/shanty-playlist/src/scoring.rs +++ b/shanty-playlist/src/scoring.rs @@ -197,6 +197,9 @@ pub fn score_tracks( } } + // Apply to ALL tracks: popular ones get boosted, unknown ones get reduced. + // Factor range: unknown tracks get `1 - gp_strength` (minimum 0.01), + // top global track gets 1.0 + gp_strength (up to 2.0 at max setting). for t in &mut result { let playcount = t .title @@ -204,12 +207,15 @@ pub fn score_tracks( .and_then(|title| global_playcounts.get(&title.to_lowercase()).copied()) .unwrap_or(0); - if playcount > 0 { - let global_pop = (playcount as f64 / global_max as f64).powf(gp_exponent); - // lerp(1.0, global_pop, gp_strength) - let factor = 1.0 + gp_strength * (global_pop - 1.0); - t.score *= factor; - } + let global_pop = if playcount > 0 { + (playcount as f64 / global_max as f64).powf(gp_exponent) + } else { + 0.0 + }; + // Map global_pop [0, 1] to a factor centered around 1.0: + // global_pop=0 → 1.0 - gp_strength, global_pop=1 → 1.0 + gp_strength + let factor = (1.0 + gp_strength * (2.0 * global_pop - 1.0)).max(0.01); + t.score *= factor; } }