Files
hexxacubic-ComfyUI-Prompt_L…/Prompt_Library.py
T
hexxacubic 9e914a8b1a Update Prompt_Library.py
Index issues fixed but index snapping removed due to limitations.
Project loading is more simple. The dropdownlist shows folders and files so all projects are in one single dropdown list.
2025-05-24 00:26:35 +02:00

78 lines
2.4 KiB
Python

import os
import folder_paths
class Prompt_Library:
"""
• project dropdown: '<category>/<project>' choices at init
• index slider: free int from 1 to 99 (no dynamic cap)
• file reloaded every get_prompt
"""
def __init__(self):
self.base = os.path.join(folder_paths.models_dir, "prompts")
@classmethod
def INPUT_TYPES(s):
base = os.path.join(folder_paths.models_dir, "prompts")
# build combined list at node-load
cats = [d for d in os.listdir(base) if os.path.isdir(os.path.join(base, d))]
proj_choices = []
for cat in sorted(cats):
folder = os.path.join(base, cat)
for fn in sorted(os.listdir(folder)):
if fn.lower().endswith(".txt"):
name = fn[:-4]
proj_choices.append(f"{cat}/{name}")
return {
"required": {
"project": (proj_choices,),
"index": ("INT", {"default": 1, "min": 1, "max": 99}),
}
}
RETURN_TYPES = ("STRING","STRING","STRING","INT")
FUNCTION = "get_prompt"
OUTPUT_NODE = True
CATEGORY = "hexxacubic"
def get_prompt(self, project, index):
# project = "category/name"
try:
cat, name = project.split("/", 1)
except ValueError:
return ("", "", project, index)
path = os.path.join(self.base, cat, name + ".txt")
if not os.path.isfile(path):
return ("", "", project, index)
sections = {}
current = None
with open(path, encoding="utf-8") as f:
for raw in f:
line = raw.rstrip("\n")
if line.startswith("###"):
try:
num = int(line[3:])
current = num
sections[current] = []
except:
current = None
elif current is not None:
sections[current].append(line)
lines = sections.get(index, [])
if '---' in lines:
sep = lines.index('---')
pos = "\n".join(lines[:sep]).strip()
neg = "\n".join(lines[sep+1:]).strip()
else:
pos = "\n".join(lines).strip()
neg = ""
return (pos, neg, project, index)
NODE_CLASS_MAPPINGS = {"Prompt_Library": Prompt_Library}
NODE_DISPLAY_NAME_MAPPINGS = {"Prompt Library": "Prompt_Library"}