Сессия Python Youtube ffmpeg была признана недействительной

Я получаю следующую ошибку при воспроизведении аудио с 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 для бота. Я не уверен, нужно ли мне предоставить более подробную информацию? Пожалуйста, дайте мне знать, мне действительно нужно это исправить ...

Какова длина и качество звука, который вы пытаетесь транслировать?

FrenchMasterSword 13.01.2019 14:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
4 456
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

На самом деле это не проблема вашего кода (и многие люди жалуются на эту ошибку).

Это просто возможная проблема, когда потоковое видео. Если вы абсолютно хотите транслировать его, вы должны принять это как потенциальную проблему. Обратите внимание, как (почти) все музыкальные боты устанавливают ограничения для видео / музыки, которую вы хотите слушать.

Если вам нужно убедиться, что вы не столкнулись с этой проблемой, вам необходимо полностью загрузить музыку. (Что также увеличит загрузку бота перед игрой).

Я вижу, вы сами ответили на свой вопрос. Не могли бы вы рассказать, как вы пришли к такому выводу? И правильно ли я читаю это, говоря, что проблема не в истечении срока действия ссылки, а в том, что YouTube убивает соединение, потому что считает, что ваш код является ботом? Если это так, на каком основании?

Sauraus 05.03.2019 21:25

Это был не мой вопрос, я его только отредактировал. Это не связано с каким-либо «обнаружением» YouTube (хотя использование youtube_dl для самой цели потоковой передачи / загрузки нарушает условия обслуживания Youtube).

FrenchMasterSword 06.03.2019 08:42

Сможете ли вы опубликовать весь свой код? У меня может быть решение для вас, если я смогу увидеть весь код.

решение, которое я бы порекомендовал, - это загрузить соонг, а затем удалить его.

Вы можете установить для своей загрузки значение 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

немного испорчен, но его можно было очистить, это было лучшее решение, которое я нашел для себя.

Другие вопросы по теме