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