discord.py 和 youtube_dl、"Read error" 和 "The session has been invalidated for some reason"
discord.py and youtube_dl, "Read error" and "The session has been invalidated for some reason"
我已经 运行 解决了 discord.py 和 youtube_dl 的这个问题,其中在队列中播放 YouTube link 给我一个错误,似乎 "snowball" 进入队列中的其他歌曲。第一首歌曲通常播放得很好,但在很短的时间后,其余歌曲就会出现此错误。这是错误:
[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 问题页面推荐给 "redownload the url",但我正在使用 youtube_dl 流式传输 link,如果可能,我想避免下载视频.无论如何,许多 Github 问题似乎都太过时了,因此与代码相关的任何解决方案都不再有效。如果我需要提供更多 code/information 让我知道!
正如人们喜欢说的那样,"It's really not your fault"。这通常发生在 YouTube 方面。
看看:
此外,请检查您是否使用 https
呼叫。 YouTube 不再接受 http
连接。
为确保不会发生这种情况,请将其添加到 ffmpeg 选项中:
'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5'
这将使它重新连接并且音乐不会停止。
我已经 运行 解决了 discord.py 和 youtube_dl 的这个问题,其中在队列中播放 YouTube link 给我一个错误,似乎 "snowball" 进入队列中的其他歌曲。第一首歌曲通常播放得很好,但在很短的时间后,其余歌曲就会出现此错误。这是错误:
[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 问题页面推荐给 "redownload the url",但我正在使用 youtube_dl 流式传输 link,如果可能,我想避免下载视频.无论如何,许多 Github 问题似乎都太过时了,因此与代码相关的任何解决方案都不再有效。如果我需要提供更多 code/information 让我知道!
正如人们喜欢说的那样,"It's really not your fault"。这通常发生在 YouTube 方面。
看看:
此外,请检查您是否使用 https
呼叫。 YouTube 不再接受 http
连接。
为确保不会发生这种情况,请将其添加到 ffmpeg 选项中:
'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5'
这将使它重新连接并且音乐不会停止。