from aiogram import types, Dispatcher, Bot from aiogram.filters import Command from models.state import BotState from utils.antispam import admin_required from logging import getLogger from .dowloadmp3_to_youtube import download_mp3_isolated import tempfile import asyncio from os import path, unlink logger = getLogger(__name__) def register_handlers(dp: Dispatcher, state: BotState, bot: Bot): @dp.message(Command("dowmp3")) @admin_required(5) async def cmd_dowmp3(message: types.Message): args = message.text.split(maxsplit=1) if len(args) < 2: await message.reply("❌ Укажи ссылку: /dowmp3 ") return url = args[1] logger.info( f"Получена команда /dowmp3 от user_id={message.from_user.id}, url={url}" ) status_msg = await message.reply("⏳ Скачиваю аудио... Это займет 1-2 минуты") try: filename, metadata = await download_mp3_isolated(url) file_size = path.getsize(filename) if file_size < 1000: raise Exception("Файл слишком маленький") await status_msg.edit_text("✅ Аудио готово! Отправляю...") # Подготавливаем аудио файл audio_input = types.FSInputFile(filename) # Базовые параметры send_params = { "audio": audio_input, "title": metadata["title"][:64], "performer": metadata["performer"][:64], "duration": int(metadata["duration"]) if metadata["duration"] else None, "caption": f"🎵 {metadata['title']}\n👤 {metadata['performer']}", } # Добавляем обложку если есть thumb_filename = None if metadata["thumbnail_data"]: try: # Создаем временный файл для обложки with tempfile.NamedTemporaryFile( suffix=".jpg", delete=False ) as thumb_file: thumb_filename = thumb_file.name thumb_file.write(metadata["thumbnail_data"]) # Используем FSInputFile для обложки send_params["thumbnail"] = types.FSInputFile(thumb_filename) logger.info(f"Обложка подготовлена: {thumb_filename} ({len(metadata['thumbnail_data'])} байт)") except Exception as e: logger.error(f"Не удалось добавить обложку: {e}", exc_info=True) # Отправляем аудио await message.answer_audio(**send_params) # Удаляем временный файл обложки если создавали if thumb_filename and path.exists(thumb_filename): try: unlink(thumb_filename) logger.info("Временный файл обложки удален") except OSError as e: logger.warning(f"Не удалось удалить файл обложки: {e}") await status_msg.delete() logger.info(f"Аудио отправлено пользователю {message.from_user.id}") except asyncio.TimeoutError: await status_msg.edit_text("❌ Превышено время ожидания (5 минут)") except Exception as e: await status_msg.edit_text(f"❌ Ошибка: {str(e)}") logger.error(f"Ошибка при скачивании: {e}") finally: if "filename" in locals() and path.exists(filename): try: unlink(filename) except OSError: pass