Проблемы с Python с ffprobe/avprobe и youtube_dl на Mac
Вчера я начал самостоятельно изучать Python, поэтому заранее прошу прощения за ошибки в этикете. Моя задача состояла в том, чтобы взять список названий песен в формате.csv, найти каждое видео на YouTube, а затем использовать youtube-dl для загрузки аудио. Кажется, мой код работает для одного выходного файла, но затем цикл заканчивается по причинам, которые я не могу решить. Основная ошибка DownloadError: [0;31mERROR:[0m ffprobe or avprobe not found. Please install one.
Но я установил их (насколько мне известно). Я пытался и пытался решить это, но без каких-либо фундаментальных знаний я тону. Я использую Python 2.7.13. Любой совет? Извините за уродливый код!
Основная функция:
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')
И полный вывод в окне оболочки. Первый 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 подробно описано в нашем суперпользователе сайта.
Другие предупреждения, которые вы получаете, из-за неправильно настроенного красивого суппорта. Вместо того, чтобы пытаться анализировать результаты поиска самостоятельно, пусть youtube-dl сделает это, URL-адрес вдоль строк 'ytsearch1:flying bunny'
должен сделать свое дело.