Youtube-Videos mit Python runterladen?

Schon seit langem verwende ich zum runterladen von youtube Videos das Programm Youtube-DL das funktioniert super (und ist OpenSource). Trotzdem plagte mich die Neugier: Wie läd man den eigentlich so ein Youtube-Video runter?

Es zeigt sich: Das ist garnicht so schwer!

Im HTML-Quelltext von youtube gibt es ein Objet ‚url_encoded_fmt_stream_map‘. Dieses beinhaltet hinter ‚url=‘ die verschiedenen URLs zu den verschiedenen Video-Formaten. Diese sind mit dem Zeichen ‚\u0026‘ (entspricht dem kaufmännischen &) getrennt.
Die Sonderzeichen in den URLs sind dann noch URL-formatiert. Aber das ist kein Problem für Python (‚urllib.parse.unquote‘ hilft!).

Und wenn man die URL mal hat, kann man diese direkt mit requets oder urllib öffnen und speichern. Der schwierige Teil ist also die URL zu bekommen!

Ich hoffe die Erklärung reicht für ein grundlegendes Verständnis. Hier ist der Programmcode:

#!/usr/bin/python3
import requests
import sys
import re
import urllib

# Parameter 1 is Youtube-URL
if len(sys.argv) != 2:
  print("Please specify the Youtube URL to download")
  sys.exit()
 
# Download the youtube-Page
youtubepage = requests.get(sys.argv[1])
youtubepage = youtubepage.text

# Get the Title Tag
r = re.compile(r'<title>(.*?)</title>')
title = r.search(youtubepage).group(1)

print('Fetching: ' + title)

# Find 'url_encoded_fmt_stream_map' using a regular expression - with '()' we're creating a group with our target parameters
r = re.compile(r'"url_encoded_fmt_stream_map":"(.*?)"')
videodetails = r.search(youtubepage).group(1)

# Split at the '\u0026' which means '&'
videodetails = videodetails.split(r'\u0026')

# Search for the 'url=' Part - we get the first one, there are more url's in different qualitys
r = re.compile(r'url=(.*)')
for detail in videodetails:
  videourl = r.search(detail)
  if videourl != None:
     videourl = videourl.group(1)
     if videourl != None:
        break

if videourl == None:
  print("Cant find videourl. Aborting.")
  sys.exit()

# Make it look pretty
videourl = urllib.parse.unquote(videourl)

# If there are any ',' left - remove them
videourl = videourl.split(r',')
videourl = videourl[0]

print('Using URL: ' + videourl)
print('Saving: ' + title + '.mp4')

# Now open the video url and save it
urllib.request.urlretrieve(videourl, title + '.mp4')

PS: Einen Nachteil hat die ganze Sache noch: Manche Youtube-Videos brauchen zum runterladen einen Key. Diesen muss man noch berechnen sonst geht das runterladen nicht. Mein Mini-Programm kann das nicht. Youtube-DL aber schon.


Kommentare

Schreibe einen Kommentar

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

Time limit is exhausted. Please reload CAPTCHA.