Soundcloud API is returning 403 on some tracks

2019-01-27 19:15发布

问题:

Soundclouds API is returning 403 on some tracks for me. I have tried playing with the raw http endpoints and also the soundcloud api wrapper for python, both have the issue.

https://api.soundcloud.com/tracks/251164884.json?client_id=CLIENT_ID

The above one returns a 403 error while below one works, using same CLIENT_ID obviously

https://api.soundcloud.com/tracks/197355235.json?client_id=CLIENT_ID

Using the library wrapper I get. requests.exceptions.HTTPError: 403 Client Error: Forbidden

    import soundcloud
    client = soundcloud.Client(client_id=CLIENT_ID)
    track = client.get('/resolve', url='https://soundcloud.com/mtarecords/my-nu-leng-flava-d-soul-shake') 

https://soundcloud.com/calyxteebee/nothing-left Another track that also doesn't resolve. Not all tracks have this issue, most work how they always have.

If you go to the Share -> Embed on Soundcloud the track_id will be in there, so I know I am using the correct track_id.

Viewing the http endpoints in browser I get the error.

Failed to load resource: the server responded with a status of 401 (Unauthorized) - https://api.soundcloud.com/favicon.ico

Anyone else run into this issue before?

回答1:

Using your two examples I get valid results for both

Example 1:

https://api.soundcloud.com/resolve?url=https://soundcloud.com/calyxteebee/nothing-left&client_id=CLIENT_ID

returns

https://api.soundcloud.com/tracks/251164884?client_id=CLIENT_ID

Example 2:

https://api.soundcloud.com/resolve?url=https://soundcloud.com/mtarecords/my-nu-leng-flava-d-soul-shake&client_id=CLIENT_ID

returns

https://api.soundcloud.com/tracks/249638630?client_id=CLIENT_ID



回答2:

using this url, working perfectly sir. Try this. :D

https://api.soundcloud.com/tracks/TRACK_ID/stream?client_id=CLIENT_ID


回答3:

I have been investigating this issue for some time now, and I discovered something which at least solves my situation, dunno if it will solve yours.

The Revelation: If you do a head request with curl (-I option) then it seems to always return with a 200/300 range response.

Why it works: I am streaming Soundcloud tracks with URLs like https://api.soundcloud.com/tracks/TRACK_ID/stream?client_id=CLIENT_ID in an iOS app using FreeStreamer. The stream was failing on exactly those tracks for which curl -v returned 403 for the tracks URL (it returns 401 for the stream URL). So to solve my situation, I perform a head request which gives 302 Found, extract the mp3 URL, and I use that to stream instead of the original URL.

I consider this a bug of the library (since it should be able to handle any 302) and I created an issue for it.