Задать вопрос
@GesusDev

Как получить название, длительность и ссылку на видео YouTube по текстовому запросу?

У меня есть следующий код:

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
  • Вопрос задан
  • 247 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы