182 lines
4.7 KiB
Python
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
|