discord.py和youtube_dl,“读取错误”和“会话由于某种原因而无效”

我一直在使用discord.py和youtube_dl遇到此问题,其中在队列中播放YouTube链接会给我一个错误,似乎在队列中的其他歌曲中“滚雪球”。通常,第一首歌曲的播放效果很好,但随后的其他歌曲在很短的时间内就会出现此错误。这是错误:

[tls @ 000001e5618bc200] Error in the pull function.
[matroska,webm @ 000001e5613f9740] Read error
[tls @ 000001e5618bc200] The specified session has been invalidated for some reason.
Last message repeated 1 times
[really long link] I/O error

这是我的YTDL源代码和队列函数代码:

class YTDLSource(discord.PCMVolumeTransformer):
    def __init__(self,source,*,data,volume=0.5):
        super().__init__(source,volume)

        self.data = data

        self.title = data.get('title')
        self.url = data.get('url')

    @classmethod
    async def from_url(cls,url,loop=None,stream=False):
        loop = loop or asyncio.get_event_loop()
        data = await loop.run_in_executor(None,lambda: ytdl.extract_info(url,download=not stream))

        if 'entries' in data:
            # take first item from a playlist
            data = data['entries'][0]

        filename = data['url'] if stream else ytdl.prepare_filename(data)
        return cls(discord.FFmpegPCMAudio(filename,**ffmpeg_options),data=data)



queues = {}

class Music(commands.Cog):
    def __init__(self,bot):
        self.bot = bot

    @commands.command()
    async def q(self,ctx,url):
        channel = discord.utils.get(ctx.guild.voice_channels,name="Melodies of Arts")

        if ctx.voice_client is None:
            await channel.connect()


        def check_queue(error):
            if(queues[ctx.guild.id] != []):
                player = queues[ctx.guild.id].pop(0)
                ctx.voice_client.play(player,after=check_queue)     

        async with ctx.typing():
            player = await YTDLSource.from_url(url,loop=self.bot.loop,stream=True)

            if ctx.guild.id in queues:
                queues[ctx.guild.id].append(player)
            else:
                queues[ctx.guild.id] = [player]

            await ctx.send("Video __" + str(player.title) + "__" + " queued at **Position #" + str(len(queues[ctx.guild.id])) + "**",delete_after=15)

            if(not ctx.voice_client.is_playing()):
                ctx.voice_client.play(player,after=check_queue)
                await ctx.send('***Now playing:*** __{}__'.format(player.title),delete_after=10)

建议在Github的一个问题页面上“重新下载网址”,但我正在使用youtube_dl传输链接,因此,我尽可能避免下载视频。无论如何,许多Github问题似乎都已经过时了,因此任何与代码相关的解决方案都不再起作用。如果我需要提供更多代码/信息,请告诉我!

okam6hz 回答:discord.py和youtube_dl,“读取错误”和“会话由于某种原因而无效”

正如人们喜欢说的那样,“这确实不是你的错”。这通常是从YouTube端发生的。

看看:Python Youtube ffmpeg Session Has Been Invalidated

另外,检查您是否使用https进行了呼叫。 YouTube不再接受http连接。

,

为确保不会发生这种情况,请在ffmpeg选项中添加它:

'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5'

这将使其重新连接并且音乐不会停止。

本文链接:https://www.f2er.com/3089536.html

大家都在问