Задать вопрос
@Oh_noo2195

Не работает очередь вопроизведения музыки у дискорд бота, что делать?

Я попробовал разобраться как реализовать очередь воспроизведения, но зашёл в тупик, и как понимаю написал глупость. Буду рад любой помощи:>

Если это максимально глупая ошибка, то прошу без хейта, я только учусь.

Вот ошибка, появляется не всегда и при этом очередь все равно не работает, но музыка воспроизводится.
future: exception=AttributeError("'function' object has no attribute 'start'")>
Traceback (most recent call last):
File "/app/main.py", line 41, in audio_player_task
current.start()
AttributeError: 'function' object has no attribute 'start'
[tls @ 0x76ea2c0] Error in the pull function.
[tls @ 0x76ea2c0] IO error: Connection reset by peer
[https @ 0x76e6b40] Will reconnect at 540672 in 0 second(s), error=Connection reset by peer.
[tls @ 0x6c292c0] Error in the pull function.
[tls @ 0x6c292c0] IO error: Connection reset by peer
[https @ 0x6c25b40] Will reconnect at 540672 in 0 second(s), error=Connection reset by peer.


songs = asyncio.Queue()
play_next_song = asyncio.Event()

async def audio_player_task():
    while True:
        play_next_song.clear()
        current = await songs.get()
        current.start()
        await play_next_song.wait()

def toggle_next(self):
    client.loop.call_soon_threadsafe(play_next_song.set)

@bot.command(name='play')
async def play(ctx, *, url: str):
    if ctx.author.voice is None:
        embed = discord.Embed(title=f'подключись к каналу', color=discord.Color.red())
        bot_msg = await ctx.send(embed=embed)
        await asyncio.sleep(5)
        await bot_msg.delete()
    voice_channel = ctx.author.voice.channel        
    if ctx.voice_client is None:
        await voice_channel.connect()
    else:
        await ctx.voice_client.move_to(voice_channel)
    ctx.voice_client.stop()
    FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    YDL_OPTIONS = {'format':"bestaudio", 'noplaylist': True, 'default_search': 'auto', 'forceduration': True, 'quiet': True}

    vc = ctx.voice_client

    with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
        info = ydl.extract_info(url, download=False)
        if 'entries' in info:
            url2 = info['entries'][0]["formats"][0]
        elif 'formats' in info:
            url2 = info["formats"][0]
        url = info["webpage_url"]
        stream_url = url2["url"]
        source = await discord.FFmpegOpusAudio.from_probe(stream_url, **FFMPEG_OPTIONS)
        vc.play(source, after = toggle_next)
        await songs.put(vc.play)

client.loop.create_task(audio_player_task())
  • Вопрос задан
  • 289 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
vc.play(source, after = toggle_next)
await songs.put(vc.play)

Ты запускаешь воспроизведение вызовом метода vc.play(), а потом помещаешь в очередь ссылку на этот метод.
Что, по-твоему, сиё должно делать? Потому что оно явно этого не делает, и делать не будет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы