223 lines
8.1 KiB
Python
223 lines
8.1 KiB
Python
"""
|
|
Django ORM Models - GENERATED FILE
|
|
|
|
Do not edit directly. Regenerate using modelgen.
|
|
"""
|
|
|
|
import uuid
|
|
from django.db import models
|
|
|
|
class AssetStatus(models.TextChoices):
|
|
PENDING = "pending", "Pending"
|
|
READY = "ready", "Ready"
|
|
ERROR = "error", "Error"
|
|
|
|
class JobStatus(models.TextChoices):
|
|
PENDING = "pending", "Pending"
|
|
RUNNING = "running", "Running"
|
|
PAUSED = "paused", "Paused"
|
|
COMPLETED = "completed", "Completed"
|
|
FAILED = "failed", "Failed"
|
|
CANCELLED = "cancelled", "Cancelled"
|
|
|
|
class RunType(models.TextChoices):
|
|
INITIAL = "initial", "Initial"
|
|
REPLAY = "replay", "Replay"
|
|
RETRY = "retry", "Retry"
|
|
|
|
class BrandSource(models.TextChoices):
|
|
OCR = "ocr", "Ocr"
|
|
VLM = "local_vlm", "Vlm"
|
|
CLOUD = "cloud_llm", "Cloud"
|
|
MANUAL = "manual", "Manual"
|
|
|
|
class SourceType(models.TextChoices):
|
|
CHUNK_JOB = "chunk_job", "Chunk Job"
|
|
UPLOAD = "upload", "Upload"
|
|
DEVICE = "device", "Device"
|
|
STREAM = "stream", "Stream"
|
|
|
|
class MediaAsset(models.Model):
|
|
"""A video/audio file registered in the system."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
filename = models.CharField(max_length=500)
|
|
file_path = models.CharField(max_length=1000)
|
|
status = models.CharField(max_length=20, choices=AssetStatus.choices, default=AssetStatus.PENDING)
|
|
error_message = models.TextField(blank=True, default='')
|
|
file_size = models.BigIntegerField(null=True, blank=True)
|
|
duration = models.FloatField(null=True, blank=True, default=None)
|
|
video_codec = models.CharField(max_length=255, null=True, blank=True)
|
|
audio_codec = models.CharField(max_length=255, null=True, blank=True)
|
|
width = models.IntegerField(null=True, blank=True, default=None)
|
|
height = models.IntegerField(null=True, blank=True, default=None)
|
|
framerate = models.FloatField(null=True, blank=True, default=None)
|
|
bitrate = models.BigIntegerField(null=True, blank=True)
|
|
properties = models.JSONField(default=dict, blank=True)
|
|
comments = models.TextField(blank=True, default='')
|
|
tags = models.JSONField(default=list, blank=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 self.filename
|
|
|
|
|
|
class TranscodePreset(models.Model):
|
|
"""A reusable transcoding configuration (like Handbrake presets)."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
name = models.CharField(max_length=255)
|
|
description = models.TextField(blank=True, default='')
|
|
is_builtin = models.BooleanField(default=False)
|
|
container = models.CharField(max_length=255)
|
|
video_codec = models.CharField(max_length=255)
|
|
video_bitrate = models.CharField(max_length=255, null=True, blank=True)
|
|
video_crf = models.IntegerField(null=True, blank=True, default=None)
|
|
video_preset = models.CharField(max_length=255, null=True, blank=True)
|
|
resolution = models.CharField(max_length=255, null=True, blank=True)
|
|
framerate = models.FloatField(null=True, blank=True, default=None)
|
|
audio_codec = models.CharField(max_length=255)
|
|
audio_bitrate = models.CharField(max_length=255, null=True, blank=True)
|
|
audio_channels = models.IntegerField(null=True, blank=True, default=None)
|
|
audio_samplerate = models.IntegerField(null=True, blank=True, default=None)
|
|
extra_args = models.JSONField(default=list, blank=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 self.name
|
|
|
|
|
|
class Job(models.Model):
|
|
"""A pipeline job."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
source_asset_id = models.UUIDField()
|
|
video_path = models.CharField(max_length=1000)
|
|
profile_name = models.CharField(max_length=255)
|
|
timeline_id = models.UUIDField(null=True, blank=True)
|
|
parent_id = models.UUIDField(null=True, blank=True)
|
|
run_type = models.CharField(max_length=20, choices=RunType.choices, default=RunType.INITIAL)
|
|
config_overrides = models.JSONField(default=dict, blank=True)
|
|
status = models.CharField(max_length=20, choices=JobStatus.choices, default=JobStatus.PENDING)
|
|
current_stage = models.CharField(max_length=255, null=True, blank=True)
|
|
progress = models.FloatField(default=0.0)
|
|
error_message = models.TextField(blank=True, default='')
|
|
total_detections = models.IntegerField(default=0)
|
|
brands_found = models.IntegerField(default=0)
|
|
cloud_llm_calls = models.IntegerField(default=0)
|
|
estimated_cost_usd = models.FloatField(default=0.0)
|
|
priority = models.IntegerField(default=0)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
started_at = models.DateTimeField(null=True, blank=True)
|
|
completed_at = models.DateTimeField(null=True, blank=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self):
|
|
return str(self.id)
|
|
|
|
|
|
class Timeline(models.Model):
|
|
"""A user-created selection of source material."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
name = models.CharField(max_length=255)
|
|
source_asset_id = models.UUIDField(null=True, blank=True)
|
|
chunk_paths = models.JSONField(default=list, blank=True)
|
|
profile_name = models.CharField(max_length=255)
|
|
status = models.CharField(max_length=255)
|
|
fps = models.FloatField(default=2.0)
|
|
frame_count = models.IntegerField(default=0)
|
|
source_ephemeral = models.BooleanField(default=False)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class Checkpoint(models.Model):
|
|
"""A snapshot of pipeline state on a timeline."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
timeline_id = models.UUIDField()
|
|
job_id = models.UUIDField(null=True, blank=True)
|
|
parent_id = models.UUIDField(null=True, blank=True)
|
|
stage_name = models.CharField(max_length=255)
|
|
config_overrides = models.JSONField(default=dict, blank=True)
|
|
stats = models.JSONField(default=dict, blank=True)
|
|
is_scenario = models.BooleanField(default=False)
|
|
scenario_label = models.CharField(max_length=255)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self):
|
|
return str(self.id)
|
|
|
|
|
|
class StageOutput(models.Model):
|
|
"""Output of a single stage within a job."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
job_id = models.UUIDField()
|
|
timeline_id = models.UUIDField()
|
|
stage_name = models.CharField(max_length=255)
|
|
checkpoint_id = models.UUIDField(null=True, blank=True)
|
|
output = models.JSONField(default=dict, blank=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self):
|
|
return str(self.id)
|
|
|
|
|
|
class Brand(models.Model):
|
|
"""A brand discovered or registered in the system."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
canonical_name = models.CharField(max_length=255)
|
|
aliases = models.JSONField(default=list, blank=True)
|
|
source = models.CharField(max_length=20, choices=BrandSource.choices, default=BrandSource.OCR)
|
|
confirmed = models.BooleanField(default=False)
|
|
airings = models.JSONField(default=list, blank=True)
|
|
total_airings = models.IntegerField(default=0)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self):
|
|
return str(self.id)
|
|
|
|
|
|
class Profile(models.Model):
|
|
"""A content type profile."""
|
|
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
name = models.CharField(max_length=255)
|
|
pipeline = models.JSONField(default=dict, blank=True)
|
|
configs = models.JSONField(default=dict, blank=True)
|
|
|
|
class Meta:
|
|
pass
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|