Logging mit Skripten verknüpfen

Hallo,

vielleicht kennt sich damit ja jemand aus? Also… wir bräuchten eine Verknüpfung von logging und anschliessendem Befehl, der jedesmal ausgeführt wird, wenn ein Song aus einer playlist gespielt wurde.

Beispiel:
Zuletzt lief das Lied “Lied” vom Interpreten “Interpret”.

Nun gibt es ja im Logging die Möglichkeit sich den letzten gespielten Song (und nur diesen einen Song) mit komplettem Pfad anzeigen zu lassen. Das wäre dann hier z.B.

x:\songs\Interpret - Lied.mp3

Was jetzt passieren sollte ist folgendes… immer dann wenn hier ein neuer Eintrag drinsteht, soll ein Skript…

a) überprüfen, ob das Lied sich im Verzeichnis xy, also in unserem Beispiel in x:\songs\ befindet
und
b) falls (a) mit ja beantwortet werden kann, die Datei “Interpret - Lied.mp3” in “Interpret - Lied.mpx” umbenennen.

Wie lässt sich so etwas realisieren?

Schon mal Danke für Ideen…

Kim
( (a) ist die Überprüfung , ob die mp3 dann von (b) umbenannt werden darf)

Im Prinzip könnte man das per Notification Script regeln - wobei man da dann auf so Probleme stößt wie die Tatsache, dass sich eine Datei nicht umbenennen lässt, solange sie noch im Player läuft oder geladen ist.

Außerdem kommt mir das ganze Unterfangen etwas “merkwürdig” vor. Kannst du mal die Hintergründe erläutern? Warum soll die Datei umbenannt werden, wenn sie gelöscht wurde?

Wir haben da eine ganz simple Rotation für vorproduzierte Stundensendungen. Es gibt sozusagen eine Art Stunden-Tage-Plan bei uns (24 mal 7 Fächer bzw. Ordner) in denen verschiedene Redaktionen vorproduzierte Sendungen als mp3 hineinspeichern. Diese mp3’s werden anschliessend mit einer m3u-Datei verküpft, und von Mairlist dann jeweils zur vollen Stunde abgespielt. Das läuft soweit alles bereits prima.

Dann gibt es bei uns einen zweites Helferlein (ist auf nem unix-Server aufgesetzt), das immer dann, wenn keine mp3’s da sind in so einem Ordner (z.B. nachts) ein Zufallsprogramm (auch wieder komplette Stunden - aber nur Musik ohne redaktionellen Inhalt) drumrumplant. Auch das macht, was es soll.

Damit keine “Reste” von redaktionellen Stunden übrig bleiben und 1 Woche später eben nichts altes wiederholt wird (für den Fall, dass eine Woche später zu dieser Uhrzeit gar keine redaktionelle Sendung eingeplant wäre), braucht nun der Zufallsplaner einen Hinweis darauf, dass die Sendung bereits gespielt wurde. Und dazu müsste nun also so eine Sendung, nachdem sie gespielt wurde umbenannt werden (löschen ist zu riskant, ausserdem dürfen die Redaktionen ihren Ordner selber sauber halten und alte Sendungen weglöschen)… z.B. so:

110210_Filmmagazin.mp3 zu 110210_Filmmagazin.mpx

Nachdem ja auch einzelne mp3’s ins Loggin geschrieben werden können (auch mit komplettem Pfad - als STOP-logging) wäre eine Vernüpfung des loggins (Info, was umbenannt werden soll) und einem Skript, das nach dem gespielten Song dann gestartet wird und die Info aus dem Logging übernimmt) genau das, was das Ding können soll (aber mit der Überprüfung des Ordners/Verzeichnisses, da ja nur die redaktionellen Sendungen umbenannt werden sollen und eben nichts anderes).

Könnt ihr dem Zufallsplaner nicht einfach das Stop-Log geben, so dass er sich selbst heraussucht, was bereits gespielt wurde, und dann etwas anderes aussucht?

Prinzipiell ja… doch das “Aufräumen” von Mairlist getriggert zu erledigen scheint sicherer zu sein, als wenn das “Aufräumen” von einem externen Prozess gemacht wird. Da sollte Mairlist sozusagen das “freimachen” der Stunden erledigen (MAirlist weiss ja, wann was lief - im Gegensatz zu den “blinden” externen Skripten) und die externe Planung dann die “Bestückung” der Sende-Plätze übernehmen. Aus Gründen der Sicherheit und Flexibilität wäre das schon so herum die beste Lösung…

Eigentlich fehlt ja nur so eine Art trigger-Impuls, der sagt: Du ich habe gerade file xy abgespielt. Diesen Impuls nach “Aussen” weiterzureichen wäre an sich schon ausreichend. Denn dann hätte dann ein externes Program bzw. Skript die Info tätig zu werden. Das soll ja nach Möglichkeit ohne irgendein festes Zeitintervall auskommen. Gearbeitet werden soll immer genau dann, wenn das File zuende ist bzw. gerade abgespielt wurde.

Dann bietet sich vermutlich ein Notification Script mit OnPlayerStop und OnCartPlayerStop an.

Das folgende Beispiel zeigt, wie man immer dann, wenn eine Datei zuende abgespielt wurde, ein externes Programm aufruft:

procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue; Item: IPlaylistItem);
begin
  if Item.GetXMLNodeName = 'File' then // nur für Dateien
    ShellExecuteHidden('meinexternesprogramm.exe', IFilePlaylistItem(Item).GetFilename);
end;

procedure OnCartPlayerStop(PlayerIndex: integer; Duration: TTimeValue; Item: IPlaylistItem);
begin
  // hier das gleiche wie oben reinkopieren
end;

begin
end.

Ob das jetzt echt so praktikabel ist, müsst ihr selbst wissen. Ich würde sowas ja nicht vom Playout-Prozess machen lassen…

Das hilft schon stark weiter. Danke dafür… aber was hast du für Bedenken, das so zu machen?

Edit: Was mir noch auffällt… du hast da //nur für Dateien kommentiert. Wie kann ich denn die if-Bedingung so umändern, dass er da überprüft, ob etwas in einem bestimmten Verzeichnis liegt?

also if (in Verzeichnis xy inclusive Unterverzeichnissen enthalten) then…

Meiner Meinung nach sollte sich das Playout-System so gut es geht auf seine Hauptaufgabe, die Ausspielung, konzentrieren. Alles, was man da per Script “dranbastelt”, geht im Zweifel zu Lasten der Stabilität. Überleg mal, da wird jedesmal, wenn man einen Titel stopppt, eine externes Programm gestartet. Wenn das dann mal etwas länger brauchen oder die CPU zu stark beanspruchen sollte…

Davon ab halte ich das Umbenennen von Dateien zur “Signalisierung” für keine besonders geschickte Lösung. Wenn es für das Erzeugen der Füll-Listen eh eine externe Software gibt, kann diese auch mal eben am Anfang die Stop-Log-Liste einlesen und entsprechend berücksichtigen.

Naja, müsst ihr wissen.

In meinem Beispiel wird einfach ein externes Programm aufgerufen und dabei der Dateiname übergeben. Das externe Programm, das ihr dann erstellen müsst, kann sich dann den Dateinamen anschauen und entsprechend filtern. Oder aber ihr vergleich vor dem Aufruf noch den Dateinamen mit einem bestimmten String. Geht ganz einfach über die pos-Funktion:

if pos('x:\songs\', IFilePlaylistItem(Item).GetFilename) = 1 then ...

Den Rest müsste euer Programmierer hinkriegen.

Ok. Lieben Dank :slight_smile: