# Thunder/utils/file_properties.py import asyncio from datetime import datetime as dt from typing import Any, Optional from pyrogram.client import Client from pyrogram.errors import FloodWait from pyrogram.file_id import FileId from pyrogram.types import Message from Thunder.server.exceptions import FileNotFound from Thunder.utils.logger import logger def get_media(message: Message) -> Optional[Any]: for attr in ("audio", "document", "photo", "sticker", "animation", "video", "voice", "video_note"): media = getattr(message, attr, None) if media: return media return None def get_uniqid(message: Message) -> Optional[str]: media = get_media(message) return getattr(media, 'file_unique_id', None) def get_hash(media_msg: Message) -> str: uniq_id = get_uniqid(media_msg) return uniq_id[:6] if uniq_id else '' def get_fsize(message: Message) -> int: media = get_media(message) return getattr(media, 'file_size', 0) if media else 0 def parse_fid(message: Message) -> Optional[FileId]: media = get_media(message) if media and hasattr(media, 'file_id'): try: return FileId.decode(media.file_id) except Exception: return None return None def get_fname(msg: Message) -> str: media = get_media(msg) fname = getattr(media, 'file_name', None) if media else None if not fname: ext = "bin" if media: media_types = { "photo": "jpg", "audio": "mp3", "voice": "ogg", "video": "mp4", "animation": "mp4", "video_note": "mp4", "sticker": "webp" } # Check which attribute type the message has for attr, extension in media_types.items(): if getattr(msg, attr, None) is not None: ext = extension break timestamp = dt.now().strftime("%Y%m%d%H%M%S") fname = f"Thunder File To Link_{timestamp}.{ext}" return fname async def get_fids(client: Client, chat_id: int, message_id: int) -> FileId: try: try: msg = await client.get_messages(chat_id, message_id) except FloodWait as e: await asyncio.sleep(e.value) msg = await client.get_messages(chat_id, message_id) if not msg or getattr(msg, 'empty', False): raise FileNotFound("Message not found") media = get_media(msg) if media: if not hasattr(media, 'file_id') or not hasattr(media, 'file_unique_id'): raise FileNotFound("Media metadata incomplete") return FileId.decode(media.file_id) raise FileNotFound("No media in message") except Exception as e: logger.error(f"Error in get_fids: {e}", exc_info=True) raise FileNotFound(str(e))