Skip to content

Instantly share code, notes, and snippets.

@marco79cgn
Last active September 14, 2025 00:07
Show Gist options
  • Save marco79cgn/b09e26beaaf466cb04f9d74122866048 to your computer and use it in GitHub Desktop.
Save marco79cgn/b09e26beaaf466cb04f9d74122866048 to your computer and use it in GitHub Desktop.
Ein Skript zum downloaden von Videos bei ARD Plus (→ https://github.com/marco79cgn/ard-plus-dl)
Umgezogen, jetzt hier zu finden:
https://github.com/marco79cgn/ard-plus-dl
@marco79cgn
Copy link
Author

Ich habe das einmal weiter analysiert und festgestellt, dass der HTTP-Request per curl immer den Code 000 (anstatt 200)zurückliefert.

Das Skript bzw. der curl Befehl versucht, die Metadaten über das ARD Plus API zu bekommen und speichert diese temporär in einer Datei namens content-result.txt.

curl -s -o content-result.txt -w "%{http_code}" "${contentUrl}"

Der Grund hierfür ist, dass ich primär an den http status code kommen will, um zu prüfen, dass der 200 (=success) ist. Denn dann kann man davon ausgehen, dass der Aufruf auch erfolgreich war. Der Grund hierfür ist das Fehlerhandling. Wenn da bei dir stattdessen 000 zurück kommt, dann ist genau das das Problem. Welche curl Version benutzt du denn?

@marco79cgn
Copy link
Author

@profhccaesar
Habe es eben auf einem alten Raspberry Pi OS bullseye nachgestellt. Die neueste curl-Version via apt ist dort 7.74.0 und die hat auch diesen Bug, der zu 000 führt. Scheint ein Problem zu sein mit https im Zusammenhang mit -w "%{http_code}" in alten Curl Versionen. (Das Problem ist seit langem gefixt.)

Workaround:
neue curl Version per snap installieren. Beim Raspberry Pi klappt das wie hier beschrieben. Damit konnte ich das Problem direkt lösen!

Ich habe gerade das Skript angepasst und in der ersten Zeile die Möglichkeit ergänzt, einen alternativen Pfad für das curl binary anzugeben. Man muss es entsprechend nur an dieser einen Stelle ändern.

Vielleicht sollte ich das Ganze als Docker Container anbieten. Eigentlich habe ich gedacht, bei den wenigen Abhängigkeiten kann nicht viel schief gehen. Aber offensichtlich sind viele unterschiedliche curl Versionen im Umlauf, die oft veraltet sind und/oder Bugs enthalten.

@profhccaesar
Copy link

@marco79cgn
Vielen Dank für den Typ - obwohl ich täglich mit curl arbeite, ist mir dieser Bug noch nicht in die Quere gekommen.

Leider gestaltete es sich etwas schwierig, eine aktuelle curl-Version auf meinem System zum Laufen zu bekommen - snapd ist aus diversen Gründen deaktiviert. Ich habe deshalb deine Idee des Docker-Containers aufgegriffen und einen gebaut, liegt hier auf Github im Projekt docker-ard-plus-dl. Bitte nach Belieben verwenden und anpassen - das Ding unterliegt der "Unlicense"-Lizenz.

Die Verwendung ist - eine lauffähige Docker-Installation vorausgesetzt - sehr einfach:

# Projekt herunterladen:
git clone https://github.com/profhccaesar/docker-ard-plus-dl.git ./docker-ard-plus-dl

# Video herunterladen:
cd docker-ard-plus-dl
./ard-plus-dl-docker.sh --dir ~/Downloads 'https://www.ardplus.de/details/a0S010000037hjZ-kommissar-dupin-bretonischer-ruhm' 'myuser' 'mypassword'

Wenn nötig, wird das Image gebaut, yt-dlp und ard-plus-dl.sh werden in der jeweils aktuellsten Version heruntergeladen. Anschliessend wird ard-plus-dl.sh im Container gestartet. Die heruntergeladenen Dateien landen im angegebenen Verzeichnis (--dir, im Beispiel also ~/Downloads).

Werden Änderungen am Image vorgenommen (Anpassung Dockerfile / Startskript) oder gibt es eine neue Version von yt-dlp oder ard-plus-dl.sh, muss lediglich der Parameter --force angegeben werden, dann wird das vorhandene Image gelöscht und mit den neuesten Versionen der Skripte neu gebaut:

./ard-plus-dl-docker.sh --force --dir ~/Downloads 'https://www.ardplus.de/details/a0S010000037hjZ-kommissar-dupin-bretonischer-ruhm' 'myuser' 'mypassword'

@marco79cgn
Copy link
Author

@profhccaesar
Super, vielen Dank! Ich hatte die gleiche Idee und bin beim über-optimieren an Alpine gescheitert (wollte das Image so klein wie möglich haben, aber ist eigentlich auch nicht so extrem wichtig).

Ich werde es zeitnah ausprobieren. Was ich bei einem anderen Projekt festgestellt habe: die mwader/static-ffmpeg binaries beschleunigen nicht nur das initiale bauen des Containers, sie machen ihn vor allem wesentlich kleiner, was die Größe anbelangt.

@profhccaesar
Copy link

profhccaesar commented Jun 4, 2025

P. S. Fehler im Docker-Image behoben, bitte von Github aktualisieren (z. B. git pull) und einmal mit Parameter --force aufrufen.

* (Bugfix) Missing dependency bsdextrautils.
* (Bugfix) Container now interactive - ard-plus-dl.sh sometimes requires user interaction, e. g. for season selection.

@marco79cgn
Um ehrlich zu sein, habe ich mich um die Größe des Images herzlich wenig gekümmert. Es ist 970 MB groß, der Container benötigt nur ein paar Bytes. Jedes heruntergeladene Video ist um ein Mehrfaches größer - eine Optimierung der Größe bringt also in Relation kaum etwas.

$ docker system df -v
Images space usage:

REPOSITORY                            TAG              IMAGE ID       CREATED         SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
ard-plus-dl                           latest           423ff031ddb0   13 hours ago    971MB     0B            970.9MB       1
...
Containers space usage:

CONTAINER ID   IMAGE                        COMMAND                  LOCAL VOLUMES   SIZE      CREATED              STATUS                NAMES
629bbfd5db5e   ard-plus-dl                  "bash"                   0               0B        About a minute ago   Up About a minute     ard-plus-dl
...

Die Zeit zum Bauen des Images hat mich auch nicht viel mehr interessiert, das es nur ein einziges Mal stattfindet; außerdem muss man auch hier die Verhältnismäßigkeit sehen: jeder Video-Download benötigt mehrere Minuten; da fällt die einmalige "Investition" von etwa 20 Sekunden für den Bau des Image kaum ins Gewicht.

Zudem wird der größte Zeitanteil beim Bauen des Images sowieso durch das Herunterladen der benötigten Programme per apt-get und das Klonen des yt-dlp-Repositories beansprucht; da bringen eine geschicktere Auswahl des Images und der verwendeten Pakete in der Relation nicht viel.

@marco79cgn
Copy link
Author

marco79cgn commented Jun 4, 2025

@profhccaesar
Ja, da hast du natürlich vollkommen Recht. Es ist der innere Monk. ;) Ich habe die Größe jetzt dennoch runter bekommen auf 223 MB. Deine Variante ist robuster, speziell was die ganzen Berechtigungen angeht. Ich habe jetzt dennoch alles mal in ein richtiges Github Repository geworfen. Das macht Änderungen am Skript einfacher und du kannst auch leichter die aktuelle Version verlinken.

