a
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
|
||||
@@ -10,10 +11,70 @@ from sqlmodel import Session, select
|
||||
from .models import Job
|
||||
|
||||
|
||||
def list_jobs(session: Session, parent_id: Optional[UUID] = None, status: Optional[str] = None) -> list[Job]:
|
||||
def create_job(
|
||||
session: Session,
|
||||
source_asset_id: UUID,
|
||||
video_path: str,
|
||||
timeline_id: UUID,
|
||||
profile_name: str = "soccer_broadcast",
|
||||
run_type: str = "initial",
|
||||
parent_id: UUID | None = None,
|
||||
config_overrides: dict | None = None,
|
||||
) -> Job:
|
||||
job = Job(
|
||||
source_asset_id=source_asset_id,
|
||||
video_path=video_path,
|
||||
timeline_id=timeline_id,
|
||||
profile_name=profile_name,
|
||||
run_type=run_type,
|
||||
parent_id=parent_id,
|
||||
config_overrides=config_overrides or {},
|
||||
status="pending",
|
||||
)
|
||||
session.add(job)
|
||||
session.commit()
|
||||
session.refresh(job)
|
||||
return job
|
||||
|
||||
|
||||
def update_job_status(
|
||||
session: Session,
|
||||
job_id: UUID,
|
||||
status: str,
|
||||
current_stage: str | None = None,
|
||||
error_message: str | None = None,
|
||||
):
|
||||
job = session.get(Job, job_id)
|
||||
if not job:
|
||||
return
|
||||
job.status = status
|
||||
if current_stage is not None:
|
||||
job.current_stage = current_stage
|
||||
if error_message is not None:
|
||||
job.error_message = error_message
|
||||
if status == "running" and not job.started_at:
|
||||
job.started_at = datetime.utcnow()
|
||||
if status in ("completed", "failed", "cancelled"):
|
||||
job.completed_at = datetime.utcnow()
|
||||
session.commit()
|
||||
|
||||
|
||||
def get_job(session: Session, job_id: UUID) -> Job | None:
|
||||
return session.get(Job, job_id)
|
||||
|
||||
|
||||
def list_jobs(
|
||||
session: Session,
|
||||
timeline_id: UUID | None = None,
|
||||
parent_id: UUID | None = None,
|
||||
status: str | None = None,
|
||||
) -> list[Job]:
|
||||
stmt = select(Job)
|
||||
if timeline_id:
|
||||
stmt = stmt.where(Job.timeline_id == timeline_id)
|
||||
if parent_id:
|
||||
stmt = stmt.where(Job.parent_id == parent_id)
|
||||
if status:
|
||||
stmt = stmt.where(Job.status == status)
|
||||
stmt = stmt.order_by(Job.created_at.desc())
|
||||
return list(session.exec(stmt).all())
|
||||
|
||||
@@ -114,17 +114,18 @@ class Job(SQLModel, table=True):
|
||||
completed_at: Optional[datetime] = None
|
||||
|
||||
class Timeline(SQLModel, table=True):
|
||||
"""The frame sequence from a source video."""
|
||||
"""A user-created selection of source material."""
|
||||
__tablename__ = "timeline"
|
||||
|
||||
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
||||
name: str = ""
|
||||
source_asset_id: Optional[UUID] = Field(default=None, index=True)
|
||||
source_video: str = ""
|
||||
chunk_paths: List[str] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
||||
profile_name: str = ""
|
||||
status: str = "created"
|
||||
fps: float = 2.0
|
||||
frames_prefix: str = ""
|
||||
frames_manifest: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
||||
frames_meta: List[str] = Field(default_factory=list, sa_column=Column(JSON, nullable=False, server_default='[]'))
|
||||
frame_count: int = 0
|
||||
source_ephemeral: bool = False
|
||||
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class Checkpoint(SQLModel, table=True):
|
||||
@@ -135,13 +136,25 @@ class Checkpoint(SQLModel, table=True):
|
||||
timeline_id: UUID
|
||||
job_id: Optional[UUID] = Field(default=None, index=True)
|
||||
parent_id: Optional[UUID] = None
|
||||
stage_outputs: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
||||
stage_name: str = ""
|
||||
config_overrides: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
||||
stats: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
||||
is_scenario: bool = False
|
||||
scenario_label: str = ""
|
||||
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class StageOutput(SQLModel, table=True):
|
||||
"""Output of a single stage within a job."""
|
||||
__tablename__ = "stage_output"
|
||||
|
||||
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
||||
job_id: UUID = Field(index=True)
|
||||
timeline_id: UUID
|
||||
stage_name: str
|
||||
checkpoint_id: Optional[UUID] = None
|
||||
output: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False, server_default='{}'))
|
||||
created_at: Optional[datetime] = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class Brand(SQLModel, table=True):
|
||||
"""A brand discovered or registered in the system."""
|
||||
__tablename__ = "brand"
|
||||
|
||||
Reference in New Issue
Block a user