mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-23 22:22:11 -03:00
feat: add open settings location endpoint
- Add `open_settings_location` method to `FileSystemHandler` to open OS file explorer at settings file location - Register new POST route `/api/lm/settings/open-location` for settings file access - Inject `SettingsManager` dependency into `FileSystemHandler` constructor - Add cross-platform support for Windows, macOS, and Linux file explorers - Include error handling for missing settings files and system exceptions
This commit is contained in:
@@ -853,6 +853,9 @@ class MetadataArchiveHandler:
|
||||
|
||||
|
||||
class FileSystemHandler:
|
||||
def __init__(self, settings_service=None) -> None:
|
||||
self._settings = settings_service or get_settings_manager()
|
||||
|
||||
async def open_file_location(self, request: web.Request) -> web.Response:
|
||||
try:
|
||||
data = await request.json()
|
||||
@@ -877,6 +880,30 @@ class FileSystemHandler:
|
||||
logger.error("Failed to open file location: %s", exc, exc_info=True)
|
||||
return web.json_response({"success": False, "error": str(exc)}, status=500)
|
||||
|
||||
async def open_settings_location(self, request: web.Request) -> web.Response:
|
||||
try:
|
||||
settings_file = getattr(self._settings, "settings_file", None)
|
||||
if not settings_file:
|
||||
return web.json_response({"success": False, "error": "Settings file not found"}, status=404)
|
||||
|
||||
settings_file = os.path.abspath(settings_file)
|
||||
if not os.path.isfile(settings_file):
|
||||
return web.json_response({"success": False, "error": "Settings file does not exist"}, status=404)
|
||||
|
||||
if os.name == "nt":
|
||||
subprocess.Popen(["explorer", "/select,", settings_file])
|
||||
elif os.name == "posix":
|
||||
if sys.platform == "darwin":
|
||||
subprocess.Popen(["open", "-R", settings_file])
|
||||
else:
|
||||
folder = os.path.dirname(settings_file)
|
||||
subprocess.Popen(["xdg-open", folder])
|
||||
|
||||
return web.json_response({"success": True, "message": f"Opened settings folder: {settings_file}"})
|
||||
except Exception as exc: # pragma: no cover - defensive logging
|
||||
logger.error("Failed to open settings location: %s", exc, exc_info=True)
|
||||
return web.json_response({"success": False, "error": str(exc)}, status=500)
|
||||
|
||||
|
||||
class NodeRegistryHandler:
|
||||
def __init__(
|
||||
@@ -1103,6 +1130,7 @@ class MiscHandlerSet:
|
||||
"get_metadata_archive_status": self.metadata_archive.get_metadata_archive_status,
|
||||
"get_model_versions_status": self.model_library.get_model_versions_status,
|
||||
"open_file_location": self.filesystem.open_file_location,
|
||||
"open_settings_location": self.filesystem.open_settings_location,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ MISC_ROUTE_DEFINITIONS: tuple[RouteDefinition, ...] = (
|
||||
RouteDefinition("POST", "/api/lm/remove-metadata-archive", "remove_metadata_archive"),
|
||||
RouteDefinition("GET", "/api/lm/metadata-archive-status", "get_metadata_archive_status"),
|
||||
RouteDefinition("GET", "/api/lm/model-versions-status", "get_model_versions_status"),
|
||||
RouteDefinition("POST", "/api/lm/settings/open-location", "open_settings_location"),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ class MiscRoutes:
|
||||
settings_service=self._settings,
|
||||
metadata_provider_updater=self._metadata_provider_updater,
|
||||
)
|
||||
filesystem = FileSystemHandler()
|
||||
filesystem = FileSystemHandler(settings_service=self._settings)
|
||||
node_registry_handler = NodeRegistryHandler(
|
||||
node_registry=self._node_registry,
|
||||
prompt_server=self._prompt_server,
|
||||
|
||||
@@ -883,6 +883,7 @@ class SettingsManager:
|
||||
|
||||
if os.path.abspath(previous_path) != os.path.abspath(target_path):
|
||||
self._copy_model_cache_directory(previous_dir, target_dir)
|
||||
logger.info("Switching settings file to: %s", target_path)
|
||||
|
||||
self._pending_portable_switch = {"other_path": other_path}
|
||||
self.settings_file = target_path
|
||||
@@ -929,7 +930,12 @@ class SettingsManager:
|
||||
and os.path.abspath(source_cache_dir) != os.path.abspath(target_cache_dir)
|
||||
):
|
||||
try:
|
||||
shutil.copytree(source_cache_dir, target_cache_dir, dirs_exist_ok=True)
|
||||
shutil.copytree(
|
||||
source_cache_dir,
|
||||
target_cache_dir,
|
||||
dirs_exist_ok=True,
|
||||
ignore=shutil.ignore_patterns("*.sqlite-shm", "*.sqlite-wal"),
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning(
|
||||
"Failed to copy model_cache directory from %s to %s: %s",
|
||||
|
||||
Reference in New Issue
Block a user