From 8b61dab1bc19c75de1486f88f4a35134d5e461c8 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Tue, 10 Jan 2023 15:16:52 -0500 Subject: [PATCH] Fix aggregator and blacken things up --- vrobbler/apps/music/admin.py | 3 ++ vrobbler/apps/music/aggregators.py | 79 +++++++++++++++++++++--------- vrobbler/apps/scrobbles/views.py | 16 ++++-- vrobbler/cli.py | 3 ++ 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/vrobbler/apps/music/admin.py b/vrobbler/apps/music/admin.py index 4e69688..e67cff1 100644 --- a/vrobbler/apps/music/admin.py +++ b/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" diff --git a/vrobbler/apps/music/aggregators.py b/vrobbler/apps/music/aggregators.py index cce0ae7..09f17be 100644 --- a/vrobbler/apps/music/aggregators.py +++ b/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] + ) - 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() - ) + return Scrobble.objects.filter(track__artist=artist_id).count() diff --git a/vrobbler/apps/scrobbles/views.py b/vrobbler/apps/scrobbles/views.py index 15224ad..a5e8dcb 100644 --- a/vrobbler/apps/scrobbles/views.py +++ b/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 diff --git a/vrobbler/cli.py b/vrobbler/cli.py index 3addf6e..15af6ea 100644 --- a/vrobbler/cli.py +++ b/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