Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Soundcloud API /stream endpoint giving 401 error

I'm trying to write a react native app which will stream some tracks from Soundcloud. As a test, I've been playing with the API using python, and I'm able to make requests to resolve the url, pull the playlists/tracks, and everything else I need.

With that said, when making a request to the stream_url of any given track, I get a 401 error.

The current url in question is: https://api.soundcloud.com/tracks/699691660/stream?client_id=PGBAyVqBYXvDBjeaz3kSsHAMnr1fndq1

I've tried it without the ?client_id..., I have tried replacing the ? with &, I've tried getting another client_id, I've tried it with allow_redirects as both true and false, but nothing seems to work. Any help would be greatly appreciated.

The streamable property of every track is True, so it shouldn't be a permissions issue.

Edit:

After doing a bit of research, I've found a semi-successful workaround. The /stream endpoint of the API is still not working, but if you change your destination endpoint to http://feeds.soundcloud.com/users/soundcloud:users:/sounds.rss, it'll give you an RSS feed that's (mostly) the same as what you'd get by using the tracks or playlists API endpoint.

The link contained therein can be streamed.

like image 548
Default Avatar asked Dec 02 '19 23:12

Default


People also ask

How do I access SoundCloud API?

To access the SoundCloud® API, you will first need to register your app at https://soundcloud.com/you/apps using your SoundCloud® account. When you've done that, we'll issue you with a client ID and client secret. Your client ID is required for all calls to the SoundCloud® API.

How do I get oauth tokens on SoundCloud?

You don't generate it on yourself, you get it from the SoundCloud API. You have first to authorize with your client_id, client_secret and a redirect_url then in the redirect_url (which the soundcloud server will call it should be some script on your server) you can get the token from the GET parameter "code".

How do I find my API client ID in SoundCloud?

Simply click any item in the list that isn't an image/base64 item (preferably something that begins with id?... ), then check the Request URL for a client_id . It's the simplest way to grab the ID; now that you know how, don't do anything illegal k thx.

What can the SoundCloud API do?

Our API gives you the ability to upload, manage and share tracks. Your app can take an audio file and upload it to a user's SoundCloud account. You can also manage metadata (including tags) or add the track to playlists.


2 Answers

Okay, I think I have found a generalized solution that will work for most people. I wish it were easier, but it's the simplest thing I've found yet.

  1. Use API to pull tracks from user. You can use linked_partitioning and the next_href property to gather everything because there's a maximum limit of 200 tracks per call.

  2. Using the data pulled down in the JSON, you can use the permalink_url key to get the same thing you would type into the browser.

  3. Make a request to the permalink_url and access the HTML. You'll need to do some parsing, but the url you'll want will be something to the effect of:

    "https://api-v2.soundcloud.com/media/soundcloud:tracks:488625309/c0d9b93d-4a34-4ccf-8e16-7a87cfaa9f79/stream/progressive"

    You could probably use a regex to parse this out simply.

  4. Make a request to this url adding ?client_id=... and it'll give you YET ANOTHER url in its return json.

  5. Using the url returned from the previous step, you can link directly to that in the browser, and it'll take you to your track content. I checked on VLC by inputting the link and it streams correctly.

Hopefully this helps some of you out with your developing.

like image 101
Default Avatar answered Sep 30 '22 19:09

Default


Since I have the same problem, the answer from @Default motivated me to look for a solution. But I did not understand the workaround with the permalink_url in the steps 2 and 3. The easier solution could be:

  1. Fetch for example user track likes using api-v2 endpoint like this:
https://api-v2.soundcloud.com/users/<user_id>/track_likes?client_id=<client_id>
  1. In the response we can finde the needed URL like mentioned from @Default in his answer:
collection: [
   {
      track: {
         media: {
            transcodings:[
                   ...
                  {
                     url: "https://api-v2.soundcloud.com/media/soundcloud:tracks:713339251/0ab1d60e-e417-4918-b10f-81d572b862dd/stream/progressive"
                  ...
                  }
               ]
            }

         }
...
]
  1. Make request to this URL with client_id as a query param and you get another URL with that you can stream/download the track

Note that the api-v2 is still not public and the request from your client probably will be blocked by CORS.

like image 30
Serg Avatar answered Sep 30 '22 18:09

Serg