Fixes and tidy up.
[clinton/xbmc-groove.git] / default.py
CommitLineData
2d388879 1# Copyright 2011 Stephen Denham
2
3# This file is part of xbmc-groove.
4#
5# xbmc-groove is free software: you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# xbmc-groove is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with xbmc-groove. If not, see <http://www.gnu.org/licenses/>.
17
18
f95afae7 19import urllib, sys, os, shutil, re, pickle, time, tempfile, xbmcaddon, xbmcplugin, xbmcgui, xbmc
2d388879 20
b26b96e6 21__addon__ = xbmcaddon.Addon('plugin.audio.groove')
2d388879 22__addonname__ = __addon__.getAddonInfo('name')
23__cwd__ = __addon__.getAddonInfo('path')
24__author__ = __addon__.getAddonInfo('author')
25__version__ = __addon__.getAddonInfo('version')
26__language__ = __addon__.getLocalizedString
cd937dea 27__debuggui__ = __addon__.getSetting('debug')
5e72534b 28
8817bb2e 29MODE_SEARCH_SONGS = 1
30MODE_SEARCH_ALBUMS = 2
31MODE_SEARCH_ARTISTS = 3
86f629ea 32MODE_SEARCH_ARTISTS_ALBUMS = 4
33MODE_SEARCH_PLAYLISTS = 5
97289139 34MODE_ARTIST_POPULAR = 6
35MODE_POPULAR_SONGS = 7
36MODE_FAVORITES = 8
37MODE_PLAYLISTS = 9
38MODE_ALBUM = 10
39MODE_ARTIST = 11
40MODE_PLAYLIST = 12
41MODE_SONG_PAGE = 13
052028f1 42MODE_SIMILAR_ARTISTS = 14
43MODE_SONG = 15
44MODE_FAVORITE = 16
45MODE_UNFAVORITE = 17
46MODE_MAKE_PLAYLIST = 18
47MODE_REMOVE_PLAYLIST = 19
48MODE_RENAME_PLAYLIST = 20
49MODE_REMOVE_PLAYLIST_SONG = 21
50MODE_ADD_PLAYLIST_SONG = 22
7ea6f166 51
38df1fa5 52ACTION_MOVE_LEFT = 1
7ea6f166 53ACTION_MOVE_UP = 3
54ACTION_MOVE_DOWN = 4
55ACTION_PAGE_UP = 5
56ACTION_PAGE_DOWN = 6
57ACTION_SELECT_ITEM = 7
58ACTION_PREVIOUS_MENU = 10
8817bb2e 59
86f629ea 60# Formats for track labels
61ARTIST_ALBUM_NAME_LABEL = 0
62NAME_ALBUM_ARTIST_LABEL = 1
63
f95afae7 64# Stream marking time (seconds)
65STREAM_MARKING_TIME = 30
cd937dea 66
67# Timeout
68STREAM_TIMEOUT = 30
69
c8c5206a 70# Retry URL
cd937dea 71STREAM_RETRY = STREAM_TIMEOUT/2
f95afae7 72
73songMarkTime = 0
74player = xbmc.Player()
75playTimer = None
76
2d388879 77baseDir = __cwd__
6ae708d0 78resDir = xbmc.translatePath(os.path.join(baseDir, 'resources'))
8817bb2e 79libDir = xbmc.translatePath(os.path.join(resDir, 'lib'))
80imgDir = xbmc.translatePath(os.path.join(resDir, 'img'))
2d388879 81cacheDir = os.path.join(xbmc.translatePath('special://masterprofile/addon_data/'), os.path.basename(baseDir))
7ce01be6 82thumbDirName = 'thumb'
2d388879 83thumbDir = os.path.join('special://masterprofile/addon_data/', os.path.basename(baseDir), thumbDirName)
4be42357 84
85baseModeUrl = 'plugin://plugin.audio.groove/'
e278f474 86playlistUrl = baseModeUrl + '?mode=' + str(MODE_PLAYLIST)
4be42357 87playlistsUrl = baseModeUrl + '?mode=' + str(MODE_PLAYLISTS)
88favoritesUrl = baseModeUrl + '?mode=' + str(MODE_FAVORITES)
89
b26b96e6 90searchArtistsAlbumsName = __language__(30006)
3d95dfcb 91
7ce01be6 92thumbDef = os.path.join(imgDir, 'default.tbn')
052028f1 93listBackground = os.path.join(imgDir, 'listbackground.png')
8817bb2e 94
95sys.path.append (libDir)
7ce01be6 96from GroovesharkAPI import GrooveAPI
f95afae7 97from threading import Event, Thread
7ce01be6 98
a3ad8f73 99try:
100 groovesharkApi = GrooveAPI()
cd937dea 101 groovesharkApi.setDebug(__debuggui__)
7ce01be6 102 if groovesharkApi.pingService() != True:
b26b96e6 103 raise StandardError(__language__(30007))
a3ad8f73 104except:
b26b96e6 105 dialog = xbmcgui.Dialog(__language__(30008),__language__(30009),__language__(30010))
2d388879 106 dialog.ok()
a3ad8f73 107 sys.exit(-1)
108
f95afae7 109# Mark song as playing or played
110def markSong(songid, duration):
111 global songMarkTime
112 global playTimer
113 global player
114 if player.isPlayingAudio():
115 tNow = player.getTime()
116 if tNow >= STREAM_MARKING_TIME and songMarkTime == 0:
117 groovesharkApi.markStreamKeyOver30Secs()
118 songMarkTime = tNow
119 elif duration > tNow and duration - tNow < 2 and songMarkTime >= STREAM_MARKING_TIME:
120 playTimer.cancel()
121 songMarkTime = 0
122 groovesharkApi.markSongComplete(songid)
123 else:
124 playTimer.cancel()
125 songMarkTime = 0
126
8817bb2e 127class _Info:
128 def __init__( self, *args, **kwargs ):
129 self.__dict__.update( kwargs )
e278f474 130
052028f1 131# Window dialog to select a grooveshark playlist
132class GroovesharkPlaylistSelect(xbmcgui.WindowDialog):
133
134 def __init__(self, items=[]):
135 gap = int(self.getHeight()/100)
136 w = int(self.getWidth()*0.5)
137 h = self.getHeight()-30*gap
138 rw = self.getWidth()
139 rh = self.getHeight()
140 x = rw/2 - w/2
141 y = rh/2 -h/2
142
143 self.imgBg = xbmcgui.ControlImage(x+gap, 5*gap+y, w-2*gap, h-5*gap, listBackground)
144 self.addControl(self.imgBg)
145
146 self.playlistControl = xbmcgui.ControlList(2*gap+x, y+3*gap+30, w-4*gap, h-10*gap, textColor='0xFFFFFFFF', selectedColor='0xFFFF4242', itemTextYOffset=0, itemHeight=50, alignmentY = 0)
147 self.addControl(self.playlistControl)
148
149 self.lastPos = 0
150 self.isSelecting = False
151 self.selected = -1
152 listitems = []
153 for playlist in items:
154 listitems.append(xbmcgui.ListItem(playlist[0]))
b26b96e6 155 listitems.append(xbmcgui.ListItem(__language__(30011)))
052028f1 156 self.playlistControl.addItems(listitems)
157 self.setFocus(self.playlistControl)
158 self.playlistControl.selectItem(0)
159 item = self.playlistControl.getListItem(self.lastPos)
160 item.select(True)
161
162 # Highlight selected item
163 def setHighlight(self):
164 if self.isSelecting:
165 return
166 else:
167 self.isSelecting = True
168
169 pos = self.playlistControl.getSelectedPosition()
170 if pos >= 0:
171 item = self.playlistControl.getListItem(self.lastPos)
172 item.select(False)
173 item = self.playlistControl.getListItem(pos)
174 item.select(True)
175 self.lastPos = pos
176 self.isSelecting = False
177
178 # Control - select
179 def onControl(self, control):
180 if control == self.playlistControl:
181 self.selected = self.playlistControl.getSelectedPosition()
182 self.close()
183
184 # Action - close or up/down
185 def onAction(self, action):
186 if action == ACTION_PREVIOUS_MENU:
187 self.selected = -1
188 self.close()
189 elif action == ACTION_MOVE_UP or action == ACTION_MOVE_DOWN or action == ACTION_PAGE_UP or action == ACTION_PAGE_DOWN == 6:
190 self.setFocus(self.playlistControl)
191 self.setHighlight()
f95afae7 192
193
194class PlayTimer(Thread):
195 # interval -- floating point number specifying the number of seconds to wait before executing function
196 # function -- the function (or callable object) to be executed
197
198 # iterations -- integer specifying the number of iterations to perform
199 # args -- list of positional arguments passed to function
200 # kwargs -- dictionary of keyword arguments passed to function
201
202 def __init__(self, interval, function, iterations=0, args=[], kwargs={}):
203 Thread.__init__(self)
204 self.interval = interval
205 self.function = function
206 self.iterations = iterations
207 self.args = args
208 self.kwargs = kwargs
209 self.finished = Event()
210
211 def run(self):
212 count = 0
213 while not self.finished.isSet() and (self.iterations <= 0 or count < self.iterations):
214 self.finished.wait(self.interval)
215 if not self.finished.isSet():
216 self.function(*self.args, **self.kwargs)
217 count += 1
218
219 def cancel(self):
220 self.finished.set()
221
222 def setIterations(self, iterations):
223 self.iterations = iterations
224
225
226 def getTime(self):
227 return self.iterations * self.interval
228
229
5e72534b 230class Grooveshark:
973b4c6c 231
7ea6f166 232 albumImg = xbmc.translatePath(os.path.join(imgDir, 'album.png'))
233 artistImg = xbmc.translatePath(os.path.join(imgDir, 'artist.png'))
86f629ea 234 artistsAlbumsImg = xbmc.translatePath(os.path.join(imgDir, 'artistsalbums.png'))
7ea6f166 235 favoritesImg = xbmc.translatePath(os.path.join(imgDir, 'favorites.png'))
236 playlistImg = xbmc.translatePath(os.path.join(imgDir, 'playlist.png'))
86f629ea 237 usersplaylistsImg = xbmc.translatePath(os.path.join(imgDir, 'usersplaylists.png'))
7ea6f166 238 popularSongsImg = xbmc.translatePath(os.path.join(imgDir, 'popularSongs.png'))
97289139 239 popularSongsArtistImg = xbmc.translatePath(os.path.join(imgDir, 'popularSongsArtist.png'))
7ea6f166 240 songImg = xbmc.translatePath(os.path.join(imgDir, 'song.png'))
241 defImg = xbmc.translatePath(os.path.join(imgDir, 'default.tbn'))
2254a6b5 242 fanImg = xbmc.translatePath(os.path.join(baseDir, 'fanart.png'))
8817bb2e 243
2254a6b5 244 settings = xbmcaddon.Addon(id='plugin.audio.groove')
7ce01be6 245 songsearchlimit = int(settings.getSetting('songsearchlimit'))
246 albumsearchlimit = int(settings.getSetting('albumsearchlimit'))
247 artistsearchlimit = int(settings.getSetting('artistsearchlimit'))
97289139 248 songspagelimit = int(settings.getSetting('songspagelimit'))
2254a6b5 249 username = settings.getSetting('username')
250 password = settings.getSetting('password')
5e72534b 251
38df1fa5 252 userid = 0
4be42357 253
8817bb2e 254 def __init__( self ):
255 self._handle = int(sys.argv[1])
7ce01be6 256 if os.path.isdir(cacheDir) == False:
257 os.makedirs(cacheDir)
cd937dea 258 if __debuggui__:
5e72534b 259 xbmc.log(__language__(30012) + " " + cacheDir)
164e42d8 260 artDir = xbmc.translatePath(thumbDir)
261 if os.path.isdir(artDir) == False:
3a794693 262 os.makedirs(artDir)
cd937dea 263 if __debuggui__:
5e72534b 264 xbmc.log(__language__(30012) + " " + artDir)
052028f1 265
e278f474 266 # Top-level menu
8817bb2e 267 def categories(self):
2254a6b5 268
38df1fa5 269 self.userid = self._get_login()
b738088f 270
271 # Setup
6ae708d0 272 xbmcplugin.setPluginFanart(int(sys.argv[1]), self.fanImg)
6ae708d0 273
b26b96e6 274 self._add_dir(__language__(30013), '', MODE_SEARCH_SONGS, self.songImg, 0)
275 self._add_dir(__language__(30014), '', MODE_SEARCH_ALBUMS, self.albumImg, 0)
276 self._add_dir(__language__(30015), '', MODE_SEARCH_ARTISTS, self.artistImg, 0)
3d95dfcb 277 self._add_dir(searchArtistsAlbumsName, '', MODE_SEARCH_ARTISTS_ALBUMS, self.artistsAlbumsImg, 0)
f95afae7 278 # Not supported by key
279 #self._add_dir("Search for user's playlists...", '', MODE_SEARCH_PLAYLISTS, self.usersplaylistsImg, 0)
b26b96e6 280 self._add_dir(__language__(30016), '', MODE_ARTIST_POPULAR, self.popularSongsArtistImg, 0)
281 self._add_dir(__language__(30017), '', MODE_POPULAR_SONGS, self.popularSongsImg, 0)
38df1fa5 282 if (self.userid != 0):
b26b96e6 283 self._add_dir(__language__(30018), '', MODE_FAVORITES, self.favoritesImg, 0)
284 self._add_dir(__language__(30019), '', MODE_PLAYLISTS, self.playlistImg, 0)
e278f474 285
286 # Search for songs
8817bb2e 287 def searchSongs(self):
b26b96e6 288 query = self._get_keyboard(default="", heading=__language__(30020))
7ea6f166 289 if (query != ''):
7ce01be6 290 songs = groovesharkApi.getSongSearchResults(query, limit = self.songsearchlimit)
8817bb2e 291 if (len(songs) > 0):
6ae708d0 292 self._add_songs_directory(songs)
8817bb2e 293 else:
294 dialog = xbmcgui.Dialog()
b26b96e6 295 dialog.ok(__language__(30008), __language__(30021))
8817bb2e 296 self.categories()
7ea6f166 297 else:
298 self.categories()
8817bb2e 299
e278f474 300 # Search for albums
8817bb2e 301 def searchAlbums(self):
b26b96e6 302 query = self._get_keyboard(default="", heading=__language__(30022))
7ea6f166 303 if (query != ''):
7ce01be6 304 albums = groovesharkApi.getAlbumSearchResults(query, limit = self.albumsearchlimit)
8817bb2e 305 if (len(albums) > 0):
6ae708d0 306 self._add_albums_directory(albums)
8817bb2e 307 else:
308 dialog = xbmcgui.Dialog()
b26b96e6 309 dialog.ok(__language__(30008), __language__(30023))
8817bb2e 310 self.categories()
7ea6f166 311 else:
312 self.categories()
8817bb2e 313
e278f474 314 # Search for artists
8817bb2e 315 def searchArtists(self):
b26b96e6 316 query = self._get_keyboard(default="", heading=__language__(30024))
7ea6f166 317 if (query != ''):
7ce01be6 318 artists = groovesharkApi.getArtistSearchResults(query, limit = self.artistsearchlimit)
8817bb2e 319 if (len(artists) > 0):
6ae708d0 320 self._add_artists_directory(artists)
8817bb2e 321 else:
322 dialog = xbmcgui.Dialog()
b26b96e6 323 dialog.ok(__language__(30008), __language__(30025))
8817bb2e 324 self.categories()
7ea6f166 325 else:
326 self.categories()
86f629ea 327
328 # Search for playlists
329 def searchPlaylists(self):
b26b96e6 330 query = self._get_keyboard(default="", heading=__language__(30026))
86f629ea 331 if (query != ''):
f95afae7 332 playlists = groovesharkApi.getUserPlaylistsByUsername(query)
86f629ea 333 if (len(playlists) > 0):
334 self._add_playlists_directory(playlists)
335 else:
336 dialog = xbmcgui.Dialog()
b26b96e6 337 dialog.ok(__language__(30008), __language__(30027))
86f629ea 338 self.categories()
339 else:
340 self.categories()
341
342 # Search for artists albums
3d95dfcb 343 def searchArtistsAlbums(self, artistName = None):
344 if artistName == None or artistName == searchArtistsAlbumsName:
b26b96e6 345 query = self._get_keyboard(default="", heading=__language__(30028))
99f72740 346 else:
347 query = artistName
86f629ea 348 if (query != ''):
349 artists = groovesharkApi.getArtistSearchResults(query, limit = self.artistsearchlimit)
350 if (len(artists) > 0):
351 artist = artists[0]
352 artistID = artist[1]
cd937dea 353 if __debuggui__:
5e72534b 354 xbmc.log("Found " + artist[0] + "...")
86f629ea 355 albums = groovesharkApi.getArtistAlbums(artistID, limit = self.albumsearchlimit)
356 if (len(albums) > 0):
052028f1 357 self._add_albums_directory(albums, artistID)
86f629ea 358 else:
359 dialog = xbmcgui.Dialog()
b26b96e6 360 dialog.ok(__language__(30008), __language__(30029))
86f629ea 361 self.categories()
362 else:
363 dialog = xbmcgui.Dialog()
b26b96e6 364 dialog.ok(__language__(30008), __language__(30030))
86f629ea 365 self.categories()
366 else:
367 self.categories()
368
e278f474 369 # Get my favorites
8817bb2e 370 def favorites(self):
36cc00d7 371 userid = self._get_login()
372 if (userid != 0):
7ce01be6 373 favorites = groovesharkApi.getUserFavoriteSongs()
36cc00d7 374 if (len(favorites) > 0):
052028f1 375 self._add_songs_directory(favorites, isFavorites=True)
36cc00d7 376 else:
377 dialog = xbmcgui.Dialog()
b26b96e6 378 dialog.ok(__language__(30008), __language__(30031))
36cc00d7 379 self.categories()
8817bb2e 380
e278f474 381 # Get popular songs
36cc00d7 382 def popularSongs(self):
7ce01be6 383 popular = groovesharkApi.getPopularSongsToday(limit = self.songsearchlimit)
8817bb2e 384 if (len(popular) > 0):
6ae708d0 385 self._add_songs_directory(popular)
8817bb2e 386 else:
387 dialog = xbmcgui.Dialog()
b26b96e6 388 dialog.ok(__language__(30008), __language__(30032))
8817bb2e 389 self.categories()
36cc00d7 390
e278f474 391 # Get my playlists
8817bb2e 392 def playlists(self):
393 userid = self._get_login()
394 if (userid != 0):
7ce01be6 395 playlists = groovesharkApi.getUserPlaylists()
8817bb2e 396 if (len(playlists) > 0):
6ae708d0 397 self._add_playlists_directory(playlists)
8817bb2e 398 else:
399 dialog = xbmcgui.Dialog()
b26b96e6 400 dialog.ok(__language__(30008), __language__(30033))
8817bb2e 401 self.categories()
7ea6f166 402 else:
403 dialog = xbmcgui.Dialog()
b26b96e6 404 dialog.ok(__language__(30008), __language__(30034), __language__(30035))
7ea6f166 405
e278f474 406 # Make songs a favorite
8817bb2e 407 def favorite(self, songid):
408 userid = self._get_login()
409 if (userid != 0):
cd937dea 410 if __debuggui__:
5e72534b 411 xbmc.log("Favorite song: " + str(songid))
7ce01be6 412 groovesharkApi.addUserFavoriteSong(songID = songid)
b26b96e6 413 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ', ' + __language__(30036) + ', 1000, ' + thumbDef + ')')
8817bb2e 414 else:
415 dialog = xbmcgui.Dialog()
b26b96e6 416 dialog.ok(__language__(30008), __language__(30034), __language__(30037))
052028f1 417
418 # Remove song from favorites
419 def unfavorite(self, songid, prevMode=0):
f95afae7 420 userid = self._get_login()
052028f1 421 if (userid != 0):
cd937dea 422 if __debuggui__:
5e72534b 423 xbmc.log("Unfavorite song: " + str(songid) + ', previous mode was ' + str(prevMode))
f95afae7 424 groovesharkApi.removeUserFavoriteSongs(songIDs = songid)
b26b96e6 425 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ', ' + __language__(30038) + ', 1000, ' + thumbDef + ')')
052028f1 426 # Refresh to remove item from directory
427 if (int(prevMode) == MODE_FAVORITES):
428 xbmc.executebuiltin("Container.Refresh(" + favoritesUrl + ")")
429 else:
430 dialog = xbmcgui.Dialog()
b26b96e6 431 dialog.ok(__language__(30008), __language__(30034), __language__(30039))
052028f1 432
e278f474 433
434 # Show selected album
36cc00d7 435 def album(self, albumid):
7ce01be6 436 album = groovesharkApi.getAlbumSongs(albumid, limit = self.songsearchlimit)
86f629ea 437 self._add_songs_directory(album, trackLabelFormat=NAME_ALBUM_ARTIST_LABEL)
e278f474 438
439 # Show selected artist
8817bb2e 440 def artist(self, artistid):
7ce01be6 441 albums = groovesharkApi.getArtistAlbums(artistid, limit = self.albumsearchlimit)
052028f1 442 self._add_albums_directory(albums, artistid)
8817bb2e 443
e278f474 444 # Show selected playlist
e6f8730b 445 def playlist(self, playlistid, playlistname):
8817bb2e 446 userid = self._get_login()
447 if (userid != 0):
e6f8730b 448 songs = groovesharkApi.getPlaylistSongs(playlistid)
052028f1 449 self._add_songs_directory(songs, trackLabelFormat=NAME_ALBUM_ARTIST_LABEL, playlistid=playlistid, playlistname=playlistname)
8817bb2e 450 else:
451 dialog = xbmcgui.Dialog()
b26b96e6 452 dialog.ok(__language__(30008), __language__(30034), __language__(30040))
8817bb2e 453
97289139 454 # Show popular songs of the artist
455 def artistPopularSongs(self):
b26b96e6 456 query = self._get_keyboard(default="", heading=__language__(30041))
97289139 457 if (query != ''):
458 artists = groovesharkApi.getArtistSearchResults(query, limit = self.artistsearchlimit)
459 if (len(artists) > 0):
460 artist = artists[0]
461 artistID = artist[1]
cd937dea 462 if __debuggui__:
5e72534b 463 xbmc.log("Found " + artist[0] + "...")
97289139 464 songs = groovesharkApi.getArtistPopularSongs(artistID, limit = self.songsearchlimit)
465 if (len(songs) > 0):
466 self._add_songs_directory(songs, trackLabelFormat=NAME_ALBUM_ARTIST_LABEL)
467 else:
468 dialog = xbmcgui.Dialog()
b26b96e6 469 dialog.ok(__language__(30008), __language__(30042))
97289139 470 self.categories()
471 else:
472 dialog = xbmcgui.Dialog()
b26b96e6 473 dialog.ok(__language__(30008), __language__(30043))
97289139 474 self.categories()
475 else:
476 self.categories()
477
e278f474 478 # Play a song
6ae708d0 479 def playSong(self, item):
f95afae7 480 global playTimer
481 global player
482 if item != None:
cd937dea 483 songid = self._setItem(item)
484 # Wait for play then start timer
f95afae7 485 seconds = 0
cd937dea 486 while seconds < STREAM_TIMEOUT:
f95afae7 487 try:
488 if player.isPlayingAudio() == True:
489 if playTimer != None:
490 playTimer.cancel()
491 songMarkTime = 0
492 duration = int(item.getProperty('duration'))
493 playTimer = PlayTimer(1, markSong, duration, [songid, duration])
494 playTimer.start()
495 break
496 except: pass
497 time.sleep(1)
498 seconds = seconds + 1
cd937dea 499
500 # If not playing after a few seconds try to refresh the URL
c8c5206a 501 if (seconds == STREAM_RETRY):
cd937dea 502 item.setProperty('url', '')
503 self._setItem(item)
504 self._setSongStream(songid, item.getProperty('duration'), item.getProperty('url'))
7ce01be6 505 else:
b26b96e6 506 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ', ' + __language__(30044) + ', 1000, ' + thumbDef + ')')
f95afae7 507
e278f474 508 # Make a song directory item
86f629ea 509 def songItem(self, songid, name, album, artist, coverart, trackLabelFormat=ARTIST_ALBUM_NAME_LABEL):
7ce01be6 510 songImg = self._get_icon(coverart, 'song-' + str(songid) + "-image")
2cb26bea 511 if int(trackLabelFormat) == NAME_ALBUM_ARTIST_LABEL:
86f629ea 512 trackLabel = name + " - " + album + " - " + artist
513 else:
514 trackLabel = artist + " - " + album + " - " + name
5e72534b 515 stream = self._getSongStream(songid)
516 duration = stream['duration']
517 url = stream['url']
86f629ea 518 item = xbmcgui.ListItem(label = trackLabel, thumbnailImage=songImg, iconImage=songImg)
f95afae7 519 item.setInfo( type="music", infoLabels={ "title": name, "album": album, "artist": artist, "duration": duration} )
2254a6b5 520 item.setProperty('mimetype', 'audio/mpeg')
521 item.setProperty("IsPlayable", "true")
7ce01be6 522 item.setProperty('songid', str(songid))
523 item.setProperty('coverart', songImg)
524 item.setProperty('title', name)
525 item.setProperty('album', album)
526 item.setProperty('artist', artist)
f95afae7 527 item.setProperty('duration', str(duration))
5e72534b 528 item.setProperty('url', str(url))
7ce01be6 529
6ae708d0 530 return item
2254a6b5 531
97289139 532 # Next page of songs
5e72534b 533 def songPage(self, offset, trackLabelFormat, playlistid = 0, playlistname = ''):
534 self._add_songs_directory([], trackLabelFormat, offset, playlistid = playlistid, playlistname = playlistname)
052028f1 535
536 # Make a playlist from an album
537 def makePlaylist(self, albumid, name):
f95afae7 538 userid = self._get_login()
052028f1 539 if (userid != 0):
540 re.split(' - ',name,1)
541 nameTokens = re.split(' - ',name,1) # suggested name
b26b96e6 542 name = self._get_keyboard(default=nameTokens[0], heading=__language__(30045))
052028f1 543 if name != '':
544 album = groovesharkApi.getAlbumSongs(albumid, limit = self.songsearchlimit)
545 songids = []
546 for song in album:
547 songids.append(song[1])
f95afae7 548 if groovesharkApi.createPlaylist(name, songids) == 0:
052028f1 549 dialog = xbmcgui.Dialog()
b26b96e6 550 dialog.ok(__language__(30008), __language__(30046), name)
052028f1 551 else:
b26b96e6 552 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ',' + __language__(30047)+ ', 1000, ' + thumbDef + ')')
052028f1 553 else:
554 dialog = xbmcgui.Dialog()
b26b96e6 555 dialog.ok(__language__(30008), __language__(30034), __language__(30048))
052028f1 556
557 # Rename a playlist
558 def renamePlaylist(self, playlistid, name):
f95afae7 559 userid = self._get_login()
052028f1 560 if (userid != 0):
b26b96e6 561 newname = self._get_keyboard(default=name, heading=__language__(30049))
052028f1 562 if newname == '':
563 return
f95afae7 564 elif groovesharkApi.playlistRename(playlistid, newname) == 0:
052028f1 565 dialog = xbmcgui.Dialog()
b26b96e6 566 dialog.ok(__language__(30008), __language__(30050), name)
052028f1 567 else:
568 # Refresh to show new item name
569 xbmc.executebuiltin("Container.Refresh")
570 else:
571 dialog = xbmcgui.Dialog()
b26b96e6 572 dialog.ok(__language__(30008), __language__(30034), __language__(30051))
052028f1 573
574 # Remove a playlist
575 def removePlaylist(self, playlistid, name):
576 dialog = xbmcgui.Dialog()
b26b96e6 577 if dialog.yesno(__language__(30008), name, __language__(30052)) == True:
f95afae7 578 userid = self._get_login()
052028f1 579 if (userid != 0):
f95afae7 580 if groovesharkApi.playlistDelete(playlistid) == 0:
052028f1 581 dialog = xbmcgui.Dialog()
b26b96e6 582 dialog.ok(__language__(30008), __language__(30053), name)
052028f1 583 else:
584 # Refresh to remove item from directory
585 xbmc.executebuiltin("Container.Refresh(" + playlistsUrl + ")")
586 else:
587 dialog = xbmcgui.Dialog()
b26b96e6 588 dialog.ok(__language__(30008), __language__(30034), __language__(30054))
052028f1 589
590 # Add song to playlist
591 def addPlaylistSong(self, songid):
f95afae7 592 userid = self._get_login()
052028f1 593 if (userid != 0):
594 playlists = groovesharkApi.getUserPlaylists()
595 if (len(playlists) > 0):
596 ret = 0
597 # Select the playlist
598 playlistSelect = GroovesharkPlaylistSelect(items=playlists)
599 playlistSelect.setFocus(playlistSelect.playlistControl)
600 playlistSelect.doModal()
601 i = playlistSelect.selected
602 del playlistSelect
603 if i > -1:
604 # Add a new playlist
605 if i >= len(playlists):
b26b96e6 606 name = self._get_keyboard(default='', heading=__language__(30055))
052028f1 607 if name != '':
608 songIds = []
609 songIds.append(songid)
f95afae7 610 if groovesharkApi.createPlaylist(name, songIds) == 0:
052028f1 611 dialog = xbmcgui.Dialog()
b26b96e6 612 dialog.ok(__language__(30008), __language__(30056), name)
052028f1 613 else:
b26b96e6 614 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ',' + __language__(30057) + ', 1000, ' + thumbDef + ')')
052028f1 615 # Existing playlist
616 else:
617 playlist = playlists[i]
618 playlistid = playlist[1]
cd937dea 619 if __debuggui__:
5e72534b 620 xbmc.log("Add song " + str(songid) + " to playlist " + str(playlistid))
f95afae7 621 songIDs=[]
622 songs = groovesharkApi.getPlaylistSongs(playlistid)
623 for song in songs:
624 songIDs.append(song[1])
625 songIDs.append(songid)
626 ret = groovesharkApi.setPlaylistSongs(playlistid, songIDs)
627 if ret == False:
052028f1 628 dialog = xbmcgui.Dialog()
b26b96e6 629 dialog.ok(__language__(30008), __language__(30058))
052028f1 630 else:
b26b96e6 631 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ',' + __language__(30059) + ', 1000, ' + thumbDef + ')')
052028f1 632 else:
633 dialog = xbmcgui.Dialog()
b26b96e6 634 dialog.ok(__language__(30008), __language__(30060))
052028f1 635 self.categories()
636 else:
637 dialog = xbmcgui.Dialog()
b26b96e6 638 dialog.ok(__language__(30008), __language__(30034), __language__(30061))
052028f1 639
640 # Remove song from playlist
f95afae7 641 def removePlaylistSong(self, playlistid, playlistname, songid):
e6f8730b 642 dialog = xbmcgui.Dialog()
b26b96e6 643 if dialog.yesno(__language__(30008), __language__(30062), __language__(30063)) == True:
f95afae7 644 userid = self._get_login()
052028f1 645 if (userid != 0):
f95afae7 646 songs = groovesharkApi.getPlaylistSongs(playlistID)
647 songIDs=[]
648 for song in songs:
649 if (song[1] != songid):
650 songIDs.append(song[1])
651 ret = groovesharkApi.setPlaylistSongs(playlistID, songIDs)
652 if ret == False:
052028f1 653 dialog = xbmcgui.Dialog()
b26b96e6 654 dialog.ok(__language__(30008), __language__(30064), __language__(30065))
052028f1 655 else:
656 # Refresh to remove item from directory
b26b96e6 657 xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ',' + __language__(30066)+ ', 1000, ' + thumbDef + ')')
e6f8730b 658 xbmc.executebuiltin("Container.Update(" + playlistUrl + "&id="+str(playlistid) + "&name=" + playlistname + ")")
052028f1 659 else:
660 dialog = xbmcgui.Dialog()
b26b96e6 661 dialog.ok(__language__(30008), __language__(30034), __language__(30067))
052028f1 662
663 # Find similar artists to searched artist
664 def similarArtists(self, artistId):
f95afae7 665 similar = groovesharkApi.getSimilarArtists(artistId, limit = self.artistsearchlimit)
052028f1 666 if (len(similar) > 0):
667 self._add_artists_directory(similar)
668 else:
669 dialog = xbmcgui.Dialog()
b26b96e6 670 dialog.ok(__language__(30008), __language__(30068))
052028f1 671 self.categories()
5e72534b 672
e278f474 673 # Get keyboard input
8817bb2e 674 def _get_keyboard(self, default="", heading="", hidden=False):
3cfead3c 675 kb = xbmc.Keyboard(default, heading, hidden)
676 kb.doModal()
677 if (kb.isConfirmed()):
678 return unicode(kb.getText(), "utf-8")
679 return ''
8817bb2e 680
e278f474 681 # Login to grooveshark
f95afae7 682 def _get_login(self):
2254a6b5 683 if (self.username == "" or self.password == ""):
8817bb2e 684 dialog = xbmcgui.Dialog()
b26b96e6 685 dialog.ok(__language__(30008), __language__(30069), __language__(30070))
8817bb2e 686 return 0
687 else:
38df1fa5 688 if self.userid == 0:
f95afae7 689 uid = groovesharkApi.login(self.username, self.password)
38df1fa5 690 if (uid != 0):
38df1fa5 691 return uid
8817bb2e 692 else:
693 dialog = xbmcgui.Dialog()
b26b96e6 694 dialog.ok(__language__(30008), __language__(30069), __language__(30070))
8817bb2e 695 return 0
696
e278f474 697 # Get a song directory item
86f629ea 698 def _get_song_item(self, song, trackLabelFormat):
6ae708d0 699 name = song[0]
7ce01be6 700 songid = song[1]
701 album = song[2]
702 artist = song[4]
703 coverart = song[6]
86f629ea 704 return self.songItem(songid, name, album, artist, coverart, trackLabelFormat)
6ae708d0 705
706 # File download
7ce01be6 707 def _get_icon(self, url, songid):
708 if url != 'None':
709 localThumb = os.path.join(xbmc.translatePath(os.path.join(thumbDir, str(songid)))) + '.tbn'
710 try:
711 if os.path.isfile(localThumb) == False:
712 loc = urllib.URLopener()
713 loc.retrieve(url, localThumb)
714 except:
715 shutil.copy2(thumbDef, localThumb)
716 return os.path.join(os.path.join(thumbDir, str(songid))) + '.tbn'
717 else:
718 return thumbDef
e278f474 719
cd937dea 720 # Set URL
721 def _setItem(self, item):
722 url = item.getProperty('url')
723 songid = item.getProperty('songid')
724 if url == '':
725 stream = groovesharkApi.getSubscriberStreamKey(songid)
726 url = stream['url']
727 item.setPath(url)
728 xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True, listitem=item)
729 if __debuggui__:
730 xbmc.log("Grooveshark playing: " + songid)
731 return songid
732
e278f474 733 # Add songs to directory
5e72534b 734 def _add_songs_directory(self, songs, trackLabelFormat=ARTIST_ALBUM_NAME_LABEL, offset=0, playlistid=0, playlistname='', isFavorites=False):
97289139 735
736 totalSongs = len(songs)
5e72534b 737 offset = int(offset)
738 start = 0
739 end = totalSongs
97289139 740
741 # No pages needed
5e72534b 742 if offset == 0 and totalSongs <= self.songspagelimit:
cd937dea 743 if __debuggui__:
5e72534b 744 xbmc.log("Found " + str(totalSongs) + " songs...")
97289139 745 # Pages
746 else:
5e72534b 747 # Cache all next pages songs
748 if offset == 0:
97289139 749 self._setSavedSongs(songs)
750 else:
751 songs = self._getSavedSongs()
752 totalSongs = len(songs)
753
754 if totalSongs > 0:
5e72534b 755 start = offset
756 end = min(start + self.songspagelimit,totalSongs)
97289139 757
052028f1 758 id = 0
5e72534b 759 n = start
760 items = end - start
761 while n < end:
762 song = songs[n]
6ae708d0 763 songid = song[1]
5e72534b 764 stream = self._getSongStream(songid)
765 if stream['url'] != '':
766 item = self._get_song_item(song, trackLabelFormat)
767 coverart = item.getProperty('coverart')
768 songname = song[0]
769 songalbum = song[2]
770 songartist = song[4]
771 u=sys.argv[0]+"?mode="+str(MODE_SONG)+"&name="+urllib.quote_plus(songname)+"&id="+str(songid) \
772 +"&album="+urllib.quote_plus(songalbum) \
773 +"&artist="+urllib.quote_plus(songartist) \
774 +"&coverart="+urllib.quote_plus(coverart)
775 fav=sys.argv[0]+"?mode="+str(MODE_FAVORITE)+"&name="+urllib.quote_plus(songname)+"&id="+str(songid)
776 unfav=sys.argv[0]+"?mode="+str(MODE_UNFAVORITE)+"&name="+urllib.quote_plus(songname)+"&id="+str(songid)+"&prevmode="
777 menuItems = []
778 if isFavorites == True:
779 unfav = unfav +str(MODE_FAVORITES)
780 else:
781 menuItems.append((__language__(30071), "XBMC.RunPlugin("+fav+")"))
782 menuItems.append((__language__(30072), "XBMC.RunPlugin("+unfav+")"))
783 if playlistid > 0:
784 rmplaylstsong=sys.argv[0]+"?playlistid="+str(playlistid)+"&id="+str(songid)+"&mode="+str(MODE_REMOVE_PLAYLIST_SONG)+"&name="+playlistname
785 menuItems.append((__language__(30073), "XBMC.RunPlugin("+rmplaylstsong+")"))
786 else:
787 addplaylstsong=sys.argv[0]+"?id="+str(songid)+"&mode="+str(MODE_ADD_PLAYLIST_SONG)
788 menuItems.append((__language__(30074), "XBMC.RunPlugin("+addplaylstsong+")"))
789 item.addContextMenuItems(menuItems, replaceItems=False)
790 xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,isFolder=False, totalItems=items)
791 id = id + 1
f95afae7 792 else:
5e72534b 793 end = min(end + 1,totalSongs)
cd937dea 794 if __debuggui__:
5e72534b 795 xbmc.log(song[0] + " does not exist.")
796 n = n + 1
97289139 797
5e72534b 798 if totalSongs > end:
799 u=sys.argv[0]+"?mode="+str(MODE_SONG_PAGE)+"&id=playlistid"+"&offset="+str(end)+"&label="+str(trackLabelFormat)+"&name="+playlistname
800 self._add_dir(__language__(30075) + '...', u, MODE_SONG_PAGE, self.songImg, 0, totalSongs - end)
cb06c186 801
8817bb2e 802 xbmcplugin.setContent(self._handle, 'songs')
31731635 803 xbmcplugin.setPluginFanart(int(sys.argv[1]), self.fanImg)
e278f474 804
805 # Add albums to directory
052028f1 806 def _add_albums_directory(self, albums, artistid=0):
31731635 807 n = len(albums)
5e72534b 808 itemsExisting = n
cd937dea 809 if __debuggui__:
5e72534b 810 xbmc.log("Found " + str(n) + " albums...")
8817bb2e 811 i = 0
31731635 812 while i < n:
8817bb2e 813 album = albums[i]
8817bb2e 814 albumID = album[3]
5e72534b 815 if groovesharkApi.getDoesAlbumExist(albumID):
816 albumArtistName = album[0]
817 albumName = album[2]
818 albumImage = self._get_icon(album[4], 'album-' + str(albumID))
819 self._add_dir(albumName + " - " + albumArtistName, '', MODE_ALBUM, albumImage, albumID, itemsExisting)
820 else:
821 itemsExisting = itemsExisting - 1
8817bb2e 822 i = i + 1
f95afae7 823 # Not supported by key
824 #if artistid > 0:
825 # self._add_dir('Similar artists...', '', MODE_SIMILAR_ARTISTS, self.artistImg, artistid)
8817bb2e 826 xbmcplugin.setContent(self._handle, 'albums')
827 xbmcplugin.addSortMethod(self._handle, xbmcplugin.SORT_METHOD_ALBUM_IGNORE_THE)
31731635 828 xbmcplugin.setPluginFanart(int(sys.argv[1]), self.fanImg)
e278f474 829
830 # Add artists to directory
6ae708d0 831 def _add_artists_directory(self, artists):
31731635 832 n = len(artists)
5e72534b 833 itemsExisting = n
cd937dea 834 if __debuggui__:
5e72534b 835 xbmc.log("Found " + str(n) + " artists...")
8817bb2e 836 i = 0
31731635 837 while i < n:
8817bb2e 838 artist = artists[i]
8817bb2e 839 artistID = artist[1]
5e72534b 840 if groovesharkApi.getDoesArtistExist(artistID):
841 artistName = artist[0]
842 self._add_dir(artistName, '', MODE_ARTIST, self.artistImg, artistID, itemsExisting)
843 else:
844 itemsExisting = itemsExisting - 1
8817bb2e 845 i = i + 1
846 xbmcplugin.setContent(self._handle, 'artists')
847 xbmcplugin.addSortMethod(self._handle, xbmcplugin.SORT_METHOD_ARTIST_IGNORE_THE)
31731635 848 xbmcplugin.setPluginFanart(int(sys.argv[1]), self.fanImg)
e278f474 849
850 # Add playlists to directory
6ae708d0 851 def _add_playlists_directory(self, playlists):
31731635 852 n = len(playlists)
cd937dea 853 if __debuggui__:
5e72534b 854 xbmc.log("Found " + str(n) + " playlists...")
8817bb2e 855 i = 0
31731635 856 while i < n:
8817bb2e 857 playlist = playlists[i]
858 playlistName = playlist[0]
859 playlistID = playlist[1]
86f629ea 860 dir = self._add_dir(playlistName, '', MODE_PLAYLIST, self.playlistImg, playlistID, n)
8817bb2e 861 i = i + 1
862 xbmcplugin.setContent(self._handle, 'files')
86f629ea 863 xbmcplugin.addSortMethod(self._handle, xbmcplugin.SORT_METHOD_LABEL)
31731635 864 xbmcplugin.setPluginFanart(int(sys.argv[1]), self.fanImg)
3fcef5ba 865
e278f474 866 # Add whatever directory
31731635 867 def _add_dir(self, name, url, mode, iconimage, id, items=1):
052028f1 868
97289139 869 if url == '':
870 u=sys.argv[0]+"?mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&id="+str(id)
871 else:
872 u = url
8817bb2e 873 dir=xbmcgui.ListItem(name, iconImage=iconimage, thumbnailImage=iconimage)
b738088f 874 dir.setInfo( type="Music", infoLabels={ "title": name } )
052028f1 875
876 # Custom menu items
f95afae7 877 menuItems = []
878 if mode == MODE_ALBUM:
879 mkplaylst=sys.argv[0]+"?mode="+str(MODE_MAKE_PLAYLIST)+"&name="+name+"&id="+str(id)
b26b96e6 880 menuItems.append((__language__(30076), "XBMC.RunPlugin("+mkplaylst+")"))
f95afae7 881 if mode == MODE_PLAYLIST:
882 rmplaylst=sys.argv[0]+"?mode="+str(MODE_REMOVE_PLAYLIST)+"&name="+urllib.quote_plus(name)+"&id="+str(id)
b26b96e6 883 menuItems.append((__language__(30077), "XBMC.RunPlugin("+rmplaylst+")"))
f95afae7 884 mvplaylst=sys.argv[0]+"?mode="+str(MODE_RENAME_PLAYLIST)+"&name="+urllib.quote_plus(name)+"&id="+str(id)
b26b96e6 885 menuItems.append((__language__(30078), "XBMC.RunPlugin("+mvplaylst+")"))
5e72534b 886
f95afae7 887 dir.addContextMenuItems(menuItems, replaceItems=False)
052028f1 888
31731635 889 return xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=dir,isFolder=True, totalItems=items)
97289139 890
891 def _getSavedSongs(self):
892 path = os.path.join(cacheDir, 'songs.dmp')
893 try:
894 f = open(path, 'rb')
895 songs = pickle.load(f)
896 f.close()
897 except:
898 songs = []
899 pass
900 return songs
901
902 def _setSavedSongs(self, songs):
903 try:
904 # Create the 'data' directory if it doesn't exist.
905 if not os.path.exists(cacheDir):
906 os.makedirs(cacheDir)
907 path = os.path.join(cacheDir, 'songs.dmp')
908 f = open(path, 'wb')
909 pickle.dump(songs, f, protocol=pickle.HIGHEST_PROTOCOL)
910 f.close()
911 except:
912 xbmc.log("An error occurred saving songs")
913 pass
f95afae7 914
5e72534b 915 def _getSongStream(self, songid):
f95afae7 916 id = int(songid)
f95afae7 917 duration = -1
5e72534b 918 streams = []
919 url = ''
920 path = os.path.join(cacheDir, 'streams.dmp')
f95afae7 921 try:
922 f = open(path, 'rb')
5e72534b 923 streams = pickle.load(f)
924 for song in streams:
f95afae7 925 if song[0] == id:
926 duration = song[1]
5e72534b 927 url = song[2]
928 break;
f95afae7 929 f.close()
930 except:
931 pass
932
cd937dea 933 # Not in cache but exists
5e72534b 934 if duration < 0 and groovesharkApi.getDoesSongExist(songid):
f95afae7 935 stream = groovesharkApi.getSubscriberStreamKey(songid)
5e72534b 936 url = stream['url']
f95afae7 937 usecs = stream['uSecs']
938 if usecs < 60000000:
939 usecs = usecs * 10 # Some durations are 10x to small
940 duration = usecs / 1000000
5e72534b 941 song = [id, duration, url]
942 streams.append(song)
cd937dea 943 self._setSongStreams(streams)
f95afae7 944
5e72534b 945 return {'duration':duration, 'url':url}
cd937dea 946
947 def _setSongStream(self, songid, duration, url):
948 path = os.path.join(cacheDir, 'streams.dmp')
949 try:
950 f = open(path, 'rb')
951 streams = pickle.load(f)
952 for song in streams:
953 if song[0] == songid:
954 song[1] = duration
955 song[2] = url
956 self._setSongStreams(streams)
957 break;
958 f.close()
959 except:
960 xbmc.log("An error occurred saving stream")
961 pass
5e72534b 962
cd937dea 963 def _setSongStreams(self, streams):
f95afae7 964 try:
cd937dea 965 # Create the cache directory if it doesn't exist.
f95afae7 966 if not os.path.exists(cacheDir):
967 os.makedirs(cacheDir)
5e72534b 968 path = os.path.join(cacheDir, 'streams.dmp')
f95afae7 969 f = open(path, 'wb')
5e72534b 970 pickle.dump(streams, f, protocol=pickle.HIGHEST_PROTOCOL)
f95afae7 971 f.close()
972 except:
5e72534b 973 xbmc.log("An error occurred saving streams")
f95afae7 974 pass
975
97289139 976
e278f474 977# Parse URL parameters
8817bb2e 978def get_params():
979 param=[]
980 paramstring=sys.argv[2]
cd937dea 981 if __debuggui__:
5e72534b 982 xbmc.log(paramstring)
8817bb2e 983 if len(paramstring)>=2:
984 params=sys.argv[2]
985 cleanedparams=params.replace('?','')
986 if (params[len(params)-1]=='/'):
987 params=params[0:len(params)-2]
988 pairsofparams=cleanedparams.split('&')
989 param={}
990 for i in range(len(pairsofparams)):
991 splitparams={}
992 splitparams=pairsofparams[i].split('=')
993 if (len(splitparams))==2:
994 param[splitparams[0]]=splitparams[1]
8817bb2e 995 return param
996
e278f474 997# Main
5e72534b 998grooveshark = Grooveshark();
e278f474 999
8817bb2e 1000params=get_params()
8817bb2e 1001mode=None
8817bb2e 1002try: mode=int(params["mode"])
1003except: pass
7ce01be6 1004id=0
1005try: id=int(params["id"])
1006except: pass
052028f1 1007name = None
1008try: name=urllib.unquote_plus(params["name"])
1009except: pass
e278f474 1010
1011# Call function for URL
8817bb2e 1012if mode==None:
1013 grooveshark.categories()
1014
1015elif mode==MODE_SEARCH_SONGS:
1016 grooveshark.searchSongs()
1017
1018elif mode==MODE_SEARCH_ALBUMS:
1019 grooveshark.searchAlbums()
1020
1021elif mode==MODE_SEARCH_ARTISTS:
1022 grooveshark.searchArtists()
86f629ea 1023
1024elif mode==MODE_SEARCH_ARTISTS_ALBUMS:
a2e75b14 1025 grooveshark.searchArtistsAlbums(name)
86f629ea 1026
1027elif mode==MODE_SEARCH_PLAYLISTS:
1028 grooveshark.searchPlaylists()
8817bb2e 1029
36cc00d7 1030elif mode==MODE_POPULAR_SONGS:
1031 grooveshark.popularSongs()
97289139 1032
1033elif mode==MODE_ARTIST_POPULAR:
a2e75b14 1034 grooveshark.artistPopularSongs()
8817bb2e 1035
8817bb2e 1036elif mode==MODE_FAVORITES:
1037 grooveshark.favorites()
1038
e278f474 1039elif mode==MODE_PLAYLISTS:
1040 grooveshark.playlists()
97289139 1041
1042elif mode==MODE_SONG_PAGE:
5e72534b 1043 try: offset=urllib.unquote_plus(params["offset"])
97289139 1044 except: pass
1045 try: label=urllib.unquote_plus(params["label"])
1046 except: pass
5e72534b 1047 grooveshark.songPage(offset, label, id, name)
e278f474 1048
8817bb2e 1049elif mode==MODE_SONG:
8817bb2e 1050 try: album=urllib.unquote_plus(params["album"])
1051 except: pass
1052 try: artist=urllib.unquote_plus(params["artist"])
1053 except: pass
7ce01be6 1054 try: coverart=urllib.unquote_plus(params["coverart"])
8817bb2e 1055 except: pass
7ce01be6 1056 song = grooveshark.songItem(id, name, album, artist, coverart)
3fcef5ba 1057 grooveshark.playSong(song)
8817bb2e 1058
1059elif mode==MODE_ARTIST:
4be42357 1060 grooveshark.artist(id)
8817bb2e 1061
1062elif mode==MODE_ALBUM:
4be42357 1063 grooveshark.album(id)
8817bb2e 1064
1065elif mode==MODE_PLAYLIST:
e6f8730b 1066 grooveshark.playlist(id, name)
8817bb2e 1067
1068elif mode==MODE_FAVORITE:
4be42357 1069 grooveshark.favorite(id)
97289139 1070
052028f1 1071elif mode==MODE_UNFAVORITE:
1072 try: prevMode=int(urllib.unquote_plus(params["prevmode"]))
1073 except:
1074 prevMode = 0
1075 grooveshark.unfavorite(id, prevMode)
1076
1077elif mode==MODE_SIMILAR_ARTISTS:
1078 grooveshark.similarArtists(id)
1079
1080elif mode==MODE_MAKE_PLAYLIST:
1081 grooveshark.makePlaylist(id, name)
1082
1083elif mode==MODE_REMOVE_PLAYLIST:
1084 grooveshark.removePlaylist(id, name)
1085
1086elif mode==MODE_RENAME_PLAYLIST:
1087 grooveshark.renamePlaylist(id, name)
1088
1089elif mode==MODE_REMOVE_PLAYLIST_SONG:
1090 try: playlistID=urllib.unquote_plus(params["playlistid"])
1091 except: pass
1092 grooveshark.removePlaylistSong(playlistID, name, id)
1093
1094elif mode==MODE_ADD_PLAYLIST_SONG:
1095 grooveshark.addPlaylistSong(id)
1096
e278f474 1097if mode < MODE_SONG:
8817bb2e 1098 xbmcplugin.endOfDirectory(int(sys.argv[1]))