70 lines
2.1 KiB
Python
70 lines
2.1 KiB
Python
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
|
|
)
|