feat: Add server switching for 9anime
parent
96e631b175
commit
16de16f209
|
@ -103,3 +103,4 @@ ENV/
|
||||||
|
|
||||||
.pytest_cache
|
.pytest_cache
|
||||||
*.sqlite
|
*.sqlite
|
||||||
|
/anime_downloader/__main__.py
|
||||||
|
|
3
Pipfile
3
Pipfile
|
@ -4,7 +4,7 @@ verify_ssl = true
|
||||||
name = "pypi"
|
name = "pypi"
|
||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
anime-downloader = {editable = true, path = "."}
|
anime-downloader = {editable = true,path = "."}
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
twine = "*"
|
twine = "*"
|
||||||
|
@ -14,3 +14,4 @@ radon = "*"
|
||||||
"flake8" = "*"
|
"flake8" = "*"
|
||||||
httpretty = "*"
|
httpretty = "*"
|
||||||
pylint = "*"
|
pylint = "*"
|
||||||
|
python-lanugage-server = {extras = ["all"],version = "*"}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import click
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from anime_downloader import util
|
import click
|
||||||
from anime_downloader import session
|
|
||||||
from anime_downloader.sites import get_anime_class
|
from anime_downloader import session, util
|
||||||
from anime_downloader.__version__ import __version__
|
from anime_downloader.__version__ import __version__
|
||||||
|
from anime_downloader.sites import get_anime_class
|
||||||
|
|
||||||
logger = logging.Logger(__name__)
|
logger = logging.Logger(__name__)
|
||||||
|
|
||||||
|
@ -47,7 +47,8 @@ echo = click.echo
|
||||||
@click.option(
|
@click.option(
|
||||||
'--provider',
|
'--provider',
|
||||||
help='The anime provider (website) for search.',
|
help='The anime provider (website) for search.',
|
||||||
type=click.Choice(['9anime', 'kissanime', 'twist.moe', 'animepahe', 'kisscartoon', 'masterani', 'gogoanime'])
|
type=click.Choice(['9anime', 'kissanime', 'twist.moe',
|
||||||
|
'animepahe', 'kisscartoon', 'masterani', 'gogoanime'])
|
||||||
)
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
'--external-downloader', '-xd',
|
'--external-downloader', '-xd',
|
||||||
|
@ -86,7 +87,6 @@ def command(ctx, anime_url, episode_range, url, player, skip_download, quality,
|
||||||
|
|
||||||
anime = cls(anime_url, quality=quality,
|
anime = cls(anime_url, quality=quality,
|
||||||
fallback_qualities=fallback_qualities)
|
fallback_qualities=fallback_qualities)
|
||||||
|
|
||||||
logger.info('Found anime: {}'.format(anime.title))
|
logger.info('Found anime: {}'.format(anime.title))
|
||||||
|
|
||||||
animes = util.parse_ep_str(anime, episode_range)
|
animes = util.parse_ep_str(anime, episode_range)
|
||||||
|
@ -109,18 +109,21 @@ def command(ctx, anime_url, episode_range, url, player, skip_download, quality,
|
||||||
util.play_episode(episode, player=player)
|
util.play_episode(episode, player=player)
|
||||||
|
|
||||||
if not skip_download:
|
if not skip_download:
|
||||||
|
downloader_session = session.DownloaderSession()
|
||||||
|
downloader = 'http'
|
||||||
if external_downloader:
|
if external_downloader:
|
||||||
logger.info('Downloading episode {} of {}'.format(
|
logger.info('Downloading episode {} of {}'.format(
|
||||||
episode.ep_no, anime.title)
|
episode.ep_no, anime.title)
|
||||||
)
|
)
|
||||||
util.external_download(external_downloader, episode,
|
downloader = external_downloader
|
||||||
file_format, path=download_dir)
|
|
||||||
continue
|
|
||||||
if chunk_size is not None:
|
if chunk_size is not None:
|
||||||
chunk_size *= 1e6
|
chunk_size *= 1e6
|
||||||
chunk_size = int(chunk_size)
|
chunk_size = int(chunk_size)
|
||||||
episode.download(force=force_download,
|
|
||||||
path=download_dir,
|
downloader_session.get(downloader)
|
||||||
format=file_format,
|
downloader.download(episode.source(),
|
||||||
range_size=chunk_size)
|
force=force_download,
|
||||||
|
path=download_dir,
|
||||||
|
format=file_format,
|
||||||
|
range_size=chunk_size)
|
||||||
print()
|
print()
|
||||||
|
|
|
@ -23,6 +23,9 @@ DEFAULT_CONFIG = {
|
||||||
'quality': '720p',
|
'quality': '720p',
|
||||||
'log_level': 'INFO',
|
'log_level': 'INFO',
|
||||||
'provider': '9anime',
|
'provider': '9anime',
|
||||||
|
},
|
||||||
|
"nineanime": {
|
||||||
|
"server": "mp4upload",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,11 +47,13 @@ class _Config:
|
||||||
self._CONFIG = self._read_config()
|
self._CONFIG = self._read_config()
|
||||||
|
|
||||||
def update(gkey):
|
def update(gkey):
|
||||||
|
if gkey not in self._CONFIG:
|
||||||
|
self._CONFIG[gkey] = {}
|
||||||
for key, val in DEFAULT_CONFIG[gkey].items():
|
for key, val in DEFAULT_CONFIG[gkey].items():
|
||||||
if key not in self._CONFIG[gkey].keys():
|
if key not in self._CONFIG[gkey].keys():
|
||||||
self._CONFIG[gkey][key] = val
|
self._CONFIG[gkey][key] = val
|
||||||
|
|
||||||
for key in ['dl', 'watch']:
|
for key in DEFAULT_CONFIG.keys():
|
||||||
update(key)
|
update(key)
|
||||||
self.write()
|
self.write()
|
||||||
|
|
||||||
|
|
|
@ -14,24 +14,29 @@ class BaseDownloader:
|
||||||
if options is None:
|
if options is None:
|
||||||
options = {}
|
options = {}
|
||||||
self.options = options
|
self.options = options
|
||||||
|
# TODO: replace
|
||||||
|
self.referer = self.options.get('referer', '')
|
||||||
|
|
||||||
self.chunksize = 16384
|
self.chunksize = 16384
|
||||||
|
self._total_size = None
|
||||||
|
self.url = None
|
||||||
|
|
||||||
def check_if_exists(self):
|
def check_if_exists(self):
|
||||||
# Added Referer Header as kwik needd it.
|
# Added Referer Header as kwik needd it.
|
||||||
r = session.get_session().get(
|
r = session.get_session().get(
|
||||||
self.url, headers={'referer': self.referer}, stream=True)
|
self.url, headers={'referer': self.referer}, stream=True)
|
||||||
|
|
||||||
self.total_size = int(r.headers['Content-length'])
|
self._total_size = int(r.headers['Content-length'])
|
||||||
if os.path.exists(self.path):
|
if os.path.exists(self.path):
|
||||||
if abs(os.stat(self.path).st_size - self.total_size) < 10 \
|
if abs(os.stat(self.path).st_size - self._total_size) < 10 \
|
||||||
and not self.option['force']:
|
and not self.options['force']:
|
||||||
logger.warning('File already downloaded. Skipping download.')
|
logger.warning('File already downloaded. Skipping download.')
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
os.remove(self.path)
|
os.remove(self.path)
|
||||||
|
|
||||||
def download(self, url, path, options=None):
|
def download(self, url, path, options=None):
|
||||||
|
# TODO: Clean this up
|
||||||
self.pre_process()
|
self.pre_process()
|
||||||
self.url = url
|
self.url = url
|
||||||
logger.info(path)
|
logger.info(path)
|
||||||
|
@ -62,7 +67,7 @@ class BaseDownloader:
|
||||||
|
|
||||||
def report_chunk_downloaded(self):
|
def report_chunk_downloaded(self):
|
||||||
self.downloaded += self.chunksize
|
self.downloaded += self.chunksize
|
||||||
write_status(self.downloaded, self.total_size, self.start_time)
|
write_status(self.downloaded, self._total_size, self.start_time)
|
||||||
|
|
||||||
|
|
||||||
def write_status(downloaded, total_size, start_time):
|
def write_status(downloaded, total_size, start_time):
|
||||||
|
|
|
@ -23,10 +23,12 @@ class HTTPDownloader(BaseDownloader):
|
||||||
with open(self.path, 'w'):
|
with open(self.path, 'w'):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
r = session.get(self.url, headers={'referer': self.referer}, stream=True)
|
r = session.get(self.url, headers={
|
||||||
|
'referer': self.referer}, stream=True)
|
||||||
while self.downloaded < self.total_size:
|
while self.downloaded < self.total_size:
|
||||||
r = session.get(self.url,
|
r = session.get(self.url,
|
||||||
headers=set_range(range_start, range_end, self.referer),
|
headers=set_range(
|
||||||
|
range_start, range_end, self.referer),
|
||||||
stream=True)
|
stream=True)
|
||||||
if r.status_code == 206:
|
if r.status_code == 206:
|
||||||
with open(self.path, 'ab') as f:
|
with open(self.path, 'ab') as f:
|
||||||
|
@ -43,7 +45,8 @@ class HTTPDownloader(BaseDownloader):
|
||||||
range_end = ''
|
range_end = ''
|
||||||
|
|
||||||
def _non_range_download(self):
|
def _non_range_download(self):
|
||||||
r = session.get(self.url, headers={'referer': self.referer}, stream=True)
|
r = session.get(self.url, headers={
|
||||||
|
'referer': self.referer}, stream=True)
|
||||||
|
|
||||||
if r.status_code == 200:
|
if r.status_code == 200:
|
||||||
with open(self.path, 'wb') as f:
|
with open(self.path, 'wb') as f:
|
||||||
|
@ -55,9 +58,9 @@ class HTTPDownloader(BaseDownloader):
|
||||||
|
|
||||||
def set_range(start=0, end='', referer=None):
|
def set_range(start=0, end='', referer=None):
|
||||||
headers = {
|
headers = {
|
||||||
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101"
|
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101"
|
||||||
"Firefox/56.0",
|
"Firefox/56.0",
|
||||||
'referer' : referer
|
'referer': referer
|
||||||
}
|
}
|
||||||
|
|
||||||
headers['Range'] = 'bytes={}-{}'.format(start, end)
|
headers['Range'] = 'bytes={}-{}'.format(start, end)
|
||||||
|
|
|
@ -50,7 +50,7 @@ def get_session(custom_session=None):
|
||||||
return _session
|
return _session
|
||||||
|
|
||||||
|
|
||||||
class _DownloaderSession:
|
class DownloaderSession:
|
||||||
external_downloaders = {
|
external_downloaders = {
|
||||||
"aria2": {
|
"aria2": {
|
||||||
"executable": "aria2c",
|
"executable": "aria2c",
|
||||||
|
@ -74,7 +74,7 @@ class _DownloaderSession:
|
||||||
# TODO: Add ability to add downloaders using config
|
# TODO: Add ability to add downloaders using config
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def get(self, key, **options):
|
||||||
# HACK: Because of circular dependency
|
# HACK: Because of circular dependency
|
||||||
from anime_downloader import downloader
|
from anime_downloader import downloader
|
||||||
# HACK: This has to obtained like this because this variable is
|
# HACK: This has to obtained like this because this variable is
|
||||||
|
@ -93,5 +93,3 @@ class _DownloaderSession:
|
||||||
self._cache[key] = downloader.get_downloader('ext')(
|
self._cache[key] = downloader.get_downloader('ext')(
|
||||||
options=self.external_downloaders[key])
|
options=self.external_downloaders[key])
|
||||||
return self._cache[key]
|
return self._cache[key]
|
||||||
|
|
||||||
DownloaderSession = _DownloaderSession()
|
|
||||||
|
|
|
@ -64,6 +64,7 @@ def setup(func):
|
||||||
headers=default_headers,
|
headers=default_headers,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
res.raise_for_status()
|
res.raise_for_status()
|
||||||
|
logger.debug(res.url)
|
||||||
# logger.debug(res.text)
|
# logger.debug(res.text)
|
||||||
if logger.getEffectiveLevel() == logging.DEBUG:
|
if logger.getEffectiveLevel() == logging.DEBUG:
|
||||||
_log_response_body(res)
|
_log_response_body(res)
|
||||||
|
|
Loading…
Reference in New Issue