ich würde gerne stündlich die Länge eines Nachrichten-Blocks auslesen. Der Gedanke dahinter ist einfach:
Sobald der Block startet, wird ein Script ausgeführt. Zunächst wollte ich mir mit GetDuration die Längen der folgdenden 7 Elemente zusammenaddieren. Nach kurzer Suche habe ich gesehen, dass Element-Informationen nun mit CurrentPlaylist.GetMetadata(i).?? ausgelesen werden. An dieser Stelle wäre zunächst interessant, welche Funktionen es neben GetStartTime(type) noch gibt. (Z.B. die Dauer)
Der Workaround war dann, vom 8. Element die Starzeit herauszufinden, um dann auf PHP-Basis (wohin diese Informationen sowieso geleitet werden) die Dauer auszurechenen.
Dabei entstand folgendes einfaches Script:
[code]
var ende: String;
begin
ende:=FormatDateTime(‘hh/nn/ss’, Playlist(0).GetMetadata(8).GetStartTime(sttCalculated));
ende.SaveToFile(‘C:\newsdauer.php’);
ende.Free;
end.[/code]
Dies gibt mir allerdings den Fehler: Fehler beim Ausführen der Aktion Script ausführen (C:\Users\Administrator\Desktop\GetDuration.mls): [Fehler] (5:6): Semicolon (’;’) expected
Ich kann an dieser Stelle aber weder Syntax-Fehler noch ein fehlendes Semikolon entdecken. Wo liegt das Problem?
Zu dem Script-Fehler: Ein string ist kein Objekt, mit dem man mal eben SaveToFile machen kann. Stattdessen brauchst du eine StringList, bzw. bei mAirList eine IStrings-Instanz:
var
sl: IStrings;
begin
sl := Factory.CreateStrings;
sl.Add(FormatDateTime('hh/nn/ss', Playlist(0).GetMetadata(8).GetStartTime(sttCalculated)));
sl.SaveToFile('C:\newsdauer.php');
end.
Ein “Free” ist nicht notwendig, da über Interfaces verwendete Objekte Referenzzählung verwenden und automatisch freigegeben werden.
Die Sache mit der Länge des Nachrichtenblocks ist nicht ganz trivial. Was du zum Beispiel machen könntest wäre die Elemente in eine temporäre Playlist zu kopieren und dann deren Länge zu ermitteln:
var
i: integer;
pl: IPlaylist;
begin
pl := Factory.CreatePlaylist;
CurrentPlaylist.BeginRead;
try
for i := 1 to 7 do
pl.Add(CurrentPlaylist.GetItem(i));
finally
CurrentPlaylist.EndRead;
end;
// jetzt kann pl.GetDuration verwendet werden, um die Spiellänge der Elemente zu ermitteln
end.
Das BeginRead/EndRead sollte man immer verwenden, damit die CurrentPlaylist während der Laufzeit des Scripts geperrt wird, so dass kein anderer Thread (oder der Benutzer) Änderungen vornehmen kann.