Skip to content

Instantly share code, notes, and snippets.

@szupie
Created August 19, 2021 05:06
Show Gist options
  • Save szupie/54f070d4af92fe8571b43ed5ac797709 to your computer and use it in GitHub Desktop.
Save szupie/54f070d4af92fe8571b43ed5ac797709 to your computer and use it in GitHub Desktop.
Frecency score dynamic field config for foobar2000
// Low score indicate more frecent plays
// This favours songs that have been played multiple times recently, so that songs you used to love do not stay at the top
// I find this surfaces fresher songs compared to DADA Auto-Rating
// Requires foo_enhanced_playcount for last.fm play history
// Get 10 most recent plays (truncating milliseconds)
$puts(len, $len(%lastfm_played_times_js%))
$puts(play0, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(0, 15)), $sub($get(len), 4, $mul(0, 15))))
$puts(play1, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(1, 15)), $sub($get(len), 4, $mul(1, 15))))
$puts(play2, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(2, 15)), $sub($get(len), 4, $mul(2, 15))))
$puts(play3, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(3, 15)), $sub($get(len), 4, $mul(3, 15))))
$puts(play4, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(4, 15)), $sub($get(len), 4, $mul(4, 15))))
$puts(play5, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(5, 15)), $sub($get(len), 4, $mul(5, 15))))
$puts(play6, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(6, 15)), $sub($get(len), 4, $mul(6, 15))))
$puts(play7, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(7, 15)), $sub($get(len), 4, $mul(7, 15))))
$puts(play8, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(8, 15)), $sub($get(len), 4, $mul(8, 15))))
$puts(play9, $substr(%lastfm_played_times_js%, $sub($get(len), 13, $mul(9, 15)), $sub($get(len), 4, $mul(9, 15))))
// add 8 hour buffer to prevent negative scores
$puts(secSinceEpoch, $add($time_diff('1970-01-01 00:00:00'), $mul(60, 60, 8)))
$puts(secSince0, $sub($get(secSinceEpoch), $get(play0)))
$puts(secSince1, $sub($get(secSinceEpoch), $get(play1)))
$puts(secSince2, $sub($get(secSinceEpoch), $get(play2)))
$puts(secSince3, $sub($get(secSinceEpoch), $get(play3)))
$puts(secSince4, $sub($get(secSinceEpoch), $get(play4)))
$puts(secSince5, $sub($get(secSinceEpoch), $get(play5)))
$puts(secSince6, $sub($get(secSinceEpoch), $get(play6)))
$puts(secSince7, $sub($get(secSinceEpoch), $get(play7)))
$puts(secSince8, $sub($get(secSinceEpoch), $get(play8)))
$puts(secSince9, $sub($get(secSinceEpoch), $get(play9)))
$div(
$add(
$mul(
// interval^2 to punish songs with very old plays
$get(secSince0), $get(secSince0),
// exclude from sum if play record is 0 (multiply by quotient of self)
$div($get(play0), $get(play0))
),
$mul(
$get(secSince1), $get(secSince1),
$div($get(play1), $get(play1))
),
// make most recent plays influence score more by dividing previous plays
$div(
$mul(
$get(secSince2), $get(secSince2),
$div($get(play2), $get(play2))
), 20
),
$div(
$mul(
$get(secSince3), $get(secSince3),
$div($get(play3), $get(play3))
), 30
),
$div(
$mul(
$get(secSince4), $get(secSince4),
$div($get(play4), $get(play4))
), 40
),
$div(
$mul(
$get(secSince5), $get(secSince5),
$div($get(play5), $get(play5))
), 50
),
$div(
$mul(
$get(secSince6), $get(secSince6),
$div($get(play6), $get(play6))
), 60
),
$div(
$mul(
$get(secSince7), $get(secSince7),
$div($get(play7), $get(play7))
), 70
),
$div(
$mul(
$get(secSince8), $get(secSince8),
$div($get(play8), $get(play8))
), 80
),
$div(
$mul(
$get(secSince9), $get(secSince9),
$div($get(play9), $get(play9))
), 90
)
),
// normalise sum by play count so new tracks do not stay at top
// rewards most played tracks (up to 100)
$min(%lastfm_play_count%, 100),
// reduce number for comprehensibility (divide by square of seconds in 2 days. Edit this based on how often you listen to music)
$mul(60, 60, 48, 60, 60, 48)
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment