diff --git a/api/funkwhale_api/subsonic/serializers.py b/api/funkwhale_api/subsonic/serializers.py index 35b17864153e57d0d22a521d3dbe74a24e0a1b39..023e40cac29a89168e497977543f5995dece73b5 100644 --- a/api/funkwhale_api/subsonic/serializers.py +++ b/api/funkwhale_api/subsonic/serializers.py @@ -226,6 +226,30 @@ def get_music_directory_data(artist): return data +def get_folders(user): + return [] + + +def get_user_detail_data(user): + return { + "username": user.username, + "email": user.email, + "scrobblingEnabled": "true", + "adminRole": "false", + "settingsRole": "false", + "commentRole": "false", + "podcastRole": "false", + "coverArtRole": "false", + "shareRole": "false", + "uploadRole": "true", + "downloadRole": "true", + "playlistRole": "true", + "streamRole": "true", + "jukeboxRole": "true", + "folder": [f["id"] for f in get_folders(user)], + } + + class ScrobbleSerializer(serializers.Serializer): submission = serializers.BooleanField(default=True, required=False) id = serializers.PrimaryKeyRelatedField( diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index 2014c69da9c8cc58acc296ced447acbdcee3378b..8c4f26ddea938e47e91bc778bfd4bdc1a1208e81 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -444,6 +444,17 @@ class SubsonicViewSet(viewsets.GenericViewSet): r[file_header] = path return r + @list_route(methods=["get", "post"], url_name="get_user", url_path="getUser") + @find_object( + queryset=lambda request: users_models.User.objects.filter(pk=request.user.pk), + model_field="username__iexact", + field="username", + cast=str, + ) + def get_user(self, request, *args, **kwargs): + data = {"user": serializers.get_user_detail_data(request.user)} + return response.Response(data) + @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 82918b631f6cc21ea0c46c06e2031477c52a9f61..9161888e2e397e6f02c608bfeb4c1f56578afcdb 100644 --- a/api/tests/subsonic/test_views.py +++ b/api/tests/subsonic/test_views.py @@ -481,3 +481,34 @@ def test_scrobble(factories, logged_in_api_client): listening = logged_in_api_client.user.listenings.latest("id") assert listening.track == track + + +@pytest.mark.parametrize("f", ["json"]) +def test_get_user(f, db, logged_in_api_client, factories): + url = reverse("api:subsonic-get-user") + assert url.endswith("getUser") is True + response = logged_in_api_client.get( + url, {"f": f, "username": logged_in_api_client.user.username} + ) + assert response.status_code == 200 + assert response.data == { + "user": { + "username": logged_in_api_client.user.username, + "email": logged_in_api_client.user.email, + "scrobblingEnabled": "true", + "adminRole": "false", + "downloadRole": "true", + "uploadRole": "true", + "settingsRole": "false", + "playlistRole": "true", + "commentRole": "false", + "podcastRole": "false", + "streamRole": "true", + "jukeboxRole": "true", + "coverArtRole": "false", + "shareRole": "false", + "folder": [ + f["id"] for f in serializers.get_folders(logged_in_api_client.user) + ], + } + }