import datetime import json import pathlib from pathlib import Path from typing import Optional, Dict, List, Union from sqlalchemy import Column, Integer, String, Boolean, JSON, Date, ARRAY, ForeignKey, BigInteger from sqlalchemy.orm import relationship, Session, deferred from sqlalchemy.orm.collections import InstrumentedList from modules.videos.errors import UnknownVideo from wrolpi.captions import read_captions from wrolpi.common import Base, ModelHelper, logger, get_media_directory, background_task from wrolpi.dates import now, TZDateTime from wrolpi.db import get_db_curs, get_db_session, optional_session from wrolpi.downloader import Download, download_manager from wrolpi.files.lib import refresh_files, split_path_stem_and_suffix from wrolpi.files.models import FileGroup from wrolpi.media_path import MediaPathType from wrolpi.tags import Tag, TagFile from wrolpi.vars import PYTEST logger = logger.getChild(__name__) __all__ = ['Video', 'Channel'] class Video(ModelHelper, Base): __tablename__ = 'video' id = Column(Integer, primary_key=True) duration = Column(Integer) source_id = Column(String) upload_date: datetime.datetime = Column(TZDateTime) url = Column(String) validated = Column(Boolean, default=False) view_count = Column(Integer) viewed = Column(TZDateTime) ffprobe_json = deferred(Column(JSON)) channel_id = Column(Integer, ForeignKey('channel.id')) channel = relationship('Channel', primaryjoin='Video.channel_id==Channel.id', back_populates='videos') file_group_id = Column(BigInteger, ForeignKey('file_group.id', ondelete='CASCADE'), unique=True, nullable=False) file_group: FileGroup = relationship('FileGroup') def __repr__(self): v = None if self.video_path: v = repr(str(self.video_path.relative_to(get_media_directory()))) return f'