From d08aedbe2a8b9e7ee6db1a23d205d63cc6f7f428 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Thu, 23 Jul 2026 21:45:50 -0400 Subject: [PATCH] Add filters to scrobble API endpoint Add django-filter support to the ScrobbleViewSet with filters for: - in_progress: boolean filter for active scrobbles - visibility: enum filter (public/shared/private) - media_type: enum filter for all 25 media types - source: text search filter (icontains) - played_to_completion: boolean filter - timestamp_after/before: datetime range filters Changes: - Create scrobbles/api/filters.py with ScrobbleFilter class - Add filterset_class to ScrobbleViewSet - Filters appear in OpenAPI schema at /api/v1/scrobbles/ --- vrobbler/apps/scrobbles/api/filters.py | 29 ++++++++++++++++++++++++++ vrobbler/apps/scrobbles/api/views.py | 2 ++ 2 files changed, 31 insertions(+) create mode 100644 vrobbler/apps/scrobbles/api/filters.py diff --git a/vrobbler/apps/scrobbles/api/filters.py b/vrobbler/apps/scrobbles/api/filters.py new file mode 100644 index 0000000..5ec3ff6 --- /dev/null +++ b/vrobbler/apps/scrobbles/api/filters.py @@ -0,0 +1,29 @@ +import django_filters +from scrobbles.constants import Visibility +from scrobbles.models import Scrobble + + +class ScrobbleFilter(django_filters.FilterSet): + media_type = django_filters.ChoiceFilter(choices=Scrobble.MediaType.choices) + visibility = django_filters.ChoiceFilter(choices=Visibility.choices) + in_progress = django_filters.BooleanFilter() + played_to_completion = django_filters.BooleanFilter() + source = django_filters.CharFilter(lookup_expr="icontains") + timestamp_after = django_filters.DateTimeFilter( + field_name="timestamp", lookup_expr="gte" + ) + timestamp_before = django_filters.DateTimeFilter( + field_name="timestamp", lookup_expr="lte" + ) + + class Meta: + model = Scrobble + fields = [ + "media_type", + "visibility", + "in_progress", + "played_to_completion", + "source", + "timestamp_after", + "timestamp_before", + ] diff --git a/vrobbler/apps/scrobbles/api/views.py b/vrobbler/apps/scrobbles/api/views.py index 575fba1..e11cd57 100644 --- a/vrobbler/apps/scrobbles/api/views.py +++ b/vrobbler/apps/scrobbles/api/views.py @@ -3,6 +3,7 @@ from logging import getLogger from rest_framework import permissions, viewsets from rest_framework.decorators import action from rest_framework.response import Response +from scrobbles.api.filters import ScrobbleFilter from scrobbles.api.serializers import ( AudioScrobblerTSVImportSerializer, KoReaderImportSerializer, @@ -23,6 +24,7 @@ class ScrobbleViewSet(viewsets.ModelViewSet): queryset = Scrobble.objects.all().order_by("-timestamp") serializer_class = ScrobbleSerializer permission_classes = [permissions.IsAuthenticated] + filterset_class = ScrobbleFilter def get_queryset(self): return super().get_queryset().filter(user=self.request.user)