Unofficial Python wrapper for Rdio's web services API. Complete with models for all Rdio objects and OAuth support.
Python Shell
Switch branches/tags
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.




Another Python library for accessing the Rdio API, using OAuth. Inspired by Rdio's own 'rdio-python' library and python-twitter. This is more or less a test of my own abilities, as I've been writing Django for a while, and I'd like to get into more Python-oriented development.

Function names and objects will follow Rdio's API specs for methods and object types as closely as possible, accounting for Python-ish function and property names (underscores and all that, instead of camelCase).


Don't sweat it. You can geek out and look at the source by cloning this git repo. But I doubt that's why you're here. Just do this!

pip install python-rdio

What's that? You're not using pip? Shame, shame. I guess you can do this, too.

easy_install python-rdio

Then, follow the usage example below. Please code responsibly. Everything is fully documented. That means you can use __doc__ on each method.



# Setup the API manager. If you have an ACCESS_KEY and ACCESS_SECRET for a
# particular user, you can pass that in as the third and forth arguments
# to Api().
import rdio
rdio_manager = rdio.Api(CONSUMER_KEY, CONSUMER_SECRET)
user = rdio_manager.find_user('')
print '%s %s's key is: %s.' % (user.first_name, user.last_name, user.key)

# Set authorization: get authorization URL, then pass back the PIN.
token_dict = rdio_manager.get_token_and_login_url()
print 'Authorize this application at: %s?oauth_token=%s' % (
    token_dict['login_url'], token_dict['oauth_token'])

token_secret = token_dict['oauth_token_secret']
oauth_verifier = raw_input('Enter the PIN / oAuth verifier: ').strip()
token = raw_input('Enter oauth_token parameter from URL: ').strip()
request_token = {"oauth_token":token, oauth_token_secret":token_secret}
authorization_dict = rdio_manager.authorize_with_verifier(oauth_verifier, request_token)

# Get back key and secret. rdio_manager is now authorized
# on the user's behalf.
print 'Access token key: %s' % authorization_dict['oauth_token']
print 'Access token secret: %s' % authorization_dict['oauth_token_secret']

# Make an authorized call.
current_user = rdio_manager.current_user()
print 'The full name of the current user is %s.' % (,)

# Have some fun.
search_object =
        query='Big Echo',
album = search_object.results[0]
print "Found album %s by %s." % (, album.artist_name,)
new_playlist = rdio_manager.create_playlist(
    description='A test playlist for the Rdio API.',
print "Just made playlist %s with %i tracks at %s! Has tracks: " % (,
tracks = rdio_manager.get(new_playlist.track_keys)
for t in tracks: print "%s (Duration: %i seconds)" % (, t.duration.seconds,)

Version history

Because you all care.

  • Version 0.6: Corrected a regular expression that refused four-character TLDs in emails.
  • Version 0.5: Fixed some bugs around the 0.4 release, including making user.last_song_played an actual RdioTrack. Also made duration a timedelta.
  • Version 0.4: Added object types for Rdio stations as documented here. Also added user lists for heavy rotation results.
  • Version 0.3: All calls implemented; most of them are working properly. Some minor tweaking may need to be done here and there, but a majority of the work is done. Also, setuptools!
  • Version 0.2: Supports PIN authorization through Rdio's oAuth implementation. Added current_user call.
  • Version 0.1: Initial release. Includes data models, unauthenticated API call logic, and one call.


I don't work for Rdio. I'm just a nerd who loves Rdio. If someone from Rdio has any sort of objections to this package, be it naming or whatever, please contact me at benjaminkreeger [at] gmail [dot] com and we can totally work it out.