Idee
Hallo zusammen
ich möchte hin und wieder kleine Python Skripte vorstellen die vielleicht für den ein oder anderen interessant sein könnten. Um entweder Python im allgemeinen zu zeigen oder um in gewissen Punkten einfach auszuhelfen.
Viel Spaß.
Skripte und Skriptsprachen
Was sind Skripte?
Skripte sind die Beschreibung unterschiedlicher Befehle welche von Programmen ausgeführt werden können. Ich vergleiche es immer mit einem Drehbuch oder einer Schritt für Schritt Anleitung.
Immer wieder benötigte und kommende Abläufe können definiert werden. Dies trägt zur Automatisierung bei. Somit können zum Beispiel auch verschiedene Abläufe parallel gestartet werden.
Beispiele für Skriptsprachen
Die Wahl der richtigen Sprache ist hier entscheidend. Da sie unterschiedliche Eigenschaften mit sich bringen.
Bekannte Skriptsprachen sind zum Beispiel
- bash
- Powershell
- TCL
- Javascript
- JScript
- VBScript
- Python
Comeback to Python
Mein Wiedereinstieg sollte ein YouTube Downloader werden.
Warum ?
Weil mich ein Kumpel nach einem gefragt hat und ich keinem der aktuellen auf dem Markt vertrauen kann.
Allgemein gilt:
Vertraue keinem Code den du nicht selbst geschrieben hast.
Tutorial
Vorrausetzungen
Python muss natürlich installiert sein.
Zusätzlich empfehle ich eine IDE wie z.B. PyCharm von JetBrains oder einen besseren Editor wie Visual Studio Code.
Übrigens falls du es noch nicht weißt:
Es gibt für fast alle IDE eine Community Edition die für die meisten Fälle ausreicht.
Für Sprachen / Projekte unter C# empfehle ich meistens Visual Studio, falls die Software auf einem Windows laufen soll.
Ansonsten Eclipse oder Visual Studio Code. Rider (ebenfalls von JetBrains) hab ich noch nicht ausprobiert.
Installation des pytube3
Unter Windows Powershell oder unter einem Terminal bei Linux könnt ihr folgenden Befehl ausführen
Dadurch wird die Bibliothek pytube installiert. Diese ist für den folgenden Code wichtig.
Gedanken
Ich hab mir zuerst die Gedanken gestellt was ich möchte bzw. erwarte:
- Ich möchte einen Link einfügen
- Ich möchte das Video downloaden
- Ich möchte das Audio downloaden
- Ich möchte evtl. beide downloaden
Schritte
Beginnen wir bei Schritt eins der URL.
Dafür hab ich eine Variable url angelegt. Da ich nicht jedes mal in den Quellcode schauen möchte und diesen modifizieren, nehme ich für die Eingabe des Links die input Methode. Das sieht dann wie folgt aus:
Der Text in der Klammer ist selbstverständlich variabel.
Der Link ist also nun hinterlegt. Wer möchte kann diesen via print Funktion ausgeben um auf Nummer sicher zu gehen.
Nun hab steh ich vor einer weiteren Aufgabe. Ich möchte das Video downloaden. Hier benötigen wir nun die Funktionen aus pytube
Also am Anfang des Skripts die Bibliotheken importiert:
Um dem Skript nun beizubringen was das Video ist was ich behandeln möchte dient folgender Befehl:
Das bedeutet so viel wie dein Video mit der URL - url findest du über YouTube (genau genommen dem Konstruktor der Klasse YouTube).
In Video befindet sich nun also ein YouTube Objekt.
YouTube hat aber sehr viele Attribute, sehr viele Eigenschaften die wir gar nicht alle benötigen. Ich möchte schließlich nur ein Video herunterladen und nicht verschiedene Auflösungen und Qualitäten dessen.
Um das Video zu downloaden kürze ich video also um ein paar Informationen, indem ich das Objekt überschreibe.
Nun befindet sich dank der Überschreibung nur noch der Stream in höchster Qualität (kein Geiz) im Objekt video.
Dieses kann ich dann mit folgendem Befehl downloaden:
Ganz einfach :)
Möchte ich nun nur den Sound des Videos haben dann kann ich aus dem zuvor erstelltem Objekt video auch nur den Sound speichern.
Das geht so:
Wie man sieht hab ich der Methode download noch einen Parameter mitgegeben und zwar den filname. Tue ich das nicht, dann wird das ganze als mp4 ohne Bildmaterial gespeichert, was unschön aussieht.
Ganz Wichtig zu beachten: Dieser Schritt funktioniert nur dann, wenn video noch alle Informationen hat. Nachdem ich video überschrieben habe funktioniert das nicht mehr. Hier kann man diesen Aufruf entweder vorher machen oder video nicht überschreiben und ein weiteres video (z.B. dvideo) anlegen. Dafür war ich allerdings zu faul :D
Jetzt fehlt nur noch der letzte Punkt. Ich möchte beides downloaden. Naja dann mach ich eben beides. Zuerst lade ich den Sound und dann das Video herunter -- Fertig.
Mein vollständiges Script sieht übrigens so aus:
#Autor: Rabe
#Date: 30.10.2023
#Version: 1.0
#lib: python -m pip install pytube3
from pytube import YouTube
print("Hallo Welt ich möchte was downloaden")
def start():
url = input("Link: ")
video = YouTube(url)
print("Download: " + video.title)
sound = video.streams.get_audio_only()
video = video.streams.get_highest_resolution()
print("Method: 1=Sound only 2=Video only 3=both 4=exit")
method = input()
if method == "1":
sound.download(filename=video.title + ".mp3" )
elif method == "2":
video.download()
elif method == "3":
video.download()
sound.download(filename=video.title + ".mp3" )
elif method == "4":
print("Ende")
quit()
else:
start()
start()
start()
Alles anzeigen
Es ist nicht optimiert aber es funktioniert. Theoretisch könnte ich hier noch weiter Funktionen einführen um keine Wiederholungen zu haben. Oder die Existenz der URL prüfen indem ich schaue ob ich beispielsweise einen Titel des Videos ziehen kann.
Nachtrag
Per Zufall hab ich festgestellt, dass das Script bei illegalen Zeichen bei der Namensgebung von Dateien abstürzt.
Hier der Quick Fix (Vorsicht dirty!)
#Autor: Rabe
#Date: 30.10.2023
#Version: 1.1
#lib: python -m pip install pytube3
from pytube import YouTube
import os
print("Hallo Welt ich möchte was downloaden")
def start():
url = input("Link: ")
video = YouTube(url)
print("Download: " + video.title)
sound = video.streams.get_audio_only()
video = video.streams.get_highest_resolution()
print("Method: 1=Sound only 2=Video only 3=both 4=exit")
method = input()
if method == "1":
titel = sound.title + ".mp3"
titel = titel.replace("|","")
sound.download(filename=titel)
print(sound.title)
elif method == "2":
video.download()
elif method == "3":
video.download()
titel = sound.title + ".mp3"
titel = titel.replace("|","")
sound.download(filename=titel)
print(sound.title)
elif method == "4":
print("Ende")
quit()
else:
start()
start()
start()
Alles anzeigen
Es geht weiter:
Das konnte ich so nicht lassen. Es folgt eine kleine Optimierung
#Autor: Rabe
#Date: 30.10.2023
#Version: 1.2
#lib: python -m pip install pytube3
from pytube import YouTube
print("Hallo Welt ich möchte was downloaden")
def downloadsound(sound):
titel = sound.title + ".mp3"
titel = titel.replace("|", "")
sound.download(filename=titel)
def start():
url = input("Link: ")
video = YouTube(url)
print("Download: " + video.title)
sound = video.streams.get_audio_only()
video = video.streams.get_highest_resolution()
print("Method: 1=Sound only 2=Video only 3=both 4=exit")
method = input()
if method == "1":
downloadsound(sound)
elif method == "2":
video.download()
elif method == "3":
video.download()
downloadsound(sound)
elif method == "4":
print("Ende")
quit()
else:
start()
start()
start()
Alles anzeigen
Version 2.0
#Autor: Rabe
#Date: 30.10.2023
#Version: 2.0
#lib: python -m pip install pytube3
from pytube import YouTube
print("Hallo Welt ich möchte was downloaden")
url = ""
def downloadsound(sound):
titel = sound.title + ".mp3"
titel = titel.replace("|", "")
titel = titel.replace("/", "")
titel = titel.replace("\\", "")
titel = titel.replace("*", "")
titel = titel.replace("?", "")
titel = titel.replace("<", "")
titel = titel.replace(">", "")
sound.download(filename=titel)
def start():
global url
if url == "":
print("Gib mir eine URL")
else:
try:
video = YouTube(url)
except:
print("Das war nicht richtig")
quit()
print("Download: " + video.title)
sound = video.streams.get_audio_only()
video = video.streams.get_highest_resolution()
print("Method: 1=Sound only 2=Video only 3=both 4=exit")
method = input()
if method == "1":
downloadsound(sound)
elif method == "2":
video.download()
elif method == "3":
video.download()
downloadsound(sound)
elif method == "4":
print("Ende")
quit()
else:
start()
url = input("Link: ")
start()
start()
Alles anzeigen
Version 2.1
#Autor: Rabe
#Date: 30.10.2023
#Version: 2.1
#lib: python -m pip install pytube3
from pytube import YouTube
print("Hallo Welt ich möchte was downloaden")
url = ""
def downloadsound(sound):
titel = sound.title + ".mp3"
titel = titel.replace("|", "")
titel = titel.replace("/", "")
titel = titel.replace("\\", "")
titel = titel.replace("*", "")
titel = titel.replace("?", "")
titel = titel.replace("<", "")
titel = titel.replace(">", "")
sound.download(filename=titel)
def start():
global url
if url == "":
print("Gib mir eine URL")
elif url == "q":
quit()
else:
try:
video = YouTube(url)
except:
print("Das war nicht richtig")
quit()
print("Download: " + video.title)
sound = video.streams.get_audio_only()
video = video.streams.get_highest_resolution()
print("Method: 1=Sound only 2=Video only 3=both 4=exit")
method = input()
if method == "1":
downloadsound(sound)
elif method == "2":
video.download()
elif method == "3":
video.download()
downloadsound(sound)
elif method == "4":
print("Ende")
quit()
else:
start()
url = input("Link (q = exit): ")
start()
start()
Alles anzeigen