The branch, dharma-pre has been updated
       via  560867bb898debd1d3dde2c698a1c6ac0b7f244e (commit)
      from  7bab9a52a7d7caf73131024c3cddf1d95175470d (commit)

- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=560867bb898debd1d3dde2c698a1c6ac0b7f244e

commit 560867bb898debd1d3dde2c698a1c6ac0b7f244e
Author: amet <a...@nospam>
Date:   Sat Oct 16 20:08:47 2010 +0400

    0.2.9:
     - Fixed: Login works again after changes in the API.
     - Added: Added Korean translation. Thanks neurostar.
     - Added: Exit button in menu.

diff --git a/script.audio.grooveshark/GrooveShark.py 
b/script.audio.grooveshark/GrooveShark.py
index b801802..0520c32 100644
--- a/script.audio.grooveshark/GrooveShark.py
+++ b/script.audio.grooveshark/GrooveShark.py
@@ -37,10 +37,12 @@ class GrooveClass(xbmcgui.WindowXML):
        STATE_LIST_SIMILAR_ARTISTS = 12
        STATE_LIST_SIMILAR = 13
        STATE_LIST_BROWSE_ALBUM_FOR_SONG = 14
+       STATE_LIST_NOW_PLAYING = 15
+
        if __isXbox__ == True:
-               SEARCH_LIMIT = 25 # To high a number and getting thumbnails 
takes forever
+               SEARCH_LIMIT = 250 # To high a number and getting thumbnails 
takes forever. FIXME: Thumbs are disabled for now
        else:
-               SEARCH_LIMIT = 0
+               SEARCH_LIMIT = 250
 
        RADIO_PLAYLIST_LENGTH = 5
 
@@ -104,21 +106,29 @@ class GrooveClass(xbmcgui.WindowXML):
                        pass
  
        def onClick(self, control):
+               self.debug('onClick: ' + str(control))
                if control == 1006: # Save queue
-                       protocol = 'plugin://' + __scriptid__ + '/?playSong'
-                       songList = []
-                       n = self.xbmcPlaylist.size()
-                       for i in range(n):
-                               url = self.xbmcPlaylist[i].getfilename()
-                               parts = url.split('=')
-                               if len(parts) == 2:
-                                       if parts[0] == protocol:
-                                               if parts[1] != '':
-                                                       
songList.append(parts[1])
-                       if len(songList) > 0:
-                               self.savePlaylist(songList = songList)
+                       if __isXbox__ == True:
+                               if len(self.nowPlayingList) > 0:
+                                       songList = []
+                                       for song in self.nowPlayingList:
+                                               songList.append(song[1])
+                                       self.savePlaylist(songList = songList)
                        else:
-                               
self.message(__language__(3045),__language__(3011)) #Didn't find any 
GrooveShark material in the queue
+                               protocol = 'plugin://' + __scriptid__ + 
'/?playSong'
+                               songList = []
+                               n = self.xbmcPlaylist.size()
+                               for i in range(n):
+                                       url = self.xbmcPlaylist[i].getfilename()
+                                       parts = url.split('=')
+                                       if len(parts) == 2:
+                                               if parts[0] == protocol:
+                                                       if parts[1] != '':
+                                                               
songList.append(parts[1])
+                               if len(songList) > 0:
+                                       self.savePlaylist(songList = songList)
+                               else:
+                                       
self.message(__language__(3045),__language__(3011)) #Didn't find any 
GrooveShark material in the queue
 
                if control == 1002:
                        self.playlistHasFocus()
@@ -132,10 +142,9 @@ class GrooveClass(xbmcgui.WindowXML):
                                
self.setStateListDown(GrooveClass.STATE_LIST_SEARCH, reset = True, query = text)
                elif control == 1001:
                        if __isXbox__ == True:
-                               pass
+                               
self.setStateListDown(GrooveClass.STATE_LIST_NOW_PLAYING, reset = True)
                        else:
                                wId = xbmcgui.getCurrentWindowId()
-                               print 'wId: ' + str(wId) + ', self: ' + 
str(self)
                                gWin = xbmcgui.Window(wId)
                                pWin = xbmcgui.Window(10500)
                                
self.location[len(self.location)-1]['itemFocused'] = 
self.getCurrentListPosition() # Make sure we end up at the index when the 
playlist is close and the __init__ is run again for the class
@@ -154,6 +163,9 @@ class GrooveClass(xbmcgui.WindowXML):
                        self.getPopular()
                elif control == 1005:
                        __settings__.openSettings()
+               elif control == 1007: #Exit
+                       self.saveState()
+                       self.close()
                elif control == 2001: #Prev
                        self.playPrevSong()
                elif control == 2002: #Stop
@@ -205,6 +217,13 @@ class GrooveClass(xbmcgui.WindowXML):
                                
self.setStateListUp(GrooveClass.STATE_LIST_SEARCH)
                        else:
                                self.showOptionsSearch(self.searchResultSongs, 
withBrowse = True)
+
+               elif self.stateList == GrooveClass.STATE_LIST_NOW_PLAYING:
+                       if n == 0:
+                               
self.setStateListDown(GrooveClass.STATE_LIST_SEARCH, reset = True)
+                       else:
+                               self.showOptionsNowPlaying(self.nowPlayingList)
+
                elif self.stateList == GrooveClass.STATE_LIST_ARTISTS:
                        if n == 0:
                                
self.setStateListUp(GrooveClass.STATE_LIST_SEARCH)
@@ -288,6 +307,10 @@ class GrooveClass(xbmcgui.WindowXML):
                        else:
                                self.showOptionsSearch(self.songs)
 
+       def debug(self, msg):
+               if __debugging__ == True:
+                       print 'GrooveShark: ' + str(msg)
+
        def initVars(self):
                self.stateList = GrooveClass.STATE_LIST_EMPTY
                self.searchResultSongs = []
@@ -300,6 +323,7 @@ class GrooveClass(xbmcgui.WindowXML):
                self.playlist = []
                self.similarSongs = []
                self.similarArtists = []
