entriphy / sp-playcount-librespot

Modification of librespot-java to provide play count info from Spotify
Apache License 2.0
120 stars 18 forks source link

Unable to get playcounts Error 502 #28

Open phuketbinaryt opened 1 year ago

phuketbinaryt commented 1 year ago

Since today I am unable to get the playcounts for any track. Only getting the folling error:

xyz.gianlu.librespot.mercury.MercuryClient$MercuryException: status: 502 at xyz.gianlu.librespot.mercury.MercuryClient.sendSync(MercuryClient.java:83) at xyz.gianlu.librespot.handler.PlayCountHandler.handle(PlayCountHandler.java:57) at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77) at jdk.httpserver/sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:82) at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:80) at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:848) at jdk.httpserver/com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:77) at jdk.httpserver/sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:817) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)

Did something change on Spotify's side?

Rchrdlss3 commented 1 year ago

I recently have been unable to access playcounts aswell, but I am having the same issue as #11 although this has not happened before. I am assuming this might be something on Spotify's side too

jpgrovy commented 1 year ago

Same issue for me 😔

Seeing they have some outages on downdetector. Hopefully that’s all it is.

jpgrovy commented 1 year ago

I don’t see playcounts being returned even in Spotify’s own web anymore either. The counts always showed in the logs of the api call. Now they aren’t there.

surfmore commented 1 year ago

I am getting this error

{"success": false, "data": "An unknown error has occurred; logged to console"}

http://MYIPADDRESS:8080/albumPlayCount?albumid=XXXXXX

and this error in the console

2023-06-19 21:26:33,101 INFO ApResolver:66 - Loaded aps into pool: {accesspoint=[ap-gew4.spotify.com:4070, ap-gew4.spotify.com:443, ap-gew4.spotify.com:80, ap-guc3.spotify.com:4070, ap-gue1.spotify.com:443, ap-gew1.spotify.com:80], dealer=[gew4-dealer.spotify.com:443, guc3-dealer.spotify.com:443, gue1-dealer.spotify.com:443, gew1-dealer.spotify.com:443], spclient=[gew4-spclient.spotify.com:443, guc3-spclient.spotify.com:443, gue1-spclient.spotify.com:443, gew1-spclient.spotify.com:443]} 2023-06-19 21:26:33,366 INFO Session:94 - Created new session! {deviceId: c70f928698cc099e39bddfd469f7de38e3b805db, ap: ap-guc3.spotify.com:4070} 2023-06-19 21:26:34,351 INFO Session:223 - Connected successfully! 2023-06-19 21:26:34,647 INFO Session:242 - Authenticated as woklxlz1f9wkuu6j9fk3x6q54! 2023-06-19 21:26:34,647 INFO Session:716 - Skipping SecretBlock 2023-06-19 21:26:34,647 INFO Session:694 - Received LicenseVersion: 0 2023-06-19 21:26:34,647 INFO Session:684 - Received CountryCode: NL [main] INFO org.cache2k.core.Cache2kCoreProviderImpl - cache2k starting. version=1.2.4.Final 2023-06-19 21:26:34,694 INFO Session:716 - Skipping UnknownData_AllZeros 2023-06-19 21:26:34,694 INFO Session:716 - Skipping LegacyWelcome Listening on port 8080 2023-06-19 21:26:35,085 INFO Session:651 - Skipping unknown command {cmd: 0x75, payload: 000000} xyz.gianlu.librespot.mercury.MercuryClient$MercuryException: status: 502 at xyz.gianlu.librespot.mercury.MercuryClient.sendSync(MercuryClient.java:83) at xyz.gianlu.librespot.handler.PlayCountHandler.handle(PlayCountHandler.java:57) at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source) at sun.net.httpserver.AuthFilter.doFilter(Unknown Source) at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source) at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source) at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source) at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

surfmore commented 1 year ago

I recently have been unable to access playcounts aswell, but I am having the same issue as #11 although this has not happened before. I am assuming this might be something on Spotify's side too

This is related to the country of the account. Spotify seems to have changed the accounts to the country they were created. I changed back to the country where librespot is running, but didnt fix the problem. Now, it is happening with the error I just posted above.

jpgrovy commented 1 year ago

This issue is also only happening for the artistInfo and albumPlayCount end points . artistInsights still works.

christosk92 commented 1 year ago

I think Spotify finally killed support for this mercury endpoint. You can actually replicate all these calls over REST to the sp client. For example https://gae2-spclient.spotify.com/artist/v1/{artistId}/desktop currently returns 502 with response:

{
"error": {
"status": 502,
"message": "Request was not transferred"
}
}
jpgrovy commented 1 year ago

I hope not 😔 - I wonder if there is another way to retrieve playcounts then.

christosk92 commented 1 year ago

I hope not 😔 - I wonder if there is another way to retrieve playcounts then.

well you can always find the appropriate album of a track, and then fetch the album (using the graphql endpoint)

https://api-partner.spotify.com/pathfinder/v1/query?operationName=getAlbum&variables={"uri":"spotify:album:{id}","locale":"","offset":0,"limit":50}&extensions={"persistedQuery":{"version":1,"sha256Hash":"46ae954ef2d2fe7732b4b2b4022157b2e18b7ea84f70591ceb164e4de1b5d5d3

returns