https://github.com/marco79cgn/ard-plus-dl/tree/main

Dort wird auch automatisch ein Docker image gebaut via Github Actions zur direkten Verwendung (optional).

@horstepipe
Copy link

horstepipe commented Jul 13, 2025

Hallo zusammen,
ich bekomme leider auch folgenden Fehler, sowohl bei Serien als auch bei Filmen. Ist das Skript aktuell noch lauffähig?

~/Apps/ARDPlus$ ./ard-plus-dl.sh 'https://www.ardplus.de/details/a0S01000001xKyx-ein-brennender-sommer' 'user' 'password'
Couldn't get season details. Trying again!
cat: content-result.txt: No such file or directory
Lade Film  ()...
ERROR: [generic] None: '?' is not a valid URL. Set --default-search "ytsearch" (or run  yt-dlp "ytsearch:?" ) to search YouTube

Bekomme den Fehler sowohl bei Serien als auch bei Filmen.
curl 7.88.1 unter Debian
Unter dem Linuxsystem für Windows erscheint derselbe Fehler.

Jemand eine Idee?

@marco79cgn
Copy link
Author

@horstepipe
Copy link

mache ich, danke!

@bananateaa
Copy link

bananateaa commented Jul 14, 2025

Hallo,

ich bekomme auch den Fehler Login not possible! Please check credentials and subscription for user ....
Ich habe schon versuch mein Passwort so zu ändern, dass da keine Sonderzeichen mehr drin sind, in meiner Mailadresse ist jedoch ein +, könnte das ein Problem darstellen?

Ich habe das ganze über diesen Befehl laufen lassen:
docker run --rm -it -v $(pwd)/:/data ghcr.io/marco79cgn/ard-plus-dl download '<url>' 'username' 'password'

Soll ich das ganze mal ohne + in der Mailadresse probieren, oder kann es daran eigentlich nicht liegen?

Ich weiß nicht, ob das relevant ist, da ich das ja über den Docker Container gemacht habe, aber meine curl version ist 8.14.1

