X-Git-Url: http://git.hcoop.net/clinton/xbmc-groove.git/blobdiff_plain/cd937deaa3f7846f8a2b9249cb2cebc25c633ce2..8d7ba769bd256fb5f4483ca0c193a75d9b16942b:/default.py diff --git a/default.py b/default.py index 8f68fa5..ebe1660 100644 --- a/default.py +++ b/default.py @@ -24,7 +24,7 @@ __cwd__ = __addon__.getAddonInfo('path') __author__ = __addon__.getAddonInfo('author') __version__ = __addon__.getAddonInfo('version') __language__ = __addon__.getLocalizedString -__debuggui__ = __addon__.getSetting('debug') +__debugging__ = __addon__.getSetting('debug') MODE_SEARCH_SONGS = 1 MODE_SEARCH_ALBUMS = 2 @@ -67,9 +67,6 @@ STREAM_MARKING_TIME = 30 # Timeout STREAM_TIMEOUT = 30 -# Retry URL -STREAM_RETRY = STREAM_TIMEOUT/2 - songMarkTime = 0 player = xbmc.Player() playTimer = None @@ -96,9 +93,13 @@ sys.path.append (libDir) from GroovesharkAPI import GrooveAPI from threading import Event, Thread +if __debugging__ == 'true': + __debugging__ = True +else: + __debugging__ = False + try: - groovesharkApi = GrooveAPI() - groovesharkApi.setDebug(__debuggui__) + groovesharkApi = GrooveAPI(__debugging__) if groovesharkApi.pingService() != True: raise StandardError(__language__(30007)) except: @@ -107,19 +108,19 @@ except: sys.exit(-1) # Mark song as playing or played -def markSong(songid, duration): +def markSong(songid, duration, streamKey, streamServerID): global songMarkTime global playTimer global player if player.isPlayingAudio(): tNow = player.getTime() if tNow >= STREAM_MARKING_TIME and songMarkTime == 0: - groovesharkApi.markStreamKeyOver30Secs() + groovesharkApi.markStreamKeyOver30Secs(streamKey, streamServerID) songMarkTime = tNow elif duration > tNow and duration - tNow < 2 and songMarkTime >= STREAM_MARKING_TIME: playTimer.cancel() songMarkTime = 0 - groovesharkApi.markSongComplete(songid) + groovesharkApi.markSongComplete(songid, streamKey, streamServerID) else: playTimer.cancel() songMarkTime = 0 @@ -255,12 +256,12 @@ class Grooveshark: self._handle = int(sys.argv[1]) if os.path.isdir(cacheDir) == False: os.makedirs(cacheDir) - if __debuggui__: + if __debugging__ : xbmc.log(__language__(30012) + " " + cacheDir) artDir = xbmc.translatePath(thumbDir) if os.path.isdir(artDir) == False: os.makedirs(artDir) - if __debuggui__: + if __debugging__ : xbmc.log(__language__(30012) + " " + artDir) # Top-level menu @@ -350,9 +351,9 @@ class Grooveshark: if (len(artists) > 0): artist = artists[0] artistID = artist[1] - if __debuggui__: + if __debugging__ : xbmc.log("Found " + artist[0] + "...") - albums = groovesharkApi.getArtistAlbums(artistID, limit = self.albumsearchlimit) + albums = groovesharkApi.getArtistAlbums(artistID, self.albumsearchlimit) if (len(albums) > 0): self._add_albums_directory(albums, artistID) else: @@ -407,7 +408,7 @@ class Grooveshark: def favorite(self, songid): userid = self._get_login() if (userid != 0): - if __debuggui__: + if __debugging__ : xbmc.log("Favorite song: " + str(songid)) groovesharkApi.addUserFavoriteSong(songID = songid) xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ', ' + __language__(30036) + ', 1000, ' + thumbDef + ')') @@ -419,7 +420,7 @@ class Grooveshark: def unfavorite(self, songid, prevMode=0): userid = self._get_login() if (userid != 0): - if __debuggui__: + if __debugging__ : xbmc.log("Unfavorite song: " + str(songid) + ', previous mode was ' + str(prevMode)) groovesharkApi.removeUserFavoriteSongs(songIDs = songid) xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ', ' + __language__(30038) + ', 1000, ' + thumbDef + ')') @@ -439,7 +440,7 @@ class Grooveshark: # Show selected artist def artist(self, artistid): albums = groovesharkApi.getArtistAlbums(artistid, limit = self.albumsearchlimit) - self._add_albums_directory(albums, artistid) + self._add_albums_directory(albums, artistid, True) # Show selected playlist def playlist(self, playlistid, playlistname): @@ -459,7 +460,7 @@ class Grooveshark: if (len(artists) > 0): artist = artists[0] artistID = artist[1] - if __debuggui__: + if __debugging__ : xbmc.log("Found " + artist[0] + "...") songs = groovesharkApi.getArtistPopularSongs(artistID, limit = self.songsearchlimit) if (len(songs) > 0): @@ -479,29 +480,38 @@ class Grooveshark: def playSong(self, item): global playTimer global player + player.stop() if item != None: - songid = self._setItem(item) - # Wait for play then start timer - seconds = 0 - while seconds < STREAM_TIMEOUT: - try: - if player.isPlayingAudio() == True: - if playTimer != None: - playTimer.cancel() - songMarkTime = 0 - duration = int(item.getProperty('duration')) - playTimer = PlayTimer(1, markSong, duration, [songid, duration]) - playTimer.start() - break - except: pass - time.sleep(1) - seconds = seconds + 1 - - # If not playing after a few seconds try to refresh the URL - if (seconds == STREAM_RETRY): - item.setProperty('url', '') - self._setItem(item) - self._setSongStream(songid, item.getProperty('duration'), item.getProperty('url')) + url = '' + songid = item.getProperty('songid') + duration = int(self._getSongDuration(songid)) + stream = groovesharkApi.getSubscriberStreamKey(songid) + if stream != False: + url = stream['url'] + key = stream['StreamKey'] + server = stream['StreamServerID'] + duration = self._setDuration(stream['uSecs']) + if url != '': + item.setPath(url) + xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True, listitem=item) + if __debugging__ : + xbmc.log("Grooveshark playing: " + url) + # Wait for play then start timer + seconds = 0 + while seconds < STREAM_TIMEOUT: + try: + if player.isPlayingAudio() == True: + if playTimer != None: + playTimer.cancel() + songMarkTime = 0 + playTimer = PlayTimer(1, markSong, duration, [songid, duration, key, server]) + playTimer.start() + break + except: pass + time.sleep(1) + seconds = seconds + 1 + else: + xbmc.log("No song URL") else: xbmc.executebuiltin('XBMC.Notification(' + __language__(30008) + ', ' + __language__(30044) + ', 1000, ' + thumbDef + ')') @@ -512,9 +522,7 @@ class Grooveshark: trackLabel = name + " - " + album + " - " + artist else: trackLabel = artist + " - " + album + " - " + name - stream = self._getSongStream(songid) - duration = stream['duration'] - url = stream['url'] + duration = self._getSongDuration(songid) item = xbmcgui.ListItem(label = trackLabel, thumbnailImage=songImg, iconImage=songImg) item.setInfo( type="music", infoLabels={ "title": name, "album": album, "artist": artist, "duration": duration} ) item.setProperty('mimetype', 'audio/mpeg') @@ -525,7 +533,6 @@ class Grooveshark: item.setProperty('album', album) item.setProperty('artist', artist) item.setProperty('duration', str(duration)) - item.setProperty('url', str(url)) return item @@ -616,7 +623,7 @@ class Grooveshark: else: playlist = playlists[i] playlistid = playlist[1] - if __debuggui__: + if __debugging__ : xbmc.log("Add song " + str(songid) + " to playlist " + str(playlistid)) songIDs=[] songs = groovesharkApi.getPlaylistSongs(playlistid) @@ -717,19 +724,6 @@ class Grooveshark: else: return thumbDef - # Set URL - def _setItem(self, item): - url = item.getProperty('url') - songid = item.getProperty('songid') - if url == '': - stream = groovesharkApi.getSubscriberStreamKey(songid) - url = stream['url'] - item.setPath(url) - xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True, listitem=item) - if __debuggui__: - xbmc.log("Grooveshark playing: " + songid) - return songid - # Add songs to directory def _add_songs_directory(self, songs, trackLabelFormat=ARTIST_ALBUM_NAME_LABEL, offset=0, playlistid=0, playlistname='', isFavorites=False): @@ -740,7 +734,7 @@ class Grooveshark: # No pages needed if offset == 0 and totalSongs <= self.songspagelimit: - if __debuggui__: + if __debugging__ : xbmc.log("Found " + str(totalSongs) + " songs...") # Pages else: @@ -761,8 +755,8 @@ class Grooveshark: while n < end: song = songs[n] songid = song[1] - stream = self._getSongStream(songid) - if stream['url'] != '': + duration = self._getSongDuration(songid) + if duration != -1: item = self._get_song_item(song, trackLabelFormat) coverart = item.getProperty('coverart') songname = song[0] @@ -791,7 +785,7 @@ class Grooveshark: id = id + 1 else: end = min(end + 1,totalSongs) - if __debuggui__: + if __debugging__ : xbmc.log(song[0] + " does not exist.") n = n + 1 @@ -803,16 +797,16 @@ class Grooveshark: xbmcplugin.setPluginFanart(int(sys.argv[1]), self.fanImg) # Add albums to directory - def _add_albums_directory(self, albums, artistid=0): + def _add_albums_directory(self, albums, artistid=0, isverified=False): n = len(albums) itemsExisting = n - if __debuggui__: + if __debugging__ : xbmc.log("Found " + str(n) + " albums...") i = 0 while i < n: album = albums[i] albumID = album[3] - if groovesharkApi.getDoesAlbumExist(albumID): + if isverified or groovesharkApi.getDoesAlbumExist(albumID): albumArtistName = album[0] albumName = album[2] albumImage = self._get_icon(album[4], 'album-' + str(albumID)) @@ -831,7 +825,7 @@ class Grooveshark: def _add_artists_directory(self, artists): n = len(artists) itemsExisting = n - if __debuggui__: + if __debugging__ : xbmc.log("Found " + str(n) + " artists...") i = 0 while i < n: @@ -850,7 +844,7 @@ class Grooveshark: # Add playlists to directory def _add_playlists_directory(self, playlists): n = len(playlists) - if __debuggui__: + if __debugging__ : xbmc.log("Found " + str(n) + " playlists...") i = 0 while i < n: @@ -912,73 +906,57 @@ class Grooveshark: xbmc.log("An error occurred saving songs") pass - def _getSongStream(self, songid): + def _getSongDuration(self, songid): id = int(songid) duration = -1 - streams = [] - url = '' - path = os.path.join(cacheDir, 'streams.dmp') + durations = [] + path = os.path.join(cacheDir, 'duration.dmp') try: f = open(path, 'rb') - streams = pickle.load(f) - for song in streams: + durations = pickle.load(f) + for song in durations: if song[0] == id: duration = song[1] - url = song[2] break; f.close() except: pass - # Not in cache but exists - if duration < 0 and groovesharkApi.getDoesSongExist(songid): + # Not in cache + if duration < 0: stream = groovesharkApi.getSubscriberStreamKey(songid) - url = stream['url'] - usecs = stream['uSecs'] - if usecs < 60000000: - usecs = usecs * 10 # Some durations are 10x to small - duration = usecs / 1000000 - song = [id, duration, url] - streams.append(song) - self._setSongStreams(streams) - - return {'duration':duration, 'url':url} - - def _setSongStream(self, songid, duration, url): - path = os.path.join(cacheDir, 'streams.dmp') - try: - f = open(path, 'rb') - streams = pickle.load(f) - for song in streams: - if song[0] == songid: - song[1] = duration - song[2] = url - self._setSongStreams(streams) - break; - f.close() - except: - xbmc.log("An error occurred saving stream") - pass + if stream != False and stream['url'] != '': + duration = self._setDuration(stream['uSecs']) + song = [id, duration] + self._setSongDuration(song, durations) + + return duration - def _setSongStreams(self, streams): + def _setSongDuration(self, song, durations): try: + durations.append(song) # Create the cache directory if it doesn't exist. if not os.path.exists(cacheDir): os.makedirs(cacheDir) - path = os.path.join(cacheDir, 'streams.dmp') + path = os.path.join(cacheDir, 'duration.dmp') f = open(path, 'wb') - pickle.dump(streams, f, protocol=pickle.HIGHEST_PROTOCOL) + pickle.dump(durations, f, protocol=pickle.HIGHEST_PROTOCOL) f.close() except: - xbmc.log("An error occurred saving streams") + xbmc.log("An error occurred saving duration") pass + # Duration to seconds + def _setDuration(self, usecs): + if usecs < 60000000: + usecs = usecs * 10 # Some durations are 10x to small + return usecs / 1000000 # Parse URL parameters def get_params(): param=[] paramstring=sys.argv[2] - if __debuggui__: + if __debugging__ : xbmc.log(paramstring) if len(paramstring)>=2: params=sys.argv[2]