Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 27.03.09 15:49 

ScrobblerUtils, v0.2
*** Jetzt wieder mit ohne Ansi. ;-) ***


Eine Klasse, mit der man relativ einfach seinen eigenen Player zum Scrobbeln bringen kann.

Was ist Scrobbeln?

Der Begriff "Scrobbeln" beschreibt den Vorgang, das aktuell gespielte Lied in sein Userprofil auf Last.fm einzutragen. Last.fm ist ein auf Musik spezialisierter Web2.0-Dienst. Über die "gescrobbelten" Lieder kristallisiert sich mit der Zeit ein Musikgeschmack heraus, der mehr oder weniger mit dem von anderen Last.fm-Usern übereinstimmt. Über die diversen Funktionen auf dieser Seite können dann Leute mit ähnlichem Geschmack gefunden werden, um über deren Scrobbel-Liste weitere Lieder kennenzulernen, die man selbst wahrscheinlich auch gut findet. Für weitere Details, auch zu hier verwendeten Begriffen: Last.fm-Api-Dokumentation.

Was liefert ScrobblerUtils?

ScrobblerUtils implementiert das verwendete Protokoll und kapselt die nötigen Aufrufe relativ komfortabel. ScrobblerUtils kann recht einfach in einen bestehenden Player-Code integriert werden. Der Code des Players muss folgendermaßen erweitert werden:
  • ScrobblerUtils sendet zur Laufzeit diverse Messages an das Anwendungsfenster. Auf diese muss entsprechend reagiert werden, um die in separaten Threads herunter-/hochgeladenen Daten passend zu verarbeiten
  • Der User muss angeleitet werden, der Anwendung Schreibzugriff auf sein Profil zu gewähren. Das sind im Wesentlichen drei Klicks, der mittlere davon im Webbrowser
  • Wenn der Player die Wiedergabe startet, pausiert, stoppt oder das Lied wechselt, muss ein passender Scrobbel-Aufruf in den Code eingefügt werden.
Der Rest geht dann von selbst, d.h. ScrobblerUtils kümmert sich selbstständig darum, ob ein Lied überhaupt gescrobbelt werden darf (z.B. wenn es lang genug gespielt wurde), und casht bei Verbindungsproblemen ggf. die abgespielten Lieder, um sie bei erneuter Verbindung in einem Rutsch zu scrobbeln.

Die Details sollten anhand der Demo-Anwendung klarer werden.

Benötigte Komponenten, IDE
  • Getestet mit Delphi 2007 und Delphi 2009 (Unicode-Probleme sollten also nicht auftauchen)
  • ggf. Indy-Komponenten (Version 10)
  • eine MD5-Unit (liegt bei)

Nutzungsbedingungen
  • Nutzung der Unit: Siehe Kommentare im Code und readme.txt.
    Eine angemessene Erwähnung in den Credits der Anwendung ist erforderlich.
  • Es müssen die "Terms of Use" von LastFM berücksichtigt werden.
  • In der Demo-Anwendung ist ein API-Key und zugehöriges Secret verwendet, welches NUR ZU DEMOZWECKEN verwendet werden soll. Eine entsprechende Warnung kommt auch während der Authentifizierung. Wer diese Unit nutzen möchte: Unbedingt ein eigenes Key/Secret-Paar besorgen. Das erhält man auf Wunsch, wenn man sich bei LastFM anmeldet. Das hier verwendete Paar gehört einem Dummy-Fake-User, den ich für diese Zwecke angelegt habe.

Wichtige Hinweise zur Nutzung und empfohlene Erweiterungen
  • Für jede eigene Scrobble-Anwendung muss eine eigene Klasse von TApplicationScrobbler abgeleitet werden, in der das jeweilige API-Key/Secret Paar verwaltet wird.
    In dieser Klasse MUSS die abstrakte Methode GenerateSignature implementiert werden, die die Parameterliste (in Form eines UTF8Strings) und das Secret zu einem MD5-Hash verarbeitet, mit der die Anfrage an LastFM signiert wird. Das kann unsicher wie in der Demo passieren, oder sicherer über einen eigenen Webdienst, wenn man das Secret nicht in dem Binary/Quellcode verteilen will.
  • Der Sessionkey, der während der Authentifizierung ermittelt wird, sollte "sicher" gespeichert werden. Hier wird er unverschlüsselt in einer Ini gespeichert. Mit dem Session-Key und Username könnte jemand anderes Zugriff auf das Nutzerprofil erlangen. Da dieser Key auch unverschlüsselt übertragen wird, ist "sicher" hier ein sehr relativer Begriff.

Update von Version 0.1
Am besten von vorne anfangen. Da geschätzt drei Leute diese Klasse verwenden, habe ich in keinster Weise auf Abwärtskompatibiltät geachtet. ;-)
  • In Version 0.2 wurde auf die API-Version 2.0 umgestellt, bei der einiges anders läuft. So ist keine Client-ID mehr nötig, und der Handshake vor dem Scrobbeln fällt weg. Damit ist auch die Fehlerbehandlung komplett anders.
  • Die verschickten Messages sind jetzt andere, und die Parameter ebenso. Mehr dazu in der readme.
  • Einiges an Scrobbel-Logic, das bisher im Message-Handler erledigt werden musste, wird jetzt intern geregelt. Der Message-Handler wird dadurch übersichtlicher und dürfte weniger fehleranfällig sein.


