From 8199967c5c2840d9932b2e05881ba0ac001e4bde Mon Sep 17 00:00:00 2001 From: AbdullahM0hamed <25087116+AbdullahM0hamed@users.noreply.github.com> Date: Sun, 7 Feb 2021 17:54:31 +0000 Subject: [PATCH] Add -s/--sub and -d/--dub flags --- anime_downloader/commands/dl.py | 21 +++++++++++++++++++-- anime_downloader/sites/anime.py | 19 ++++++++++++++----- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/anime_downloader/commands/dl.py b/anime_downloader/commands/dl.py index e705066..cbb79d5 100644 --- a/anime_downloader/commands/dl.py +++ b/anime_downloader/commands/dl.py @@ -79,12 +79,23 @@ sitenames = [v[1] for v in ALL_ANIME_SITES] help="Set the speed limit (in KB/s or MB/s) for downloading when using aria2c", metavar='K/M' ) +@click.option( + "--sub", "-s", type=bool, is_flag=True, + help="If flag is set, it downloads the subbed version of an anime if the provider supports it. Must not be used with the --dub/-d flag") +@click.option( + "--dub", "-d", type=bool, is_flag=True, + help="If flag is set, it downloads the dubbed version of anime if the provider supports it. Must not be used with the --sub/-s flag") @click.pass_context def command(ctx, anime_url, episode_range, url, player, skip_download, quality, force_download, download_dir, file_format, provider, - external_downloader, chunk_size, disable_ssl, fallback_qualities, choice, skip_fillers, speed_limit): + external_downloader, chunk_size, disable_ssl, fallback_qualities, choice, skip_fillers, speed_limit, sub, dub): """ Download the anime using the url or search for it. """ + + if sub and dub: + raise click.UsageError( + "--dub/-d and --sub/-s flags cannot be used together") + query = anime_url[:] util.print_info(__version__) @@ -98,8 +109,14 @@ def command(ctx, anime_url, episode_range, url, player, skip_download, quality, anime_url, _ = util.search(anime_url, provider, choice) cls = get_anime_class(anime_url) + subbed = None + + if sub or dub: + subbed = subbed is not None + anime = cls(anime_url, quality=quality, - fallback_qualities=fallback_qualities) + fallback_qualities=fallback_qualities, + subbed=subbed) logger.info('Found anime: {}'.format(anime.title)) animes = util.parse_ep_str(anime, episode_range) diff --git a/anime_downloader/sites/anime.py b/anime_downloader/sites/anime.py index 5006924..34cdbbf 100644 --- a/anime_downloader/sites/anime.py +++ b/anime_downloader/sites/anime.py @@ -43,6 +43,7 @@ class Anime: title = '' meta = dict() subclasses = {} + subbed = None QUALITIES = ['360p', '480p', '720p', '1080p'] @classmethod @@ -64,8 +65,10 @@ class Anime: def __init__(self, url=None, quality='720p', fallback_qualities=None, - _skip_online_data=False): + _skip_online_data=False, + subbed=None): self.url = url + self.subbed = subbed if fallback_qualities is None: fallback_qualities = ['720p', '480p', '360p'] @@ -342,7 +345,8 @@ class AnimeEpisode: except IndexError: raise NotFoundError("No episode sources found.") - ext = get_extractor(sitename)(url, quality=self.quality, headers=self.headers) + ext = get_extractor(sitename)( + url, quality=self.quality, headers=self.headers) self._sources[index] = ext return ext @@ -377,19 +381,24 @@ class AnimeEpisode: Using the example above, this function will return: [('no_extractor', 'https://twist.moe/anime/...')] as it prioritizes preferred language over preferred server """ + if self._parent and self._parent.subbed is not None: + version = "subbed" if self._parent.subbed else "dubbed" + else: + version = self.config.get('version', 'subbed') - version = self.config.get('version', 'subbed') # TODO add a flag for this servers = self.config.get('servers', ['']) logger.debug('Data : {}'.format(data)) # Sorts the dicts by preferred server in config - sorted_by_server = sorted(data, key=lambda x: servers.index(x['server']) if x['server'] in servers else len(data)) + sorted_by_server = sorted(data, key=lambda x: servers.index( + x['server']) if x['server'] in servers else len(data)) # Sorts the above by preferred language # resulting in a list with the dicts sorted by language and server # with language being prioritized over server - sorted_by_lang = list(sorted(sorted_by_server, key=lambda x: x['version'] == version, reverse=True)) + sorted_by_lang = list( + sorted(sorted_by_server, key=lambda x: x['version'] == version, reverse=True)) logger.debug('Sorted sources : {}'.format(sorted_by_lang)) return '' if not sorted_by_lang else [(sorted_by_lang[0]['extractor'], sorted_by_lang[0]['url'])]