Как получить название, длительность и ссылку на видео 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 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/
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для получения названия, длительности и ссылки на видео 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 'Видео по запросу не найдено.'; } ?>
Прежде чем использовать данный код, необходимо получить ключ доступа к YouTube Data API. Для этого необходимо зарегистрироваться на Google Cloud Platform, создать проект и получить ключ доступа к API. После этого вставьте ключ в переменную $api_key.
Этот код выполняет поиск видео по текстовому запросу, извлекает информацию о первом найденном видео (название, длительность и ссылку) и выводит ее на экран. В случае, если видео по запросу не найдено, будет выведено сообщение об этом.
Не забудьте обработать возможные ошибки и исключения при использовании этого кода в продакшене.