I am working on a C# Wrapper that works with WPF, Silverlight and for
sure Windows Phone7,
and im going to use the nice REST opensource library hammock (http://
hammock.codeplex.com)
OAuth works...also the GET requests (/me, /me/tracks..) do work :)
but POST requests do not :(
in particular neither creating a new playlist nor uploading a new
track..
method "AddTrack" and "CreatePlaylist":
i always get a server Bad request...the correct Addfile, AddParameter,
AddHeader...thats the problem i think?
thanks for any help in advance!
=> email me if any anyone can help ...i could send a working
testclient for debugging purpose.
Thomas
-------------------------------------------------------------------------------------------------------------------
using System.Text;
using System.Xml.Linq;
using Hammock;
using Hammock.Authentication.OAuth;
using Hammock.Web;
public class SoundCloudAPI
{
internal static RestResponse GetRequestTokenQuery()
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
var request = new RestRequest { Path = "oauth/
request_token", Credentials =
OAuthCredentials.ForRequestToken(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret) };
return client.Request(request);
}
internal static RestResponse GetAccessTokenQuery(string
requestToken, string RequestTokenSecret, string oAuthVerificationPin)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
var request = new RestRequest { Path = "oauth/
access_token",
Credentials =
OAuthCredentials.ForAccessToken(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, requestToken, RequestTokenSecret,
oAuthVerificationPin) };
return client.Request(request);
}
internal static XElement GetMyTracks(string accessToken,
string accessTokenSecret)
{
return GetProtectedResource(accessToken,
accessTokenSecret, "me/tracks");
}
private static XElement GetProtectedResource(string
accessToken, string accessTokenSecret, string path)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
var request = new RestRequest { Path = path,
Credentials =
OAuthCredentials.ForProtectedResource(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, accessToken, accessTokenSecret) };
var response = client.Request(request);
var statusCode = response.StatusCode.ToString();
XElement tracks = XElement.Parse(response.Content);
return tracks;
}
internal static void AddTrack(string accessToken, string
accessTokenSecret)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
// ?? client.AddHeader("Content-Type", "multipart/form-
data");
var request = new RestRequest
{
Path = "tracks",
Method = WebMethod.Post,
Credentials =
OAuthCredentials.ForProtectedResource(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, accessToken, accessTokenSecret)
};
request.AddFile("name","fileName", @"C:\Users\Thomas\Music
\Soap and Skin - Spiracle.mp3");
var response = client.Request(request);
}
internal static XElement CreatePlaylist(string accessToken,
string accessTokenSecret)
{
var client = new RestClient { Authority = "http://
api.soundcloud.com", UserAgent = "Hammock" };
//?? client.AddHeader("Content-Type", "application/xml");
//?? client.AddHeader("Content-Type", "application/x-www-
form-urlencoded");
//?? client.AddHeader("Content-Type", "multipart/form-
data");
var request = new RestRequest
{
Path = "playlists",
Method = WebMethod.Post,
Credentials =
OAuthCredentials.ForProtectedResource(ClientSettings.consumerKey,
ClientSettings.consumerKeySecret, accessToken, accessTokenSecret)
};
var ByteData = Encoding.UTF8.GetBytes("<playlist>
<created-at type=\"datetime\">2008-07-22T13:28:59+02:00</created-
at> <title>My Set</title> <description>This is my set</
description> <shared-to> <emails type=\"array\">
<email> <address>
a.u...@example.com</address> </
email> </emails> </shared-to> <tracks type=\"array\">
<track> <id>14</id> </track> </tracks> </playlist>");
request.AddPostContent(ByteData);
// ?? request.AddField("title", "the title of the
playlist");
var response = client.Request(request);
var statusCode = response.StatusCode.ToString();
XElement tracks = XElement.Parse(response.Content);
return tracks;
}
}