71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
import os
|
|
import time
|
|
import logging
|
|
import sys
|
|
|
|
from anime_downloader import util
|
|
from anime_downloader import session
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class BaseDownloader:
|
|
def __init__(self, source, path, force, range_size=None):
|
|
logger.info(path)
|
|
|
|
self.url = source.stream_url
|
|
self.referer = source.referer
|
|
self.path = path
|
|
self.range_size = range_size
|
|
|
|
util.make_dir(path.rsplit('/', 1)[0])
|
|
|
|
self.chunksize = 16384
|
|
|
|
# Added Referer Header as kwik needd it.
|
|
r = session.get_session().get(
|
|
self.url, headers={'referer': self.referer}, stream=True)
|
|
|
|
self.total_size = int(r.headers['Content-length'])
|
|
if os.path.exists(path):
|
|
if abs(os.stat(path).st_size - self.total_size) < 10 and not force:
|
|
logger.warning('File already downloaded. Skipping download.')
|
|
return
|
|
else:
|
|
os.remove(path)
|
|
|
|
def download(self):
|
|
self.pre_process()
|
|
|
|
self.start_time = time.time()
|
|
self.downloaded = 0
|
|
self._download()
|
|
|
|
self.post_process()
|
|
|
|
def _download(self):
|
|
raise NotImplementedError
|
|
|
|
def pre_process(self):
|
|
pass
|
|
|
|
def post_process(self):
|
|
pass
|
|
|
|
def report_chunk_downloaded(self):
|
|
self.downloaded += self.chunksize
|
|
write_status(self.downloaded, self.total_size, self.start_time)
|
|
|
|
|
|
def write_status(downloaded, total_size, start_time):
|
|
elapsed_time = time.time()-start_time
|
|
rate = (downloaded/1024)/elapsed_time if elapsed_time else 'x'
|
|
downloaded = float(downloaded)/1048576
|
|
total_size = float(total_size)/1048576
|
|
|
|
status = 'Downloaded: {0:.2f}MB/{1:.2f}MB, Rate: {2:.2f}KB/s'.format(
|
|
downloaded, total_size, rate)
|
|
|
|
sys.stdout.write("\r" + status + " "*5 + "\r")
|
|
sys.stdout.flush()
|