From 031784556f6e4d21a8ac12ed45e28c3a0d6766bf Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Sun, 10 Jun 2018 13:34:15 +0200
Subject: [PATCH] Fixed #295: broken pagination in Subsonic API

---
 api/funkwhale_api/subsonic/views.py |  8 +++++---
 api/tests/subsonic/test_views.py    | 16 ++++++++++++++++
 changes/changelog.d/295.bugfix      |  1 +
 3 files changed, 22 insertions(+), 3 deletions(-)
 create mode 100644 changes/changelog.d/295.bugfix

diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index 7fb5db0e..bb5f4416 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -208,7 +208,9 @@ class SubsonicViewSet(viewsets.GenericViewSet):
         methods=["get", "post"], url_name="get_album_list2", url_path="getAlbumList2"
     )
     def get_album_list2(self, request, *args, **kwargs):
-        queryset = music_models.Album.objects.with_tracks_count()
+        queryset = music_models.Album.objects.with_tracks_count().order_by(
+            "artist__name"
+        )
         data = request.GET or request.POST
         filterset = filters.AlbumList2FilterSet(data, queryset=queryset)
         queryset = filterset.qs
@@ -223,7 +225,7 @@ class SubsonicViewSet(viewsets.GenericViewSet):
             size = 50
 
         size = min(size, 500)
-        queryset = queryset[offset:size]
+        queryset = queryset[offset : offset + size]
         data = {"albumList2": {"album": serializers.get_album_list2_data(queryset)}}
         return response.Response(data)
 
@@ -283,7 +285,7 @@ class SubsonicViewSet(viewsets.GenericViewSet):
                 queryset = c["queryset"].filter(
                     utils.get_query(query, c["search_fields"])
                 )
-            queryset = queryset[offset:size]
+            queryset = queryset[offset : offset + size]
             payload["searchResult3"][c["subsonic"]] = c["serializer"](queryset)
         return response.Response(payload)
 
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index 1523a2f6..b7431efa 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -217,6 +217,22 @@ def test_get_album_list2(f, db, logged_in_api_client, factories):
     }
 
 
+@pytest.mark.parametrize("f", ["xml", "json"])
+def test_get_album_list2_pagination(f, db, logged_in_api_client, factories):
+    url = reverse("api:subsonic-get-album-list2")
+    assert url.endswith("getAlbumList2") is True
+    album1 = factories["music.Album"]()
+    factories["music.Album"]()
+    response = logged_in_api_client.get(
+        url, {"f": f, "type": "newest", "size": 1, "offset": 1}
+    )
+
+    assert response.status_code == 200
+    assert response.data == {
+        "albumList2": {"album": serializers.get_album_list2_data([album1])}
+    }
+
+
 @pytest.mark.parametrize("f", ["xml", "json"])
 def test_search3(f, db, logged_in_api_client, factories):
     url = reverse("api:subsonic-search3")
diff --git a/changes/changelog.d/295.bugfix b/changes/changelog.d/295.bugfix
new file mode 100644
index 00000000..02ad8f8f
--- /dev/null
+++ b/changes/changelog.d/295.bugfix
@@ -0,0 +1 @@
+Fixed broken pagination in Subsonic API (#295)
-- 
GitLab