playback fix, plugin should be working again
authorRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sat, 27 Mar 2010 14:19:04 +0000 (14:19 +0000)
committerRico Schulte <ricoschulte@users.schwerkraft.elitedvb.net>
Sat, 27 Mar 2010 14:19:04 +0000 (14:19 +0000)
Big Thanks to cloudy07
http://www.i-have-a-dreambox.com/wbb2/profile.php?userid=97729

lastfm/src/LastFM.py

index 0a32c4e..c5b287a 100755 (executable)
 from urllib import unquote_plus
-from twisted.web.client import getPage\r
-from md5 import md5 # to encode password\r
+from twisted.web.client import getPage
+from md5 import md5 # to encode password
 from string import split, rstrip
 
 from xml.dom.minidom import parseString
-\r
-\r
-\r
-class LastFMEventRegister:\r
-    def __init__(self):\r
-        self.onMetadataChangedList = []\r
-    \r
-    def addOnMetadataChanged(self,callback):\r
-        self.onMetadataChangedList.append(callback)\r
-\r
-    def removeOnMetadataChanged(self,callback):\r
-        self.onMetadataChangedList.remove(callback)\r
-    \r
-    def onMetadataChanged(self,metad):\r
-        for i in self.onMetadataChangedList:\r
-            i(metadata=metad)\r
-\r
-lastfm_event_register = LastFMEventRegister()\r
-            \r
-class LastFMHandler:\r
-    def __init__(self):\r
-        pass\r
+
+
+
+class LastFMEventRegister:
+    def __init__(self):
+        self.onMetadataChangedList = []
+    
+    def addOnMetadataChanged(self,callback):
+        self.onMetadataChangedList.append(callback)
+
+    def removeOnMetadataChanged(self,callback):
+        self.onMetadataChangedList.remove(callback)
+    
+    def onMetadataChanged(self,metad):
+        for i in self.onMetadataChangedList:
+            i(metadata=metad)
+
+lastfm_event_register = LastFMEventRegister()
+            
+class LastFMHandler:
+    def __init__(self):
+        pass
     def onPlaylistLoaded(self,reason):
         pass
     def onConnectSuccessful(self,reason):
         pass
-    def onConnectFailed(self,reason):\r
-        pass\r
-    def onCommandFailed(self,reason):\r
-        pass\r
-    def onTrackSkiped(self,reason):\r
-        pass\r
-    def onTrackLoved(self,reason):\r
-        pass\r
-    def onTrackBanned(self,reason):\r
-        pass\r
-    def onGlobalTagsLoaded(self,tags):\r
-        pass\r
-    def onTopTracksLoaded(self,tracks):\r
-        pass\r
-    def onRecentTracksLoaded(self,tracks):\r
-        pass\r
-    def onRecentBannedTracksLoaded(self,tracks):\r
-        pass\r
-    def onRecentLovedTracksLoaded(self,tracks):\r
-        pass\r
-    def onNeighboursLoaded(self,user):\r
-        pass\r
-    def onFriendsLoaded(self,user):\r
-        pass\r
-    def onStationChanged(self,reason):\r
-        pass    \r
-    def onMetadataLoaded(self,metadata):\r
-        pass\r
-\r
-class LastFM(LastFMHandler):\r
-    DEFAULT_NAMESPACES = (\r
-        None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0\r
-        'http://purl.org/rss/1.0/', # RSS 1.0\r
-        'http://my.netscape.com/rdf/simple/0.9/' # RSS 0.90\r
-    )\r
-    DUBLIN_CORE = ('http://purl.org/dc/elements/1.1/',)\r
-    \r
-    version = "1.0.1"\r
-    platform = "linux"\r
-    host = "ws.audioscrobbler.com"\r
-    port = 80\r
-    metadata = {}\r
-    info={}\r
-    cache_toptags= "/tmp/toptags"\r
+    def onConnectFailed(self,reason):
+        pass
+    def onCommandFailed(self,reason):
+        pass
+    def onTrackSkiped(self,reason):
+        pass
+    def onTrackLoved(self,reason):
+        pass
+    def onTrackBanned(self,reason):
+        pass
+    def onGlobalTagsLoaded(self,tags):
+        pass
+    def onTopTracksLoaded(self,tracks):
+        pass
+    def onRecentTracksLoaded(self,tracks):
+        pass
+    def onRecentBannedTracksLoaded(self,tracks):
+        pass
+    def onRecentLovedTracksLoaded(self,tracks):
+        pass
+    def onNeighboursLoaded(self,user):
+        pass
+    def onFriendsLoaded(self,user):
+        pass
+    def onStationChanged(self,reason):
+        pass    
+    def onMetadataLoaded(self,metadata):
+        pass
+
+class LastFM(LastFMHandler):
+    DEFAULT_NAMESPACES = (
+        None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0
+        'http://purl.org/rss/1.0/', # RSS 1.0
+        'http://my.netscape.com/rdf/simple/0.9/' # RSS 0.90
+    )
+    DUBLIN_CORE = ('http://purl.org/dc/elements/1.1/',)
+    
+    version = "1.0.1"
+    platform = "linux"
+    host = "ws.audioscrobbler.com"
+    port = 80
+    metadata = {}
+    info={}
+    cache_toptags= "/tmp/toptags"
     playlist = None