+               self.nowPlayingList = []
                self.playlistId = 0
                self.playlistName = 'Unsaved'
                self.searchText = ""
@@ -308,23 +332,24 @@ class GrooveClass(xbmcgui.WindowXML):
                self.location = []
                if __isXbox__ == True:
                        self.dataDir = 'script_data'
+                       dataRoot = os.path.join('special://profile/', 
self.dataDir)
+                       if os.path.exists(dataRoot) == False:
+                               os.mkdir(dataRoot)
                else:
                        self.dataDir = 'addon_data'
+               self.confDir = os.path.join('special://profile/', self.dataDir, 
__scriptid__)
+
                self.cacheDir = os.path.join('special://profile/', 
self.dataDir, __scriptid__)
                if os.path.exists(self.cacheDir) == False:
                        os.mkdir(self.cacheDir)         
                self.cacheDir = os.path.join('special://profile/', 
self.dataDir, __scriptid__, 'cache')
                if os.path.exists(self.cacheDir) == False:
                        os.mkdir(self.cacheDir)
-               self.confDir = os.path.join('special://profile/', self.dataDir, 
__scriptid__)
                self.nowPlaying = -1
                self.defaultArtTinyUrl = 
'http://beta.grooveshark.com/webincludes/img/defaultart/album/tdefault.png'
                self.defaultArtSmallUrl = 
'http://beta.grooveshark.com/webincludes/img/defaultart/album/sdefault.png'
                self.defaultArtMediumUrl = 
'http://beta.grooveshark.com/webincludes/img/defaultart/album/mdefault.png'
                self.itemsPrPage = 10
-               self.listPos = [0]
-               for i in range(GrooveClass.STATE_LIST_BROWSE_ALBUM_FOR_SONG):
-                       self.listPos.append(0)
 
        def saveState(self):                    
                try:
@@ -366,12 +391,12 @@ class GrooveClass(xbmcgui.WindowXML):
                        self.playlistName,\
                        self.searchText,\
                        self.rootDir,\
-                       self.location = pickle.load(f)
+                       self.location,\
+                       self.nowPlayingList = pickle.load(f)
                        f.close()
                        return True
                except:
-                       print "An unknown error occured reloading state: " + 
str(sys.exc_info()[0])
-                       traceback.print_exc()
+                       self.debug(str(sys.exc_info()[0]))
                        return False
                        pass            
 
@@ -392,7 +417,8 @@ class GrooveClass(xbmcgui.WindowXML):
                self.playlistName,\
                self.searchText,\
                self.rootDir,\
-               self.location)
+               self.location,\
+               self.nowPlayingList)
 
        def listMenu(self):
                n = self.getCurrentListPosition()
@@ -408,6 +434,9 @@ class GrooveClass(xbmcgui.WindowXML):
                elif self.stateList == GrooveClass.STATE_LIST_SONGS:
                        self.listSongs(self.searchResultSongs)
 
+               elif self.stateList == GrooveClass.STATE_LIST_NOW_PLAYING:
+                       self.listSongs(self.nowPlayingList)
+
                elif self.stateList == GrooveClass.STATE_LIST_ARTISTS:
                        self.listArtists(self.searchResultArtists)
                                
@@ -459,10 +488,9 @@ class GrooveClass(xbmcgui.WindowXML):
                self.playlistHasFocus()
 
        def setStateListDown(self, state, query = '', reset = False, folderName 
= '', truncate = True):
-               print 'Down, stateList: ' + str(self.stateList)
-               print 'Down, New state: ' + str(state)
+               self.debug('Down, stateList: ' + str(self.stateList))
+               self.debug('Down, New state: ' + str(state))
                self.prevState = self.stateList
-               self.listPos[self.stateList] = self.getCurrentListPosition()
                self.stateList = state
                if reset == True:
                        self.location = []
@@ -476,9 +504,8 @@ class GrooveClass(xbmcgui.WindowXML):
                self.listMenu()
 
        def setStateListUp(self, state = -1):
-               print 'Up, stateList: ' + str(self.stateList)
-               print 'Up, New state: ' + str(state)
-               self.listPos[self.stateList] = 0                
+               self.debug('Up, stateList: ' + str(self.stateList))
+               self.debug('Up, New state: ' + str(state))
                if state == -1:
                        self.stateList = self.prevState
                else:
@@ -533,6 +560,9 @@ class GrooveClass(xbmcgui.WindowXML):
                elif state == GrooveClass.STATE_LIST_BROWSE_ALBUM_FOR_SONG:
                        name = self.searchResultSongs[n-1][3] + ' ' + 
__language__(3006) + ' ' + self.searchResultSongs[n-1][6] #Album by artist
 
+               elif state == GrooveClass.STATE_LIST_NOW_PLAYING:
+                       name =  __language__(107) #Now playing
+
                else:
                        name = '*unknown name*'
 
@@ -577,6 +607,18 @@ class GrooveClass(xbmcgui.WindowXML):
                else:
                        pass
 
+       def showOptionsNowPlaying(self, songs):
+               items = [__language__(102),__language__(113)]
+               result = gSimplePopup(title='', items=items, width=200)
+
+               n = self.getCurrentListPosition()-1
+               if result == 0: #Play
+                       self.playSong(n)
+
+               elif result == 1: #Remove song
+                       self.nowPlayingList.pop(n)
+                       self.listMenu()
+
        def showOptionsSearch(self, songs, withBrowse = False):
                items = 
[__language__(102),__language__(101),__language__(103),__language__(104), 
__language__(119)]
                if withBrowse == True:
@@ -585,25 +627,27 @@ class GrooveClass(xbmcgui.WindowXML):
 
                if result == 1: #Queue
                        n = self.getCurrentListPosition()-1
-                       #self.playlist.append(songs[n-1])
                        self.queueSong(songs[n])
 
                elif result == 0: #Play
                        n = self.getCurrentListPosition()-1
-                       #self.playlist = songs
-                       #self.playSong(n, offset=-1)
-                       #Playlist.PlayOffset
                        self.playSongs(songs, n)
 
                elif result == 2: #Queue all
