1

I started self-learning Python yesterday, so apologies in advance for any etiquette errors. My challenge was to take a .csv list of song titles, search each video on YouTube, and then use youtube-dl to download the audio. My code seems to work for one output file but then the loop ends for reasons I can't work out. The main error is DownloadError: [0;31mERROR:[0m ffprobe or avprobe not found. Please install one. But I have installed these (to the best of my knowledge). I have tried and tried to work this out but without any fundamental knowledge I'm drowning. I'm using python 2.7.13. Any advice? Sorry for the ugly code!

Main function:

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

The function it uses, 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')

And the full output in the shell window. The first mp3 is saved, but then the loop ends and my screen drowns in red errors.

================================== 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.
>>> 
David Smerdon
  • 59
  • 1
  • 6

1 Answers1

3

You want audio as mp3. YouTube only serves audio in other formats, such as m4a. Therefore, youtube-dl downloads the m4a file and converts it to mp3. youtube-dl does not include a custom mp3 converter. It uses ffmpeg or avconv for audio conversion.

Therefore, if you want to convert audio, you need to install ffmpeg or avconv. How do that on macOS is documented in detail at our sister site superuser.

The other warnings you're getting are because of a misconconfigured beautifulsoup. Instead of trying to parse the search results yourself, let youtube-dl do it, a URL along the lines of 'ytsearch1:flying bunny' should do the trick.

  • Thanks for the quick answer! Whenever I try to install ffmpeg, I get this answer: `Error: Could not link: /usr/local/share/man/man1/brew.1 Please delete these paths and run `brew update`.` When I run `echo $PATH`, I get this: `/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/Library/TeX/texbin` I don't really understand paths yet. Could it be that ffmpeg is installed somewhere but that I've set it up incorrectly? – David Smerdon Mar 26 '17 at 20:13
  • This sounds like a separate question. Feel free to [ask that question](http://stackoverflow.com/questions/ask). Make sure to include the actual commands you're running and the *full* output. I am not sure why `$PATH` should be relevant, but if you believe it is, post it in the new question as well. Have you tried doing what the message says and deleting `/usr/local/share/man/man1/brew.1`? Your theory could be correct, but I see no evidence for that. –  Mar 26 '17 at 20:31
  • Yes, I tried that. Okay, I'll ask it as a separate question - thanks for your patience! (Edit: Apparently I have reached my question limit - after one question) – David Smerdon Mar 26 '17 at 20:56
  • @DavidSmerdon That's probably because this question had downvotes - for reasons I'm not sure about, but most likely because you did not create [a *minimal* example](https://stackoverflow.com/help/mcve). Your question is now +0, so you should be able to ask again. See [this page](https://meta.stackexchange.com/help/asking-rate-limited) for more information. –  Mar 26 '17 at 21:28
  • Thanks very much. In the meantime I found that my problem and full output-errors closely replicate this one: [link](https://github.com/rg3/youtube-dl/issues/10029), from which the answer directs to this question: [link](http://stackoverflow.com/questions/1681208/python-platform-independent-way-to-modify-path-environment-variable/1681244#1681244). But I have not been able to implement this solution. Is it worth duplicating by posting my question? – David Smerdon Mar 26 '17 at 21:45
  • Well, if the `ffmpeg` binary is not in your path, find it (with `locate find` in the shell). There are two outcomes: You have accidentally installed ffmpeg, but it's not in your path, or you have not installed ffmpeg yet. Given that you get an error on installation the latter option seems far more likely to me. In any case, try to make your question razor-focused on one problem, but still as verbose as it needs to be. –  Mar 26 '17 at 22:18