from datetime import date from sqlalchemy import Date, ForeignKey, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from ..core.db import Base class Channel(Base): __tablename__ = "channels" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(128)) playlists: Mapped[list["Playlist"]] = relationship(back_populates="channel") videos: Mapped[list["Video"]] = relationship(back_populates="channel") class Playlist(Base): __tablename__ = "playlists" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(128)) channel_id: Mapped[int] = mapped_column(ForeignKey("channels.id")) channel: Mapped[Channel] = relationship(back_populates="playlists") videos: Mapped[list["Video"]] = relationship(back_populates="playlist") class Video(Base): __tablename__ = "videos" __table_args__ = ( UniqueConstraint("channel_id", "filename", name="uq_video_channel_filename"), ) id: Mapped[int] = mapped_column(primary_key=True) filename: Mapped[str] = mapped_column(String(255)) path: Mapped[str] = mapped_column(String(1024)) preview_path: Mapped[str] = mapped_column(String(1024)) playlist_id: Mapped[int | None] = mapped_column(ForeignKey("playlists.id")) playlist: Mapped[Playlist | None] = relationship(back_populates="videos") channel_id: Mapped[int] = mapped_column(ForeignKey("channels.id")) channel: Mapped[Channel] = relationship(back_populates="videos") title: Mapped[str | None] = mapped_column(String(256), nullable=True) date: Mapped[date | None] = mapped_column(Date, nullable=True)