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

Python: Youtube-dl status after conversion to mp3

我正在编写一个脚本来从网上下载 mp3 歌曲。首先,我将在 youtube 上进行抓取。如果找到,请使用 youtube-dl 下载并将其转换为 mp3。如果找不到(通过使用 os.path.isfile 完成),请在 beemp3(对于此示例)或 mp3skulls 等中删除。仅用于 yt 下载和文件检查的脚本如下:

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()

当我尝试进行文件检查时,尽管歌曲已下载并出现在路径中,但它失败了。由于它失败了,它转到下一个功能并下载它,这也导致我的路径中有 2 首歌曲。

所以,我的问题是如何设置该文件检查,以便它在 dlpath 中出现时打印 found

TIA

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

终于,我找到了原因。似乎 %(title)s.%(ext)s 似乎只在 ydl_opts dict 中保存值。 this answer 帮助了我。

我将 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')

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