这是我在这里的第一个问题,因此我希望这种格式是好的。我已经在网上搜索过这个问题,并且查看了yt的文档,但是找不到有用的东西,或者我只是不知道该做什么。
在正常情况下,我使用youtube-dl从youtube下载音乐,并在我的不和谐的机器人中播放,但是它的下载速率限制成了问题(60-80 KiB/s)。出于这个原因,我开始使用yt。如果我直接使用url就行了。然而,当我使用搜索词而不是url时,似乎代码没有提取信息来获取url。(下面的代码与youtube-dl也运行得很好)下面是代码:
@bot.command()
async def play(ctx, *, searchword):
ydl_opts = {}
voice = ctx.voice_client
#get the title and url from video
下面的代码可以很好地使用直接url,但是当我编写诸如(!顺便提一句,是我的命令前缀) !play by the Sword下载没有启动,但是控制台说:
Downloading playlist: By the Sword
if searchword[0:4] == "http" or searchword[0:3] == "www":
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(searchword, download = False)
title = info["title"]
url = searchword
if searchword[0:4] != "http" and searchword[0:3] != "www":
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(f"ytsearch:{searchword}", download = False)["entries"][0]
title = info["title"]
url = info["webpage_url"]
ydl_opts = {
'format' : 'bestaudio/best',
"outtmpl" : f"{title}.mp3",
"postprocessors":
[{"key" : "FFmpegExtractAudio", "preferredcodec" : "mp3", "preferredquality" : "192"}],
}
def download(url):
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
loop = asyncio.get_event_loop()
await loop.run_in_executor(None, download, url)
#playing and queueing audio
if voice.is_playing():
queuelist.append(title)
await ctx.send(f"Added to queue: {title}")
else:
voice.play(discord.FFmpegPCMAudio(f"{title}.mp3"), after = lambda e : check_queue())
await ctx.send(f"Playing {title} !!!")
filestodelete.append(title)
def check_queue():
try:
if queuelist[0] != None:
voice.play(discord.FFmpegPCMAudio(f"{queuelist[0]}.mp3"), after = lambda e : check_queue())
filestodelete.append(queuelist[0])
queuelist.pop(0)
except IndexError:
for file in filestodelete:
os.remove(f"{file}.mp3")
filestodelete.clear()
我不确定这个问题是不是
info = ydl.extract_info(f"ytsearch:{searchword}", download = False)["entries"][0]
或者下载自己。yt的文件上说,
提示:如果您要将代码从youtube-dl移植到yt,需要注意的一点是,我们不能保证YoutubeDL.extract_info的返回值是可序列化的,甚至是字典。它将类似于字典,但是如果您想确保它是一个可序列化的字典,请通过YoutubeDL.sanitize_info传递它,如上面的示例所示。
发布于 2022-02-26 20:18:55
显然,我用另一种方式解决了这个问题。正如我前面提到的,youtube_dl工作很好,但是yt_dlp .extract_info()
是有问题的。解决这个问题的一个简单解决方案是使用youtube_dl模块提取信息,然后使用yt_dlp下载文件。
用这个进行下拉桥:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
但这用于从给定的字符串中提取url和title,而该字符串不是URL。
if searchword[0:4] != "http" and searchword[0:3] != "www":
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(f"ytsearch:{searchword}", download = False)["entries"][0]
title = info["title"]
url = info["webpage_url"]
不要忘记包括两个模块!
https://stackoverflow.com/questions/70979155
复制相似问题