def set_songs_sync(server_params, songs): '''Sync playcount and rating''' logger.debug('call set_songs_sync') print print "Updating songs rating and playcount (could be long)" print nb_songs = len(songs) logger.debug('number of songs: %i', nb_songs) widgets = [ 'Songs: ', Percentage(), ' ', Bar(marker='#',left='[',right=']'), ' (', Counter(), ' in ' + str(nb_songs) + ') ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=nb_songs) pbar.start() limits = range(0, nb_songs, 20) nb_update_rating = 0 nb_update_playcount = 0 if not limits[-1] == nb_songs: limits.append(nb_songs) for start, end in zip(limits[:-1], limits[1:]): logger.info('Processing song %i to %i ...', start, end) pbar.update(start) while True: #TODO: use an API function try: command = {"jsonrpc": "2.0", "method": "AudioLibrary.GetSongs", "params": { "properties": [ "rating", "playcount", ], "limits": { "start": start, "end": end } }, "id": 1} ret = kodi_api.call_api(server_params, command) for r_song in ret['result']['songs']: if songs[r_song['songid']]['rating'] != r_song['rating']: logger.info( 'updating rating for %s!', r_song['songid']) songs[r_song['songid']]['rating'] = r_song['rating'] nb_update_rating += 1 if songs[r_song['songid']]['playcount'] != r_song['playcount']: logger.info( 'updating playcount for %s!', r_song['songid']) songs[r_song['songid']]['playcount'] = r_song['playcount'] nb_update_playcount += 1 break except KeyError: logger.info('error when loading library, retry') pbar.finish() save_songs(songs) print print "%i song(s) rating updated" % nb_update_rating print "%i song(s) playcount updated" % nb_update_playcount print
def get_audio_library_from_server(obj): '''Load the library in memory from the Kodi server''' logger.debug('get_audio_library_from_server') print "Loading the Kodi server library, this may be very long" print # Loading songs songs_dummy = kodi_api.audiolibrary_get_songs(obj.kodi_params, 0, 1) nb_songs = songs_dummy['limits']['total'] logger.debug('number of songs: %i', nb_songs) if nb_songs==0: logger.critical("Library seems to be empty.") exit() obj.nb_songs = nb_songs widgets = [ 'Songs: ', Percentage(), ' ', Bar(marker='#',left='[',right=']'), ' (', Counter(), ' in ' + str(nb_songs) + ') ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=nb_songs) pbar.start() limits = range(0, nb_songs, 20) if not limits[-1] == nb_songs: limits.append(nb_songs) for start, end in zip(limits[:-1], limits[1:]): logger.info('Processing song %i to %i ...', start, end) pbar.update(start) while True: try: #TODO: use an API function command = {"jsonrpc": "2.0", "method": "AudioLibrary.GetSongs", "params": { "properties": [ "title", "artist", "year", "rating", "playcount", "musicbrainztrackid", "genre" ], "limits": { "start": start, "end": end } }, "id": 1} ret = kodi_api.call_api(obj.kodi_params, command) for song in ret['result']['songs']: obj.songs[song['songid']] = {} obj.songs[song['songid']]['title'] = song['title'] if song['artist']: obj.songs[song['songid']]['artist'] = song['artist'][0] else: obj.songs[song['songid']]['artist'] = '' obj.songs[song['songid']]['year'] = song['year'] obj.songs[song['songid']]['rating'] = song['rating'] obj.songs[song['songid']]['playcount'] = song['playcount'] obj.songs[song['songid']][ 'musicbrainztrackid'] = song['musicbrainztrackid'] obj.songs[song['songid']]['genre'] = song['genre'] # store the last update to echonest profile obj.songs[song['songid']]['rating_en'] = 0 obj.songs[song['songid']]['playcount_en'] = 0 break except KeyError: #TODO: improve error catching, limit to API errors logger.info('error when loading library, retry') pbar.finish() save_songs(obj.songs) # Loading albums albums_dummy = kodi_api.audiolibrary_get_albums(obj.kodi_params, 0, 1) nb_albums = albums_dummy['limits']['total'] logger.debug('number of albums: %i', nb_albums) obj.nb_albums = nb_albums widgets = [ 'Albums: ', Percentage(), ' ', Bar(marker='#',left='[',right=']'), ' (', Counter(), ' in ' + str(nb_albums) + ') ', ETA()] pbar = ProgressBar(widgets=widgets, maxval=nb_albums) pbar.start() limits = range(0, nb_albums, 10) if not limits[-1] == nb_albums: limits.append(nb_albums) for start, end in zip(limits[:-1], limits[1:]): logger.info('Processing album %i to %i ...', start, end) pbar.update(start) while True: try: #TODO: use an API function command = {"jsonrpc": "2.0", "method": "AudioLibrary.GetAlbums", "params": { "properties": [ "title", "artist", "year"], "limits": { "start": start, "end": end } }, "id": 1} ret = kodi_api.call_api(obj.kodi_params, command) for album in ret['result']['albums']: obj.albums[album['albumid']] = {} obj.albums[album['albumid']]['title'] = album['title'] if album['artist']: obj.albums[album['albumid']]['artist'] = album['artist'][0] else: obj.albums[album['albumid']]['artist'] = '' obj.albums[album['albumid']]['year'] = album['year'] break except KeyError: logger.info('error when loading library, retry') pbar.finish() save_albums(obj.albums) print
def get_audio_library_from_server(obj): '''Load the library in memory from the Kodi server''' logger.debug('get_audio_library_from_server') print "Loading the Kodi server library, this may be very long" print # Loading songs songs_dummy = kodi_api.audiolibrary_get_songs(obj.kodi_params, 0, 1) nb_songs = songs_dummy['limits']['total'] logger.debug('number of songs: %i', nb_songs) if nb_songs == 0: logger.critical("Library seems to be empty.") exit() obj.nb_songs = nb_songs widgets = [ 'Songs: ', Percentage(), ' ', Bar(marker='#', left='[', right=']'), ' (', Counter(), ' in ' + str(nb_songs) + ') ', ETA() ] pbar = ProgressBar(widgets=widgets, maxval=nb_songs) pbar.start() limits = range(0, nb_songs, 20) if not limits[-1] == nb_songs: limits.append(nb_songs) for start, end in zip(limits[:-1], limits[1:]): logger.info('Processing song %i to %i ...', start, end) pbar.update(start) while True: try: #TODO: use an API function command = { "jsonrpc": "2.0", "method": "AudioLibrary.GetSongs", "params": { "properties": [ "title", "artist", "year", "rating", "playcount", "musicbrainztrackid", "genre" ], "limits": { "start": start, "end": end } }, "id": 1 } ret = kodi_api.call_api(obj.kodi_params, command) for song in ret['result']['songs']: obj.songs[song['songid']] = {} obj.songs[song['songid']]['title'] = song['title'] if song['artist']: obj.songs[song['songid']]['artist'] = song['artist'][0] obj.songs[song['songid']]['year'] = song['year'] obj.songs[song['songid']]['rating'] = song['rating'] obj.songs[song['songid']]['playcount'] = song['playcount'] obj.songs[song['songid']]['musicbrainztrackid'] = song[ 'musicbrainztrackid'] obj.songs[song['songid']]['genre'] = song['genre'] # store the last update to echonest profile obj.songs[song['songid']]['rating_en'] = 0 obj.songs[song['songid']]['playcount_en'] = 0 break except KeyError: #TODO: improve error catching, limit to API errors logger.info('error when loading library, retry') pbar.finish() save_songs(obj.songs) # Loading albums albums_dummy = kodi_api.audiolibrary_get_albums(obj.kodi_params, 0, 1) nb_albums = albums_dummy['limits']['total'] logger.debug('number of albums: %i', nb_albums) obj.nb_albums = nb_albums widgets = [ 'Albums: ', Percentage(), ' ', Bar(marker='#', left='[', right=']'), ' (', Counter(), ' in ' + str(nb_albums) + ') ', ETA() ] pbar = ProgressBar(widgets=widgets, maxval=nb_albums) pbar.start() limits = range(0, nb_albums, 10) if not limits[-1] == nb_albums: limits.append(nb_albums) for start, end in zip(limits[:-1], limits[1:]): logger.info('Processing album %i to %i ...', start, end) pbar.update(start) while True: try: #TODO: use an API function command = { "jsonrpc": "2.0", "method": "AudioLibrary.GetAlbums", "params": { "properties": ["title", "artist", "year"], "limits": { "start": start, "end": end } }, "id": 1 } ret = kodi_api.call_api(obj.kodi_params, command) for album in ret['result']['albums']: obj.albums[album['albumid']] = {} obj.albums[album['albumid']]['title'] = album['title'] obj.albums[album['albumid']]['artist'] = album['artist'][0] obj.albums[album['albumid']]['year'] = album['year'] break except KeyError: logger.info('error when loading library, retry') pbar.finish() save_albums(obj.albums) print