anime-downloader/anime_downloader/downloader/http_downloader.py

68 lines
2.1 KiB
Python
Raw Normal View History

2018-07-27 11:52:21 -07:00
import os
from anime_downloader.downloader.base_downloader import BaseDownloader
from anime_downloader import session
2018-07-27 11:52:21 -07:00
2018-10-16 02:59:53 -07:00
session = session.get_session()
2018-07-27 11:52:21 -07:00
class HTTPDownloader(BaseDownloader):
def _download(self):
2019-05-08 09:49:12 -07:00
if self.options['range_size'] is None:
2018-07-27 11:52:21 -07:00
self._non_range_download()
else:
self._ranged_download()
def _ranged_download(self):
2019-05-08 09:49:12 -07:00
http_chunksize = self.options['range_size']
2018-07-27 11:52:21 -07:00
range_start = 0
range_end = http_chunksize
# Make a new file, maybe not the best way
with open(self.path, 'w'):
pass
2019-05-22 10:04:27 -07:00
r = session.get(self.url, headers={
'referer': self.referer}, stream=True)
2018-07-27 11:52:21 -07:00
while self.downloaded < self.total_size:
2018-10-16 02:59:53 -07:00
r = session.get(self.url,
2019-05-22 10:04:27 -07:00
headers=set_range(
range_start, range_end, self.referer),
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
if range_end > self.total_size:
range_end = ''
def _non_range_download(self):
2019-05-22 10:04:27 -07:00
r = session.get(self.url, headers={
'referer': self.referer}, 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()
def set_range(start=0, end='', referer=None):
2018-07-27 11:52:21 -07:00
headers = {
2019-05-22 10:04:27 -07:00
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101"
"Firefox/56.0",
'referer': referer
2018-07-27 11:52:21 -07:00
}
headers['Range'] = 'bytes={}-{}'.format(start, end)
return headers