import logging import os import time import requests from plugins.functions.display_progress import humanbytes logging.basicConfig( level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) logger = logging.getLogger(__name__) def DetectFileSize(url): """ Detect the file size of a remote file by sending a HEAD request. Parameters: - url (str): URL of the remote file. Returns: int: Size of the file in bytes. """ r = requests.head(url, allow_redirects=True, timeout=60) return int(r.headers.get("content-length", 0)) def DownLoadFile(url, file_name, chunk_size, client, ud_type, message_id, chat_id): """ Download a file from a given URL and display the download progress. Parameters: - url (str): URL of the file to be downloaded. - file_name (str): Path to save the downloaded file. - chunk_size (int): Size of each download chunk. - client: Pyrogram client (optional). - ud_type (str): Type of the download (e.g., "File", "Video"). - message_id: ID of the message to update the download progress. - chat_id: ID of the chat to update the download progress. Returns: str: Path to the downloaded file. """ if os.path.exists(file_name): os.remove(file_name) if not url: return file_name r = requests.get(url, allow_redirects=True, stream=True) total_size = int(r.headers.get("content-length", 0)) downloaded_size = 0 with open(file_name, "wb") as fd: for chunk in r.iter_content(chunk_size=chunk_size): if chunk: fd.write(chunk) downloaded_size += chunk_size if client is not None and ((total_size // downloaded_size) % 5) == 0: time.sleep(0.3) try: client.edit_message_text( chat_id, message_id, text=f"{ud_type}: {humanbytes(downloaded_size)} of {humanbytes(total_size)}", ) except Exception as e: logger.info(f"Error: {e}") return return file_name