首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从youtube-dl移植到yt-dlp库的Python不和谐机器人代码

从youtube-dl移植到yt-dlp库的Python不和谐机器人代码
EN

Stack Overflow用户
提问于 2022-02-03 22:25:52
回答 1查看 1.5K关注 0票数 0

这是我在这里的第一个问题,因此我希望这种格式是好的。我已经在网上搜索过这个问题,并且查看了yt的文档,但是找不到有用的东西,或者我只是不知道该做什么。

在正常情况下,我使用youtube-dl从youtube下载音乐,并在我的不和谐的机器人中播放,但是它的下载速率限制成了问题(60-80 KiB/s)。出于这个原因,我开始使用yt。如果我直接使用url就行了。然而,当我使用搜索词而不是url时,似乎代码没有提取信息来获取url。(下面的代码与youtube-dl也运行得很好)下面是代码:

代码语言:javascript
运行
复制
@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下载没有启动,但是控制台说:

代码语言:javascript
运行
复制
Downloading playlist: By the Sword
代码语言:javascript
运行
复制
    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"]
代码语言:javascript
运行
复制
    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)
代码语言:javascript
运行
复制
    #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() 

我不确定这个问题是不是

代码语言:javascript
运行
复制
info = ydl.extract_info(f"ytsearch:{searchword}", download = False)["entries"][0]

或者下载自己。yt的文件上说,

提示:如果您要将代码从youtube-dl移植到yt,需要注意的一点是,我们不能保证YoutubeDL.extract_info的返回值是可序列化的,甚至是字典。它将类似于字典,但是如果您想确保它是一个可序列化的字典,请通过YoutubeDL.sanitize_info传递它,如上面的示例所示。

下面是链接:https://github.com/yt-dlp/yt-dlp#embedding-yt-dlp,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-26 20:18:55

显然,我用另一种方式解决了这个问题。正如我前面提到的,youtube_dl工作很好,但是yt_dlp .extract_info()是有问题的。解决这个问题的一个简单解决方案是使用youtube_dl模块提取信息,然后使用yt_dlp下载文件。

用这个进行下拉桥:

代码语言:javascript
运行
复制
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])

但这用于从给定的字符串中提取url和title,而该字符串不是URL。

代码语言:javascript
运行
复制
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"]

不要忘记包括两个模块!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70979155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档