nSpotify 1.0 | Einfach zu nutzende Spotify Api

    • Beta
    • Open Source

    Es gibt 43 Antworten in diesem Thema. Der letzte Beitrag () ist von niklas389.

      nSpotify 1.0 | Einfach zu nutzende Spotify Api



      Beschreibung
      nSpotify ist eine gut dokumentierte Api für den Abruf von Daten aus dem laufenden Spotify-Programm über den SpotifyWebHelper. Sie ist warscheinlich die am einfachsten zu nutzende ihrer Art.
      Der Sourcecode wird in Kürze auf GitHub einsehbar sein.

      Klassendiagramme
      Basis:

      Daten:

      Event-System:



      Beispiele
      Aktuell gespielten Song abrufen

      C#-Quellcode

      1. using nSpotify;
      2. Status status = Spotify.DataProviderInstance.UpdateStatus(); //Aktuelle Statusinformationen von Spotify abrufen
      3. MessageBox.Show("Gerade gespielt: " + status.Track.Name + " von " + status.Track.Artist);

      Meldung anzeigen, wenn Track gewechselt wird

      C#-Quellcode

      1. using nSpotify;
      2. public partial class Form2 : Form
      3. {
      4. public Form2()
      5. {
      6. InitializeComponent();
      7. eventProvider = new EventProvider(); //Keine weiteren Argumente nötig
      8. eventProvider.EventSynchronizingObject = this; //Damit wir nicht invoken müssen, wenn wir die Events handlen
      9. eventProvider.TrackChanged += eventProvider_TrackChanged; //EventHandler hinzufügen
      10. eventProvider.Start(); //Das Abrufen der Informationen durch den EventProvider starten
      11. }
      12. protected EventProvider eventProvider;
      13. private void eventProvider_TrackChanged(object sender, TrackChangedEventArgs e)
      14. {
      15. //Hier geben wir als Beispiel einfach mal eine kleine Nachricht aus
      16. MessageBox.Show("Der Track wurde gewechselt. Jetzt wird " + e.CurrentTrack.Name + " anstatt " + e.LastTrack.Name + " gespielt.");
      17. }
      18. }

      Testprojekt

      Der Code für dieses Beispiel ist unter den Downloads verfügbar ("Source und Testprojekt").


      Verwendete Programmiersprache und IDE
      C# in Verbindung mit dem .NET Framework 4.5
      Visual Studio 2013 Professional
      Die Dokumentation wurde unter anderem mithilfe von GhostDoc erstellt

      Verwendete Libraries
      Json.NET / NewtonSoft.Json | MIT License | Codeplex | NuGet

      In Planung
      Abruf von weiteren Daten zu Liedern, Alben und Künstlern
      Suche implementieren
      Abruf von Playlist-Informationen

      Lizenz
      MIT License | tl;dr Legal | Open Source Initiative
      Namensnennung wäre cool (z.B. "Dieses Projekt nutzt nSpotify von Stefan Baumann")

      Download
      nSpotify lässt sich am einfachsten über NuGet herunterladen. Dafür einfach in Visual Studio in der Paket-Manager-Konsole folgendes eingeben:

      Quellcode

      1. PM> Install-Package nSpotify

      Alternativ gibt es hier natürlich auch immer noch die Binaries zum selbst herunterladen:
      Version 1.0.2 Binaries
      Version 1.0 Binaries

      Den Sourcecode gibt es auf GitHub.

      Viel Spaß
      Stefan
      Dateien

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „nafets“ ()

      Sehr gut. Hab nichts weiter anzumerken :)
      Kann man vllt den Track ändern, eine Suche vornehmen etc?

      Grüße
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
      @Nikx :)
      Track ändern geht mit Spotify.SendPlayRequest("track") und Spotify.SendQueueRequest("track"). An der Suche arbeite ich noch, sie kommt im nächsten Update ;)

      @Fachkraftx3
      Versuch mal, es mit dem Windows Explorer anstatt WinRAR zu entpacken - damit geht es bei mir. Nur um sicher zu gehen, häng ich die DLLs nochmal hier an.
      Dateien
      • Newtonsoft.Json.dll

        (507,39 kB, 943 mal heruntergeladen, zuletzt: )
      • nSpotify.dll

        (24,58 kB, 853 mal heruntergeladen, zuletzt: )
      @Fachkraftx3
      Wüsste nicht, dass man das machen könnte. Du kannst aber ganz einfach ein Key-Event senden:
      Code

      C#-Quellcode

      1. [DllImport("user32")]
      2. private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
      3. private const int KEYEVENTF_EXTENDEDKEY = 0x1;
      4. private const int KEYEVENTF_KEYUP = 0x2;
      5. private const byte VK_MEDIA_NEXT_TRACK = 0xb0;
      6. private const byte VK_MEDIA_PREV_TRACK = 0xb1;
      7. private void button1_Click(object sender, EventArgs e)
      8. {
      9. //Next Track / Skip
      10. keybd_event(VK_MEDIA_NEXT_TRACK, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
      11. keybd_event(VK_MEDIA_NEXT_TRACK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      12. //Last Track / Return
      13. keybd_event(VK_MEDIA_PREV_TRACK, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
      14. keybd_event(VK_MEDIA_PREV_TRACK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      15. }

      VB.NET-Quellcode

      1. <DllImport("user32")> _
      2. Private Shared Sub keybd_event(bVk As Byte, bScan As Byte, dwFlags As UInteger, dwExtraInfo As Integer)
      3. End Sub
      4. Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1
      5. Private Const KEYEVENTF_KEYUP As Integer = &H2
      6. Private Const VK_MEDIA_NEXT_TRACK As Byte = &Hb0
      7. Private Const VK_MEDIA_PREV_TRACK As Byte = &Hb1
      8. Private Sub bBtton1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      9. 'Next Track / Skip
      10. keybd_event(VK_MEDIA_NEXT_TRACK, &H45, KEYEVENTF_EXTENDEDKEY, 0)
      11. keybd_event(VK_MEDIA_NEXT_TRACK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
      12. 'Last Track / Return
      13. keybd_event(VK_MEDIA_PREV_TRACK, &H45, KEYEVENTF_EXTENDEDKEY, 0)
      14. keybd_event(VK_MEDIA_PREV_TRACK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
      15. End Sub
      Okay danke :)
      Andere frage irgendwie will das bei mir nicht laden:
      "Ein Ausnahmefehler des Typs "System.TypeLoadException" ist in nSpotify.exe aufgetreten.

      Zusätzliche Informationen: Der Typ "nSpotify.Spotify" in der Assembly "nSpotify, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" konnte nicht geladen werden."
      @Fachkraftx3 (Auf den Post vorher bezogen)
      Ok, das ist schon komisch. Da bräuchte ich aber weitere Informationen, das könnte alles sein. Bei mir funktionieren das Testprojekt, welches ich veröffentlicht habe und ein eigenes Projekt ohne jegliche Probleme :S
      Tritt das denn bei meinem Testprojekt oder einem eigenen auf? Wenn ja, fände ich es super, wenn du es mir kurz senden könntest :
      @nafets:
      Nein, das tritt bei mir auf:

      Quellcode

      1. Ein Ausnahmefehler des Typs "System.IO.FileLoadException" ist in nSpotify.dll aufgetreten.
      2. Zusätzliche Informationen: Die Datei oder Assembly "Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" oder eine Abhängigkeit davon wurde nicht gefunden. Die gefundene Manifestdefinition der Assembly stimmt nicht mit dem Assemblyverweis überein. (Ausnahme von HRESULT: 0x80131040)
      Hast du die Newtonsoft.Json denn auch als Verweis hinzugefügt? Die wird für die Antworten auf die Requests benötigt, da die als JSON kommen. Es könnte eventuell damit zusammenhängen, dass ich die Library über NuGet beziehe - habe damit noch keine Erfahrungen.
      @Nikx
      Nur ein kleines Update: Hab mich an die Suche gesetzt - der Code ist ca. 1/3 fertig (einer von 3 Teilen ist fertig implementiert), dann muss ich nur noch alles dokumentieren, was erst morgen möglich sein wird. Ansonsten läuft es aber eigentlich ganz gut :)

      @slice
      Ich habe bisher nur mit JSON.NET gearbeitet und war halt einfach von Anfang an begeistert. Hingegen bei den Framework-Funktionen braucht es immer eine lange Einarbeitungszeit etc. Der liebe James Newton-King hat da halt eine (fast) perfekte Library gezaubert.
      Moin,

      sehe ich auch so. JSON.NET ist einfach schneller als das Framework-Zeugs und kann auch mehr, was einem hohe Flexiblität ermöglicht, weil man immer ein Feature hinzufügen kann.
      Ich nutze es auch, weil es z. B. beim JavaScriptSerializer bei größeren Datenmengen bei mir Probleme gab, damit nicht.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Also ich hatte bisher keine Probleme mit dem aus dem Framework, selbst bei größeren Datenmengen und das arbeiten damit ist m.M.n. sehr einfach. Datenmodell als Klassen abbilden und de-/serialisieren, fertig.

      Spoiler anzeigen

      Quellcode

      1. public static class Utilities
      2. {
      3. public static string ToJson<T>(this T source)
      4. {
      5. using (MemoryStream ms = new MemoryStream())
      6. {
      7. DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
      8. serializer.WriteObject(ms, source);
      9. ms.Position = 0;
      10. using (StreamReader sr = new StreamReader(ms, Encoding.UTF8))
      11. {
      12. return sr.ReadToEnd();
      13. }
      14. }
      15. }
      16. public static T ParseJson<T>(this string source)
      17. {
      18. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(source)))
      19. {
      20. DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T));
      21. return (T)deserializer.ReadObject(ms);
      22. }
      23. }
      24. }
      @slice
      Ich glaube ehrlich gesagt kaum, dass die Feldnamen im JSON-String und in der Klasse unterschiedlich sein können, dass man einzlene Member ausschließen oder auch Converter für die Felder erstellen kann. Und selbst wenn, werde ich dieses Projekt kaum umstellen - dafür bin ich einfach ein zu großer Fan von JSON.NET.

      Edit
      @slice
      Ok :)
      Vielleicht werde ich es mir in der Zukunft irgendwann mal ansehen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nafets“ ()

      Ich will es dir ja auch nicht aufzwingen o.ä. hatte mich nur gewundert und wollte wissen warum du diesen Weg gehst :)

      PS: Das mit den Feldnamen funktioniert mittels DataMember: Name, auch das ausschließen von Membern bzw. einbeziehen.