【问题标题】:Youtube-dl KeyError: 'entries'Youtube-dl KeyError:“条目”
【发布时间】:2021-03-29 01:28:06
【问题描述】:

当执行“+dl https://youtube......”时,我尝试使用 discord.py 获取视频的一些信息,程序以 mp3 格式下载 youtube 链接并发送:视频名称, duration 和 id 但在执行过程中出现错误:


    ydl_opts = {
    'outtmpl': './SomethingMore/dl.mp3',
    'format': 'bestaudio/best',
    'noplaylist': True,
    'default_search' : 'ytsearch',
    'postprocessors': [{
    'key': 'FFmpegExtractAudio',
    'preferredcodec': 'mp3',
    'preferredquality': '192',
    }]}

    Link = ctx.message.content
    Link = Link.strip('+dl ')

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:

        playlist_dict = ydl.extract_info(Link, download=False)
        
        for video in playlist_dict['entries']:
                 
            if not video:
                print('ERROR: Unable to get info. Continuing...')
                continue
 
            video_title = video.get("title")
            video_duration = video.get("duration")
            video_id = video.get("id")
            

        await ctx.channel.send('Download of '+ video_title +' is starting, please wait a minute')

        try:
            ydl.download([Link])
            await ctx.channel.send('Download ended')

这是错误:

Ignoring exception in command dl:
Traceback (most recent call last):
  File "C:\Users\Zarcross\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "h:\Users\Zarcross\Desktop\Discord\main.py", line 267, in dl
    for video in playlist_dict['entries']:
KeyError: 'entries'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Zarcross\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\ext\commands\bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\Zarcross\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\ext\commands\core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "C:\Users\Zarcross\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\ext\commands\core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: KeyError: 'entries'

【问题讨论】:

  • " 但我在执行过程中遇到错误:" 请显示complete error message
  • 另外,请尝试制作一个正确包含的minimal example。您是否能够使该过程在您的 Discord 机器人的上下文之外工作?如果不是,那么问题与您的 Discord 机器人无关,因此与 discord.py 无关;所以你不应该向我们展示那部分(你应该只向我们展示你的最小示例),并且你不应该那样标记它。如果是,那么问题在于您的机器人如何与之交互,我们需要更多上下文。
  • 您还应该阅读ericlippert.com/2014/03/05/how-to-debug-small-programs。例如,您是否尝试验证 Link 是否符合您的预期? playlist_dict 怎么样?如果存在差异,您是否尝试找到原因?
  • 我的链接是好的链接,我得到youtu.be......
  • 没有discord.py的相同问题

标签: python discord.py youtube-dl keyerror


【解决方案1】:

显然您的playlist_dict 没有密钥'entries'

很难说,为什么。尝试检查您在playlist_dict 中还有哪些内容。

除此之外,将阻塞 (youtube-dl) 和异步 (ctx.channel.send()) 代码混合在一起是一种不好的做法。

考虑从单独的线程调度阻塞调用 (asyncio.to_thread())


UPD:据我所知,现在 YoutubeDL.extract_info() 只返回字典列表,因此您可以删除 ['entries'] 部分并遍历返回的列表。

In [73]: import youtube_dl as ydl

In [74]: with ydl.YoutubeDL() as ydl:
    ...:     ydl.extract_info??
    ...:
Signature:
ydl.extract_info(
    url,
    download=True,
    ie_key=None,
    extra_info={},
    process=True,
    force_generic_extractor=False,
)
Source:
    def extract_info(self, url, download=True, ie_key=None, extra_info={},
                     process=True, force_generic_extractor=False):
        '''
        Returns a list with a dictionary for each video we find.
        If 'download', also downloads the videos.
        extra_info is a dict containing the extra values to add to each result
        '''

        if not ie_key and force_generic_extractor:
            ie_key = 'Generic'

        if ie_key:
            ies = [self.get_info_extractor(ie_key)]
        else:
            ies = self._ies

        for ie in ies:
            if not ie.suitable(url):
                continue

            ie = self.get_info_extractor(ie.ie_key())
            if not ie.working():
                self.report_warning('The program functionality for this site has been marked as broken, '
                                    'and will probably not work.')

            return self.__extract_info(url, ie, download, extra_info, process)
        else:
            self.report_error('no suitable InfoExtractor for URL %s' % url)
File:      ~/.local/lib/python3.9/site-packages/youtube_dl/YoutubeDL.py
Type:      method

【讨论】:

  • 我明白,但是在一个经典的播放命令中,一首歌曲也以相同的参数下载,它可以工作,而在这里,它不能工作。我真的不知道什么是“条目”
  • 好的,这样就可以了,非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2020-09-05
  • 2018-07-03
  • 1970-01-01
  • 2014-12-17
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多