55 lines
2.7 KiB
Python
Executable File
55 lines
2.7 KiB
Python
Executable File
import os
|
||
import requests
|
||
from tqdm import tqdm
|
||
from .logger import *
|
||
from .files_worker import *
|
||
|
||
def try_download(url, save_path=None):
|
||
"""
|
||
Скачивает файл по-указанному URL с отображением прогресса.
|
||
|
||
:param url: URL файла для скачивания.
|
||
:param save_path: Путь для сохранения файла. Если None или директория, то используется имя файла из URL.
|
||
"""
|
||
try:
|
||
# Отправляем GET-запрос на скачивание файла
|
||
response = requests.get(url, stream=True)
|
||
response.raise_for_status() # Проверяем, что запрос успешен
|
||
|
||
# TODO: добавить проверку хэш-суммы из ссылки на файл
|
||
# TODO: резерв места
|
||
# TODO: проверка и докачка 3 попытки
|
||
|
||
# Определяем имя файла, если save_path не указан, или путь это директория
|
||
if save_path is None:
|
||
save_path = tmp_path + "/" + os.path.basename(url)
|
||
elif os.path.isdir(save_path):
|
||
save_path = save_path + "/" + os.path.basename(url)
|
||
|
||
# Получаем общий размер файла
|
||
total_size = int(response.headers.get("content-length", 0))
|
||
|
||
# Открываем файл для записи в бинарном режиме
|
||
with open(save_path, "wb") as file, tqdm(
|
||
desc=save_path, # Описание для прогресс-бара
|
||
total=total_size, # Общий размер файла
|
||
unit="B", # Единица измерения (байты)
|
||
unit_scale=True, # Масштабирование единиц (KB, MB и т.д.)
|
||
unit_divisor=1024, # Делитель для масштабирования (1024 для KB, MB)
|
||
) as progress_bar:
|
||
# Читаем данные по частям и записываем в файл
|
||
for chunk in response.iter_content(chunk_size=8192):
|
||
file.write(chunk)
|
||
progress_bar.update(len(chunk)) # Обновляем прогресс-бар
|
||
|
||
log.info(f"Файл успешно скачан и сохранён как {save_path}.")
|
||
return True
|
||
except requests.exceptions.RequestException as e:
|
||
log.error(f"Ошибка при скачивании файла: {e}")
|
||
except Exception as e:
|
||
log.error(f"Неизвестная ошибка: {e}")
|
||
except KeyboardInterrupt as e:
|
||
log.error(f"Прервано пользователем: {e}")
|
||
|
||
return False
|