Skip to content

Instantly share code, notes, and snippets.

@dt
Created April 11, 2012 14:51
Show Gist options
  • Save dt/2359840 to your computer and use it in GitHub Desktop.
Save dt/2359840 to your computer and use it in GitHub Desktop.
playlist-based similar song finder
#!/usr/bin/env python
import sys, os, json
from rdioapi import Rdio
from collections import defaultdict
config_path = os.path.expanduser('~/.rdio-tool.json')
if os.path.exists(config_path):
config = json.load(file(config_path))
else:
sys.stderr.write('No config in ~/.rdio-tool.json. Get rdio-call to work.')
sys.exit(1)
batch_size = 5
batch_count = 6
if not config.has_key('consumer_key') or not config.has_key('consumer_secret'):
sys.stderr.write('Missing oauth data in config. Get rdio-call to work')
sys.exit(1)
rdio = Rdio(config['consumer_key'],
config['consumer_secret'],
config['auth_state'])
seed_key = 'p752107'
seed_list = rdio.call('get', keys = seed_key, extras = 'tracks')[seed_key]
seed_tracks = seed_list['tracks']
seed_keys = set(map(lambda x: x['key'], seed_tracks))
all_tracks = {}
print seed_list['name']
print
for seed_track in seed_tracks:
sys.stdout.write(seed_track['key'] + '\t' + seed_track['name'])
sys.stdout.flush()
playlists = []
for x in range(0, batch_count):
try :
batch = rdio.call('getPlaylistsContainingTrack',
track = seed_track['key'],
count = batch_size,
start = x * batch_size,
extras = 'tracks')
for i in batch:
playlists.append(i)
sys.stdout.write('.')
except :
sys.stdout.write('x')
sys.stdout.flush()
sys.stdout.write('\n\t\t')
sys.stdout.flush()
track_count = 0
for playlist in playlists:
if not playlist['key'] == seed_key:
for track in playlist['tracks']:
key = track['key']
if not key in seed_keys:
if not key in all_tracks:
all_tracks[key] = { 'count': 0, 'details': track }
all_tracks[key]['count'] += 1
track_count += 1
print str(len(playlists)) + " / " + str(track_count)
ranked = sorted(all_tracks.itervalues(), key = lambda x: x['count'], reverse = True)
print ranked[:10]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment