From bf8f1e41b98b4a7f818b86f0809227e071d40443 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Wed, 3 Jan 2024 09:50:19 +0100 Subject: [PATCH] OpenSubsonic: MBID for artist results, added mediaType field Part-of: --- api/funkwhale_api/subsonic/serializers.py | 5 ++++- api/funkwhale_api/subsonic/views.py | 2 +- api/tests/subsonic/test_serializers.py | 5 +++++ api/tests/subsonic/test_views.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/api/funkwhale_api/subsonic/serializers.py b/api/funkwhale_api/subsonic/serializers.py index 65cb2db47..7f54e44ec 100644 --- a/api/funkwhale_api/subsonic/serializers.py +++ b/api/funkwhale_api/subsonic/serializers.py @@ -50,6 +50,7 @@ def get_artist_data(artist_values): "name": artist_values["name"], "albumCount": artist_values["_albums_count"], "coverArt": "ar-{}".format(artist_values["id"]), + "musicBrainzId": str(artist_values.get("mbid", "")), } @@ -58,7 +59,7 @@ class GetArtistsSerializer(serializers.Serializer): payload = {"ignoredArticles": "", "index": []} queryset = queryset.with_albums_count() queryset = queryset.order_by(functions.Lower("name")) - values = queryset.values("id", "_albums_count", "name") + values = queryset.values("id", "_albums_count", "name", "mbid") first_letter_mapping = collections.defaultdict(list) for artist in values: @@ -126,6 +127,7 @@ def get_track_data(album, track, upload): "albumId": album.pk if album else "", "artistId": album.artist.pk if album else track.artist.pk, "type": "music", + "mediaType": "song", "musicBrainzId": str(track.mbid or ""), } if album and album.attachment_cover_id: @@ -150,6 +152,7 @@ def get_album2_data(album): "created": to_subsonic_date(album.creation_date), "duration": album.duration, "playCount": album.tracks.aggregate(l=Count("listenings"))["l"] or 0, + "mediaType": "album", "musicBrainzId": str(album.mbid or ""), } if album.attachment_cover_id: diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py index 55a037009..3140bb49e 100644 --- a/api/funkwhale_api/subsonic/views.py +++ b/api/funkwhale_api/subsonic/views.py @@ -550,7 +550,7 @@ class SubsonicViewSet(viewsets.GenericViewSet): "search_fields": ["name"], "queryset": ( music_models.Artist.objects.with_albums_count().values( - "id", "_albums_count", "name" + "id", "_albums_count", "name", "mbid" ) ), "serializer": lambda qs: [serializers.get_artist_data(a) for a in qs], diff --git a/api/tests/subsonic/test_serializers.py b/api/tests/subsonic/test_serializers.py index ae5999f64..8e526934f 100644 --- a/api/tests/subsonic/test_serializers.py +++ b/api/tests/subsonic/test_serializers.py @@ -90,12 +90,14 @@ def test_get_artists_serializer(factories): "name": artist1.name, "albumCount": 3, "coverArt": f"ar-{artist1.id}", + "musicBrainzId": artist1.mbid, }, { "id": artist2.pk, "name": artist2.name, "albumCount": 2, "coverArt": f"ar-{artist2.id}", + "musicBrainzId": artist2.mbid, }, ], }, @@ -107,6 +109,7 @@ def test_get_artists_serializer(factories): "name": artist3.name, "albumCount": 0, "coverArt": f"ar-{artist3.id}", + "musicBrainzId": artist3.mbid, } ], }, @@ -185,6 +188,7 @@ def test_get_album_serializer(factories): "coverArt": f"al-{album.id}", "genre": tagged_item.tag.name, "genres": [{"name": tagged_item.tag.name}], + "mediaType": "album", "musicBrainzId": album.mbid, "duration": 43, "playCount": album.tracks.aggregate(l=Count("listenings"))["l"] or 0, @@ -209,6 +213,7 @@ def test_get_album_serializer(factories): "albumId": album.pk, "artistId": artist.pk, "type": "music", + "mediaType": "song", "musicBrainzId": track.mbid, } ], diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py index a1a6708ec..576c50005 100644 --- a/api/tests/subsonic/test_views.py +++ b/api/tests/subsonic/test_views.py @@ -596,7 +596,7 @@ def test_search3(f, db, logged_in_api_client, factories): artist_qs = ( music_models.Artist.objects.with_albums_count() .filter(pk=artist.pk) - .values("_albums_count", "id", "name") + .values("_albums_count", "id", "name", "mbid") ) assert response.status_code == 200 assert response.data == {