0

我想知道是否有办法让我的不和谐机器人在播放 youtube 视频的音频后离开语音频道。我尝试使用sleep(duration of the video),但为了获取和下载要播放的视频,我使用pafy了 ,这给了我视频的持续时间,但采用 00:00:00 格式,它算作字符串,而不是整数。我将代码更改为在 处断开连接after=lamda e: await vc.disconnect,但它给了我一个错误提示'await' outside async function。我播放音乐的代码如下:

channel = message.author.voice.channel
vc = await channel.connect()
url = contents
url = url.strip("play ")
video = pafy.new(url)
await message.channel.send("Now playing **%s**" % video.title)

audio = video.getbestaudio()
audio.download()
duration = video.duration
player = vc.play(discord.FFmpegPCMAudio('%s.webm' % video.title), after=lambda e: await vc.disconnect)
4

3 回答 3

2

这是歌曲完成后断开连接的一种方法(删除after=)。

之后添加vc.play()

    while vc.is_playing():
        await sleep(1)
    await vc.disconnect()
于 2020-05-16T03:19:52.510 回答
0

在这种情况下,这vc.disconnect()是一个必须等​​待的协程。不和谐播放器的after功能不能等待这样的异步功能。而是使用这样的东西:

def my_after(error):
coro = vc.disconnect()
fut = asyncio.run_coroutine_threadsafe(coro, client.loop)
try:
    fut.result()
except:
    # an error happened sending the message
    pass
voice.play(discord.FFmpegPCMAudio(url), after=my_after)

你也可以在这里阅读

于 2020-08-05T23:04:32.097 回答
0

我在机器人中使用的代码:

stop_event = asyncio.Event()
loop = asyncio.get_event_loop()
def after(error):
    if error:
        logging.error(error)
    def clear():
        stop_event.set()
    loop.call_soon_threadsafe(clear)

audio = PCMVolumeTransformer(discord.FFmpegPCMAudio(file_path), 1)
client.play(audio, after=after)

await stop_event.wait()
await client.disconnect()
于 2020-05-19T21:42:17.123 回答