from rest_framework import serializers from .models import DownloaderModel class DownloaderLogSerializer(serializers.ModelSerializer): # Optional raw yt-dlp info dict info = serializers.DictField(required=False) class Meta: model = DownloaderModel fields = ( "id", "url", "status", "requested_format", "format_id", "ext", "vcodec", "acodec", "width", "height", "fps", "abr", "vbr", "tbr", "asr", "filesize", "duration", "title", "extractor", "extractor_key", "video_id", "webpage_url", "is_audio_only", "error_message", "raw_info", "info", # virtual input ) read_only_fields = ("id", "raw_info") def create(self, validated_data): info = validated_data.pop("info", None) request = self.context.get("request") user = getattr(request, "user", None) if request else None ip_address = None user_agent = None if request: xff = request.META.get("HTTP_X_FORWARDED_FOR") ip_address = (xff.split(",")[0].strip() if xff else request.META.get("REMOTE_ADDR")) user_agent = request.META.get("HTTP_USER_AGENT") if info: return DownloaderModel.from_ydl_info( info=info, requested_format=validated_data.get("requested_format"), status=validated_data.get("status", "success"), url=validated_data.get("url"), user=user, ip_address=ip_address, user_agent=user_agent, error_message=validated_data.get("error_message"), ) # Fallback: create from flattened fields only return DownloaderModel.objects.create( user=user, ip_address=ip_address, user_agent=user_agent, raw_info=None, **validated_data )