HTTPGet funktioniert nicht in Version 4.4.4 (build 2066 und neuer)

Hallo

seit Build 2066 (evtl auch schon früher) funktioniert HTTPGet nicht mehr

[code] Auszug!

try
SC5.CommaText := HTTPGet(‘http://localhost/7.html’);
if (SC5[3] = ‘1’) then begin
ExecuteCommand(‘DOWN81 BACKGROUNDCOLOR #00FF00’);
end;
except
begin
ExecuteCommand(‘DOWN81 BACKGROUNDCOLOR #D4D0C8’);
end;
finally
SC5.FREE;
end;

[/code]

dieser Code funktioniert in Version 4.4.3 Build 2057 einwandfrei.
Bei Version 4.4.4 2066 Wird zwar von mAirlist kein Fehler gemeldet, jedoch der Shoutcast Server 1.9.8, welcher die 7.html liefert, schreibt in seinem Log “Invalid Recource Request (/7.html)”
Leider weiß ich nicht genau ab welchem Build der Fehler auftritt, definitiv aber ab 2066 und neuer.

Seit Build 2065 setzt mAirList den User Agent im HTTP-Header auf einen eigenen String (mAirList/). Offenbar glaubt Shoutcast nun, es handle sich nicht um einen Webbrowser, weil das magische “Mozilla” nicht mehr drin vorkommt. Zweifelhafte Praxis…

Ich lade gerade Build 2073 hoch, dort kommt das “Mozilla” wieder drin vor. Teste doch mal bitte, ob es nun wieder geht.

Danke Torben,

Funktioniert wieder.

Eine Frage hätte ich noch. Wie ändere ich beim laufenden PlaylistItem den Metatag den Titel und geht das während der Läuft periodisch? Hintergrund ist ja die Tatsache das bei Streams die ankommenden Metadaten nicht weitergegeben werden. Da mein Script ja die 7.html des SHOUTcast servers auswertet würde ich gerne dem Script auch dem Stream der ja dann in der Playlist steht einfach die ankommende Titelinformation übergeben. Laut scriptinghelp gibts ja sowas wie IPlaylistItem.SetTitle(string). wie müsste der richtige Syntax für das gerade laufende Element lauten?

Gruß René

So das Updaten hab ich gelöst … leider liefert das HTTPGet im Commatext das nicht so schön wie gedacht zurück. Daher nächste Frage wie siehts mit dem Parsen von xml aus? Kann das Pascalscript? Es geht spezifisch darum aus dem rückgeliefertem xml des Ausfrufs http://ip:port/admin.cgi?pass=yourpass&mode=viewxml&page=1 den Inhalt des Nodes .

Übrigens in der SHOUTcast Doc steht bei allen explizit drin

Your XML parser MUST send a User-Agent: HTTP header containing the word "Mozilla" in order for the DNAS to recognize it as something other than a listener.

hmmm jetzt hab ich ein Problem mit XML

Nach dem ich hier mit der Suche was zum einlesen von Playlisten im XML Format gefunden hatte, habe ich versucht eine Routine zum parsen der obigen xml zu schreiben. Doch das ganze scheitert schon gleich zu Beginn mit folgender Fehlermeldung:

[Error] Unknown type ‘IXMLDocument’

gibts den Typ nicht mehr in der aktuellen Version? das script was ich hier gefunden hatte war von 2011.

Gruß René

Ab Version 4.4 kommt eine neue XML-Bibliothek zum Einsatz, nennen wir sie mal “Simple XML” - daher heißen die Interfaces jetzt auch alle ISXMLDocument, ISXMLNode usw.

Dahinter steckt ein selbstprogrammierter Wrapper um die Microsoft-XML-Routinen herum, der die Benutzung für mich - und euch - erleichtern soll.

Hier als Referenz die aktuellen Deklarationen:

  ISXMLDocument = interface;
  ISXMLNodeList = interface;

  ISXMLNode = interface ['{58973479-CBA8-4838-BF5F-DE02BA1B7DA9}']
    function GetOwnerDocument: ISXMLDocument;
    function GetNodeName: string;
    function GetNodeText: string;
    procedure SetNodeText(iValue: string);
    function HasAttribute(iName: string): boolean;
    function GetAttribute(iName: string): string;
    procedure SetAttribute(iName, iValue: string);

    function GetChildNodes: ISXMLNodeList;
    function AddChild(iName: string; iValue: string = ''): ISXMLNode;
    procedure AppendChild(iNode: ISXMLNode);

    function SelectNode(iPath: string): ISXMLNode;
    function SelectNodes(iPath: string): ISXMLNodeList;

    function GetXML(iIndent: boolean): string;

    property OwnerDocument: ISXMLDocument read GetOwnerDocument;
    property NodeName: string read GetNodeName;
    property NodeText: string read GetNodeText write SetNodeText;
    property Attributes[iName: string]: string read GetAttribute write SetAttribute;
    property ChildNodes: ISXMLNodeList read GetChildNodes;
  end;

  ISXMLNodeList = interface ['{05308D52-30C6-4230-9BA7-10E034B66F3C}']
    function GetCount: integer;
    function GetItem(iIndex: integer): ISXMLNode;
    property Count: integer read GetCount;
    property Items[iIndex: integer]: ISXMLNode read GetItem; default;
  end;

  ISXMLDocument = interface ['{337491F9-3B7B-47DB-915A-FF90EAEEF1D4}']
    function GetDocumentElement: ISXMLNode;
    procedure SetDocumentElement(iNode: ISXMLNode);
    function CreateElement(iTagName: string): ISXMLNode;

    function GetXML(iIndent: boolean): string;
    procedure SetXML(iValue: string);

    function GetXMLUTF8(iIndent: boolean): UTF8String;
    procedure SetXMLUTF8(iValue: UTF8String);

    procedure LoadFromFile(iFilename: string);
    procedure SaveToFile(iFilename: string; iIndent: boolean = true);
    procedure LoadFromStream(iStream: TStream);
    procedure SaveToStream(iStream: TStream; iIndent: boolean = true);

    property DocumentElement: ISXMLNode read GetDocumentElement write SetDocumentElement;
  end;

function CreateXMLDoc: ISXMLDocument;
function CreateXMLDocFromXML(iXML: string): ISXMLDocument;
function CreateXMLDocFromFile(iFilename: string): ISXMLDocument;

Das Tolle ist: Simple XML unterstützt XPath, über die Funktionen SelectNode und SelectNodes. SelectNode liefert den ersten Treffer zurück, SelectNodes alle Treffer als Liste.

var
  doc: ISXMLDocument;
  node: ISXMLNode;

begin
  doc := CreateXMLDocFromXML(HTTPGet(url));
  node := doc.GetDocumentElement.SelectNode('/SONGTITLE');
  // Titel kann jetzt über node.GetNodeText ermittelt werden
end.