From 8519342eb347c16ab4418d2164f3ded2d2d96e1c Mon Sep 17 00:00:00 2001 From: meisnate12 Date: Thu, 20 May 2021 15:26:56 -0400 Subject: [PATCH] fix for tag.remove --- modules/builder.py | 37 ++++++++------------- modules/meta.py | 81 +++++++++++++++++++++------------------------- modules/plex.py | 29 +++++++++++++++++ 3 files changed, 80 insertions(+), 67 deletions(-) diff --git a/modules/builder.py b/modules/builder.py index 59f81217..028d95d5 100644 --- a/modules/builder.py +++ b/modules/builder.py @@ -1603,12 +1603,12 @@ class CollectionBuilder: if "label" in self.details or "label.remove" in self.details or "label.sync" in self.details: item_labels = [label.tag for label in self.obj.labels] - labels = self.details["label" if "label" in self.details else "label.sync"] - if "label.sync" in self.details: - for label in (la for la in item_labels if la not in labels): - self.library.query_data(self.obj.removeLabel, label) - logger.info(f"Detail: Label {label} removed") if "label" in self.details or "label.sync" in self.details: + labels = self.details["label" if "label" in self.details else "label.sync"] + if "label.sync" in self.details: + for label in (la for la in item_labels if la not in labels): + self.library.query_data(self.obj.removeLabel, label) + logger.info(f"Detail: Label {label} removed") for label in (la for la in labels if la not in item_labels): self.library.query_data(self.obj.addLabel, label) logger.info(f"Detail: Label {label} added") @@ -1618,26 +1618,17 @@ class CollectionBuilder: self.library.query_data(self.obj.removeLabel, label) logger.info(f"Detail: Label {label} removed") + add_tags = self.details["label"] if "label" in self.details else None + remove_tags = self.details["label.remove"] if "label.remove" in self.details else None + sync_tags = self.details["label.sync"] if "label.sync" in self.details else None + self.library.edit_tags("label", self.obj, add_tags=add_tags, remove_tags=remove_tags, sync_tags=sync_tags) + if len(self.item_details) > 0: - labels = None - if "item_label" in self.item_details or "item_label.remove" in self.item_details or "item_label.sync" in self.item_details: - labels = self.item_details["item_label" if "item_label" in self.item_details else "item_label.sync"] + add_tags = self.item_details["item_label"] if "item_label" in self.item_details else None + remove_tags = self.item_details["item_label.remove"] if "item_label.remove" in self.item_details else None + sync_tags = self.item_details["item_label.sync"] if "item_label.sync" in self.item_details else None for item in self.library.get_collection_items(self.obj, self.smart_label_collection): - if labels is not None: - item_labels = [label.tag for label in item.labels] - if "item_label.sync" in self.item_details: - for label in (la for la in item_labels if la not in labels): - self.library.query_data(item.removeLabel, label) - logger.info(f"Detail: Label {label} removed from {item.title}") - if "item_label" in self.item_details or "item_label.sync" in self.item_details: - for label in (la for la in labels if la not in item_labels): - self.library.query_data(item.addLabel, label) - logger.info(f"Detail: Label {label} added to {item.title}") - if "item_label.remove" in self.item_details: - for label in self.item_details["item_label.remove"]: - if label in item_labels: - self.library.query_data(self.obj.removeLabel, label) - logger.info(f"Detail: Label {label} removed from {item.title}") + self.library.edit_tags("label", item, add_tags=add_tags, remove_tags=remove_tags, sync_tags=sync_tags) advance_edits = {} for method_name, method_data in self.item_details.items(): if method_name in plex.item_advance_keys: diff --git a/modules/meta.py b/modules/meta.py index 9efc9a09..3a1330a2 100644 --- a/modules/meta.py +++ b/modules/meta.py @@ -119,8 +119,6 @@ class Metadata: logger.error(f"Metadata Error: {attr} attribute is blank") def edit_tags(attr, obj, group, alias, key=None, extra=None, movie_library=False): - if key is None: - key = f"{attr}s" if movie_library and not self.library.is_movie: logger.error(f"Metadata Error: {attr} attribute only works for movie libraries") elif attr in alias and f"{attr}.sync" in alias: @@ -134,33 +132,16 @@ class Metadata: elif f"{attr}.sync" in alias and group[alias[f"{attr}.sync"]] is None: logger.error(f"Metadata Error: {attr}.sync attribute is blank") elif attr in alias or f"{attr}.remove" in alias or f"{attr}.sync" in alias: - attr_key = attr if attr in alias else f"{attr}.sync" - item_tags = [item_tag.tag for item_tag in getattr(obj, key)] - input_tags = [] - if group[alias[attr_key]]: - input_tags.extend(util.get_list(group[alias[attr_key]])) + add_tags = group[alias[attr]] if attr in alias else None if extra: - input_tags.extend(extra) - if f"{attr}.sync" in alias: - remove_method = getattr(obj, f"remove{attr.capitalize()}") - for tag in (t for t in item_tags if t not in input_tags): - updated = True - self.library.query_data(remove_method, tag) - logger.info(f"Detail: {attr.capitalize()} {tag} removed") - if attr in alias or f"{attr}.sync" in alias: - add_method = getattr(obj, f"add{attr.capitalize()}") - for tag in (t for t in input_tags if t not in item_tags): - updated = True - self.library.query_data(add_method, tag) - logger.info(f"Detail: {attr.capitalize()} {tag} added") - if f"{attr}.remove" in alias: - remove_method = getattr(obj, f"remove{attr.capitalize()}") - for tag in util.get_list(group[alias[f"{attr}.remove"]]): - if tag in item_tags: - self.library.query_data(remove_method, tag) - logger.info(f"Detail: {attr.capitalize()} {tag} removed") - else: - logger.error(f"Metadata Error: {attr} attribute is blank") + if add_tags: + add_tags.extend(extra) + else: + add_tags = extra + remove_tags = group[alias[f"{attr}.remove"]] if f"{attr}.remove" in alias else None + sync_tags = group[alias[f"{attr}.sync"]] if f"{attr}.sync" in alias else None + return self.library.edit_tags("attr", obj, add_tags=add_tags, remove_tags=remove_tags, sync_tags=sync_tags, key=key) + return False def set_image(attr, obj, group, alias, poster=True, url=True): if group[alias[attr]]: @@ -262,8 +243,7 @@ class Metadata: edits = {} add_edit("title", item.title, meta, methods, value=title) add_edit("sort_title", item.titleSort, meta, methods, key="titleSort") - add_edit("originally_available", str(item.originallyAvailableAt)[:-9], meta, methods, - key="originallyAvailableAt", value=originally_available, var_type="date") + add_edit("originally_available", str(item.originallyAvailableAt)[:-9], meta, methods, key="originallyAvailableAt", value=originally_available, var_type="date") add_edit("critic_rating", item.rating, meta, methods, value=rating, key="rating", var_type="float") add_edit("audience_rating", item.audienceRating, meta, methods, key="audienceRating", var_type="float") add_edit("content_rating", item.contentRating, meta, methods, key="contentRating") @@ -271,7 +251,8 @@ class Metadata: add_edit("studio", item.studio, meta, methods, value=studio) add_edit("tagline", item.tagline, meta, methods, value=tagline) add_edit("summary", item.summary, meta, methods, value=summary) - self.library.edit_item(item, mapping_name, item_type, edits) + if self.library.edit_item(item, mapping_name, item_type, edits): + updated = True advance_edits = {} add_advanced_edit("episode_sorting", item, meta, methods, show_library=True) @@ -281,15 +262,23 @@ class Metadata: add_advanced_edit("episode_ordering", item, meta, methods, show_library=True) add_advanced_edit("metadata_language", item, meta, methods, new_agent=True) add_advanced_edit("use_original_title", item, meta, methods, new_agent=True) - self.library.edit_item(item, mapping_name, item_type, advance_edits, advanced=True) + if self.library.edit_item(item, mapping_name, item_type, advance_edits, advanced=True): + updated = True - edit_tags("genre", item, meta, methods, extra=genres) - edit_tags("label", item, meta, methods) - edit_tags("collection", item, meta, methods) - edit_tags("country", item, meta, methods, key="countries", movie_library=True) - edit_tags("director", item, meta, methods, movie_library=True) - edit_tags("producer", item, meta, methods, movie_library=True) - edit_tags("writer", item, meta, methods, movie_library=True) + if edit_tags("genre", item, meta, methods, extra=genres): + updated = True + if edit_tags("label", item, meta, methods): + updated = True + if edit_tags("collection", item, meta, methods): + updated = True + if edit_tags("country", item, meta, methods, key="countries", movie_library=True): + updated = True + if edit_tags("director", item, meta, methods, movie_library=True): + updated = True + if edit_tags("producer", item, meta, methods, movie_library=True): + updated = True + if edit_tags("writer", item, meta, methods, movie_library=True): + updated = True logger.info(f"{item_type}: {mapping_name} Details Update {'Complete' if updated else 'Not Needed'}") @@ -330,7 +319,8 @@ class Metadata: edits = {} add_edit("title", season.title, season_dict, season_methods, value=title) add_edit("summary", season.summary, season_dict, season_methods) - self.library.edit_item(season, season_id, "Season", edits) + if self.library.edit_item(season, season_id, "Season", edits): + updated = True set_images(season, season_dict, season_methods) else: logger.error(f"Metadata Error: Season: {season_id} invalid, it must be an integer") @@ -380,11 +370,14 @@ class Metadata: add_edit("originally_available", str(episode.originallyAvailableAt)[:-9], episode_dict, episode_methods, key="originallyAvailableAt") add_edit("summary", episode.summary, episode_dict, episode_methods) - self.library.edit_item(episode, f"{season_id} Episode: {episode_id}", "Season", edits) - edit_tags("director", episode, episode_dict, episode_methods) - edit_tags("writer", episode, episode_dict, episode_methods) + if self.library.edit_item(episode, f"{season_id} Episode: {episode_id}", "Season", edits): + updated = True + if edit_tags("director", episode, episode_dict, episode_methods): + updated = True + if edit_tags("writer", episode, episode_dict, episode_methods): + updated = True set_images(episode, episode_dict, episode_methods) - logger.info(f"Episode S{episode_id}E{season_id} of {mapping_name} Details Update {'Complete' if updated else 'Not Needed'}") + logger.info(f"Episode S{episode_id}E{season_id} of {mapping_name} Details Update {'Complete' if updated else 'Not Needed'}") else: logger.error(f"Metadata Error: episode {episode_str} invalid must have S##E## format") else: diff --git a/modules/plex.py b/modules/plex.py index 978f4c28..6f39f423 100644 --- a/modules/plex.py +++ b/modules/plex.py @@ -668,9 +668,38 @@ class PlexAPI: if advanced and "languageOverride" in edits: self.query(item.refresh) logger.info(f"{item_type}: {name}{' Advanced' if advanced else ''} Details Update Successful") + return True except BadRequest: util.print_stacktrace() logger.error(f"{item_type}: {name}{' Advanced' if advanced else ''} Details Update Failed") + return False + + def edit_tags(self, attr, obj, add_tags=None, remove_tags=None, sync_tags=None, key=None): + updated = False + if key is None: + key = f"{attr}s" + if add_tags or remove_tags or sync_tags: + item_tags = [item_tag.tag for item_tag in getattr(obj, key)] + input_tags = [] + if add_tags: + input_tags.extend(add_tags) + if sync_tags: + input_tags.extend(sync_tags) + if sync_tags or remove_tags: + remove_method = getattr(obj, f"remove{attr.capitalize()}") + for tag in item_tags: + if (sync_tags and tag not in sync_tags) or (remove_tags and tag in remove_tags): + updated = True + self.query_data(remove_method, tag) + logger.info(f"Detail: {attr.capitalize()} {tag} removed") + if input_tags: + add_method = getattr(obj, f"add{attr.capitalize()}") + for tag in input_tags: + if tag not in item_tags: + updated = True + self.query_data(add_method, tag) + logger.info(f"Detail: {attr.capitalize()} {tag} added") + return updated def update_item_from_assets(self, item, collection_mode=False, upload=True, dirs=None, name=None): if dirs is None: