diff --git a/funkwhale_api/favorites/tests/test_favorites.py b/funkwhale_api/favorites/tests/test_favorites.py
index 1182222b1a4b9a0dc69cdb82a5a2dea9988df89a..55b09baac78b49197b0b80b46da4b6065e102bde 100644
--- a/funkwhale_api/favorites/tests/test_favorites.py
+++ b/funkwhale_api/favorites/tests/test_favorites.py
@@ -87,3 +87,15 @@ class TestFavorites(TestCase):
             with self.settings(API_AUTHENTICATION_REQUIRED=False):
                 response = getattr(self.client, method)(url)
             self.assertEqual(response.status_code, 200)
+
+    def test_can_filter_tracks_by_favorites(self):
+        favorite = TrackFavorite.add(self.track, self.user)
+
+        url = reverse('api:tracks-list')
+        self.client.login(username=self.user.username, password='test')
+
+        response = self.client.get(url, data={'favorites': True})
+
+        parsed_json = json.loads(response.content.decode('utf-8'))
+        self.assertEqual(parsed_json['count'], 1)
+        self.assertEqual(parsed_json['results'][0]['id'], self.track.id)
diff --git a/funkwhale_api/favorites/views.py b/funkwhale_api/favorites/views.py
index dc8098bba0a7947751adec39ffde8280af7b12b1..33a3e3d62d3c596fcee645b5b3aaec89477160f1 100644
--- a/funkwhale_api/favorites/views.py
+++ b/funkwhale_api/favorites/views.py
@@ -14,10 +14,16 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin,
                            viewsets.GenericViewSet):
 
     serializer_class = serializers.UserTrackFavoriteSerializer
-    queryset = models.TrackFavorite.objects.all()
+    queryset = (models.TrackFavorite.objects.all()
+                      .select_related()
+                      .select_related('track__album__artist')
+                      .prefetch_related(
+                          'track__tags',
+                          'track__files',
+                          'track__artist__albums__tracks__tags',))
     permission_classes = [ConditionalAuthentication]
 
-    
+
     def create(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.data)
         serializer.is_valid(raise_exception=True)
@@ -27,7 +33,7 @@ class TrackFavoriteViewSet(mixins.CreateModelMixin,
         return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 
     def get_queryset(self):
-        return models.TrackFavorite.objects.filter(user=self.request.user).select_related('track__album__artist').prefetch_related('track__tags')
+        return self.queryset.filter(user=self.request.user)
 
     def perform_create(self, serializer):
         track = Track.objects.get(pk=serializer.data['track'])
diff --git a/funkwhale_api/music/views.py b/funkwhale_api/music/views.py
index 8e37c66ab66bd6d5915f7878c98225a15ebf25f6..8a4dfcd6505b28fd9c1e700fff62d748e6b77522 100644
--- a/funkwhale_api/music/views.py
+++ b/funkwhale_api/music/views.py
@@ -80,6 +80,16 @@ class TrackViewSet(TagViewSetMixin, SearchMixin, viewsets.ReadOnlyModelViewSet):
     search_fields = ['title', 'artist__name']
     ordering_fields = ('creation_date',)
 
+    def get_queryset(self):
+        queryset = super().get_queryset()
+        filter_favorites = self.request.GET.get('favorites', None)
+        user = self.request.user
+        if user.is_authenticated() and filter_favorites == 'true':
+            queryset = queryset.filter(track_favorites__user=user)
+
+        return queryset
+
+
 class TagViewSet(viewsets.ReadOnlyModelViewSet):
     queryset = Tag.objects.all()
     serializer_class = serializers.TagSerializer