def run(self): with self.lock, self.database as kodidb, Database( 'jellyfin') as jellyfindb: while True: try: item = self.queue.get(timeout=1) except Queue.Empty: break if item['Type'] == 'Movie': obj = Movies(self.args[0], jellyfindb, kodidb, self.args[1]).movie elif item['Type'] == 'Boxset': obj = Movies(self.args[0], jellyfindb, kodidb, self.args[1]).boxset elif item['Type'] == 'Series': obj = TVShows(self.args[0], jellyfindb, kodidb, self.args[1]).tvshow elif item['Type'] == 'Season': obj = TVShows(self.args[0], jellyfindb, kodidb, self.args[1]).season elif item['Type'] == 'Episode': obj = TVShows(self.args[0], jellyfindb, kodidb, self.args[1]).episode elif item['Type'] == 'MusicVideo': obj = MusicVideos(self.args[0], jellyfindb, kodidb, self.args[1]).musicvideo elif item['Type'] == 'MusicAlbum': obj = Music(self.args[0], jellyfindb, kodidb, self.args[1]).album elif item['Type'] == 'MusicArtist': obj = Music(self.args[0], jellyfindb, kodidb, self.args[1]).artist elif item['Type'] == 'AlbumArtist': obj = Music(self.args[0], jellyfindb, kodidb, self.args[1]).albumartist elif item['Type'] == 'Audio': obj = Music(self.args[0], jellyfindb, kodidb, self.args[1]).song try: if obj(item) and 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
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) 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) 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)
def run(self): with self.lock, self.database as kodidb, Database( 'jellyfin') as jellyfindb: while True: try: item = self.queue.get(timeout=1) 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) elif item['Type'] == 'BoxSet': Movies(*default_args).boxset(item) elif item['Type'] == 'Series': TVShows(*default_args).tvshow(item) elif item['Type'] == 'Season': TVShows(*default_args).season(item) elif item['Type'] == 'Episode': TVShows(*default_args).episode(item) elif item['Type'] == 'MusicVideo': MusicVideos(*default_args).musicvideo(item) elif item['Type'] == 'MusicAlbum': Music(*default_args).album(item) elif item['Type'] == 'MusicArtist': Music(*default_args).artist(item) elif item['Type'] == 'AlbumArtist': Music(*default_args).albumartist(item) elif item['Type'] == 'Audio': Music(*default_args).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
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 run(self): with self.lock, self.database as kodidb, Database('jellyfin') as jellyfindb: while True: try: item = self.queue.get(timeout=1) except Queue.Empty: break if item['Type'] == 'Movie': obj = Movies(self.args[0], jellyfindb, kodidb, self.args[1]).remove elif item['Type'] in ['Series', 'Season', 'Episode']: obj = TVShows(self.args[0], jellyfindb, kodidb, self.args[1]).remove elif item['Type'] in ['MusicAlbum', 'MusicArtist', 'AlbumArtist', 'Audio']: obj = Music(self.args[0], jellyfindb, kodidb, self.args[1]).remove elif item['Type'] == 'MusicVideo': obj = MusicVideos(self.args[0], jellyfindb, kodidb, self.args[1]).remove try: obj(item['Id']) 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:removed/%s ]", id(self)) self.is_done = True
def music(self, embycursor, kodicursor, pdialog): # Get music from emby emby_db = embydb.Embydb_Functions(embycursor) music = Music(embycursor, kodicursor, pdialog) views = emby_db.getView_byType('music') log.info("Media folders: %s", views) # Add music artists and everything will fall into place if pdialog: pdialog.update(heading=lang(29999), message="%s Music..." % lang(33021)) for view in views: all_artists = self.emby.getArtists(view['id'], dialog=pdialog) music.add_all("MusicArtist", all_artists) log.debug("Finished syncing music") return True
def run(self): with self.lock, self.database as kodidb, Database( 'jellyfin') as jellyfindb: while True: try: item = self.queue.get(timeout=1) except Queue.Empty: break default_args = (self.server, jellyfindb, kodidb, self.direct_path) try: if item['Type'] == 'Movie': Movies(*default_args).userdata(item) elif item['Type'] in ['Series', 'Season', 'Episode']: TVShows(*default_args).userdata(item) elif item['Type'] == 'MusicAlbum': Music(*default_args).album(item) elif item['Type'] == 'MusicArtist': Music(*default_args).artist(item) elif item['Type'] == 'AlbumArtist': Music(*default_args).albumartist(item) elif item['Type'] == 'Audio': Music(*default_args).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 main(): print("The Product Viewer Program ") print() products = (Product("Stanley 13 ounce wood hummer", 12.99, 62), Book("The World Is Flat", 15.95, 34, "Tomas Friedman"), Music("The Time Machine", 14.99, 95, 1992)) show_products(products) while True: number = int(input("Enter The Product Number ? ")) print() product = products[number - 1] show_product(product) choice = input("Continue (y/n): ") if choice.lower() != "y": print("bye") break
def remove_library(self, library_id, dialog): ''' Remove library by their id from the Kodi database. ''' direct_path = self.library.direct_path with Database('jellyfin') as jellyfindb: db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor) library = db.get_view(library_id.replace('Mixed:', "")) items = db.get_item_by_media_folder( library_id.replace('Mixed:', "")) media = 'music' if library[1] == 'music' else 'video' if media == 'music': settings('MusicRescan.bool', False) if items: count = 0 with self.library.music_database_lock if media == 'music' else self.library.database_lock: with Database(media) as kodidb: if library[1] == 'mixed': movies = [x for x in items if x[1] == 'Movie'] tvshows = [x for x in items if x[1] == 'Series'] obj = Movies(self.server, jellyfindb, kodidb, direct_path).remove for item in movies: obj(item[0]) dialog.update( int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (translate('addon_name'), library[0])) count += 1 obj = TVShows(self.server, jellyfindb, kodidb, direct_path).remove for item in tvshows: obj(item[0]) dialog.update( int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (translate('addon_name'), library[0])) count += 1 else: default_args = (self.server, jellyfindb, kodidb, direct_path) for item in items: if item[1] in ('Series', 'Season', 'Episode'): TVShows(*default_args).remove(item[0]) elif item[1] in ('Movie', 'BoxSet'): Movies(*default_args).remove(item[0]) elif item[1] in ('MusicAlbum', 'MusicArtist', 'AlbumArtist', 'Audio'): Music(*default_args).remove(item[0]) elif item[1] == 'MusicVideo': MusicVideos(*default_args).remove(item[0]) dialog.update( int((float(count) / float(len(items)) * 100)), heading="%s: %s" % (translate('addon_name'), library[0])) count += 1 self.sync = get_sync() if library_id in self.sync['Whitelist']: self.sync['Whitelist'].remove(library_id) elif 'Mixed:%s' % library_id in self.sync['Whitelist']: self.sync['Whitelist'].remove('Mixed:%s' % library_id) save_sync(self.sync)
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 music(self, embycursor, kodicursor, pdialog): return Music(embycursor, kodicursor).compare_all()
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