Add XML encoding.
[clinton/xbmc-groove.git] / resources / lib / GroovesharkAPI.py
index 282c94f..c34d3ea 100644 (file)
@@ -15,7 +15,7 @@
 #    You should have received a copy of the GNU General Public License
 #    along with xbmc-groove.  If not, see <http://www.gnu.org/licenses/>.
 
-import urllib2, pprint, md5, os, pickle, tempfile, time, re, simplejson, base64, sys, socket
+import urllib2, pprint, os, pickle, tempfile, time, re, simplejson, base64, sys, socket, hashlib, getpass
 from blowfish import Blowfish
 
 SESSION_EXPIRY = 1209600 # 2 weeks
@@ -38,18 +38,18 @@ class GrooveAPI:
        _sessionID = ''
        _userID = 0
        _lastSessionTime = 0
-       _key = md5.new(os.path.basename("GroovesharkAPI.py")).hexdigest()
+       _key = hashlib.md5(os.path.basename("GroovesharkAPI.py")).hexdigest()
        _debugging = False
 
        # Constructor
-       def __init__(self, debug):
+       def __init__(self, debug, tempDir):
                
                self._debugging = debug
                self.simplejson = simplejson
                if "linux" in sys.platform.lower():
                        socket.setdefaulttimeout(30)
                        
-               self.cacheDir = os.path.join(tempfile.gettempdir(), 'groovesharkapi')
+               self.cacheDir = tempDir
                if os.path.isdir(self.cacheDir) == False:
                        os.makedirs(self.cacheDir)
                        if self._debugging:
@@ -129,7 +129,7 @@ class GrooveAPI:
                        return ''
        
        def _getSavedSession(self):
-               path = os.path.join(self.cacheDir, 'session.dmp')
+               path = os.path.join(self.cacheDir, 'groovesharksession.dmp')
                try:
                        f = open(path, 'rb')
                        session = pickle.load(f)
@@ -152,7 +152,7 @@ class GrooveAPI:
                        # Create the directory if it doesn't exist.
                        if not os.path.exists(self.cacheDir):
                                os.makedirs(self.cacheDir)
-                       path = os.path.join(self.cacheDir, 'session.dmp')
+                       path = os.path.join(self.cacheDir, 'groovesharksession.dmp')
                        f = open(path, 'wb')
                        session = { 'sessionID' : self._sessionID, 'lastSessionTime' : self._lastSessionTime, 'userID': self._userID, 'ip' : self._ip, 'country' : self._country } 
                        pickle.dump(session, f, protocol=pickle.HIGHEST_PROTOCOL)
@@ -188,7 +188,7 @@ class GrooveAPI:
        
        # Authenticates the user for current API session
        def _authenticate(self, login, password):
-               md5pwd = md5.new(password).hexdigest()
+               md5pwd = hashlib.md5(password).hexdigest()
                params = {'login': login, 'password': md5pwd}
                
                result = self._callRemote('authenticate', params)
@@ -312,7 +312,7 @@ class GrooveAPI:
                if 'result' in result and 'SongID' in result['result']:
                        info = result['result']
                        if 'CoverArtFilename' in info and info['CoverArtFilename'] != None:
-                               info['CoverArtFilename'] = THUMB_URL+info['CoverArtFilename'].encode('ascii', 'ignore')
+                               info['CoverArtFilename'] = THUMB_URL+info['CoverArtFilename'].encode('utf8', 'ignore')
                        else:
                                info['CoverArtFilename'] = 'None'
                        return info
@@ -397,14 +397,14 @@ class GrooveAPI:
                items = self._callRemote("getSimilarArtists", {"artistID": artistId, "limit": limit})
                if 'result' in items:
                        i = 0
-                       list = []
+                       itemList = []
                        artists = items['result']['artists']
                        while(i < len(artists)):
                                s = artists[i]
