summaryrefslogtreecommitdiff
path: root/bin/scrobble.py
diff options
context:
space:
mode:
authorNicolás Reynolds <fauno@kiwwwi.com.ar>2010-10-25 15:22:02 -0300
committerNicolás Reynolds <fauno@kiwwwi.com.ar>2010-10-25 15:22:02 -0300
commit371d450b6863c240633626d000c3f03843414b71 (patch)
treef415f717ee09a62703530e0b90933d9a2ad5c769 /bin/scrobble.py
parent3a63dcd77da6a3fb5eb6110e0784c7abc75c2a5f (diff)
Added libre.fm import/export scripts
Diffstat (limited to 'bin/scrobble.py')
-rwxr-xr-xbin/scrobble.py107
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