124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
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
|