Python:Youtube dl转换为mp3后的状态

Python:Youtube dl转换为mp3后的状态,python,python-3.x,youtube-dl,Python,Python 3.x,Youtube Dl,我正在写一个脚本从网上下载mp3歌曲。首先我会在youtube上搜索。如果找到,请使用youtube dl下载并将其转换为mp3。如果未找到(通过使用os.path.isfile),请在BEEM3中报废(对于此示例)或mp3skulls等。仅用于下载和文件检查的脚本如下所示: from bs4 import BeautifulSoup from urllib.request import urlopen,Request,urlretrieve import re import youtube_d

我正在写一个脚本从网上下载mp3歌曲。首先我会在youtube上搜索。如果找到,请使用youtube dl下载并将其转换为mp3。如果未找到(通过使用
os.path.isfile
),请在BEEM3中报废(对于此示例)或mp3skulls等。仅用于下载和文件检查的脚本如下所示:

from bs4 import BeautifulSoup
from urllib.request import urlopen,Request,urlretrieve
import re
import youtube_dl
import sys
import os

def ytscrape(searchurl,baseurl):
    """normal scraping"""
    req = Request(searchurl, headers={'User-Agent':'Mozilla/5.0'})
    lst[:] = []
    url = urlopen(req)
    soup = BeautifulSoup(url, 'lxml')
    for i in soup.find_all('div',{'class':['yt-lockup-content','yt-lockup-meta-info']},limit=10):
        for link,views in zip(i.select('h3 > a'),i.select('ul > li')):
            if views is not None and views.next_sibling is not None:
                lst.append([baseurl+link.get('href'),views.next_sibling.text])
    for i in lst:
        i[1] = int(re.sub(r' views|,','',i[1]))
    lst.sort(key = lambda x:x[1])
    url.close()
    return lst[-1][0]

def dl_frm_youtube(yt_lnk,dlpath):
    """passes the youtube url of the song. it extracts audio alone and saves it
    in local.
    yt_lnk : youtube url for song which is priortised based on channel/views.
    """
    ydl_opts = {'format':'bestaudio/best','outtmpl':dlpath+'\\%(title)s.%(ext)s','postprocessors':[{'key':'FFmpegExtractAudio','preferredcodec':'mp3','preferredquality':'192',}]}
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([yt_lnk])
        if os.path.isfile(dlpath+'\\%(title)s.%(ext)s'):
            print('found')
        else:
            print('not found')

def main():
    song = 'numb' 
    artist = 'linkin park'
    baseurl = 'https://www.youtube.com'
    if sys.platform == 'win32':
        dlpath = os.path.join(os.environ['USERPROFILE'],'Music','spd')
        if not os.path.exists(dlpath):
            os.mkdir(dlpath)
    else:
        dlpath = '~/Music/' + song + '.mp3'
    searchurl = baseurl + '/results?search_query=' + '+' + artist.replace(chr(32),'+') + '+' + song.replace(chr(32),'+')
    dl_frm_youtube(ytscrape(searchurl,baseurl),dlpath)


lst = []
main()
当我尝试执行文件检查时,它失败了,即使歌曲已下载并且存在于路径中。由于它失败了,它转到下一个函数并下载了它,这也导致我的路径中有两首歌曲

因此,我的问题是如何设置该文件检查,以便在dlpath中存在该文件时进行打印

短暂性脑缺血发作

编辑:
根据phihag的评论,我删除了所有无用的信息,将代码更改为只有问题部分,并对输入进行了硬编码。

最后,我找到了原因。似乎
%(title)s.%(ext)s
似乎只包含ydl_opts dict中的值。帮助了我

我将dl_frm_youtube中的代码更改为:

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        #ydl.download([yt_lnk])
        info = ydl.extract_info(yt_lnk, download=True)
        songname = info.get('title', None)
        #print(songname)
        if os.path.isfile(dlpath+'\\'+songname+'.mp3'):
            print('found')

而且它工作得很好。如果有人觉得有用,我会回答。

最后,我找到了原因。似乎
%(title)s.%(ext)s
似乎只包含ydl_opts dict中的值。帮助了我

我将dl_frm_youtube中的代码更改为:

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        #ydl.download([yt_lnk])
        info = ydl.extract_info(yt_lnk, download=True)
        songname = info.get('title', None)
        #print(songname)
        if os.path.isfile(dlpath+'\\'+songname+'.mp3'):
            print('found')

而且它工作得很好。如果有人觉得有用,请回答。

请确保您的示例正确无误(请参阅)。它应该是最小的(使用Beescrap或youtube dl,并简化)和可复制的(确保对所有输入进行硬编码)。此外,函数
ytscrap
似乎是youtube dl的
ytsearch
提取器的重新实现。如果您只想知道后处理何时完成,则无需安装挂钩,只需在最后一行之后继续。根据经验,一个好的stackoverflow问题应该少于20行。谢谢。我根据你的评论进行了编辑。至于
ytscrape
,我正在练习网页抓取,这纯粹是为了我的学习目的,因此重新发明了车轮部件。拆下挂钩,在最后一行后进行检查。它仍然无法按预期工作。请确保您的示例是正确的(请参阅)。它应该是最小的(使用Beescrap或youtube dl,并简化)和可复制的(确保对所有输入进行硬编码)。此外,函数
ytscrap
似乎是youtube dl的
ytsearch
提取器的重新实现。如果您只想知道后处理何时完成,则无需安装挂钩,只需在最后一行之后继续。根据经验,一个好的stackoverflow问题应该少于20行。谢谢。我根据你的评论进行了编辑。至于
ytscrape
,我正在练习网页抓取,这纯粹是为了我的学习目的,因此重新发明了车轮部件。拆下挂钩,在最后一行后进行检查。它仍然没有按预期工作。