From 8cfead746d38932714d065277cb0a4d4ef7c89e7 Mon Sep 17 00:00:00 2001 From: ArneBo Date: Fri, 21 Feb 2025 10:27:06 +0100 Subject: [PATCH] fix(front): consistent image urls generation in all sizes --- api/config/settings/common.py | 1 + api/funkwhale_api/common/models.py | 7 +++++++ api/funkwhale_api/common/serializers.py | 1 + api/funkwhale_api/common/views.py | 7 ++++++- api/funkwhale_api/subsonic/serializers.py | 3 +++ api/tests/common/test_serializers.py | 3 +++ api/tests/subsonic/test_serializers.py | 3 +++ front/src/components/album/Card.vue | 2 +- front/src/components/artist/Card.vue | 4 ++-- 9 files changed, 27 insertions(+), 4 deletions(-) diff --git a/api/config/settings/common.py b/api/config/settings/common.py index 776d73c2e..e8647d9c1 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -1398,6 +1398,7 @@ VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = { ], "attachment_square": [ ("original", "url"), + ("small_square_crop", "crop__50x50"), ("medium_square_crop", "crop__200x200"), ("large_square_crop", "crop__600x600"), ], diff --git a/api/funkwhale_api/common/models.py b/api/funkwhale_api/common/models.py index 575ff864b..f6e2c1213 100644 --- a/api/funkwhale_api/common/models.py +++ b/api/funkwhale_api/common/models.py @@ -257,6 +257,13 @@ class Attachment(models.Model): proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": self.uuid}) return federation_utils.full_url(proxy_url + "?next=original") + @property + def download_url_small_square_crop(self): + if self.file: + return utils.media_url(self.file.crop["50x50"].url) + proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": self.uuid}) + return federation_utils.full_url(proxy_url + "?next=small_square_crop") + @property def download_url_medium_square_crop(self): if self.file: diff --git a/api/funkwhale_api/common/serializers.py b/api/funkwhale_api/common/serializers.py index 03817424e..bf10fc1c1 100644 --- a/api/funkwhale_api/common/serializers.py +++ b/api/funkwhale_api/common/serializers.py @@ -298,6 +298,7 @@ class AttachmentSerializer(serializers.Serializer): urls = {} urls["source"] = o.url urls["original"] = o.download_url_original + urls["small_square_crop"] = o.download_url_small_square_crop urls["medium_square_crop"] = o.download_url_medium_square_crop urls["large_square_crop"] = o.download_url_large_square_crop return urls diff --git a/api/funkwhale_api/common/views.py b/api/funkwhale_api/common/views.py index 51c46e2e0..ff3a54e7f 100644 --- a/api/funkwhale_api/common/views.py +++ b/api/funkwhale_api/common/views.py @@ -176,7 +176,12 @@ class AttachmentViewSet( return r size = request.GET.get("next", "original").lower() - if size not in ["original", "medium_square_crop", "large_square_crop"]: + if size not in [ + "original", + "small_square_crop", + "medium_square_crop", + "large_square_crop", + ]: size = "original" try: diff --git a/api/funkwhale_api/subsonic/serializers.py b/api/funkwhale_api/subsonic/serializers.py index af0899d30..1041eb216 100644 --- a/api/funkwhale_api/subsonic/serializers.py +++ b/api/funkwhale_api/subsonic/serializers.py @@ -111,6 +111,9 @@ class GetArtistInfo2Serializer(serializers.Serializer): if artist.mbid: payload["musicBrainzId"] = TagValue(artist.mbid) if artist.attachment_cover: + payload["smallImageUrl"] = TagValue( + artist.attachment_cover.download_url_small_square_crop + ) payload["mediumImageUrl"] = TagValue( artist.attachment_cover.download_url_medium_square_crop ) diff --git a/api/tests/common/test_serializers.py b/api/tests/common/test_serializers.py index 95c0cddc9..39941a297 100644 --- a/api/tests/common/test_serializers.py +++ b/api/tests/common/test_serializers.py @@ -195,6 +195,9 @@ def test_attachment_serializer_existing_file(factories, to_api_date): "urls": { "source": attachment.url, "original": federation_utils.full_url(attachment.file.url), + "small_square_crop": federation_utils.full_url( + attachment.file.crop["50x50"].url + ), "medium_square_crop": federation_utils.full_url( attachment.file.crop["200x200"].url ), diff --git a/api/tests/subsonic/test_serializers.py b/api/tests/subsonic/test_serializers.py index 295345736..1275a678d 100644 --- a/api/tests/subsonic/test_serializers.py +++ b/api/tests/subsonic/test_serializers.py @@ -156,6 +156,9 @@ def test_get_artist_info_2_serializer(factories): expected = { "musicBrainzId": artist.mbid, + "smallImageUrl": renderers.TagValue( + artist.attachment_cover.download_url_small_square_crop + ), "mediumImageUrl": renderers.TagValue( artist.attachment_cover.download_url_medium_square_crop ), diff --git a/front/src/components/album/Card.vue b/front/src/components/album/Card.vue index 47d9b7f24..7de2c2e70 100644 --- a/front/src/components/album/Card.vue +++ b/front/src/components/album/Card.vue @@ -32,7 +32,7 @@ const firstArtist = artist_credit.length > 0 ? artist_credit[0].artist : null const store = useStore() const imageUrl = computed(() => props.album.cover?.urls.original - ? store.getters['instance/absoluteUrl'](props.album.cover?.urls.large_square_crop) + ? store.getters['instance/absoluteUrl'](props.album.cover?.urls.medium_square_crop) : defaultCover ) diff --git a/front/src/components/artist/Card.vue b/front/src/components/artist/Card.vue index 372d7dbfa..497f29aa9 100644 --- a/front/src/components/artist/Card.vue +++ b/front/src/components/artist/Card.vue @@ -25,11 +25,11 @@ const cover = computed(() => { const artistCover = artist.attachment_cover ?? undefined const albumCover = albums.value?.find( - (album: Album) => album.cover?.urls.medium_square_crop + (album: Album) => album.cover?.urls )?.cover const trackCover = tracks.value?.find( - (track: Track) => track.cover + (track: Track) => track.cover?.urls )?.cover const fallback: Cover = {