Error: Unable to extract uploader id - Youtube, Discord.py

回答 6 浏览 4.9万 2023-02-18

我在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)

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

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)
nikita goncharov 提问于2023-02-18
6 个回答
#1楼 已采纳
得票数 55

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

python3 -m pip install --force-reinstall https://github.com/yt-dlp/yt-dlp/archive/master.tar.gz

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

yt-dlp URL

其中URL是你想要的视频的URL。所有选项见yt-dlp --help。它应该只是工作,没有错误。

如果你把它作为一个模块来使用、

import yt_dlp as youtube_dl

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

innisfree 提问于2023-02-20
innisfree 修改于2023-02-22
我安装了它,但Python代码没有发现它。nikita goncharov 2023-02-22
sudo snap install yt-dlpKarim Bn Abdlaziz 2023-02-26
我正在使用master(6fece0a96b3cd8677f5c1185a57c6e21403fcb44),2023-03-14,问题没有得到解决。m4r35n357 2023-03-29
在Mac Air上解决了我的问题,谢谢你。Steve Lihn 2023-05-05
#2楼
得票数 38

我暂时解决了这个问题(v2021.12.17),直到有新的更新,通过编辑文件:your/path/to/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

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

这就把它从危急(退出脚本)转换为警告(简单地继续)。

Ricky Levi 提问于2023-03-01
Ricky Levi 修改于2023-04-01
当我在等待自制软件从主程序中获取更新时,这就解决了我的问题。Holgzn 2023-03-02
你是如何意识到这一点的?有什么技巧可以分享吗?Daniel Bandeira 2023-03-03
@DanielBandeira 我只是在互联网上搜索解决方案,阅读了许多帖子和评论,保持这个帖子开放,如果我找到一个解决方案,工作,我也会在这里发布答案......一旦我发现一个评论,给出了这个解决方案 - 我在这里为其他人分享它......Ricky Levi 2023-03-06
谢谢。我认为提及这一点很好,它是2021.12.17版本的第1794行(目前的最后一个版本)。只要加上fatal=False选项即可。Éric 2023-03-15
@Ricky Levi 谢谢你的解决方案!这为我解决了问题。我可以确认,我在2023年3月18日下载了最新的可用版本n Github,在你提到的第n° 1794行,通过添加fatal=False,问题得到了解决。user17911 2023-03-17
#3楼
得票数 13

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

boez 提问于2023-03-05
我注意到使用了"yote-dl"和"yote_dl",这些是错别字还是可以互换的,还是截然不同的实体?Dee 2023-03-07
它可能是一个打字错误,因为只有"youtube_dl"作为一个库存在,而不是"youtube-dl"。boez 2023-03-08
是的,它像广告上说的那样工作。我有点困惑,因为Youtube-dl报告自己是'破损的'2021.12.17版本(!),但它一个更新的版本。Youtube-dl repo的维护者真的需要在master上修复那个! :-)谢谢你分享你的解决方案/修复。Gwyneth Llewelyn 2023-03-13
是的,你是对的。boez 2023-03-15
#4楼
得票数 7

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

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

dogukanarkan 提问于2023-02-19
我是否需要改变我的整个Python代码,以便它能与yt-dlp一起工作?nikita goncharov 2023-02-19
#5楼
得票数 0
    ytdl_format_options = {
    'format': 'bestaudio/best',
    'restrictfilenames': True,
    'noplaylist': True,
    'extractor_retries': 'auto',
    '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

添加extractor_retries,对我来说是完美的:)

Allen Poston 提问于2023-03-13
DaveL17 修改于2023-03-15
#6楼
得票数 0

不要使用这个东西:

    ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s%(ext)s'})
    from __future__ import unicode_literals
    import youtube_dl
    ydl_opts = {
         'format': 'bestaudio/best',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192'
        }],
        'postprocessor_args': [
            '-ar', '16000'
        ],
        'prefer_ffmpeg': True,
        'keepvideo': True
    }
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download(['link'])

use this:
from pytube import YouTube
import os

yt = YouTube('link')

video = yt.streams.filter(only_audio=True).first()

out_file = video.download(output_path=".")

base, ext = os.path.splitext(out_file)
new_file = base + '.mp3'
os.rename(out_file, new_file)

上面的代码肯定会运行。

Avijit Chowdhury 提问于2023-03-31