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/
This commit is contained in:
2026-07-23 21:45:50 -04:00
parent 408475f159
commit d08aedbe2a
2 changed files with 31 additions and 0 deletions

View File

@ -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",
]

View File

@ -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)