Getting started

Required Gems

Installation

First install all the missing required gems. To install the jwagener-oauth-active-resource gem you can use:
$ sudo gem install jwagener-oauth-active-resource -s http://gems.github.com
Then install the soundcloud api wrapper gem:
$ sudo gem install soundcloud-ruby-api-wrapper -s http://gems.github.com

Setup OAuth things

Look at http://wiki.github.com/soundcloud/api/oauth-example to find out, how you setup your OAuth things.

First steps

Let's start with a simple app. It will find and display the 10 hottest tracks of alltime. You don't need any OAuth authentication to do this.
require 'rubygems'
gem 'soundcloud-ruby-api-wrapper'
require 'soundcloud'

# Create an anonymous soundcloud client
# if you prefer to work with sandbox-soundcloud.com, replace this with:
# sc_client = Soundcloud.register({:site => "http://api.sandbox-soundcloud.com"})
sc_client = Soundcloud.register

# Find the 10 hottest tracks
hot_tracks = sc_client.Track.find(:all,:params => {:order => 'hotness', :limit => 10})

# and display their titles
p '==the 10 hottest tracks=='
hot_tracks.each do |track|
  p track.title
end
To test authentication you can use this small app, which will dispay the name of the logged in user.
require 'rubygems'
gem 'soundcloud-ruby-api-wrapper'
require 'soundcloud'

gem 'oauth'
require 'oauth'


# Create a Soundcloud OAuth consumer token object
sc_consumer = Soundcloud.consumer('YOUR_APPLICATION_CONSUMER_TOKEN','YOUR_APPLICATION_CONSUMER_SECRET')

# Create an OAuth access token object
access_token = OAuth::AccessToken.new(sc_consumer, 'YOUR_OAUTH_ACCESS_TOKEN', 'YOUR_OAUTH_ACCESS_SECRET')

# Create an authenticated Soundcloud client, based on the access token
sc_client = Soundcloud.register({:access_token => access_token})

# Get the logged in user 
my_user = sc_client.User.find_me

# Display his full name
p "Hello, my name is #{my_user.full_name}"

Find more examples in these pages: [[Model Events]], [[Model Users]], [[Model Tracks]], [[Model Playlists]], [[Model Comments]].

Sub-resources

The Soundcloud API provides 3 different types of sub-resources:

Nested sub-resources

These are directly embedded in the resource. For example a playlist has a track array.
playlist.tracks
When saving the original resource, the nested array will be saved as well.
playlist.tracks << some_track
playlist.save

Separate sub-resources

These are separated from the original resource. Example: A Track has the path "/tracks/[TRACK ID]" This track has a collection of users, which have access to this track, called permissions. These can be accessed via the path "/tracks/[TRACK ID]/permission". In ruby they are accessed like nested resources:
playlist.permissions
But have to be saved explicitly:
playlist.permissions << some_user
playlist.permissions.save
playlist.save
A lot of these collections are partials, that means Soundcloud API will not return more than 50 items per request. For example the user famous_dj has 120 fans/followers. famous_dj.fans will only return 50 fans. To get all fans you have to do something like this:
fans = []
limit = 50
begin 
  some_fans = famous_dj.fans({:offset => fans.count, :limit => limit})
  fans += some_fans
end while some_fans.count >= limit
The array fans now contains all fans/followers of famous_dj.

'Single changeable' separate sub-resources

Some separate collections can't be saved in a bulk request. Instead each item has to be added or removed explicitly. For now this only affects the contacts (followees) and favorites of a user. To add a track to the logged-in users favorites:
track.add_favorite!
Remove:
track.remove_favorite!
Check:
track.is_favorite? => true or false
The same works with the contacts of the logged-in user:
another_user.add_contact!
another_user.remove_contact!
another_user.is_contact? => true or false
You can also check if another users follows some user or has a specific favorite:
user.has_contact?(some_user) => true of false 
user.has_favorite?(some_track) => true or false