Merge branch '936-subsonic-fromYear' into 'master'
Resolve "Implement fromYear/toYear in Subsonic API" See merge request funkwhale/funkwhale!924
This commit is contained in:
commit
db80710160
|
@ -1,3 +1,6 @@
|
||||||
|
"""
|
||||||
|
Documentation of Subsonic API can be found at http://www.subsonic.org/pages/api.jsp
|
||||||
|
"""
|
||||||
import datetime
|
import datetime
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
|
@ -427,7 +430,34 @@ class SubsonicViewSet(viewsets.GenericViewSet):
|
||||||
Q(tagged_items__tag__name=genre)
|
Q(tagged_items__tag__name=genre)
|
||||||
| Q(artist__tagged_items__tag__name=genre)
|
| Q(artist__tagged_items__tag__name=genre)
|
||||||
)
|
)
|
||||||
|
elif type == "byYear":
|
||||||
|
try:
|
||||||
|
boundaries = [
|
||||||
|
int(data.get("fromYear", 0)),
|
||||||
|
int(data.get("toYear", 99999999)),
|
||||||
|
]
|
||||||
|
|
||||||
|
except (TypeError, ValueError):
|
||||||
|
return response.Response(
|
||||||
|
{
|
||||||
|
"error": {
|
||||||
|
"code": 10,
|
||||||
|
"message": "Invalid fromYear or toYear parameter",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# because, yeah, the specification explicitly state that fromYear can be greater
|
||||||
|
# than toYear, to indicate reverse ordering…
|
||||||
|
# http://www.subsonic.org/pages/api.jsp#getAlbumList2
|
||||||
|
from_year = min(boundaries)
|
||||||
|
to_year = max(boundaries)
|
||||||
|
queryset = queryset.filter(
|
||||||
|
release_date__year__gte=from_year, release_date__year__lte=to_year
|
||||||
|
)
|
||||||
|
if boundaries[0] <= boundaries[1]:
|
||||||
|
queryset = queryset.order_by("release_date")
|
||||||
|
else:
|
||||||
|
queryset = queryset.order_by("-release_date")
|
||||||
try:
|
try:
|
||||||
offset = int(data["offset"])
|
offset = int(data["offset"])
|
||||||
except (TypeError, KeyError, ValueError):
|
except (TypeError, KeyError, ValueError):
|
||||||
|
|
|
@ -469,6 +469,35 @@ def test_get_album_list2_by_genre(f, db, logged_in_api_client, factories):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"params, expected",
|
||||||
|
[
|
||||||
|
({"type": "byYear", "fromYear": 1902, "toYear": 1903}, [2, 3]),
|
||||||
|
# Because why not, it's supported in Subsonic API…
|
||||||
|
# http://www.subsonic.org/pages/api.jsp#getAlbumList2
|
||||||
|
({"type": "byYear", "fromYear": 1903, "toYear": 1902}, [3, 2]),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_get_album_list2_by_year(params, expected, db, logged_in_api_client, factories):
|
||||||
|
albums = [
|
||||||
|
factories["music.Album"](
|
||||||
|
playable=True, release_date=datetime.date(1900 + i, 1, 1)
|
||||||
|
)
|
||||||
|
for i in range(5)
|
||||||
|
]
|
||||||
|
url = reverse("api:subsonic-get_album_list2")
|
||||||
|
base_params = {"f": "json"}
|
||||||
|
base_params.update(params)
|
||||||
|
response = logged_in_api_client.get(url, base_params)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.data == {
|
||||||
|
"albumList2": {
|
||||||
|
"album": serializers.get_album_list2_data([albums[i] for i in expected])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("f", ["json"])
|
@pytest.mark.parametrize("f", ["json"])
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"tags_field",
|
"tags_field",
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Support byYear filtering in Subsonic API (#936)
|
Loading…
Reference in New Issue