Воспроизведение плейлиста youtube-dl

Рейтинг: 1Ответов: 2Опубликовано: 08.02.2023

Создаю бота, который без скачивания видео воспроизводит звук из видео в голосовой канал дискорд. С использованием одного видео всё работает нормально, но вот как использовать каждое видео плейлиста я не разобрался.

Воспроизведение:

YDL_OPTIONS = {'format': 'bestaudio'}
while is_play:
    for music in musics:
    with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
        info = ydl.extract_info(music, download=False)
    url = info['formats'][0]['url']
    vc.play(disnake.FFmpegPCMAudio(url, **FFMPEG_OPTIONS))
    while vc.is_playing():
        await sleep(1)

Всё работает, но когда цикл доходит до плейлиста - ошибка:

Ошибка:

Ignoring exception in command play:
Traceback (most recent call last):
  File "C:\Kirill\Python\lib\site-packages\disnake\ext\commands\core.py", line 173, in wrapped
    ret = await coro(*args, **kwargs)
  File "c:\Kirill\Projects\бизнес\0001\music.py", line 39, in play
    url = info['formats'][0]['url']
KeyError: 'formats'

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

Traceback (most recent call last):
  File "C:\Kirill\Python\lib\site-packages\disnake\ext\commands\bot_base.py", line 591, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Kirill\Python\lib\site-packages\disnake\ext\commands\core.py", line 914, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Kirill\Python\lib\site-packages\disnake\ext\commands\core.py", line 182, in wrapped
    raise CommandInvokeError(exc) from exc
disnake.ext.commands.errors.CommandInvokeError: Command raised an exception: KeyError: 'formats'

Возможно ли как-то брать список ссылок видео из плейлиста или что-то в этом роде?

Ответы

▲ 2Принят

Объект info, из которого вы получаете ссылку, содержит ключ 'entries', который хранит в себе все видео плейлиста. Соответственно, далее вы можете работать с каждым отдельным видео плейлиста также, как работаете с обычными видео.

▲ 0

Ошибка KeyError: 'formats' возникает, когда у видео нет информации о форматах, в которых оно может быть воспроизведено. Вы можете добавить проверку, чтобы убедиться, что у видео есть форматы для воспроизведения, перед попыткой получить URL воспроизведения:

YDL_OPTIONS = {'format': 'bestaudio'}
while is_play:
    for music in musics:
        with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
            info = ydl.extract_info(music, download=False)
        if 'formats' in info:
            url = info['formats'][0]['url']
            vc.play(disnake.FFmpegPCMAudio(url, **FFMPEG_OPTIONS))
            while vc.is_playing():
                await sleep(1)
        else:
            print(f'No formats available for video: {music}')