-                       #if __isXbox__ == True:
-                       #       l = len(songs)
-                       #       for n in range(0, l):
-                       #               self.playlist.append(songs[n])
-                       #else:
                        self.queueSongs(songs)
                                
                elif result == 3: #Add to playlist
+                       if self.gs.loggedInStatus() != 1:
+                               result = self.login()
+                               if result == 1:
+                                       pass
+                               elif result == -1:
+                                       return None
+                               elif result == -2:
+                                       
self.message(__language__(3028),__language__(3029))
+                                       return None
+                               else:
+                                       return None
                        items = []
                        b = busy()
                        playlists = self.gs.userGetPlaylists(limit=150)
@@ -611,6 +655,8 @@ class GrooveClass(xbmcgui.WindowXML):
                        while (i < len(playlists)):
                                items.append(playlists[i][0])
                                i += 1
+                       b.close()
+                       del b
                        result = gShowPlaylists(playlists=items,options=[])
                        action = result[0]
                        selected = result[1]
@@ -619,8 +665,7 @@ class GrooveClass(xbmcgui.WindowXML):
                                n = self.getCurrentListPosition()
                                songId = songs[n-1][1]
                                self.gs.playlistAddSong(pId, songId, 0)
-                       b.close()
-                       del b
+
                elif result == 4: #Similar
                        b = busy()
                        try:
@@ -650,25 +695,17 @@ class GrooveClass(xbmcgui.WindowXML):
 
        def showOptionsPlaylist(self):
                items = 
[__language__(102),__language__(101),__language__(103),__language__(113),__language__(114),__language__(115)]
-               if __isXbox__:
-                       items.append(__language__(116))
+#              if __isXbox__:
+#                      items.append(__language__(116))
                result = gSimplePopup(title='', items=items, width=200)
                n = self.getCurrentListPosition()-1
                if result == 0: #Play
                        self.playSongs(self.playlist, n)
-                       #self.nowPlaying = self.getCurrentListPosition()-1
-                       #self.playSong(self.nowPlaying, offset=0)
 
                if result == 1: #Queue
-                       #self.playlist.append(songs[n-1])
                        self.queueSong(self.playlist[n])
 
                elif result == 2: #Queue all
-                       #if __isXbox__ == True:
-                       #       l = len(songs)
-                       #       for n in range(0, l):
-                       #               self.playlist.append(songs[n])
-                       #else:
                        self.queueSongs(self.playlist)
 
                elif result == 3: #Remove
@@ -684,20 +721,23 @@ class GrooveClass(xbmcgui.WindowXML):
                elif result == 5: # Save As
                        self.savePlaylist()
 
-               elif result == 6: #Close playlist
+               elif result == 6: #Close playlist FIXME: Does it make sense to 
keep it?
                        self.closePlaylist()
                else:
                        pass
 
        def playSongs(self, songs, n):
-               self.xbmcPlaylist.clear()
-               xbmc.Player().stop()
+               if __isXbox__ == True:
+                       self.nowPlayingList = []
+               else:
+                       self.xbmcPlaylist.clear()
+                       xbmc.Player().stop()
                self.queueSongs(songs)
                self.playSong(n)
 
        def queueSong(self, song, i = -1):
                if __isXbox__ == True: #FIXME
-                       pass
+                       self.nowPlayingList.append(song)
                else:
                        if i < 0:
                                n = self.xbmcPlaylist.size()
@@ -793,6 +833,7 @@ class GrooveClass(xbmcgui.WindowXML):
                try:
                        return self.gs.songGetSimilar(songId, 
GrooveClass.SEARCH_LIMIT)
                except:
+                       return []
                        traceback.print_exc()
                        pass
 
@@ -870,7 +911,7 @@ class GrooveClass(xbmcgui.WindowXML):
                self.addItem(item)
                item = xbmcgui.ListItem (label=__language__(3025), 
label2=str(len(albums)) + ' ' + __language__(3026), thumbnailImage=path)        
             
                self.addItem(item)
-               item = xbmcgui.ListItem (label=__language__(3042), 
label2=str(len(playlists)) + ' ' + __language__(3026), thumbnailImage=path) 
#FIXME
+               item = xbmcgui.ListItem (label=__language__(3042), 
label2=str(len(playlists)) + ' ' + __language__(3026), thumbnailImage=path)
                self.addItem(item)
                p = self.getPositionForLocation()
                self.setCurrentListPosition(p)
@@ -1031,9 +1072,11 @@ class GrooveClass(xbmcgui.WindowXML):
                                self.playlist.pop(0)
                                
self.playlist.append(self.gs.radioGetNextSong()[0])
 
-       def playSong(self, n, offset=0):
+       def playSong(self, n, offset=0, timesCalled = 0):
+               if timesCalled > 10:
+                       print 'GrooveShark: Gving up in playSong()'
+                       return 0
                # Missing some sort of fallback mechanism if playback fails. 
'playbackStarted' from callback func. from player might come in handy for this
-               p = n+offset            
                #if self.gs.radioTurnedOn() == 1:
                #       self.newRadioPlaylist(createFromNumber = p)
                #       p = 0
@@ -1043,34 +1086,35 @@ class GrooveClass(xbmcgui.WindowXML):
                        # Using xbmc.Player().PlaySelected(n) locks up the 
script. So use this workaround
                        xbmc.Player().stop()
                        xbmc.executebuiltin('XBMC.Playlist.PlayOffset(music,' + 
str(n) + ')')
-                       return
-               songId = self.playlist[p][1]
-               title = self.playlist[p][0]
-               albumId = self.playlist[p][4]
-               artist = self.playlist[p][6]
-               imgUrl = self.playlist[p][9] # Medium image
+                       return 1
+               p = n+offset
+               songId = self.nowPlayingList[p][1]
+               title = self.nowPlayingList[p][0]
+               albumId = self.nowPlayingList[p][4]
+               artist = self.nowPlayingList[p][6]
+               imgUrl = self.nowPlayingList[p][9] # Medium image
                self.nowPlaying = p
                try:
