from aiogram import Router, Bot, F from aiogram.types import ( BufferedInputFile, InputMediaAudio, ChosenInlineResult, ) from bot.modules.youtube.downloader import YouTubeBytestream from bot.utils.config import config from bot.modules.database import db from bot.modules.settings import UserSettings from io import BytesIO router = Router() @router.chosen_inline_result( F.result_id.startswith("spotc::") | F.result_id.startswith("ytc::") ) async def on_cached_chosen( chosen_result: ChosenInlineResult, bot: Bot, settings: UserSettings ): if settings["recode_youtube"].value != "yes": await bot.edit_message_reply_markup( inline_message_id=chosen_result.inline_message_id, reply_markup=None ) return if type( db.recoded.get( song_id := chosen_result.result_id.removeprefix("spotc::").removeprefix( "ytc::" ) ) ) in [bool, type(None)]: await bot.edit_message_reply_markup( inline_message_id=chosen_result.inline_message_id, reply_markup=None ) return await bot.edit_message_caption( inline_message_id=chosen_result.inline_message_id, caption="🔄 Recoding...", reply_markup=None, ) message = await bot.forward_message( config.telegram.files_chat, config.telegram.files_chat, db.recoded[song_id] ) song_io: BytesIO = await bot.download( # type: ignore destination=BytesIO(), file=message.audio.file_id, ) await message.delete() bytestream = YouTubeBytestream.from_bytestream( bytestream=song_io, filename=message.audio.file_name, duration=message.audio.duration, ) await bytestream.rerender() audio = await bot.send_audio( chat_id=config.telegram.files_chat, audio=BufferedInputFile( file=bytestream.file, filename=bytestream.filename, ), thumbnail=BufferedInputFile( file=(await bot.download(message.audio.thumbnail.file_id)).read(), filename="thumbnail.jpg", ), performer=message.audio.performer, title=message.audio.title, duration=bytestream.duration, ) await bot.edit_message_caption( inline_message_id=chosen_result.inline_message_id, caption="", reply_markup=None, ) await bot.edit_message_media( inline_message_id=chosen_result.inline_message_id, media=InputMediaAudio(media=audio.audio.file_id), ) if chosen_result.result_id.startswith("spotc::"): db.spotify[song_id] = audio.audio.file_id else: db.youtube[song_id] = audio.audio.file_id db.recoded[song_id] = True