29 lines
914 B
Python
29 lines
914 B
Python
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)
|