-                       path = imgUrl
-                       listItem = xbmcgui.ListItem('music', 
thumbnailImage=imgUrl, iconImage=imgUrl)
+                       path = self.getThumbPath([self.nowPlayingList[p][1], 
self.nowPlayingList[p][8]])
+                       listItem = xbmcgui.ListItem('music', 
thumbnailImage=path, iconImage=path)
                        listItem.setInfo( type = 'music', infoLabels = { 
'title': title, 'artist': artist } )
                        url = self.gs.getStreamURL(str(songId))
                        if url != "":
                                self.setPlayerLabel('Buffering...')
                                res = self.player.play(str(url), listItem)
-                               self.setPlayingNow(self.playlist[p])
-                               
self.setPlayingNext(self.playlist[self.getNextSongNumber()])
+                               self.setPlayingNow(self.nowPlayingList[p])
+                               
self.setPlayingNext(self.nowPlayingList[self.getNextSongNumber()])
                                print 'Player says: ' + str(res)
                                return 1
                        else:
-                               print 'Didn\'t receive an URL for: ' + 
str(self.playlist[p])
+                               print 'Didn\'t receive an URL for: ' + 
str(self.nowPlayingList[p])
+                               self.playNextSong(timesCalled = timesCalled + 1)
                                return 0
                except:
                        xbmc.log('GrooveShark Exception (playSong): ' + 
str(sys.exc_info()[0]))
                        traceback.print_exc()
                        self.setPlayerLabel('Playback failed')
                        print 'Playback failed'
-                       self.showPlayButton()
                        return 0
                        
        def setPlaying(self, song, labelId=0, imgId=0, title=''):
@@ -1090,12 +1134,13 @@ class GrooveClass(xbmcgui.WindowXML):
        def setPlayingNext(self, song):
                self.setPlaying(song, labelId=4001, imgId=9002, title='Playing 
Next')
        
-       def playNextSong(self):
+       def playNextSong(self, timesCalled = 0):
                if __isXbox__ == True:
                        # Try to play the next song on the current playlist
                        if self.nowPlaying != -1:
                                n = self.getNextSongNumber()
-                               #self.nowPlaying = n
+                               self.nowPlaying = n
+                               print 'Next song is number: ' + str(n)
                                self.playSong(n, offset=0)
                        else:
                                self.setPlayerLabel('')
@@ -1103,7 +1148,7 @@ class GrooveClass(xbmcgui.WindowXML):
                        pass
 
        def getNextSongNumber(self):
-               n = len(self.playlist)-1
+               n = len(self.nowPlayingList)-1
                if n > 0:
                        if (self.nowPlaying + 1) > n:
                                return 0
@@ -1134,9 +1179,6 @@ class GrooveClass(xbmcgui.WindowXML):
                # Stop playback
                if self.player.isPlayingAudio():
                        self.player.stop()
-                       #self.setPlayerLabel('')
-
-               #self.showPlayButton()
                                        
        def playPause(self):
                if self.player.isPlayingAudio():
@@ -1149,16 +1191,12 @@ class GrooveClass(xbmcgui.WindowXML):
                ret = ""
        
                keyboard = xbmc.Keyboard(default, title)
-               #keyboard = GrooveKeyboard(default, title)
                keyboard.setHiddenInput(hidden)
-               g = getTextThread(keyboard, self.rootDir)
-               g.start()
                keyboard.doModal()
-               g.closeThread()
                if keyboard.isConfirmed():
                        ret = keyboard.getText()
-
                return ret
+
        def loginBasic(self):
                return self.login(1)
 
@@ -1174,7 +1212,7 @@ class GrooveClass(xbmcgui.WindowXML):
                                if basic == 1:
                                        self.userId = 
self.gs.loginBasic(username, password)
                                else:
-                                       self.userId = self.gs.login(username, 
password)
+                                       self.userId = 
self.gs.loginExt(username, password)
 
                                if self.userId != 0:
                                        b.close()
@@ -1193,7 +1231,7 @@ class GrooveClass(xbmcgui.WindowXML):
                                result = dialog.yesno('Failed to login', 
'Exceeded number of allowed authentication tokens.','Try plain text 
authentication?')
                                traceback.print_exc()
                                if result == True:
-                                       self.loginBasic()
+                                       self.login()
                                else:
                                        pass
                        except:
@@ -1207,7 +1245,7 @@ class GrooveClass(xbmcgui.WindowXML):
 
        def showPlaylists(self):
                if self.gs.loggedInStatus() != 1:
-                       result = self.loginBasic()
+                       result = self.login()
                        if result == 1:
                                pass
                        elif result == -1:
@@ -1252,9 +1290,9 @@ class GrooveClass(xbmcgui.WindowXML):
                                        if name != '':
                                                if 
self.gs.playlistRename(playlists[n][1], name) == 0:
                                                        
self.message(__language__(3031), __language__(3011))
-                                       self.showPlaylists()
                                        b.close()
                                        del b
+                                       self.showPlaylists()
                                except:
                                        b.close()
                                        del b
@@ -1272,13 +1310,13 @@ class GrooveClass(xbmcgui.WindowXML):
                                                        self.closePlaylist()
                                        else:
                                                pass
-                                       self.showPlaylists()
                                        b.close()
                                        del b
+                                       self.showPlaylists()
                                except:
+                                       traceback.print_exc()
                                        b.close()
                                        del b
-                                       traceback.print_exc()
                                        self.message(__language__(3044), 
__language__(3011)) #Could not delete the playlist
 
                        elif action == 3: #Radio
@@ -1314,7 +1352,7 @@ class GrooveClass(xbmcgui.WindowXML):
        def savePlaylist(self, playlistId = 0, name = '', about = '', songList 
= []):
                try:
                        if self.gs.loggedInStatus() != 1:
-                               result = self.loginBasic()
+                               result = self.login()
                                if result == 1:
                                        pass
                                elif result == -1:
@@ -1380,6 +1418,7 @@ class GrooveClass(xbmcgui.WindowXML):
                return fileNames
                
        def getThumbs(self, items, prefix=''):
+               return
                #print 'Songs: ' + str(songs)
                data=None 
                headers={}
diff --git a/script.audio.grooveshark/addon.xml 
b/script.audio.grooveshark/addon.xml
index cdbdc97..2b473e2 100644
--- a/script.audio.grooveshark/addon.xml
+++ b/script.audio.grooveshark/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="script.audio.grooveshark"
        name="GrooveShark"
-       version="0.2.8"
+       version="0.2.9"
        provider-name="Solver">
   <requires>
     <import addon="xbmc.python" version="1.0"/>
@@ -18,9 +18,11 @@
     <summary lang="en">Grooveshark client</summary>
     <summary lang="da">Klient til Grooveshark</summary>
     <summary lang="hu">Grooveshark.com zenék, rádiók</summary>
+    <summary lang="ko">그루브샤크 클라이언트</summary>
     <description lang="en">The script gives you access to Grooveshark and 
almost all of its contents. Access your playlist, manipulate them and create 
new ones. Enjoy.</description>
     <description lang="da">Få adgang til næsten alt hvad Grooveshark har at 
byde på. Brug dine playlist, ændr og lav nye. God fornøjelse.</description>
     <description lang="hu">A program elérést biztosít a Grooveshark.com-hoz 
és majdnem minden tartalmához. Elérheted vele a lejátszási listáid, 
szerkesztheted őket, újakat hozhatsz létre. Élvezd!</description>
     <description lang="sv">Få tillgång till nästan allt som Grooveshark har 
att erbjuda. Tillgång till dina spellistor, ändra och lägg till nya. Mycket 
nöje.</description>
+    <description lang="ko">이 스크립트는 Grooveshark의 거의 모든 
컨텐츠를 사용할수 있게 해줍니다. 플레이리스트를 
이용하고 수정하고 만들수 있습니다. </description>
   </extension>
 </addon>
diff --git a/script.audio.grooveshark/changelog.txt 
b/script.audio.grooveshark/changelog.txt
index 0f7c863..c2d2cdc 100644
--- a/script.audio.grooveshark/changelog.txt
+++ b/script.audio.grooveshark/changelog.txt
@@ -1,3 +1,11 @@
+0.2.9:
+
+ - Fixed: Login works again after changes in the API.
+
+ - Added: Added Korean translation. Thanks neurostar.
+
+ - Added: Exit button in menu.
+
 0.2.8:
 
  - New feature: Search makes suggestions for songs, artists, and albums to 
speed up text entry. Based on AcclaimedMusic.net and the most played tracks on 
last.fm.
diff --git a/script.audio.grooveshark/default.py 
b/script.audio.grooveshark/default.py
index c956afe..439dfc4 100644
--- a/script.audio.grooveshark/default.py
+++ b/script.audio.grooveshark/default.py
@@ -37,69 +37,83 @@ __author__ = "Solver"
 __url__ = "http://code.google.com/p/grooveshark-for-xbmc/";
 __svn_url__ = ""
 __credits__ = ""
-__version__ = "0.2.6"
+__version__ = "0.2.9"
 __XBMC_Revision__ = "31000"
 
-if (len(sys.argv) != 3):
-       try: #It's post-dharma
-               import xbmcaddon
-               __settings__ = xbmcaddon.Addon(id=__scriptid__)
-               __language__ = __settings__.getLocalizedString
-               __debugging__ = __settings__.getSetting("debug")
-               __isXbox__ = False
-               print 'GrooveShark: Initialized as a post-dharma plugin'
+try: #It's post-dharma
+       import xbmcaddon
+       __settings__ = xbmcaddon.Addon(id=__scriptid__)
+       __language__ = __settings__.getLocalizedString
+       __debugging__ = __settings__.getSetting("debug")
+       __isXbox__ = False
+       print 'GrooveShark: Initialized as a post-dharma plugin'
 
-       except: #It's an XBOX/pre-dharma
-               traceback.print_exc()
-               __settings__ = xbmc.Settings(path=os.getcwd())
-               __language__ = xbmc.Language(os.getcwd().replace( ";", "" 
)).getLocalizedString
-               __debugging__ = __settings__.getSetting("debug")
-               __isXbox__ = True
-               print 'GrooveShark: Initialized as a XBOX plugin'
+except: #It's an XBOX/pre-dharma
+       __settings__ = xbmc.Settings(path=os.getcwd())
+       __language__ = xbmc.Language(os.getcwd().replace( ";", "" 
)).getLocalizedString
+       __debugging__ = __settings__.getSetting("debug")
+       __isXbox__ = True
+       print 'GrooveShark: Initialized as a XBOX plugin'
 
-       if __name__ == "__main__":
-               from GrooveShark import *
-               w = GrooveClass("grooveshark.xml", os.getcwd(), "DefaultSkin", 
isXbox = __isXbox__)
-               w.doModal()
-               del w
-               print 'GrooveShark: Closed'
-               sys.modules.clear()
+if __debugging__ == 'true':
+       __debugging__ = True
+       print 'GrooveShark: Debugging enabled'
+else:
+       __debugging__ = False
+       print 'GrooveShark: Debugging disabled'
 
-else: #Run as a plugin to open datastreams
-       from GrooveAPI import *
-       import xbmcplugin
-       import xbmcgui
-       import traceback
-       try:
-               tools = tools()
-               tools.loadParameters(sys.argv[2])
-               gs = GrooveAPI()
-               get = tools.getCmd
-               songId = get('playSong')
-               playlist = get('playlist')
+def startGUI():
+       print "GrooveShark version " + str(__version__)
+       w = GrooveClass("grooveshark.xml", os.getcwd(), "DefaultSkin", isXbox = 
__isXbox__)
+       w.doModal()
+       del w
+       print 'GrooveShark: Closed'
+       sys.modules.clear()
 
-               if (playlist != None): # To be implemented...
-                       #listitem=xbmcgui.ListItem('Playlists')#, 
iconImage=icon, thumbnailImage=thumbnail )
-                       #listitem.addContextMenuItems( cm, replaceItems=True )
-                       #listitem.setProperty( "Folder", "true" )
-                       #xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), 
url='plugin://script.audio.grooveshark/?playSong=409361', listitem=listitem, 
isFolder=False, totalItems=1)
-                       #xbmcplugin.endOfDirectory( handle=int( sys.argv[ 1 ] 
), succeeded=True, cacheToDisc=False )
-                       pass
-               
-               elif (songId != None):
-                       print 'GrooveShark: Song ID: ' + str(songId)
-                       url = gs.getStreamURL(str(songId))
-                       if url != "":
-                               info = gs.songAbout(str(songId))
-                               
listitem=xbmcgui.ListItem(label=info['songName'], 
iconImage=info['image']['medium'], thumbnailImage=info['image']['medium'], 
path=url);
-                               listitem.setInfo(type='Music', infoLabels = { 
'title': info['songName'], 'artist': info['artistName'] , 'url':url})
-                               
xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True, 
listitem=listitem)
+if __isXbox__ == True:
+       if __name__ == "__main__":
+               from GrooveShark import *
+               startGUI()
+else: 
+       if len(sys.argv) == 3:#Run as a plugin to open datastreams
+               from GrooveAPI import *
+               import xbmcplugin
+               import xbmcgui
+               import traceback
+               try:
+                       tools = tools()
+                       tools.loadParameters(sys.argv[2])
+                       gs = GrooveAPI()
+                       get = tools.getCmd
+                       songId = get('playSong')
+                       playlist = get('playlist')
+       
+                       if (playlist != None): # To be implemented...
+                               #listitem=xbmcgui.ListItem('Playlists')#, 
iconImage=icon, thumbnailImage=thumbnail )
+                               #listitem.addContextMenuItems( cm, 
replaceItems=True )
+                               #listitem.setProperty( "Folder", "true" )
+                               
#xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), 
url='plugin://script.audio.grooveshark/?playSong=409361', listitem=listitem, 
isFolder=False, totalItems=1)
+                               #xbmcplugin.endOfDirectory( handle=int( 
sys.argv[ 1 ] ), succeeded=True, cacheToDisc=False )
+                               pass
+                       
+                       elif (songId != None):
+                               print 'GrooveShark: Song ID: ' + str(songId)
+                               url = gs.getStreamURL(str(songId))
+                               if url != "":
+                                       info = gs.songAbout(str(songId))
+                                       
listitem=xbmcgui.ListItem(label=info['songName'], 
iconImage=info['image']['medium'], thumbnailImage=info['image']['medium'], 
path=url);
+                                       listitem.setInfo(type='Music', 
infoLabels = { 'title': info['songName'], 'artist': info['artistName'] , 
'url':url})
+                                       
xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True, 
listitem=listitem)
+                               else:
+                                       
xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=False, 
listitem=None)
                        else:
                                
xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=False, 
listitem=None)
-               else:
+                               print 'Unknown command'
+               except:
                        xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), 
succeeded=False, listitem=None)
-                       print 'Unknown command'
-       except:
-               xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), 
succeeded=False, listitem=None)
-               traceback.print_exc()
+                       traceback.print_exc()
+       else:
+               if __name__ == "__main__":
+                       from GrooveShark import *
+                       startGUI()
 
diff --git a/script.audio.grooveshark/resources/language/Danish/strings.xml 
b/script.audio.grooveshark/resources/language/Danish/strings.xml
index ec18490..af85908 100644
--- a/script.audio.grooveshark/resources/language/Danish/strings.xml
+++ b/script.audio.grooveshark/resources/language/Danish/strings.xml
@@ -23,6 +23,7 @@
     <string id="118">Gem kø</string>
     <string id="119">Find lignende</string>
     <string id="120">Se denne sangs album</string>
+    <string id="121">Afslut</string>
 
     <!-- Dialogs -->
     <string id="1000">Indtast en søgning</string>
@@ -37,7 +38,7 @@
     <string id="2002">Debugging (Genstart script for at anvende)</string>
 
     <!-- Labels -->
-    <string id="3000">Start søgning efter sange eller åbn 
afspilningsliste</string>
+    <string id="3000">Start søgning efter sange eller åbn 
spilleliste</string>
     <string id="3001">AFSPILLER NU</string>
     <string id="3002">NÆSTE</string>
     <string id="3003">Sange fundet under søgningen</string>
diff --git a/script.audio.grooveshark/resources/language/English/strings.xml 
b/script.audio.grooveshark/resources/language/English/strings.xml
index b61cd90..7be1e7f 100644
--- a/script.audio.grooveshark/resources/language/English/strings.xml
+++ b/script.audio.grooveshark/resources/language/English/strings.xml
@@ -23,6 +23,7 @@
     <string id="118">Save queue</string>
     <string id="119">Find similar</string>
     <string id="120">Browse this songs album</string>
+    <string id="121">Exit</string>
 
     <!-- Dialogs -->
     <string id="1000">Enter a search phrase</string>
diff --git a/script.audio.grooveshark/resources/lib/GrooveAPI.py 
b/script.audio.grooveshark/resources/lib/GrooveAPI.py
index 7b6baa3..06fa04d 100644
--- a/script.audio.grooveshark/resources/lib/GrooveAPI.py
+++ b/script.audio.grooveshark/resources/lib/GrooveAPI.py
@@ -1,4 +1,4 @@
-import urllib2, md5, unicodedata, re, os, traceback, sys, pickle, socket
+import urllib2, md5, unicodedata, re, os, traceback, sys, pickle, socket, 
string
 from operator import itemgetter, attrgetter
 
 __scriptid__ = sys.modules[ "__main__" ].__scriptid__
@@ -141,7 +141,6 @@ class GrooveAPI:
                response = urllib2.urlopen(req)
                result = response.read()
                response.close()
-               self.debug(result)
                try:
                        result = self.simplejson.loads(result)
                        if 'fault' in result:
@@ -223,6 +222,20 @@ class GrooveAPI:
                                self.loggedIn = 1
                                return self.userId
                                
+
+       def loginExt(self, username, password):
+               if self.loggedIn == 1:
+                       return self.userId
+               token = md5.new(username.lower() + 
md5.new(password).hexdigest()).hexdigest()
+               result = self.callRemote("session.loginExt", {"username": 
username, "token": token})
+               if 'result' in result:
+                       if 'userID' in result['result']:
+                               self.loggedIn = 1
+                               self.userId = result['result']['userID']
+                               return result['result']['userID'] 
+               else:
+                       return 0
+
        def loginBasic(self, username, password):
                if self.loggedIn == 1:
                        return self.userId
@@ -234,11 +247,6 @@ class GrooveAPI:
                                return result['result']['userID'] 
                else:
                        return 0
-#              if 'fault' in result:
-#                      return 0
-#              else:
-#                      self.loggedIn = 1
-#                      return result['result']['userID']
 
        def loggedInStatus(self):
                return self.loggedIn
@@ -276,7 +284,6 @@ class GrooveAPI:
        def playlistCreate(self, name, about):
                if self.loggedIn == 1:
                        result = self.callRemote("playlist.create", {"name": 
name, "about": about})
-                       #print result
                        if 'result' in result:
                                return result['result']['playlistID']
                        else:
@@ -319,6 +326,7 @@ class GrooveAPI:
                        
        def playlistReplace(self, playlistId, songIds):
                if self.loggedIn == 1:
+                       print "######## Logged in"
                        result = self.callRemote("playlist.replace", 
{"playlistID": playlistId, "songIDs": songIds})
                        if 'fault' in result:
                                return 0
@@ -366,7 +374,6 @@ class GrooveAPI:
                        return []
                else:
                        result = self.autoplayGetNextSongEx(self.seedArtists, 
self.frowns, self.songIDsAlreadySeen, self.recentArtists)
-#                      print result
                        if 'fault' in result:
                                return []
                        else:
diff --git a/script.audio.grooveshark/resources/lib/GrooveGUI.py 
b/script.audio.grooveshark/resources/lib/GrooveGUI.py
index 34a2bb7..406e5e9 100644
--- a/script.audio.grooveshark/resources/lib/GrooveGUI.py
+++ b/script.audio.grooveshark/resources/lib/GrooveGUI.py
@@ -6,10 +6,13 @@ import pickle
 import os
 import traceback
 import threading
-from MusicSuggestions import getTextThread
 
 sys.path.append(os.path.join(os.getcwd().replace(";",""),'resources','lib'))
 __language__ = sys.modules[ "__main__" ].__language__
+__isXbox__ = sys.modules[ "__main__" ].__isXbox__
+
+if __isXbox__ == False: # MusicSuggestions is not supported fox XBOX yet
+       from MusicSuggestions import getTextThread
 
 def gShowPlaylists(playlists=[], options=[]):
 #      popup = popupList(title= 'Playlists', items=playlists, btns=options, 
width=400)
@@ -113,7 +116,6 @@ class popupBusyXml(xbmcgui.WindowXMLDialog):
        def onAction(self, action):
                #self.close()
                aId = action.getId()
-               print 'Busy closed by user: ' + str(aId)
                if aId == 10:
                        self.close()
 
@@ -544,10 +546,19 @@ class SearchXml(xbmcgui.WindowXMLDialog):
 
 class Search(object):
        def __init__(self):
-               w = SearchXml("search.xml", os.getcwd(), "DefaultSkin")
-               w.doModal()
-               self.result = w.getResult()
-               del w
+               if __isXbox__ == False:
+                       w = SearchXml("search.xml", os.getcwd(), "DefaultSkin")
+                       w.doModal()
+                       self.result = w.getResult()
+                       del w
+               else:
+                       keyboard = xbmc.Keyboard('',__language__(1000))
+                       keyboard.doModal()
+                       if keyboard.isConfirmed():
+                               ret = keyboard.getText()
+                               self.result = {'type': 'all', 'query': ret}
+                       else:
+                               self.result = None
        
        def getResult(self):
                return self.result
diff --git a/script.audio.grooveshark/resources/lib/GroovePlayer.py 
b/script.audio.grooveshark/resources/lib/GroovePlayer.py
index c41d979..f8a8667 100644
--- a/script.audio.grooveshark/resources/lib/GroovePlayer.py
+++ b/script.audio.grooveshark/resources/lib/GroovePlayer.py
@@ -10,12 +10,10 @@ class GroovePlayer(xbmc.Player):
 
        def onPlayBackStopped(self):
                self.state = 0
-               xbmc.sleep(300)
                self.function(0)
 
        def onPlayBackEnded(self):
                self.state = 0
-               xbmc.sleep(300)
                self.function(1)
 
        def onPlayBackStarted(self):
@@ -31,7 +29,6 @@ class GroovePlayer(xbmc.Player):
                self.function(4)
                
        def playnext(self):
-               xbmc.sleep(300)
                self.function(5)
                
        def isPaused(self):
diff --git a/script.audio.grooveshark/resources/lib/MusicSuggestions.py 
b/script.audio.grooveshark/resources/lib/MusicSuggestions.py
index a27ff48..9a6bbaf 100644
--- a/script.audio.grooveshark/resources/lib/MusicSuggestions.py
+++ b/script.audio.grooveshark/resources/lib/MusicSuggestions.py
@@ -4,9 +4,12 @@ import os
 import traceback
 import threading
 
-#path = os.path.abspath(os.path.join(os.getcwd(), '..', 
'script.module.pysqlite', 'lib', 'pysqlite2'))
-#sys.path.append(path)
-from pysqlite2 import dbapi2 as sqlite
+try:
+       from pysqlite2 import dbapi2 as sqlite
+       pysqlFound = True
+except:
+       pysqlFound = False
+       print "Unable to import pysqlite2. Search suggestions disabled. This 
should only happen if you've compiled from SVN and forgotten to compile 
sqlite2."
 
 __language__ = sys.modules[ "__main__" ].__language__
 
