Batch für youtube-dl

user123456789

Newbie
Registriert
Dez. 2020
Beiträge
4
Hallo,

ich möchte für das Programm youtube-dl eine Batchdatei zum automatischen runterladen von mehreren Files schreiben. Dazu habe ich eine Batch entworfen, die zunächst die Anzahl der Aufgaben erfasst und zu jeder Aufgabe X eine Variable Link X + title X erstellt. Das klappt auch soweit.

Im nächsten Schritt sollen die Aufgaben einzeln abgearbeitet werden, also Download 1 mit Link 1 und Title 1, Download 2 mit Link 2 und Title 2 usw. Allerdings bekomme ich es nicht hin, dass je nach Anzahl der Schleife der neu definierte Link + Filename übernommen werden.


Code:
@echo off
title Youtube-DL

set /a zielcounter=1
set /a taskcounter=1
set /p Anzahl="Wieviele Aufgaben sollen ausgefuehrt werden?:

cd c:\program files\youtube-dl


:ziel
set /p link%zielcounter%="Bitte Link %zielcounter% eingeben: "
set /p title%zielcounter%="Bitte Dateinamen %zielcounter% eingeben: "

if %zielcounter% EQU %Anzahl% GOTO task

set /a zielcounter=%zielcounter%+1
GOTO ziel


:task //hier gibts Probleme
set title=title%taskcounter%
set link= link%taskcounter%

youtube-dl --output "d:\download\youtube-dl\%title%.mp4" -f bestvideo+bestaudio %Link%

if %taskcounter% EQU %Anzahl% GOTO ende

set /a taskcounter=%taskcounter%+1
GOTO task


:ende
echo Es wurden %taskcounter% Dateien heruntergeladen
pause

Ist das mit den Variable so überhaupt möglich oder ist das die falsche Herangehensweise?
 
Wäre es nicht einfacher so etwas mit der PowerShell zu machen?
Und dann würde ich überlegen, ob ich statt der manuellen Eingabe eher eine Text-Datei nehme.
 
  • Gefällt mir
Reaktionen: kuddlmuddl und user123456789
Erstell eine Textdatei links.txt mit jeweils einem Link pro Zeile, z.B. so:
Code:
https://www.youtube.com/watch?v=xxxxxxxx
https://www.youtube.com/watch?v=yyyyyyyy
https://www.youtube.com/watch?v=zzzzzzzz
Dann youtube-dl ausführen mit:
Code:
youtube-dl -o '%(title)s.%(ext)s' --batch-file=links.txt
(-f bestvideo+bestaudio/best ist Standard und best auszuschließen macht effektiv keinen Unterschied)

Dateien umbenennen kannst du ja später immer noch gezielt.
 
  • Gefällt mir
Reaktionen: 0-8-15 User, user123456789 und tollertyp
Danke für die schnellen Antworten.
Was wären denn die Vorteile von Powershell? Hab jetzt erst interessenhalber mit der Batch-Spielerei angefangen, weil ein offizieller Anbieter jetzt einige Blockbuster streamt.

Das mit der externen Liste habe ich mir auch überlegt, aber so bekomme ich ja keine direkte Zuordnung der Dateinamen hin, oder? Und das fände ich wichtig.
 
Vorteile der PowerShell wären hier, dass du eben vernünftig auch mit Dateien (also Einlesen einer Textdatei mit Titel und Links) und besser mit Variablen umgehen kannst.

Alternativ: Wieso nimmst du nicht z.B. JDownloader? Das kann auch YouTube-Videos runterladen, und da kannst du nach Einfügen des Links auch einen eigenen Titel vergeben.

(Im Grunde bietet sich immer an die Aufgabe zu beschreiben, und nicht das Problem, das bei dem Versuch die Aufgabe zu bewältigen auftritt -> X-Y-Problem)
 
  • Gefällt mir
Reaktionen: user123456789
Also konkret geht es mir um ein Angebot von ServusTV (soll keine Werbung sein). Da werden jetzt nach und nach alle Bond-Filme veröffentlicht. Mit dem jDownloader kann man dort nur in 720p runterladen, mit youtube-dl klappt es auch in 1080p.
Ich könnte natürlich auch jeden Film einzeln runterladen, aber bei Programmieren hat mit der Ehrgeiz gepackt. Ich hätte also gerne eine Batch-Datei, mit der ich in Zukunft auch von anderen Anbietern (Youtube, Mediatheken) direkt ein Video / mehrere Videos runterladen kann.

Kann mir jemand eine gute Quelle für Powershell Coding empfehlen?
 
