Bash-Skript MediaTerm
-
Mein inzwischen in Version 6.1 vorliegendes Bash-Skript MediaTerm bietet Grundfunktionen von MediathekView für die Linux-Kommandozeile: Filme der Filmliste können im Terminal nach Stichwörtern recherchiert und (mit dem Medienplayer mpv) abgespielt werden. Außerdem gibt es Kommandos, um Filme herunterzuladen oder als Bookmark festzuhalten. Als potentielle Anwender dieser ressourcenschonenden Alternative habe ich vor allem Besitzer alter und leistungsschwacher Hardware im Sinn (mein eigener, zehn Jahre alter Desktop-Rechner verfügt lediglich über 512 MB RAM).
Weitere Informationen zum Skript gibt es hier, wo auch der Quellcode eingesehen und kopiert bzw. das Skript heruntergeladen werden kann. Ein Hilfetext findet sich im Skript und kann vom Anwender mit der Option “-h” aufgerufen werden. Getestet habe ich das Skript lediglich unter Lubuntu 16.04 und der Distribution antiX-16.
Bitte beachtet, dass ich keinen professionellen IT-Hintergrund habe, sondern mir das notwendige Grundwissen autodidaktisch angeeignet habe. Experten werden deshalb an manchen Stellen meines Skripts gewiss einen Mangel an programmiertechnischer Eleganz oder die Missachtung gängiger Konventionen bemerken. Ich habe es in erster Linie für meinen eigenen Bedarf geschrieben, stelle es hiermit aber gerne anderen Interessenten zur Verfügung.
-
Hab mir das vor 3 Wochen runtergeladen und es ein paarmal benutzt. Als Freund der Shell finde ich es eine brauchbare Alternative zum Suchen bevor ich das ressourcenhungrige Java-Teil anwerfe. Danke dafür.
Player habe ich mir angepasst, da ich kein mpv nutze, aber das ja Geschmacksache.
Was ich noch einbauen würde wäre eine Möglichkeit den Download-Ordner anzugeben. XDG_VIDEOS_DIR ist bei mir zb nicht gesetzt, benutze keine Desktop-Umgebung, also schmeißt der es einfach ins $HOME.Woran man IMHO noch schrauben könnte sind die Dateinamen der heruntergeladener Dateien, die sind natürlich wenig aussagekräftig, 1294293_15064120.mp4…
Nn einer Stelle extrahierst du ja auch schon den Sendungstitel mit awk, bei “Ausgewählt” in Zeile 294, das müßte man wohl noch an curl beim Download verfüttern. Wenn ich mal mehr Zeit habe schaue ich mal da rein. -
Das mit den Dateinamen geht sogar recht einfach, ich habe
curl -JLO $filmurl
durch
curl -JL $filmurl -o "$(echo "$out" | awk -F "\",\"" -v var="$filmnr" 'NR==var{print $4".mp4"}' |sed -e 's/\\//g')"
ersetzt.
-
Unabhängig von diesem Tool verwende ich in MV bei Downloads vom ORF immer den Original-Dateinamen, da dieser im Gegensatz zur ARD eindeutig ist. Danach suche ich mit einem selbstgeschriebenen Java-Programm den Eintrag in der Filmliste und benenne die heruntergeladene Datei nach meinen Vorstellungen um, wie es mit MV so leider nicht möglich ist.
-
@Georg-J sagte in Bash-Skript MediaTerm:
Datei nach meinen Vorstellungen um, wie es mit MV so leider nicht möglich ist.
Dass die Programmset’s da recht viele optionen bieten weißt du oder?:
https://mediathekview.de/anleitung/#programmset-anlegen -
@Nicklas2751 sagte in Bash-Skript MediaTerm:
@Georg-J sagte in Bash-Skript MediaTerm:
Datei nach meinen Vorstellungen um, wie es mit MV so leider nicht möglich ist.
Dass die Programmset’s da recht viele optionen bieten weißt du oder?:
https://mediathekview.de/anleitung/#programmset-anlegenJa, das liegt eher an fehlenden Informationen in den Mediatheken, die zu fehlenden Werten in der Filmliste führen:
“Sendedatum des Films oder aktuellem Datum, wenn Sendedatum leer”, “Sendezeit des Films oder ‘jetzt’, wenn Sendezeit leer”. Es werden bei zerstückelten Sendungen wie z. B. “Was gibt es Neues?” alle Teile mit derselben Uhrzeit eingetragen. Die URL enthält meistens die exakte Uhrzeit des Sendestarts dieses Schnipsels. Das setze ich in den Dateinamen und als Änderungsdatum. Damit kann ich die Schnipsel in die richtige Reihenfolge bringen. -
@vitusson Vielen Dank für Dein freundliches Feedback und die Anregungen bzgl. des Downloads. Dass Du postwendend gleich eine Lösung präsentierst, gefällt mir natürlich besonders!
Da ich persönlich nur selten Filme herunterlade (und dann bei Bedarf anschließend einfach mit einem mir genehmen Dateinamen versehe), hatte ich das Thema “Download” zugegebenermaßen nicht so auf meinem Schirm. Ich werde mir erlauben, Deine Lösung in einem nächsten Update zu übernehmen, allerdings wohl leicht modifiziert. Die Filmliste enthält nämlich auch URLs im m3u-Format, recht zahlreich z.B. beim WDR. Um diese Playlists beim Download (über dessen Sinn sich in diesem Fall natürlich diskutieren ließe) nicht mit einer irreführenden .mp4-Endung zu versehen, habe ich die Dateiendung als Variable eingebaut. (Die zusätzliche Definition der Variablen für die “Filmnummer” innerhalb des awk-Befehls habe ich dagegen inzwischen als überflüssig erkannt, was den Befehl wiederum etwas vereinfacht.)
curl -JL -o "$(echo "$out" | awk -F "\",\"" -v ext="${filmurl##*.}" NR==$filmnr'{print $4"."ext}' |sed -e 's/\\//g')" $filmurl
Was die Frage des Download-Speicherorts betrifft, werde ich mir, wenn ich mal mehr Zeit habe, noch Gedanken machen. Mir schwebt vor, dass der Benutzer bei jedem Download bzgl. Verzeichnis und Dateinamen eine Standardvorgabe erhält mit der Option zur Änderung.
-
Okay, daß der Hauptzweck eher anschauen als runterladen ist dachte ich mir schon.
Das mit der mp4-Endung war auch nur ein schneller Hack und ich war mir nicht sicher ob das wirklich schlau ist. Den Fall mit den Sendern die nur eine m3u liefern hatte ich weder bedacht noch geprüft.Jetzt sehe ich das diese Möglichkeit beim Download gar nicht erfasst wird. Die m3u8-Datei will ich ja nicht haben, sondern den Film. Da bräuchte es wohl noch eine if-Schleife, die das abfängt und wenn ext=m3u8 statt curl ffmpeg benutzt
ffmpeg -i $filmurl -c copy -bsf:a aac_adtstoasc "$(echo "$out" | awk -F "\",\"" -v ext="${filmurl##*.}" NR==$filmnr'{print $4"."ext}' |sed -e 's/\\//g')"
-
Für die heute veröffentlichte neue Version 6.2 von MediaTerm (siehe http://martikel.bplaced.net/skripte1/mediaterm-code.html) wurde der Filmdownload in Anlehnung an vitussons Vorschlag überarbeitet (nochmals Dank hierfür!). Man kann jetzt bei jedem Download Speicherort und Dateinamen frei vergeben – oder aber die Standardspeicherung im aktuellen Arbeitsverzeichnis ($PWD) unter dem Filmtitel akzeptieren.
Einen vernünftigen Download der im M3U8-Format vorliegenden Filme als MP4 habe ich nicht hinbekommen und will das bis auf weiteres auch nicht weiter verfolgen. In diesen Ausnahmefällen erhält der Nutzer einen entsprechenden Hinweis und kann wählen, ob er den Downloadvorgang abbrechen oder die M3U8-Playlist herunterladen will.
Neu in Version 6.2 ist außerdem eine optionale “Seitendarstellung” der Suchergebnisse mit Blätterfunktion (Näheres siehe Release-Infos unter obigem Link).
-
@maroc sagte in Bash-Skript MediaTerm:
Einen vernünftigen Download der im M3U8-Format vorliegenden Filme als MP4 habe ich nicht hinbekommen und will das bis auf weiteres auch nicht weiter verfolgen. In diesen Ausnahmefällen erhält der Nutzer einen entsprechenden Hinweis und kann wählen, ob er den Downloadvorgang abbrechen oder die M3U8-Playlist herunterladen will.
Hatte ich ganz vergesse noch zu posten, ich hab das hier so gelöst
# Download des Videos (Kommando "d...") ext=${filmurl##*.} if [[ "$input" =~ ^d[0-9]+$ ]]; then echo "Download des Videos in Standardqualität:" if [[ "$ext" == m3u8 ]]; then cd $XDG_VIDEOS_DIR && ffmpeg -i $filmurl -c copy -bsf:a aac_adtstoasc \ "$(echo "$out" | awk -F "\",\"" -v var="$filmnr" 'NR==var{print $4".mp4"}' |sed -e 's/\\//g' )" else cd $XDG_VIDEOS_DIR && curl -JL $filmurl -o "$(echo "$out" | awk -F "\",\"" -v var="$filmnr" 'NR==var{print $4".mp4"}' |sed -e 's/\\//g' )" fi fi if [[ "$input" =~ ^d[hn][0-9]+$ ]]; then if [[ "$input" == dn* ]]; then def=14 #Feld d. Ergebnisliste für niedr. Qualität in Variable def qual="niedriger" else def=16 #Feld d. Ergebnisliste für hohe Qualität in Variable def qual="hoher" fi urlqual $def if [[ "$filmurl" == "" ]]; then echo "Film nicht in $qual Auflösung verfügbar." else echo "Download des Videos in $qual Qualität:" if [[ "$ext" == m3u8 ]]; then cd $XDG_VIDEOS_DIR && ffmpeg -i $filmurl -c copy -bsf:a aac_adtstoasc \ "$(echo "$out" | awk -F "\",\"" -v var="$filmnr" 'NR==var{print $4".mp4"}' |sed -e 's/\\//g' )" else cd $XDG_VIDEOS_DIR && curl -JL $filmurl -o "$(echo "$out" | awk -F "\",\"" -v var="$filmnr" 'NR==var{print $4".mp4"}' |sed -e 's/\\//g' )" fi fi
-
@vitusson Wow, besten Dank, das funktioniert jetzt offenbar tadellos! Im Umgang mit FFmpeg völlig unbeleckt, konnte ich nur im Dunkeln stochern und hatte bald die Flinte ins Korn geworfen.
Deine Lösung werde ich natürlich auch in das Skript einarbeiten. Da dies noch ein wenig Detailarbeit erfordern dürfte und auch in Ruhe getestet werden will, kann das noch einige Tage dauern. Insbesondere möchte ich mit einer if-Anweisung auch Anwender berücksichtigen, die (so wie ich selbst) Libav anstelle von FFmpeg nutzen.
-
Die neue Download-Funktionalität für M3U8-URLs ist nun integriert, eine aktualiserte Version von MediaTerm kann heruntergeladen werden: http://martikel.bplaced.net/skripte1/mediaterm.html. Nochmals vielen Dank an vitusson für die entscheidende Hilfestellung!
Voraussetzung für den Download der Filme mit M3U8-URLs als MP4-Videos ist die Installation von wahlweise ffmpeg oder libav-tools. Das Skript “erkennt” dann automatisch, welchen der beiden Befehle “ffmpeg” und “avconv” es verwenden muss.
-
Ich bin gerade in einen kleinen Fehler gelaufen. Bei mehrteiligen Sendungen haben die Titel oft einen Schrägstrich, wie in diesem Fall
“Die ersten Menschen (1/2) - Vom Wald in die Savanne”, und curl steigt da natürlich aus mit ‘curl: (23) Failed writing body’ weil es das downloadziel nicht erzeugen kann. Ich lass die jetzt durch einen Bindestrich ersetzen.sed -e 's/\\//g' -e '/s/\//-/g'
-
@vitusson Ha, solche Fallstricke fallen erst auf, wenn man über sie stolpert. Danke, hab’s korrigiert!
-
Moin @maroc ,
ich habe in deinem Script ein paar Anpassungen vorgenommen, die den Updatevorgang mit anderen Scripten vereinfacht:-q
für quiet eingefügt. Zudem ist das Script nun XDG-Konform und platziert seine Filmliste in$XDG_DATA_HOME
.Ich kann das nun verwenden, um automatisch mit einem weiteren Script nach vordefinierten Sendungen zu suchen und die gefundenen Links der Videos in bestimmten Dateien und Ordnern zu platzieren. Diese Ordner werden dann von Kodi gescannt und die neuen Folgen automatisch der Bibliothek hinzugefügt.
patch:
--- mediaterm.sh.bak 2017-09-09 14:03:57.760567506 +0200 +++ mediaterm.sh 2017-09-09 14:05:11.120558148 +0200 @@ -29,7 +29,11 @@ #### Vorbelegte Variablen -dir=$HOME/MediaTerm #Verzeichnis, in dem Filmliste und Bookmarks gespeichert werden +if [ -d "$XDG_DATA_HOME" ]; then + dir=$XDG_DATA_HOME/MediaTerm #Verzeichnis, in dem Filmliste und Bookmarks gespeichert werden +else + dir=$HOME/.local/share/MediaTerm #Verzeichnis, in dem Filmliste und Bookmarks gespeichert werden +fi dldir=$PWD #Zielverzeichnis für den Download von Videos (aktuelles Arbeitsverzeichnis ... bei Bedarf ändern) player="mpv --really-quiet --no-ytdl" #Player mpv mit Optionen @@ -39,7 +43,7 @@ #### OPTIONEN -while getopts ":bd:e:ghHlnostuvw" opt; do +while getopts ":bd:e:ghHlnostuvwq" opt; do case $opt in b) bopt=1 @@ -67,6 +71,9 @@ o) oopt=1 ;; + q) + qopt=1 + ;; s) sopt=1 ;; @@ -135,7 +142,7 @@ mediaterm [-d DATUM|-e DATUM|-g|-n|-o|-s|-t|-w] [+]Suchstring1 [[+|~]Suchstring2 ...] mediaterm -l[n|o|w] mediaterm -b - mediaterm -u + mediaterm -u[q] mediaterm -v mediaterm -h @@ -150,6 +157,7 @@ ${fett}-l${normal} Listet alle Livestreams auf (Suchstrings werden nicht berücksichtigt). ${fett}-n${normal} Gibt die Ergebnisliste ohne interne Kommandozeile aus. ${fett}-o${normal} Gibt die Ergebnisliste ohne Farben aus. + ${fett}-q${normal} Update der Filmliste ohne interne Nachfrage. ${fett}-s${normal} Sortiert Suchtreffer absteigend nach Sendedatum (neueste zuoberst). ${fett}-t${normal} Sortiert Suchtreffer aufsteigend nach Sendedatum (neueste zuunterst). ${fett}-u${normal} Aktualisiert die Filmliste. @@ -632,8 +640,12 @@ #### Herunterladen der Filmliste (falls nicht vorhanden oder bei Option -u) if [[ ! -f $dir/filmliste || ! -z $uopt ]]; then - read -p "Soll die aktuelle Filmliste heruntergeladen und im Verzeichnis $dir (wird ggf. vom Programm angelegt) gespeichert werden? (J/n)" antwort - echo + if [[ -z $qopt ]]; then + read -p "Soll die aktuelle Filmliste heruntergeladen und im Verzeichnis $dir (wird ggf. vom Programm angelegt) gespeichert werden? (J/n)" antwort + echo + else + antwort="J" + fi # Fall: Download-Frage bejaht if [[ $antwort = J || $antwort = j || -z $antwort ]]; then
Script zum suchen der Sendungen:
#!/bin/bash ./mediaterm.sh -uq ./mediaterm.sh -sngow "Extra 3" "vom" | grep ndr.de | while read line do year=$(echo $line | sed -rn 's/.*([0-9]{4})\/([0-9]{2})([0-9]{2}).*/\1/p') month=$(echo $line | sed -rn 's/.*([0-9]{4})\/([0-9]{2})([0-9]{2}).*/\2/p') day=$(echo $line | sed -rn 's/.*([0-9]{4})\/([0-9]{2})([0-9]{2}).*/\3/p') echo $line > "Extra 3/Extra_3_vom_$year.$month.$day.strm" done ./mediaterm.sh -sngow neo magazin royale | grep sendungroyale | while read line do year=$(echo $line | sed -rn 's/.*([0-9]{2})([0-9]{2})([0-9]{2})_sendungroyale.*/\1/p') month=$(echo $line | sed -rn 's/.*([0-9]{2})([0-9]{2})([0-9]{2})_sendungroyale.*/\2/p') day=$(echo $line | sed -rn 's/.*([0-9]{2})([0-9]{2})([0-9]{2})_sendungroyale.*/\3/p') echo $line > "Neo Magazin Royale/Neo_Magazin_Royale_vom_20$year.$month.$day.strm" done ./mediaterm.sh -sngow "heute-show vom" | grep _sendung_ | while read line do year=$(echo $line | sed -rn 's/.*([0-9]{2})([0-9]{2})([0-9]{2})_sendung_.*/\1/p') month=$(echo $line | sed -rn 's/.*([0-9]{2})([0-9]{2})([0-9]{2})_sendung_.*/\2/p') day=$(echo $line | sed -rn 's/.*([0-9]{2})([0-9]{2})([0-9]{2})_sendung_.*/\3/p') echo $line > "heute-show/heute-show_vom_20$year.$month.$day.strm" done ./mediaterm.sh -sngow "quarks" | grep -B 2 ".m3u8" | while { read -r line1; read -r line2; read -r line3; } do year=$(echo $line1 | sed -rn 's/.*Datum: ([0-9]{2}).([0-9]{2}).([0-9]{4}).*/\3/p') month=$(echo $line1 | sed -rn 's/.*Datum: ([0-9]{2}).([0-9]{2}).([0-9]{4}).*/\2/p') day=$(echo $line1 | sed -rn 's/.*Datum: ([0-9]{2}).([0-9]{2}).([0-9]{4}).*/\1/p') echo $line3 > "Quarks & Co/quarks_&_co_vom_$year.$month.$day.strm" done
systemd service:
[Unit] Description=Fetch new Episodes Requires=network-online.target After=network-online.target [Service] Type=oneshot WorkingDirectory=/mnt/kodi/MediaTerm ExecStart=/mnt/kodi/MediaTerm/fetch_new_episodes.sh [Install] WantedBy=default.target
-
@Lucki Danke für Deine Rückmeldung, und entschuldige meine verspätete Antwort! Ich selbst habe keine Erfahrungen mit Kodi, kann aber die Funktionalität Deines Zusatzskripts, meine ich, trotzdem recht gut nachvollziehen. Schön, wenn mein Skript sich in verschiedene Nutzungskontexte integrieren lässt.
Die XDG-Konformität Deiner Anpassung leuchtet mir nach Lektüre der verlinkten Seite von freedesktop.org ein. Andererseits gibt es nach meinem Eindruck unzählige Linux-Anwendungen, die sich keinen Deut darum kümmern und ihre Daten in einem (wenn auch meist versteckten) Unterordner von $HOME speichern. Auch weil ein Wechsel des Datenordners bei einigen Nutzern meines Skripts möglicherweise unnötige Verwirrung stiften könnte, zögere ich mit der nachträglichen Umsetzung des XDG-Standards.
Aber natürlich lässt sich das im Skript bei Bedarf entsprechend Deines Patches manuell anpassen – wie manch anderes ja auch, z.B. der verwendete Medienplayer.
-
Ich habe es in meinem ersten Beitrag vor 2 Monaten schon geschrieben als es um XDG_VIDEOS_DIR ging. Lass das den user selbst konfigurieren, wo er seine Downloads hinladen will. Es gibt dutzende Möglichkeiten wie und wo man ein Skript nutzt oder seine Filme speichern möchte.
Was freedesktop.org und Desktopumgebungsuser nicht bedenken, ist daß nicht jeder eine solche nutzt, und diese Variablen bei einem headless System oder einem ohne Desktopumgebung mit einfachem Windowmanager nicht gesetzt sind.Und reine Terminalprogramme wie dieses Bash-Script will man vielleicht genau da nutzen wo man keine GUI hat oder braucht.
Würde ich ein System wollen was mir alles vorschreibt, wäre ich nicht seit 20 Jahren Linux-NutzerHier auf meinem Desktop:
xxx@debian:~$ echo $XDG_DATA_HOMExxx@debian:~$
Das ist mein Kodi auf einem Raspi:
LibreELEC:~ # echo $XDG_DATA_HOMELibreELEC:~ #
-
hallo,
vielen dank fürs skripten. Ich war so frei uns das skript auf Github zu stellen https://github.com/Codeuctivity/MediaTerm .
Wie geht ihr mit der Integration in Kodi um? Lasst ihr Kodi die Videos mit Metadaten anreichern und in eure Bibliothek einsortieren, oder verwendet ihr den Filebrowser? -
@stesee Ich benutze den tinyMediaManager , der fragt die Datenbanken ab, erstellt nfo-Datei, lädt Bilder herunter. In Kodi lasse ich die Sachen dann in die Bibliothek einsortieren, mit “Lokale Informationen” als Quelle. Äußerst praktisch für Filme und Serien.
https://www.tinymediamanager.org/
http://kodi.wiki/view/TinyMediaManager -
Ich musste die Beobachtung machen, dass die Suche meines Skripts unter der Distribution antiX-17 64 bit extrem langsam lief (nicht dagegen unter 32-Bit-Installationen von antiX und Lubuntu) – was ich auf die Verwendung der grep-Option “–ignore-case” zurückführe. Deshalb habe ich jetzt die Suchfunktion von grep auf sed umgestellt. Für unbedeutende weitere Neuerungen siehe http://martikel.bplaced.net/skripte1/mediaterm.html, wo auch die neue MediaTerm-Version 6.4 zum Download bereitsteht.
@steese: Danke für das Verfügbarmachen meines Skripts auf GitHub. Ich als Amateur-Coder hatte mir das selbst nicht zugetraut …