错误:无法提取上传者 ID - Youtube、Discord.py

nik*_*rov 83 python ffmpeg youtube-dl discord

我在不和谐(discord.py,PYTHON)中有一个非常强大的机器人,它可以在语音通道中播放音乐。它从 youtube (youtube_dl) 获取音乐。以前它工作得很好,但现在它不想处理任何视频。我尝试更新 youtube_dl 但它仍然不起作用我到处搜索但我仍然找不到可能对我有帮助的答案。

这是错误:Error: Unable to extract uploader id

错误日志之后和之前没有更多信息。有人可以帮忙吗?

我将留下一些用于我的机器人的代码... youtube 设置:

youtube_dl.utils.bug_reports_message = lambda: ''


ytdl_format_options = {
    'format': 'bestaudio/best',
    'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s',
    'restrictfilenames': True,
    'noplaylist': True,
    'nocheckcertificate': True,
    'ignoreerrors': False,
    'logtostderr': False,
    'quiet': True,
    'no_warnings': True,
    'default_search': 'auto',
    'source_address': '0.0.0.0',  # bind to ipv4 since ipv6 addresses cause issues sometimes
}

ffmpeg_options = {
    'options': '-vn',
}

ytdl = youtube_dl.YoutubeDL(ytdl_format_options)


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')
        self.duration = data.get('duration')
        self.image = data.get("thumbnails")[0]["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))
        #print(data)

        if 'entries' in data:
            # take first item from a playlist
            data = data['entries'][0]
        #print(data["thumbnails"][0]["url"])
        #print(data["duration"])
        filename = data['url'] if stream else ytdl.prepare_filename(data)
        return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data)

Run Code Online (Sandbox Code Playgroud)

运行音频的大约命令(来自我的机器人):

sessionChanel = message.author.voice.channel
await sessionChannel.connect()
url = matched.group(1)
player = await YTDLSource.from_url(url, loop=client.loop, stream=True)
sessionChannel.guild.voice_client.play(player, after=lambda e: print(
                                       f'Player error: {e}') if e else None)
Run Code Online (Sandbox Code Playgroud)

inn*_*ree 96

这是一个已知问题,已在 Master 中修复。对于临时修复,

python3 -m pip install --force-reinstall https://github.com/yt-dlp/yt-dlp/archive/master.tar.gz
Run Code Online (Sandbox Code Playgroud)

这将安装主版本。通过命令行运行它

yt-dlp URL
Run Code Online (Sandbox Code Playgroud)

其中 URL 是您想要的视频的 URL。请参阅yt-dlp --help参考资料 中的所有选项。它应该可以正常工作而不会出现错误。

如果您将其用作模块,

import yt_dlp as youtube_dl
Run Code Online (Sandbox Code Playgroud)

可能会解决您的问题(尽管 API 更改可能会破坏您的代码;我不知道您yt_dlp使用的是哪个版本等)。

  • 我正在使用 master (6fece0a96b3cd8677f5c1185a57c6e21403fcb44),2023-03-14,问题尚未解决。 (4认同)

Ric*_*evi 67

v2021.12.17通过编辑文件暂时解决了这个问题( ),直到有新的更新: your/path/to/site-packages/youtube_dl/extractor/youtube.py

示例路径:

  • 如果通过 PIP 安装:~/.local/lib/python3.10/site-packages/youtube_dl/extractor/youtube.py
  • 如果通过brew安装:/usr/local/Cellar/youtube-dl/2021.12.17/libexec/lib/python3.10/site-packages/youtube_dl/extractor/youtube.py

行号(~): 1794 并添加选项fatal=False

在此输入图像描述

前:

'uploader_id': self._search_regex(r'/(?:channel|user)/([^/?&#]+)', owner_profile_url, 'uploader id') if owner_profile_url else None
Run Code Online (Sandbox Code Playgroud)

后:

'uploader_id': self._search_regex(r'/(?:channel|user)/([^/?&#]+)', owner_profile_url, 'uploader id', fatal=False) if owner_profile_url else None
Run Code Online (Sandbox Code Playgroud)

这会将其从严重(退出脚本)转换为警告(简单地继续)

  • @DanielBandeira,我刚刚在互联网上扫描了一个解决方案,阅读了许多帖子及其评论,让这篇文章保持打开状态,以防我找到一个*有效的解决方案*,我也会在这里发布答案......一旦我找到了一个给出这个解决方案的评论 - 我在这里分享给其他人...... (6认同)
  • 当我等待自制程序从 master 获取更新时,这为我解决了这个问题 (5认同)
  • 谢谢。我认为值得一提的是,它是版本 2021.12.17 的第 1794 行(目前是最后一个)。只需添加“fatal=False”选项即可。 (2认同)
  • 非常感谢,这也解决了我的问题。 (2认同)

boe*_*oez 23

对于每个使用 youtube_dl 并想知道如何在不使用其他库的情况下解决此问题的人,例如ytdlp:首先卸载 youtube_dl,pip uninstall youtube_dl然后从其 github 安装 youtube_dl 的主分支pip install git+https://github.com/ytdl-org/youtube-dl.git@master#egg=youtube_dl。为此,您需要 git,请在此处下载。我已经测试过了,它确实有效。

编辑:

Youtube_dl 不再维护,所以我建议使用ytdlp,另请参阅此链接以了解 yt-dl 和 ytdlp 在默认行为方面的差异

  • @Dee 下划线和连字符可以互换为“pip”。Python 包应该使用连字符而不是下划线 [(source)](https://peps.python.org/pep-0008/#package-and-module-names)。但由于混乱,两者都会起作用。Pypi 显示“youtube_dl”,但“pip list”显示“youtube-dl”,无论您如何安装它。 (3认同)
  • 我注意到“youtube-dl”和“youtube_dl”的使用,这些拼写错误或可互换或明显独立的实体吗? (2认同)

Rom*_*n M 14

此修复(对于 Ubuntu/Linux):

  1. 安装 git (如果未安装 | 检查命令:$ git --version)
sudo apt install git
Run Code Online (Sandbox Code Playgroud)
  1. 安装 pip (Python 包管理器,如果未安装)
sudo apt install pip
Run Code Online (Sandbox Code Playgroud)
  1. 直接从 git 存储库重新安装 youtube-dl
sudo pip install --upgrade --force-reinstall "git+https://github.com/ytdl-org/youtube-dl.git"
Run Code Online (Sandbox Code Playgroud)


dog*_*kan 9

他们已经意识到并修复了这个问题,你可以查看这个GitHub 问题

如果你想快速修复它,你可以使用这个包。或者只是等待新版本发布,这取决于您。