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.


  • Administrator

    @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-anlegen ;)

    Ja, 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! :smiley:

    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
    

Anmelden zum Antworten
 

Es scheint als hättest du die Verbindung zu MediathekView-Forum verloren, bitte warte während wir versuchen sie wieder aufzubauen.