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

后端 未结 3 1585
旧巷少年郎
旧巷少年郎 2020-12-30 13:22

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

相关标签:
3条回答
  • 2020-12-30 13:45

    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) {
                    ...
                }
    
    0 讨论(0)
  • 2020-12-30 13:55

    Here another way to get non expiring token and upload track to SoundCloud using C#:

    public class SoundCloudService : ISoundPlatformService
    {
        public SoundCloudService()
        {
            Errors=new List<string>();
        }
    
        private const string baseAddress = "https://api.soundcloud.com/";
    
        public IList<string> Errors { get; set; }
    
        public async Task<string> GetNonExpiringTokenAsync()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(baseAddress);
                var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("client_id","xxxxxx"),
                    new KeyValuePair<string, string>("client_secret","xxxxxx"),
                    new KeyValuePair<string, string>("grant_type","password"),
                    new KeyValuePair<string, string>("username","xx@xx.com"),
                    new KeyValuePair<string, string>("password","xxxxx"),
                    new KeyValuePair<string, string>("scope","non-expiring")
                });
    
                var response = await client.PostAsync("oauth2/token", content);
    
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    dynamic data = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync());
                    return data.access_token;
                }
    
                Errors.Add(string.Format("{0} {1}", response.StatusCode, response.ReasonPhrase));
    
                return null;
            }
        }        
    
        public async Task UploadTrackAsync(string filePath)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress=new Uri(baseAddress);
    
                var form = new MultipartFormDataContent(Guid.NewGuid().ToString());
    
                var contentTitle = new StringContent("Test");
                contentTitle.Headers.ContentType = null;
                form.Add(contentTitle, "track[title]");
    
                var contentSharing = new StringContent("private");
                contentSharing.Headers.ContentType = null;
                form.Add(contentSharing, "track[sharing]");
    
                var contentToken = new StringContent("xxxxx");
                contentToken.Headers.ContentType = null;
                form.Add(contentToken, "[oauth_token]");
    
                var contentFormat = new StringContent("json");
                contentFormat.Headers.ContentType = null;
                form.Add(contentFormat, "[format]");
    
                var contentFilename = new StringContent("test.mp3");
                contentFilename.Headers.ContentType = null;
                form.Add(contentFilename, "[Filename]");
    
                var contentUpload = new StringContent("Submit Query");
                contentUpload.Headers.ContentType = null;                                
                form.Add(contentUpload, "[Upload]");
    
                var contentTags = new StringContent("Test");
                contentTags.Headers.ContentType = null;
                form.Add(contentTags, "track[tag_list]");
    
                var bytes = File.ReadAllBytes(filePath);                
                var contentFile = new ByteArrayContent(bytes, 0, bytes.Count());                
                contentFile.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                form.Add(contentFile, "track[asset_data]", "test.mp3");
    
                var response = await client.PostAsync("tracks", form);                
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-30 14:01

    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)

    0 讨论(0)
提交回复
热议问题