-    \r
-    def __init__(self):\r
-        LastFMHandler.__init__(self)\r
-        self.state = False # if logged in\r
-                    \r
-    def connect(self,username,password):\r
-#        getPage(self.host,self.port\r
-#                            ,"/radio/handshake.php?version=" + self.version + "&platform=" + self.platform + "&username=" + username + "&passwordmd5=" + self.hexify(md5(password).digest())\r
-#                            ,callback=self.connectCB,errorback=self.onConnectFailed)\r
+    
+    def __init__(self):
+        LastFMHandler.__init__(self)
+        self.state = False # if logged in
+                    
+    def connect(self,username,password):
+#        getPage(self.host,self.port
+#                            ,"/radio/handshake.php?version=" + self.version + "&platform=" + self.platform + "&username=" + username + "&passwordmd5=" + self.hexify(md5(password).digest())
+#                            ,callback=self.connectCB,errorback=self.onConnectFailed)
         url = "http://"+self.host+":"+str(self.port)+"/radio/handshake.php?version=" + self.version + "&platform=" + self.platform + "&username=" + username + "&passwordmd5=" + self.hexify(md5(password).digest())
-        getPage(url).addCallback(self.connectCB).addErrback(self.onConnectFailed)\r
-
-    def connectCB(self,data):\r
-        self.info = self._parselines(data)\r
-        if self.info.has_key("session"):\r
-            self.lastfmsession = self.info["session"]\r
-            if self.lastfmsession.startswith("FAILED"):\r
-                self.onConnectFailed(self.info["msg"])\r
-            else:\r
-                self.streamurl = self.info["stream_url"]\r
-                self.baseurl = self.info["base_url"]\r
-                self.basepath = self.info["base_path"]\r
-                self.subscriber = self.info["subscriber"]\r
-                self.framehack = self.info["base_path"]\r
-                self.state = True\r
+        getPage(url).addCallback(self.connectCB).addErrback(self.onConnectFailed)
+
+    def connectCB(self,data):
+        self.info = self._parselines(data)
+        if self.info.has_key("session"):
+            self.lastfmsession = self.info["session"]
+            if self.lastfmsession.startswith("FAILED"):
+                self.onConnectFailed(self.info["msg"])
+            else:
+                self.streamurl = self.info["stream_url"]
+                self.baseurl = self.info["base_url"]
+                self.basepath = self.info["base_path"]
+                self.subscriber = self.info["subscriber"]
+                self.framehack = self.info["base_path"]
+                self.state = True
                 self.onConnectSuccessful("loggedin")
-                \r
-        else:\r
-            self.onConnectFailed("login failed")\r
-        \r
-    def _parselines(self, str):\r
-        res = {}\r
-        vars = split(str, "\n")\r
-        for v in vars:\r
-            x = split(rstrip(v), "=", 1)\r
+                
+        else:
+            self.onConnectFailed("login failed")
+        
+    def _parselines(self, str):
+        res = {}
+        vars = split(str, "\n")
+        for v in vars:
+            x = split(rstrip(v), "=", 1)
             if len(x) == 2:
-                try:\r
+                try:
                     res[x[0]] = x[1].encode("utf-8")
                 except UnicodeDecodeError:
