xscDevBlog – LastSharp & Co.

Der xscheme-DevelopmentBlog

LastFmLib.Net

with 6 comments

UPDATE 12.12.2008: Veränderungen in den Namespaces von LastFmLib.Net!

Ich habe mich in letzter Zeit viel mit Last.FM beschäftigt, nicht zuletzt wegen meinen beiden Programmen LastSharp und Lea. Aufgrund eines Problems mit letzterem (Tracks/Künstler mit Umlauten machen Schwierigkeiten) habe ich mich ein wenig umgesehen und bin auf eine (angeblich vollständige) Implementierung des Last.FM-APIs in .NET gestoßen: LastFmLib.Net.

Und weil diese Bibliothek wirklich einzigartig einfach zu verwenden ist (obwohl auch hier die Umlaute noch nicht extra betrachtet werden), möchte ich meine Erfahrungen gerne teilen und eine winzige, deutschsprachige Erklärung zu ihrer Verwendung bzw. Anwendung auf das API 2.0 schreiben.

Vorbereitung

Jeder, der den Last.FM-Webservice verwenden will, benötigt zuallererst einen öffentlichen und einen dazugehörigen geheimen API-Schlüssel, den man hier beantragen kann. Da LastFmLib.Net eine Klassenbibliothek für das .NET-Framework ist, wird eine entsprechende Entwicklungsumgebung (z.B. Visual C# Express Edition) benötigt, um damit arbeiten zu können.

Hat man einen öffentlichen und einen geheimen API-Schlüssel (Key und Secret) erhalten, so muss man LastFmLib.Net diese beiden mitteilen. Dies geschieht, indem man das LastFmLib.API20.Settings.AuthData-Objekt neu setzt, in C# beispielsweise:

LastFmLib.General.MD5Hash key
    = new LastFmLib.General.MD5Hash("APIKey", true, Encoding.UTF8);
LastFmLib.General.MD5Hash secret
    = new LastFmLib.General.MD5Hash("APISecret", true, Encoding.UTF8);
LastFmLib.API20.Settings20.AuthData
    = new LastFmLib.API20.Types.AuthData(key, secret, null);

Hat man das nun erledigt, kann man (nach der Authentifizierung) auf die einzelnen API-Methoden zugreifen.

Allgemein: Request schicken

In LastFmLib.Net sind alle Anfragen an das API in Klassen gekapselt. Für jede Art von Anfrage (Request) erstellt man also ein entsprechendes Objekt, startet die Verarbeitung, überprüft ob die Anfrage erfolgreich war und verarbeitet das Ergebnis. Alle Requests befinden sich im Namespace LastFmLib.API20.<Art>, wobei <Art> die entsprechende Obergruppe einer Anfrage ist, z.B. “Auth”, “User”, “Playlists”, etc… Diese Obergruppen sieht man auf der API-Seite fettgedruckt in der Spalte links.

In C# würde das also so aussehen:

LastFmLib.API20.<Art>.<Irgendeine Request> req
    = new LastFmLib.API20.<Art>.<Irgendeine Request>(<notwendige Parameter>);
req.Start();
if (req.Succeeded) {
    // Mach etwas mit dem Ergebnis
} else {
    // Mach etwas mit dem Fehler (req.ErrorMessage)
}

Authentifizierung

Alles beginnt mit der Anmeldung des Users. Bei Last.FM geht dies in drei Schritten vonstatten:

  1. Holen des sog. “Tokens”, der sozusagen das Passwort für alle nun kommenden Anfragen darstellt und nur eine begrenzte Zeit gültig ist. Dies geschieht mit der API-Methode getToken():
    LastFmLib.API20.Auth.AuthGetToken req
        = new LastFmLib.API20.Auth.AuthGetToken();
    req.Start();
    if (req.Succeeded) {
        // Token speichern
        LastFmLib.API20.Settings20.AuthData.Token = req.Result;
    } else {
        // Mach etwas mit dem Fehler
    }
  2. Zulassung des Programms für den eigenen Last.FM-Account. Hierfür wird der Browser geöffnet, sodass der User sich einloggen und die entsprechende Berechtigung vergeben kann. LastFmLib.Net stellt hierfür auch gleich eine Funktion bereit (1.Parameter: Anwendung unterbrechen, 2. Parameter: Timeout):
    LastFmLib.API20.Settings.AuthData.AskUserToGrantPermissions(false, 0);
  3. Holen der Session-Informationen (Benutzername, Session-Key, Subscriber-Status) mit der Methode getSession(token). Achten Sie darauf, dass dieser Schritt auch wirklich erst nach der Bestätigung im Browser ausgeführt wird, ansonsten klappt das Holen der Informationen nämlich nicht.
    LastFmLib.API20.Auth.AuthGetSession sk =
        new LastFmLib.API20.Auth.AuthGetSession(LastFmLib.API20.Settings20.AuthData.Token, false);
    sk.Start();
    if (sk.Succeeded)
    {
        // Session speichern
        LastFmLib.API20.Settings20.AuthData.Session = sk.Result;
    }
    else {
        // Mach etwas mit dem Fehler
    }

Wenn diese drei Schritte erfolgreich ausgeführt wurden, kann man die eigentlichen Anfragen starten, immer nach dem oben genannten Muster.

Beispiel: Playlisten eines Users holen

LastFmLib.API20.User.UserGetPlaylists req =
    new LastFmLib.API20.User.UserGetPlaylists(LastFmLib.API20.Settings20.AuthData.Session.Username);
gp.Start();
if (gp.Succeeded)
{
    foreach (LastFmLib.API20.Types.SimplePlaylist pl in gp.Result) {
        // Playliste verarbeiten
    }
} else {
    // Mach etwas mit dem Fehler
}

Anmerkungen

Der Aktualität halber sollte man nicht die vorgefertigte DLL von der Website des Entwicklers laden, sondern die neuesten Quelldateien aus dem SVN-Verzeichnis, um daraus die letztendliche Bibliothek zu erstellen. Dies geht mithilfe von Subversion und dem Befehl:

svn co https://lastfmlibnet.svn.sourceforge.net/svnroot/lastfmlibnet lastfmlibnet

Eine entsprechende Dokumentation der Klassenbibliothek findet sich auch im SVN-Verzeichnis. Vor allem, wenn man keine Möglichkeit hat, über die Entwicklungsumgebung Informationen zu einzelnen Funktionen zu erhalten (Parametertypen/-anzahl, Rückgabetyp), sollte man sich darin vertiefen.

Mein Programm Lea (ab Version 1.2) ist dank LastFmLib.Net keine große Sache mehr, dafür (hoffentlich) um einiges stabiler und wartungsfreundlicher.

So, ich hoffe, dieses HowTo hat ein wenig geholfen. Weitere Informationen und natürlich auch Support gibt es auf der Website des Entwicklers.

Written by xsc

September 5th, 2008 at 5:38 pm

Posted in C#, Fundstücke, HowTo

Tagged with , , , ,

6 Responses to 'LastFmLib.Net'

Subscribe to comments with RSS or TrackBack to 'LastFmLib.Net'.

  1. Hi, ich versuche auch gerade ein wenig mit der LastFM- Bibliothek herum zu werkeln.
    Dabei habe ich mich gefragt, ob man auch eine ganze altmodische Authentifizierung des Users durchführen kann (mit Benutzername und Passwort).
    Also ohne den Browser zu starten und die Applikation für diese Session zuzulassen.

    Hoffe du kannst mir da weiterhelfen…

    Danke!

    Cryptonit

    12 Dez 08 at 09:53

  2. Ich weiß grad nicht, wie viel davon noch von Last.FM unterstütz wird, aber die entsprechenden Klassen und Methoden sind in LastFmLib noch enthalten. (Namespace: LastFmLib.API10)

    Soweit ich das sehe, muss man hierzu ein Objekt “LastFmLib.API10.TypeClasses.LastFmUser” erstellen, über das alle weiteren Operationen laufen. Die Dokumentation auf der LastFmLib-Website ist leider verschwunden…

    Viel weiter kann ich dir nicht helfen, da ich erst ab API 2.0 mit LastFM rumgespielt habe… Aber sag mir bescheid, wie deine Versuche ablaufen, evtl. mit funktionierendem Code, den ich dann in diesen Artikel hier einbauen kann…

    Yannick

    xsc

    12 Dez 08 at 15:09

  3. Hallo
    Danke erstmal für die Hilfe.

    Habe herausgefunden, dass es ganz einfach ist. Allerdings fehlen dann natürlich die API1.0- Funktionen und da man auf der last.fm – API- Seite eigentlich nur noch etwas über die API2.0 findet, ist das ein gewaltiger nachteil. Ich finde es schade, dass der Authentifikations- Mechanismus so geändert wurde, da es für den User umständlicher gemacht wurde…

    Kurz noch der Code:
    LastFmLib.API10.TypeClasses.LastFmUser user = new LastFmLib.API10.TypeClasses.LastFmUser(“username”, “password”, false, 0);
    LastFmClient client = new LastFmClient(user);
    HandshakeResult handshakeResult = client.Login();

    //So könnte man sich die PlayList holen:
    LastFmLib.RadioApi.RadioPlaylist playList = new LastFmLib.RadioApi.RadioPlaylist(handshakeResult.User.Api10SessionId);
    playList.Init();

    Noch ein schönes Wochenende…

    Cryptonit

    12 Dez 08 at 15:42

  4. Danke für den Code und die Information. Die andere Frage ist halt, wie lange Last.FM das API 1.0 überhaupt noch unterstützt…
    Und vielleicht sollte ich noch erwähnen, dass einige der API 2.0-Anfragen gar keine Authentifizierung benötigen. Hängt immer davon ab, was du vorhast^^

    Yannick

    xsc

    12 Dez 08 at 16:02

  5. Na ich möchte eigentlich schon auf User- Spezifische Sachen zugreifen (Beispielsweise PlayList). Von daher braucht es sicher eine Authentifizierung. Nur eben, eine Alternative wäre einfach besser…

    Cryptonit

    15 Dez 08 at 08:21

  6. You can now do everything with API 2.0, there’s some practical forms for auth process, too. In addition I recently took some time to create a quick start guide in the docs ;) Radio functions seem to work in LastFmLib.net, too. I also began coding a new/better PlaylistManager class for radio 2.0 API support in LastFmLib.net. The API 2.0 radio.tune and radio.fetchPlaylist() methods still work :)

    tburny

    6 Mai 09 at 19:55

Leave a Reply