Skip to content

Instantly share code, notes, and snippets.

@ramjoshi
Created March 5, 2014 05:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ramjoshi/9361902 to your computer and use it in GitHub Desktop.
Save ramjoshi/9361902 to your computer and use it in GitHub Desktop.
Python script to get the top 100 songs scrobbled on Last.fm in all the metros in U.S and associated stats and track info.
#Fetches the top 100 songs scrobbled in all the metros in U.S and associated stats and track info.
import urllib
import urllib2
from lxml import etree
import os
try:
import cpickle as pickle
except:
import pickle
lastfm_apikey = '' # use your own api key here
lastfm_url = 'http://ws.audioscrobbler.com/2.0'
method_metros = 'geo.getMetros'
method_toptracks = 'geo.gettoptracks'
method_trackinfo = 'track.getInfo'
def call_lastfm(method, **kwargs):
data = {}
data['method'] = method
data['api_key'] = lastfm_apikey
for key in kwargs:
data[key] = kwargs[key]
values = urllib.urlencode(data)
url = lastfm_url + '?' + values
print url
response = urllib2.urlopen(url);
return etree.fromstring(response.read())
def get_data():
with open('laststats.csv', 'w') as f:
us = 'united states'
f.write('city,artist,track,listeners,playcount')
metros = call_lastfm(method_metros, country=us)
musicd = None
pfile = 'musicd.p'
if os.path.isfile(pfile):
musicd = pickle.load(open(pfile, 'rb'))
else:
musicd = {}
for metro in metros.iter('metro'):
city = metro.find('name').text
toptracks = call_lastfm(method_toptracks, country=us, location=city, limit=100)
for track in toptracks.iter('track'):
artist = track.find('artist').find('name').text.encode('utf-8')
name = track.find('name').text.encode('utf-8')
key = '%s-%s' % (artist, name)
listeners = None
playcount = None
if key in musicd:
listeners, playcount = musicd[key]
else:
info = call_lastfm(method_trackinfo, artist=artist, track=name)
listeners = info.find('track').find('listeners').text
playcount = info.find('track').find('playcount').text
musicd[key] = (listeners, playcount)
f.write('\n%s,%s,%s,%s,%s' % (city, artist, name, listeners, playcount))
pickle.dump(musicd, open(pfile, 'wb'))
if __name__ == '__main__':
get_data();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment