Error: Unable to extract uploader id - Youtube, Discord.py
我在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)
这是一个已知的问题,在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
等等)。
我暂时解决了这个问题(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
这就把它从危急(退出脚本)转换为警告(简单地继续)。
fatal=False
选项即可。
- Éric 2023-03-15
对于使用 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,请在此处 下载。我测试了它,它确实有效。
Youtube-dl
报告自己是'破损的'2021.12.17版本(!),但它是一个更新的版本。Youtube-dl
repo的维护者真的需要在master
上修复那个! :-)谢谢你分享你的解决方案/修复。
- Gwyneth Llewelyn 2023-03-13
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
,对我来说是完美的:)
不要使用这个东西:
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)
上面的代码肯定会运行。