Multithread is an optionally asynchronous Python library for downloading files using several threads.
- Lightweight: one file, a little over 100 lines of code excluding license
- Extensive: the ability to pass your own sessions and your own arguments to each request means you don't need to wait for your desired feature to be implemented; anything you can do in aiohttp, you can do in multithread!
- Fast: benefit from the speed of aiohttp and multithreaded downloading!
Requirements:
- Python 3.5.3+
- aiohttp
- Tinche/aiofiles
- optional: tqdm
Use the package manager pip to install multithread.
For support for progress bars, install multithread[progress].
pip3 install multithread
import multithread
download_object = multithread.Download("http://url.com/file", filename)
download_object.start()
# passing headers (you can pass any other arguments that aiohttp.ClientSession.request can take as well)
download_object = multithread.Download("http://url.com/file", filename, aiohttp_args={"headers": {"a": "b", "c": "d"}})
download_object.start()
Downloader(self, url, file, threads=4, session=None, progress_bar=True, aiohttp_args={'method': 'GET'}, create_dir=True)
An optionally asynchronous multi-threaded downloader class using aiohttp
Attributes:
- url (str): The URL to download
- file (str or path-like object): The filename to write the download to.
- threads (int): The number of threads to use to download
- session (aiohttp.ClientSession): An existing session to use with aiohttp
- new_session (bool): True if a session was not passed, and the downloader created a new one
- progress_bar (bool): Whether to output a progress bar or not
- aiohttp_args (dict): Arguments to be passed in each aiohttp request. If you supply a Range header using this, it will be overwritten in fetch()
Downloader.__init__(self, url, file, threads=4, session=None, progress_bar=True, aiohttp_args={'method': 'GET'}, create_dir=True)
Assigns arguments to self for when asyncstart() or start() calls download.
All arguments are assigned directly to self except for:
- session: if not passed, a ClientSession is created
- aiohttp_args: if the key "method" does not exist, it is set to "GET"
- create_dir: see parameter description
Parameters:
- url (str): The URL to download
- file (str or path-like object): The filename to write the download to.
- threads (int): The number of threads to use to download
- session (aiohttp.ClientSession): An existing session to use with aiohttp
- progress_bar (bool): Whether to output a progress bar or not
- aiohttp_args (dict): Arguments to be passed in each aiohttp request. If you supply a Range header using this, it will be overwritten in fetch()
- create_dir (bool): If true, the directories encompassing the file will be created if they do not exist already.
Downloader.start(self)
Calls asyncstart() synchronously
Downloader.asyncstart(self)
Re-initializes file and calls download() with it. Closes session if necessary
Downloader.fetch(self, progress=False, filerange=(0, ''))
Individual thread for fetching files.
Parameters:
- progress (bool or tqdm.Progress): the progress bar (or lack thereof) to update
- filerange (tuple): the range of the file to get
Downloader.download(self)
Generates ranges and calls fetch() with them.
Any and all pull requests are welcome. As this is a small project, there are no strict standards, but please try to keep your code clean to a reasonable standard. Alternatively, if you would like to clean my code, that would be more than welcome!