pytube

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo Forum.

folgende Frage in die Runde .. ich möchte Youtube-Videos auf meine lokale Festplatte runterladen.. kappt auch prima als Script! Wenn ich daraus eine EXE via pyinstaller mache, dann bekomme ich immer den Hinweis "Video nicht gefunden!", obwohl das Video exisiert! Hat jemand vielleicht eine Idee wo hier der Fehler liegt? Gruß, Andi

Code: Alles auswählen

import sys
from pytube import YouTube

if len(sys.argv) < 3:
    print('\nFormat: youtube.exe <Link zum Youtube-Video> <Zielordner>\n')
    sys.exit(0)

try:
    url = sys.argv[1]
    dl = sys.argv[2]
    youtube = YouTube(url)
    print(f'\nTitel: {youtube.title}')
    youtube.streams.get_highest_resolution().download(dl)
    print('\n')

except:
    print('Video wurde nicht gefunden!')
    
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du solltest als erstes mal das try/except wegschmeissen. So wie das da steht, faengt das *jeden* Fehler ab, den du (oder der Paketierer) gemacht hat, und man kann nicht mehr rausfinden, was eigentlich los ist. Als Faustregel fuer Anfaenger: Fehler nie allgemein abfangen, sondern immer nur so spezifisch wie moeglich!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Herzlichen Glückwunsch! Du hast gerade herausgefunden, warum es keine gute Idee ist, nackte except-Statements zu verwenden. Statt dessen schreib hin, welche Ausnahmen du konkret erwartest. Oder, falls du keine erwartest, lass den try-except-Block weg, damit die Ausnahme ausgegeben wird.
In specifications, Murphy's Law supersedes Ohm's.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo,

Okay -Verstanden! Und wie mache ich am besten die Existenz eines Videos abzufragen?

Grüße, Andi
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Den Fehler eben spezifisch abfangen. Der steht dann ja in der Fehlermeldung.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo,

da würde mir z.B. „requests“ einfallen und abfragen , ob „200“ Ja/Nein!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Nein. Nimm erst einmal, wie schon mehrfach erwähnt, try/except weg und lass dir ausgeben, warum es knallt.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Sorry,

hier die Fehlermeldung: pytube.exceptions.VideoUnavailable: jNqhUIYZM22 is unavailable
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Und genaud die Exception-Class musst du abfangen.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Und wie kann man die Exception-Class abfragen?? Sorry, wenn ich es wüsste, dann würde ich nicht fragen! :-)
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Wenn es an diesen absoluten Basics fehlt, verweise ich mal auf das offizielle Tutorial.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo,

laut Doku unter "https://pytube.io/en/latest/user/exceptions.html" müsste es so funktionieren. Leider bei mir nicht!
Bei mir kommt immer noch der Fehler: pytube.exceptions.VideoUnavailable: c4hbRjT1j22 is unavailable

Code: Alles auswählen

try:
    yt = YouTube(url)
except VideoUnavailable:
    print(f'Video {url} wurde nicht gefunden!')
else:
    print(f'Titel: {yt.title}')
    yt.streams.get_highest_resolution().download(dl)
    print('\nFertig.')
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Du hast die Exception um den falschen Code gelegt. Der Fehler tritt auf, wenn versucht wird, die streams nachzuladen.

Aber abgesehen davon:
Wenn ich "https://www.youtube.com/watch?v=c4hbRjT1j22" in den Browser kopiere, kommt die Meldung: Das Video ist nicht mehr verfügbar.

Es scheint wirklich nicht verfügbar zu sein. Oder wie lautet die url?
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo,

Danke für die Info! Die URL vom Video ist bewusst falsch! Stattdessen soll die Fehlermeldung: "Video {url} wurde nicht gefunden!" erscheinen...
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

dann müsste der Auschnitt von oben wohl so aussehen:

Code: Alles auswählen

yt = YouTube(url)
try:
    print(f'Titel: {yt.title}')
    yt.streams.get_highest_resolution().download(dl)
except VideoUnavailable:
    print(f'Video {url} wurde nicht gefunden!')
else:
    print('\nFertig.')
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo,

leider erscheint der Fehler: except VideoUnavailable:
NameError: name 'VideoUnavailable' is not defined

Code: Alles auswählen

url = sys.argv[1]
dl = sys.argv[2]

yt = YouTube(url)
try:
    print(f'Titel: {yt.title}')
    yt.streams.get_highest_resolution().download(dl)
except VideoUnavailable:
    print(f'Video {url} wurde nicht gefunden!')
else:
    print('\nFertig.')
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Dann fehlt der Import:

Code: Alles auswählen

from pytube.exceptions import VideoUnavailable
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Naja, wenn du einen Namen aus einem Modul verwenden willst, musst du ihn halt auch importieren. Vermutlch so:

Code: Alles auswählen

from pytube.exceptions import VideoUnavailable
In specifications, Murphy's Law supersedes Ohm's.
AndiS
User
Beiträge: 24
Registriert: Dienstag 21. September 2021, 20:44

Hallo,

danke für die tatkräftige Unterstützung. Leider kommt immer noch folgender Fehlercode:
raise exceptions.VideoUnavailable(video_id=self.video_id)
pytube.exceptions.VideoUnavailable: LovsHHk3t22 is unavailable

Hier mal der ganze Quellcode:

Code: Alles auswählen

import sys
from pytube import YouTube
from pytube.exceptions import VideoUnavailable

if len(sys.argv) < 3:
    print('\nFormat: youtube.exe <Link zum Youtube-Video> <Zielordner>\n')
    sys.exit(0)

url = sys.argv[1]
dl = sys.argv[2]

yt = YouTube(url)
print(f'Titel: {yt.title}')
try:
    yt.streams.get_highest_resolution().download(dl)
except VideoUnavailable:
    print(f'Video {url} wurde nicht gefunden!')
else:
    print('\nFertig.')
Vielen Dank, Andi.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die GANZE Fehlermeldung posten. Denn sonst muss man raten.

Wenn ich das tue, dann denke ich mal, dass auch das

yt = YouTube(url)

in deinen try-Block gehoert.
Antworten