Подключение и загрузка треков с помощью Soundcloud API с использованием C# .NET

Я пытаюсь загрузить звуковую дорожку на Soundcloud.com с помощью C#.NET, но нигде нет ресурсов для .NET. Может ли кто-нибудь опубликовать ссылку или пример того, как загрузить аудиофайл в мою учетную запись Soundcloud.com с помощью .NET?

Спасибо, Арман


person Arman Bimatov    schedule 09.08.2012    source источник


Ответы (3)


Чтобы загрузить аудио с помощью REST API Soundcloud, вам необходимо решить проблемы, связанные с HTTP POST (RFC 1867). В общем, ASP.NET не поддерживает отправку нескольких файлов/значений с помощью POST, поэтому я предлагаю вам использовать библиотеку Krystalware: http://aspnetupload.com/Upload-File-POST-HttpWebRequest-WebClient-RFC-1867.aspx

После этого вам необходимо отправить соответствующие поля формы на URL-адрес https://api.soundcloud.com/tracks:

  • Токен аутентификации (oauth_token)
  • Название трека (трек[название])
  • Файл (трек[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)

person agsqwe    schedule 09.08.2012
comment
где я могу получить этот oauth_token? Я добавил приложение в звуковое облако, но не знал, как сгенерировать oauth_token. - person Ali Issa; 03.11.2012

Вот фрагмент кода для загрузки трека через 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) {
                ...
            }
person Jeremy    schedule 11.10.2013

Вот еще один способ получить токен с неограниченным сроком действия и загрузить трек в SoundCloud с помощью С#:

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","[email protected]"),
                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);                
        }
    }
}
person Cisco Cabe    schedule 30.06.2015
comment
Где определяется ISoundPlatformService? - person Howiecamp; 30.12.2015
comment
Интерфейс ISoundPlatformService содержит только определение методов. Это пользовательский интерфейс, я имею в виду, что этот интерфейс не находится внутри dll Sound Cloud. Я определяю этот интерфейс для использования IoC. - person Cisco Cabe; 04.01.2016
comment
Ох, хорошо. Возможно, вы захотите удалить это из кода, просто чтобы сделать его проще и никто не задавался вопросом. - person Howiecamp; 07.01.2016