Files
xdl/backend/app/models.py

59 lines
2.4 KiB
Python

"""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="")
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
country_code = Column(String(8), default="") # e.g. CN
country = Column(String(128), default="") # e.g. China
city = Column(String(128), default="") # e.g. Shanghai
downloaded_at = Column(DateTime, default=datetime.utcnow, index=True)
video = relationship("Video", back_populates="logs")
class AppSetting(Base):
__tablename__ = "app_settings"
key = Column(String(64), primary_key=True)
value = Column(Text, default="")
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)