diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 49d22fa85..8832c74c7 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -436,7 +436,7 @@ class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): return self.exclude(pk__in=matches) def with_playable_uploads(self, actor): - uploads = Upload.objects.playable_by(actor).select_related("track") + uploads = Upload.objects.playable_by(actor) return self.prefetch_related( models.Prefetch("uploads", queryset=uploads, to_attr="playable_uploads") ) @@ -594,7 +594,8 @@ class Track(APIModelMixin): @property def listen_url(self): - return reverse("api:v1:listen-detail", kwargs={"uuid": self.uuid}) + # Not using reverse because this is slow + return "/api/v1/listen/{}/".format(self.uuid) @property def local_license(self): diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index 77854d437..9ea2dd2cb 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -45,26 +45,21 @@ class LicenseSerializer(serializers.Serializer): return obj["identifiers"][0] -class ArtistAlbumSerializer(serializers.ModelSerializer): +class ArtistAlbumSerializer(serializers.Serializer): tracks_count = serializers.SerializerMethodField() cover = cover_field is_playable = serializers.SerializerMethodField() + is_local = serializers.BooleanField() + id = serializers.IntegerField() + fid = serializers.URLField() + mbid = serializers.UUIDField() + title = serializers.CharField() + artist = serializers.SerializerMethodField() + release_date = serializers.DateField() + creation_date = serializers.DateTimeField() - class Meta: - model = models.Album - fields = ( - "id", - "fid", - "mbid", - "title", - "artist", - "release_date", - "cover", - "creation_date", - "tracks_count", - "is_playable", - "is_local", - ) + def get_artist(self, o): + return o.artist_id def get_tracks_count(self, o): return o._tracks_count @@ -76,26 +71,20 @@ class ArtistAlbumSerializer(serializers.ModelSerializer): return None -class ArtistWithAlbumsSerializer(serializers.ModelSerializer): - albums = ArtistAlbumSerializer(many=True, read_only=True) +DATETIME_FIELD = serializers.DateTimeField() + + +class ArtistWithAlbumsSerializer(serializers.Serializer): + albums = ArtistAlbumSerializer(many=True) tags = serializers.SerializerMethodField() attributed_to = serializers.SerializerMethodField() tracks_count = serializers.SerializerMethodField() - - class Meta: - model = models.Artist - fields = ( - "id", - "fid", - "mbid", - "name", - "creation_date", - "albums", - "is_local", - "tags", - "attributed_to", - "tracks_count", - ) + id = serializers.IntegerField() + fid = serializers.URLField() + mbid = serializers.UUIDField() + name = serializers.CharField() + creation_date = serializers.DateTimeField() + is_local = serializers.BooleanField() def get_tags(self, obj): tagged_items = getattr(obj, "_prefetched_tagged_items", []) @@ -114,9 +103,7 @@ def serialize_artist_simple(artist): "fid": artist.fid, "mbid": str(artist.mbid), "name": artist.name, - "creation_date": serializers.DateTimeField().to_representation( - artist.creation_date - ), + "creation_date": DATETIME_FIELD.to_representation(artist.creation_date), "is_local": artist.is_local, } @@ -129,9 +116,7 @@ def serialize_album_track(track): "title": track.title, "artist": serialize_artist_simple(track.artist), "album": track.album_id, - "creation_date": serializers.DateTimeField().to_representation( - track.creation_date - ), + "creation_date": DATETIME_FIELD.to_representation(track.creation_date), "position": track.position, "disc_number": track.disc_number, "uploads": [ @@ -145,31 +130,22 @@ def serialize_album_track(track): } -class AlbumSerializer(serializers.ModelSerializer): +class AlbumSerializer(serializers.Serializer): tracks = serializers.SerializerMethodField() artist = serializers.SerializerMethodField() cover = cover_field is_playable = serializers.SerializerMethodField() tags = serializers.SerializerMethodField() attributed_to = serializers.SerializerMethodField() - - class Meta: - model = models.Album - fields = ( - "id", - "fid", - "mbid", - "title", - "artist", - "tracks", - "release_date", - "cover", - "creation_date", - "is_playable", - "is_local", - "tags", - "attributed_to", - ) + id = serializers.IntegerField() + fid = serializers.URLField() + mbid = serializers.UUIDField() + title = serializers.CharField() + artist = serializers.SerializerMethodField() + release_date = serializers.DateField() + creation_date = serializers.DateTimeField() + is_local = serializers.BooleanField() + is_playable = serializers.SerializerMethodField() get_attributed_to = serialize_attributed_to @@ -227,7 +203,7 @@ def serialize_upload(upload): } -class TrackSerializer(serializers.ModelSerializer): +class TrackSerializer(serializers.Serializer): artist = serializers.SerializerMethodField() album = TrackAlbumSerializer(read_only=True) uploads = serializers.SerializerMethodField() @@ -235,26 +211,17 @@ class TrackSerializer(serializers.ModelSerializer): tags = serializers.SerializerMethodField() attributed_to = serializers.SerializerMethodField() - class Meta: - model = models.Track - fields = ( - "id", - "fid", - "mbid", - "title", - "album", - "artist", - "creation_date", - "position", - "disc_number", - "uploads", - "listen_url", - "copyright", - "license", - "is_local", - "tags", - "attributed_to", - ) + id = serializers.IntegerField() + fid = serializers.URLField() + mbid = serializers.UUIDField() + title = serializers.CharField() + artist = serializers.SerializerMethodField() + creation_date = serializers.DateTimeField() + is_local = serializers.BooleanField() + position = serializers.IntegerField() + disc_number = serializers.IntegerField() + copyright = serializers.CharField() + license = serializers.SerializerMethodField() get_attributed_to = serialize_attributed_to @@ -271,6 +238,9 @@ class TrackSerializer(serializers.ModelSerializer): tagged_items = getattr(obj, "_prefetched_tagged_items", []) return [ti.tag.name for ti in tagged_items] + def get_license(self, o): + return o.license_id + @common_serializers.track_fields_for_update("name", "description", "privacy_level") class LibraryForOwnerSerializer(serializers.ModelSerializer):