Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Connecting to and uploading tracks with Soundcloud API using C# .NET

I'm trying to upload an audio track to the Soundcloud.com using C#.NET, but there aren't any resources for .NET anywhere. Could someone post a link or an example of how to upload an audio file to my Soundcloud.com account using .NET?

Thank you, Arman

like image 706
Arman Bimatov Avatar asked Aug 09 '12 21:08

Arman Bimatov


People also ask

How do I use 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 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". Then in the next step you can exchange the code for an access token.


2 Answers

To upload an audio using soundcloud's REST API you need to take care of HTTP POST related issues (RFC 1867). In general, ASP.NET does not support sending of multiple files/values using POST, so I suggest you to use Krystalware library: http://aspnetupload.com/Upload-File-POST-HttpWebRequest-WebClient-RFC-1867.aspx

After that you need to send proper form fields to the https://api.soundcloud.com/tracks url:

  • Auth token (oauth_token)
  • Track Title (track[title])
  • The file (track[asset_data])

Sample code:

using Krystalware.UploadHelper;
...

System.Net.ServicePointManager.Expect100Continue = false;
var request = WebRequest.Create("https://api.soundcloud.com/tracks") as HttpWebRequest;
//some default headers
request.Accept = "*/*";
request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
request.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
request.Headers.Add("Accept-Language", "en-US,en;q=0.8,ru;q=0.6");

//file array
var files = new UploadFile[] { 
    new UploadFile(Server.MapPath("Downloads//0.mp3"), "track[asset_data]", "application/octet-stream") 
};
//other form data
var form = new NameValueCollection();
form.Add("track[title]", "Some title");
form.Add("track[sharing]", "private");
form.Add("oauth_token", this.Token);
form.Add("format", "json");

form.Add("Filename", "0.mp3");
form.Add("Upload", "Submit Query");
try
{
    using (var response = HttpUploadHelper.Upload(request, files, form))
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            lblInfo.Text = reader.ReadToEnd();
        }
    }
}
catch (Exception ex)
{
    lblInfo.Text = ex.ToString();
}

The example code allows you to upload an audio file from the server (notice the Server.MapPath method to form path to the file) and to get a response in json format (reader.ReadToEnd)

like image 191
agsqwe Avatar answered Sep 20 '22 05:09

agsqwe


Here is a code snippet to upload track via the SoundCloud API =>

        using (HttpClient httpClient = new HttpClient()) {
            httpClient.DefaultRequestHeaders.ConnectionClose = true;
            httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MySoundCloudClient", "1.0"));
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("OAuth", "MY_AUTH_TOKEN");
            ByteArrayContent titleContent = new ByteArrayContent(Encoding.UTF8.GetBytes("my title"));
            ByteArrayContent sharingContent = new ByteArrayContent(Encoding.UTF8.GetBytes("private"));
            ByteArrayContent byteArrayContent = new ByteArrayContent(File.ReadAllBytes("MYFILENAME"));
            byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            MultipartFormDataContent content = new MultipartFormDataContent();
            content.Add(titleContent, "track[title]");
            content.Add(sharingContent, "track[sharing]");
            content.Add(byteArrayContent, "track[asset_data]", "MYFILENAME");
            HttpResponseMessage message = await httpClient.PostAsync(new Uri("https://api.soundcloud.com/tracks"), content);

            if (message.IsSuccessStatusCode) {
                ...
            }
like image 43
Jeremy Avatar answered Sep 22 '22 05:09

Jeremy