From de4515126a2d91939ac4bb6fb81e56a91f44ad31 Mon Sep 17 00:00:00 2001 From: meisnate12 Date: Sun, 23 May 2021 23:38:46 -0400 Subject: [PATCH] updated how the log looks --- modules/anidb.py | 2 +- modules/anilist.py | 2 +- modules/builder.py | 39 ++++++++++++++++-------------- modules/config.py | 42 ++++++++++++++++++++++---------- modules/imdb.py | 4 ++-- modules/letterboxd.py | 1 + modules/mal.py | 2 +- modules/meta.py | 8 +++---- modules/plex.py | 1 - modules/radarr.py | 2 ++ modules/sonarr.py | 2 ++ modules/tmdb.py | 2 +- modules/trakttv.py | 2 +- modules/tvdb.py | 1 + modules/util.py | 27 +++++++++++++-------- plex_meta_manager.py | 56 ++++++++++++++++++++++++++++++------------- 16 files changed, 123 insertions(+), 70 deletions(-) diff --git a/modules/anidb.py b/modules/anidb.py index 785ec679..b1beb49d 100644 --- a/modules/anidb.py +++ b/modules/anidb.py @@ -49,7 +49,6 @@ class AniDBAPI: def get_items(self, method, data, language): pretty = util.pretty_names[method] if method in util.pretty_names else method - logger.debug(f"Data: {data}") anidb_ids = [] if method == "anidb_popular": logger.info(f"Processing {pretty}: {data} Anime") @@ -60,6 +59,7 @@ class AniDBAPI: elif method == "anidb_relation": anidb_ids.extend(self._relations(data, language)) else: raise Failed(f"AniDB Error: Method {method} not supported") movie_ids, show_ids = self.config.Convert.anidb_to_ids(anidb_ids) + logger.debug("") logger.debug(f"AniDB IDs Found: {anidb_ids}") logger.debug(f"TMDb IDs Found: {movie_ids}") logger.debug(f"TVDb IDs Found: {show_ids}") diff --git a/modules/anilist.py b/modules/anilist.py index 3c366e93..7301327f 100644 --- a/modules/anilist.py +++ b/modules/anilist.py @@ -218,7 +218,6 @@ class AniListAPI: raise Failed(f"AniList Error: No valid AniList IDs in {anilist_ids}") def get_items(self, method, data): - logger.debug(f"Data: {data}") pretty = util.pretty_names[method] if method in util.pretty_names else method if method == "anilist_id": anilist_id, name = self._validate(data) @@ -243,6 +242,7 @@ class AniListAPI: else: raise Failed(f"AniList Error: Method {method} not supported") movie_ids, show_ids = self.config.Convert.anilist_to_ids(anilist_ids) + logger.debug("") logger.debug(f"AniList IDs Found: {anilist_ids}") logger.debug(f"Shows Found: {show_ids}") logger.debug(f"Movies Found: {movie_ids}") diff --git a/modules/builder.py b/modules/builder.py index 56ea1ea5..a606b048 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -384,8 +384,6 @@ class CollectionBuilder: if skip_collection: raise Failed(f"{self.schedule}\n\nCollection {self.name} not scheduled to run") - logger.info(f"Scanning {self.name} Collection") - self.run_again = "run_again" in methods self.collectionless = "plex_collectionless" in methods @@ -432,8 +430,9 @@ class CollectionBuilder: else: raise Failed("Collection Error: smart_url attribute is blank") + self.smart_filter_details = "" if "smart_filter" in methods: - logger.info("") + filter_details = "\n" smart_filter = self.data[methods["smart_filter"]] if smart_filter is None: raise Failed(f"Collection Error: smart_filter attribute is blank") @@ -453,7 +452,7 @@ class CollectionBuilder: smart_type = "shows" else: smart_type = "movies" - logger.info(f"Smart {smart_type.capitalize()[:-1]} Filter") + filter_details += f"Smart {smart_type.capitalize()[:-1]} Filter\n" self.smart_type_key, smart_sorts = plex.smart_types[smart_type] smart_sort = "random" @@ -463,7 +462,7 @@ class CollectionBuilder: if smart_filter[smart_methods["sort_by"]] not in smart_sorts: raise Failed(f"Collection Error: sort_by: {smart_filter[smart_methods['sort_by']]} is invalid") smart_sort = smart_filter[smart_methods["sort_by"]] - logger.info(f"Sort By: {smart_sort}") + filter_details += f"Sort By: {smart_sort}\n" limit = None if "limit" in smart_methods: @@ -472,7 +471,7 @@ class CollectionBuilder: if not isinstance(smart_filter[smart_methods["limit"]], int) or smart_filter[smart_methods["limit"]] < 1: raise Failed("Collection Error: limit attribute must be an integer greater then 0") limit = smart_filter[smart_methods["limit"]] - logger.info(f"Limit: {limit}") + filter_details += f"Limit: {limit}\n" validate = True if "validate" in smart_methods: @@ -481,7 +480,7 @@ class CollectionBuilder: if not isinstance(smart_filter[smart_methods["validate"]], bool): raise Failed("Collection Error: validate attribute must be either true or false") validate = smart_filter[smart_methods["validate"]] - logger.info(f"Validate: {validate}") + filter_details += f"Validate: {validate}\n" def _filter(filter_dict, fail, is_all=True, level=1): output = "" @@ -590,7 +589,7 @@ class CollectionBuilder: if not isinstance(smart_filter[smart_methods[base]], dict): raise Failed(f"Collection Error: {base} must be a dictionary: {smart_filter[smart_methods[base]]}") built_filter, filter_text = _filter(smart_filter[smart_methods[base]], validate, is_all=base_all) - util.print_multiline(f"Filter:{filter_text}") + self.smart_filter_details = f"{filter_details}Filter:{filter_text}" final_filter = built_filter[:-1] if base_all else f"push=1&{built_filter}pop=1" self.smart_url = f"?type={self.smart_type_key}&{f'limit={limit}&' if limit else ''}sort={smart_sorts[smart_sort]}&{final_filter}" @@ -1277,6 +1276,8 @@ class CollectionBuilder: else: self.sync = False self.run_again = False + logger.info("") + logger.info("Validation Successful") def collect_rating_keys(self, movie_map, show_map): def add_rating_keys(keys): @@ -1442,10 +1443,11 @@ class CollectionBuilder: elif self.details["show_filtered"] is True: logger.info(f"{name} Collection | X | {current.title}") media_type = f"{'Movie' if self.library.is_movie else 'Show'}{'s' if total > 1 else ''}" - logger.info(util.adjust_space(length, f"{total} {media_type} Processed")) + util.print_end(length) + logger.info("") + logger.info(f"{total} {media_type} Processed") def run_missing(self): - logger.info("") arr_filters = [] for filter_method, filter_data in self.filters: if (filter_method.startswith("original_language") and self.library.is_movie) or filter_method.startswith("tmdb_vote_count"): @@ -1472,6 +1474,7 @@ class CollectionBuilder: logger.info(f"{self.name} Collection | ? | {movie.title} (TMDb: {missing_id})") elif self.details["show_filtered"] is True: logger.info(f"{self.name} Collection | X | {movie.title} (TMDb: {missing_id})") + logger.info("") logger.info(f"{len(missing_movies_with_names)} Movie{'s' if len(missing_movies_with_names) > 1 else ''} Missing") if self.details["save_missing"] is True: self.library.add_missing(self.name, missing_movies_with_names, True) @@ -1506,6 +1509,7 @@ class CollectionBuilder: logger.info(f"{self.name} Collection | ? | {title} (TVDB: {missing_id})") elif self.details["show_filtered"] is True: logger.info(f"{self.name} Collection | X | {title} (TVDb: {missing_id})") + logger.info("") logger.info(f"{len(missing_shows_with_names)} Show{'s' if len(missing_shows_with_names) > 1 else ''} Missing") if self.details["save_missing"] is True: self.library.add_missing(self.name, missing_shows_with_names, False) @@ -1520,17 +1524,22 @@ class CollectionBuilder: self.run_again_shows.extend(missing_tvdb_ids) def sync_collection(self): - logger.info("") count_removed = 0 for ratingKey, item in self.plex_map.items(): if item is not None: + if count_removed == 0: + logger.info("") + util.separator(f"Removed from {self.name} Collection", space=False, border=False) + logger.info("") logger.info(f"{self.name} Collection | - | {item.title}") if self.smart_label_collection: self.library.query_data(item.removeLabel, self.name) else: self.library.query_data(item.removeCollection, self.name) count_removed += 1 - logger.info(f"{count_removed} {'Movie' if self.library.is_movie else 'Show'}{'s' if count_removed == 1 else ''} Removed") + if count_removed > 0: + logger.info("") + logger.info(f"{count_removed} {'Movie' if self.library.is_movie else 'Show'}{'s' if count_removed == 1 else ''} Removed") def update_details(self): if not self.obj and self.smart_url: @@ -1644,9 +1653,6 @@ class CollectionBuilder: except BadRequest: logger.error(f"Detail: {image_method} failed to update {message}") - if len(self.posters) > 0: - logger.info("") - if len(self.posters) > 1: logger.info(f"{len(self.posters)} posters found:") for p in self.posters: @@ -1671,9 +1677,6 @@ class CollectionBuilder: elif "tmdb_show_details" in self.posters: set_image("tmdb_show_details", self.posters) else: logger.info("No poster to update") - if len(self.backgrounds) > 0: - logger.info("") - if len(self.backgrounds) > 1: logger.info(f"{len(self.backgrounds)} backgrounds found:") for b in self.backgrounds: diff --git a/modules/config.py b/modules/config.py index 716c1e70..994a2810 100644 --- a/modules/config.py +++ b/modules/config.py @@ -318,14 +318,17 @@ class Config: continue util.separator() params = {} - logger.info("") + params["mapping_name"] = str(library_name) if lib and "library_name" in lib and lib["library_name"]: params["name"] = str(lib["library_name"]) - logger.info(f"Connecting to {params['name']} ({library_name}) Library...") + display_name = f"{params['name']} ({params['mapping_name']})" else: - params["name"] = str(library_name) - logger.info(f"Connecting to {params['name']} Library...") - params["mapping_name"] = str(library_name) + params["name"] = params["mapping_name"] + display_name = params["mapping_name"] + + util.separator(f"{display_name} Configuration") + logger.info("") + logger.info(f"Connecting to {display_name} Library...") params["asset_directory"] = check_for_attribute(lib, "asset_directory", parent="settings", var_type="list_path", default=self.general["asset_directory"], default_is_none=True, save=False) if params["asset_directory"] is None: @@ -436,15 +439,19 @@ class Config: params["plex"]["empty_trash"] = check_for_attribute(lib, "empty_trash", parent="plex", var_type="bool", default=self.general["plex"]["empty_trash"], save=False) params["plex"]["optimize"] = check_for_attribute(lib, "optimize", parent="plex", var_type="bool", default=self.general["plex"]["optimize"], save=False) library = PlexAPI(params, self.TMDb, self.TVDb) - logger.info(f"{params['name']} Library Connection Successful") + logger.info("") + logger.info(f"{display_name} Library Connection Successful") except Failed as e: util.print_multiline(e, error=True) - logger.info(f"{params['name']} Library Connection Failed") + logger.info(f"{display_name} Library Connection Failed") continue if self.general["radarr"]["url"] or (lib and "radarr" in lib): logger.info("") - logger.info(f"Connecting to {params['name']} library's Radarr...") + util.separator("Radarr Configuration", space=False, border=False) + logger.info("") + logger.info(f"Connecting to {display_name} library's Radarr...") + logger.info("") radarr_params = {} try: radarr_params["url"] = check_for_attribute(lib, "url", parent="radarr", default=self.general["radarr"]["url"], req_default=True, save=False) @@ -460,11 +467,15 @@ class Config: library.Radarr = RadarrAPI(radarr_params) except Failed as e: util.print_multiline(e, error=True) - logger.info(f"{params['name']} library's Radarr Connection {'Failed' if library.Radarr is None else 'Successful'}") + logger.info("") + logger.info(f"{display_name} library's Radarr Connection {'Failed' if library.Radarr is None else 'Successful'}") if self.general["sonarr"]["url"] or (lib and "sonarr" in lib): logger.info("") - logger.info(f"Connecting to {params['name']} library's Sonarr...") + util.separator("Sonarr Configuration", space=False, border=False) + logger.info("") + logger.info(f"Connecting to {display_name} library's Sonarr...") + logger.info("") sonarr_params = {} try: sonarr_params["url"] = check_for_attribute(lib, "url", parent="sonarr", default=self.general["sonarr"]["url"], req_default=True, save=False) @@ -486,11 +497,15 @@ class Config: library.Sonarr = SonarrAPI(sonarr_params, library.Plex.language) except Failed as e: util.print_multiline(e, error=True) - logger.info(f"{params['name']} library's Sonarr Connection {'Failed' if library.Sonarr is None else 'Successful'}") + logger.info("") + logger.info(f"{display_name} library's Sonarr Connection {'Failed' if library.Sonarr is None else 'Successful'}") if self.general["tautulli"]["url"] or (lib and "tautulli" in lib): logger.info("") - logger.info(f"Connecting to {params['name']} library's Tautulli...") + util.separator("Tautulli Configuration", space=False, border=False) + logger.info("") + logger.info(f"Connecting to {display_name} library's Tautulli...") + logger.info("") tautulli_params = {} try: tautulli_params["url"] = check_for_attribute(lib, "url", parent="tautulli", default=self.general["tautulli"]["url"], req_default=True, save=False) @@ -498,7 +513,8 @@ class Config: library.Tautulli = TautulliAPI(tautulli_params) except Failed as e: util.print_multiline(e, error=True) - logger.info(f"{params['name']} library's Tautulli Connection {'Failed' if library.Tautulli is None else 'Successful'}") + logger.info("") + logger.info(f"{display_name} library's Tautulli Connection {'Failed' if library.Tautulli is None else 'Successful'}") logger.info("") self.libraries.append(library) diff --git a/modules/imdb.py b/modules/imdb.py index 6b037032..728c79a9 100644 --- a/modules/imdb.py +++ b/modules/imdb.py @@ -93,14 +93,13 @@ class IMDbAPI: def get_items(self, method, data, language, is_movie): pretty = util.pretty_names[method] if method in util.pretty_names else method - logger.debug(f"Data: {data}") show_ids = [] movie_ids = [] def run_convert(imdb_id): tvdb_id = self.config.Convert.imdb_to_tvdb(imdb_id) if not is_movie else None tmdb_id = self.config.Convert.imdb_to_tmdb(imdb_id) if tvdb_id is None else None if not tmdb_id and not tvdb_id: - logger.error(f"Convert Error: No TMDb ID or TVDb ID found for IMDb: {imdb_id}") + logger.error(f"Convert Error: No {'' if is_movie else 'TVDb ID or '}TMDb ID found for IMDb: {imdb_id}") if tmdb_id: movie_ids.append(tmdb_id) if tvdb_id: show_ids.append(tvdb_id) @@ -119,6 +118,7 @@ class IMDbAPI: logger.info(util.adjust_space(length, f"Processed {total_ids} IMDb IDs")) else: raise Failed(f"IMDb Error: Method {method} not supported") + logger.debug("") logger.debug(f"TMDb IDs Found: {movie_ids}") logger.debug(f"TVDb IDs Found: {show_ids}") return movie_ids, show_ids diff --git a/modules/letterboxd.py b/modules/letterboxd.py index 6f8f6e01..681ff2ae 100644 --- a/modules/letterboxd.py +++ b/modules/letterboxd.py @@ -69,5 +69,6 @@ class LetterboxdAPI: logger.info(util.adjust_space(length, f"Processed {total_items} TMDb IDs")) else: logger.error(f"Letterboxd Error: No List Items found in {data}") + logger.debug("") logger.debug(f"TMDb IDs Found: {movie_ids}") return movie_ids, [] diff --git a/modules/mal.py b/modules/mal.py index 5be31e4a..eda320b4 100644 --- a/modules/mal.py +++ b/modules/mal.py @@ -194,7 +194,6 @@ class MyAnimeListAPI: return self._parse_request(url) def get_items(self, method, data): - logger.debug(f"Data: {data}") pretty = util.pretty_names[method] if method in util.pretty_names else method if method == "mal_id": mal_ids = [data] @@ -214,6 +213,7 @@ class MyAnimeListAPI: else: raise Failed(f"MyAnimeList Error: Method {method} not supported") movie_ids, show_ids = self.config.Convert.myanimelist_to_ids(mal_ids) + logger.debug("") logger.debug(f"MyAnimeList IDs Found: {mal_ids}") logger.debug(f"Shows Found: {show_ids}") logger.debug(f"Movies Found: {movie_ids}") diff --git a/modules/meta.py b/modules/meta.py index 3a1330a2..965fbcf1 100644 --- a/modules/meta.py +++ b/modules/meta.py @@ -66,11 +66,11 @@ class Metadata: return self.collections def update_metadata(self, TMDb, test): - logger.info("") - util.separator(f"Running Metadata") - logger.info("") if not self.metadata: - raise Failed("No metadata to edit") + return None + logger.info("") + util.separator("Running Metadata") + logger.info("") for mapping_name, meta in self.metadata.items(): methods = {mm.lower(): mm for mm in meta} if test and ("test" not in methods or meta[methods["test"]] is not True): diff --git a/modules/plex.py b/modules/plex.py index 7b333e04..104bbd76 100644 --- a/modules/plex.py +++ b/modules/plex.py @@ -530,7 +530,6 @@ class PlexAPI: return valid_collections def get_items(self, method, data): - logger.debug(f"Data: {data}") pretty = util.pretty_names[method] if method in util.pretty_names else method media_type = "Movie" if self.is_movie else "Show" items = [] diff --git a/modules/radarr.py b/modules/radarr.py index 9f211251..1f7e3203 100644 --- a/modules/radarr.py +++ b/modules/radarr.py @@ -66,6 +66,8 @@ class RadarrAPI: raise Failed(f"Sonarr Error: TMDb ID: {tmdb_id} not found") def add_tmdb(self, tmdb_ids, **options): + logger.info("") + util.separator(f"Adding to Radarr", space=False, border=False) logger.info("") logger.debug(f"TMDb IDs: {tmdb_ids}") tag_nums = [] diff --git a/modules/sonarr.py b/modules/sonarr.py index de7c0c5b..4a631216 100644 --- a/modules/sonarr.py +++ b/modules/sonarr.py @@ -86,6 +86,8 @@ class SonarrAPI: raise Failed(f"Sonarr Error: TVDb ID: {tvdb_id} not found") def add_tvdb(self, tvdb_ids, **options): + logger.info("") + util.separator(f"Adding to Sonarr", space=False, border=False) logger.info("") logger.debug(f"TVDb IDs: {tvdb_ids}") tag_nums = [] diff --git a/modules/tmdb.py b/modules/tmdb.py index 819583e6..e493915e 100644 --- a/modules/tmdb.py +++ b/modules/tmdb.py @@ -292,7 +292,6 @@ class TMDbAPI: return tmdb_id def get_items(self, method, data, is_movie): - logger.debug(f"Data: {data}") pretty = util.pretty_names[method] if method in util.pretty_names else method media_type = "Movie" if is_movie else "Show" movie_ids = [] @@ -362,6 +361,7 @@ class TMDbAPI: logger.info(f"Processing {pretty}: ({tmdb_id}) {tmdb_name} ({len(movie_ids)} Movie{'' if len(movie_ids) == 1 else 's'})") if not is_movie and len(show_ids) > 0: logger.info(f"Processing {pretty}: ({tmdb_id}) {tmdb_name} ({len(show_ids)} Show{'' if len(show_ids) == 1 else 's'})") + logger.debug("") logger.debug(f"TMDb IDs Found: {movie_ids}") logger.debug(f"TVDb IDs Found: {show_ids}") return movie_ids, show_ids diff --git a/modules/trakttv.py b/modules/trakttv.py index 37d82b13..8ed2a9d3 100644 --- a/modules/trakttv.py +++ b/modules/trakttv.py @@ -157,7 +157,6 @@ class TraktAPI: return trakt_values def get_items(self, method, data, is_movie): - logger.debug(f"Data: {data}") pretty = self.aliases[method] if method in self.aliases else method media_type = "Movie" if is_movie else "Show" if method in ["trakt_trending", "trakt_popular", "trakt_recommended", "trakt_watched", "trakt_collected"]: @@ -181,6 +180,7 @@ class TraktAPI: elif (isinstance(trakt_item, (Season, Episode))) and trakt_item.show.pk[1] not in show_ids: show_ids.append(int(trakt_item.show.pk[1])) logger.debug(f"Trakt {media_type} Found: {trakt_items}") + logger.debug("") logger.debug(f"TMDb IDs Found: {movie_ids}") logger.debug(f"TVDb IDs Found: {show_ids}") return movie_ids, show_ids diff --git a/modules/tvdb.py b/modules/tvdb.py index 8024dac8..93970232 100644 --- a/modules/tvdb.py +++ b/modules/tvdb.py @@ -163,6 +163,7 @@ class TVDbAPI: show_ids.extend(tvdb_ids) else: raise Failed(f"TVDb Error: Method {method} not supported") + logger.debug("") logger.debug(f"TMDb IDs Found: {movie_ids}") logger.debug(f"TVDb IDs Found: {show_ids}") return movie_ids, show_ids diff --git a/modules/util.py b/modules/util.py index 637fe53a..62676d8d 100644 --- a/modules/util.py +++ b/modules/util.py @@ -352,28 +352,35 @@ def regex_first_int(data, id_type, default=None): else: raise Failed(f"Regex Error: Failed to parse {id_type} from {data}") -def centered(text, do_print=True): +def centered(text, sep=" "): if len(text) > screen_width - 2: raise Failed("text must be shorter then screen_width") space = screen_width - len(text) - 2 + text = f" {text} " if space % 2 == 1: - text += " " + text += sep space -= 1 - side = int(space / 2) - final_text = f"{' ' * side}{text}{' ' * side}" - if do_print: - logger.info(final_text) + side = int(space / 2) - 1 + final_text = f"{sep * side}{text}{sep * side}" return final_text -def separator(text=None): +def separator(text=None, space=True, border=True, debug=False): + sep = " " if space else separating_character for handler in logger.handlers: apply_formatter(handler, border=False) - logger.info(f"|{separating_character * screen_width}|") + border_text = f"|{separating_character * screen_width}|" + if border and debug: + logger.debug(border_text) + elif border: + logger.info(border_text) if text: text_list = text.split("\n") for t in text_list: - logger.info(f"| {centered(t, do_print=False)} |") - logger.info(f"|{separating_character * screen_width}|") + logger.info(f"|{sep}{centered(t, sep=sep)}{sep}|") + if border and debug: + logger.debug(border_text) + elif border: + logger.info(border_text) for handler in logger.handlers: apply_formatter(handler) diff --git a/plex_meta_manager.py b/plex_meta_manager.py index 36cbffd1..e4df9845 100644 --- a/plex_meta_manager.py +++ b/plex_meta_manager.py @@ -91,15 +91,14 @@ def start(config_path, is_test, daily, requested_collections, requested_librarie file_handler.doRollover() logger.addHandler(file_handler) util.separator() - util.centered(" ") - util.centered(" ____ _ __ __ _ __ __ ") - util.centered("| _ \\| | _____ __ | \\/ | ___| |_ __ _ | \\/ | __ _ _ __ __ _ __ _ ___ _ __ ") - util.centered("| |_) | |/ _ \\ \\/ / | |\\/| |/ _ \\ __/ _` | | |\\/| |/ _` | '_ \\ / _` |/ _` |/ _ \\ '__|") - util.centered("| __/| | __/> < | | | | __/ || (_| | | | | | (_| | | | | (_| | (_| | __/ | ") - util.centered("|_| |_|\\___/_/\\_\\ |_| |_|\\___|\\__\\__,_| |_| |_|\\__,_|_| |_|\\__,_|\\__, |\\___|_| ") - util.centered(" |___/ ") - util.centered(" Version: 1.9.2 ") - util.separator() + logger.info(util.centered(" ")) + logger.info(util.centered(" ____ _ __ __ _ __ __ ")) + logger.info(util.centered("| _ \\| | _____ __ | \\/ | ___| |_ __ _ | \\/ | __ _ _ __ __ _ __ _ ___ _ __ ")) + logger.info(util.centered("| |_) | |/ _ \\ \\/ / | |\\/| |/ _ \\ __/ _` | | |\\/| |/ _` | '_ \\ / _` |/ _` |/ _ \\ '__|")) + logger.info(util.centered("| __/| | __/> < | | | | __/ || (_| | | | | | (_| | | | | (_| | (_| | __/ | ")) + logger.info(util.centered("|_| |_|\\___/_/\\_\\ |_| |_|\\___|\\__\\__,_| |_| |_|\\__,_|_| |_|\\__,_|\\__, |\\___|_| ")) + logger.info(util.centered(" |___/ ")) + logger.info(util.centered(" Version: 1.9.2 ")) if daily: start_type = "Daily " elif is_test: start_type = "Test " elif requested_collections: start_type = "Collections " @@ -132,7 +131,7 @@ def update_libraries(config, is_test, requested_collections, resume_from): logger.info("") util.separator(f"{library.name} Library") logger.info("") - util.separator(f"Mapping {library.name} Library") + util.separator(f"Mapping {library.name} Library", space=False, border=False) logger.info("") movie_map, show_map = map_guids(config, library) if not is_test and not resume_from and not collection_only and library.mass_update: @@ -145,18 +144,22 @@ def update_libraries(config, is_test, requested_collections, resume_from): metadata.update_metadata(config.TMDb, is_test) except Failed as e: logger.error(e) - logger.info("") - util.separator(f"{'Test ' if is_test else ''}Collections") collections_to_run = metadata.get_collections(requested_collections) if resume_from and resume_from not in collections_to_run: + logger.info("") logger.warning(f"Collection: {resume_from} not in Metadata File: {metadata.path}") continue if collections_to_run and not library_only: + logger.info("") + util.separator(f"{'Test ' if is_test else ''}Collections") logger.removeHandler(library_handler) resume_from = run_collection(config, library, metadata, collections_to_run, is_test, resume_from, movie_map, show_map) logger.addHandler(library_handler) - if not is_test and not requested_collections: + if not is_test and not requested_collections and ((library.show_unmanaged and not library_only) or (library.assets_for_all and not collection_only)): + logger.info("") + util.separator(f"Other {library.name} Library Operations") + logger.info("") unmanaged_collections = [] for col in library.get_all_collections(): if col.title not in library.collections: @@ -164,15 +167,16 @@ def update_libraries(config, is_test, requested_collections, resume_from): if library.show_unmanaged and not library_only: logger.info("") - util.separator(f"Unmanaged Collections in {library.name} Library") + util.separator(f"Unmanaged Collections in {library.name} Library", space=False, border=False) logger.info("") for col in unmanaged_collections: logger.info(col.title) + logger.info("") logger.info(f"{len(unmanaged_collections)} Unmanaged Collections") if library.assets_for_all and not collection_only: logger.info("") - util.separator(f"All {'Movies' if library.is_movie else 'Shows'} Assets Check for {library.name} Library") + util.separator(f"All {'Movies' if library.is_movie else 'Shows'} Assets Check for {library.name} Library", space=False, border=False) logger.info("") for col in unmanaged_collections: library.update_item_from_assets(col, collection_mode=True) @@ -236,6 +240,7 @@ def map_guids(config, library): show_map = {} length = 0 logger.info(f"Mapping {'Movie' if library.is_movie else 'Show'} Library: {library.name}") + logger.info("") items = library.Plex.all() for i, item in enumerate(items, 1): length = util.print_return(length, f"Processing: {i}/{len(items)} {item.title}") @@ -251,6 +256,7 @@ def map_guids(config, library): for m in main_id: if m in show_map: show_map[m].append(item.ratingKey) else: show_map[m] = [item.ratingKey] + logger.info("") logger.info(util.adjust_space(length, f"Processed {len(items)} {'Movies' if library.is_movie else 'Shows'}")) return movie_map, show_map @@ -419,11 +425,19 @@ def run_collection(config, library, metadata, requested_collections, is_test, re logger.info(output_str) logger.info("") + util.separator(f"Validating {mapping_name} Attributes", space=False, border=False) + builder = CollectionBuilder(config, library, metadata, mapping_name, collection_attrs) + logger.info("") + + util.separator(f"Building {mapping_name} Collection", space=False, border=False) if len(builder.schedule) > 0: util.print_multiline(builder.schedule, info=True) + if len(builder.smart_filter_details) > 0: + util.print_multiline(builder.smart_filter_details, info=True) + if not builder.smart_url: logger.info("") logger.info(f"Sync Mode: {'sync' if builder.sync else 'append'}") @@ -434,16 +448,24 @@ def run_collection(config, library, metadata, requested_collections, is_test, re logger.info(f"Collection Filter {filter_key}: {filter_value}") builder.collect_rating_keys(movie_map, show_map) - logger.info("") + if len(builder.rating_keys) > 0 and builder.build_collection: + logger.info("") + util.separator(f"Adding to {mapping_name} Collection", space=False, border=False) + logger.info("") builder.add_to_collection(movie_map) if len(builder.missing_movies) > 0 or len(builder.missing_shows) > 0: + logger.info("") + util.separator(f"Missing from Library", space=False, border=False) + logger.info("") builder.run_missing() if builder.sync and len(builder.rating_keys) > 0 and builder.build_collection: builder.sync_collection() - logger.info("") if builder.build_collection: + logger.info("") + util.separator(f"Updating Details of {mapping_name} Collection", space=False, border=False) + logger.info("") builder.update_details() if builder.run_again and (len(builder.run_again_movies) > 0 or len(builder.run_again_shows) > 0):