@marco79cgn
Copy link
Author

marco79cgn commented Jul 14, 2025

@bananateaa
Ich habe das Skript eben angepasst und explizit Username und Password url-encodiert. Könntest du es bitte nochmal probieren mit der neuesten Version? Also inklusive deiner Sonderzeichen?

Vorher die neue Version pullen: docker pull ghcr.io/marco79cgn/ard-plus-dl

@bananateaa
Copy link

bananateaa commented Jul 14, 2025

Top, danke dir!
Funktioniert jetzt und fängt an herunterzuladen 👍

(Danke auch, dass du noch erwähnt hast, dass und wie ich davor die neue Version pullen muss)

@elKevco
Copy link

elKevco commented Sep 13, 2025

Servus, ich kriege leider bei den ganzen Tatorten das Problem dass wenn ich den Tatort Dortmund herunterladen dieser Fehlermeldung kommt :jq: error (at :1): Cannot iterate over null (null)
Der Tatort hat Episoden.
Wie viele Episoden möchtest du überspringen? (0=alle laden)

danach passiert nix mehr

Da ich 0 Plan habe, hat ChatGPT Drüber geschaut und festgestellt das es wohl an der Mediathek an sich liegen müsste.

@marco79cgn
Copy link
Author

marco79cgn commented Sep 13, 2025

@elKevco
Habe aktuell kein gültiges Abo, aber ich denke ich habe es gefixt. Könntest du es bitte mal probieren mit der neuesten Version?

Falls du Docker benutzt, bitte neu bauen oder falls du die Github Version nimmst, vorher einmal
docker pull ghcr.io/marco79cgn/ard-plus-dl

@elKevco
Copy link

elKevco commented Sep 13, 2025

Der Tatort Dortmund hat 25 Episoden.
Wie viele Episoden möchtest du überspringen? (0=alle laden) 0
Überspringe 0 Episode(n).
Lade Tatort Essen (Haferkamp) - Folge 118 - Schönes Wochenende (1980)...
[download] Got error: HTTP Error 403: Forbidden. Giving up after 10 retries
ERROR: fragment 1 not found, unable to continue
[download] Got error: HTTP Error 403: Forbidden. Giving up after 10 retries
ERROR: fragment 1 not found, unable to continue
......
[download] Got error: HTTP Error 403: Forbidden. Giving up after 10 retries
ERROR: fragment 1 not found, unable to continue
Lade Tatort [
"München",
"Dortmund"
] ([
"Batic und Leitmayr",
"Faber, Bönisch, Herzog und Pawlak"
]) - Folge 1147 - In der Familie, Teil 2 (2020)...
[download] Got error: HTTP Error 403: Forbidden. Giving up after 10 retries
ERROR: fragment 1 not found, unable to continue

Es geht mehr wie vorher, die Meldung kommt aber bei fast allen Tatort Städten.

@marco79cgn
Copy link
Author

Dachte das liegt an meinem abgelaufenen Account. Dann muss ich mir das doch nochmal klicken. URL sah eigentlich korrekt aus.

@elKevco
Copy link

elKevco commented Sep 13, 2025

Das wäre super.

je nachdem, wie oft ich den Prozess starte, lädt er kurzzeitig die richtigen Herunter oder er versucht dann teilweise mehrfach die gleiche Folge herunterzuladen.

Ich hab aber auch schon paar richtige Folgen herunterladen können.

Da haut irgendetwas mit der Zuordnung der Folgen nicht hin.

@marco79cgn
Copy link
Author

Es gab ein Problem mit dem Authorization Token für jede einzelne Tatort Episode pro Stadt.

Bitte probiere es jetzt nochmal mit der aktuellen Version. Hier klappt es jetzt.

@elKevco
Copy link

elKevco commented Sep 13, 2025

Leider nein, ich habe es auch einmal komplett gelöscht und neu installiert ohne erfolg.

Der Tatort Koeln hat 90 Episoden.
Wie viele Episoden möchtest du überspringen? (0=alle laden) 0
Überspringe 0 Episode(n).
Lade Tatort Essen (Haferkamp) - Folge 118 - Schönes Wochenende (1980)...
[download] 10.5% of ~1001.60MiB at 9.93MiB/s ETA 01:31 (frag 75/714)

Egal welcher, er nimmt immer den Tatort Essen ... vereinzelt mal den richtigen

@marco79cgn
Copy link
Author

Sorry, ich sollte das nicht im Urlaub zwischen Tür und Angel machen.

Bitte probiere es nun nochmal. Sollte jetzt wirklich klappen!

ard-plus-dl_tatort_dortmund

@elKevco
Copy link

elKevco commented Sep 14, 2025

Jetzt klappt es vielen vielen dank 👍

Ich lade mal alles schnell herunter, bevor ARD wieder irgendwas verändert und dein Werk zerschießt.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment