2017-03-26 52 views
0

昨天我开始自学Python,所以对于任何礼仪错误都提前道歉。我的挑战是获取歌曲标题的.csv列表,在YouTube上搜索每个视频,然后使用youtube-dl下载音频。我的代码似乎适用于一个输出文件,但循环结束,原因是我无法解决。主要的错误是DownloadError: [0;31mERROR:[0m ffprobe or avprobe not found. Please install one.但我已经安装了这些(据我所知)。我尝试过并试图解决这个问题,但没有任何基本的知识,我溺水了。我使用python 2.7.13。有什么建议?对不起,难看的代码!Mac上的ffprobe/avprobe和youtube_dl的Python问题

主要功能:

import csv 
import youtube_extract 

#concatenate column elements of each row: 
with open('Songs for wedding test.csv') as f: 
    reader = csv.reader(f) 
    with open('Songs for wedding test output.csv', 'w') as g: 
     writer = csv.writer(g) 
     for row in reader: 
      new_row = [' '.join([row[0], row[1]])] + row[2:] 
      writer.writerow(new_row) 

with open('Songs for wedding test output.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=';') 
    #Make into a list: 
    data = list(spamreader) 
    #Convert into usable strings: 
    data2=data 
    for i, item in enumerate(data): 
     data2[i] = str(data[i]) 
     youtube_extract.extract_download(data2[i])  
    print data2 

它使用的功能,youtube_extract.py:

#!/usr/bin/env python2.7 

from __future__ import unicode_literals 
import sys; sys.path 
sys.path.append('/usr/local/bin/youtube-dl') 
sys.path.append('/usr/local/Cellar/ffmpeg/3.2.4') 
import os 
import youtube_dl 
import urllib 
import urllib2 
import bs4 
from bs4 import BeautifulSoup 


def extract_download(textToSearch): 
    #Get rid of square brackets and quotes: 
    query = urllib.quote(str(textToSearch).replace('[','').replace(']','').replace('"','').replace('"','')) 
    url = "https://www.youtube.com/results?search_query=" + query 
    response = urllib2.urlopen(url) 
    html = response.read() 
    soup = BeautifulSoup(html) 
    for a in soup.findAll(attrs={'class':'yt-uix-tile-link'}, limit=1): 
     vidid = 'https://www.youtube.com' + a['href'] 
     print vidid 

    os.chdir('/Users/smurfo/Music/Wedding songs') 
    ydl_opts = { 
     'format': 'bestaudio/best', 
     'download_archive': 'downloaded_songs.txt', 
     'verbose': True, 
     'outtmpl': 'Wedding songs/%(title)s.%(ext)s', 
     'postprocessors': [{ 
      'key': 'FFmpegExtractAudio', 
      'preferredcodec': 'mp3', 
      'preferredquality': '192', 
     }], 
    } 
    with youtube_dl.YoutubeDL(ydl_opts) as ydl: 
     ydl.download([vidid]) 

    os.chdir('/Users/smurfo/Dropbox/Coding/Python learning') 

而在shell窗口全部输出。第一首mp3已保存,但循环结束,屏幕出现红色错误。

================================== RESTART: /Users/smurfo/Dropbox/Coding/Python learning/csv reading.py ================================== 

Warning (from warnings module): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/beautifulsoup4-4.5.3-py2.7.egg/bs4/__init__.py", line 181 
UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. 

The code that caused this warning is on line 1 of the file <string>. To get rid of this warning, change code that looks like this: 

BeautifulSoup([your markup]) 

to this: 

BeautifulSoup([your markup], "html.parser") 

https://www.youtube.com/watch?v=7fkOqXAHLKQ 
[debug] Encodings: locale US-ASCII, fs utf-8, out us-ascii, pref US-ASCII 
[debug] youtube-dl version 2017.03.24 
[debug] Python version 2.7.13 - Darwin-16.4.0-x86_64-i386-64bit 
[debug] exe versions: none 
[debug] Proxy map: {} 
[youtube] 7fkOqXAHLKQ: Downloading webpage 
[youtube] 7fkOqXAHLKQ: Downloading video info webpage 
[youtube] 7fkOqXAHLKQ: Extracting video information 
[youtube] {22} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {43} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {18} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {36} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {17} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {136} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {247} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {135} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {244} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {134} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {243} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {133} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {242} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {160} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {278} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {140} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {171} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {249} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {250} signature length 43.40, html5 player en_US-vflEzRdnB 
[youtube] {251} signature length 43.40, html5 player en_US-vflEzRdnB 
[debug] Invoking downloader on u'https://r5---sn-fpoq-hm2z.googlevideo.com/videoplayback?dur=202.950&lmt=1449647638777560&ip=151.18.103.48&key=yt6&id=o-AO0F6ZMx0LP0Swm_iDiWZtFd0HZozItNeM1bUmT7Q2Ey&itag=171&sparams=clen%2Cdur%2Cei%2Cgir%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Ckeepalive%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpcm2cms%2Cpl%2Crequiressl%2Csource%2Cupn%2Cexpire&upn=jTIcpTuU5gc&mime=audio%2Fwebm&pcm2cms=yes&pl=17&source=youtube&gir=yes&ipbits=0&initcwndbps=838750&keepalive=yes&clen=3160765&mn=sn-fpoq-hm2z&mm=31&requiressl=yes&expire=1490574223&ms=au&ei=LwfYWNH4E4bLWcuTpcgK&mv=m&mt=1490552546&signature=10CC47D7073DC66C89435916227A67196D22DA2D.D55F1282DFF0CC8992D3680B6220F5FC5078BD72&ratebypass=yes' 
[download] Destination: Wedding songs/Parov Stelar - Jimmys Gang (Official Video).webm 

[K[download] 0.0% of 3.01MiB at 10.26KiB/s ETA 05:00 
[K[download] 0.1% of 3.01MiB at 20.50KiB/s ETA 02:30 
[K[download] 0.2% of 3.01MiB at 36.44KiB/s ETA 01:24 
[K[download] 0.5% of 3.01MiB at 65.40KiB/s ETA 00:46 
[K[download] 1.0% of 3.01MiB at 111.40KiB/s ETA 00:27 
[K[download] 2.0% of 3.01MiB at 192.12KiB/s ETA 00:15 
[K[download] 4.1% of 3.01MiB at 334.31KiB/s ETA 00:08 
[K[download] 8.3% of 3.01MiB at 543.36KiB/s ETA 00:05 
[K[download] 16.6% of 3.01MiB at 748.14KiB/s ETA 00:03 
[K[download] 33.1% of 3.01MiB at 940.02KiB/s ETA 00:02 
[K[download] 66.3% of 3.01MiB at 1.22MiB/s ETA 00:00 
[K[download] 100.0% of 3.01MiB at 1.43MiB/s ETA 00:00 
[K[download] 100% of 3.01MiB in 00:02 
[0;31mERROR:[0m ffprobe or avprobe not found. Please install one. 
Traceback (most recent call last): 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1930, in post_process 
    files_to_delete, info = pp.run(info) 
    File "/usr/local/bin/youtube-dl/youtube_dl/postprocessor/ffmpeg.py", line 239, in run 
    filecodec = self.get_audio_codec(path) 
    File "/usr/local/bin/youtube-dl/youtube_dl/postprocessor/ffmpeg.py", line 154, in get_audio_codec 
    raise PostProcessingError('ffprobe or avprobe not found. Please install one.') 
PostProcessingError: ffprobe or avprobe not found. Please install one. 


Traceback (most recent call last): 
    File "/Users/smurfo/Dropbox/Coding/Python learning/csv reading.py", line 26, in <module> 
    youtube_extract.extract_download(data2[i]) 
    File "/Users/smurfo/Dropbox/Coding/Python learning/youtube_extract.py", line 39, in extract_download 
    ydl.download([vidid]) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1884, in download 
    url, force_generic_extractor=self.params.get('force_generic_extractor', False)) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 772, in extract_info 
    return self.process_ie_result(ie_result, download, extra_info) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 826, in process_ie_result 
    return self.process_video_result(ie_result, download=download) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1527, in process_video_result 
    self.process_info(new_info) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1865, in process_info 
    self.post_process(filename, info_dict) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1932, in post_process 
    self.report_error(e.msg) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 589, in report_error 
    self.trouble(error_message, tb) 
    File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 559, in trouble 
    raise DownloadError(message, exc_info) 
DownloadError: [0;31mERROR:[0m ffprobe or avprobe not found. Please install one. 
>>> 

回答

1

你想要音频作为mp3。 YouTube仅以其他格式提供音频,例如m4a。因此,youtube-dl下载m4a文件并将其转换为mp3。 youtube-dl不包括自定义mp3转换器。它使用ffmpeg或avconv进行音频转换。

因此,如果你想转换音频,你需要安装ffmpeg或avconv。 macOS如何做到这一点is documented in detail at our sister site superuser

你得到的其他警告是由于配置不当引起的。不要试图自己解析搜索结果,而是让youtube-dl做到这一点,沿'ytsearch1:flying bunny'的网址应该做的伎俩。

+0

感谢您的快速回答!每当我尝试安装ffmpeg,我都会得到这个答案:'错误:无法链接: /usr/local/share/man/man1/brew.1 请删除这些路径并运行'brew update'.' 当我运行'echo $ PATH'时,我得到: '/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/ local/bin:/ opt/X11/bin:/ Library/TeX/texbin' 我还没有真正理解路径。难道是ffmpeg被安装在某处,但我已经设置不正确? –

+0

这听起来像一个单独的问题。随意[问这个问题](http://stackoverflow.com/questions/ask)。确保包含您正在运行的实际命令和* full *输出。我不确定为什么'$ PATH'应该是相关的,但如果你相信它,也可以在新的问题中发布它。你是否尝试过做什么消息说删除'/ usr/local/share/man/man1/brew.1'?你的理论可能是正确的,但我没有看到这方面的证据。 – phihag

+0

是的,我试过了。好的,我会问这是一个单独的问题 - 感谢您的耐心! (编辑:显然我已经达到了我的问题限制 - 一个问题后) –