-                               list.append([s['artistName'].encode('ascii', 'ignore'),\
+                               itemList.append([s['artistName'].encode('utf8', 'ignore'),\
                                s['artistID']])
                                i = i + 1
-                       return list
+                       return itemList
                else:
                        return []               
        
@@ -443,7 +443,7 @@ class GrooveAPI:
        def _parseSongs(self, items, limit=0):
                if 'result' in items:
                        i = 0
-                       list = []
+                       itemList = []
                        index = ''
                        l = -1
                        try:
@@ -481,22 +481,26 @@ class GrooveAPI:
                                        info = self.getSongsInfo(s['SongID'])
                                        coverart = info['CoverArtFilename']
                                elif s['CoverArtFilename'] != None:
-                                       coverart = THUMB_URL+s['CoverArtFilename'].encode('ascii', 'ignore')
+                                       coverart = THUMB_URL+s['CoverArtFilename'].encode('utf8', 'ignore')
                                else:
                                        coverart = 'None'
                                if 'Name' in s:
                                        name = s['Name']
                                else:
                                        name = s['SongName']
-                               list.append([name.encode('ascii', 'ignore'),\
+                               if 'AlbumName' in s:
+                                       albumName = s['AlbumName']
+                               else:
+                                       albumName = ""
+                               itemList.append([name.encode('utf8', 'ignore'),\
                                s['SongID'],\
-                               s['AlbumName'].encode('ascii', 'ignore'),\
+                               albumName.encode('utf8', 'ignore'),\
                                s['AlbumID'],\
-                               s['ArtistName'].encode('ascii', 'ignore'),\
+                               s['ArtistName'].encode('utf8', 'ignore'),\
                                s['ArtistID'],\
                                coverart])
                                i = i + 1
-                       return list
+                       return itemList
                else:
                        return []
 
@@ -504,14 +508,14 @@ class GrooveAPI:
        def _parseArtists(self, items):
                if 'result' in items:
                        i = 0
-                       list = []
+                       itemList = []
                        artists = items['result']['artists']
                        while(i < len(artists)):
                                s = artists[i]
-                               list.append([s['ArtistName'].encode('ascii', 'ignore'),\
+                               itemList.append([s['ArtistName'].encode('utf8', 'ignore'),\
                                s['ArtistID']])
                                i = i + 1
-                       return list
+                       return itemList
                else:
                        return []
 
@@ -519,7 +523,7 @@ class GrooveAPI:
        def _parseAlbums(self, items, limit=0):
                if 'result' in items:
                        i = 0
-                       list = []
+                       itemList = []
                        try:
                                albums = items['result']['albums']
                        except:
@@ -530,23 +534,27 @@ class GrooveAPI:
                                l = limit
                        while(i < l):
                                s = albums[i]
+                               if 'Name' in s:
+                                       name = s['Name'].encode('utf8', 'ignore')
+                               else:
+                                       name = s['AlbumName'].encode('utf8', 'ignore')
                                if 'CoverArtFilename' in s and s['CoverArtFilename'] != None:
-                                       coverart = THUMB_URL+s['CoverArtFilename'].encode('ascii', 'ignore')
+                                       coverart = THUMB_URL+s['CoverArtFilename'].encode('utf8', 'ignore')
                                else:
                                        coverart = 'None'
-                               list.append([s['ArtistName'].encode('ascii', 'ignore'),\
+                               itemList.append([s['ArtistName'].encode('utf8', 'ignore'),\
                                s['ArtistID'],\
-                               s['AlbumName'].encode('ascii', 'ignore'),\
+                               name,\
                                s['AlbumID'],\
                                coverart])
                                i = i + 1
-                       return list
+                       return itemList
                else:
                        return []
 
        def _parsePlaylists(self, items):
                i = 0
-               list = []
+               itemList = []
                if 'result' in items:
                        playlists = items['result']['playlists']
                elif len(items) > 0:
@@ -556,6 +564,6 @@ class GrooveAPI:
 
                while (i < len(playlists)):
                        s = playlists[i]
-                       list.append([unicode(s['PlaylistName']).encode('utf8', 'ignore'), s['PlaylistID']])
+                       itemList.append([unicode(s['PlaylistName']).encode('utf8', 'ignore'), s['PlaylistID']])
                        i = i + 1
-               return list
+               return itemList