From ce5a74c3a8f3112115afc854445ce9f32fa4fc65 Mon Sep 17 00:00:00 2001 From: mammo0 Date: Mon, 19 Apr 2021 17:33:16 +0200 Subject: [PATCH 1/2] avoid creating of a Kodi database object for every item in the workers --- jellyfin_kodi/library.py | 86 ++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 26 deletions(-) diff --git a/jellyfin_kodi/library.py b/jellyfin_kodi/library.py index c55d4256..1c616fd1 100644 --- a/jellyfin_kodi/library.py +++ b/jellyfin_kodi/library.py @@ -598,6 +598,18 @@ class UpdateWorker(threading.Thread): def run(self): with self.lock, self.database as kodidb, Database('jellyfin') as jellyfindb: + default_args = (self.server, jellyfindb, kodidb, self.direct_path) + if kodidb.db_file == "video": + movies = Movies(*default_args) + tvshows = TVShows(*default_args) + musicvideos = MusicVideos(*default_args) + elif kodidb.db_file == "music": + music = Music(*default_args) + else: + # this should not happen + LOG.error('"{}" is not a valid Kodi library type.'.format(kodidb.db_file)) + return + while True: try: @@ -605,29 +617,28 @@ class UpdateWorker(threading.Thread): except Queue.Empty: break - default_args = (self.server, jellyfindb, kodidb, self.direct_path) try: LOG.debug('{} - {}'.format(item['Type'], item['Name'])) if item['Type'] == 'Movie': - Movies(*default_args).movie(item) + movies.movie(item) elif item['Type'] == 'BoxSet': - Movies(*default_args).boxset(item) + movies.boxset(item) elif item['Type'] == 'Series': - TVShows(*default_args).tvshow(item) + tvshows.tvshow(item) elif item['Type'] == 'Season': - TVShows(*default_args).season(item) + tvshows.season(item) elif item['Type'] == 'Episode': - TVShows(*default_args).episode(item) + tvshows.episode(item) elif item['Type'] == 'MusicVideo': - MusicVideos(*default_args).musicvideo(item) + musicvideos.musicvideo(item) elif item['Type'] == 'MusicAlbum': - Music(*default_args).album(item) + music.album(item) elif item['Type'] == 'MusicArtist': - Music(*default_args).artist(item) + music.artist(item) elif item['Type'] == 'AlbumArtist': - Music(*default_args).albumartist(item) + music.albumartist(item) elif item['Type'] == 'Audio': - Music(*default_args).song(item) + music.song(item) if self.notify: self.notify_output.put((item['Type'], api.API(item).get_naming())) @@ -663,6 +674,17 @@ class UserDataWorker(threading.Thread): def run(self): with self.lock, self.database as kodidb, Database('jellyfin') as jellyfindb: + default_args = (self.server, jellyfindb, kodidb, self.direct_path) + if kodidb.db_file == "video": + movies = Movies(*default_args) + tvshows = TVShows(*default_args) + elif kodidb.db_file == "music": + music = Music(*default_args) + else: + # this should not happen + LOG.error('"{}" is not a valid Kodi library type.'.format(kodidb.db_file)) + return + while True: try: @@ -670,20 +692,19 @@ class UserDataWorker(threading.Thread): except Queue.Empty: break - default_args = (self.server, jellyfindb, kodidb, self.direct_path) try: if item['Type'] == 'Movie': - Movies(*default_args).userdata(item) + movies.userdata(item) elif item['Type'] in ['Series', 'Season', 'Episode']: - TVShows(*default_args).userdata(item) + tvshows.userdata(item) elif item['Type'] == 'MusicAlbum': - Music(*default_args).album(item) + music.album(item) elif item['Type'] == 'MusicArtist': - Music(*default_args).artist(item) + music.artist(item) elif item['Type'] == 'AlbumArtist': - Music(*default_args).albumartist(item) + music.albumartist(item) elif item['Type'] == 'Audio': - Music(*default_args).userdata(item) + music.userdata(item) except LibraryException as error: if error.status == 'StopCalled': break @@ -750,17 +771,30 @@ class RemovedWorker(threading.Thread): is_done = False - def __init__(self, queue, lock, database, *args): + def __init__(self, queue, lock, database, server, direct_path): self.queue = queue self.lock = lock self.database = Database(database) - self.args = args + self.server = server + self.direct_path = direct_path threading.Thread.__init__(self) def run(self): with self.lock, self.database as kodidb, Database('jellyfin') as jellyfindb: + default_args = (self.server, jellyfindb, kodidb, self.direct_path) + if kodidb.db_file == "video": + movies = Movies(*default_args) + tvshows = TVShows(*default_args) + musicvideos = MusicVideos(*default_args) + elif kodidb.db_file == "music": + music = Music(*default_args) + else: + # this should not happen + LOG.error('"{}" is not a valid Kodi library type.'.format(kodidb.db_file)) + return + while True: try: @@ -769,13 +803,13 @@ class RemovedWorker(threading.Thread): break if item['Type'] == 'Movie': - obj = Movies(self.args[0], jellyfindb, kodidb, self.args[1]).remove + obj = movies.remove elif item['Type'] in ['Series', 'Season', 'Episode']: - obj = TVShows(self.args[0], jellyfindb, kodidb, self.args[1]).remove + obj = tvshows.remove elif item['Type'] in ['MusicAlbum', 'MusicArtist', 'AlbumArtist', 'Audio']: - obj = Music(self.args[0], jellyfindb, kodidb, self.args[1]).remove + obj = music.remove elif item['Type'] == 'MusicVideo': - obj = MusicVideos(self.args[0], jellyfindb, kodidb, self.args[1]).remove + obj = musicvideos.remove try: obj(item['Id']) @@ -784,8 +818,8 @@ class RemovedWorker(threading.Thread): break except Exception as error: LOG.exception(error) - - self.queue.task_done() + finally: + self.queue.task_done() if window('jellyfin_should_stop.bool'): break From 0359e0f80a2a6885166a7cd6452b5b6421370acf Mon Sep 17 00:00:00 2001 From: mammo0 Date: Mon, 19 Apr 2021 18:07:03 +0200 Subject: [PATCH 2/2] fixed 'args' beiing provided as list for dict.get() method before the people cache was never used, because the 'args' parameter in the 'self._people_cache.get(args)' call was a list/tuple object; but the people cache dictionary has only strings as keys -> so there were always database queries for the persons which slowed down the sync process also renamed 'args' to 'name', because basically a person gets searched only by its name (see queries.py) --- jellyfin_kodi/objects/kodi/kodi.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/jellyfin_kodi/objects/kodi/kodi.py b/jellyfin_kodi/objects/kodi/kodi.py index 8abf1a57..d0276c11 100644 --- a/jellyfin_kodi/objects/kodi/kodi.py +++ b/jellyfin_kodi/objects/kodi/kodi.py @@ -160,23 +160,24 @@ class Kodi(object): self.cursor.execute(QU.add_person, args) return self.cursor.lastrowid - def _get_person(self, *args): + def _get_person(self, name): '''Retrieve person from the database, or add them if they don't exist ''' - resp = self.cursor.execute(QU.get_person, args).fetchone() + resp = self.cursor.execute(QU.get_person, (name,)).fetchone() if resp is not None: return resp[0] else: - return self.add_person(*args) + return self.add_person(name) - def get_person(self, *args): + def get_person(self, name): '''Retrieve person from cache, else forward to db query ''' - person_id = self._people_cache.get(args) - if not person_id: - person_id = self._get_person(*args) - self._people_cache[args] = person_id - return person_id + if name in self._people_cache: + return self._people_cache[name] + else: + person_id = self._get_person(name) + self._people_cache[name] = person_id + return person_id def add_genres(self, genres, *args):