Wie verwende ich youtube-dl aus einem Python-Programm?


81

Ich möchte auf das Ergebnis des folgenden Shell-Befehls zugreifen:

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

um die Ausgabe direct urlaus einem Python-Programm in eine Datei zu drucken . Folgendes habe ich versucht:

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

Ist das möglich? Ich habe versucht , den Mechanismus in der Quelle zu verstehen , aber verloren ging: youtube_dl/__init__.py, youtube_dl/youtube_DL.py, info_extractors...




2
@lollercoaster, diese URL ist tot ... Link hier behoben .
s3cur3

Antworten:


135

Es ist nicht schwierig und tatsächlich dokumentiert :

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)

3
Ich erhalte diesen Fehler: import youtube_dl ImportError: Kein Modul namens youtube_dl
Ufoguy

8
Sie müssen die youtube_dl installieren: Wenn Sie das Dienstprogramm pip haben (um es zu installieren, sudo apt-get install python-pip), können Sie sudo pip youtube-dl installieren
JulienFr

Wenn Sie auf gentoo "Kein Modul mit dem Namen youtube_dl" haben, können Sie versuchen, "#! / Usr / bin / env python2.7" am Anfang der Python-Datei hinzuzufügen.
Puchu

9
Ich weiß, das ist alt und es gibt andere Antworten, aber nur um es zu klären. Auf neuen Versionen von youtube_dl gab es einige Änderungen und stattdessen wurde video['url']es zuvideo['webpage_url']
DarkXDroid

4
Was ist der Zweck von with ydl:?
HelloGoodbye

4

Hier ist ein Weg.

Wir richten die Zeichenfolge der Optionen in einer Liste genauso ein wie die Befehlszeilenargumente. In diesem Fall opts=['-g', 'videoID']. Rufen Sie dann auf youtube_dl.main(opts). Auf diese Weise schreiben wir unser benutzerdefiniertes .py-Modul import youtube_dlund rufen dann die main()Funktion auf.


Bei dieser Art von Arbeiten wird nichts von der Hauptfunktion zurückgegeben, sodass Sie den Wert noch nicht wirklich ermitteln können.
Anthony Chung

4

Für einfachen Code kann ich denken

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

Oben wird nur die Befehlszeile in Python ausgeführt.

Andere werden in der Dokumentation Verwenden von youtube-dl auf Python erwähnt. Hier ist der Weg

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'])

-3

Wenn youtube-dles sich um ein Terminalprogramm handelt, können Sie mit dem subprocessModul auf die gewünschten Daten zugreifen.

Weitere Informationen finden Sie unter diesem Link: Aufrufen eines externen Befehls in Python


50
Es ist ein bisschen traurig, ein Python-Programm von einem Python-Programm aus aufzurufen, nicht wahr?
JulienFr

11
Ich halte youtube-dles für ein in Python geschriebenes Befehlszeilenprogramm und sehe nichts Falsches daran, es über die Befehlszeile aufzurufen. Wenn Sie mit dem Quellcode herumspielen möchten, können Sie dies gerne tun.

10
@Xaranke Sie haben viel mehr Kontrolle, wenn Sie youtube-dl als Modul aus Python importieren. Das Parsen gedruckter Daten über die Befehlszeile ist nirgends so zuverlässig.
Wally

Außerdem wage ich Sie, tatsächlich zu versuchen, subprocess / os.system für diesen youtube-dl-Befehl zu verwenden. Es funktioniert weder sehr gut noch wie beabsichtigt, wenn versucht wird, Argumente zu übergeben.
Izaac Corbett

-6

das würde mir gefallen

from subprocess import call

command = "youtube-dl https://www.youtube.com/watch?v=NG3WygJmiVs -c"
call(command.split(), shell=False)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.