diff --git a/api/funkwhale_api/common/fields.py b/api/funkwhale_api/common/fields.py index 1a18b5f27..98e971662 100644 --- a/api/funkwhale_api/common/fields.py +++ b/api/funkwhale_api/common/fields.py @@ -1,5 +1,9 @@ +import django_filters + from django.db import models +from funkwhale_api.music import utils + PRIVACY_LEVEL_CHOICES = [ ('me', 'Only me'), @@ -25,3 +29,15 @@ def privacy_level_query(user, lookup_field='privacy_level'): 'followers', 'instance', 'everyone' ] }) + + +class SearchFilter(django_filters.CharFilter): + def __init__(self, *args, **kwargs): + self.search_fields = kwargs.pop('search_fields') + super().__init__(*args, **kwargs) + + def filter(self, qs, value): + if not value: + return qs + query = utils.get_query(value, self.search_fields) + return qs.filter(query) diff --git a/api/funkwhale_api/federation/filters.py b/api/funkwhale_api/federation/filters.py index 8166fe64d..12cab7f89 100644 --- a/api/funkwhale_api/federation/filters.py +++ b/api/funkwhale_api/federation/filters.py @@ -1,5 +1,7 @@ import django_filters +from funkwhale_api.common import fields + from . import models @@ -19,6 +21,12 @@ class LibraryFilter(django_filters.FilterSet): class LibraryTrackFilter(django_filters.FilterSet): library = django_filters.CharFilter('library__uuid') + q = fields.SearchFilter(search_fields=[ + 'artist_name', + 'title', + 'album_title', + 'library__actor__domain', + ]) class Meta: model = models.LibraryTrack