| from __future__ import annotations |
| import comfy.utils |
| import folder_paths |
| import logging |
| from abc import ABC, abstractmethod |
| from typing import Any |
| import torch |
|
|
| class ResourceKey(ABC): |
| Type = Any |
| def __init__(self): |
| ... |
|
|
| class TorchDictFolderFilename(ResourceKey): |
| '''Key for requesting a torch file via file_name from a folder category.''' |
| Type = dict[str, torch.Tensor] |
| def __init__(self, folder_name: str, file_name: str): |
| self.folder_name = folder_name |
| self.file_name = file_name |
|
|
| def __hash__(self): |
| return hash((self.folder_name, self.file_name)) |
|
|
| def __eq__(self, other: object) -> bool: |
| if not isinstance(other, TorchDictFolderFilename): |
| return False |
| return self.folder_name == other.folder_name and self.file_name == other.file_name |
|
|
| def __str__(self): |
| return f"{self.folder_name} -> {self.file_name}" |
|
|
| class Resources(ABC): |
| def __init__(self): |
| ... |
|
|
| @abstractmethod |
| def get(self, key: ResourceKey, default: Any=...) -> Any: |
| pass |
|
|
| class ResourcesLocal(Resources): |
| def __init__(self): |
| super().__init__() |
| self.local_resources: dict[ResourceKey, Any] = {} |
|
|
| def get(self, key: ResourceKey, default: Any=...) -> Any: |
| cached = self.local_resources.get(key, None) |
| if cached is not None: |
| logging.info(f"Using cached resource '{key}'") |
| return cached |
| logging.info(f"Loading resource '{key}'") |
| to_return = None |
| if isinstance(key, TorchDictFolderFilename): |
| if default is ...: |
| to_return = comfy.utils.load_torch_file(folder_paths.get_full_path_or_raise(key.folder_name, key.file_name), safe_load=True) |
| else: |
| full_path = folder_paths.get_full_path(key.folder_name, key.file_name) |
| if full_path is not None: |
| to_return = comfy.utils.load_torch_file(full_path, safe_load=True) |
|
|
| if to_return is not None: |
| self.local_resources[key] = to_return |
| return to_return |
| if default is not ...: |
| return default |
| raise Exception(f"Unsupported resource key type: {type(key)}") |
|
|
|
|
| class _RESOURCES: |
| ResourceKey = ResourceKey |
| TorchDictFolderFilename = TorchDictFolderFilename |
| Resources = Resources |
| ResourcesLocal = ResourcesLocal |
|
|