diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py
index dac50960c..813d2656e 100644
--- a/api/funkwhale_api/music/serializers.py
+++ b/api/funkwhale_api/music/serializers.py
@@ -79,6 +79,7 @@ class ArtistWithAlbumsSerializer(serializers.ModelSerializer):
albums = ArtistAlbumSerializer(many=True, read_only=True)
tags = serializers.SerializerMethodField()
attributed_to = serializers.SerializerMethodField()
+ tracks_count = serializers.SerializerMethodField()
class Meta:
model = models.Artist
@@ -92,6 +93,7 @@ class ArtistWithAlbumsSerializer(serializers.ModelSerializer):
"is_local",
"tags",
"attributed_to",
+ "tracks_count",
)
def get_tags(self, obj):
@@ -100,6 +102,9 @@ class ArtistWithAlbumsSerializer(serializers.ModelSerializer):
get_attributed_to = serialize_attributed_to
+ def get_tracks_count(self, o):
+ return getattr(o, "_tracks_count", None)
+
class ArtistSimpleSerializer(serializers.ModelSerializer):
class Meta:
diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py
index 15a2559da..33d3663c1 100644
--- a/api/funkwhale_api/music/views.py
+++ b/api/funkwhale_api/music/views.py
@@ -94,7 +94,11 @@ def refetch_obj(obj, queryset):
class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
- queryset = models.Artist.objects.all().select_related("attributed_to")
+ queryset = (
+ models.Artist.objects.all()
+ .select_related("attributed_to")
+ .annotate(_tracks_count=Count("tracks"))
+ )
serializer_class = serializers.ArtistWithAlbumsSerializer
permission_classes = [oauth_permissions.ScopePermission]
required_scope = "libraries"
diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py
index fd0c312e5..333881037 100644
--- a/api/tests/music/test_serializers.py
+++ b/api/tests/music/test_serializers.py
@@ -62,7 +62,7 @@ def test_artist_with_albums_serializer(factories, to_api_date):
artist = track.artist
artist = artist.__class__.objects.with_albums().get(pk=artist.pk)
album = list(artist.albums.all())[0]
-
+ setattr(artist, "_tracks_count", 42)
expected = {
"id": artist.id,
"fid": artist.fid,
@@ -73,6 +73,7 @@ def test_artist_with_albums_serializer(factories, to_api_date):
"albums": [serializers.ArtistAlbumSerializer(album).data],
"tags": [],
"attributed_to": federation_serializers.APIActorSerializer(actor).data,
+ "tracks_count": 42,
}
serializer = serializers.ArtistWithAlbumsSerializer(artist)
assert serializer.data == expected
diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py
index 7382e4f78..6f05c6700 100644
--- a/api/tests/music/test_views.py
+++ b/api/tests/music/test_views.py
@@ -6,6 +6,7 @@ import urllib.parse
import uuid
import pytest
+from django.db.models import Count
from django.urls import reverse
from django.utils import timezone
@@ -27,7 +28,7 @@ def test_artist_list_serializer(api_request, factories, logged_in_api_client):
).track
artist = track.artist
request = api_request.get("/")
- qs = artist.__class__.objects.with_albums()
+ qs = artist.__class__.objects.with_albums().annotate(_tracks_count=Count("tracks"))
serializer = serializers.ArtistWithAlbumsSerializer(
qs, many=True, context={"request": request}
)
diff --git a/changes/changelog.d/895.enhancement b/changes/changelog.d/895.enhancement
new file mode 100644
index 000000000..d79abc598
--- /dev/null
+++ b/changes/changelog.d/895.enhancement
@@ -0,0 +1 @@
+Artists with no albums will now show track count on artist card (#895)
\ No newline at end of file
diff --git a/docs/swagger.yml b/docs/swagger.yml
index 8ea7d00a7..d7a0230c0 100644
--- a/docs/swagger.yml
+++ b/docs/swagger.yml
@@ -1190,6 +1190,10 @@ definitions:
- $ref: "#/definitions/BaseArtist"
- type: "object"
properties:
+ tracks_count:
+ type: "integer"
+ format: "int64"
+ example: 42
albums:
type: "array"
items:
diff --git a/front/src/components/audio/artist/Card.vue b/front/src/components/audio/artist/Card.vue
index 21c62cf34..6fe70e266 100644
--- a/front/src/components/audio/artist/Card.vue
+++ b/front/src/components/audio/artist/Card.vue
@@ -7,10 +7,14 @@