Spotiy - Alle Playlists eines Users auslesen

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von timi257.

    Spotiy - Alle Playlists eines Users auslesen

    Hey!
    Ich würde gerne alle Playlists eines Users bei Spotify auslesen. Die Spotify-Playlists haben ja eindeutige Kennungen, die auch in den Copy & Paste-Links zu finden sind:

    Quellcode

    1. spotify:user:94hanann:playlist:5dgkXeoCCSvnCqwo8tIcrp

    Hierbei wäre

    Quellcode

    1. 5dgkXeoCCSvnCqwo8tIcrp
    der Code, den ich gerne hätte. Am liebesten auch der Username, wobei dieser wohl das kleiner Problem darstellt.

    Woher ich diese Daten bekomme ist eigentlich egal, ob aus dem Internet oder von einer Lokalen Datei. Wichtig ist hierbei nur, dass mir nur der Username des Users bekannt ist, der diese Playlists abonniert hat. Außerdem kann man davon ausgehen, dass der User sich an dem PC, an dem ausgelesen werden soll, schonmal eingeloggt hat.

    Da die API diese Funktion aus Privatsphäre-Gründen leider nicht bietet weiß ich nicht genau, wie ich das anfangen soll.

    Darum habe ich zuerst versucht, die Playlists über die Playlist.bnk im Verzeichnis

    Quellcode

    1. C:\Users\Username\AppData\Roaming\Spotify\Users\Spotify-user
    auszulesen, da sie hier wohl alle enthalten sein sollen.

    Soweit so gut, doch beim auslesen mit RegEx wird mir nur ca. die Hälfte aller Playlists angezeigt. Am RegEx scheint es nicht zu liegen, sondern am einlesen.
    RegEx-Pattern

    VB.NET-Quellcode

    1. Dim hRegEx As New Regex("spotify:user:(?<user>([A-Za-z0-9]+)):playlist:(?<PlayID>([A-Za-z0-9]+))")

    Kann mir hierbei jemand helfen oder hat jemand einen einfacheren Weg, die Playlists auszulesen? :)

    Vielen Dank im Vorraus
    timi257
    Diese playlist.bnk ist vollgemüllt mit sehr vielen NICHT alphanumerischen Zeichen. Wenn ich deine Lösung nehmen würde, hätte ich, vor allem da ich keine Zeichenbegrenzung für "user" und "PlayID" habe, ewiglange Zeichenketten bekommen, die zwar an der richtigen Stelle beginnen, aber viel zu lange gehen. Zumindest sehe ich das so. Das alphanumerische scheint mir genauer.

    Hat jemand noch andere Anregungen? :/
    spotify:user:94hanann:playlist:5dgkXeoCCSvnCqwo8tIcrp

    Wenn der Link so aussieht, kannst du doch einfach nach ':' splitten.


    VB.NET-Quellcode

    1. Dim splitResult As String() = "spotify:user:94hanann:playlist:5dgkXeoCCSvnCqwo8tIcrp".Split(":"c)
    2. Dim user As String = splitResult(2)
    3. Dim id As String = splitResult(splitResult.Length -1)
    Das Problem ist, dass ich ja nicht nur die Links innerhalb der Datei habe, sondern auch ganz viel anderen "Müll".
    Hier zB. ein Ausschnitt:
    Spoiler anzeigen
    0000000021,0000000025,3174363467,0</version></base-version>
    1156645924x¶»±EQ˜—ãh¹Ç Ëx New Playlist 04.07.20127spotify:user:1156645924:playlist:0vxnXNRwkxFghTAeumXjIY
    1156645924 xcÂBiü8§59/Ý,,Y Mashups7spotify:user:1156645924:playlist:32f11DpYRI9IW7lEtwD52x
    1156645924 CxØîéÆró ͆•<]O} BK7spotify:user:1156645924:playlist:6BlwCWnADHba2b0GvEmyv3


    Bekommt ihr hieraus mit meinem RegEx-Pattern alle PlayIDs? :)

    (Ich bin gerade am überlegen, ob eine Lösung über Spotifys Web Player nicht doch simpler wäre. Das Problem ist, dass dieser keinen Internetexplorer unterstützt, was bedeutet, dass ein Login mit dem Webbrowserelement nicht möglich ist :( )
    Datei
    SPCO
    PlaylistCacheÚ Õ´±&$ ÿišaï?½ïV\-)R<base-version><version>0000000002,0000000001,1174537975,0</version></base-version>
    1156645924x $spotify:user:1156645924:purchaselist
    1156645924 x spotify:user:1156645924:inbox
    1156645924 x
    "spotify:user:1156645924:topfriends
    1156645924 x Éš®„+žc[™%a+QðÐæ,I²¯ë· †t ÎDÊ/}‡«P2f},}†})^>C˜£;Ò¬›!†y+¦D"spotify:user:timi257:maskedstarred+spotify:start-group:51db439b9fecaa37:iTunes-spotify:start-group:8899a9f4bbbc5c4:PlaylistsØîéÆró ͆•<]O}cÂBiü8§59/Ý,,YÊÕÌüRµ|PwëåAš}'ß“±oÜó˜PF7¿6¡·­®éã}´\•3y‰¬×­ß€Q½ŸþÁª¡!spotify:end-group:8899a9f4bbbc5c4"ÐÕLý&MÓ žà€fmëß2J‡3ÉP#MKû©^$÷zÓ6WOžÑ=dAkhÎ|€RÛ]Z~ɘu|ŽÚ›¦Ò=›0–X5ÉLiƒYù8Y¤DìÅ]màöÈ©œð¶»±EQ˜—ãh¹Ç Ëx"spotify:end-group:51db439b9fecaa379spotify:start-group:357dc0ca3171e0b7:Windows+Media+PlayerùsDúá{ñÂÞ¶Ž©"spotify:end-group:357dc0ca3171e0b7
    $ seen_at 1000x seen_at
    1358680898000x seen_at
    1357986673000x seen_at
    1353197186000x)R<base-version><version>0000000021,0000000025,3174363467,0</version></base-version>
    1156645924x¶»±EQ˜—ãh¹Ç Ëx New Playlist 04.07.20127spotify:user:1156645924:playlist:0vxnXNRwkxFghTAeumXjIY
    1156645924 xcÂBiü8§59/Ý,,Y Mashups7spotify:user:1156645924:playlist:32f11DpYRI9IW7lEtwD52x
    1156645924 CxØîéÆró ͆•<]O} BK7spotify:user:1156645924:playlist:6BlwCWnADHba2b0GvEmyv3
    1156645924 !x¤DìÅ]màöÈ©œð Neue Wiedergabeliste 37spotify:user:1156645924:playlist:0svYoMbTWLfohMtMdQkJjy
    1156645924 x¼|̨ɱ»ž8=
    È~n1ÿišaï?½ïV\-š®„+žc[™%a+QðÐæ,I²¯ë· †t ÎDÊ/}‡«P2f},}†})^>C˜£;Ò¬›!†y+¦D"spotify:user:timi257:maskedstarred)R<base-version><version>0000000011,0000000006,1300573807,0</version></base-version>
    1156645924xùsDúá{ñÂÞ¶Ž© test7spotify:user:1156645924:playlist:7AO38erGkVEwQl3ZO6dJuV
    1156645924 x›0–X5ÉLiƒYù8Y Neue Wiedergabeliste 27spotify:user:1156645924:playlist:4IPLfpyreQ1Mnq5NVN4r5D
    1156645924 xëß2J‡3ÉP#MKû©^$ #00-va-laughing_out_loud-ost_cd-20097spotify:user:1156645924:playlist:7b5cgKaXYcGFFAZkmYCiDq
    1156645924 x"ÐÕLý&MÓ žà€fm 00-cro--raop-de-2012-oma7spotify:user:1156645924:playlist:13HaV89TWQ7X8fyeUir4HH
    1156645924 xÊÕÌüRµ|PwëåAš Neue Wiedergabeliste7spotify:user:1156645924:playlist:6aK9Kusj76bsrsHluHfo02
    1156645924 x÷zÓ6WOžÑ=dAkhÎ| asdf7spotify:user:1156645924:playlist:7wZeD48ruPXFj0bprUNHis
    1156645924 x˜£;Ò¬›!†y+¦D 29.6.127spotify:user:1136655442:playlist:4E1qLs4TSzPMVvu1jV4cIs
    1136655442 4xÿišaï?½ïV\- Bspotify:user:1156645924:collectiontracklist:0N9hzEpFbtyFh8aIbLbSNl
    1156645924 ;x}'ß“±oÜó˜PF7¿ nice7spotify:user:1156645924:playlist:3Oagj8KGDaabDfbwfu2dH9
    1156645924 x¬×­ß€Q½ŸþÁª¡ YAY7spotify:user:1156645924:playlist:5g9a7QqPd28TRDO2JOrCVj
    1156645924 xš®„+žc[™%a+QðÐæ Top 407spotify:user:1156645924:playlist:4HSzuMpKxglerFeCnZFB4O
    1156645924 x,I²¯ë· †t ÎDÊ/}‡ imagine dragons7spotify:user:1156645924:playlist:1lzlergc4rfd7L87KKqdSL
    1156645924
    x€RÛ]Z~ɘu|ŽÚ›¦Ò=
    Internettitel7spotify:user:1156645924:playlist:3U8SMpadFZbIZ5YNCcu1kh
    1156645924 x«P2f},}†})^>C Tomorrowland 20135spotify:user:94hanann:playlist:5dgkXeoCCSvnCqwo8tIcrp94hanann û¹ üx6¡·­®éã}´\•3y‰ Nice_17spotify:user:1156645924:playlist:1EXdYWwGWhz6to1n64dTXb
    1156645924 x spotify:user:timi257:starredtimi257
    1156645924xx


    Wie gesagt, ich habe es gestern nicht hinbekommen, ALLE IDs auslesen zu können :/

    Edit:
    Eine Idee, wie ich auf den Quelltext des WebPlayers zugreifen könnte, wäre noch schöner! ;)
    Hier sind die Playlists alle schön mit eigener ID im html-Code aufgelistet. Allerdings schaffe ich es, wie gesagt, nicht an den Quellcode zu kommen, da weder Gecko noch der normale Webbrowser unterstützt werden. Gibt es eine andere Möglichkeit, z.B. den Quellcode vom Firefox auszulesen, o.ä.?

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

    Verstehst du C# Code? Wenn nicht jag es durch einen Übersetzer, ich habs mal fix mit einer Konsole gemacht, in der List Of String sind alle Playlist links.



    C-Quellcode

    1. static void Main(string[] args)
    2. {
    3. var fileContent = File.ReadAllText("TextFile1.txt"); // Spotify Content
    4. foreach (var playlist in ExtractPlaylists(fileContent))
    5. {
    6. Console.WriteLine(playlist);
    7. }
    8. Console.WriteLine("Press any key to exit");
    9. Console.ReadLine();
    10. }
    11. private static List<string> ExtractPlaylists(string fileContent)
    12. {
    13. var list = new List<string>();
    14. var lines = fileContent.Split(new[] {Environment.NewLine}, StringSplitOptions.None);
    15. foreach (var line in lines)
    16. {
    17. if ((line.Contains(":playlist:")) & (line.Contains("spotify:user:")))
    18. {
    19. var cleanedLine = line.Substring(line.LastIndexOf("spotify:user:"),
    20. line.Length - line.LastIndexOf("spotify:user:") - 1);
    21. list.Add(cleanedLine);
    22. }
    23. }
    24. return list;
    25. }
    So matcht es fast alles richtig:

    VB.NET-Quellcode

    1. Private Sub HighlightSpotifyLinks() Handles Button1.Click
    2. Dim i = RichTextBox1.SelectionStart
    3. RichTextBox1.SelectAll()
    4. RichTextBox1.SelectionColor = Color.LightGray
    5. For Each m As Match In Regex.Matches(RichTextBox1.Text, "spotify:user:(?<user>(.*)):playlist:(?<PlayID>([a-zA-Z0-9]*))") '(?=$|:|\s)
    6. RichTextBox1.Select(m.Index, m.Length)
    7. RichTextBox1.SelectionColor = Color.Black
    8. Next
    9. RichTextBox1.Select(i, 0)
    10. End Sub
    Vielen Dank!!! :)
    Aber Hm.. Was genau ist denn daran falsch?
    Könntest du mir das noch sagen:


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim fileContent = File.ReadAllText("C:\Users\LK\AppData\Roaming\Spotify\Users\1156645924-user\playlist.bnk")
    3. ' Spotify Content
    4. For Each playlist In ExtractPlaylists(fileContent)
    5. Console.WriteLine(playlist)
    6. Next
    7. Console.WriteLine("Press any key to exit")
    8. Console.ReadLine()
    9. End Sub
    10. Private Function ExtractPlaylists(fileContent As String) As List(Of String)
    11. Dim list = New List(Of String)()
    12. Dim lines = fileContent.Split({Environment.NewLine}, StringSplitOptions.None)
    13. For Each line In lines
    14. If (line.Contains(":playlist:")) And (line.Contains("spotify:user:")) Then
    15. Dim cleanedLine = line.Substring(line.LastIndexOf("spotify:user:"), line.Length - line.LastIndexOf("spotify:user:") - 1)
    16. list.Add(cleanedLine)
    17. End If
    18. Next
    19. Return list
    20. End Function
    Oh. Hat sich erledigt.
    Ich habe, statt den Code zu nehmen, den ich dir gesendet habe, direkt aus der playlist.bnk ausgelesen.
    Und hierbei kam dann nur Schmarn raus..
    Wenn ich die .bnk im Editor öffne, den Text rauskopiere und in einer .txt speichere funktioniert es.

    Es scheint also einen Unterschied darzustellen, ob ich die .bnk direkt per ReadAllText einlese oder ob ich dies mit dem Editor mache.

    Woran könnte das denn liegen? ;)
    Ich werde es mir mal anschauen.

    Ist alles ein bisschen komisch. Hier habe ich 2 Playlist.bnks von 2 unterschiedlichen Accounts:
    (siehe Dateianhang)

    Man sieht ja eindeutig, dass die Beiden sich von der Struktur her unterscheiden. Für Anhangnr. 2 funktioniert der bisherige Code super. (Wie ich einlese ist dabei irrelevant)

    Für den 1. Anhang spuckt der Code keine sinnvollen Ergebnisse aus.
    Die unterschiedliche Struktur verwirrt mich sehr stark im Moment.. ^^
    Dateien
    • playlist1.bnk.txt

      (13,29 kB, 118 mal heruntergeladen, zuletzt: )
    • playlist2.bnk.txt

      (3,67 kB, 139 mal heruntergeladen, zuletzt: )
    Ja, das hab ich aus gesehen jetzt.. Fragt sich, woher die Zeilen beim einen kommen und beim anderen nicht..

    Wie mache ichs denn am besten, wenn ich eine Zeile habe? Den ersten ermitteln, seine Position auslesen, alles bis dorthin löschen und wieder von vorne anfangen? Oder was wäre da das beste?