Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
noad Wrapper-Skript, das Optionen aus dem Setup berücksichtigt
#1

Hallo,
ich habe die Tage noch mal das Skript, mit dem noad nur für bestimmte Sender ermöglicht wird (siehe ein paar Threads weiter unten) überarbeitet und verbessert. Es ist jetzt in der Lage, alle Optionen, die für noad aus dem OSD Menu gesetzt werden können, zu behandeln.
Für den Fall, dass jemand Interesse hat, poste ich es hier mit einer kurzen Anleitung.


Der Aufruf des Skripts für Timer-gesteuerte oder Live-Aufnahmen erfolgt aus einer recording-hook-Datei, z.B. der /usr/share/vdr/recording-hooks/10_recording.custom .
Dabei wird das Skript sowohl in die "before" als auch in die "after" Sektion eingetragen, es wird also sowohl vor dem Start als auch nach dem Ende der Aufnahme gestartet, das Skript entscheidet dann je nach im Setup gesetztem Wert für Noad (Online alle Aufnahmen / Online nur Live-Aufnahmen / Offline / Deaktiviert) was zu tun ist.
Achtung: wer noad aus dem offiziellen easyvdr-addon-noad Paket verwendet sollte nur "Offline" verwenden, weil das Standard-noad im Online-Modus mit einem Segfault abbricht (ein Fix durch den Noad Entwickler ist wohl in Arbeit, ist aber derzeit - Mitte Sept. 2015 - m.W. noch nicht verfügbar).
Am Besten sollte vor dem Einsatz meines Skript mittels
Code:
dpkg-reconfigure easyvdr-addon-noad
und auswählen von "Nein" sicher gestellt werden, dass kein weiteres Skript noad startet.
In die 10_recording.custom müssen dann folgende Einträge eingefügt werden (unter der Annahme, dass das Skript unter /usr/local/bin/noad_wrapper.py abgelegt wurde):
Code:
case $1 in
    before)
        # do here whatever you would like to do right BEFORE
        # the recording $2 STARTS
        /usr/local/bin/noad_wrapper.py before "$2" &
        ;;
    after)
        # do here whatever you would like to do right AFTER
        # the recording $2 ENDED
        /usr/local/bin/noad_wrapper.py after "$2"
        ;;
    edited)
        # do here whatever you would like to do right AFTER
        # the recording $2 has been EDITED
        ;;
esac
Wichtig ist hier, dass das Skript mit einem "&" am Ende des "before" Aufrufs in den Hintergrund verschoben wird, da das Skript je nach Situation evtl. 30 Sek. auf die Erstellung des Aufnahmeverzeichnisses wartet (eine Beispiel-10_recording.custom Datei habe ich zum Skript dazu gepackt).


Man kann das Skript auch dazu verwenden, um mit "now" als erstem Argument aus der reccmds.conf heraus noad nachträglich für eine bestimmte Aufnahme zu starten.
Dazu muss nur ein Eintrag in der reccmds.noad.conf wie:
Code:
Werbung markieren (Einfacher Modus)              : /usr/bin/noad -bOc nice
geändert werden in:
Code:
Werbung markieren (Einfacher Modus)              : /usr/local/bin/noad_wrapper.py now -bOc nice
Das kann sinnvoll sein, wenn z.B. aufgrund einer schwachen CPU parallele Instanzen von noad vermieden werden sollen.
Beim Start des Skripts mit "now" wird die entsprechende Einstellung im Setup überprüft und falls eine noad-Instanz bereits läuft, der Aufruf um jew. 3 Minuten verschoben, ggf. auch mehrmals. Alle anderen Optionen werden so wie angegeben an noad weiter gereicht.


Das ganze funktioniert hier recht gut, es gibt allerdings ein paar kleinere Probleme, die ich hier noch kurz auflisten will:


Wenn während einer laufenden Aufnahme über das OSD-Setup Optionen geändert werden, kann das zur Folge haben, dass das Skript für diese Aufnahme(n) nicht genau das tut, was der User erwartet, v.a. wenn der Online-/Offline-Modus geändert wird (ein Online-fähiges noad voraus gesetzt).
Das ist an sich kein Fehler im Skript, sondern liegt in dessen Konzept begründet, kann aber u.U. für Verwirrung sorgen.


Wenn "OSD Meldungen für noad" auf "ja" gesetzt ist, wird der Parameter --OSD an noad übergeben, das hat hier allerdings keinen Effekt, ich bekomme statt einer OSD Meldung nur einen "Broken pipe" Fehler ins syslog geschrieben. Das liegt hier allerdings offenbar nicht am Skript, sondern (bei mir zumindest) an noad selbst, bzw. evtl. auch an irgend einem Fehler an anderer Stelle in meinem System.


Wenn zwei oder mehr Timer zur gleichen Zeit enden, noad auf "Offline" gesetzt ist und parallele Instanzen auf "nein", bekomme ich aus mir rätselhaften Gründen eine Fehlermeldung ins syslog, dass ein Fehler in der Ausführung des reording-hooks aufgetreten ist. Das schein aber harmlos zu sein, alle Instanzen des Skripts haben bei meinen Versuchen immer korrekt gearbeitet.


Das gravierendste Problem ist die Vermeidung paralleler Instanzen von noad.
Dies erfolgt dadurch, dass vor dem tatsächlichen Aufruf von noad mittels
Code:
pgrep -x noad
geprüft wird, ob schon eine Instanz läuft. Falls ja, wird noad nicht gestartet, sondern ein Aufruf des Skripts mit den gleichen Argumenten an die at-Warteschlange übergeben, standardmässig mit einer Verzögerung von 3 Minuten. Vorher wird versucht, die at-Warteschlange auf bereits anstehende Aufrufe des Skripts zu untersuchen, um zu verhindern, dass zwei Instanzen des Skripts zur gleichen Zeit gestartet werden; in diesem Fall wird eine weitere Minute Verzögerung hinzugefügt.
Bei meinen Tests hat das immer funktioniert, zu 100% sicher ist dies aber wohl nicht; zumindest wenn der Aufruf des Skripts zufällig unmittelbar vor dem Minutenwechsel (also z.B. 19:23:59,5) stattfindet, könnte dies theoretisch fehl schlagen (auch wenn dies wohl sehr unwahrscheinlich ist).


Noch kritischer für die Vermeidung paralleler Instanzen sind mehrere zur gleichen Zeit endende Timer-Aufnahmen (im Offline-Modus) bzw. gleichzeitig beginnende Aufnahmen (im Online-Modus).
Hier wird das Skript dann jeweils mit ca. einer Sekunde Abstand für die jeweiligen Aufnahmen aufgerufen.
Bei meinen Versuchen hat diese Verzögerung immer ausgereicht, damit das erste Skript noad bereits startet, bevor das Skript für die zweite Aufnahme auf ein bereits laufendes noad prüft, aber eine Garantie dafür gibt es sicher nicht.
Wer also sicher ausschliessen wil, dass mehrere parallele Instanzen von noad gestartet werden, sollte am Besten darauf achten, dass die Aufnahmetimer mit mindestens einer Minute Abstand enden (bzw. starten, falls noad im Online-Modus verwendet wird).


Wenn "noad nur für definierte Sender" auf "ja" gesetzt ist, wird die in /var/lib/vdr/noad_channels.conf definierte Senderliste mit dem Sender der aktuellen Aufnahme verglichen und noad nur gestartet, wenn dieser in der Liste eingetragen ist.
Der Sender der Aufnahme wird aus der Datei "info" im Aufnahmeverzeichnis ermittelt. Im Online-Modus wird das Skript allerdings gestartet, bevor diese Datei vom VDR erstellt ist, deshalb muss das Skript u.U. warten, bis diese Datei ausgewertet werden kann.
Deshalb muss im aufrufenden Skript der "before" Aufruf unbedingt mittels eines angehängten & in den Hintergrund verschoben werden.


Der Wert der Noad Option aus dem Setup (Online alle Aufnahmen / Offline etc.) ist in der sysconfig als Klartext hinterlegt.
Das Skript "kennt" hier nur die deutschsprachigen Einstellungen, falls jemand den VDR mit einer anderen Sprache verwendet, wird diese Einstellung vermutlich nicht korrekt interpretiert werden. Falls jemand daran Interesse haben sollte, wäre es aber im Prinzip kein Problem diese Werte in anderen Sprachen hinzuzufügen.



Angehängte Dateien
.zip   noad_wrapper.zip (Größe: 4,84 KB / Downloads: 2)
easyvdr-3.0; MB: Asus M2N-X Plus; DVB: TT-3200, Hauppauge NovaS2; Graka: Geforce GT1030
Zitieren
#2
Ich habe das gestrige Sauwetter dazu genutzt, eine upgedatete Version des Skripts zurecht zu basteln, mit dieser kann man jetzt, falls man noad nur für bestimmte Sender nutzen will, auch die noad_channels.conf Datei über das OSD Menu erstellen bzw. bearbeiten.
Dafür kann das Skript jetzt mit einem neuen ersten Argument "channels" aufgerufen werden, als zweites Argument muss dann "list", "add" oder "remove" folgen, was dann entweder die aktuell definierten Sender auf dem OSD auflistet oder den jeweils aktuell eingestellten Sender der Liste hinzufügt oder ihn daraus entfernt.
Um das zu nutzen reicht ein Eintrag in /usr/share/vdr/command-hooks/commands.custom.conf wie
Code:
Noad-Sender...  {
    Für Noad gewählte Sender anzeigen                      : /usr/local/bin/noad_wrapper.py channels list
    Aktuellen Sender zur Noad-Senderliste hinzufügen       : printf "/usr/local/bin/noad_wrapper.py channels add" | at now
    Aktuellen Sender aus der Noad-Senderliste entfernen    : printf "/usr/local/bin/noad_wrapper.py channels remove" | at now
}
Falls jemand daran Interesse hat, habe ich die neue Version hier mal angehängt.


Angehängte Dateien
.zip   noad_wrapper.zip (Größe: 4,59 KB / Downloads: 5)
easyvdr-3.0; MB: Asus M2N-X Plus; DVB: TT-3200, Hauppauge NovaS2; Graka: Geforce GT1030
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: