PortProton_2.0/modules/downloader.py
2025-03-11 02:29:35 +03:00

51 lines
2.5 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import requests
from tqdm import tqdm
from .log 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() # Проверяем, что запрос успешен
# Определяем имя файла, если 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