From 7207ca385ef09cfd50c13ced2399492871a5411e Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Fri, 6 Jun 2025 09:48:15 -0400 Subject: [PATCH] [scrobbles] Add two new methods to Scrobble model --- vrobbler/apps/scrobbles/models.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/vrobbler/apps/scrobbles/models.py b/vrobbler/apps/scrobbles/models.py index 50b99e4..b5adee3 100644 --- a/vrobbler/apps/scrobbles/models.py +++ b/vrobbler/apps/scrobbles/models.py @@ -844,6 +844,12 @@ class Scrobble(TimeStampedModel): def is_long_play(self) -> bool: return self.media_obj.__class__.__name__ in LONG_PLAY_MEDIA.values() + @property + def elapsed_time(self) -> int | None: + if self.played_to_completion: + return self.playback_position_seconds + return (timezone.now() - self.timestamp).seconds + @property def percent_played(self) -> int: if not self.media_obj: @@ -857,7 +863,7 @@ class Scrobble(TimeStampedModel): playback_seconds = self.playback_position_seconds if not playback_seconds: - playback_seconds = (timezone.now() - self.timestamp).seconds + playback_seconds = self.elapsed_time run_time_secs = self.media_obj.run_time_seconds percent = int((playback_seconds / run_time_secs) * 100) @@ -973,6 +979,16 @@ class Scrobble(TimeStampedModel): ) return True + @classmethod + def by_date(cls, media_type: str = "Track"): + cls.objects.filter(media_type=media_type).values( + "timestamp__date" + ).annotate(count=models.Count("id")).values( + "timestamp__date", "count" + ).order_by( + "-count", + ) + @property def media_obj(self): media_obj = None