使用C#.NET通过Soundcloud API连接和上载曲目

我正在尝试使用C#.NET将音轨上传到Soundcloud.com,但是在任何地方都没有任何.NET资源。 有人可以使用.NET发布链接或如何将音频文件上传到我的Soundcloud.com帐户的示例吗?

谢谢,阿曼

要使用soundcloud的REST API上传音频,您需要处理与HTTP POST相关的问题(RFC 1867)。 一般情况下,ASP.NET不支持使用POST发送多个文件/值,因此我建议您使用Krystalware库: http ://aspnetupload.com/Upload-File-POST-HttpWebRequest-WebClient-RFC-1867.aspx

之后,您需要将适当的表单字段发送到https://api.soundcloud.com/tracksurl:

  • 身份validation令牌(oauth_token)
  • 曲目标题(曲目[标题])
  • 文件(track [asset_data])

示例代码:

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(); } 

示例代码允许您从服务器上传音频文件(注意Server.MapPath方法以形成文件的路径)并以json格式获取响应(reader.ReadToEnd)

以下是通过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) { ... } 

这里是另一种使用C#获取非过期令牌并将轨道上传到SoundCloud的方法:

 public class SoundCloudService : ISoundPlatformService { public SoundCloudService() { Errors=new List(); } private const string baseAddress = "https://api.soundcloud.com/"; public IList Errors { get; set; } public async Task GetNonExpiringTokenAsync() { using (var client = new HttpClient()) { client.BaseAddress = new Uri(baseAddress); var content = new FormUrlEncodedContent(new[] { new KeyValuePair("client_id","xxxxxx"), new KeyValuePair("client_secret","xxxxxx"), new KeyValuePair("grant_type","password"), new KeyValuePair("username","xx@xx.com"), new KeyValuePair("password","xxxxx"), new KeyValuePair("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); } } }