from asyncio import AbstractEventLoop from os import stat from urllib.request import urlretrieve from entity import File class Downloader: def __init__(self, loop: AbstractEventLoop) -> None: self.loop = loop def progress(self, progress, block_num: int, block_size: int, total_size: int): self.loop.create_task(progress(block_num * block_size, total_size)) async def download(self, url: str, fileName: str, progress=None) -> File: await self.loop.run_in_executor( None, lambda: urlretrieve( url, fileName, lambda block_num, block_size, total_size: self.progress( progress, block_num, block_size, total_size ) if progress is not None else None, ), ) return File(name=fileName, size=stat(fileName).st_size)