from django.db import models from django.conf import settings # 7áznamy pro donwloader, co lidé nejvíc stahujou a v jakém formátu class DownloaderModel(models.Model): url = models.URLField() download_time = models.DateTimeField(auto_now_add=True) status = models.CharField(max_length=50) # yt-dlp metadata (flattened for stats) requested_format = models.CharField(max_length=100, blank=True, null=True, db_index=True) format_id = models.CharField(max_length=50, blank=True, null=True, db_index=True) ext = models.CharField(max_length=20, blank=True, null=True, db_index=True) vcodec = models.CharField(max_length=50, blank=True, null=True, db_index=True) acodec = models.CharField(max_length=50, blank=True, null=True, db_index=True) width = models.IntegerField(blank=True, null=True) height = models.IntegerField(blank=True, null=True) fps = models.FloatField(blank=True, null=True) abr = models.FloatField(blank=True, null=True) # audio bitrate vbr = models.FloatField(blank=True, null=True) # video bitrate tbr = models.FloatField(blank=True, null=True) # total bitrate asr = models.IntegerField(blank=True, null=True) # audio sample rate filesize = models.BigIntegerField(blank=True, null=True) duration = models.FloatField(blank=True, null=True) title = models.CharField(max_length=512, blank=True, null=True) extractor = models.CharField(max_length=100, blank=True, null=True, db_index=True) extractor_key = models.CharField(max_length=100, blank=True, null=True) video_id = models.CharField(max_length=128, blank=True, null=True, db_index=True) webpage_url = models.URLField(blank=True, null=True) is_audio_only = models.BooleanField(default=False, db_index=True) # client/context user = models.ForeignKey(getattr(settings, "AUTH_USER_MODEL", "auth.User"), on_delete=models.SET_NULL, null=True, blank=True) ip_address = models.GenericIPAddressField(blank=True, null=True) user_agent = models.TextField(blank=True, null=True) # diagnostics error_message = models.TextField(blank=True, null=True) # full raw yt-dlp info for future analysis raw_info = models.JSONField(blank=True, null=True) class Meta: indexes = [ models.Index(fields=["download_time"]), models.Index(fields=["ext", "is_audio_only"]), models.Index(fields=["requested_format"]), models.Index(fields=["extractor"]), ] def __str__(self): return f"DownloaderModel {self.id} - {self.status} at {self.download_time.strftime('%d-%m-%Y %H:%M:%S')}" @classmethod def from_ydl_info(cls, *, info: dict, requested_format: str | None = None, status: str = "success", url: str | None = None, user=None, ip_address: str | None = None, user_agent: str | None = None, error_message: str | None = None): # Safe getters def g(k, default=None): return info.get(k, default) instance = cls( url=url or g("webpage_url") or g("original_url"), status=status, requested_format=requested_format, format_id=g("format_id"), ext=g("ext"), vcodec=g("vcodec"), acodec=g("acodec"), width=g("width") if isinstance(g("width"), int) else None, height=g("height") if isinstance(g("height"), int) else None, fps=g("fps"), abr=g("abr"), vbr=g("vbr"), tbr=g("tbr"), asr=g("asr"), filesize=g("filesize") or g("filesize_approx"), duration=g("duration"), title=g("title"), extractor=g("extractor"), extractor_key=g("extractor_key"), video_id=g("id"), webpage_url=g("webpage_url"), is_audio_only=(g("vcodec") in (None, "none")), user=user if getattr(user, "is_authenticated", False) else None, ip_address=ip_address, user_agent=user_agent, error_message=error_message, raw_info=info, ) instance.save() return instance