Da ich neugierig war und wissen wollte, wieso denn JD kein 1080p downloaden kann (klappte sonst immer), hab ich nun auch mal JD und youtube-dl parallel getestet. Seltsamerweise schaffe ich mit beiden Programme auf servustv.com nur 720p. Eine Idee wie ich youtube-dl auf 1080p stellen kann? Späße wie youtube-dl.exe -f "best[height=1080]" brachten keinen Erfolg -> ERROR: requested format not available

Edit: ah oki, scheint mit ändern des Protokolls auf http_dash_segments zu klappen. ^^ Neugierde gestillt. Danke.

Powershell Tutorial: https://www.linetwork.de/powershell-lernen/
Das hatte ich noch in meinen Lesezeichen. Ansonsten findet man auch mit einer Suchmaschine jede Menge weitere Guides. =)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: user123456789
Okay, das ist eine gute Begründung.

Mit der PowerShell könntest du z.B. eine Datei einlesen, in der in einer Zeile Titel und URL stehen, z.B. getrennt durch einen senkrechten Strich: |
Für sowas gibt's ja direkt schon Beispiele:
https://stackoverflow.com/questions/53764858/powershell-read-text-file-line-by-line-and-split-on

Auf dich dann übertragen:
Code:
$File = get-content "downloads.txt"
foreach ($line in $File) {
    $Arr = $line.Split('|')
    $Title = $Arr[0]
    $Link = $Arr[1]
    .\youtube-dl.exe --output "d:\download\youtube-dl\${Title}.mp4" -f bestvideo+bestaudio ${Link}
}

Meine downloads.txt:
Code:
Dark Knight|https://www.youtube.com/watch?v=r-XXzX2PAvU&ab_channel=FilmMusicFan
(und nein, ist nicht der Film :-) )

Das erwartet, dass die exe im gleichen Verzeichnis ist, ggf. anpassen, und auf eine passende downloads.txt verweisen.

1609081552842.png


Das ganze würde sich natürlich noch über Ausgaben verschönern lassen.
 
  • Gefällt mir
Reaktionen: user123456789
Ich möchte dich jetzt nicht ermutigen, mit Batch weiterzumachen, aber der Vollständigkeit halber, will ich auf deine Eingangsfrage noch eine Antwort mit potentieller Lösung geben:

Das Problem, dass du beschreibst, könnte an der Art und Weise liegen, wie Batch-Scripte ausgeführt werden.
Hier findest du mehr darüber: https://ss64.com/nt/delayedexpansion.html
Ein SETLOCAL EnableDelayedExpansion ganz am Anfang deiner Batch-Datei und die Verwendung deiner Variablen innerhalb der Schleife mit !variable! statt %variable% könnte dein Problem beheben.

Zur umfangreichen PowerShell-Refferenz hier lang:
https://ss64.com/ps/
bzw.
https://ss64.com/ps/syntax.html
 
  • Gefällt mir
Reaktionen: user123456789
So, ich habe jetzt mal ein bisschen damit rumprobiert.

Vielen Dank für die Antworten.

@tollertyp
Deine Variante mit PS hat so gut geklappt.

@AW4
Aus der delayedexpansion-erklärung bin ich noch nicht ganz schlau geworden, dafür habe ich wohl zu wenig Ahnung. Ich habe die Batch-Datei jetzt so hinbekommen, wie ich es geplant habe, denke aber, das ist so nicht der eleganteste Weg?! Ich habe die Variable in der Schleife in ! und % gesetzt, jetzt klappt es.


Hier noch der gesamte Quelltext, falls es jemanden interessiert:

Code:
@echo off

setlocal enableDelayedExpansion
title Youtube-DL

cd c:\program files\youtube-dl

set /a zielcounter=1
set /a taskcounter=1
set /p Anzahl="Wieviele Aufgaben sollen ausgefuehrt werden?:

:ziel
set /p link%zielcounter%="Bitte Link %zielcounter% eingeben: "
set /p title%zielcounter%="Bitte Dateinamen %zielcounter% eingeben: "

if %zielcounter% EQU %Anzahl% GOTO task

set /a zielcounter=%zielcounter%+1
GOTO ziel


:task
set title=title%taskcounter%
set link=link%taskcounter%

youtube-dl --output "d:\download\youtube-dl\!%title%!.mp4" -f bestvideo+bestaudio !%Link%!

if %taskcounter% EQU %Anzahl% GOTO ende

set /a taskcounter=%taskcounter%+1
goto task


:ende
echo Es wurden %taskcounter% Dateien heruntergeladen.
pause
 
  • Gefällt mir
Reaktionen: tollertyp
user123456789 schrieb:
Ich habe die Batch-Datei jetzt so hinbekommen, wie ich es geplant habe, denke aber, das ist so nicht der eleganteste Weg?!
Doch doch, das ist so gedacht und vorgesehen.
Argumentativ ist Batch an sich nicht wirklich "elegant"... ;)
 
Zurück
Oben