add fallback qualities

master
Vishnunarayan K I 2018-08-06 21:16:58 +05:30
parent c1c139d2c6
commit 52dc38ed19
4 changed files with 29 additions and 6 deletions

View File

@ -46,6 +46,9 @@ def cli():
@click.option(
'--quality', '-q', type=click.Choice(['360p', '480p', '720p', '1080p']),
help='Specify the quality of episode. Default-720p')
@click.option(
'--fallback-qualities', '-fq', cls=util.ClickListOption,
help='Specifiy the order of fallback qualities as a list.')
@click.option(
'--force-download', '-f', is_flag=True,
help='Force downloads even if file exists')
@ -78,7 +81,7 @@ def cli():
@click.pass_context
def dl(ctx, anime_url, episode_range, url, player, skip_download, quality,
force_download, log_level, download_dir, file_format, provider,
external_downloader, chunk_size):
external_downloader, chunk_size, fallback_qualities):
""" Download the anime using the url or search for it.
"""
@ -92,7 +95,8 @@ def dl(ctx, anime_url, episode_range, url, player, skip_download, quality,
cls = get_anime_class(anime_url)
try:
anime = cls(anime_url, quality=quality)
anime = cls(anime_url, quality=quality,
fallback_qualities=fallback_qualities)
except Exception as e:
if log_level != 'DEBUG':
echo(click.style(str(e), fg='red'))

View File

@ -12,6 +12,7 @@ DEFAULT_CONFIG = {
'skip_download': False,
'download_dir': '.',
'quality': '720p',
'fallback_qualities': ['720p', '480p', '360p'],
'force_download': False,
'log_level': 'INFO',
'file_format': '{anime_title}/{anime_title}_{ep_no}',

View File

@ -25,8 +25,11 @@ class BaseAnime:
def search(cls, query):
return
def __init__(self, url=None, quality='720p', _skip_online_data=False):
def __init__(self, url=None, quality='720p',
fallback_qualities=['720p', '480p', '360p'],
_skip_online_data=False):
self.url = url
self._fallback_qualities = fallback_qualities
if quality in self.QUALITIES:
self.quality = quality
@ -121,8 +124,11 @@ class BaseEpisode:
self.source().stream_url
except NotFoundError:
# Issue #28
qualities = copy.copy(self.QUALITIES)
qualities.remove(self.quality)
qualities = copy.copy(self._parent._fallback_qualities)
try:
qualities.remove(self.quality)
except ValueError:
pass
for quality in qualities:
logging.warning('Quality {} not found. Trying {}.'.format(
self.quality, quality))
@ -134,7 +140,7 @@ class BaseEpisode:
break
except NotFoundError:
# Issue #28
qualities.remove(self.quality)
# qualities.remove(self.quality)
pass
def source(self, index=0):

View File

@ -9,6 +9,7 @@ import re
import os
import errno
import time
import ast
from anime_downloader.sites import get_anime_class
from anime_downloader.const import desktop_headers
@ -179,3 +180,14 @@ def make_dir(path):
except OSError as e:
if e.errno != errno.EEXIST:
raise
class ClickListOption(click.Option):
def type_cast_value(self, ctx, value):
try:
if isinstance(value, list):
return value
return ast.literal_eval(value)
except:
raise click.BadParameter(value)