import uuid from datetime import datetime from sqlalchemy import String, Integer, Float, Boolean, DateTime, Text, ForeignKey from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.dialects.sqlite import JSON from ..database import Base class Podcast(Base): __tablename__ = "podcasts" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) library_item_id: Mapped[str] = mapped_column(String(36), ForeignKey("library_items.id", ondelete="CASCADE"), unique=True, nullable=False) feed_url: Mapped[str | None] = mapped_column(Text, nullable=True) feed_type: Mapped[str] = mapped_column(String(10), default="rss") feed_last_checked: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) update_interval_hours: Mapped[int] = mapped_column(Integer, default=24) author: Mapped[str | None] = mapped_column(String(500), nullable=True) categories: Mapped[list] = mapped_column(JSON, default=list) explicit: Mapped[bool] = mapped_column(Boolean, default=False) language: Mapped[str | None] = mapped_column(String(10), nullable=True) class PodcastEpisode(Base): __tablename__ = "podcast_episodes" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) podcast_id: Mapped[str] = mapped_column(String(36), ForeignKey("podcasts.id", ondelete="CASCADE"), nullable=False) episode_number: Mapped[str | None] = mapped_column(String(50), nullable=True) season_number: Mapped[str | None] = mapped_column(String(50), nullable=True) title: Mapped[str | None] = mapped_column(String(500), nullable=True) description: Mapped[str | None] = mapped_column(Text, nullable=True) pub_date: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) duration_seconds: Mapped[float] = mapped_column(Float, default=0.0) path: Mapped[str | None] = mapped_column(Text, nullable=True) size_bytes: Mapped[int] = mapped_column(Integer, default=0) feed_episode_id: Mapped[str | None] = mapped_column(String(500), nullable=True) feed_episode_url: Mapped[str | None] = mapped_column(Text, nullable=True) explicit: Mapped[bool] = mapped_column(Boolean, default=False) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)