-                    res[x[0]] = "unicodeproblem"\r
-            elif x != [""]:\r
-                print "(urk?", x, ")"\r
-        return res\r
+                    res[x[0]] = "unicodeproblem"
+            elif x != [""]:
+                print "(urk?", x, ")"
+        return res
 
     def loadPlaylist(self):
         print "LOADING PLAYLIST"
@@ -127,283 +127,283 @@ class LastFM(LastFMHandler):
 #            getPage(self.info["base_url"],80
 #                            ,self.info["base_path"] + "/xspf.php?sk=" + self.info["session"]+"&discovery=0&desktop=1.3.1.1"
 #                            ,callback=self.loadPlaylistCB,errorback=self.onCommandFailed)
-            url = "http://"+self.info["base_url"]+":80"+self.info["base_path"] + "/xspf.php?sk=" + self.info["session"]+"&discovery=0&desktop=1.3.1.1"
+            url = "http://"+self.info["base_url"]+":80"+self.info["base_path"] + "/xspf.php?sk=" + self.info["session"] + "&discovery=0&desktop=2.0"
             getPage(url).addCallback(self.loadPlaylistCB).addErrback(self.onCommandFailed)
 
     def loadPlaylistCB(self,xmlsource):
         self.playlist = LastFMPlaylist(xmlsource)
         self.onPlaylistLoaded("playlist loaded")
-    \r
-    def getPersonalURL(self,username,level=50):\r
-        return "lastfm://user/%s/recommended/32"%username\r
-    \r
-    def getNeighboursURL(self,username):\r
-        return "lastfm://user/%s/neighbours"%username\r
-\r
-    def getLovedURL(self,username):\r
-        return "lastfm://user/%s/loved"%username\r
-    \r
-    def getSimilarArtistsURL(self,artist=None):\r
-        if artist is None and self.metadata.has_key('artist'):\r
-            return "lastfm://artist/%s/similarartists"%self.metadata['artist'].replace(" ","%20")\r
-        else:\r
-            return "lastfm://artist/%s/similarartists"%artist.replace(" ","%20")\r
-\r
-    def getArtistsLikedByFans(self,artist=None):\r
-        if artist is None and self.metadata.has_key('artist'):\r
-            return "lastfm://artist/%s/fans"%self.metadata['artist'].replace(" ","%20")\r
-        else:\r
-            return "lastfm://artist/%s/fans"%artist.replace(" ","%20")\r
-    \r
-    def getArtistGroup(self,artist=None):\r
-        if artist is None and self.metadata.has_key('artist'):\r
-            return "lastfm://group/%s"%self.metadata['artist'].replace(" ","%20")\r
-        else:\r
-            return "lastfm://group/%s"%artist.replace(" ","%20")\r
-    def command(self, cmd,callback):\r
-        # commands = skip, love, ban, rtp, nortp\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,self.info["base_path"] + "/control.php?command=" + cmd + "&session=" + self.info["session"]\r
-#                            ,callback=callback,errorback=self.onCommandFailed)\r
+    
+    def getPersonalURL(self,username,level=50):
+        return "lastfm://user/%s/recommended/32"%username
+    
+    def getNeighboursURL(self,username):
+        return "lastfm://user/%s/neighbours"%username
+
+    def getLovedURL(self,username):
+        return "lastfm://user/%s/loved"%username
+    
+    def getSimilarArtistsURL(self,artist=None):
+        if artist is None and self.metadata.has_key('artist'):
+            return "lastfm://artist/%s/similarartists"%self.metadata['artist'].replace(" ","%20")
+        else:
+            return "lastfm://artist/%s/similarartists"%artist.replace(" ","%20")
+
+    def getArtistsLikedByFans(self,artist=None):
+        if artist is None and self.metadata.has_key('artist'):
+            return "lastfm://artist/%s/fans"%self.metadata['artist'].replace(" ","%20")
+        else:
+            return "lastfm://artist/%s/fans"%artist.replace(" ","%20")
+    
+    def getArtistGroup(self,artist=None):
+        if artist is None and self.metadata.has_key('artist'):
+            return "lastfm://group/%s"%self.metadata['artist'].replace(" ","%20")
+        else:
+            return "lastfm://group/%s"%artist.replace(" ","%20")
+    def command(self, cmd,callback):
+        # commands = skip, love, ban, rtp, nortp
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,self.info["base_path"] + "/control.php?command=" + cmd + "&session=" + self.info["session"]
+#                            ,callback=callback,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+":80"+self.info["base_path"] + "/control.php?command=" + cmd + "&session=" + self.info["session"]
-            getPage(url).addCallback(callback).addErrback(self.onCommandFailed)\r
+            getPage(url).addCallback(callback).addErrback(self.onCommandFailed)
  
-    def onTrackLovedCB(self,response):\r
-        res = self._parselines(response)\r
-        if res["response"] == "OK":\r
-            self.onTrackLoved("Track loved")\r
-        else:\r
-            self.onCommandFailed("Server returned FALSE")\r
-\r
-    def onTrackBannedCB(self,response):\r
-        res = self._parselines(response)\r
-        if res["response"] == "OK":\r
-            self.onTrackBanned("Track baned")\r
-        else:\r
-            self.onCommandFailed("Server returned FALSE")\r
-\r
-    def onTrackSkipedCB(self,response):\r
-        res = self._parselines(response)\r
-        if res["response"] == "OK":\r
-            self.onTrackSkiped("Track skiped")\r
-        else:\r
-            self.onCommandFailed("Server returned FALSE")\r
-                        \r
-    def love(self):\r
-        return self.command("love",self.onTrackLovedCB)\r
-\r
-    def ban(self):\r
-        return self.command("ban",self.onTrackBannedCB)\r
-\r
+    def onTrackLovedCB(self,response):
+        res = self._parselines(response)
+        if res["response"] == "OK":
+            self.onTrackLoved("Track loved")
+        else:
+            self.onCommandFailed("Server returned FALSE")
+
+    def onTrackBannedCB(self,response):
+        res = self._parselines(response)
+        if res["response"] == "OK":
+            self.onTrackBanned("Track baned")
+        else:
+            self.onCommandFailed("Server returned FALSE")
+
+    def onTrackSkipedCB(self,response):
+        res = self._parselines(response)
+        if res["response"] == "OK":
+            self.onTrackSkiped("Track skiped")
+        else:
+            self.onCommandFailed("Server returned FALSE")
+                        
+    def love(self):
+        return self.command("love",self.onTrackLovedCB)
+
+    def ban(self):
+        return self.command("ban",self.onTrackBannedCB)
+
     def skip(self):
-        """unneeded"""\r
-        return self.command("skip",self.onTrackSkipedCB)\r
-    \r
-    def hexify(self,s):\r
-        result = ""\r
-        for c in s:\r
-            result = result + ("%02x" % ord(c))\r
-        return result\r
-    \r
-\r
-    def XMLgetElementsByTagName( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES ):\r
-        for namespace in possibleNamespaces:\r
-            children = node.getElementsByTagNameNS(namespace, tagName)\r
-            if len(children): return children\r
-        return []\r
-\r
-    def XMLnode_data( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES):\r
-        children = self.XMLgetElementsByTagName(node, tagName, possibleNamespaces)\r
-        node = len(children) and children[0] or None\r
-        return node and "".join([child.data.encode("utf-8") for child in node.childNodes]) or None\r
-\r
-    def XMLget_txt( self, node, tagName, default_txt="" ):\r
-        return self.XMLnode_data( node, tagName ) or self.XMLnode_data( node, tagName, self.DUBLIN_CORE ) or default_txt\r
-\r
-    def getGlobalTags( self ,force_reload=False):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/tag/toptags.xml"\r
-#                            ,callback=self.getGlobalTagsCB,errorback=self.onCommandFailed)\r
+        """unneeded"""
+        return self.command("skip",self.onTrackSkipedCB)
+    
+    def hexify(self,s):
+        result = ""
+        for c in s:
+            result = result + ("%02x" % ord(c))
+        return result
+    
+
+    def XMLgetElementsByTagName( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES ):
+        for namespace in possibleNamespaces:
+            children = node.getElementsByTagNameNS(namespace, tagName)
+            if len(children): return children
+        return []
+
+    def XMLnode_data( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES):
+        children = self.XMLgetElementsByTagName(node, tagName, possibleNamespaces)
+        node = len(children) and children[0] or None
+        return node and "".join([child.data.encode("utf-8") for child in node.childNodes]) or None
+
+    def XMLget_txt( self, node, tagName, default_txt="" ):
+        return self.XMLnode_data( node, tagName ) or self.XMLnode_data( node, tagName, self.DUBLIN_CORE ) or default_txt
+
+    def getGlobalTags( self ,force_reload=False):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/tag/toptags.xml"
+#                            ,callback=self.getGlobalTagsCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+":80"+"/1.0/tag/toptags.xml"
             getPage(url).addCallback(self.getGlobalTagsCB).addErrback(self.onCommandFailed)
-\r
-    def getGlobalTagsCB(self,result):\r
-        try:\r
-            rssDocument = parseString(result)\r
-            data =[]\r
-            for node in self.XMLgetElementsByTagName(rssDocument, 'tag'):\r
-                nodex={}\r
-                nodex['_display'] = nodex['name'] = node.getAttribute("name").encode("utf-8")\r
-                nodex['count'] =  node.getAttribute("count").encode("utf-8")\r
-                nodex['stationurl'] = "lastfm://globaltags/"+node.getAttribute("name").encode("utf-8").replace(" ","%20")\r
-                nodex['url'] =  node.getAttribute("url").encode("utf-8")\r
-                data.append(nodex)\r
-            self.onGlobalTagsLoaded(data)\r
-        except xml.parsers.expat.ExpatError,e:\r
-            self.onCommandFailed(e)\r
-\r
-    def getTopTracks(self,username):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/user/%s/toptracks.xml"%username\r
-#                            ,callback=self.getTopTracksCB,errorback=self.onCommandFailed)\r
+
+    def getGlobalTagsCB(self,result):
+        try:
+            rssDocument = parseString(result)
+            data =[]
+            for node in self.XMLgetElementsByTagName(rssDocument, 'tag'):
+                nodex={}
+                nodex['_display'] = nodex['name'] = node.getAttribute("name").encode("utf-8")
+                nodex['count'] =  node.getAttribute("count").encode("utf-8")
+                nodex['stationurl'] = "lastfm://globaltags/"+node.getAttribute("name").encode("utf-8").replace(" ","%20")
+                nodex['url'] =  node.getAttribute("url").encode("utf-8")
+                data.append(nodex)
+            self.onGlobalTagsLoaded(data)
+        except xml.parsers.expat.ExpatError,e:
+            self.onCommandFailed(e)
+
+    def getTopTracks(self,username):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/user/%s/toptracks.xml"%username
+#                            ,callback=self.getTopTracksCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+"/1.0/user/"+username+"/toptracks.xml"
             getPage(url).addCallback(self.getTopTracksCB).addErrback(self.onCommandFailed)
-           \r
-    def getTopTracksCB(self,result):\r
-        re,rdata = self._parseTracks(result)\r
-        if re:\r
-            self.onTopTracksLoaded(rdata)\r
-        else:\r
-            self.onCommandFailed(rdata)\r
-            \r
-    def getRecentTracks(self,username):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/user/%s/recenttracks.xml"%username\r
-#                            ,callback=self.getRecentTracksCB,errorback=self.onCommandFailed)\r
+           
+    def getTopTracksCB(self,result):
+        re,rdata = self._parseTracks(result)
+        if re:
+            self.onTopTracksLoaded(rdata)
+        else:
+            self.onCommandFailed(rdata)
+            
+    def getRecentTracks(self,username):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/user/%s/recenttracks.xml"%username
+#                            ,callback=self.getRecentTracksCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+"/1.0/user/"+username+"/recenttracks.xml"
             getPage(url).addCallback(self.getRecentTracksCB).addErrback(self.onCommandFailed)
-           \r
-    def getRecentTracksCB(self,result):\r
-        re,rdata = self._parseTracks(result)\r
-        if re:\r
-            self.onRecentTracksLoaded(rdata)\r
-        else:\r
-            self.onCommandFailed(rdata)\r
-    \r
-    def getRecentLovedTracks(self,username):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/user/%s/recentlovedtracks.xml"%username\r
-#                            ,callback=self.getRecentLovedTracksCB,errorback=self.onCommandFailed)\r
+           
+    def getRecentTracksCB(self,result):
+        re,rdata = self._parseTracks(result)
+        if re:
+            self.onRecentTracksLoaded(rdata)
+        else:
+            self.onCommandFailed(rdata)
+    
+    def getRecentLovedTracks(self,username):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/user/%s/recentlovedtracks.xml"%username
+#                            ,callback=self.getRecentLovedTracksCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+"/1.0/user/"+username+"/recentlovedtracks.xml"
             getPage(url).addCallback(self.getRecentLovedTracksCB).addErrback(self.onCommandFailed)
