"""SQLAlchemy models.""" from datetime import datetime from sqlalchemy import Column, Integer, String, DateTime, BigInteger, Text, Index, ForeignKey from sqlalchemy.orm import relationship from app.database import Base class Video(Base): __tablename__ = "videos" id = Column(Integer, primary_key=True, autoincrement=True) task_id = Column(String(64), unique=True, index=True, nullable=False) url = Column(String(512), nullable=False, index=True) title = Column(String(512), default="") platform = Column(String(32), default="twitter") thumbnail = Column(String(1024), default="") quality = Column(String(32), default="") format_id = Column(String(64), default="") filename = Column(String(512), default="") file_path = Column(String(1024), default="") file_size = Column(BigInteger, default=0) duration = Column(Integer, default=0) status = Column(String(16), default="pending") # pending, downloading, done, error error_message = Column(Text, default="") progress = Column(Integer, default=0) # 0-100 created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) __table_args__ = ( Index("ix_video_url_format_id", "url", "format_id"), ) logs = relationship("DownloadLog", back_populates="video", lazy="select") class DownloadLog(Base): __tablename__ = "download_logs" id = Column(Integer, primary_key=True, autoincrement=True) video_id = Column(Integer, ForeignKey("videos.id", ondelete="CASCADE"), nullable=False, index=True) ip = Column(String(64), default="") user_agent = Column(Text, default="") browser = Column(String(64), default="") # Chrome / Firefox / Safari / Edge / … device = Column(String(32), default="") # desktop / mobile / tablet / bot downloaded_at = Column(DateTime, default=datetime.utcnow, index=True) video = relationship("Video", back_populates="logs")