Ваша ошибка возникает из-за того, что библиотека pafy не может найти ключ 'average_rating' в возвращаемых данных. Это может быть связано с изменениями в API YouTube или с тем, что youtube_dl возвращает данные в другом формате.
Есть несколько способов решения этой проблемы:
Использование yt_dlp вместо youtube_dl и pafy: yt_dlp является форком youtube_dl и может быть более актуальным и поддерживаемым. Вы можете использовать его напрямую для загрузки аудио.
Использование альтернативных библиотек: Если проблема сохраняется, рассмотрите использование других библиотек для получения аудио с YouTube.
Вот пример исправленного кода с использованием yt_dlp:
import discord
from discord.ext import commands
import yt_dlp as youtube_dl
bot = commands.Bot(command_prefix='!')
@bot.command()
async def play(ctx, url: str):
if not ctx.author.voice:
return await ctx.send("Вы не подключены к голосовому каналу!")
voice_channel = ctx.author.voice.channel
if ctx.voice_client is None:
vc = await voice_channel.connect()
else:
await ctx.voice_client.move_to(voice_channel)
vc = ctx.voice_client
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=False)
url2 = info['url']
source = await discord.FFmpegOpusAudio.from_probe(url2)
vc.play(source)
@bot.command()
async def leave(ctx):
if ctx.voice_client:
await ctx.guild.voice_client.disconnect()
else:
await ctx.send("Бот не подключен к голосовому каналу.")
# Запуск бота
bot.run('YOUR_BOT_TOKEN')
В этом примере:
Используется yt_dlp вместо pafy для получения аудио с YouTube.
Настройки ydl_opts указывают, что мы хотим получить лучшую доступную аудиодорожку.
Команда play загружает и проигрывает аудио с YouTube.
Не забудьте установить необходимые библиотеки, если они еще не установлены:
pip install discord.py yt-dlp
import youtube_dl
import pafy
@bot.command()
async def play(ctx, url: str):
if not ctx.author .voice:
return await ctx.send("Вы не подключены к голосовому каналу!")
voice_channel = ctx.author.voice.channel
if ctx.voice_client is None:
vc = await voice_channel.connect()
else:
await ctx.voice_client.move_to(voice_channel)
vc = ctx.voice_client
video = pafy.new (url)
best = video.getbestaudio()
source = await discord.FFmpegOpusAudio.from_probe(best.url, method='fallback')
vc.play(source)
@bot.command()
async def leave(ctx):
if ctx.voice_client:
await ctx.guild.voice_client.disconnect()
else:
await ctx.send("Бот не подключен к голосовому каналу.")
При запуске команды бот пишет ошибку
Traceback (most recent call last):
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/core.py", line 235, in wrapped
ret = await coro(*args, **kwargs)
File "/home/runner/Discord-bot/main.py", line 264, in play
video = pafy.new (url)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/pafy.py", line 124, in new
return Pafy(url, basic, gdata, size, callback, ydl_opts=ydl_opts)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/backend_youtube_dl.py", line 31, in __init__
super(YtdlPafy, self).__init__(*args, **kwargs)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/backend_shared.py", line 97, in __init__
self._fetch_basic()
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/backend_youtube_dl.py", line 50, in _fetch_basic
self._rating = self._ydl_info['average_rating']
KeyError: 'average_rating'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/bot.py", line 1350, in invoke
await ctx.command.invoke(ctx)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/core.py", line 1029, in invoke
await injected(*ctx.args, **ctx.kwargs) # type: ignore
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/core.py", line 244, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: KeyError: 'average_rating'
Поставил только часть кода потому что в полном коде много ключей от OpenAI и других