Ability to disable/enable replay variance.

This commit is contained in:
Josh Washburne 2020-04-11 18:43:05 -04:00
parent 9b2da555d1
commit b73f3b5bb8
2 changed files with 24 additions and 11 deletions

View file

@ -96,6 +96,15 @@ class ReplayRatio(FloatPreference):
raise ValidationError('Must be between 0.0 and 1.0, inclusive.') raise ValidationError('Must be between 0.0 and 1.0, inclusive.')
@global_preferences_registry.register
class VarianceEnabled(BooleanPreference):
section = replay
name = 'variance_enabled'
help_text = 'Enable variance to replay time based on user ratings.'
default = False
required = False
@global_preferences_registry.register @global_preferences_registry.register
class MinRatingsForVariance(IntegerPreference): class MinRatingsForVariance(IntegerPreference):
section = replay section = replay

View file

@ -246,6 +246,20 @@ class Song(Disableable, Publishable, Timestampable, models.Model):
return None return None
average_rating = property(_average_rating) average_rating = property(_average_rating)
def get_adjusted_ratio(self):
'''
Return a change to the replay ratio based on various factors.
'''
if radio_settings['replay__variance_enabled']:
min_ratings = radio_settings['replay__min_ratings_for_variance']
if self.rating_set.count() >= min_ratings:
ratio = radio_settings['replay__rating_variance_ratio']
# -((average - 1)/(highest_rating - 1)) * ratio
base = -((self._average_rating() - 1) / 4) * ratio
return float(base + (ratio * 0.5))
return float(0.0)
def get_time_until_requestable(self): def get_time_until_requestable(self):
''' '''
Length of time before a song can be requested again. Length of time before a song can be requested again.
@ -267,17 +281,7 @@ class Song(Disableable, Publishable, Timestampable, models.Model):
if self._is_song() and self._is_available(): if self._is_song() and self._is_available():
if last: if last:
# Check if we have enough ratings to change ratio adjusted_ratio = self.get_adjusted_ratio()
min_rate = radio_settings['replay__min_ratings_for_variance']
if self.rating_set.count() >= min_rate:
ratio = radio_settings['replay__rating_variance_ratio']
# -((average - 1)/(highest_rating - 1)) * ratio
base = -((self._average_rating() - 1) / 4) * ratio
adjusted_ratio = float(base + (ratio * 0.5))
else:
adjusted_ratio = float(0.0)
return last + Song.music.wait_total(adjusted_ratio) return last + Song.music.wait_total(adjusted_ratio)
return timezone.now() return timezone.now()
return None return None