{
"data":{
"albumUnion":{
"__typename":"Album",
"uri":"spotify:album:...",
"name":"...",
"artists":{
....
},
"coverArt":{
...
},
...
"label":"...",
"copyright":{...
},
"courtesyLine":"",
"saved":false,
"sharingInfo":{
"shareUrl":"",
"shareId":""
},
"tracks":{
"totalCount":1,
"items":[
{
"uid":"edda05c86f012f7409cc",
"track":{
"saved":false,
"uri":"spotify:track:...",
"name":"...",
"playcount":"50288750",
"discNumber":1,
"trackNumber":1,
"contentRating":{
"label":"NONE"
},
"relinkingInformation":null,
"duration":{
"totalMilliseconds":192497
},
"playability":{
"playable":true
},
"artists":{
....
}
}
}
]
},
"moreAlbumsByArtist":{
....
}
},
"extensions":{

} }

jpgrovy commented 1 year ago

I hope not 😔 - I wonder if there is another way to retrieve playcounts then.

well you can always find the appropriate album of a track, and then fetch the album (using the graphql endpoint)

https://api-partner.spotify.com/pathfinder/v1/query?operationName=getAlbum&variables={"uri":"spotify:album:{id}","locale":"","offset":0,"limit":50}&extensions={"persistedQuery":{"version":1,"sha256Hash":"46ae954ef2d2fe7732b4b2b4022157b2e18b7ea84f70591ceb164e4de1b5d5d3

returns

{
   "data":{
      "albumUnion":{
         "__typename":"Album",
         "uri":"spotify:album:...",
         "name":"...",
         "artists":{
            ....
         },
         "coverArt":{
         ...
         },
         ...
         "label":"...",
         "copyright":{...
         },
         "courtesyLine":"",
         "saved":false,
         "sharingInfo":{
            "shareUrl":"",
            "shareId":""
         },
         "tracks":{
            "totalCount":1,
            "items":[
               {
                  "uid":"edda05c86f012f7409cc",
                  "track":{
                     "saved":false,
                     "uri":"spotify:track:...",
                     "name":"...",
                     "playcount":"50288750",
                     "discNumber":1,
                     "trackNumber":1,
                     "contentRating":{
                        "label":"NONE"
                     },
                     "relinkingInformation":null,
                     "duration":{
                        "totalMilliseconds":192497
                     },
                     "playability":{
                        "playable":true
                     },
                     "artists":{
                       ....
                     }
                  }
               }
            ]
         },
         "moreAlbumsByArtist":{
        ....
      }
   },
   "extensions":{

   }
}

But is there a way using graph to get the complete list of Albums and Singles for an artistID?

christosk92 commented 1 year ago

@jpgrovy Yes but it's paged, which is really annoying. It's

https://api-partner.spotify.com/pathfinder/v1/query?operationName=queryArtistDiscographyAll&variables={"uri":"spotify:artist:{id}","offset":0,"limit":100}&extensions={"persistedQuery":{"version":1,"sha256Hash":"35a699e12a728c1a02f5bf67121a50f87341e65054e13126c03b7697fbd26692"}}

SatyF commented 1 year ago

How / where do you use this link? How does it replace the mercury call? If i simply check the link you share it tells "No token provided"

christosk92 commented 1 year ago

That would be for you to figure out :)

Hint: use the mercury client to get a bearer and then put it in the headers

SatyF commented 1 year ago

That won't be for me then I suppose, I always struggle to cope with clients/protocols, etc, I have no idea what your hint means tbh

christosk92 commented 1 year ago

Oh I thought you were a maintainer of this project.. Well first you'd need a bearer token to authenticate with this client. Since this is an internal API, you can't just fetch one using the official method (Spotify developer console), as that will result in an 403 (forbid).

This project I think has the ability to fetch a good token over mercury (hm://keymaster/token/authenticated?scope...), which can then be used to authenticate properly and fetch the resource I provided.

It would require quite some changes to the project, unfortunately I am not actively involved in this project so I wont do it. But the developer may of course.

jpgrovy commented 1 year ago

@jpgrovy Yes but it's paged, which is really annoying. It's

https://api-partner.spotify.com/pathfinder/v1/query?operationName=queryArtistDiscographyAll&variables={"uri":"spotify:artist:{id}","offset":0,"limit":100}&extensions={"persistedQuery":{"version":1,"sha256Hash":"35a699e12a728c1a02f5bf67121a50f87341e65054e13126c03b7697fbd26692"}}

I get “RBAC: Access Denied” when trying to make the api-partner calls.

Side note… anyone want to be awesome and fix the librespot playcount code? 🙏🙏🙏

entriphy commented 1 year ago

Yep, they most likely killed the endpoint: librespot-org/librespot-java#678

Since it seems like Spotify doesn't use Hermes in their clients anymore, I think the only way forward with this project is to use Spotify's private API, so this repo may be archived once I figure things out.

christosk92 commented 1 year ago

Well... hermes is just their internal router. As I mentioned earlier, all hermes endpoints can be translated to their HTTPs counterpart by just replacing hm:// with the spclient url.

I think hermes will still be supported, since a lot of their internal services may still use them. You can fetch an access token using : hm://keymaster/token/authenticated?scope=user-read-private,user-read-email,playlist-modify-public,ugc-image-upload,playlist-read-private,playlist-read-collaborative,playlist-read&client_id=65b708073fc0480ea92a077233ca87bd&device_id= Which you can then use to access the private api (partner + spclient) . The public (web api) endpoints also work

SatyF commented 1 year ago

Yep, they most likely killed the endpoint: librespot-org#678

Since it seems like Spotify doesn't use Hermes in their clients anymore, I think the only way forward with this project is to use Spotify's private API, so this repo may be archived once I figure things out.

To re-do this repo maybe the easiest is to restart from the last version of librespot-java and import the few playcount / artist info handlers into it as the former now manages the Web API, has a token provider with the keymaster and all. In a first step it wouldn't be needed to stripe the unneeded content or anything.

entriphy commented 1 year ago

Well... hermes is just their internal router. As I mentioned earlier, all hermes endpoints can be translated to their HTTPs counterpart by just replacing hm:// with the spclient url.

Ah, I haven't worked on this project in a while and forgot the terminology. I meant to say that their clients switched to using the GraphQL API for retrieving stuff like track play counts in an album. Since it seems that all endpoints that this project uses have become useless (albumPlayCount and artistInfo return status code 502, artistAbout and artistInsights just fills in 0 for all relevant values), the GraphQL API seems to be the only replacement for those endpoints. The access token for the GraphQL endpoints needed don't require Mercury or authentication either (the token can be retrieved through https://open.spotify.com/get_access_token?reason=transport&productType=web_player).

...which at that point I'd essentially be making a CORS proxy for the GraphQL API. Seems like a cheap solution, though the main issue is that the GraphQL API is quite terrible to work with, so I'd have to look into that further :p

christosk92 commented 1 year ago

Yes the graphql api is terrible to work with, and I do not understand why Spotify did not just build on the web-api, which has a good schema.

Anyways, I was also able to implement the oauth protocol using PKCE, and reverse engineer their persistent login mechanism. Which still uses the actual TCP connection some parts.

Mainly, after the oauth callback, you get an access token, which you can then use to authenticate using the old method (over TCP). Then in the APWelcome message, you have some re-usable credentials which are then posted in the body of https://login5.spotify.com/v3/login

In pseudo code this will look like

var webResponse = openBrowserAndCatchRedirectToken();
var accessToken = webResponse.accessToken;
var username = webResponse.username;

var credentials = new LoginCredentials
{
    Typ = AUTHENTICATION_SPOTIFY_TOKEN,
    Username = username,
    AuthData = ByteString.CopyFromUtf8(accessToken)
}
var apwelcome = performAuthOverTcp(credentials);

var reusablecredentials = apwelcome.reusable_auth_credentials;

Next in another login session: POST https://login5.spotify.com/v3/login the body is a protobuf with:

message LoginRequest {
    .spotify.login5.v3.ClientInfo client_info = 1;
    .spotify.login5.v3.credentials.StoredCredential stored_credential = 100;
}
jpgrovy commented 1 year ago

Yes the graphql api is terrible to work with, and I do not understand why Spotify did not just build on the web-api, which has a good schema.

Anyways, I was also able to implement the oauth protocol using PKCE, and reverse engineer their persistent login mechanism. Which still uses the actual TCP connection some parts.

Mainly, after the oauth callback, you get an access token, which you can then use to authenticate using the old method (over TCP). Then in the APWelcome message, you have some re-usable credentials which are then posted in the body of https://login5.spotify.com/v3/login

In pseudo code this will look like

var webResponse = openBrowserAndCatchRedirectToken();
var accessToken = webResponse.accessToken;
var username = webResponse.username;

var credentials = new LoginCredentials
{
    Typ = AUTHENTICATION_SPOTIFY_TOKEN,
    Username = username,
    AuthData = ByteString.CopyFromUtf8(accessToken)
}
var apwelcome = performAuthOverTcp(credentials);

var reusablecredentials = apwelcome.reusable_auth_credentials;

Next in another login session: POST https://login5.spotify.com/v3/login the body is a protobuf with:

message LoginRequest {
    .spotify.login5.v3.ClientInfo client_info = 1;
    .spotify.login5.v3.credentials.StoredCredential stored_credential = 100;
}

You guys are too smart for me 😉 … does this mean it’s fixable to get working again?

pdenis commented 1 year ago

Hey @christosk92 ,

Do you know a replacement of artistInsights with their graphql API especially for top 50 cities ?

I don't find one.

entriphy commented 1 year ago

queryArtistOverview seems to be the only endpoint for retrieving artist data, which does include the top 5 cities.

I'm currently testing sp-playcount on api.t4ils.dev: https://api.t4ils.dev/getArtist?id=1g8HCTiMwBtFtpRR9JXAZR (uses queryArtistOverview) https://api.t4ils.dev/getAlbum?id=5K4YFkTizFoMOyN5Khfp7G (uses getAlbum) https://api.t4ils.dev/getAlbumTracks?id=5K4YFkTizFoMOyN5Khfp7G (uses queryAlbumTracks)

louison commented 1 year ago

Hi @entriphy, How did you find the definition of the GQL query you document here ?

pdenis commented 1 year ago

@entriphy : yes it seems old top 50 is no longer available via graphq :/

christosk92 commented 1 year ago

@louison You can find those when looking in the source code of the webplayer. Those queries are then hashed to decrease request size.. Specifically, the web-player.{}.js file will be interesting. There's a line in the file:

 const t = await a.k.hash(e.body);

Which if you put a breakpoint there, you can expect the body

jpgrovy commented 1 year ago

Hey @christosk92 ,

Do you know a replacement of artistInsights with their graphql API especially for top 50 cities ?

I don't find one.

Artist Insights is showing Top 50 cities and still works

pdenis commented 1 year ago

Hey @christosk92 , Do you know a replacement of artistInsights with their graphql API especially for top 50 cities ? I don't find one.

Artist Insights is showing Top 50 cities and still works

Yes I know, but I anticipate

jpgrovy commented 1 year ago

Is anyone working on an update / fix ?

Temoigneur commented 1 year ago

queryArtistOverview seems to be the only endpoint for retrieving artist data, which does include the top 5 cities.

I'm currently testing sp-playcount on api.t4ils.dev: https://api.t4ils.dev/getArtist?id=1g8HCTiMwBtFtpRR9JXAZR (uses queryArtistOverview) https://api.t4ils.dev/getAlbum?id=5K4YFkTizFoMOyN5Khfp7G (uses getAlbum) https://api.t4ils.dev/getAlbumTracks?id=5K4YFkTizFoMOyN5Khfp7G (uses queryAlbumTracks)

Hi Entriphy, I'm not a programmer, so excuse my basic questions, and any misconceptions I have about how to implement a possible solution.. Your program is brilliant, btw. I see that the endpoints you're testing @ api.t4ils.dev return the raw .json data I need, (the track playcounts). With complete reliance on GPT-4, and a little help from a programmer-friend, I managed to create a search engine for personal/testing use which coordinates .js code of my own, (my .js/html is named "ISE_Updated" here: https://github.com/Temoigneur/Integrated_Search_Engine/tree/main) with your java program to retrieve individual track playcounts associated with a list of search results returned by the web-api, upon executing a search for musical content, (which incidentally runs four separate search engines simultaneously, via one central search bar). I recently updated the search function /w the /artistInsights endpt, to display a box beside the top three search results corresponding to 3 unique artists, that when clicked, showed the artist's monthly plays in the top five cities globally, as well as those of three Canadian cities that the artist was most popular in, (I'm in Canada). Although I managed to update the CORS handling in your java program to resolve issues with my localhost/ chrome configuration, and managed to update the version number when Spotify recently changed that, (https://github.com/Temoigneur/sp-playcount-librespot), I can see that attempting to reconfigure your entire program with next to zero understanding of what I'm doing, for Graphql, or to possibly retrieve what I need from new endpoints via api.t4ils.dev, would be a daunting task, and possibly an exercise in futility, (if that could even work at all). Is there any relatively straightforward way your program could be modified to use an alternate endpoint/method to obtain the play counts for individual tracks, that would work relatively seamlessly with my .js/html code via a fetch request to the updated java program/server, as before? Thank you!!

jpgrovy commented 1 year ago

I’m also anxiously waiting and hopeful of an update 🙏

entriphy commented 1 year ago

Does anyone have the JSON schema for all the old endpoints (the ones that this project uses) by any chance? I'm trying to make sp-playcount as backwards-compatible with this project's endpoints as possible, though since the old endpoints no longer work, I cannot do that unless someone has the JSON schema (or at the very least a sample response from each of the endpoints).

Temoigneur commented 1 year ago

Here's the /playCount endpt object data (partially expanded) as it appears in the chrome browser, unfortunately I didn't save any of the JSON data for the endpoints..

▼{success: true, data: {uri: "spotify:album:1ynyQdPQiXdYJNQEDL1S3d", name: "My Turn",…}} ▼data: {uri: "spotify:album:1ynyQdPQiXdYJNQEDL1S3d", name: "My Turn",…} ►additional: {releases: [{uri: "spotify:album:5UWwSyg5f75ZY87bUje6RA", name: "My Turn",…}]} ►artists: [{name: "Lil Baby", uri: "spotify:artist:5f7VJjfbwm532GiveGC0ZK"}] ►copyrights: ["© ℗ 2020 Quality Control Music, LLC, under exclusive license to UMG Recordings, Inc."] ►cover: {uri: " https://i.scdn.co/image/ab67616d00001e02f46a9ad551acbdab8f72fd89"} day: 28 ▼discs: [{number: 1, name: "", tracks: [,…]}] ▼ 0: {number: 1, name: "", tracks: [,-.]} name: "" number: 1 ▼ tracks: [,...] ▼1: {uri: "spotify:track:20Yz5dzjdTCVjXte9KrJbi", playcount: 37836909, name: "Get Ugly", popularity: 53,…} ►artists: [{name: "Lil Baby”, uri: "spotify:artist:5f7Vljfbwm532GiveGC0ZK",..}] duration: 155832 explicit: true name: "Get Ugly" number: 1 playable: true playcount: 37836909 popularity: 53 uri: "spotify:track:20Yz5dzjdTCVjXte9Krlbi" ►2:{uri: "spotify:track:7KSSdFCBHCfq4KPzz78ghk", playcount: 165765514, name: "Heatin Up (feat. Gunna)",…} ►3:{uri: "spotify:track:01JMnRUs2YOK6DDpdQASGY", playcount: 135812509, name: "Grace (feat. 42 Dugg)",…}

artists : [{name: "Lil Baby", uri: "spotify:artist:5f7VJjfbwm532GiveGC0ZK",…},…] duration : 177314 explicit : true name : "Heatin Up (feat. Gunna)" number : 2 playable : true playcount : 165765514 popularity : 70 uri : "spotify:track:7KSSdFCBHCfq4KPzz78ghk"

►1: {uri: "spotify:track:7KSSdFCBHCfq4KPzz78ghk", ►3: {uri: "spotify:track:2b7rt5gCEy2p2zTp656s4U",

label: "Quality month: 2 name: "My Turn" ►related: {releases: [{uri: "spotify:album:0FYvMdfTfYJxnJnKs1wDb0", name: "It's Only Me",…},…]} track_count: 20 type: "album" uri: "spotify:album:lynyQdPQiXdYJNQEDLlS3d" year: 2020 success: true

On Sun, Jun 25, 2023 at 8:25 PM triph @.***> wrote:

Does anyone have the JSON schema for all the old endpoints (the ones that this project uses) by any chance? I'm trying to make sp-playcount as backwards-compatible with this project's endpoints as possible, though since the old endpoints no longer work, I cannot do that unless someone has the JSON schema (or at the very least a sample response from each of the endpoints).

— Reply to this email directly, view it on GitHub https://github.com/entriphy/sp-playcount-librespot/issues/28#issuecomment-1606355940, or unsubscribe https://github.com/notifications/unsubscribe-auth/AE4Y5PHAHQ5JAIMHNVRJOC3XNDJH5ANCNFSM6AAAAAAZMFYZZE . You are receiving this because you commented.Message ID: @.***>

Temoigneur commented 1 year ago

Here's the /artistInsights endpt json, (which you probably already have:)

{"success": true, "data": {"artistGid":"ac4d229eb1194eac83fc53e94cb24164","name":"Lil Baby","mainImageUrl":"https://i.scdn.co/image/ab676161000051746cad3eff5adc29e20f189a6c","headerImage":{"id":"ab6761863e04a7eabaeb3b509e2181b5","uri":"https://i.scdn.co/image/ab67618600001016c1fb58154514c4af61de7e4a","width":2660,"height":1140},"autobiography":{"body":"Some artists define a genre, but Lil Baby defines a generation. The GRAMMY Award-winning rapper has smashed records, made history, and impacted the course of modern hip-hop with his instantly identifiable and inimitable style. He has garnered dozens of multi platinum certifications and tens of billions of streams as arguably the biggest new rapper to emerge this decade. Following the success of his platinum full-length debut Harder Than Ever in 2018, he seized #1 on the Billboard Top 200 with 2020’s My Turn, becoming “the year’s #1 selling and #1 streaming album in the US.” At first, it cemented him as “2020’s first and only artist to go double-platinum,” but it has since gone quadruple-platinum and has logged 85 weeks in the top 10 of the Top R&B/Hip-Hop Albums chart – marking the longest top-tier run in the chart’s history. \n \nHe notably tied Prince and Paul McCartney for Billboard Hot 100 hits and Taylor Swift for “most weeks atop the Billboard Top 200 in 2020” with a total of 6. Out of eight nominations, he scored his first GRAMMY® Award in 2022. He teamed up with Lil Durk for The Voice of the Heroes, marking his second #1 debut on the Billboard Top 200. It’s just the beginning though. Most recently, he released “Right On” and “In A Minute” which both songs debuted on Billboard’s Hot 100 chart. This feat puts Lil Baby in rare territory, making him the youngest of only 12 artists to have ever landed 100 or more songs on the Hot 100. \n","links":{"twitter":"https://twitter.com/lilbaby4pf","instagram":"https://instagram.com/lilbaby/"}},"biography":"Atlanta-bred rapper Lil Baby is charismatic, confident, and overwhelmingly popular on a worldwide level, consistently topping the charts with his rough-yet-accessible commercially geared sound. Following a series of mixtapes, his popularity exploded in 2018, the year he released his first proper album, Harder Than Ever (which included the <a href=\"spotify:artist:3TVXtAsR1Inumwj472S9r4\">Drake-featuring hit \"Yes Indeed\"), and Drip Harder (a collaborative mixtape with <a href=\"spotify:artist:2hlmm7s2ICUX0LVIhVFlZQ\">Gunna), both of which entered the Top Ten of the Billboard 200. He hit number one in 2020 with his second studio album, My Turn, and again the next year with The Voice of the Heroes, a collaborative studio effort with <a href=\"spotify:artist:3hcs9uc56yIGFCSy9leWe7\">Lil Durk. Lil Baby made a habit of dominating the charts, debuting in the top spot once more in 2022 with his third studio album, It's Only Me.\r\n\nLil Baby was born Dominique Jones in Atlanta in 1994. He grew up hanging with friends like <a href=\"spotify:artist:50co4Is1HCEo8bhOyUWKpn\">Young Thug, Coach K, and Pee, leaning more toward a life of petty crime and street hustling while his friends went on to thrive in the music industry. In 2015, at age 19, Lil Baby went to prison for two years for a probation violation. Upon his release in 2017, he jump-started his rap career with a mixtape called Perfect Timing, released in April of that year. The mixtape featured cameos from friends like <a href=\"spotify:artist:6icQOAFXDZKsumw3YXyusw\">Lil Yachty, <a href=\"spotify:artist:50co4Is1HCEo8bhOyUWKpn\">Young Thug, and <a href=\"spotify:artist:2hlmm7s2ICUX0LVIhVFlZQ\">Gunna, and strong production from <a href=\"spotify:artist:0jsba402qO37r9tiffkkUZ\">808 Mafia, <a href=\"spotify:artist:6IpnhdUI0JNSmk1w5hcBwq\">Brickz, and many others, highlighted by Lil Baby's woozy flows. The mixtape immediately brought the young rapper fame, in part due to his affiliations with friends in the <a href=\"spotify:search:label%3A%22Quality+Control%22\">Quality Control family of artists as well as the 4 Pockets Full clique. \r\n\nAs his mixtape attracted more listeners, Lil Baby worked constantly on new music, releasing singles like \"My Dawg\" and the <a href=\"spotify:artist:50co4Is1HCEo8bhOyUWKpn\">Young Thug collaboration \"Pink Slip\" in the summer of 2017. Other releases that year included Harder Than Hard, 2 the Hard Way (with <a href=\"spotify:artist:2qFmZcrhfzbppEdD6wibAy\">Marlo), and Too Hard. Lil Baby's debut studio album, Harder Than Ever, appeared in May

  1. Featuring guest appearances from <a href=\"spotify:artist:3TVXtAsR1Inumwj472S9r4\">Drake, <a href=\"spotify:artist:4DdkRBBYG6Yk9Ka8tdJ9BW\">Offset, <a href=\"spotify:artist:4O15NlyKLIASxsJ0PrXPfz\">Lil Uzi Vert, and others, the release entered the Billboard 200 album chart at number three. The rapper's success continued with Drip Harder, a collaborative mixtape with <a href=\"spotify:artist:2hlmm7s2ICUX0LVIhVFlZQ\">Gunna that was released that October and reached number four on the Billboard 200. Yet another mixtape, Street Gossip, appeared in November 2018. 2019 saw Lil Baby starring in the film How High 2 and releasing a handful of singles including the <a href=\"spotify:artist:1RyvyyTE3xzB2ZywiAwp0i\">Future collaboration \"Out the Mud.\" \r\n\nPreceded by \"Woah\" and \"Sum 2 Prove,\" his second studio album, My Turn, arrived in February 2020 and went straight to number one. Later that year, Lil Baby issued a pair of singles, \"On Me\" and \"Errbody.\" That June, he released \"The Bigger Picture,\" a protest song responding to police violence and systemic racism. The track entered the Billboard singles chart at number three and was nominated for two Grammys: Best Rap Song and Best Rap Performance. Lil Baby also performed the song live at the Grammy ceremonies that year. In March 2021, Lil Baby appeared as a featured artist on <a href=\"spotify:artist:3TVXtAsR1Inumwj472S9r4\">Drake's single \"Wants and Needs.\" The song debuted in the number two position on the Hot 100, making it Lil Baby's highest-charting track up to that point. In June of that year, Lil Baby teamed up with <a href=\"spotify:artist:3hcs9uc56yIGFCSy9leWe7\">Lil Durk for collaborative album The Voice of the Heroes. The project featured guest appearances from <a href=\"spotify:artist:45TgXXqMDdF8BkjA83OM7z\">Rod Wave, <a href=\"spotify:artist:20sxb77xiYeusSH8cVdatc\">Meek Mill, <a href=\"spotify:artist:50co4Is1HCEo8bhOyUWKpn\">Young Thug, and <a href=\"spotify:artist:0Y5tJX1MQlPlqiwlOH1tJY\">Travis Scott and debuted at number one. In early 2022, he paired with <a href=\"spotify:artist:0hCNtLu0JehylgoiP8L4Gh\">Nicki Minaj for the singles \"Do We Have a Problem?\" and \"Bussin.\" Lil Baby returned with new material of his own in October of 2022 with his third effort It's Only Me, which included appearances from <a href=\"spotify:artist:0Njy6yR9LykNKYg9yE23QN\">Nardo Wick, <a href=\"spotify:artist:50co4Is1HCEo8bhOyUWKpn\">Young Thug, <a href=\"spotify:artist:4FlG0V0jhLO4qGpayFOphj\">EST Gee, and several others, and debuted at number one on the Billboard charts. Lil Baby kicked off 2023 with the booming standalone cut \"Go Hard.\" ~ Fred Thomas","images":[{"id":"ab6772690000c46c8d138294c7bf364566df73b5","uri":"https://i.scdn.co/image/ab6772690000c46c8d138294c7bf364566df73b5","width":1000,"height":1000},{"id":"ab6772690000c46c851e636b224543fe715fa5d6","uri":"https://i.scdn.co/image/ab6772690000c46c851e636b224543fe715fa5d6","width":1000,"height":1000},{"id":"a4841becd710918d16d865ef491c5a8c744909e1","uri":"https://i.scdn.co/image/a4841becd710918d16d865ef491c5a8c744909e1","width":1000,"height":1000},{"id":"ca461d06c1cc5990cfcd38cfbe0b8ee0a6c129f9","uri":"https://i.scdn.co/image/ca461d06c1cc5990cfcd38cfbe0b8ee0a6c129f9","width":1000,"height":1000}],"imagesCount":4,"globalChartPosition":124,"monthlyListeners":31054795,"monthlyListenersDelta":-617970,"followerCount":14472610,"followingCount":0,"playlists":{"entries":[{"uri":"spotify:user:spotify:playlist:37i9dQZF1DX0XUsuxWHRQd","name":"RapCaviar","imageUrl":"https://i.scdn.co/image/ab67706f00000002bb14ca55249220436a5eff27","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DWTl4y3vgJOXW","name":"Locked In","imageUrl":"https://i.scdn.co/image/ab67706f00000002a6329f8bb3d28d5fba3c1ba3","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DWY4xHQp97fN6","name":"Get Turnt","imageUrl":"https://i.scdn.co/image/ab67706f00000002cf3547d303cd78dffb7e33a7","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DX7QOv5kjbU68","name":"This Is Drake","imageUrl":"https://i.scdn.co/image/ab67706f0000000287bff188c40608c48b82068f","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DX9oh43oAzkyx","name":"Beast Mode Hip-Hop","imageUrl":"https://i.scdn.co/image/ab67706f00000002d2d1cbd94520146a3fecc8fd","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DX76Wlfdnj7AP","name":"Beast Mode","imageUrl":"https://i.scdn.co/image/ab67706f00000002c771198277ecd33007dd2de4","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DWTyiBJ6yEqeu","name":"Top Gaming Tracks","imageUrl":"https://i.scdn.co/image/ab67706f00000002f8b3113ff97bf94e7c8f6354","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DWZixSclZdoFE","name":"Energy Booster: Hip-Hop","imageUrl":"https://i.scdn.co/image/ab67706f00000002632d90188a6aa3f43fbbbb91","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:spotify:playlist:37i9dQZF1DWWxPM4nWdhyI","name":"This Is Ed Sheeran","imageUrl":"https://i.scdn.co/image/ab67706f00000002d7c989820a3155855cc6da87","owner":{"name":"Spotify","uri":"spotify:user:spotify"},"listeners":0},{"uri":"spotify:user:playstation_music:playlist:4R7c9JN6J3jEaqw2sKiAZQ","name":"Street Fighter 6","imageUrl":"https://i.scdn.co/image/ab67706c0000da84c3cbc4ae0626ccfe912bb663","owner":{"name":"PlayStation®️","uri":"spotify:user:playstation_music"},"listeners":0}]},"cities":[{"country":"US","region":"CA","city":"Los Angeles","listeners":754834},{"country":"GB","region":"ENG","city":"London","listeners":681729},{"country":"US","region":"IL","city":"Chicago","listeners":649257},{"country":"US","region":"NY","city":"New York City","listeners":627575},{"country":"US","region":"TX","city":"Dallas","listeners":567428},{"country":"US","region":"GA","city":"Atlanta","listeners":553842},{"country":"CA","region":"ON","city":"Toronto","listeners":506912},{"country":"US","region":"TX","city":"Houston","listeners":468121},{"country":"US","region":"NC","city":"Charlotte","listeners":456881},{"country":"US","region":"MN","city":"Minneapolis","listeners":432101},{"country":"AU","region":"NSW","city":"Sydney","listeners":385972},{"country":"US","region":"OH","city":"Columbus","listeners":339162},{"country":"US","region":"WA","city":"Seattle","listeners":336622},{"country":"US","region":"NY","city":"Brooklyn","listeners":331066},{"country":"US","region":"CO","city":"Denver","listeners":311139},{"country":"AU","region":"VIC","city":"Melbourne","listeners":307266},{"country":"US","region":"FL","city":"Miami","listeners":292885},{"country":"US","region":"AZ","city":"Phoenix","listeners":289898},{"country":"US","region":"PA","city":"Philadelphia","listeners":283972},{"country":"CA","region":"QC","city":"Montreal","listeners":281282},{"country":"US","region":"DC","city":"Washington","listeners":263805},{"country":"US","region":"CA","city":"San Francisco","listeners":254741},{"country":"NL","region":"NH","city":"Amsterdam","listeners":243402},{"country":"US","region":"TX","city":"San Antonio","listeners":230723},{"country":"US","region":"IN","city":"Indianapolis","listeners":230280},{"country":"US","region":"CA","city":"Sacramento","listeners":227795},{"country":"US","region":"FL","city":"Orlando","listeners":224264},{"country":"AU","region":"QLD","city":"Brisbane","listeners":214243},{"country":"CA","region":"BC","city":"Vancouver","listeners":210404},{"country":"US","region":"MA","city":"Boston","listeners":208272},{"country":"US","region":"TN","city":"Nashville","listeners":208136},{"country":"US","region":"TX","city":"Austin","listeners":205429},{"country":"US","region":"MI","city":"Detroit","listeners":202675},{"country":"DE","region":"BE","city":"Berlin","listeners":199331},{"country":"US","region":"MD","city":"Baltimore","listeners":195206},{"country":"FR","region":"75","city":"Paris","listeners":191162},{"country":"NL","region":"ZH","city":"Rotterdam","listeners":186859},{"country":"US","region":"FL","city":"Tampa","listeners":183903},{"country":"GB","region":"BIR","city":"Birmingham","listeners":180973},{"country":"CA","region":"AB","city":"Calgary","listeners":180807},{"country":"DE","region":"HH","city":"Hamburg","listeners":172981},{"country":"BR","region":"SP","city":"São Paulo","listeners":172897},{"country":"GB","region":"WSM","city":"City of Westminster","listeners":171718},{"country":"US","region":"MO","city":"Kansas City","listeners":171160},{"country":"US","region":"CA","city":"San Diego","listeners":169905},{"country":"US","region":"NV","city":"Las Vegas","listeners":169444},{"country":"DE","region":"HE","city":"Frankfurt am Main","listeners":159124},{"country":"US","region":"MO","city":"St Louis","listeners":156548},{"country":"NG","region":"LA","city":"Lagos","listeners":154095},{"country":"CA","region":"ON","city":"Brampton","listeners":153478}]}}

On Sun, Jun 25, 2023 at 8:38 PM Bentley Humphries < @.***> wrote:

Here's the /playCount endpt object data (partially expanded) as it appears in the chrome browser, unfortunately I didn't save any of the JSON data for the endpoints..

▼{success: true, data: {uri: "spotify:album:1ynyQdPQiXdYJNQEDL1S3d", name: "My Turn",…}} ▼data: {uri: "spotify:album:1ynyQdPQiXdYJNQEDL1S3d", name: "My Turn",…} ►additional: {releases: [{uri: "spotify:album:5UWwSyg5f75ZY87bUje6RA", name: "My Turn",…}]} ►artists: [{name: "Lil Baby", uri: "spotify:artist:5f7VJjfbwm532GiveGC0ZK"}] ►copyrights: ["© ℗ 2020 Quality Control Music, LLC, under exclusive license to UMG Recordings, Inc."] ►cover: {uri: " https://i.scdn.co/image/ab67616d00001e02f46a9ad551acbdab8f72fd89"} day: 28 ▼discs: [{number: 1, name: "", tracks: [,…]}] ▼ 0: {number: 1, name: "", tracks: [,-.]} name: "" number: 1 ▼ tracks: [,...] ▼1: {uri: "spotify:track:20Yz5dzjdTCVjXte9KrJbi", playcount: 37836909, name: "Get Ugly", popularity: 53,…} ►artists: [{name: "Lil Baby”, uri: "spotify:artist:5f7Vljfbwm532GiveGC0ZK",..}] duration: 155832 explicit: true name: "Get Ugly" number: 1 playable: true playcount: 37836909 popularity: 53 uri: "spotify:track:20Yz5dzjdTCVjXte9Krlbi" ►2:{uri: "spotify:track:7KSSdFCBHCfq4KPzz78ghk", playcount: 165765514, name: "Heatin Up (feat. Gunna)",…} ►3:{uri: "spotify:track:01JMnRUs2YOK6DDpdQASGY", playcount: 135812509, name: "Grace (feat. 42 Dugg)",…}

artists : [{name: "Lil Baby", uri: "spotify:artist:5f7VJjfbwm532GiveGC0ZK",…},…] duration : 177314 explicit : true name : "Heatin Up (feat. Gunna)" number : 2 playable : true playcount : 165765514 popularity : 70 uri : "spotify:track:7KSSdFCBHCfq4KPzz78ghk"

►1: {uri: "spotify:track:7KSSdFCBHCfq4KPzz78ghk", ►3: {uri: "spotify:track:2b7rt5gCEy2p2zTp656s4U",

label: "Quality month: 2 name: "My Turn" ►related: {releases: [{uri: "spotify:album:0FYvMdfTfYJxnJnKs1wDb0", name: "It's Only Me",…},…]} track_count: 20 type: "album" uri: "spotify:album:lynyQdPQiXdYJNQEDLlS3d" year: 2020 success: true

On Sun, Jun 25, 2023 at 8:25 PM triph @.***> wrote:

Does anyone have the JSON schema for all the old endpoints (the ones that this project uses) by any chance? I'm trying to make sp-playcount as backwards-compatible with this project's endpoints as possible, though since the old endpoints no longer work, I cannot do that unless someone has the JSON schema (or at the very least a sample response from each of the endpoints).

— Reply to this email directly, view it on GitHub https://github.com/entriphy/sp-playcount-librespot/issues/28#issuecomment-1606355940, or unsubscribe https://github.com/notifications/unsubscribe-auth/AE4Y5PHAHQ5JAIMHNVRJOC3XNDJH5ANCNFSM6AAAAAAZMFYZZE . You are receiving this because you commented.Message ID: @.***>

jpgrovy commented 1 year ago

Does anyone have the JSON schema for all the old endpoints (the ones that this project uses) by any chance? I'm trying to make sp-playcount as backwards-compatible with this project's endpoints as possible, though since the old endpoints no longer work, I cannot do that unless someone has the JSON schema (or at the very least a sample response from each of the endpoints).

I have the entire schema of all the old endpoints. Do you have an email I can send to. The version I have is quite a large response.

SatyF commented 1 year ago

@jpgrovy Yes but it's paged, which is really annoying. It's

https://api-partner.spotify.com/pathfinder/v1/query?operationName=queryArtistDiscographyAll&variables={"uri":"spotify:artist:{id}","offset":0,"limit":100}&extensions={"persistedQuery":{"version":1,"sha256Hash":"35a699e12a728c1a02f5bf67121a50f87341e65054e13126c03b7697fbd26692"}}

Is there are description / sample available for this endpoint?

entriphy commented 1 year ago

I have the entire schema of all the old endpoints. Do you have an email I can send to. The version I have is quite a large response.

A GitHub Gist or Pastebin/Hastebin snippet should be fine :)

jpgrovy commented 1 year ago

queryArtistOverview seems to be the only endpoint for retrieving artist data, which does include the top 5 cities.

I'm currently testing sp-playcount on api.t4ils.dev: https://api.t4ils.dev/getArtist?id=1g8HCTiMwBtFtpRR9JXAZR (uses queryArtistOverview) https://api.t4ils.dev/getAlbum?id=5K4YFkTizFoMOyN5Khfp7G (uses getAlbum) https://api.t4ils.dev/getAlbumTracks?id=5K4YFkTizFoMOyN5Khfp7G (uses queryAlbumTracks)

How can we install this version on our own heroku, etc ?

Is there any way you can add the playcounts to the entire discography inside the getArtist call?

jpgrovy commented 1 year ago

queryArtistOverview seems to be the only endpoint for retrieving artist data, which does include the top 5 cities.

I'm currently testing sp-playcount on api.t4ils.dev: https://api.t4ils.dev/getArtist?id=1g8HCTiMwBtFtpRR9JXAZR (uses queryArtistOverview) https://api.t4ils.dev/getAlbum?id=5K4YFkTizFoMOyN5Khfp7G (uses getAlbum) https://api.t4ils.dev/getAlbumTracks?id=5K4YFkTizFoMOyN5Khfp7G (uses queryAlbumTracks)

Your links don’t work. How can we install this ourselves ?

jpgrovy commented 1 year ago

@entriphy What does it mean when is fails and says session is closed?

Temoigneur commented 1 year ago

Ahhhh.. your /getalbum endpt @ https://api.t4ils.dev/getAlbum?id= was working for weeks, now it's giving: {"success": false, "data": "Error while querying: Session is closed"} - will it be back up again?

katelynjean123 commented 1 year ago

Ahhhh.. your /getalbum endpt @ https://api.t4ils.dev/getAlbum?id= was working for weeks, now it's giving: {"success": false, "data": "Error while querying: Session is closed"} - will it be back up again?

also having this issue! it works some days and others it gives me this error code. Would love a fix :)

rishabhbizzle commented 1 year ago

Ahhhh.. your /getalbum endpt @ https://api.t4ils.dev/getAlbum?id= was working for weeks, now it's giving: {"success": false, "data": "Error while querying: Session is closed"} - will it be back up again?

The endpoint were working fine yesterday but today I'm also having this same issue :( @entriphy have you figured out this issue ??

Rchrdlss3 commented 1 year ago

https://api-partner.spotify.com/pathfinder/v1/query?operationName=queryArtistDiscographyAll&variables=

Was working for me fine perfectly this week, just ran into this issue this morning also

jpgrovy commented 1 year ago

Did they just cut off the top 50 cities now for the insights endpoint? The https://api.t4ils.dev test endpoint here is connecting but only top 5 cities is showing.

I had my own hosted version of this script and as of today it's giving "Bad Credentials" errors

Any one else have any experiences to report as of today ?

vitorbaptista commented 1 year ago

@entriphy Here are a sample of the results of all endpoints (they're about 3 years old): https://gist.github.com/vitorbaptista/577934720a554dd271ce5e2a92948174

Do you think it will be possible to update this project, or has Spotify effectively killed it?

surfmore commented 1 year ago

Yes. I am really interested to know if this will be updated. Thanks.

On Fri, Oct 20, 2023, 16:45 Vitor Baptista @.***> wrote:

@entriphy https://github.com/entriphy Here are a sample of the results of all endpoints: https://gist.github.com/vitorbaptista/577934720a554dd271ce5e2a92948174

Do you think it will be possible to update this project, or has Spotify effectively killed it?

— Reply to this email directly, view it on GitHub https://github.com/entriphy/sp-playcount-librespot/issues/28#issuecomment-1773308331, or unsubscribe https://github.com/notifications/unsubscribe-auth/AB5QR6TN5JVUDYJO5WUJ7STYALIG3AVCNFSM6AAAAAAZMFYZZGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTONZTGMYDQMZTGE . You are receiving this because you commented.Message ID: @.***>

caiocinel commented 1 year ago

I didn't find anything like I needed, so I made a prototype to get this information, if it's useful to anyone: https://github.com/caiocinel/SpotifyPrivateAPI

vitorbaptista commented 5 months ago

@entriphy Sorry for the interruption, but I'm trying to understand how your hosted page still has access to the playcount API, like https://api.t4ils.dev/albumPlayCount?albumid=32tRzmHVO5OxNv7IK36x24.

If I run this locally, I get the error 502. I tried creating a new Spotify account, in case it was because my account wasn't created in my country, but am still having the same error.

Are you running the same code from this repository?