wrolpi/modules/videos/schema.py
Roland aa203cc102
Moving non-video functions to wrolpi.common. Handling Channel/Downlaod relationship in Channel.update.
Removing default download freqeuncy so channels will not be downloaded without a url and frequency.

Adding channel unique url constraint.

Handling when a Channel's directory may still be relative in DB.

Adding TODOs to remove old favorites.

Removing outdated favorites from config after favorites have been created.

Testing that old-style favorited videos in the config are imported.

Removing channels_by_link.

Using list to store channels in config.

Moving channel import function into lib.

Supporting old channel import with links.

Bumping version for channel.link removal.

Removing all reference to Channel.link in app and api.

Adding relative property to MediaPathType.

Testing that a channel can be downloaded after it has a frequency added.

All tests pass.

Video and Channel tests pass without channel.link.

Removing channel.link usage in channel api.

Changing video Statistics page to About.
2022-04-29 19:09:25 -06:00

216 lines
3.9 KiB
Python

from dataclasses import dataclass, field
from datetime import date, datetime
from typing import List, Optional
from modules.videos.video.lib import DEFAULT_VIDEO_ORDER, VIDEO_QUERY_LIMIT
@dataclass
class ChannelPostRequest:
name: str
directory: str
calculate_duration: Optional[bool] = None
download_frequency: Optional[int] = None
generate_posters: Optional[bool] = None
match_regex: Optional[str] = None
mkdir: Optional[bool] = None
url: Optional[str] = None
source_id: Optional[str] = None
def __post_init__(self):
self.name = self.name.strip() or None
self.directory = self.directory.strip() or None
self.url = self.url.strip() if self.url else None
self.source_id = self.source_id.strip() if self.source_id else None
@dataclass
class ChannelPutRequest:
calculate_duration: Optional[bool] = None
directory: Optional[str] = None
download_frequency: Optional[int] = None
generate_posters: Optional[bool] = None
match_regex: Optional[str] = None
mkdir: Optional[bool] = None
name: Optional[str] = None
url: Optional[str] = None
def __post_init__(self):
self.name = self.name.strip() or None
self.directory = self.directory.strip() or None
self.url = self.url.strip() if self.url else None
self.match_regex = None if self.match_regex in ('None', '') else self.match_regex
@dataclass
class RefreshRequest:
channel_name: str
@dataclass
class ChannelModel:
id: int
url: str
name: str
match_regex: str
directory: str
@dataclass
class ChannelResponse:
channel = ChannelModel
@dataclass
class ChannelPostResponse:
success: str
@dataclass
class ChannelsChannelModel:
id: int
name: str
@dataclass
class ChannelsResponse:
channels: List[ChannelsChannelModel]
@dataclass
class StreamResponse:
success: str
stream_url: str
@dataclass
class Video:
id: int
description_path: str
ext: str
poster_path: str
source_id: str
title: str
upload_date: date
video_path: str
name: str
caption_path: str
idempotency: str
info_json_path: str
channel_id: int
@dataclass
class VideoWithChannel:
id: int
description_path: str
ext: str
poster_path: str
source_id: str
title: str
upload_date: date
video_path: str
name: str
caption_path: str
idempotency: str
info_json_path: str
channel_id: int
channel = ChannelModel
@dataclass
class ChannelVideosResponse:
videos: List[Video]
@dataclass
class ExtendedVideo(Video):
info_json: dict
@dataclass
class VideoResponse:
video = ExtendedVideo
@dataclass
class VideoSearchRequest:
search_str: Optional[str] = None
filters: List[str] = field(default_factory=list)
offset: Optional[int] = None
limit: Optional[int] = VIDEO_QUERY_LIMIT
order_by: Optional[str] = DEFAULT_VIDEO_ORDER
channel_id: Optional[int] = None
@dataclass
class VideoSearchResponse:
videos: List[VideoWithChannel]
tsquery: str
@dataclass
class PaginationQuery:
offset: int
@dataclass
class DirectoriesRequest:
search_str: Optional[str] = ''
@dataclass
class DirectoriesResponse:
directories: List[str]
@dataclass
class FavoriteRequest:
video_id: int
favorite: bool
@dataclass
class FavoriteResponse:
video_id: int
favorite: datetime
@dataclass
class WROLModeRequest:
enabled: bool
@dataclass
class VideoStatistics:
videos: int
favorites: int
week: int
month: int
year: int
sum_duration: int
sum_size: int
max_size: int
@dataclass
class ChannelStatistics:
channels: int
@dataclass
class VideosStatisticsResponse:
videos = VideoStatistics
channels = ChannelStatistics
@dataclass
class CensoredVideoRequest:
limit: int
offset: int
@dataclass
class CensoredVideoResponse:
videos: List[VideoWithChannel]