@@ -75,11 +78,14 @@ class getTextThread(threading.Thread):
                        xbmc.sleep(100)
 
        def searchDatabase(self, query):
-               db = self.db
-               songs = db.getSongs(query)
-               artists = db.getArtists(query)
-               albums = db.getAlbums(query)
-               return songs, artists, albums
+               if pysqlFound == True:
+                       db = self.db
+                       songs = db.getSongs(query)
+                       artists = db.getArtists(query)
+                       albums = db.getAlbums(query)
+                       return songs, artists, albums
+               else:
+                       return [], [], []
        
        def closeThread(self):
                self.running = 0
diff --git 
a/script.audio.grooveshark/resources/skins/DefaultSkin/720p/grooveshark.xml 
b/script.audio.grooveshark/resources/skins/DefaultSkin/720p/grooveshark.xml
index b2e5d5f..0e08afc 100644
--- a/script.audio.grooveshark/resources/skins/DefaultSkin/720p/grooveshark.xml
+++ b/script.audio.grooveshark/resources/skins/DefaultSkin/720p/grooveshark.xml
@@ -17,7 +17,7 @@
                        <posy>0</posy>

                        <height>720</height>

                        <width>1280</width>

-                       <texture>gs-bg.png</texture>    

+                       <texture>gs-bg.jpg</texture>    

                        <animation effect="fade" time="1000" start="0" 
end="100">WindowOpen</animation>

                </control>

                <control type="image">

@@ -491,7 +491,7 @@
                                <description>Background for menu</description>

                                <posx>0</posx>

                                <posy>0</posy>

-                               <height>300</height>

+                               <height>335</height>

                                <width>300</width>

                                <texture>gs-bg-leftmenu.png</texture>   

                                <visible>true </visible>                        

@@ -503,7 +503,7 @@
                                <description>Vertical label</description>

                                <width>100</width>                      

                                <posx>130</posx>

-                               <posy>95</posy>

+                               <posy>110</posy>

                                <align>center</align>

                                <aligny>center</aligny>

                                <label>MENU</label>

@@ -527,7 +527,7 @@
                                <textoffsetx>0</textoffsetx>

                                <align>center</align>

                                <aligny>center</aligny>                         
        

-                               <onup>1005</onup>

+                               <onup>1007</onup>

                                <ondown>1002</ondown>   

                                <onleft>205</onleft>

                                <onright>205</onright>

@@ -633,6 +633,26 @@
                                <onright>205</onright>

                                <font>font12</font>

                        </control>

+                       <control type="button" id="1007">

+                               <description>Exit button</description>          
                

+                               <posx>0</posx>  

+                               <posy>210</posy>

+                               <width>180</width>

+                               <height>30</height>

+                               <label>$LOCALIZE[SCRIPT121]</label>             

+                               <texturefocus>button_focus.png</texturefocus>

+                               <texturenofocus></texturenofocus>

+                               <textcolor>ffffffff</textcolor>

+                               <disabledcolor>60ffffff</disabledcolor>

+                               <textoffsetx>0</textoffsetx>

+                               <align>center</align>

+                               <aligny>center</aligny>                         
        

+                               <onup>1005</onup>

+                               <ondown>1001</ondown>   

+                               <onleft>205</onleft>

+                               <onright>205</onright>

+                               <font>font12</font>

+                       </control>

                        </control>

                </control>

 

diff --git 
a/script.audio.grooveshark/resources/skins/DefaultSkin/PAL/grooveshark.xml 
b/script.audio.grooveshark/resources/skins/DefaultSkin/PAL/grooveshark.xml
index 9bb881a..d3920e6 100644
--- a/script.audio.grooveshark/resources/skins/DefaultSkin/PAL/grooveshark.xml
+++ b/script.audio.grooveshark/resources/skins/DefaultSkin/PAL/grooveshark.xml
@@ -13,7 +13,7 @@
                        <posy>0</posy>

                        <height>576</height>

                        <width>720</width>

-                       <texture>gs-bg.png</texture>    

+                       <texture>gs-bg.jpg</texture>    

                        <animation effect="fade" time="1000" start="0" 
end="100">WindowOpen</animation>

                </control>

                <control type="image">


-----------------------------------------------------------------------

Summary of changes:
 script.audio.grooveshark/GrooveShark.py            |  217 ++++++++++++--------
 script.audio.grooveshark/addon.xml                 |    4 +-
 script.audio.grooveshark/changelog.txt             |    8 +
 script.audio.grooveshark/default.py                |  126 +++++++-----
 .../resources/language/Danish/strings.xml          |    3 +-
 .../resources/language/English/strings.xml         |    1 +
 .../resources/language/Korean/strings.xml          |   92 +++++++++
 .../resources/lib/GrooveAPI.py                     |   25 ++-
 .../resources/lib/GrooveGUI.py                     |   23 ++-
 .../resources/lib/GroovePlayer.py                  |    3 -
 .../resources/lib/MusicSuggestions.py              |   22 ++-
 .../skins/DefaultSkin/720p/grooveshark.xml         |   28 +++-
 .../skins/DefaultSkin/PAL/grooveshark.xml          |    2 +-
 .../resources/skins/DefaultSkin/media/gs-bg.jpg    |  Bin 0 -> 208356 bytes
 .../resources/skins/DefaultSkin/media/gs-bg.png    |  Bin 2372041 -> 0 bytes
 15 files changed, 376 insertions(+), 178 deletions(-)
 create mode 100644 
script.audio.grooveshark/resources/language/Korean/strings.xml
 create mode 100644 
script.audio.grooveshark/resources/skins/DefaultSkin/media/gs-bg.jpg
 delete mode 100644 
script.audio.grooveshark/resources/skins/DefaultSkin/media/gs-bg.png


hooks/post-receive
-- 
Scripts

------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly 
Flex(R) Builder(TM)) enable the development of rich applications that run
across multiple browsers and platforms. Download your free trials today!
http://p.sf.net/sfu/adobe-dev2dev
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to