From 026ba97c5b1528a79686e77832877bfc7caff0fc Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Tue, 11 Aug 2026 14:58:13 +0200 Subject: [PATCH] Fix model download directory alias resolution --- core/download/directories.py | 34 ++++++++++++++++++++++---- tests/test_download_directories.py | 39 ++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 tests/test_download_directories.py diff --git a/core/download/directories.py b/core/download/directories.py index c4d43f3..7f680a1 100644 --- a/core/download/directories.py +++ b/core/download/directories.py @@ -87,11 +87,35 @@ def get_download_directory( return paths[0] + def _get_folder_paths(folder_name: str) -> List[str]: + """Return paths for one key without rejecting the other aliases.""" + try: + return list(folder_paths.get_folder_paths(folder_name) or []) + except Exception as exc: + facade.log.debug( + f"Could not get folder path for {folder_name}: {exc}" + ) + return [] + + def _get_folder_names() -> List[str]: + """Read folder names across ComfyUI versions.""" + get_folder_names = getattr(folder_paths, "get_folder_names", None) + if callable(get_folder_names): + try: + return list(get_folder_names() or []) + except Exception as exc: + facade.log.debug(f"Could not get folder names: {exc}") + + folder_registry = getattr(folder_paths, "folder_names_and_paths", {}) + if isinstance(folder_registry, dict): + return list(folder_registry.keys()) + return [] + try: paths = [] seen_paths = set() for candidate_key in folder_keys: - for path in folder_paths.get_folder_paths(candidate_key) or []: + for path in _get_folder_paths(candidate_key): path_key = _normalize(path) if path_key in seen_paths: continue @@ -106,11 +130,11 @@ def get_download_directory( return _choose_preferred_path(paths, folder_key) # If category not found, try to get any models directory as fallback. - all_names = folder_paths.get_folder_names() - if all_names: - fallback_paths = folder_paths.get_folder_paths(all_names[0]) + all_names = _get_folder_names() + for fallback_key in all_names: + fallback_paths = _get_folder_paths(fallback_key) if fallback_paths: - return _choose_preferred_path(fallback_paths, all_names[0]) + return _choose_preferred_path(fallback_paths, fallback_key) except Exception as e: facade.log.debug(f"Could not get folder path for {folder_key}: {e}") diff --git a/tests/test_download_directories.py b/tests/test_download_directories.py new file mode 100644 index 0000000..27b1b4f --- /dev/null +++ b/tests/test_download_directories.py @@ -0,0 +1,39 @@ +import os +from types import SimpleNamespace +from unittest.mock import MagicMock + +import pytest + +from core.download.directories import get_download_directory +from core.type_utils import get_category_folder_keys + + +class _FolderPaths: + def __init__(self, category, path): + self.folder_names_and_paths = {category: ([path], set())} + + def get_folder_paths(self, category): + if category not in self.folder_names_and_paths: + raise KeyError(category) + return self.folder_names_and_paths[category][0] + + +@pytest.mark.parametrize("registered_category", ["diffusion_models", "unet"]) +def test_download_directory_skips_unavailable_category_aliases( + tmp_path, registered_category +): + model_directory = str(tmp_path / registered_category) + folder_paths = _FolderPaths(registered_category, model_directory) + dependencies = SimpleNamespace( + folder_paths=folder_paths, + get_category_folder_keys=get_category_folder_keys, + get_path_identity=lambda value: os.path.normcase(os.path.abspath(value)), + is_path_within=lambda _path, _root: False, + get_comfy_root_path=lambda _folder_paths: "", + get_filename_from_path=os.path.basename, + log=MagicMock(), + ) + + assert get_download_directory("diffusion_models", dependencies=dependencies) == ( + model_directory + )