from rest_framework import serializers from funkwhale_api.tags import models as tags_models class ArtistSerializer(serializers.Serializer): """ Serializer for Musicbrainz artist data. """ id = serializers.CharField() name = serializers.CharField() def create(self, validated_data): from funkwhale_api.music.models import Artist data = { "name": validated_data["name"], "mbid": validated_data["id"], } artist = Artist.objects.create(**data) return artist class ArtistCreditSerializer(serializers.Serializer): """ Serializer for Musicbrainz artist data. """ name = serializers.CharField() joinphrase = serializers.CharField(allow_blank=True) artist = ArtistSerializer() def create(self, validated_data): from funkwhale_api.music.models import ArtistCredit data = { "credit": validated_data["name"], "joinphrase": validated_data.get("joinphrase", ""), "artist": ArtistSerializer().create(validated_data["artist"]), } artist_credit = ArtistCredit.objects.create(**data) return artist_credit class ReleaseSerializer(serializers.Serializer): """ Serializer for Musicbrainz release data. """ id = serializers.CharField() title = serializers.CharField() artist_credit = ArtistCreditSerializer(many=True) tags = serializers.ListField(child=serializers.CharField(), allow_empty=True) date = serializers.DateField(input_formats=["%Y", "%Y/%m/%d", "%Y-%m-%d"]) def create(self, validated_data): from funkwhale_api.music.models import Album data = { "title": validated_data["title"], "mbid": validated_data["id"], "release_date": validated_data.get("date"), } album = Album.objects.create(**data) artist_credit = ArtistCreditSerializer(many=True).create( validated_data["artist_credit"] ) album.artist_credit.set(artist_credit) album.save() tags_models.add_tags(album, *validated_data.get("tags", [])) return album def update(self, instance, validated_data): instance.title = validated_data["title"] instance.release_date = validated_data.get("date") instance.save() tags_models.add_tags(instance, *validated_data.get("tags", [])) return instance class RecordingSerializer(serializers.Serializer): """ Serializer for Musicbrainz track data. """ # class Meta: # model = Track id = serializers.CharField() title = serializers.CharField() artist_credit = ArtistCreditSerializer(many=True) releases = ReleaseSerializer(many=True) tags = serializers.ListField(child=serializers.CharField(), allow_empty=True) def create(self, validated_data): from funkwhale_api.music.models import Track data = { "title": validated_data["title"], "mbid": validated_data["id"], # In mb a recording can have various releases, we take the fist one "album": ReleaseSerializer(many=True).create(validated_data["releases"])[0], } track = Track.objects.create(**data) artist_credit = ArtistCreditSerializer(many=True).create( validated_data["artist_credit"] ) track.artist_credit.set(artist_credit) track.save() tags_models.add_tags(track, *validated_data.get("tags", [])) return track def update(self, instance, validated_data): instance.title = validated_data["title"] instance.save() tags_models.add_tags(instance, *validated_data.get("tags", [])) return instance