import os from rest_framework import serializers from .models import MediaItem, MediaLocation from .services import VIDEO_EXTENSIONS class MediaLocationSerializer(serializers.ModelSerializer): class Meta: model = MediaLocation fields = ["id", "path", "rel_path", "mtime"] class MediaItemSerializer(serializers.ModelSerializer): tags = serializers.ListField( child=serializers.CharField(max_length=100), required=False ) rating = serializers.ChoiceField(choices=["", "s", "q", "e"], required=False) locations = MediaLocationSerializer(many=True, read_only=True) j_id = serializers.SerializerMethodField() filename = serializers.SerializerMethodField() extension = serializers.SerializerMethodField() kind = serializers.SerializerMethodField() uploaded_by = serializers.SerializerMethodField() uploaded_by_id = serializers.IntegerField(read_only=True) class Meta: model = MediaItem fields = [ "id", "j_id", "md5", "size", "rating", "tags", "notes", "filename", "extension", "kind", "uploaded_by", "uploaded_by_id", "locations", "created_at", "updated_at", ] read_only_fields = [ "id", "j_id", "md5", "size", "filename", "extension", "kind", "uploaded_by", "uploaded_by_id", "locations", "created_at", "updated_at", ] def get_j_id(self, obj): return f"J-{obj.id}" def get_uploaded_by(self, obj): return obj.uploaded_by.username if obj.uploaded_by else None def _first_location(self, obj): locations = list(obj.locations.all()) return locations[0] if locations else None def get_filename(self, obj): location = self._first_location(obj) return os.path.basename(location.rel_path) if location else obj.md5 def get_extension(self, obj): return os.path.splitext(self.get_filename(obj))[1].lstrip(".").lower() def get_kind(self, obj): return "video" if "." + self.get_extension(obj) in VIDEO_EXTENSIONS else "image"