Update utils.py
This commit is contained in:
57
utils.py
57
utils.py
@@ -2,6 +2,7 @@ import json
|
|||||||
import time
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import streamlit as st
|
import streamlit as st
|
||||||
|
import requests # <--- NEW DEPENDENCY
|
||||||
|
|
||||||
# Default structure for new files
|
# Default structure for new files
|
||||||
DEFAULTS = {
|
DEFAULTS = {
|
||||||
@@ -91,7 +92,6 @@ def save_json(path, data):
|
|||||||
with open(path, 'w') as f:
|
with open(path, 'w') as f:
|
||||||
json.dump(data, f, indent=4)
|
json.dump(data, f, indent=4)
|
||||||
|
|
||||||
# --- MISSING FUNCTION RESTORED HERE ---
|
|
||||||
def get_file_mtime(path):
|
def get_file_mtime(path):
|
||||||
"""Returns the modification time of a file, or 0 if it doesn't exist."""
|
"""Returns the modification time of a file, or 0 if it doesn't exist."""
|
||||||
path = Path(path)
|
path = Path(path)
|
||||||
@@ -105,3 +105,58 @@ def generate_templates(current_dir):
|
|||||||
|
|
||||||
batch_data = {"batch_data": [DEFAULTS.copy(), DEFAULTS.copy()]}
|
batch_data = {"batch_data": [DEFAULTS.copy(), DEFAULTS.copy()]}
|
||||||
save_json(current_dir / "template_batch.json", batch_data)
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user