47 lines
1.7 KiB
Python
47 lines
1.7 KiB
Python
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)
|