Bash-Skript MediaTerm
-
@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 …
-
MediaTerm liegt seit heute in der Version 8.0 vor, für die in erster Linie der Download der Filmliste überarbeitet wurde. Allen MediaTerm-Nutzern möchte ich ein Update auf diese Version ans Herz legen, da sie insbesondere auch Bitten und Vorschläge des MediathekView-Entwicklers @DerReisende77 aufgreift.
Wurde bisher die Filmliste von einem zufälligen Verteiler-Server heruntergeladen, so erfolgt der Download jetzt über den zentralen Load-Server von MediathekView, der jeweils an einen passenden Download-Server weiterleitet.
Um Mehrfach-Downloads ein und derselben Filmliste, etwa durch unkundige Nutzer, weitgehend auszuschließen, erfolgt vor dem Download außerdem eine Aktualitätsprüfung der lokal gespeicherten Filmliste.
Beide Neuerungen dürften sowohl einen (zumindest bescheidenen) Beitrag zur Reduzierung der Serverlast leisten, als auch Nutzern die eine oder andere frustrierende Downloaderfahrung ersparen. Eine Beschreibung aller Änderungen steht im Changelog auf http://martikel.bplaced.net/skripte1/mediaterm.html, von wo auch die neue Version von MediaTerm heruntergeladen werden kann.
-
-
Ich möchte an dieser Stelle darüber informieren, dass ich das Skript mediaterm künftig nicht mehr weiterentwickle. Die Gründe sind sind erstens mein fortgeschrittenes Alter, zweitens eine Verlagerung meiner persönlichen Interessenschwerpunkte. Zum Download steht mediaterm noch bis Anfang April 2025 bereit, anschließend läuft die Buchung des Webspaces aus und wird von mir nicht verlängert.
Es steht es natürlich jedem frei, das Skript – eine freie Software unter GPL-Lizenz – zu verbreiten oder weiterzuentwickeln. Für Rückfragen technischer Art kann ich jedoch nicht oder allenfalls sehr eingeschränkt zur Verfügung stehen.
-
Da ich mediaterm quasi täglich verwende (vor allem für schnelle Suchen ) und auch selbst eigene
kleine Verbesserungen (wie Suche nur im Titel) eingebaut habe, würde ich das gerne übernehmen und auf mein github stellen, wenn du nichts dagegen hast -
@vitusson Wenn du auf github mein Skript fortführen wolltest, würde mich das freuen. Tatsächlich zeigt ja der Anfang dieses Threads, dass du bereits in einer früheren Phase der Entwicklung hilfreiche Ideen und Lösungen einzubringen wusstest.
Du darfst das Skript gerne entweder unter dem bisherigen Namen mediaterm übernehmen oder, wenn es dir lieber ist, dem “Fork” einen neuen Namen geben. Wichtig wäre mir einzig, dass es eine Freie Software bleibt.
-
@maroc Ich würde selbstverständlich den Namen und die Lizenz unverändert lassen und auch alle deine älteren Versionen dort zum Download anbieten. Mit Changelog, Text und screenshots natürlich.
Ich muß mich nur noch ein wenig in Github einfuchsen