92

I would like to access the result of the following shell command,

youtube-dl -g "www.youtube.com/..."

to print its output direct url to a file, from within a python program. This is what I have tried:

import youtube-dl
fromurl="www.youtube.com/..."
geturl=youtube-dl.magiclyextracturlfromurl(fromurl)

Is that possible? I tried to understand the mechanism in the source but got lost: youtube_dl/__init__.py, youtube_dl/youtube_DL.py, info_extractors ...

Sakib Arifin
  • 194
  • 11
JulienFr
  • 1,792
  • 1
  • 20
  • 29

5 Answers5

155

It's not difficult and actually documented:

import youtube_dl

ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s.%(ext)s'})

with ydl:
    result = ydl.extract_info(
        'http://www.youtube.com/watch?v=BaW_jenozKc',
        download=False # We just want to extract the info
    )

if 'entries' in result:
    # Can be a playlist or a list of videos
    video = result['entries'][0]
else:
    # Just a video
    video = result

print(video)
video_url = video['url']
print(video_url)
Garbit
  • 5,331
  • 6
  • 35
  • 69
jaimeMF
  • 2,389
  • 1
  • 14
  • 13
  • 3
    I'm getting this error: import youtube_dl ImportError: No module named youtube_dl – Ufoguy Jan 01 '14 at 18:54
  • 8
    You have to install the youtube_dl : if you have the pip utility (to install it, sudo apt-get install python-pip ) you can to sudo pip install youtube-dl – JulienFr Mar 03 '14 at 12:38
  • If you have "No module named youtube_dl" on gentoo you can try to add "#!/usr/bin/env python2.7" to the start of python file. – puchu Oct 22 '14 at 10:39
  • is there a way to pass a variable to the options object? Something like: 'outtmpl' : '%(my_variable)s%(id)s.%(ext)s' – Dusan May 24 '15 at 12:30
  • The variables supported for `outtmpl` are listed [in the README](https://github.com/rg3/youtube-dl/blob/23905927e19280d9217ecad377ef26ea9d5793fe/README.md#output-template) – jaimeMF May 25 '15 at 19:02
  • 9
    I know this is old and there are other answers but just to clarify. On new versions of youtube_dl there were some changes and instead of `video['url']` it changed to `video['webpage_url']` – DarkXDroid Aug 08 '15 at 00:20
  • How can we add "-c" or continue flag in the options? – shane Nov 08 '16 at 10:31
  • The script you gave if wrong if the video url contains "entries". it should be something like try :video = result['entries'][0] except: video=result – JulienFr Apr 13 '19 at 15:12
  • `video['url`]` or `video[webpage_url]` just repeats the same url. I haven't found a way to get the actual stream urls (for both audio or video) – Anthony Chung Mar 26 '20 at 23:34
  • 4
    What is the purpose of `with ydl:`? – HelloGoodbye Mar 30 '20 at 01:22
  • `ydl` is an object of the type `youtube_dl.YoutubeDL(ydl_opts)` – Ciasto piekarz Jul 19 '20 at 17:25
7

For simple code, may be i think

import os
os.system('youtube-dl [OPTIONS] URL [URL...]')

Above is just running command line inside python.

Other is mentioned in the documentation Using youtube-dl on python Here is the way

from __future__ import unicode_literals
import youtube_dl

ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])
4

Here is a way.

We set-up options' string, in a list, just as we set-up command line arguments. In this case opts=['-g', 'videoID']. Then, invoke youtube_dl.main(opts). In this way, we write our custom .py module, import youtube_dl and then invoke the main() function.

cogitoergosum
  • 1,855
  • 3
  • 20
  • 43
-7

If youtube-dl is a terminal program, you can use the subprocess module to access the data you want.

Check out this link for more details: Calling an external command in Python

Community
  • 1
  • 1
  • 57
    That's a bit sad to call a python program from a python program, isn't it ? – JulienFr Aug 05 '13 at 11:30
  • 11
    I consider `youtube-dl` to be a command-line program written in Python and see nothing wrong with calling it from the command-line. If you want to muck around with the source code, please feel free to do so. –  Aug 05 '13 at 12:17
  • 10
    @Xaranke You have a lot more control if you import youtube-dl as a module from python. Parsing printed data from command line is nowhere as reliable. – Wally Mar 25 '16 at 11:53
  • Also, I dare you to actually try using subprocess/os.system on this youtube-dl command. It doesn't actually work very well, nor as intended, when trying to pass arguments. – Izaac Corbett Jan 15 '17 at 20:50
-9

I would like this

from subprocess import call

command = "youtube-dl https://www.youtube.com/watch?v=NG3WygJmiVs -c"
call(command.split(), shell=False)
Krishna Deepak
  • 1,651
  • 2
  • 18
  • 29