@@ -0,0 +1,71 @@
|
||||
import os
|
||||
import asyncio
|
||||
from aiogram import Bot, Dispatcher, types, F
|
||||
from aiogram.filters import Command
|
||||
import yt_dlp
|
||||
|
||||
TOKEN = os.getenv("TG_BOT_TOKEN")
|
||||
MUSIC_DIR = os.getenv("MUSIC_DIR", "./music")
|
||||
# Читаем ваш ID из переменных среды (по умолчанию 0)
|
||||
ADMIN_ID = int(os.getenv("ADMIN_ID", 0))
|
||||
|
||||
bot = Bot(token=TOKEN)
|
||||
dp = Dispatcher()
|
||||
|
||||
def download_youtube(url: str):
|
||||
ydl_opts = {
|
||||
'format': 'bestaudio/best',
|
||||
'postprocessors': [{
|
||||
'key': 'FFmpegExtractAudio',
|
||||
'preferredcodec': 'mp3',
|
||||
'preferredquality': '192',
|
||||
}],
|
||||
'outtmpl': f'{MUSIC_DIR}/Youtube/%(uploader)s/%(title)s.%(ext)s',
|
||||
'noplaylist': False,
|
||||
'quiet': False
|
||||
}
|
||||
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
||||
ydl.download([url])
|
||||
|
||||
# Создаем удобный фильтр: "сообщение от админа"
|
||||
is_admin = F.from_user.id == ADMIN_ID
|
||||
|
||||
# --- ОБРАБОТЧИКИ ТОЛЬКО ДЛЯ ВАС (работают, если is_admin == True) ---
|
||||
|
||||
@dp.message(is_admin, Command("start"))
|
||||
async def start_cmd(message: types.Message):
|
||||
await message.reply("Привет, хозяин! Скинь ссылку на YouTube или аудиофайл, и я закину его в Navidrome.")
|
||||
|
||||
@dp.message(is_admin, F.text.regexp(r'https?://(?:www\.)?youtu'))
|
||||
async def handle_youtube(message: types.Message):
|
||||
msg = await message.reply("⏳ Начинаю скачивание...")
|
||||
try:
|
||||
await asyncio.to_thread(download_youtube, message.text)
|
||||
await msg.edit_text("✅ Успешно скачано и добавлено в Navidrome!")
|
||||
except Exception as e:
|
||||
await msg.edit_text(f"❌ Ошибка:\n{str(e)[:500]}")
|
||||
|
||||
@dp.message(is_admin, F.audio)
|
||||
async def handle_audio(message: types.Message):
|
||||
msg = await message.reply("📥 Сохраняю трек...")
|
||||
try:
|
||||
file_name = message.audio.file_name or f"track_{message.message_id}.mp3"
|
||||
destination = os.path.join(MUSIC_DIR, "Telegram", file_name)
|
||||
os.makedirs(os.path.dirname(destination), exist_ok=True)
|
||||
await bot.download(message.audio, destination=destination)
|
||||
await msg.edit_text("✅ Трек добавлен в Navidrome!")
|
||||
except Exception as e:
|
||||
await msg.edit_text(f"❌ Ошибка:\n{str(e)[:500]}")
|
||||
|
||||
# --- ОБРАБОТЧИК ДЛЯ ЧУЖАКОВ ---
|
||||
# Сработает, если ни один из верхних обработчиков не подошел (например, другой ID)
|
||||
@dp.message()
|
||||
async def reject_stranger(message: types.Message):
|
||||
await message.reply(f"⛔ Извините, этот бот приватный.\n\nВаш Telegram ID: <code>{message.from_user.id}</code>", parse_mode="HTML")
|
||||
|
||||
async def main():
|
||||
print("Бот запущен...")
|
||||
await dp.start_polling(bot)
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user