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

Ссылка скопирована
1 ответ

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

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 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)

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

Дополнительно:

Сюда: https://freelance.habr.com/

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Для получения названия, длительности и ссылки на видео YouTube по текстовому запросу можно воспользоваться YouTube Data API. Ниже приведен пример кода на PHP, который позволяет выполнить поиск видео по текстовому запросу и получить необходимую информацию:

 0) {
    $video_id = $data['items'][0]['id']['videoId'];
    $video_title = $data['items'][0]['snippet']['title'];
    $video_duration = $data['items'][0]['contentDetails']['duration'];
    $video_link = 'https://www.youtube.com/watch?v=' . $video_id;
 
    echo 'Название видео: ' . $video_title . '<br>';
    echo 'Длительность видео: ' . $video_duration . '<br>';
    echo 'Ссылка на видео: ' . $video_link;
} else {
    echo 'Видео по запросу не найдено.';
}
 
?&gt;

0) { $video_id = $data['items'][0]['id']['videoId']; $video_title = $data['items'][0]['snippet']['title']; $video_duration = $data['items'][0]['contentDetails']['duration']; $video_link = 'https://www.youtube.com/watch?v=' . $video_id; echo 'Название видео: ' . $video_title . '<br>'; echo 'Длительность видео: ' . $video_duration . '<br>'; echo 'Ссылка на видео: ' . $video_link; } else { echo 'Видео по запросу не найдено.'; } ?&gt;

Прежде чем использовать данный код, необходимо получить ключ доступа к YouTube Data API. Для этого необходимо зарегистрироваться на Google Cloud Platform, создать проект и получить ключ доступа к API. После этого вставьте ключ в переменную $api_key.

Этот код выполняет поиск видео по текстовому запросу, извлекает информацию о первом найденном видео (название, длительность и ссылку) и выводит ее на экран. В случае, если видео по запросу не найдено, будет выведено сообщение об этом.

Не забудьте обработать возможные ошибки и исключения при использовании этого кода в продакшене.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно