ocarina/trunk/src/GuiObjects/scrobbler.py

120 lines
3.0 KiB
Python
Raw Normal View History

import urllib2
import pygtk
pygtk.require('2.0')
import gtk
import webbrowser
import thread
import hashlib
from button import Button
import xml.dom
from xml.dom import minidom
class Scrobbler(gtk.VBox):
def __init__(self,data):
gtk.VBox.__init__(self,False,0)
self.data = data
self.url = "http://ws.audioscrobbler.com/2.0/"
self.key = "2c76f85a6704efd74b5a358821284ef9"
self.secret = "3a6012bfb627b60a884cf33fc044885c"
self.token = ""
# Run these in new thread so we can keep loading other things while waiting
self.makegui()
#thread.start_new_thread(self.setup,("setup",None))
self.show()
def makegui(self):
if self.data.lfm == "":
self.nosession = Button("lfm",None,"Click here to configure Ocarina for submitting songs to last.fm",self.setup)
self.nosession.set_size_request(100,100)
self.pack_start(self.nosession,False,False,0)
# One time setup (in theory)
def setup(self,widgit,data):
self.nosession.hide()
self.remove(self.nosession)
self.contBtn = Button("lfm",None,"Click to continue",self.fetchSession)
self.pack_start(self.contBtn,False,False,0)
self.fetchToken()
self.authorize()
# Fetch the authentication token
def fetchToken(self):
(url,list) = self.addMethod("auth.gettoken")
(url,list) = self.addParam(url,list,"api_key",self.key)
status = self.placeRequest(url)
attr = status.getAttributeNode("status")
if attr.value != "ok":
return
self.token += hashlib.md5(status.firstChild.nextSibling.firstChild.data).hexdigest()
# Open to authorization page
def authorize(self):
url = "http://www.last.fm/api/auth/?"
(url,list) = self.addParam(url,[],"api_key",self.key)
(url,list) = self.addParam(url,[],"token",self.token)
#url+="&"+self.token
webbrowser.open(url)
def fetchSession(self,widgit,data):
(url,list) = self.addMethod("auth.getSession")
(url,list) = self.addParam(url,list,"api_key",self.key)
(url,list) = self.addParam(url,list,"token",self.token)
sig = self.getSig(list)
(url,list) = self.addParam(url,None,"api_sig",sig)
print url
#status = self.placeRequest(url)
return
attr = status.getAttributeNode("status")
if attr.value != "ok":
return
node = status.firstChild.firstChild
user = node.data
key = node.nextSibling.data
subscriber = node.nextSibling.nextSibling.data
#print user,key,subscriber
def addMethod(self,method):
return (self.url+"?method="+method,[("method",method)])
def addParam(self,url,list,param,val):
url+="&"+param+"="+val
if list:
list += [(param,val)]
return url,list
#return (url+"&"+param+"="+val,list+[(param,val)])
def getSig(self,list):
list.sort()
string = ""
for entry in list:
string+=entry[0]+entry[1]
string = string + self.secret
m = hashlib.md5(string)
return m.hexdigest()
def sendReq(self,req):
req+=self.secret
#hash = md5.new(req).digest()
#return self.placeRequest(self.url+"?"+hash)
def placeRequest(self,url):
print url
req = urllib2.Request(url)
req.add_header('User-Agent','Ocarina')
return minidom.parse(urllib2.urlopen(req)).documentElement