diff options
author | Nicolás Reynolds <fauno@kiwwwi.com.ar> | 2010-10-25 15:22:02 -0300 |
---|---|---|
committer | Nicolás Reynolds <fauno@kiwwwi.com.ar> | 2010-10-25 15:22:02 -0300 |
commit | 371d450b6863c240633626d000c3f03843414b71 (patch) | |
tree | f415f717ee09a62703530e0b90933d9a2ad5c769 /bin/scrobble.py | |
parent | 3a63dcd77da6a3fb5eb6110e0784c7abc75c2a5f (diff) |
Added libre.fm import/export scripts
Diffstat (limited to 'bin/scrobble.py')
-rwxr-xr-x | bin/scrobble.py | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/bin/scrobble.py b/bin/scrobble.py new file mode 100755 index 0000000..428e668 --- /dev/null +++ b/bin/scrobble.py @@ -0,0 +1,107 @@ +#modified version of old gobble.py +try: + import hashlib + md5hash = hashlib.md5 +except ImportError: + import md5 + md5hash = md5.new +from optparse import OptionParser +import time +from urllib import urlencode +from urllib2 import urlopen + + +class ScrobbleException(Exception): + + pass + + +class ScrobbleServer(object): + + def __init__(self, server_name, username, password, client_code='imp'): + if server_name[:7] != "http://": + server_name = "http://%s" % (server_name,) + self.client_code = client_code + self.name = server_name + self.password = password + self.post_data = [] + self.session_id = None + self.submit_url = None + self.username = username + self._handshake() + + + def _handshake(self): + timestamp = int(time.time()) + token = (md5hash(md5hash(self.password).hexdigest() + + str(timestamp)).hexdigest()) + auth_url = "%s/?hs=true&p=1.2&u=%s&t=%d&a=%s&c=%s" % (self.name, + self.username, + timestamp, + token, + self.client_code) + response = urlopen(auth_url).read() + lines = response.split("\n") + if lines[0] != "OK": + raise ScrobbleException("Server returned: %s" % (response,)) + self.session_id = lines[1] + self.submit_url = lines[3] + + def submit(self): + if len(self.post_data) == 0: + return + i = 0 + data = [] + for track in self.post_data: + data += track.get_tuples(i) + i += 1 + data += [('s', self.session_id)] + response = urlopen(self.submit_url, urlencode(data)).read() + if response != "OK\n": + raise ScrobbleException("Server returned: %s" % (response,)) + self.post_data = [] + time.sleep(1) + + def add_track(self, scrobble_track): + i = len(self.post_data) + if i > 49: + self.submit() + i = 0 + self.post_data.append(scrobble_track) + + +class ScrobbleTrack(object): + + def __init__(self, timestamp, trackname, artistname, albumname=None, \ + trackmbid=None, tracklength=None, tracknumber=None): + self.timestamp = timestamp + self.trackname = trackname + self.artistname = artistname + self.albumname = albumname + self.trackmbid = trackmbid + self.tracklength = tracklength + self.tracknumber = tracknumber + + def get_tuples(self, i): + #timestamp = str(int(time.mktime(self.timestamp.utctimetuple()))) + data = [] + data += [('i[%d]' % i, self.timestamp), ('t[%d]' % i, self.trackname), + ('a[%d]' % i, self.artistname)] + if self.albumname is not None: + data.append(('b[%d]' % i, self.albumname)) + if self.trackmbid is not None: + data.append(('m[%d]' % i, self.trackmbid)) + if self.tracklength is not None: + data.append(('l[%d]' % i, self.tracklength)) + if self.tracknumber is not None: + data.append(('n[%d]' % i, self.tracknumber)) + return data + + +def get_parser(usage): + parser = OptionParser(usage=usage) + parser.add_option('-s', '--server', + help="Server to submit to. Defaults to" + " 'turtle.libre.fm'.") + parser.set_defaults(server='turtle.libre.fm') + return parser |