Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d827d968a | ||
|
|
e346fd764c |
+23
-61
@@ -2,74 +2,39 @@ import os
|
|||||||
import re
|
import re
|
||||||
import folder_paths
|
import folder_paths
|
||||||
|
|
||||||
|
|
||||||
class StylesCSVLoader:
|
class StylesCSVLoader:
|
||||||
"""
|
"""
|
||||||
Loads csv file with styles. For migration purposes from automatic1111 webui.
|
Loads csv file with styles. For migration purposes from automatic11111 webui.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def load_styles_csv(styles_path: str):
|
def load_styles_csv(styles_path: str):
|
||||||
"""Loads csv file with styles. Each row has three columns:
|
"""Loads csv file with styles. It has only one column.
|
||||||
- style_name: string (labeled as "name" in the CSV)
|
Ignore the first row (header).
|
||||||
- positive_prompt: string (labeled as "prompt" in the CSV)
|
positive_prompt are strings separated by comma. Each string is a prompt.
|
||||||
- negative_prompt: string (may be empty or missing)
|
negative_prompt are strings separated by comma. Each string is a prompt.
|
||||||
Returns:
|
|
||||||
dict: Dictionary of styles, where each key is style_name and value is [positive_prompt, negative_prompt]
|
|
||||||
"""
|
|
||||||
error_styles = {
|
|
||||||
"Error loading styles.csv, check the console": ["", ""]}
|
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: List of styles. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt]
|
||||||
|
"""
|
||||||
|
styles = {"Error loading styles.csv, check the console": ["", ""]}
|
||||||
if not os.path.exists(styles_path):
|
if not os.path.exists(styles_path):
|
||||||
print(f"""Error. No styles.csv found. Put your styles.csv in the root directory of ComfyUI. Then press "Refresh".
|
print(f"""Error. No styles.csv found. Put your styles.csv in the root directory of ComfyUI. Then press "Refresh".
|
||||||
Your current root directory is: {folder_paths.base_path}
|
Your current root directory is: {folder_paths.base_path}
|
||||||
""")
|
""")
|
||||||
return error_styles
|
|
||||||
|
|
||||||
try:
|
|
||||||
styles = {}
|
|
||||||
with open(styles_path, "r", encoding="utf-8") as f:
|
|
||||||
reader = csv.reader(f)
|
|
||||||
next(reader) # Skip header row
|
|
||||||
|
|
||||||
# Start counting from 2 (after header)
|
|
||||||
for i, row in enumerate(reader, start=2):
|
|
||||||
try:
|
|
||||||
# Initialize variables to avoid "used before assigned" errors
|
|
||||||
style_name = ""
|
|
||||||
positive_prompt = ""
|
|
||||||
negative_prompt = ""
|
|
||||||
|
|
||||||
# Handle rows with fewer than 3 columns
|
|
||||||
if len(row) == 0:
|
|
||||||
# Skip empty rows
|
|
||||||
continue
|
|
||||||
elif len(row) == 1:
|
|
||||||
print(
|
|
||||||
f"Error parsing line {i}: {','.join(row)} -> Expected at least 2 columns, got {len(row)}")
|
|
||||||
continue
|
|
||||||
elif len(row) == 2:
|
|
||||||
# Missing negative prompt - treat as empty string
|
|
||||||
style_name, positive_prompt = row
|
|
||||||
# negative_prompt already initialized as empty string
|
|
||||||
elif len(row) >= 3:
|
|
||||||
# Normal case or extra columns (ignore extras)
|
|
||||||
style_name, positive_prompt, negative_prompt = row[0], row[1], row[2]
|
|
||||||
|
|
||||||
styles[style_name] = [positive_prompt, negative_prompt]
|
|
||||||
except Exception as e:
|
|
||||||
# Use a safe version of the row for error reporting
|
|
||||||
row_str = ','.join(row) if isinstance(
|
|
||||||
row, list) else str(row)
|
|
||||||
print(f"Error parsing line {i}: {row_str} -> {e}")
|
|
||||||
|
|
||||||
return styles
|
return styles
|
||||||
|
try:
|
||||||
|
with open(styles_path, "r", encoding="utf-8") as f:
|
||||||
|
styles = [[x.replace('"', '').replace('\n', '') for x in re.split(
|
||||||
|
',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]]
|
||||||
|
styles = {x[0]: [x[1], x[2]] for x in styles}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"""Error loading styles.csv. Make sure it is in the root directory of ComfyUI. Then press "Refresh".
|
print(f"""Error loading styles.csv. Make sure it is in the root directory of ComfyUI. Then press "Refresh".
|
||||||
Your current root directory is: {folder_paths.base_path}
|
Your current root directory is: {folder_paths.base_path}
|
||||||
Error: {e}
|
Error: {e}
|
||||||
""")
|
""")
|
||||||
return error_styles
|
return styles
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def INPUT_TYPES(cls):
|
def INPUT_TYPES(cls):
|
||||||
@@ -79,6 +44,7 @@ Error: {e}
|
|||||||
"required": {
|
"required": {
|
||||||
"styles": (list(cls.styles_csv.keys()),),
|
"styles": (list(cls.styles_csv.keys()),),
|
||||||
},
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RETURN_TYPES = ("STRING", "STRING")
|
RETURN_TYPES = ("STRING", "STRING")
|
||||||
@@ -87,16 +53,12 @@ Error: {e}
|
|||||||
CATEGORY = "loaders"
|
CATEGORY = "loaders"
|
||||||
|
|
||||||
def execute(self, styles):
|
def execute(self, styles):
|
||||||
return (
|
return (self.styles_csv[styles][0], self.styles_csv[styles][1])
|
||||||
self.styles_csv[styles][0],
|
|
||||||
self.styles_csv[styles][1]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
NODE_CLASS_MAPPINGS = {
|
NODE_CLASS_MAPPINGS = {
|
||||||
"Load Styles CSV": StylesCSVLoader
|
"Load Styles CSV": StylesCSVLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
NODE_DISPLAY_NAME_MAPPINGS = {
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||||
"StylesCSVLoader": "Load Styles CSV Node"
|
"StylesCSVLoader": "Load Styles CSV Node"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user