From d3e411fa9720c6c2892b29eda06b6025e3597480 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Sun, 21 Oct 2018 18:42:59 +0200 Subject: [PATCH] See #574: Implemented getAvatar view --- api/funkwhale_api/subsonic/views.py | 18 ++++++++++++++++++ api/tests/subsonic/test_views.py | 13 +++++++++++++ 2 files changed, 31 insertions(+) diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index 7ca9b13a8..2014c69da 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -15,6 +15,7 @@ from funkwhale_api.music import models as music_models from funkwhale_api.music import utils from funkwhale_api.music import views as music_views from funkwhale_api.playlists import models as playlists_models +from funkwhale_api.users import models as users_models from . import authentication, filters, negotiation, serializers @@ -426,6 +427,23 @@ class SubsonicViewSet(viewsets.GenericViewSet): data = {"playlist": serializers.get_playlist_detail_data(playlist)} return response.Response(data) + @list_route(methods=["get", "post"], url_name="get_avatar", url_path="getAvatar") + @find_object( + queryset=users_models.User.objects.exclude(avatar=None).exclude(avatar=""), + model_field="username__iexact", + field="username", + cast=str, + ) + def get_avatar(self, request, *args, **kwargs): + user = kwargs.pop("obj") + mapping = {"nginx": "X-Accel-Redirect", "apache2": "X-Sendfile"} + path = music_views.get_file_path(user.avatar) + file_header = mapping[settings.REVERSE_PROXY_TYPE] + # let the proxy set the content-type + r = response.Response({}, content_type="") + r[file_header] = path + return r + @list_route( methods=["get", "post"], url_name="get_music_folders", diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py index f856146ec..82918b631 100644 --- a/api/tests/subsonic/test_views.py +++ b/api/tests/subsonic/test_views.py @@ -457,6 +457,19 @@ def test_get_cover_art_album(factories, logged_in_api_client): ).decode("utf-8") +def test_get_avatar(factories, logged_in_api_client): + user = factories["users.User"]() + url = reverse("api:subsonic-get-avatar") + assert url.endswith("getAvatar") is True + response = logged_in_api_client.get(url, {"username": user.username}) + + assert response.status_code == 200 + assert response["Content-Type"] == "" + assert response["X-Accel-Redirect"] == music_views.get_file_path( + user.avatar + ).decode("utf-8") + + def test_scrobble(factories, logged_in_api_client): upload = factories["music.Upload"]() track = upload.track