Browse Source

Fix aggregator and blacken things up

Colin Powell 2 years ago
parent
commit
8b61dab1bc

+ 3 - 0
vrobbler/apps/music/admin.py

@@ -2,6 +2,7 @@ from django.contrib import admin
 
 from music.models import Artist, Album, Track
 
+
 @admin.register(Album)
 class AlbumAdmin(admin.ModelAdmin):
     date_hierarchy = "created"
@@ -9,12 +10,14 @@ class AlbumAdmin(admin.ModelAdmin):
     list_filter = ("year",)
     ordering = ("name",)
 
+
 @admin.register(Artist)
 class ArtistAdmin(admin.ModelAdmin):
     date_hierarchy = "created"
     list_display = ("name", "musicbrainz_id")
     ordering = ("name",)
 
+
 @admin.register(Track)
 class TrackAdmin(admin.ModelAdmin):
     date_hierarchy = "created"

+ 57 - 22
vrobbler/apps/music/aggregators.py

@@ -10,7 +10,9 @@ from datetime import datetime, timedelta
 
 NOW = timezone.now()
 START_OF_TODAY = datetime.combine(NOW.date(), datetime.min.time(), NOW.tzinfo)
-STARTING_DAY_OF_CURRENT_WEEK = NOW.date() - timedelta(days=NOW.today().isoweekday() % 7)
+STARTING_DAY_OF_CURRENT_WEEK = NOW.date() - timedelta(
+    days=NOW.today().isoweekday() % 7
+)
 STARTING_DAY_OF_CURRENT_MONTH = NOW.date().replace(day=1)
 STARTING_DAY_OF_CURRENT_YEAR = NOW.date().replace(month=1, day=1)
 
@@ -18,30 +20,48 @@ STARTING_DAY_OF_CURRENT_YEAR = NOW.date().replace(month=1, day=1)
 def scrobble_counts():
     finished_scrobbles_qs = Scrobble.objects.filter(in_progress=False)
     data = {}
-    data['today'] = finished_scrobbles_qs.filter(timestamp__gte=START_OF_TODAY).count()
-    data['week'] = finished_scrobbles_qs.filter(timestamp__gte=STARTING_DAY_OF_CURRENT_WEEK).count()
-    data['month'] = finished_scrobbles_qs.filter(timestamp__gte=STARTING_DAY_OF_CURRENT_MONTH).count()
-    data['year'] = finished_scrobbles_qs.filter(timestamp__gte=STARTING_DAY_OF_CURRENT_YEAR).count()
+    data['today'] = finished_scrobbles_qs.filter(
+        timestamp__gte=START_OF_TODAY
+    ).count()
+    data['week'] = finished_scrobbles_qs.filter(
+        timestamp__gte=STARTING_DAY_OF_CURRENT_WEEK
+    ).count()
+    data['month'] = finished_scrobbles_qs.filter(
+        timestamp__gte=STARTING_DAY_OF_CURRENT_MONTH
+    ).count()
+    data['year'] = finished_scrobbles_qs.filter(
+        timestamp__gte=STARTING_DAY_OF_CURRENT_YEAR
+    ).count()
     data['alltime'] = finished_scrobbles_qs.count()
     return data
 
-def week_of_scrobbles(media: str='tracks') -> dict[str, int]:
-    scrobble_day_dict= {}
-    media_filter = Q(track__isnull=True)
 
-    for day in range(1,8):
+def week_of_scrobbles(media: str = 'tracks') -> dict[str, int]:
+    scrobble_day_dict = {}
+    media_filter = Q(track__isnull=False)
+
+    for day in range(6, -1, -1):
         start = START_OF_TODAY - timedelta(days=day)
         end = datetime.combine(start, datetime.max.time(), NOW.tzinfo)
         day_of_week = start.strftime('%A')
         if media == 'movies':
             media_filter = Q(video__videotype=Video.VideoType.MOVIE)
         if media == 'series':
-            media_filter = Q(video__videotype=Video.VideoType.MOVIE)
-        scrobble_day_dict[day_of_week] = Scrobble.objects.filter(media_filter).filter(timestamp__lte=START_OF_TODAY, timestamp__gt=end, in_progress=False).count()
+            media_filter = Q(video__videotype=Video.VideoType.TV_EPISODE)
+        scrobble_day_dict[day_of_week] = (
+            Scrobble.objects.filter(media_filter)
+            .filter(
+                timestamp__gte=start,
+                timestamp__lte=end,
+                in_progress=False,
+            )
+            .count()
+        )
 
     return scrobble_day_dict
 
-def top_tracks(filter: str="today", limit: int=15) -> List["Track"]:
+
+def top_tracks(filter: str = "today", limit: int = 15) -> List["Track"]:
     time_filter = Q(scrobble__timestamp__gte=START_OF_TODAY)
     if filter == "week":
         time_filter = Q(scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_WEEK)
@@ -50,21 +70,36 @@ def top_tracks(filter: str="today", limit: int=15) -> List["Track"]:
     if filter == "year":
         time_filter = Q(scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_YEAR)
 
-    return Track.objects.annotate(num_scrobbles=Count("scrobble", distinct=True)).filter(time_filter).order_by("-num_scrobbles")[:limit]
+    return (
+        Track.objects.annotate(num_scrobbles=Count("scrobble", distinct=True))
+        .filter(time_filter)
+        .order_by("-num_scrobbles")[:limit]
+    )
+
 
-def top_artists(filter: str="today", limit: int=15) -> List["Artist"]:
+def top_artists(filter: str = "today", limit: int = 15) -> List["Artist"]:
     time_filter = Q(track__scrobble__timestamp__gte=START_OF_TODAY)
     if filter == "week":
-        time_filter = Q(track__scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_WEEK)
+        time_filter = Q(
+            track__scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_WEEK
+        )
     if filter == "month":
-        time_filter = Q(track__scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_MONTH)
+        time_filter = Q(
+            track__scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_MONTH
+        )
     if filter == "year":
-        time_filter = Q(track__scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_YEAR)
+        time_filter = Q(
+            track__scrobble__timestamp__gte=STARTING_DAY_OF_CURRENT_YEAR
+        )
 
-    return Artist.objects.annotate(num_scrobbles=Sum("track__scrobble", distinct=True)).filter(time_filter).order_by("-num_scrobbles")[:limit]
-
-def artist_scrobble_count(artist_id: int, filter: str = "today") -> int:
     return (
-        Scrobble.objects.filter(track__artist=artist_id)
-        .count()
+        Artist.objects.annotate(
+            num_scrobbles=Sum("track__scrobble", distinct=True)
+        )
+        .filter(time_filter)
+        .order_by("-num_scrobbles")[:limit]
     )
+
+
+def artist_scrobble_count(artist_id: int, filter: str = "today") -> int:
+    return Scrobble.objects.filter(track__artist=artist_id).count()

+ 11 - 5
vrobbler/apps/scrobbles/views.py

@@ -21,7 +21,11 @@ from scrobbles.models import Scrobble
 from scrobbles.serializers import ScrobbleSerializer
 from scrobbles.utils import convert_to_seconds
 from videos.models import Video
-from vrobbler.apps.music.aggregators import scrobble_counts, top_tracks, week_of_scrobbles
+from vrobbler.apps.music.aggregators import (
+    scrobble_counts,
+    top_tracks,
+    week_of_scrobbles,
+)
 
 logger = logging.getLogger(__name__)
 
@@ -52,7 +56,9 @@ class RecentScrobbleList(ListView):
             timestamp__gte=last_eight_minutes,
             timestamp__lte=now,
         )
-        data['video_scrobble_list'] = Scrobble.objects.filter(video__isnull=False, in_progress=False).order_by('-timestamp')[:10]
+        data['video_scrobble_list'] = Scrobble.objects.filter(
+            video__isnull=False, in_progress=False
+        ).order_by('-timestamp')[:10]
         data['top_daily_tracks'] = top_tracks()
         data['top_weekly_tracks'] = top_tracks(filter='week')
         data['top_monthly_tracks'] = top_tracks(filter='month')
@@ -61,9 +67,9 @@ class RecentScrobbleList(ListView):
         return data
 
     def get_queryset(self):
-        return Scrobble.objects.filter(track__isnull=False, in_progress=False).order_by(
-            '-timestamp'
-        )[:25]
+        return Scrobble.objects.filter(
+            track__isnull=False, in_progress=False
+        ).order_by('-timestamp')[:25]
 
 
 @csrf_exempt

+ 3 - 0
vrobbler/cli.py

@@ -6,15 +6,18 @@ from os import environ as env
 
 if not 'DJANGO_SETTINGS_MODULE' in env:
     from vrobbler import settings
+
     env.setdefault('DJANGO_SETTINGS_MODULE', settings.__name__)
 
 
 import django
+
 django.setup()
 
 # this line must be after django.setup() for logging configure
 logger = logging.getLogger('vrobbler')
 
+
 def main():
     # to get configured settings
     from django.conf import settings