Edit, 18.11.2011: Beitrag für Version 0.2 komplett überarbeitet
Einloggen, um Attachments anzusehen!
_________________
We are, we were and will not be.


Zuletzt bearbeitet von Gausi am Fr 18.11.11 19:27, insgesamt 6-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 27.03.09 17:55 
Muss ich rein zum Testen, ob es unter Delphi 2009 klappt noch etwas machen außer kompilieren? Denn funktionieren tut es dann auf Anhieb nicht.

Ich habe kompiliert und im Programm dann auf den ersten Button geklickt. Passiert ist nix und abbrechen ließ sich der Prozess auch nicht mehr.

Es kommen viele Warnungen an den Stellen, an denen du z.B. Add benutzt, das sollte aber bei "normalen" Zeichen keine Probleme machen. Mein Verdacht bei einem ersten schnellen Blick in die Unit ist aber was den Fehler angeht diese Stelle z.B.:
ausblenden Delphi-Quelltext
1:
          SendMessage(fWindowHandle, WM_Scrobbler, SC_GetToken, lParam(PChar(Response)));					
Warum PChar? Das sollte doch wohl eher PAnsiChar sein, oder?

Genauer hab ich da jetzt nicht geschaut, ich teste erstmal andere Delphiversionen. ;-)

Ansonsten:
Die Idee finde ich schön, auch wenn ich das eigentlich als Benutzer nicht nutzen wollen würde baue ich es vielleicht dann doch einmal ein, wenn das so einfach geht. :zustimm:
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 27.03.09 19:32 
Ups, an Strings hatte ich gedacht, PChars nicht. Werde ich ausbessern müssen, sowohl beim Senden, als auch beim Empfangen der Messages.

Wenn nichts passiert: Das liegt jetzt aber nicht daran, dass eine Firewall oder ähnliches die Kommunikation verhindert, oder?

_________________
We are, we were and will not be.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 29.03.09 11:23 
So neue Version mit noch mehr Ansi im Code ist da. Ich hoffe, es läuft jetzt auch wirklich mit Delphi 2009. :D

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.03.09 17:18 
Im Virtual PC kam mit der alten Version dann doch eine Meldung. Nämlich, dass die TokenID nicht geholt werden konnte (FAILED).

Aber die neue Version funktioniert mit Delphi 2009 problemlos (getestet unter Vista und XP), nur ein kleiner Fehler war noch in der Demo:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.BtnAuthorizeClick(Sender: TObject);
var authUrl: AnsiString;
begin
    authUrl := 'http://www.last.fm/api/auth/?api_key=' + DemoScrobbler.ApiKey + '&token=' + DemoScrobbler.Token;
    ShellExecuteA(Handle, 'open', PAnsiChar(authUrl), nilnil, SW_SHOW);
end;
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 30.03.09 19:20 
Ok, dann Danke erstmal fürs Testen. :D

Hab grade die Trial von Delphi 2009 ausprobiert und festgestellt, dass da noch ne ganze Reihe anderer Warnungen vom Compiler kommen, die teilweise auch ihre Berechtigung haben - das Loggen von Unicode-Gescrobbel klappt nicht, da wird irgendwo noch nach AnsiString umgewandelt, wo eigentlich UTF8 oder so sein sollte.
Muss ich mir mal genauer ansehen, evtl. auch nachdem ich mal mein gewonnenes RAD Studio 2007 Enterprise irgendwie halbwegs kostengünstig upgedated hab. Auf Dauer ist das ja kein Zustand - vor allem auch wegen meinen Mp3FileUtils. :?

_________________
We are, we were and will not be.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 18.11.11 19:33 
Da mich vor kurzem jemand angemailt hat, dass LastFM die alte API nicht mehr für neue Projekte unterstützt (d.h. keine Client-IDs mehr rausgibt), habe ich das hier mal für die neue API überarbeitet.

Herausgekommen ist Version 0.2, die jetzt voll unter Delphi 2009 läuft, aber auch mit 2007 getestet wurde.
Wer eine Anwendung mit Version 0.1 nutzt, muss einiges ändern. Kompatibel sind die beiden Versionen in keinster Weise - auch am Konzept hat sich einiges geändert.
Bisher musste man ja irgendwie die Unit selbst anpassen, um sie richtig zu verwenden. Dafür muss man sich jetzt eine eigene Klasse ableiten, in der man einige Anpassungen vornehmen kann, z.B. die Userdaten so speichern, wie man das gerne mag.

Ich bau das in den nächsten Tagen in meinen Player ein - mal sehen, wie umfangreich das Umbauen dort wird. :lol:

_________________
We are, we were and will not be.