def music(self, library, dialog): ''' Process artists, album, songs from a single library. ''' with self.library.music_database_lock: with Database('music') as musicdb: with Database('emby') as embydb: obj = Music(self.server, embydb, musicdb, self.direct_path) 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" % (_('addon_name'), library['Name']), message=message) obj.artist(artist, library=library) 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) if self.update_library: self.music_compare(library, obj, embydb)
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: item = self.queue.get(timeout=1) except Queue.Empty: break try: if item['Type'] == 'Movie': movies.userdata(item) elif item['Type'] in ['Series', 'Season', 'Episode']: tvshows.userdata(item) elif item['Type'] == 'MusicAlbum': music.album(item) elif item['Type'] == 'MusicArtist': music.artist(item) elif item['Type'] == 'AlbumArtist': music.albumartist(item) elif item['Type'] == 'Audio': music.userdata(item) except LibraryException as error: if error.status == 'StopCalled': break except Exception as error: LOG.exception(error) self.queue.task_done() if window('jellyfin_should_stop.bool'): break LOG.info("--<[ q:userdata/%s ]", id(self)) self.is_done = True
def music(self, library, dialog): ''' Process artists, album, songs from a single library. ''' with self.library.music_database_lock: with Database('music') as musicdb: with Database('jellyfin') as jellyfindb: obj = Music(self.server, jellyfindb, musicdb, self.direct_path, library) library_id = library['Id'] total_items = server.get_item_count( library_id, 'MusicArtist,MusicAlbum,Audio') count = 0 ''' Music database syncing. Artists must be in the database before albums, albums before songs. Pulls batches of items in sizes of setting "Paging - Max items". 'artists', 'albums', and 'songs' are generators containing a dict of api responses ''' artists = server.get_artists(library_id) for batch in artists: for item in batch['Items']: LOG.debug('Artist: {}'.format(item.get('Name'))) percent = int( (float(count) / float(total_items)) * 100) dialog.update(percent, message='Artist: {}'.format( item.get('Name'))) obj.artist(item) count += 1 albums = server.get_items(library_id, item_type='MusicAlbum', params={'SortBy': 'AlbumArtist'}) for batch in albums: for item in batch['Items']: LOG.debug('Album: {}'.format(item.get('Name'))) percent = int( (float(count) / float(total_items)) * 100) dialog.update(percent, message='Album: {} - {}'.format( item.get('AlbumArtist', ''), item.get('Name'))) obj.album(item) count += 1 songs = server.get_items(library_id, item_type='Audio', params={'SortBy': 'AlbumArtist'}) for batch in songs: for item in batch['Items']: LOG.debug('Song: {}'.format(item.get('Name'))) percent = int( (float(count) / float(total_items)) * 100) dialog.update(percent, message='Track: {} - {}'.format( item.get('AlbumArtist', ''), item.get('Name'))) obj.song(item) count += 1 if self.update_library: self.music_compare(library, obj, jellyfindb)
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: item = self.queue.get(timeout=1) except Queue.Empty: break try: LOG.debug('{} - {}'.format(item['Type'], item['Name'])) if item['Type'] == 'Movie': movies.movie(item) elif item['Type'] == 'BoxSet': movies.boxset(item) elif item['Type'] == 'Series': tvshows.tvshow(item) elif item['Type'] == 'Season': tvshows.season(item) elif item['Type'] == 'Episode': tvshows.episode(item) elif item['Type'] == 'MusicVideo': musicvideos.musicvideo(item) elif item['Type'] == 'MusicAlbum': music.album(item) elif item['Type'] == 'MusicArtist': music.artist(item) elif item['Type'] == 'AlbumArtist': music.albumartist(item) elif item['Type'] == 'Audio': music.song(item) if self.notify: self.notify_output.put( (item['Type'], api.API(item).get_naming())) except LibraryException as error: if error.status == 'StopCalled': break except Exception as error: LOG.exception(error) self.queue.task_done() if window('jellyfin_should_stop.bool'): break LOG.info("--<[ q:updated/%s ]", id(self)) self.is_done = True