Я получаю следующую ошибку при воспроизведении аудио с YouTube с помощью своего бота
[tls @ 0000024ef8c4d480] Error in the pull function.
[matroska,webm @ 0000024ef8c4a400] Read error
[tls @ 0000024ef8c4d480] The specified session has been invalidated for some reason.
Last message repeated 1 times
Похоже, срок действия ссылок на YouTube истекает? Я действительно не знаю, но мне нужно исправить эту проблему. Это мой код:
class YTDLSource(discord.PCMVolumeTransformer):
def __init__(self, source, *, data, requester):
super().__init__(source)
self.requester = requester
self.title = data['title']
self.description = data['description']
self.uploader = data['uploader']
self.duration = data['duration']
self.web_url = data['webpage_url']
self.thumbnail = data['thumbnail']
def __getitem__(self, item: str):
return self.__getattribute__(item)
@classmethod
async def create_source(cls, ctx, player, search: str, *, loop, download=True):
async with ctx.typing():
loop = loop or asyncio.get_event_loop()
to_run = partial(ytdl.extract_info, url=search, download=download)
raw_data = await loop.run_in_executor(None, to_run)
if 'entries' in raw_data:
# take first item from a playlist
if len(raw_data['entries']) == 1:
data = raw_data['entries'][0]
else:
data = raw_data['entries']
#loops entries to grab each video_url
total_duration = 0
try:
for i in data:
webpage = i['webpage_url']
title = i['title']
description = i['description']
uploader = i['uploader']
duration = i['duration']
thumbnail = i['thumbnail']
total_duration += duration
if download:
source = ytdl.prepare_filename(i)
source = cls(discord.FFmpegPCMAudio(source), data=i, requester=ctx.author)
else:
source = {'webpage_url': webpage, 'requester': ctx.author, 'title': title, 'uploader': uploader, 'description': description, 'duration': duration, 'thumbnail': thumbnail}
player.queue.append(source)
except Exception as e:
print(e)
return
embed=discord.Embed(title = "Playlist", description = "Queued", color=0x30a4fb, timestamp=datetime.now(timezone.utc))
embed.set_author(name=ctx.author.display_name, icon_url=ctx.author.avatar_url)
embed.set_thumbnail(url=data[0]['thumbnail'])
embed.add_field(name=raw_data['title'], value=f"{len(data)} videos queued.", inline=True)
embed.set_footer(text=raw_data["uploader"] + ' - ' + '{0[0]}m {0[1]}s'.format(divmod(total_duration, 60)))
await ctx.send(embed=embed)
return
embed=discord.Embed(title = "Playlist", description = "Queued", color=0x30a4fb, timestamp=datetime.now(timezone.utc))
embed.set_author(name=ctx.author.display_name, icon_url=ctx.author.avatar_url)
embed.set_thumbnail(url=data['thumbnail'])
embed.add_field(name=data['title'], value=(data["description"][:72] + (data["description"][72:] and '...')), inline=True)
embed.set_footer(text=data["uploader"] + ' - ' + '{0[0]}m {0[1]}s'.format(divmod(data["duration"], 60)))
await ctx.send(embed=embed)
if download:
source = ytdl.prepare_filename(data)
else:
source = {'webpage_url': data['webpage_url'], 'requester': ctx.author, 'title': data['title'], 'uploader': data['uploader'], 'description': data['description'], 'duration': data['duration'], 'thumbnail': data['thumbnail']}
player.queue.append(source)
return
source = cls(discord.FFmpegPCMAudio(source), data=data, requester=ctx.author)
player.queue.append(source)
@classmethod
async def regather_stream(cls, data, *, loop):
loop = loop or asyncio.get_event_loop()
requester = data['requester']
to_run = partial(ytdl.extract_info, url=data['webpage_url'], download=True)
data = await loop.run_in_executor(None, to_run)
return(cls(discord.FFmpegPCMAudio(data['url']), data=data, requester=requester))
Я использую переписывающую ветку discord.py для бота. Я не уверен, нужно ли мне предоставить более подробную информацию? Пожалуйста, дайте мне знать, мне действительно нужно это исправить ...





На самом деле это не проблема вашего кода (и многие люди жалуются на эту ошибку).
Это просто возможная проблема, когда потоковое видео. Если вы абсолютно хотите транслировать его, вы должны принять это как потенциальную проблему. Обратите внимание, как (почти) все музыкальные боты устанавливают ограничения для видео / музыки, которую вы хотите слушать.
Если вам нужно убедиться, что вы не столкнулись с этой проблемой, вам необходимо полностью загрузить музыку. (Что также увеличит загрузку бота перед игрой).
Я вижу, вы сами ответили на свой вопрос. Не могли бы вы рассказать, как вы пришли к такому выводу? И правильно ли я читаю это, говоря, что проблема не в истечении срока действия ссылки, а в том, что YouTube убивает соединение, потому что считает, что ваш код является ботом? Если это так, на каком основании?
Это был не мой вопрос, я его только отредактировал. Это не связано с каким-либо «обнаружением» YouTube (хотя использование youtube_dl для самой цели потоковой передачи / загрузки нарушает условия обслуживания Youtube).
Сможете ли вы опубликовать весь свой код? У меня может быть решение для вас, если я смогу увидеть весь код.
решение, которое я бы порекомендовал, - это загрузить соонг, а затем удалить его.
Вы можете установить для своей загрузки значение true, а затем добавить это в свой player_loop
try:
# We are no longer playing this song...so, lets delete it!
with YoutubeDL(ytdlopts) as ydl:
info = ydl.extract_info(source.web_url, download=False)
filename = ydl.prepare_filename(info)
try:
if os.path.exists(filename):
os.remove(filename)
else:
pass
except Exception as E:
print(E)
await self.np.delete()
except discord.HTTPException:
pass
немного испорчен, но его можно было очистить, это было лучшее решение, которое я нашел для себя.
Какова длина и качество звука, который вы пытаетесь транслировать?