Skip to content
Snippets Groups Projects
Commit db807101 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Merge branch '936-subsonic-fromYear' into 'master'

Resolve "Implement fromYear/toYear in Subsonic API"

See merge request !924
parents 518fb73a b1e8d4ca
No related branches found
No related tags found
No related merge requests found
"""
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): ...@@ -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): ...@@ -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",
......
Support byYear filtering in Subsonic API (#936)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment