Logging-Schnittstelle: Ausgabe einer XML-Datei

Hallo zusammen,

ich frage mich, warum es in mAirlist keine Möglichkeit gibt, über die Logging-Schnittstelle alternativ zu Textfile und HTTP-GET/POST etc.
ein XML-File auszugeben? Einige Drittanbieter (Radio-Apps etc.) verlangen dies für eine Anbindung der Now Playing Metadaten an deren System.

Es würde reichen, wenn mAirlist die Values der Logging-Variablen in ein vom Nutzer frei definierbares XML-Template einsetzen würde.
Also quasi nicht mehr als ein Textfile mit XML-Endung, in dem mAirlist nur die Variablen ersetzt und den Rest stehen lässt.

<?xml version="1.0"?>
<PLAYLIST>
  <ELEMENT>
    <SEQUENCE>present</SEQUENCE>
    <ARTIST>Michael Jackson</ARTIST>
    <TITLE>Bad</TITLE>
    <TIME>2013-06-25 16:25:50.148</TIME>
    <LENGTH>03:34</LENGTH>
  </ELEMENT>
</PLAYLIST>

Gruss,
zunder

Guter Punkt. Ich denke im Hinterkopf schon länger über sowas ähnliches nach: Ich würde gerne vom Logging eine mAirList-Playlist erstellen lassen, sodass man hinterher die Sendung quasi 1:1 noch mal direkt in mAirList laden kann. Das wäre ja auch eine XML-Datei.

Theoretisch müsste das ja mit der jetzigen Logging-Schnittstelle gehen. Sieht halt etwas unübersichtlich aus, wenn alles in einer Zeile steht. Aber mal kann ja die Vorlage in einem Texteditor schreiben und dann in die Zeilen Start-/Stop-Eintrag entsprechend kopieren.

Ich habe es allerdings noch nicht probiert, weil die Priorität nicht so hoch ist in meinem Fall. :wink:

Die Antwort ist einerseits ganz leicht und andereseits ganz schwer:

Leichte Antwort: Weil XML eigentlich nur Text ist. Du könntest also jetzt schon das Logdatei-Feature (mit Haken bei “jedes Mal überschreiben”) nutzen und das XML-Gerüst samt Variablen als Textformat eingeben. Einzige optische Unschönheit dabei: Man muss alles in eine lange Zeile schreiben (was aber laut XML-Spezifikation keine Rolle spielt).

Ein XML-Log-Feature, wie du es anregst, wäre also erstmal identisch mit dem jetzigen Text-Logging, halt nur mit einem mehrzeiligen Eingabefeld.

Schwere Antwort: Das oben Genannte funktioniert nur so lange, wie keine Sonderzeichen in den Texten vorkommen, die in XML sauber escaped werden müssten. Paradebeispiel: die Zeichen < und >, aber auch & (und das kommt häufig im Interpretennamen vor!).

Deswegen darf man eigentlich nicht einfach nur eine dumme Textersetzung durchführen, sondern muss sauberes XML erzeugen.

Und deshalb müsste dieses XML-Logging etwas komplizierter sein: Es müsste das vom Benutzer eingegebene XML-Template zunächst deserialisieren (also das DOM daraus bilden), dann den Baum durchgehen und in allen Text-Nodes die Variablen-Ersetzung durchführen, und am Ende wieder nach XML serialisieren.

Ich überlege mal, ob man sowas für die Zukunft einbauen könnte.

Im Moment ist es wohl am saubersten, man behilft sich mit einem Hintergrund-Script wie dem folgenden (hier für mAirList 5.x):

procedure OnItemStart(Item: IPlaylistItem; Region: byte; UniqueID: string);
var
  doc: ISXMLDocument;
  rootnode, node: ISXMLNode;
begin
  // Wir wollen nur Musik loggen
  if Item.GetItemType <> pitMusic then exit;
  // Und nur wenn on air
  if Instance.GetOnAir = false then exit;

  doc := CreateXMLDoc;

  node := doc.CreateElement('ELEMENT');
  node.AddChild('SEQUENCE', 'present');
  node.AddChild('ARTIST', Item.GetArtist);
  node.AddChild('TITLE', Item.GetTitle);
  node.AddChild('TIME', FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', now()));
  node.AddChild('LENGTH', FormatTimeValue('nn:ss', false, Item.GetEffectivePlaybackDuration));

  rootnode := doc.CreateElement('PLAYLIST');
  rootnode.AppendChild(node);
  doc.SetDocumentElement(rootnode);
  doc.SaveToFile('C:\temp\ausgabe.xml', true);
end;

begin
end.

Hallo Torben,

ich werde das Hintergrundscript am Wochenende ausprobieren. Danke dir!

Wenn die XML-Generierung irgendwann im Logging zur Verfügung stünde, wäre das natürlich am komfortabelsten. :slight_smile:

Grüße,
zunder

Gute Nachrichten: Logging in XML-Dateien, über die GUI konfigurierbar, kommt in v5.3.