【问题标题】:discord.py and youtube_dl, "Read error" and "The session has been invalidated for some reason"discord.py 和 youtube_dl,“读取错误”和“会话因某种原因已失效”
【发布时间】:2020-03-12 12:40:46
【问题描述】:

我在使用 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 问题页面建议“重新下载 url”,但我正在使用 youtube_dl 流式传输链接,并且我希望尽可能避免下载视频。无论如何,很多 Github 问题似乎都已经过时了,因此任何与代码相关的解决方案都不再适用。如果我需要提供更多代码/信息,请告诉我!

【问题讨论】:

    标签: python youtube discord discord.py youtube-dl


    【解决方案1】:

    正如人们常说的,“这真的不是你的错”。这通常发生在 YouTube 方面。

    看看:Python Youtube ffmpeg Session Has Been Invalidated

    另外,请检查您是否使用https 调用。 YouTube 不再接受 http 连接。

    【讨论】:

    • 这是否意味着我必须下载视频以确保不会出现此错误?
    • 接下来呢?是的,任何外部服务都可能决定不为您提供服务。如果您认为这就是您所说的方式,并且只要 YouTube 更改其条款就可以中断,那么您可以流式传输它。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 2013-12-22
      • 2017-11-22
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多