diff --git a/utils.py b/utils.py index c3314f8..27a9d9b 100644 --- a/utils.py +++ b/utils.py @@ -2,6 +2,7 @@ import json import time from pathlib import Path import streamlit as st +import requests # <--- NEW DEPENDENCY # Default structure for new files DEFAULTS = { @@ -91,7 +92,6 @@ def save_json(path, data): with open(path, 'w') as f: json.dump(data, f, indent=4) -# --- MISSING FUNCTION RESTORED HERE --- def get_file_mtime(path): """Returns the modification time of a file, or 0 if it doesn't exist.""" path = Path(path) @@ -105,3 +105,58 @@ def generate_templates(current_dir): batch_data = {"batch_data": [DEFAULTS.copy(), DEFAULTS.copy()]} save_json(current_dir / "template_batch.json", batch_data) + +# --- NEW: COMFY METADATA FETCHER --- +def fetch_comfy_metadata(base_url): + """Queries ComfyUI for available Models, VAEs, and LoRAs.""" + url = base_url.rstrip("/") + meta = {"checkpoints": [], "loras": [], "vaes": []} + + try: + # Get Node Info to find input lists + res = requests.get(f"{url}/object_info", timeout=2) + if res.status_code == 200: + data = res.json() + + # Checkpoints + if "CheckpointLoaderSimple" in data: + meta["checkpoints"] = data["CheckpointLoaderSimple"]["input"]["required"]["ckpt_name"][0] + + # LoRAs + if "LoraLoader" in data: + meta["loras"] = data["LoraLoader"]["input"]["required"]["lora_name"][0] + + # VAEs + if "VAELoader" in data: + meta["vaes"] = data["VAELoader"]["input"]["required"]["vae_name"][0] + + return meta + except Exception: + # Fail silently so the app still works offline + return meta + +# --- NEW: SMART INPUT WIDGET --- +def render_smart_input(label, key, value, options, help_text=None): + """ + Renders a Selectbox if options are available, otherwise a Text Input. + Handles the case where the current 'value' might not be in the 'options' list. + """ + if options and len(options) > 0: + # If current value is not in the list (e.g. new file added), add it temporarily + safe_options = options.copy() + if value and value not in safe_options: + safe_options.insert(0, value) + elif not value and safe_options: + # Default to first if empty + value = safe_options[0] + + # Try to find index + try: + idx = safe_options.index(value) + except ValueError: + idx = 0 + + return st.selectbox(label, safe_options, index=idx, key=key, help=help_text) + else: + # Fallback to text input if Comfy is offline or list empty + return st.text_input(label, value=value, key=key, help=help_text)