2018-07-27 11:52:21 -07:00
|
|
|
import os
|
2020-03-27 06:50:08 -07:00
|
|
|
import copy
|
|
|
|
import logging
|
2018-07-27 11:52:21 -07:00
|
|
|
|
|
|
|
from anime_downloader.downloader.base_downloader import BaseDownloader
|
2018-10-14 23:41:15 -07:00
|
|
|
from anime_downloader import session
|
2020-03-27 06:50:08 -07:00
|
|
|
import requests
|
|
|
|
import requests_cache
|
2018-07-27 11:52:21 -07:00
|
|
|
|
2018-10-16 02:59:53 -07:00
|
|
|
session = session.get_session()
|
2020-03-27 06:50:08 -07:00
|
|
|
session = requests
|
|
|
|
logger = logging.getLogger(__name__)
|
2018-10-16 02:59:53 -07:00
|
|
|
|
2020-09-13 00:49:11 -07:00
|
|
|
|
2018-07-27 11:52:21 -07:00
|
|
|
class HTTPDownloader(BaseDownloader):
|
|
|
|
def _download(self):
|
2020-03-27 06:50:08 -07:00
|
|
|
logger.warning('Using internal downloader which might be slow. Use aria2 for full bandwidth.')
|
|
|
|
if self.range_size is None:
|
2018-07-27 11:52:21 -07:00
|
|
|
self._non_range_download()
|
|
|
|
else:
|
|
|
|
self._ranged_download()
|
|
|
|
|
|
|
|
def _ranged_download(self):
|
2020-03-27 06:50:08 -07:00
|
|
|
http_chunksize = self.range_size
|
2018-07-27 11:52:21 -07:00
|
|
|
|
|
|
|
range_start = 0
|
|
|
|
range_end = http_chunksize
|
|
|
|
|
2020-03-27 06:50:08 -07:00
|
|
|
url = self.source.stream_url
|
2020-08-27 05:08:11 -07:00
|
|
|
headers = self.source.headers
|
|
|
|
if 'user-agent' not in headers:
|
2021-05-23 13:50:55 -07:00
|
|
|
headers['user-agent'] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0.1) Gecko/20100101 Firefox/88.0.1"
|
2020-08-27 05:08:11 -07:00
|
|
|
|
2020-03-27 06:50:08 -07:00
|
|
|
if self.source.referer:
|
|
|
|
headers['Referer'] = self.source.referer
|
|
|
|
|
2018-07-27 11:52:21 -07:00
|
|
|
# Make a new file, maybe not the best way
|
|
|
|
with open(self.path, 'w'):
|
|
|
|
pass
|
|
|
|
|
2020-03-27 06:50:08 -07:00
|
|
|
r = session.get(url, headers=headers, stream=True)
|
|
|
|
while self.downloaded < self._total_size:
|
|
|
|
r = session.get(url,
|
|
|
|
headers=set_range(range_start, range_end, headers),
|
2018-10-16 02:59:53 -07:00
|
|
|
stream=True)
|
2018-07-27 11:52:21 -07:00
|
|
|
if r.status_code == 206:
|
|
|
|
with open(self.path, 'ab') as f:
|
|
|
|
for chunk in r.iter_content(chunk_size=self.chunksize):
|
|
|
|
if chunk:
|
|
|
|
f.write(chunk)
|
|
|
|
self.report_chunk_downloaded()
|
|
|
|
|
|
|
|
if range_end == '':
|
|
|
|
break
|
|
|
|
range_start = os.stat(self.path).st_size
|
|
|
|
range_end += http_chunksize
|
2020-03-27 06:50:08 -07:00
|
|
|
if range_end > self._total_size:
|
2018-07-27 11:52:21 -07:00
|
|
|
range_end = ''
|
|
|
|
|
|
|
|
def _non_range_download(self):
|
2020-03-27 06:50:08 -07:00
|
|
|
url = self.source.stream_url
|
|
|
|
headers = {
|
2021-05-23 13:50:55 -07:00
|
|
|
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0.1) Gecko/20100101 Firefox/88.0.1"
|
2020-03-27 06:50:08 -07:00
|
|
|
}
|
|
|
|
if self.source.referer:
|
|
|
|
headers['Referer'] = self.source.referer
|
|
|
|
r = session.get(url, headers=headers, stream=True)
|
2018-07-27 11:52:21 -07:00
|
|
|
|
|
|
|
if r.status_code == 200:
|
|
|
|
with open(self.path, 'wb') as f:
|
|
|
|
for chunk in r.iter_content(chunk_size=self.chunksize):
|
|
|
|
if chunk:
|
|
|
|
f.write(chunk)
|
|
|
|
self.report_chunk_downloaded()
|
|
|
|
|
|
|
|
|
2020-03-27 06:50:08 -07:00
|
|
|
def set_range(start=0, end='', headers=None):
|
|
|
|
if headers is None:
|
|
|
|
headers = {}
|
|
|
|
headers = copy.copy(headers)
|
2018-07-27 11:52:21 -07:00
|
|
|
|
|
|
|
headers['Range'] = 'bytes={}-{}'.format(start, end)
|
|
|
|
return headers
|