PyTube – Programmierung eines Youtube-Downloaders

Einen eigenen Youtube-Downloader zu programmieren klingt nach einer Menge Arbeit… und ist es vermutlich auch. Wie praktisch, dass es für viele Aufgabenbereiche bereits vorgefertigte Python-Module gibt. So auch eines, welches uns dabei behilflich ist, Youtube-Videos herunterzuladen. Dieses Modul, genannt PyTube, werden wir uns nun im folgenden Beitrag einmal näher ansehen und schauen, ob es denn auch was taugt.

Installation von PyTube

pytube installieren wir uns über den pip-Paketmanager von Python. Falls der pip-Paketmanager noch nicht installiert ist, erledigen wir das zuvor noch schnell:

### Für Debian/Ubuntu
sudo apt install python3-pip

### Für CentOS/RedHat/Fedora
sudo dnf install python3-pip

### Arch
sudo pacman -S python-pip

### openSUSE
sudo zypper install python3-pip

Als nächstes folgt die eigentliche Installation des pytube-Moduls:

sudo pip install pytube

Grundfunktionen von Pytube

Pytube bietet, neben dem reinen herunterladen von Videos und Playlisten, unterschiedliche Funktionalitäten, wie die Anzeige von diversen Informationen über das Video wie die Laufzeit, die Bewertung oder das Thumbnail, eine Extraktion der reinen Audio-Tonspur oder sogar eine Video-Suchfunktion.

Herunterladen eines Videos

Ein einfaches Video wird folgendermaßen heruntergeladen:

import pytube

yt = pytubefix.YouTube("https://www.youtube.com/watch?v=yr4kFeilPpg")

stream = yt.streams.get_highest_resolution()
stream.download(output_path=".", filename="video.mp4")

Zunächst importieren wir uns das pytube Modul in Zeile 1. Anschließend erstellen wir in Zeile 3 ein YouTube-Objekt und übergeben dort hinein die URL eines Videos. In Zeile 5 wählen wir den Stream mit der höchsten Auflösung und laden dann das Video in Zeile 6 in den aktuellen Pfad herunter (definierbar unter output_path) und nennen es video.mp4 (mit dem Parameter filename).

Hinweis:
Fall euch nach Ausführung des Programmcodes der folgende Fehler begegnet…

… ladet euch das inoffizielle Fork pytubefix herunter (über das Linux-Terminal)…

pip install pytubefix

… und importiert dieses neue Modul anstelle dessen in der ersten Zeile:

import pytubefix

...

Da ich selbst auf ebendiesen Fehler gestoßen bin, werde ich mich im weiteren Code-Verlauf auf dieses pytubefix-Modul beziehen.

Abrufen von Video-Informationen

Aus unserem zuvor angelegten YouTube-Objekt lassen sich allerhand Informationen über das Video auslesen:

print("Title:", yt.title)
print("Number of views:", yt.views)
print("Length of video:", yt.length, "seconds")
print("Description:", yt.description)
print("Rating:", yt.rating)
print("Thumbnail-URL:", yt.thumbnail_url)

y.title – Titel des Videos
yt.views – Anzahl der Aufrufe
yt.length – Länge des Videos
yt.description – Videobeschreibung
yt.rating – Video-Bewertung

Nur die Audiospur herunterladen

In einigen Fällen kann es sinnvoll sein, sich lediglich die Tonspur eines Videos herunterzuladen:

import pytubefix

yt = pytubefix.YouTube("https://www.youtube.com/watch?v=2m3cYz6cD1c&list=PL4AqaLz4JR4LFLxcH1pU8mBKKByw0yRC6")

audio_stream = yt.streams.filter(only_audio=True).first()

audio_stream.download(output_path=".", filename="audio.mp3")

Auch hier bemühen wir das YouTube-Objekt und definieren in Zeile 5, dass wir nur an der Audiospur interessiert sind. Wie im ersten Beispiel wird das Video wieder in den aktuellen Ordner heruntergeladen und diesmal audio.mp3 genannt.

Herunterladen einer Playlist

Playlisten lassen sich über das Objekt Playlist herunterladen:

import pytube

playlist_url = "https://www.youtube.com/watch?v=2m3cYz6cD1c&list=PL4AqaLz4JR4LFLxcH1pU8mBKKByw0yRC6"
playlist = pytube.Playlist(playlist_url)

for video in playlist.videos:
    video.streams.get_highest_resolution().download()
