From daf2e4b86316b81c3e92c856b9abbe1f4ccce261 Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Fri, 26 Oct 2018 15:31:33 +0200 Subject: [PATCH] See #272: subsonic support for transcoding --- api/funkwhale_api/subsonic/views.py | 7 ++++++- api/tests/subsonic/test_views.py | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index b8cf4b4b..343d8788 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -193,12 +193,17 @@ class SubsonicViewSet(viewsets.GenericViewSet): @list_route(methods=["get", "post"], url_name="stream", url_path="stream") @find_object(music_models.Track.objects.all(), filter_playable=True) def stream(self, request, *args, **kwargs): + data = request.GET or request.POST track = kwargs.pop("obj") queryset = track.uploads.select_related("track__album__artist", "track__artist") upload = queryset.first() if not upload: return response.Response(status=404) - return music_views.handle_serve(upload=upload, user=request.user) + + format = data.get('format', 'raw') + if format == 'raw': + format = None + return music_views.handle_serve(upload=upload, user=request.user, format=format) @list_route(methods=["get", "post"], url_name="star", url_path="star") @find_object(music_models.Track.objects.all()) diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py index 7cf5e8f1..d2269ba5 100644 --- a/api/tests/subsonic/test_views.py +++ b/api/tests/subsonic/test_views.py @@ -4,9 +4,9 @@ import json import pytest from django.urls import reverse from django.utils import timezone +from rest_framework.response import Response import funkwhale_api - from funkwhale_api.music import models as music_models from funkwhale_api.music import views as music_views from funkwhale_api.subsonic import renderers, serializers @@ -199,11 +199,24 @@ def test_stream(f, db, logged_in_api_client, factories, mocker, queryset_equal_q playable_by = mocker.spy(music_models.TrackQuerySet, "playable_by") response = logged_in_api_client.get(url, {"f": f, "id": upload.track.pk}) - mocked_serve.assert_called_once_with(upload=upload, user=logged_in_api_client.user) + mocked_serve.assert_called_once_with( + upload=upload, user=logged_in_api_client.user, format=None + ) assert response.status_code == 200 playable_by.assert_called_once_with(music_models.Track.objects.all(), None) +@pytest.mark.parametrize("format,expected", [("mp3", 'mp3'), ("raw", None)]) +def test_stream_format(format, expected, logged_in_api_client, factories, mocker): + url = reverse("api:subsonic-stream") + mocked_serve = mocker.patch.object(music_views, "handle_serve", return_value=Response()) + upload = factories["music.Upload"](playable=True) + response = logged_in_api_client.get(url, {"id": upload.track.pk, "format": format}) + + mocked_serve.assert_called_once_with(upload=upload, user=logged_in_api_client.user, format=expected) + assert response.status_code == 200 + + @pytest.mark.parametrize("f", ["xml", "json"]) def test_star(f, db, logged_in_api_client, factories): url = reverse("api:subsonic-star") -- GitLab