Files
freevine/utils/options.py
2023-12-23 14:59:31 +01:00

182 lines
4.7 KiB
Python

from __future__ import annotations
import logging
import sys
from utils.utilities import (
is_title_match,
is_url,
set_range,
)
class Options:
def __init__(self, cls: object) -> None:
self.episode = cls.episode
self.season = cls.season
self.titles = cls.titles
self.url = cls.url
self.tmp = cls.tmp
self.log = logging.getLogger()
def list_titles(self, series: object) -> str:
for episode in series:
self.log.info(str(episode))
exit(0)
def get_episode(self, series: object) -> None:
if "-" in self.episode:
return self.get_episode_range(series, self.episode)
if "," in self.episode:
return self.get_episode_mix(series, self.episode)
episode = next(
(i for i in series if self.episode.lower() in str(i).lower()), None
)
if episode is not None and self.titles:
self.log.info(f"{str(episode)}")
exit(0)
if episode is not None:
return [episode]
else:
self.log.info(f"{self.episode} was not found")
exit(0)
def get_episode_range(self, series: object, episodes: str) -> None:
episode_range = set_range(episodes)
downloads = []
for episode in series:
if any(i.lower() in str(episode).lower() for i in episode_range):
downloads.append(episode)
if self.titles:
for episode in downloads:
self.log.info(f"{str(episode)}")
exit(0)
return downloads
def get_episode_mix(self, series: object, episodes: str) -> None:
episode_mix = [x for x in episodes.split(",")]
downloads = []
for episode in series:
if any(i.lower() in str(episode).lower() for i in episode_mix):
downloads.append(episode)
if self.titles:
for episode in downloads:
self.log.info(f"{str(episode)}")
exit(0)
return downloads
def get_season(self, series: object) -> None:
if "," in self.season:
return self.get_season_mix(series, self.season)
downloads = []
for episode in series:
if self.season in str(episode):
downloads.append(episode)
if self.titles:
for episode in downloads:
self.log.info(f"{str(episode)}")
exit(0)
return downloads
def get_season_mix(self, series: object, seasons: str):
season_mix = [x for x in seasons.split(",")]
downloads = []
for episode in series:
if any(i in str(episode) for i in season_mix):
downloads.append(episode)
if self.titles:
for episode in downloads:
self.log.info(f"{str(episode)}")
exit(0)
return downloads
def get_complete(self, series: object) -> None:
downloads = []
for episode in series:
downloads.append(episode)
if self.titles:
for episode in downloads:
self.log.info(f"{str(episode)}")
exit(0)
return downloads
def get_movie(self, movies: object) -> None:
downloads = []
for movie in movies:
downloads.append(movie)
if self.titles:
for movie in downloads:
self.log.info(f"{str(movie)}")
exit(0)
return downloads
def get_downloads(stream: object) -> tuple:
if stream.url and not any(
[stream.episode, stream.season, stream.complete, stream.movie, stream.titles]
):
stream.log.error(
"URL is missing an argument. See 'get --help' for more information"
)
sys.exit(1)
if (
hasattr(stream, "episode_re")
and is_url(stream.episode)
and is_title_match(stream.episode, stream.episode_re)
):
downloads, title = stream.get_episode_from_url(stream.episode)
elif is_url(stream.episode):
downloads, title = stream.get_episode_from_url(stream.episode)
else:
options = Options(stream)
content, title = stream.get_content(stream.url)
if stream.episode:
downloads = options.get_episode(content)
if stream.season:
downloads = options.get_season(content)
if stream.complete:
downloads = options.get_complete(content)
if stream.movie:
downloads = options.get_movie(content)
if stream.titles:
options.list_titles(content)
if not downloads:
stream.log.error(
"Requested data returned empty. See 'get --help' for more information"
)
return downloads, title