89 lines
3.6 KiB
Python
89 lines
3.6 KiB
Python
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 <youtube_url>")
|
|
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']}",
|
|
}
|
|
|
|
# Добавляем обложку если есть
|
|
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("Обложка добавлена к сообщению")
|
|
|
|
except Exception as e:
|
|
logger.warning(f"Не удалось добавить обложку: {e}")
|
|
|
|
# Отправляем аудио
|
|
await message.answer_audio(**send_params)
|
|
|
|
# Удаляем временный файл обложки если создавали
|
|
if "thumb_filename" in locals() and path.exists(thumb_filename):
|
|
unlink(thumb_filename)
|
|
|
|
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
|