Skip to content

Commit

Permalink
Refactor: added operating system type as config for file validation.
Browse files Browse the repository at this point in the history
  • Loading branch information
--get committed Jan 29, 2025
1 parent 1f6cbd4 commit 9d0154e
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 11 deletions.
5 changes: 5 additions & 0 deletions json-schema/config-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -782,6 +782,11 @@
"description": "Used to show missing items from collections or playlists.\nWhile show_missing is true items missing from collections or playlists will be displayed.",
"type": "boolean"
},
"operating_system_type": {
"description": "Used to set the operating system type defaults to universal.\nSet the operating system type to either 'Linux', 'Windows', 'macOS', 'POSIX', 'universal'.\nUsed for improving/extending the validation of filenames and paths, taking the operating system into account.",
"type": "string",
"enum": ["Linux", "Windows", "macOS", "POSIX", "universal"]
},
"show_missing_assets": {
"description": "Used to print a message when assets are missing.\nDisplay missing asset warnings for items, collections, and playlists.",
"type": "boolean"
Expand Down
9 changes: 5 additions & 4 deletions kometa.py
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,7 @@ def run_libraries(config):
logger.debug(f"Asset Directory: {ad}")
logger.debug(f"Asset Folders: {library.asset_folders}")
logger.debug(f"Asset Depth: {library.asset_depth}")
logger.debug(f"Operating System Type: {library.operating_system_type}")
logger.debug(f"Create Asset Folders: {library.create_asset_folders}")
logger.debug(f"Prioritize Assets: {library.prioritize_assets}")
logger.debug(f"Dimensional Asset Rename: {library.dimensional_asset_rename}")
Expand Down Expand Up @@ -819,9 +820,9 @@ def run_collection(config, library, metadata, requested_collections):
logger.separator(f"Resuming Collections")

if "name_mapping" in collection_attrs and collection_attrs["name_mapping"]:
collection_log_name, output_str = util.validate_filename(collection_attrs["name_mapping"])
collection_log_name, output_str = util.validate_filename(collection_attrs["name_mapping"], config.operating_system_type)
else:
collection_log_name, output_str = util.validate_filename(mapping_name)
collection_log_name, output_str = util.validate_filename(mapping_name, config.operating_system_type)
#logger.add_collection_handler(library.mapping_name, collection_log_name)
library.status[str(mapping_name)] = {"status": "Unchanged", "errors": [], "added": 0, "unchanged": 0, "removed": 0, "radarr": 0, "sonarr": 0}

Expand Down Expand Up @@ -1003,9 +1004,9 @@ def run_playlists(config):
continue

if "name_mapping" in playlist_attrs and playlist_attrs["name_mapping"]:
playlist_log_name, output_str = util.validate_filename(playlist_attrs["name_mapping"])
playlist_log_name, output_str = util.validate_filename(playlist_attrs["name_mapping"], config.operating_system_type)
else:
playlist_log_name, output_str = util.validate_filename(mapping_name)
playlist_log_name, output_str = util.validate_filename(mapping_name, config.operating_system_type)
#logger.add_playlist_handler(playlist_log_name)
status[mapping_name] = {"status": "Unchanged", "errors": [], "added": 0, "unchanged": 0, "removed": 0, "radarr": 0, "sonarr": 0}
server_name = None
Expand Down
2 changes: 2 additions & 0 deletions modules/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,7 @@ def check_for_attribute(data, attribute, parent=None, test_list=None, translatio
"prioritize_assets": check_for_attribute(self.data, "prioritize_assets", parent="settings", var_type="bool", default=False),
"dimensional_asset_rename": check_for_attribute(self.data, "dimensional_asset_rename", parent="settings", var_type="bool", default=False),
"download_url_assets": check_for_attribute(self.data, "download_url_assets", parent="settings", var_type="bool", default=False),
"operating_system_type": check_for_attribute(self.data, "operating_system_type", parent="settings", default="universal"),
"show_missing_assets": check_for_attribute(self.data, "show_missing_assets", parent="settings", var_type="bool", default=True),
"show_missing_season_assets": check_for_attribute(self.data, "show_missing_season_assets", parent="settings", var_type="bool", default=False),
"show_missing_episode_assets": check_for_attribute(self.data, "show_missing_episode_assets", parent="settings", var_type="bool", default=False),
Expand Down Expand Up @@ -894,6 +895,7 @@ def check_for_attribute(data, attribute, parent=None, test_list=None, translatio
params["show_unfiltered"] = check_for_attribute(lib, "show_unfiltered", parent="settings", var_type="bool", default=self.general["show_unfiltered"], do_print=False, save=False)
params["show_options"] = check_for_attribute(lib, "show_options", parent="settings", var_type="bool", default=self.general["show_options"], do_print=False, save=False)
params["show_missing"] = check_for_attribute(lib, "show_missing", parent="settings", var_type="bool", default=self.general["show_missing"], do_print=False, save=False)
params["operating_system_type"] = check_for_attribute(lib, "operating_system_type", parent="settings", default=self.general["operating_system_type"], do_print=False, save=False)
params["show_missing_assets"] = check_for_attribute(lib, "show_missing_assets", parent="settings", var_type="bool", default=self.general["show_missing_assets"], do_print=False, save=False)
params["save_report"] = check_for_attribute(lib, "save_report", parent="settings", var_type="bool", default=self.general["save_report"], do_print=False, save=False)
params["missing_only_released"] = check_for_attribute(lib, "missing_only_released", parent="settings", var_type="bool", default=self.general["missing_only_released"], do_print=False, save=False)
Expand Down
3 changes: 2 additions & 1 deletion modules/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ def __init__(self, config, params):
self.asset_depth = params["asset_depth"]
self.asset_directory = params["asset_directory"] if params["asset_directory"] else []
self.default_dir = params["default_dir"]
self.mapping_name, output = util.validate_filename(self.original_mapping_name)
self.operating_system_type = params["operating_system_type"]
self.mapping_name, output = util.validate_filename(self.original_mapping_name, self.operating_system_type)
self.image_table_name = self.config.Cache.get_image_table_name(self.original_mapping_name) if self.config.Cache else None
self.overlay_folder = os.path.join(self.config.default_dir, "overlays")
self.overlay_backup = os.path.join(self.overlay_folder, f"{self.mapping_name} Original Posters")
Expand Down
4 changes: 2 additions & 2 deletions modules/overlay.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ def get_and_save_image(image_url):
if not os.path.exists(library.overlay_folder) or not os.path.isdir(library.overlay_folder):
os.makedirs(library.overlay_folder, exist_ok=False)
logger.info(f"Creating Overlay Folder found at: {library.overlay_folder}")
clean_image_name, _ = util.validate_filename(self.name)
clean_image_name, _ = util.validate_filename(self.name, library.operating_system_type)
image_path = os.path.join(library.overlay_folder, f"{clean_image_name}.png")
if os.path.exists(image_path):
os.remove(image_path)
Expand Down Expand Up @@ -308,7 +308,7 @@ def get_and_save_image(image_url):
self.vertical_offset = 0
else:
if not self.path:
clean_name, _ = util.validate_filename(self.name)
clean_name, _ = util.validate_filename(self.name, self.config.operating_system_type)
self.path = os.path.join(library.overlay_folder, f"{clean_name}.png")
if not os.path.exists(self.path):
raise Failed(f"Overlay Error: Overlay Image not found at: {self.path}")
Expand Down
2 changes: 1 addition & 1 deletion modules/plex.py
Original file line number Diff line number Diff line change
Expand Up @@ -1457,7 +1457,7 @@ def find_item_assets(self, item, item_asset_directory=None, asset_directory=None
folder_name = item.title
else:
folder_name = item
folder_name, _ = util.validate_filename(folder_name)
folder_name, _ = util.validate_filename(folder_name, self.operating_system_type)

if not self.asset_folders:
file_name = folder_name if file_name == "poster" else f"{folder_name}_{file_name}"
Expand Down
6 changes: 3 additions & 3 deletions modules/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,11 +243,11 @@ def regex_first_int(data, id_type, default=None):
else:
raise Failed(f"Regex Error: Failed to parse {id_type} from {data}")

def validate_filename(filename):
if is_valid_filename(str(filename), "auto"):
def validate_filename(filename, operating_system="universal"):
if is_valid_filename(str(filename), operating_system):
return filename, None
else:
mapping_name = sanitize_filename(str(filename))
mapping_name = sanitize_filename(str(filename), operating_system)
return mapping_name, f"Log Folder Name: {filename} is invalid using {mapping_name}"

def item_title(item):
Expand Down

0 comments on commit 9d0154e

Please sign in to comment.