-           \r
-    def getRecentLovedTracksCB(self,result):\r
-        re,rdata = self._parseTracks(result)\r
-        if re:\r
-            self.onRecentLovedTracksLoaded(rdata)\r
-        else:\r
-            self.onCommandFailed(rdata)\r
-\r
-    def getRecentBannedTracks(self,username):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/user/%s/recentbannedtracks.xml"%username\r
-#                            ,callback=self.getRecentBannedTracksCB,errorback=self.onCommandFailed)\r
+           
+    def getRecentLovedTracksCB(self,result):
+        re,rdata = self._parseTracks(result)
+        if re:
+            self.onRecentLovedTracksLoaded(rdata)
+        else:
+            self.onCommandFailed(rdata)
+
+    def getRecentBannedTracks(self,username):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/user/%s/recentbannedtracks.xml"%username
+#                            ,callback=self.getRecentBannedTracksCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+"/1.0/user/"+username+"/recentbannedtracks.xml"
             getPage(url).addCallback(self.getRecentBannedTracksCB).addErrback(self.onCommandFailed)
-           \r
-    def getRecentBannedTracksCB(self,result):\r
-        re,rdata = self._parseTracks(result)\r
-        if re:\r
-            self.onRecentBannedTracksLoaded(rdata)\r
-        else:\r
-            self.onCommandFailed(rdata)\r
-\r
-    def _parseTracks(self,xmlrawdata):\r
-        #print xmlrawdata\r
-        try:\r
-            rssDocument = parseString(xmlrawdata)\r
-            data =[]\r
-            for node in self.XMLgetElementsByTagName(rssDocument, 'track'):\r
-                nodex={}\r
-                nodex['name'] = self.XMLget_txt(node, "name", "N/A" )\r
-                nodex['artist'] =  self.XMLget_txt(node, "artist", "N/A" )\r
-                nodex['playcount'] = self.XMLget_txt(node, "playcount", "N/A" )\r
-                nodex['stationurl'] =  "lastfm://artist/"+nodex['artist'].replace(" ","%20")+"/similarartists"#+nodex['name'].replace(" ","%20")\r
-                nodex['url'] =  self.XMLget_txt(node, "url", "N/A" )\r
-                nodex['_display'] = nodex['artist']+" - "+nodex['name']\r
-                data.append(nodex)\r
-            return True,data\r
-        except xml.parsers.expat.ExpatError,e:\r
-            print e\r
-            return False,e\r
-\r
-    def getNeighbours(self,username):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/user/%s/neighbours.xml"%username\r
-#                            ,callback=self.getNeighboursCB,errorback=self.onCommandFailed)\r
+           
+    def getRecentBannedTracksCB(self,result):
+        re,rdata = self._parseTracks(result)
+        if re:
+            self.onRecentBannedTracksLoaded(rdata)
+        else:
+            self.onCommandFailed(rdata)
+
+    def _parseTracks(self,xmlrawdata):
+        #print xmlrawdata
+        try:
+            rssDocument = parseString(xmlrawdata)
+            data =[]
+            for node in self.XMLgetElementsByTagName(rssDocument, 'track'):
+                nodex={}
+                nodex['name'] = self.XMLget_txt(node, "name", "N/A" )
+                nodex['artist'] =  self.XMLget_txt(node, "artist", "N/A" )
+                nodex['playcount'] = self.XMLget_txt(node, "playcount", "N/A" )
+                nodex['stationurl'] =  "lastfm://artist/"+nodex['artist'].replace(" ","%20")+"/similarartists"#+nodex['name'].replace(" ","%20")
+                nodex['url'] =  self.XMLget_txt(node, "url", "N/A" )
+                nodex['_display'] = nodex['artist']+" - "+nodex['name']
+                data.append(nodex)
+            return True,data
+        except xml.parsers.expat.ExpatError,e:
+            print e
+            return False,e
+
+    def getNeighbours(self,username):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/user/%s/neighbours.xml"%username
+#                            ,callback=self.getNeighboursCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+"/1.0/user/"+username+"/neighbours.xml"
             getPage(url).addCallback(self.getNeighboursCB).addErrback(self.onCommandFailed)
