Помогите Написал код а он не работает, при вводе -play (Сыллка) выдает ошибку

Вот код:

import discord
from discord.ext import commands
import pafy
import logging
import youtube_dl

logging.basicConfig(filename='bot.log', level=logging.INFO)

TOKEN = 'token'
PREFIX = '-'

intents = discord.Intents.all()
intents.members = True

bot = commands.Bot(command_prefix=PREFIX, intents=intents)

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user}')

@bot.event
async def on_message(message):
    if message.content.lower() == 'привет':
        await message.channel.send('Привет!')
    await bot.process_commands(message)

@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("Бот не подключен к голосовому каналу.")
        
logging.info('Bot Online')

bot.run("Код мой ")

Вот ошибка:

Traceback (most recent call last):
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\discord\ext\commands\core.py", line 235, in wrapped
    ret = await coro(*args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\timny\bot.py", line 38, in play
    video = pafy.new(url)
            ^^^^^^^^^^^^^
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\pafy\pafy.py", line 124, in new
    return Pafy(url, basic, gdata, size, callback, ydl_opts=ydl_opts)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\pafy\backend_youtube_dl.py", line 31, in __init__
    super(YtdlPafy, self).__init__(*args, **kwargs)
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\pafy\backend_shared.py", line 62, in __init__
    self.videoid = extract_video_id(video_url)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\pafy\backend_shared.py", line 51, in extract_video_id
    raise ValueError(err % url)
ValueError: Need 11 character video id or the URL of the video. Got (https://www.youtube.com/watch?v=bNfibDU7IE4)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\discord\ext\commands\bot.py", line 1366, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\site-packages\discord\ext\commands\core.py", line 1029, in invoke
    await injected(*ctx.args, **ctx.kwargs)  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\timny\AppData\Local\Programs\Python\Python312\Lib\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: ValueError: Need 11 character video id or the URL of the video. Got (https://www.youtube.com/watch?v=bNfibDU7IE4)

UPD: даже при команде -play (id видео) (по типу bNfibDU7IE4 - вместо полной ссылки) всё равно выдает ошибку. Бот заходит, но не включает видео.


Ответы (1 шт):

Автор решения: mrgervant

В документации говорится, что в pafy.new() можно передать:

url (str) – The YouTube url or 11 character video id of the video

Ошибка же сообщает о том, что ожидалась не полная ссылка, а 11-значный id видео. Возможно происходит конфликт с библиотекой discord, поэтому воспользуйтесь вторым вариантом и передайте id видео по типу bNfibDU7IE4.

Из полной ссылки предварительно можно вытащить id так:

url = url.split('=')[1]
video = pafy.new(url)
→ Ссылка