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