from django.conf import settings from django.db import models class MediaItem(models.Model): """A logical media file, identified by its MD5 fingerprint.""" md5 = models.CharField(max_length=32, unique=True) size = models.BigIntegerField(default=0) # Custom rating: "s" (safe), "q" (questionable), "e" (explicit) or "" (unrated). rating = models.CharField(max_length=1, blank=True, default="") tags = models.JSONField(default=list, blank=True) notes = models.TextField(blank=True, default="") uploaded_by = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name="uploads", ) # Guests never see items whose tags hit the mirrored default blacklist. hidden_from_guests = models.BooleanField(default=False, db_index=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] def __str__(self): return f"J-{self.pk} ({self.md5})" def save(self, *args, **kwargs): from .guest_filter import item_hidden_from_guests self.hidden_from_guests = item_hidden_from_guests(self.tags) super().save(*args, **kwargs) class MediaLocation(models.Model): """A physical copy of a media item inside the watched folder.""" item = models.ForeignKey( MediaItem, related_name="locations", on_delete=models.CASCADE ) path = models.CharField(max_length=1024) rel_path = models.CharField(max_length=1024) mtime = models.FloatField(default=0) class Meta: unique_together = ("item", "path") ordering = ["rel_path"] def __str__(self): return self.rel_path