Nach Videos suchen

Um über pytube nach Videos zu suchen, verwenden wir das Search-Objekt:

import pytubefix

search = pytubefix.Search("Der Linux Wikinger")

for result in search.results[:3]:
    print("Title:", result.title)
    print("URL:", result.watch_url)
    print("Views:", result.views)
    print()

Nachdem in Zeile 3 eine Liste mit den gefundenen Suchobjekten für das angegebene Suchwort in search gespeichert wurde, werden diese mit Hilfe der for-Schleife (Zeile 5-9) ausgegeben:

Die Suchtreffer lassen sich auch ohne weiteres weiterverarbeiten, z.B. lässt sich das erste Ergebnis direkt herunterladen:

import pytubefix

search = pytubefix.Search("Der Linux Wikinger")

first_result = search.results[0]
print(f"Downloading: {first_result.title}")

### Höchste Auflösung des ersten Suchergebnisses herunterladen
first_result.streams.get_highest_resolution().download()
Herunterladen der Videos in verschiedenen Qualitätsstufen

Bevor wir uns ein Video in einer beliebigen Auflösung herunterladen, können wir uns einen Überblick verschaffen, welche Auflösungen uns zur Verfügung stehen:

import pytubefix

yt = pytubefix.YouTube("https://www.youtube.com/watch?v=dQw4w9WgXcQ")

video_streams = yt.streams.filter(progressive=True, file_extension='mp4')

print("Verfügbare Auflösungen:")
for stream in video_streams:
    print(stream.resolution)

In Zeile 5 werden die Ergebnisse der Video-Streams (sowohl Video als auch Audio / progressive=True) und die im MP4-Format vorliegen (file_extension=’mp4′) des übergebenen Youtube-Videos gefiltert und in die Variable video_streams gespeichert. In Zeile 8-9 iteriert die for-Schleife dann durch die Auflösung der Ergebnisse und zeigt die verfügbaren Auflösungen an. Dummerweise gab bzw. gibt es zum Zeitpunkt an dem ich diesen Beitrag schreibe (und auch einigen Leuten im Internet berichten davon) einen Bug, der es lediglich erlaubt, Videos in 360p Auflösung herunterzuladen. Abhilfe schafft da erst mal nur die Bildinformationen des Videos mit der Option only_video=True

...
video_streams = yt.streams.filter(adaptive=True)
...

… und die Tonspur separat herunterzuladen.
Nichtsdestotrotz würde ein gesamter Programmblock, inklusive Anzeige der Auflösungen, Auswahl der Wunschauflösung und das Herunterladen der eingegebenen Auflösung in etwa so aussehen:

import pytubefix

# URL des YouTube-Videos
video_url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"

yt = pytubefix.YouTube(video_url)

video_streams = yt.streams.filter(progressive=True, file_extension='mp4')

print("Verfügbare Auflösungen:")
for stream in video_streams:
    print(stream.resolution)

selected_resolution = input("\nGib die gewünschte Auflösung ein (z.B. 720p): ")

stream = yt.streams.filter(progressive=True, file_extension='mp4', res=selected_resolution).first()

if stream:
    print(f"Herunterladen des Videos in {selected_resolution}...")
    stream.download(output_path=".", filename=f"video_{selected_resolution}.mp4")
    print("Download abgeschlossen!")
else:
    print(f"Stream mit der Auflösung {selected_resolution} nicht gefunden.")

Fazit

Pytube ist ein hilfreiches Werkzeug um schnell einen eigenen kleinen Youtube-Downloader mit Python aus dem Boden zu stampfen. Wer mag, kann dem ganzen noch eine GUI verpassen um die Bedienung komfortabler zu gestalten. Leider wird die Freude durch eine sich scheinbar ständig ändernde Youtube-API getrübt, sodass unter Umständen auf das inoffizielle Fork pytubefix zurückgegriffen werden muss. Wäre das noch nicht schlimm genug, ist der gleichzeitige Download von Bild und Ton (zum Zeitpunkt des Erstellens dieses Beitrags) auf eine Auflösung von 360p begrenzt.
Zum Ausprobieren bzw. als Spielerei ist das Modul definitiv einen Blick wert. Als eine unkomplizierte und sauber funktionierende Alternative zu bereits verfügbaren Youtube-Download-Tools würde ich es allerdings nicht ansehen.

Bildquellen:
Download-Bild von Photoholiday auf Pixabay

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen