7 from urlparse import urlparse
8 from hentai.logger import logger
11 class Downloader(object):
14 def __new__(cls, *args, **kwargs):
16 cls._instance = super(Downloader, cls).__new__(cls, *args, **kwargs)
19 def __init__(self, path='', thread=1):
20 if not isinstance(thread, (int, )) or thread < 1 or thread > 10:
21 raise ValueError('Invalid threads count')
23 self.thread_count = thread
26 def _download(self, url, folder='', filename=''):
27 if not os.path.exists(folder):
31 logger.error('Error %s' % str(e))
34 filename = filename if filename else os.path.basename(urlparse(url).path)
36 with open(os.path.join(folder, filename), "wb") as f:
37 response = requests.get(url, stream=True)
38 length = response.headers.get('content-length')
40 f.write(response.content)
42 for chunk in response.iter_content(2048):
44 except (os.error, IOError), e:
45 logger.error('Error %s' % e)
51 logger.info('%s %s downloaded.' % (threading.currentThread().getName(), url))
53 def _download_thread(self, queue, folder=''):
59 url = queue.get(False)
60 logger.info('%s downloading: %s ...' % (threading.currentThread().getName(), url))
61 self._download(url, folder)
65 def download(self, queue, folder=''):
66 if not isinstance(folder, (str, unicode)):
70 folder = '%s/%s' % (self.path, folder)
72 if os.path.exists(path=folder):
73 logger.warn('Path \'%s\' already exist' % folder)
75 logger.warn('Path \'%s\' not exist' % folder)
77 for i in range(self.thread_count):
78 _ = threading.Thread(target=self._download_thread, args=(queue, folder, ))
80 self.threads.append(_)
82 for thread in self.threads:
85 for thread in self.threads:
90 logger.log(15, u'🍺 All done, saved to \'%s\'!' % folder)