From 5f342227129635cc10c4c79eaa20287e033963f2 Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 2 Aug 2020 00:25:08 -0400 Subject: [PATCH] Optimize network calls for music syncing --- jellyfin_kodi/downloader.py | 49 ++++++++++++++---------- jellyfin_kodi/full_sync.py | 76 +++++++++++++++++++++++++------------ 2 files changed, 81 insertions(+), 44 deletions(-) diff --git a/jellyfin_kodi/downloader.py b/jellyfin_kodi/downloader.py index ba701231..762a4afe 100644 --- a/jellyfin_kodi/downloader.py +++ b/jellyfin_kodi/downloader.py @@ -189,31 +189,40 @@ def get_items(parent_id, item_type=None, basic=False, params=None): yield items -def get_artists(parent_id=None, basic=False, params=None, server_id=None): +def get_artists(parent_id=None): - query = { - 'url': "Artists", - 'params': { - 'UserId': "{UserId}", - 'ParentId': parent_id, - 'SortBy': "SortName", - 'SortOrder': "Ascending", - 'Fields': api.basic_info() if basic else api.music_info(), - 'CollapseBoxSetItems': False, - 'IsVirtualUnaired': False, - 'EnableTotalRecordCount': False, - 'LocationTypes': "FileSystem,Remote,Offline", - 'IsMissing': False, - 'Recursive': True - } + url = "Artists" + + params = { + 'UserId': "{UserId}", + 'ParentId': parent_id, + 'SortBy': "SortName", + 'SortOrder': "Ascending", + 'Fields': api.music_info(), + 'CollapseBoxSetItems': False, + 'IsVirtualUnaired': False, + 'EnableTotalRecordCount': False, + 'LocationTypes': "FileSystem,Remote,Offline", + 'IsMissing': False, + 'Recursive': True } - if params: - query['params'].update(params) + return _get(url, params) - for items in _get_items(query, server_id): - yield items +def get_library_items(library_id, item_type): + url = "Users/{UserId}/Items" + + params = { + 'ParentId': library_id, + 'IncludeItemTypes': item_type, + 'SortBy': "SortName", + 'SortOrder': "Ascending", + 'Fields': api.info(), + 'Recursive': True, + } + + return _get(url, params) def get_albums_by_artist(artist_id, basic=False): diff --git a/jellyfin_kodi/full_sync.py b/jellyfin_kodi/full_sync.py index 09ba5b73..eed0d5f6 100644 --- a/jellyfin_kodi/full_sync.py +++ b/jellyfin_kodi/full_sync.py @@ -407,36 +407,64 @@ class FullSync(object): with Database('jellyfin') as jellyfindb: obj = Music(self.server, jellyfindb, musicdb, self.direct_path) - for items in server.get_artists(library['Id'], False, self.sync['RestorePoint'].get('params')): + library_id = library['Id'] + artists_data = server.get_artists(library_id) + artists = artists_data['Items'] + num_artists = artists_data['TotalRecordCount'] + albums = server.get_library_items(library_id, 'MusicAlbum')['Items'] + songs = server.get_library_items(library_id, 'Audio')['Items'] - self.sync['RestorePoint'] = items['RestorePoint'] - start_index = items['RestorePoint']['params']['StartIndex'] + for index, artist in enumerate(artists): + artist_name = artist.get('Name') - for index, artist in enumerate(items['Items']): + percent = int((float(index) / float(num_artists)) * 100) + message = artist_name + dialog.update(percent, heading="%s: %s" % (translate('addon_name'), library['Name']), message=message) - percent = int((float(start_index + index) / float(items['TotalRecordCount'])) * 100) - message = artist['Name'] - dialog.update(percent, heading="%s: %s" % (translate('addon_name'), library['Name']), message=message) - obj.artist(artist, library=library) + obj.artist(artist, library=library) + artist_albums = [ album for album in albums if artist_name in album.get('Artists') ] + for album in artist_albums: + obj.album(album) + album_id = album.get('Id') + album_songs = [ song for song in songs if album_id == song.get('AlbumId') ] + for song in album_songs: + dialog.update(percent, + message="%s/%s/%s" % (message, album['Name'][:7], song['Name'][:7])) + obj.song(song) - for albums in server.get_albums_by_artist(artist['Id']): - for album in albums['Items']: - obj.album(album) - - for songs in server.get_items(album['Id'], "Audio"): - for song in songs['Items']: - - dialog.update(percent, - message="%s/%s/%s" % (message, album['Name'][:7], song['Name'][:7])) - obj.song(song) - - for songs in server.get_songs_by_artist(artist['Id']): - for song in songs['Items']: - - dialog.update(percent, message="%s/%s" % (message, song['Name'])) - obj.song(song) +# for items in server.get_artists(library['Id'], False, self.sync['RestorePoint'].get('params')): +# +# self.sync['RestorePoint'] = items['RestorePoint'] +# start_index = items['RestorePoint']['params']['StartIndex'] +# +# for index, artist in enumerate(items['Items']): +# +# percent = int((float(start_index + index) / float(items['TotalRecordCount'])) * 100) +# message = artist['Name'] +# dialog.update(percent, heading="%s: %s" % (translate('addon_name'), library['Name']), message=message) +# obj.artist(artist, library=library) +# +# import web_pdb; web_pdb.set_trace() +# for albums in server.get_albums_by_artist(artist['Id']): +# +# for album in albums['Items']: +# obj.album(album) +# +# for songs in server.get_items(album['Id'], "Audio"): +# for song in songs['Items']: +# +# dialog.update(percent, +# message="%s/%s/%s" % (message, album['Name'][:7], song['Name'][:7])) +# obj.song(song) +# +# for songs in server.get_songs_by_artist(artist['Id']): +# for song in songs['Items']: +# +# dialog.update(percent, message="%s/%s" % (message, song['Name'])) +# obj.song(song) +# if self.update_library: self.music_compare(library, obj, jellyfindb)