Init code
This commit is contained in:
29
app/utils/downloader.py
Normal file
29
app/utils/downloader.py
Normal file
@@ -0,0 +1,29 @@
|
||||
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
|
||||
Reference in New Issue
Block a user