Как осуществить поиск музыки в дискорд боте, для воспроизведения музыки?
Решил написать своего телегам бота на python, но столкнулся с проблемой на самом начале разработки. Цель моего бота - общаться с людьми и помогать им с вопросами. В коде, который будет ниже есть 2 основные функции, а именно "/ask" и "/search".
from disnake.ext import commands
import os
import youtube_dl
import openai
openai.api_key = 'KEY'
intents = disnake.Intents.default()
intents.voice_states = True
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)
log_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'log_gpt_discord.txt')
def log_message(message):
with open(log_file, 'a', encoding='utf-8') as file:
file.write(message + '\n')
@bot.event
async def on_ready():
print(f'Бот подключен как {bot.user}')
await bot.change_presence(activity=disnake.Activity(type=disnake.ActivityType.watching, name="!ask"))
@bot.event
async def on_message(message):
if message.author == bot.user:
return
await bot.process_commands(message)
@bot.slash_command(
name="ask",
description="Генерирует ответ на заданный вопрос."
)
async def ask(ctx, user_input: str):
log_message(f'Пользователь: {ctx.author.name}')
log_message(f'Сервер: {ctx.guild.name}')
log_message(f'Канал: {ctx.channel.name}')
log_message(f'Вопрос: {user_input}')
await ctx.response.defer()
bot_response = await generate_response(user_input)
log_message(f'Ответ бота: {bot_response}')
await ctx.edit_original_response(content=bot_response)
async def generate_response(user_input):
response = openai.Completion.create(
engine='text-davinci-003',
prompt=user_input,
temperature=0.4,
max_tokens=3700,
n=10,
stop=None,
top_p=0.8
)
return response.choices[0].text.strip()
@bot.slash_command(
name="search",
description="Ищет песню в YouTube по запросу."
)
async def search(ctx, search_query: str):
search_results = await search_music(search_query)
if search_results:
result_message = create_search_results_message(search_results)
await ctx.send(result_message)
else:
await ctx.send('Ничего не найдено.')
async def search_music(query):
ydl_opts = {
'format': 'bestaudio/best',
'default_search': 'auto',
'quiet': True,
'no_warnings': True,
'ignoreerrors': False,
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
try:
info = ydl.extract_info(f"ytsearch5:{query}", download=False)
videos = info['entries']
return videos
except Exception:
return []
def create_search_results_message(videos):
message = 'Результаты поиска:\n'
for i, video in enumerate(videos, start=1):
title = video['title']
url = video['webpage_url']
message += f'{i}. [{title}]({url})\n'
message += 'Выберите песню, написав ее номер после команды !play.'
return message
bot.run('TOKEN')
Команда "!ask" работает корректно, но к сожалению не работает только музыкальная часть бота. При использовании "/search" в консоли выдает следующую ошибку:

Моя цель - при команде "/search" бот ищет видео с названием, который вводил пользователь и показывал самые подходящие по запросу варианты.