Als Film- oder Serienfan steht man oft vor dem Problem, daß man Daten aus der Mediendatei braucht, am besten automatisiert und formatiert. Leider fehlt häufiger die NFO oder sie ist fehlerhaft, außerdem ist es m.E. müßig, für jede Releasegroup einen Parser zu bauen - also liegt der Gedanke nahe, die Infos aus den technischen Infos der Datei selbst zu holen.
"Geht nur mit viel Copy & Paste" rufen die Einen. "Da wirste um Powershell, phpCLI oder Python nicht herumkommen." schüren Andere die Codingphobie des Anfängers.
Ich habe mir die Aufgabe gestellt, eine möglichst einfache, kostenlose Lösung zu bauen, die weitgehend in einer einfachen, plattformübergreifenden Sprache geschrieben ist. Die Wahl fiel auf (Windows-)Batch und AWK, total oldschool, macht die Lösung aber auch sowas von sexy!
Da der Batchteil eher von untergeordneter Bedeutung ist (er ist nur so groß, weil Windows Batch teils sehr umständlich zu handhaben ist), gehe ich davon aus, daß auch ein nur halbwegs fitter bash-Coder die paar erforderlichen Schnipsel selbst hinkriegt.
Was wird gebraucht?
- Mediainfo CLI ---> MediaInfo - Download
- Datentemplate für 1. (hängt hier an)
- GAWK aus den GnuWin32-Tools. Bei Linux gehört es in der Regel zur Grundaustattung, für Windows gibt's GnuWin32
- Einen brauchbaren Texteditor, der auch die AWK-Syntax kennt. Z.B. jEdit - Programmer's Text Editor - overview
- Grundkenntnisse in Batch; gerade bei MS-Betriebssystem die absolute Pest. Das hier ist kein Batch-Kurs, der Batchcode, der gebraucht wird, wird beipielhaft als Schnipsel gezeigt, sollte aus MS-Betriebssystemen ab Vista laufen, getestet habe ich ihn unter Server 2012R2 und 7. Variablen usw. habe ich im Beispiel weitgehend entfernt, das macht es für den Anfang lesbarer.
- Demodatei test_tmpl, das ist ein einfaches Basistemplate zu Demozwecken
- AWK-Script GenMETA_awk, das Herzstück, findet Ihr als Anhang beigefügt.
Der verwendete AWK-Code ist unter Version 3.x geschrieben und sollte z.B. auch unter Cygwin mit neueren AWK-Versionen problemlos laufen. Die Aufruf-Parameter aus den Batch-Schnipseln sind wichtig!
Los geht's. Das Beispiel behandelt direkt eine Gruppe von Dateien, wie man sie z.B. bei Serien vorliegen hat.
Code:
call :GET_NFO !_num! :: _num ist ein Dateizähler
:GET_NFO:
IF EXIST "*.nfo" copy /y "*.nfo" "C:\testbed\NFO\"
for /R %%M IN (*.mkv) DO "C:\mediainfo\mediainfo.exe" --LogFile="C:\testbed\NFO\%1-medinf.txt" --Inform="C:\mediainfo\medinf_template.txt" "%%M"
Der Schnipsel erzeugt in C:\testbed\NFO\ durchnumerierte Dateien, die den Mediainfo-CLI-Output enthalten. Er kopiert auch die NFOs in diesen Ordner. Im folgenden Schritt übergeben wir diese Dateien an GAWK:
Code:
Setlocal EnableDelayedExpansion
set _mediainfoNO=2 :: Daten aus der zweiten Mediainfo-Datei und NFO verwenden; empfehlenswert bei Serien
PUSHd "C:\testbed\NFO\"
for %%M in (*-medinf.txt) do (
set /a _medinfcount += 1
set _awkload=!_awkload! "%%M"
)
for %%N in (*.nfo) do (
set /a _nfocount += 1
if !_nfocount! EQU !_mediainfoNO! (set _nfofile=%%N)
)
set _nfofile=!_nfofile:\=/!
awk -W re-interval -f "C:\Scripts\GenMETA_awk" -v _tmplfile=C:/Scripts/test.tmpl -v _nfofile="!_nfofile!" -v _mediainfoNO=!_mediainfoNO! !_awkload! > "..\RESULT.txt"
Endlocal
POPd
Die Ausgabe wird im Verzeichnisbaum eine Ebene über dem NFO-Ordner geschrieben, also C:\testbed\.
Nun zum AWK-Script: es liest Anzahl der Audio-Streams und jeweils Bitrate, Kanalzahl und Sprache (sofern vom Releaser gepflegt) sowie Dateigrößen (einzeln), Kapitelinfos und Abspielzeiten aus. Einen Fallback für den Fall, daß die Sprachen nicht gepflegt sind, gibt es auch (Zeile 122, ggfs. nach eigenem Geschmack anpassen). Danach fügt es diese bzw. daraus abgeleitete Infos nebst NFO-Text und Mediainfo-Rohdaten der mit _mediainfo bestimmten Datei in das Demo-Template ein. Das Ergebnis findet Ihr in C:\testbed\RESULT.txt.
Die erzeugte Datei kann man dann weiter verarbeiten. Als Template sind z.B. XML-Strukturen wie für Intelligen oder auch ein fertiges Posting, das man automatisch an Tools wie Themaposter senden kann, denkbar.
Der besondere Charme dieser Lösung ist, daß man reale Spielzeiten ausgegeben bekommt, daran kann man z.B. festmachen, ob es sich um eine Uncut-Version oder eine Mogelpackung handelt. Man kann diese Zeit z.B. mit Infos auf OFDB vergleichen ... und, und, und ... ich jedenfalls bevorzuge diese Methode gegenüber allem, was in NFOs steht.
Ich hoffe, die Lösung animiert den Einen oder Anderen hier, sie auszuprobieren, sich Arbeit zu sparen und sie vielleicht sogar anzupassen oder zu erweitern - AWK ist nicht nur plattformübergreifend einsetzbar und winzig, es ist ziemlich leicht zu lernen, bietet assoziative Arrays und animiert zur Auseinandersetzung mit regulären Ausdrücken.
Das Skript ist sparsam kommentiert, aber sauber gegliedert und alle Funktionen und Variablen aus meiner Sicht deskriptiv benannt. Wer Fragen oder Anmerkungen hat, nur zu.
Bei Lesebedarf zu AWK helfen:
[ awk-Tutorium: Vorwort ]
https://www.gnu.org/software/gawk/manual/
Weitere Links gerne bei Bedarf.
Cannonau