Skip to content
Snippets Groups Projects
serializers.py 41.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eliot Berriot's avatar
    Eliot Berriot committed
                    validated_data, "album.artists", permissive=True
                )
                or []
            )
            for artist in artists + album_artists:
                actors_to_fetch.add(artist.get("attributedTo"))
    
            for url in actors_to_fetch:
                if not url:
                    continue
                references[url] = actors.get_actor(url)
            metadata = music_tasks.federation_audio_track_to_metadata(
                validated_data, references
            )
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            from_activity = self.context.get("activity")
            if from_activity:
                metadata["from_activity_id"] = from_activity.pk
    
            track = music_tasks.get_track_from_import_metadata(metadata, update_cover=True)
    
            tags_models.add_tags(track, *tags)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            return track
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        def update(self, obj, validated_data):
            if validated_data.get("license"):
                validated_data["license"] = licenses.match(validated_data["license"])
            return super().update(obj, validated_data)
    
    
    class UploadSerializer(jsonld.JsonLdSerializer):
        type = serializers.ChoiceField(choices=[contexts.AS.Audio])
    
        id = serializers.URLField(max_length=500)
    
        library = serializers.URLField(max_length=500)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        url = LinkSerializer(allowed_mimetypes=["audio/*"])
    
        published = serializers.DateTimeField()
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        updated = serializers.DateTimeField(required=False, allow_null=True)
        bitrate = serializers.IntegerField(min_value=0)
        size = serializers.IntegerField(min_value=0)
        duration = serializers.IntegerField(min_value=0)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        track = TrackSerializer(required=True)
    
            model = music_models.Upload
    
            jsonld_mapping = {
                "track": jsonld.first_obj(contexts.FW.track),
                "library": jsonld.first_id(contexts.FW.library),
                "url": jsonld.first_obj(contexts.AS.url),
                "published": jsonld.first_val(contexts.AS.published),
                "updated": jsonld.first_val(contexts.AS.updated),
                "duration": jsonld.first_val(contexts.AS.duration),
                "bitrate": jsonld.first_val(contexts.FW.bitrate),
                "size": jsonld.first_val(contexts.FW.size),
            }
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                raise serializers.ValidationError("Missing href")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                media_type = v["mediaType"]
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                raise serializers.ValidationError("Missing mediaType")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            if not media_type or not media_type.startswith("audio/"):
                raise serializers.ValidationError("Invalid mediaType")
    
        def validate_library(self, v):
            lb = self.context.get("library")
            if lb:
                if lb.fid != v:
                    raise serializers.ValidationError("Invalid library")
                return lb
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
            actor = self.context.get("actor")
            kwargs = {}
            if actor:
                kwargs["actor"] = actor
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                return music_models.Library.objects.get(fid=v, **kwargs)
    
            except music_models.Library.DoesNotExist:
                raise serializers.ValidationError("Invalid library")
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            try:
                return music_models.Upload.objects.get(fid=validated_data["id"])
            except music_models.Upload.DoesNotExist:
                pass
    
            track = TrackSerializer(
                context={"activity": self.context.get("activity")}
            ).create(validated_data["track"])
    
            data = {
                "fid": validated_data["id"],
    
                "mimetype": validated_data["url"]["mediaType"],
                "source": validated_data["url"]["href"],
                "creation_date": validated_data["published"],
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "modification_date": validated_data.get("updated"),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "track": track,
                "duration": validated_data["duration"],
                "size": validated_data["size"],
                "bitrate": validated_data["bitrate"],
                "library": validated_data["library"],
                "from_activity": self.context.get("activity"),
                "import_status": "finished",
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            return music_models.Upload.objects.create(**data)
    
    
        def to_representation(self, instance):
            track = instance.track
            d = {
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "type": "Audio",
    
                "id": instance.get_federation_id(),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "library": instance.library.fid,
                "name": track.full_name,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "published": instance.creation_date.isoformat(),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "bitrate": instance.bitrate,
                "size": instance.size,
                "duration": instance.duration,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "url": {
    
                    "href": utils.full_url(instance.listen_url),
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                    "type": "Link",
                    "mediaType": instance.mimetype,
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "track": TrackSerializer(track, context={"include_ap_context": False}).data,
    
            if instance.modification_date:
                d["updated"] = instance.modification_date.isoformat()
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            if self.context.get("include_ap_context", self.parent is None):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                d["@context"] = jsonld.get_default_context()
    
    class NodeInfoLinkSerializer(serializers.Serializer):
        href = serializers.URLField()
        rel = serializers.URLField()
    
    
    class NodeInfoSerializer(serializers.Serializer):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        links = serializers.ListField(child=NodeInfoLinkSerializer(), min_length=1)