-           \r
-    def getNeighboursCB(self,result):\r
-        re,rdata = self._parseUser(result)\r
-        if re:\r
-            self.onNeighboursLoaded(rdata)\r
-        else:\r
-            self.onCommandFailed(rdata)\r
-\r
-    def getFriends(self,username):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,"/1.0/user/%s/friends.xml"%username\r
-#                            ,callback=self.getFriendsCB,errorback=self.onCommandFailed)\r
+           
+    def getNeighboursCB(self,result):
+        re,rdata = self._parseUser(result)
+        if re:
+            self.onNeighboursLoaded(rdata)
+        else:
+            self.onCommandFailed(rdata)
+
+    def getFriends(self,username):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,"/1.0/user/%s/friends.xml"%username
+#                            ,callback=self.getFriendsCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+"/1.0/user/"+username+"/friends.xml"
             getPage(url).addCallback(self.getFriendsCB).addErrback(self.onCommandFailed)
-           \r
-    def getFriendsCB(self,result):\r
-        re,rdata = self._parseUser(result)\r
-        if re:\r
-            self.onFriendsLoaded(rdata)\r
-        else:\r
-            self.onCommandFailed(rdata)\r
-\r
-\r
-    def _parseUser(self,xmlrawdata):\r
-        #print xmlrawdata\r
-        try:\r
-            rssDocument = parseString(xmlrawdata)\r
-            data =[]\r
-            for node in self.XMLgetElementsByTagName(rssDocument, 'user'):\r
-                nodex={}\r
-                nodex['name'] = node.getAttribute("username").encode("utf-8")\r
-                nodex['url'] =  self.XMLget_txt(node, "url", "N/A" )\r
-                nodex['stationurl'] =  "lastfm://user/"+nodex['name']+"/personal"\r
-                nodex['_display'] = nodex['name']\r
-                data.append(nodex)\r
-            return True,data\r
-        except xml.parsers.expat.ExpatError,e:\r
-            print e\r
-            return False,e\r
-\r
-    def changeStation(self,url):\r
-        if self.state is not True:\r
-            self.onCommandFailed("not logged in")\r
-        else:\r
-#            getPage(self.info["base_url"],80\r
-#                            ,self.info["base_path"] + "/adjust.php?session=" + self.info["session"] + "&url=" + url\r
-#                            ,callback=self.changeStationCB,errorback=self.onCommandFailed)\r
+           
+    def getFriendsCB(self,result):
+        re,rdata = self._parseUser(result)
+        if re:
+            self.onFriendsLoaded(rdata)
+        else:
+            self.onCommandFailed(rdata)
+
+
+    def _parseUser(self,xmlrawdata):
+        #print xmlrawdata
+        try:
+            rssDocument = parseString(xmlrawdata)
+            data =[]
+            for node in self.XMLgetElementsByTagName(rssDocument, 'user'):
+                nodex={}
+                nodex['name'] = node.getAttribute("username").encode("utf-8")
+                nodex['url'] =  self.XMLget_txt(node, "url", "N/A" )
+                nodex['stationurl'] =  "lastfm://user/"+nodex['name']+"/personal"
+                nodex['_display'] = nodex['name']
+                data.append(nodex)
+            return True,data
+        except xml.parsers.expat.ExpatError,e:
+            print e
+            return False,e
+
+    def changeStation(self,url):
+        if self.state is not True:
+            self.onCommandFailed("not logged in")
+        else:
+#            getPage(self.info["base_url"],80
+#                            ,self.info["base_path"] + "/adjust.php?session=" + self.info["session"] + "&url=" + url
+#                            ,callback=self.changeStationCB,errorback=self.onCommandFailed)
             url = "http://"+self.info["base_url"]+":80"+self.info["base_path"] + "/adjust.php?session=" + self.info["session"] + "&url=" + url
             getPage(url).addCallback(self.changeStationCB).addErrback(self.onCommandFailed)
-           \r
-    def changeStationCB(self,result):\r
-        res = self._parselines(result)\r
-        if res["response"] == "OK":\r
-            self.onStationChanged("Station changed")\r
-        else:\r
-            self.onCommandFailed("Server returned "+res["response"])\r
-\r
+           
+    def changeStationCB(self,result):
+        res = self._parselines(result)
+        if res["response"] == "OK":
+            self.onStationChanged("Station changed")
+        else:
+            self.onCommandFailed("Server returned "+res["response"])
+
 ############
 class LastFMPlaylist:
     """