Python Teil 1

ACG Sommerfest 2024
Sei dabei beim ACG Sommerfest 2024! diesmal ganz wirklich - okay?!
Klick mich für mehr Informationen.

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

Code
pip install pytube

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:

Code
url = input("Link: ")

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:

Python
from pytube import YouTube

Um dem Skript nun beizubringen was das Video ist was ich behandeln möchte dient folgender Befehl:

Code
video = YouTube(url)

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.

Code
video = video.streams.get_highest_resolution()

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:

Code
video.download()

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:

Code
sound = video.streams.get_audio_only()
sound.download(filename=video.title + ".mp3" )

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:

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!)


Es geht weiter:
Das konnte ich so nicht lassen. Es folgt eine kleine Optimierung

Version 2.0

Version 2.1


Life is like a pencil that will surely run out, but left the beautiful writing in the life.

Kommentare 2

  • Es tut mir leid, dass mein Kommentar sich nicht auf den Inhalt bezieht, aber wie hast du dieses Inhaltsverzeichnis erstellt?


    Wenn ich eine nummerierte Liste erstelle und dort einrücke bekommen die Unterpunkte auch Zahlen zugewiesen, keine Buchstaben. Die Links zu den einzelnen Kapiteln werden vermutlich über Überschriften realisiert. Doch wie bekommt man so eine Art invertierten Spoilerkasten, der standardmäßig ausgeklappt ist?

    Gefällt mir 1
    • Es freut mich dennoch :)


      Das Inhaltsverzeichnis wird automatisch generiert über die Formatierung der Überschriften H1 H2 H3


      Und ansonsten habe ich hier nur diese code Blöcke benutzt.


      :)

      Gefällt mir 1