Created
August 19, 2021 05:06
-
-
Save szupie/54f070d4af92fe8571b43ed5ac797709 to your computer and use it in GitHub Desktop.
Frecency score dynamic field config for foobar2000
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
// 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