У меня есть следующий код:
async def yt_dlp_extract_info(query):
loop = asyncio.get_running_loop()
ydl_opts = {
'format': 'bestaudio/best',
'quiet': True,
'noplaylist': True,
'default_search': 'ytsearch'
}
def extract():
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
result = ydl.extract_info(query, download=False)
if 'entries' in result and len(result['entries']) > 0:
return result['entries'][0]
return result
return await loop.run_in_executor(None, extract)
И функция воспроизведения:
async def play_song(ctx, query, requester):
guild_id = ctx.guild.id
voice_client = voice_clients[guild_id]['vc']
# Определение, является ли запрос текстовым поиском
search = not re.match(r'https?://\S+', query)
video_info = await yt_dlp_extract_info(query, search=search)
if not video_info:
embed = discord.Embed(title="Ошибка", description="Не удалось найти видео.", color=discord.Color.green())
await ctx.send(embed=embed)
return
source_url = video_info['url'] # Убедитесь, что используете правильный ключ для URL
title = video_info.get('title', 'Название не найдено')
webpage_url = video_info.get('webpage_url', '')
duration = video_info.get('duration', 0)
voice_client.play(discord.FFmpegPCMAudio(source_url), after=lambda e: asyncio.run_coroutine_threadsafe(play_next_in_queue(guild_id), bot.loop))
embed = discord.Embed(title="Сейчас играет", color=discord.Color.green())
embed.add_field(name="Название", value=f"[{title}]({webpage_url})", inline=True)
embed.add_field(name="Заказал", value=requester.mention, inline=True)
embed.add_field(name="Длительность", value=format_duration(duration), inline=True)
embed.add_field(name="Ссылка на YouTube", value=f"[Ссылка]({webpage_url})", inline=True)
await ctx.send(embed=embed)
await check_voice_state(guild_id)
Проблема в том, что при вызове функции используя ссылку на видео, то всё работает отлично, но если в play_song запихать текстовый запрос (например Кино - Звезда по имени солнце), то в названии отображается videoplayback, в длительности будет 0:00 и в ссылке будет ссылка не на видео YouTube, а на уже загруженный файл.
Вопрос: Как мне сделать, чтобы по текстовому запросу были получены данные с YouTube как по ссылке? Использую библиотеку yt_dlp