So, danke an Matze, betrachtet das Thema als erledigt (falls es hier so ein System gibt). Jedenfalls für alle anderen (ich hasse es, wenn jemand als letzten Beitrag schreibt "Geht jetzt, danke" aber dann nicht mehr genau wie eigentlich), die ein ähnliches Problem haben (werden - Google wird in Zukunft dann weiterhelfen können), hier nochmal abschließend meine gesamte Discogs
Unit, für euch sogar, entgegen meinem üblichen Programmierstil für meine privaten Programme, kommentiert.
Delphi-Quellcode:
unit U_Discogs;
interface
uses
Classes, SysUtils, idHTTP, IdHTTPHeaderInfo, IdCompressorZLibEx,
xmldom, XMLIntf, msxmldom, XMLDoc;
var
Compressor: TIdCompressorZLibEx;
DC_HTTP: TidHTTP;
DC_XML: TXMLDocument;
function DC_SearchArtist(
Name:
String): Boolean;
function DC_SearchRelease(
Name:
String): Boolean;
// DC_SearchLabel könnte entsprechend hinzugefügt werden
// Ich persönlich brauche es momentan aber nicht
implementation
function MakeURL(SType, STerm:
String):
String;
begin
STerm:=StringReplace(STerm,'
','
+',[rfReplaceAll]);
// Eventuell muss der Suchterm für die API später noch weiter angepasst werden, z. B. mit TIdURI.URLEncode
result:='
http://www.discogs.com/search?type='+SType+'
s&q='+STerm+'
&f=xml&api_key=<API_Key>';
// URL erzeugen
end;
// Allgemeine Suchfunktion für alle Typen (SType)
function DC_SearchRequest(SType,
Name:
String): Boolean;
var Response: TStringStream;
begin
Response := TStringStream.Create('
');
try
DC_HTTP.Get(MakeURL(SType,
Name), Response);
DC_XML.LoadFromStream(Response,xetUTF_8);
// Zugriff auf Ergebnis bei erfolgreicher Suche später über DC_XML
except
on E:
Exception do
DC_XML.XML.Text:='
';
end;
Response.Free;
result:=Pos('
stat="ok"',DC_XML.XML.Text)>0;
// Erfolgsbestätigung
end;
// "Weiterleitungen" mit automatischem Suchparameter
// Auf diese Weiterleitungen könnte auch verzichtet werden
// Allerdings gibt es in meinem Projekt viele API-Units, die standardisierte function-Namen verwenden
function DC_SearchArtist(
Name:
String): Boolean;
begin
result:=DC_SearchRequest('
artist',
Name);
end;
function DC_SearchRelease(
Name:
String): Boolean;
begin
result:=DC_SearchRequest('
release',
Name);
end;
// Label-Suche ggf. entsprechend mit 'label' einfügen
// Die Zerlegung des Ergebnisses in meine TArtist, TAlbum und TSong-Klassen fehlt noch
initialization
DC_HTTP:=TidHTTP.Create;
// Allgemeine TidHTTP Komponente der Discogs-Unit
Compressor:=TIdCompressorZLibEx.Create(DC_HTTP);
// Discogs sendet gzip komprimiert
DC_HTTP.Compressor:=Compressor;
DC_HTTP.Request.AcceptEncoding:='
gzip';
// GET Header mit "Accept-Encoding: gzip" versehen
DC_XML:=TXMLDocument.Create('
');
// Allgemeine TXMLDocument Komponente der Discogs-Unit
finalization
// Beim Beenden die allgemeinen Objekte wieder freigeben
DC_XML.Free;
Compressor.Free;
DC_HTTP.Free;
end.