from tqdm import tqdm import httpx from app.utils.uploader import ChunkUploadBackend class HttpStreamingDownloader: def __init__(self, backend: ChunkUploadBackend, chunk_size: int = 1024**2): self.backend = backend self.chunk_size = chunk_size def download(self, url: str, filename: str, headers: dict = {}): self.backend.start(filename) # http = httpx.Client(http2=True) http = httpx try: print("Try to download") with http.stream("GET", url, timeout=20, headers=headers) as response: response.raise_for_status() total = int(response.headers.get("Content-Length", 0)) with tqdm(total=total, unit="B", unit_scale=True, desc=filename) as pbar: for chunk in response.iter_bytes(self.chunk_size): if chunk: self.backend.upload_chunk(chunk) pbar.update(len(chunk)) # обновляем прогресс по размеру чанка self.backend.finish() except: self.backend.abort() raise