From 98b3edb06a9b8c36433bc29f3fd3cca2983847a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Pe=C3=B1a?= Date: Sun, 7 Nov 2021 22:33:12 +0100 Subject: [PATCH] Exposes more metadata in subsonic album endpoint (#623) --- api/funkwhale_api/subsonic/serializers.py | 10 +++++++++- api/tests/subsonic/test_serializers.py | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/api/funkwhale_api/subsonic/serializers.py b/api/funkwhale_api/subsonic/serializers.py index 237eb0cff..276586f78 100644 --- a/api/funkwhale_api/subsonic/serializers.py +++ b/api/funkwhale_api/subsonic/serializers.py @@ -1,6 +1,7 @@ import collections from django.db.models import Count, functions +from django.db.models import Sum from rest_framework import serializers from funkwhale_api.history import models as history_models @@ -147,10 +148,17 @@ def get_album2_data(album): "name": album.title, "artist": album.artist.name, "created": to_subsonic_date(album.creation_date), + "duration": album.tracks.aggregate(d=Sum("uploads__duration"))["d"] or 0, + "playCount": album.tracks.aggregate(c=Sum("downloads_count"))["c"] or 0, } if album.attachment_cover_id: payload["coverArt"] = "al-{}".format(album.id) - + if album.tagged_items: + # exposes only first genre since the specification uses singular noun + first_genre = album.tagged_items.first() + payload["genre"] = first_genre.tag.name if first_genre else "" + if album.release_date: + payload["year"] = album.release_date.year try: payload["songCount"] = album._tracks_count except AttributeError: diff --git a/api/tests/subsonic/test_serializers.py b/api/tests/subsonic/test_serializers.py index c993942dc..9ca3bf241 100644 --- a/api/tests/subsonic/test_serializers.py +++ b/api/tests/subsonic/test_serializers.py @@ -1,4 +1,6 @@ import datetime + +from django.db.models.aggregates import Sum import pytest from funkwhale_api.music import models as music_models @@ -181,6 +183,9 @@ def test_get_album_serializer(factories): "created": serializers.to_subsonic_date(album.creation_date), "year": album.release_date.year, "coverArt": "al-{}".format(album.id), + "genre": ", ".join([ti.tag.name for ti in album.tagged_items.all()]), + "duration": album.tracks.aggregate(d=Sum("uploads__duration"))["d"] or 0, + "playCount": album.tracks.aggregate(c=Sum("downloads_count"))["c"] or 0, "song": [ { "id": track.pk,