From 2aac1cd1aef710a172fdfc72be466bd0d4156599 Mon Sep 17 00:00:00 2001 From: meisnate12 Date: Mon, 6 May 2024 15:02:47 -0400 Subject: [PATCH] [2] changed `overlay_artwork_filetype` to accept `webp_lossy` and `webp_lossless` --- CHANGELOG | 1 + VERSION | 2 +- docs/config/settings.md | 13 +++++++---- json-schema/config-schema.json | 4 ++-- modules/config.py | 42 +++++++++++++++++++--------------- modules/overlays.py | 4 +++- 6 files changed, 38 insertions(+), 28 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ef4de9bf..042ff9d4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ Checks requirement versions to print a message if one needs to be updated # Updates +Changed the `overlay_artwork_filetype` Setting to accept `webp_lossy` and `webp_lossless` while the old attribute `webp` will be treated as `webp_lossy`. # Defaults diff --git a/VERSION b/VERSION index c4c5fc4f..ee2103b2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.1-develop1 +2.0.1-develop2 diff --git a/docs/config/settings.md b/docs/config/settings.md index 416ef8f4..a8d710b2 100644 --- a/docs/config/settings.md +++ b/docs/config/settings.md @@ -1001,7 +1001,8 @@ The available setting attributes which can be set at each level are outlined bel - + +
`jpg`Use JPG files for saving Overlays
`png`Use PNG files for saving Overlays
`webp`Use WEBP files for saving Overlays
`webp_lossy`Use Lossy WEBP files for saving Overlays
`webp_lossless`Use Lossless WEBP files for saving Overlays
**Default Value:** `jpg` @@ -1013,9 +1014,10 @@ The available setting attributes which can be set at each level are outlined bel overlay_artwork_filetype: png ``` -??? blank "`overlay_artwork_quality` - Used to control the JPG or WEBP quality used with overlay images." +??? blank "`overlay_artwork_quality` - Used to control the JPG or Lossy WEBP quality used with overlay images." -
Used to control the JPG or WEBP quality used with overlay images. This setting will only be applied to images generated after the value is added to your config. +
Used to control the JPG or Lossy WEBP quality used with overlay images. This setting + will only be applied to images generated after the value is added to your config.
@@ -1023,9 +1025,10 @@ The available setting attributes which can be set at each level are outlined bel **Levels with this Attribute:** Global/Library - **Accepted Values:** Any Integer 1-100 [Values over 95 are not recommended and may result in excessive image size, perhaps too large to be uploaded to Plex. + **Accepted Values:** Any Integer 1-100 [Values over 95 are not recommended and may result in excessive image size, + perhaps too large to be uploaded to Plex. - **Default Value:** `75` [this default value will be used if no value is provided on this setting] + **Default Value:** `None` [when no value is provided the standard 75 is used] ???+ example "Example" diff --git a/json-schema/config-schema.json b/json-schema/config-schema.json index 1a943d39..af900945 100644 --- a/json-schema/config-schema.json +++ b/json-schema/config-schema.json @@ -898,10 +898,10 @@ }, "overlay_artwork_filetype": { "description": "Used to control the filetype used with overlay images.", - "enum": ["jpg", "png", "webp"] + "enum": ["jpg", "png", "webp_lossy", "webp_lossless"] }, "overlay_artwork_quality": { - "description": "Used to control the JPG or WEBP quality used with overlay images.", + "description": "Used to control the JPG or Lossy WEBP quality used with overlay images.", "type": "integer", "minimum": 1, "maximum": 100 diff --git a/modules/config.py b/modules/config.py index b0b3ff25..7d464110 100644 --- a/modules/config.py +++ b/modules/config.py @@ -44,7 +44,8 @@ sync_modes = {"append": "Only Add Items to the Collection or Playlist", "sync": filetype_list = { "jpg": "Use JPG files for saving Overlays", "png": "Use PNG files for saving Overlays", - "webp": "Use WEBP files for saving Overlays" + "webp_lossy": "Use Lossy WEBP files for saving Overlays", + "webp_lossless": "Use Lossless WEBP files for saving Overlays" } imdb_label_options = { "remove": "Remove All IMDb Parental Labels", @@ -345,7 +346,7 @@ class ConfigFile: if self.secrets: check_next(self.data) - def check_for_attribute(data, attribute, parent=None, test_list=None, default=None, do_print=True, default_is_none=False, req_default=False, var_type="str", throw=False, save=True, int_min=0, int_max=None): + def check_for_attribute(data, attribute, parent=None, test_list=None, translations=None, default=None, do_print=True, default_is_none=False, req_default=False, var_type="str", throw=False, save=True, int_min=0, int_max=None): endline = "" if parent is not None: if data and parent in data: @@ -354,6 +355,9 @@ class ConfigFile: data = None do_print = False save = False + final_value = data[attribute] if data and attribute in data else None + if translations and final_value in translations: + final_value = translations[final_value] if self.read_only: save = False text = f"{attribute} attribute" if parent is None else f"{parent} sub-attribute {attribute}" @@ -367,27 +371,27 @@ class ConfigFile: else: endline = "" yaml.save() if default_is_none and var_type in ["list", "int_list", "lower_list", "list_path"]: return default if default else [] - elif data[attribute] is None: + elif final_value is None: if default_is_none and var_type in ["list", "int_list", "lower_list", "list_path"]: return default if default else [] elif default_is_none: return None else: message = f"{text} is blank" elif var_type == "url": - if data[attribute].endswith(("\\", "/")): return data[attribute][:-1] - else: return data[attribute] + if final_value.endswith(("\\", "/")): return final_value[:-1] + else: return final_value elif var_type == "bool": - if isinstance(data[attribute], bool): return data[attribute] + if isinstance(final_value, bool): return final_value else: message = f"{text} must be either true or false" elif var_type == "int": - if isinstance(data[attribute], int) and data[attribute] >= int_min and (not int_max or data[attribute] <= int_max): - return data[attribute] + if isinstance(final_value, int) and final_value >= int_min and (not int_max or final_value <= int_max): + return final_value else: message = f"{text} must an integer greater than or equal to {int_min}{f' and less than or equal to {int_max}'}" elif var_type == "path": - if os.path.exists(os.path.abspath(data[attribute])): return data[attribute] - else: message = f"Path {os.path.abspath(data[attribute])} does not exist" + if os.path.exists(os.path.abspath(final_value)): return final_value + else: message = f"Path {os.path.abspath(final_value)} does not exist" elif var_type in ["list", "lower_list", "int_list"]: output_list = [] - for output_item in util.get_list(data[attribute], lower=var_type == "lower_list", split=var_type != "list", int_list=var_type == "int_list"): + for output_item in util.get_list(final_value, lower=var_type == "lower_list", split=var_type != "list", int_list=var_type == "int_list"): if output_item not in output_list: output_list.append(output_item) failed_items = [o for o in output_list if o not in test_list] if test_list else [] @@ -398,7 +402,7 @@ class ConfigFile: elif var_type == "list_path": temp_list = [] warning_message = "" - for p in util.get_list(data[attribute], split=False): + for p in util.get_list(final_value, split=False): if os.path.exists(os.path.abspath(p)): temp_list.append(p) else: @@ -409,13 +413,13 @@ class ConfigFile: logger.warning(warning_message) if len(temp_list) > 0: return temp_list else: message = "No Paths exist" - elif test_list is None or data[attribute] in test_list: return data[attribute] - else: message = f"{text}: {data[attribute]} is an invalid input" + elif test_list is None or final_value in test_list: return final_value + else: message = f"{text}: {final_value} is an invalid input" if var_type == "path" and default and os.path.exists(os.path.abspath(default)): return default elif var_type == "path" and default: - if data and attribute in data and data[attribute]: - message = f"neither {data[attribute]} or the default path {default} could be found" + if final_value: + message = f"neither {final_value} or the default path {default} could be found" else: message = f"no {text} found and the default path {default} could not be found" default = None @@ -436,7 +440,7 @@ class ConfigFile: raise Failed(f"Config Error: {message}") if do_print: logger.warning(f"Config Warning: {message}") - if data and attribute in data and data[attribute] and test_list is not None and data[attribute] not in test_list: + if final_value and test_list is not None and final_value not in test_list: logger.warning(options) return default @@ -478,7 +482,7 @@ class ConfigFile: "playlist_report": check_for_attribute(self.data, "playlist_report", parent="settings", var_type="bool", default=True), "verify_ssl": check_for_attribute(self.data, "verify_ssl", parent="settings", var_type="bool", default=True), "custom_repo": check_for_attribute(self.data, "custom_repo", parent="settings", default_is_none=True), - "overlay_artwork_filetype": check_for_attribute(self.data, "overlay_artwork_filetype", parent="settings", test_list=filetype_list, default="jpg"), + "overlay_artwork_filetype": check_for_attribute(self.data, "overlay_artwork_filetype", parent="settings", test_list=filetype_list, translations={"webp": "webp_lossy"}, default="jpg"), "overlay_artwork_quality": check_for_attribute(self.data, "overlay_artwork_quality", parent="settings", var_type="int", default_is_none=True, int_min=1, int_max=100), "assets_for_all": check_for_attribute(self.data, "assets_for_all", parent="settings", var_type="bool", default=False, save=False, do_print=False) } @@ -858,7 +862,7 @@ class ConfigFile: params["ignore_ids"].extend([i for i in self.general["ignore_ids"] if i not in params["ignore_ids"]]) params["ignore_imdb_ids"] = check_for_attribute(lib, "ignore_imdb_ids", parent="settings", var_type="lower_list", default_is_none=True, do_print=False, save=False) params["ignore_imdb_ids"].extend([i for i in self.general["ignore_imdb_ids"] if i not in params["ignore_imdb_ids"]]) - params["overlay_artwork_filetype"] = check_for_attribute(lib, "overlay_artwork_filetype", parent="settings", test_list=filetype_list, default=self.general["overlay_artwork_filetype"], do_print=False, save=False) + params["overlay_artwork_filetype"] = check_for_attribute(lib, "overlay_artwork_filetype", parent="settings", test_list=filetype_list, translations={"webp": "webp_lossy"}, default=self.general["overlay_artwork_filetype"], do_print=False, save=False) params["overlay_artwork_quality"] = check_for_attribute(lib, "overlay_artwork_quality", parent="settings", var_type="int", default=self.general["overlay_artwork_quality"], default_is_none=True, int_min=1, int_max=100, do_print=False, save=False) params["changes_webhooks"] = check_for_attribute(lib, "changes", parent="webhooks", var_type="list", default=self.webhooks["changes"], do_print=False, save=False, default_is_none=True) params["report_path"] = None diff --git a/modules/overlays.py b/modules/overlays.py index ba1b3617..ec640ce7 100644 --- a/modules/overlays.py +++ b/modules/overlays.py @@ -513,8 +513,10 @@ class Overlays: overlay_box = current_overlay.get_coordinates((canvas_width, canvas_height), box=current_overlay.image.size, new_cords=cord) new_poster.paste(current_overlay.image, overlay_box, current_overlay.image) temp = os.path.join(self.library.overlay_folder, f"temp.{self.library.overlay_artwork_filetype}") - if self.library.overlay_artwork_quality and self.library.overlay_artwork_filetype in ["jpg", "webp"]: + if self.library.overlay_artwork_quality and self.library.overlay_artwork_filetype in ["jpg", "webp_lossy"]: new_poster.save(temp, exif=exif_tags, quality=self.library.overlay_artwork_quality) + elif self.library.overlay_artwork_filetype == "webp_lossless": + new_poster.save(temp, exif=exif_tags, lossless=True) else: new_poster.save(temp, exif=exif_tags) self.library.upload_poster(item, temp)