import json import pathlib from datetime import datetime from pathlib import Path from typing import Optional, Generator, Dict, List from sqlalchemy import Column, Integer, String, Boolean, JSON, Date, ARRAY, ForeignKey from sqlalchemy.orm import relationship, Session from sqlalchemy.orm.collections import InstrumentedList 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 from wrolpi.downloader import Download, download_manager from wrolpi.errors import UnknownVideo from wrolpi.files.lib import refresh_directory_files_recursively, glob_shared_stem, split_path_stem_and_suffix from wrolpi.files.models import File from wrolpi.media_path import MediaPathType from wrolpi.vars import PYTEST logger = logger.getChild(__name__) class Video(ModelHelper, Base): __tablename__ = 'video' id = Column(Integer, primary_key=True) channel_id = Column(Integer, ForeignKey('channel.id')) channel = relationship('Channel', primaryjoin='Video.channel_id==Channel.id', back_populates='videos') validated = Column(Boolean, default=False) censored = Column(Boolean, default=False) duration = Column(Integer) favorite = Column(TZDateTime) modification_datetime = Column(TZDateTime) size = Column(Integer) source_id = Column(String) title = Column(String) upload_date = Column(TZDateTime) url = Column(String) view_count = Column(Integer) viewed = Column(TZDateTime) # Associated Files caption_path: pathlib.Path = Column(MediaPathType, ForeignKey('file.path', ondelete='CASCADE')) caption_file: File = relationship('File', primaryjoin='Video.caption_path==File.path') info_json_path: pathlib.Path = Column(MediaPathType, ForeignKey('file.path', ondelete='CASCADE')) info_json_file: File = relationship('File', primaryjoin='Video.info_json_path==File.path') poster_path: pathlib.Path = Column(MediaPathType, ForeignKey('file.path', ondelete='CASCADE')) poster_file: File = relationship('File', primaryjoin='Video.poster_path==File.path') video_path: pathlib.Path = Column(MediaPathType, ForeignKey('file.path', ondelete='CASCADE')) video_file: File = relationship('File', primaryjoin='Video.video_path==File.path') def __repr__(self): v = self.video_file if self.video_path: video_path = self.video_path.path if hasattr(self.video_path, 'path') else self.video_path v = video_path.relative_to(get_media_directory()) return f'