Criss hat geschrieben:Mich würde noch interessieren wie Du auf die FreeDB.org per Purebasic zugreifst? Währe Dir zutiefst dankbar für ein bisschen Codeschnipsel!
@Criss:
Hallo Criss,
eigentlich ist es sehr einfach an die FreeDB Daten zu kommen. Ich habe mich dabei an der Entwickler Dokumentation orientiert.
Quellenangaben:
Die kannst Du hier finden:
http://www.freedb.org/en/download__misc ... us.11.html
In der Datei:
http://ftp.freedb.org/pub/freedb/misc/f ... coldoc.zip
findest Du die Protokollaufrufe gelistet und mehr schlecht als recht, wie man sie benutzt.
Hintergrundinfos:
Im großen und ganzen wird eine URL mit allerhand Parametern zusammengebaut. Diese URL kannst Du dann auch im Browser deiner Wahl eintippen und und erhällst dann Antwortdaten zurück. Diese Antworten greife ich mit Purebasic auf und zerlege dann in ihre Bestandteile. Die Einzelteile werden dann zu Strings, die ich für die Befüllung der Felder einer Datenbank speichere.
Beispiel:
Code: Alles auswählen
http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+lscat+&hello=test+localhost+Purebasic+4.10&proto=5
Diese URL liefert im Browser eingegeben liefert eine Liste mit Kategorien die in der FreeDB.org Datenbank als Genres gespeichert sind.
Ähnlich geht das auch mit den eigentlichen Daten zur jeweils eingelesenen CD. Man muss auch in diesem Fall eine URL zusammenbauen worin dann Angaben wie: Befehl für die Datenbank ("read"), E-Mail Adresse des Anfragenden, Clientversion, DiscID und das Protokoll als Parameter an ein CGI Script übergibt. Stimmen diese Angaben, liefert das Script die Ergebnisdaten an den Browser bzw. Purebasic aus. Diese Daten sind wieder zu zerlegen so das man Felder für die Datenbank herausholt.
Ein weiterer Punkt ist die Erzeugung der mehr oder weniger eindeutigen DiscID. Aus den Startzeiten der jeweiligen Stücke auf der Audio CD wird eine Quersumme gebildet und zusammen mit der kompletten Länge der CD (in Sek.) und der Anzahl der Tracks auf der CD ein Hexadezimaler String erstellt. Das ist die sog. RawDiscID. Diese wird in der Generierung der Abfrage URL gebraucht.
Am Beispiel: 9f0e010c:
Code: Alles auswählen
http://freedb.freedb.org/~cddb/cddb.cgi?cmd=cddb+read+rock+9f0e010c&hello=test+localhost+Purebasic+4.10&proto=5
Da eine AudioCD bei FreeDB.org auch in mehreren Kategorien als Datensatz abgelegt sein kann oder auch die DiscID mehrfach vorkommen kann, steckt hier ein wenig mehr Geschick beim Parsing mit Purebasic auf dem Programm. Hat man diese Fälle abgedeckt, steht der Speicherung in der Datenbank nichts mehr im Weg.
Hat man sich dann diese Abfrage URL zusammengebaut und sie funktionert, dann übergebe ich sie an folgende Funktion. Die Funktion liefert bei jetzigem Stand nur die reinen Textdaten zurück. Ähnlich wie in dem Beispiel mit der DiscID "9f0e010c".
Als Eingabe Parameter gebe ich den String für den Servernamen ("freedb.freedb.org") und die Abfrage URL wie oben beschrieben mit:
Code: Alles auswählen
Global Server.s = "freedb.freedb.org"
Global Referer.s = "http://www.purebasic.com"
Global UserAgent.s = "Purebasic/4.10 (Windows; U; Windows NT 5.1; de; rv:4.1.0)"
Procedure.s FreeDBRequest(Server.s, HttpGetCommand.s)
If Server = "" Or HttpGetCommand = ""
ProcedureReturn ""
EndIf
NetStack = InitNetwork()
If NetStack = 0
MessageRequester("Error", "No Network valid Stack found", 0): End
EndIf
HttpHeader.s = ""
HttpHeader + "GET " + HttpGetCommand +" HTTP/1.0" + #CRLF
HttpHeader + "Referer: " + Referer + #CRLF
HttpHeader + "User-Agent: " + UserAgent + #CRLF
HttpHeader + #CRLF+#CRLF
MessageRequester("HEADER",HttpHeader)
ConnectionID = OpenNetworkConnection( Server, #NetPort , #PB_Network_TCP )
SendNetworkString(ConnectionID, HttpHeader)
*Buffer = AllocateMemory(10000)
Repeat
ReceiveNetworkData(ConnectionID, *Buffer, MemorySize(*Buffer))
Until NetworkClientEvent(ConnectionID) = 0
ResultData.s = PeekS(*Buffer)
FreeMemory(*Buffer)
CloseNetworkConnection(ConnectionID)
ProcedureReturn ResultData
EndProcedure
Wie man sieht baue ich auch gleich einen HTTP-Header zusammen der die Abfrage URL an die FreeDB.org übergibt. Als Ergebnis erhalte ich in Purebasic so wie am Beispiel der DiscID auch wieder die reinen Textdaten zurück. Und genau hier könnte ich Unterstützung gut gebrauchen. Das Zerlegen bereitet mir mehr Probleme als ich dachte. In Python und PHP würde ich das sicher schneller hinbekommen aber Purebasic ist Neuland.
Hoffe Du hast jetzt ein wenig Durchblick wie man an die Daten von FreeDB.org mit Purebasic kommt. Falls nicht, kann ich auch ein wenig mehr als nur Codeschnipsel und kleine Infos rausrücken.
Grüße
Alen