import os import re import folder_paths #ARTISTS class ArtistsCSVLoader: """ Loads csv file with artists. """ @staticmethod def load_artists_csv(artists_path: str): """Loads csv file with artists. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of artists. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ artists = {"Error loading artists.csv, check the console": ["",""]} if not os.path.exists(artists_path): print(f"""Error. No artists.csv found. Put your artists.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return artists try: with open(artists_path, "r", encoding="utf-8") as f: artists = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] artists = {x[0]: [x[1],x[2]] for x in artists} except Exception as e: print(f"""Error loading artists.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return artists @classmethod def INPUT_TYPES(cls): cls.artists_csv = cls.load_artists_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\artists.csv")) return { "required": { "artists": (list(cls.artists_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, artists): return (self.artists_csv[artists][0], self.artists_csv[artists][1]) #ARTMOVEMENTS class ArtmovementsCSVLoader: """ Loads csv file with artmovements. For migration purposes from automatic11111 webui. """ @staticmethod def load_artmovements_csv(artmovements_path: str): """Loads csv file with artmovements. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of artmovements. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ artmovements = {"Error loading artmovements.csv, check the console": ["",""]} if not os.path.exists(artmovements_path): print(f"""Error. No artmovements.csv found. Put your artmovements.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return artmovements try: with open(artmovements_path, "r", encoding="utf-8") as f: artmovements = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] artmovements = {x[0]: [x[1],x[2]] for x in artmovements} except Exception as e: print(f"""Error loading artmovements.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return artmovements @classmethod def INPUT_TYPES(cls): cls.artmovements_csv = cls.load_artmovements_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\artmovements.csv")) return { "required": { "artmovements": (list(cls.artmovements_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, artmovements): return (self.artmovements_csv[artmovements][0], self.artmovements_csv[artmovements][1]) #CHARACTERS class CharactersCSVLoader: """ Loads csv file with characters. For migration purposes from automatic11111 webui. """ @staticmethod def load_characters_csv(characters_path: str): """Loads csv file with characters. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of characters. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ characters = {"Error loading characters.csv, check the console": ["",""]} if not os.path.exists(characters_path): print(f"""Error. No characters.csv found. Put your characters.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return characters try: with open(characters_path, "r", encoding="utf-8") as f: characters = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] characters = {x[0]: [x[1],x[2]] for x in characters} except Exception as e: print(f"""Error loading characters.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return characters @classmethod def INPUT_TYPES(cls): cls.characters_csv = cls.load_characters_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\characters.csv")) return { "required": { "characters": (list(cls.characters_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, characters): return (self.characters_csv[characters][0], self.characters_csv[characters][1]) #COLORS class ColorsCSVLoader: """ Loads csv file with colors. For migration purposes from automatic11111 webui. """ @staticmethod def load_colors_csv(colors_path: str): """Loads csv file with colors. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of colors. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ colors = {"Error loading colors.csv, check the console": ["",""]} if not os.path.exists(colors_path): print(f"""Error. No colors.csv found. Put your colors.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return colors try: with open(colors_path, "r", encoding="utf-8") as f: colors = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] colors = {x[0]: [x[1],x[2]] for x in colors} except Exception as e: print(f"""Error loading colors.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return colors @classmethod def INPUT_TYPES(cls): cls.colors_csv = cls.load_colors_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\colors.csv")) return { "required": { "colors": (list(cls.colors_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, colors): return (self.colors_csv[colors][0], self.colors_csv[colors][1]) # COMPOSITION class CompositionCSVLoader: """ Loads csv file with composition. For migration purposes from automatic11111 webui. """ @staticmethod def load_composition_csv(composition_path: str): """Loads csv file with composition. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of composition. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ composition = {"Error loading composition.csv, check the console": ["",""]} if not os.path.exists(composition_path): print(f"""Error. No composition.csv found. Put your composition.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return composition try: with open(composition_path, "r", encoding="utf-8") as f: composition = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] composition = {x[0]: [x[1],x[2]] for x in composition} except Exception as e: print(f"""Error loading composition.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return composition @classmethod def INPUT_TYPES(cls): cls.composition_csv = cls.load_composition_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\composition.csv")) return { "required": { "composition": (list(cls.composition_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, composition): return (self.composition_csv[composition][0], self.composition_csv[composition][1]) #LIGHTING class LightingCSVLoader: """ Loads csv file with lighting. For migration purposes from automatic11111 webui. """ @staticmethod def load_lighting_csv(lighting_path: str): """Loads csv file with lighting. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of lighting. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ lighting = {"Error loading lighting.csv, check the console": ["",""]} if not os.path.exists(lighting_path): print(f"""Error. No lighting.csv found. Put your lighting.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return lighting try: with open(lighting_path, "r", encoding="utf-8") as f: lighting = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] lighting = {x[0]: [x[1],x[2]] for x in lighting} except Exception as e: print(f"""Error loading lighting.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return lighting @classmethod def INPUT_TYPES(cls): cls.lighting_csv = cls.load_lighting_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\lighting.csv")) return { "required": { "lighting": (list(cls.lighting_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, lighting): return (self.lighting_csv[lighting][0], self.lighting_csv[lighting][1]) #SETTING class SettingsCSVLoader: """ Loads csv file with settings. For migration purposes from automatic11111 webui. """ @staticmethod def load_settings_csv(settings_path: str): """Loads csv file with settings. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of settings. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ settings = {"Error loading settings.csv, check the console": ["",""]} if not os.path.exists(settings_path): print(f"""Error. No settings.csv found. Put your settings.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return settings try: with open(settings_path, "r", encoding="utf-8") as f: settings = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] settings = {x[0]: [x[1],x[2]] for x in settings} except Exception as e: print(f"""Error loading settings.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return settings @classmethod def INPUT_TYPES(cls): cls.settings_csv = cls.load_settings_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\settings.csv")) return { "required": { "settings": (list(cls.settings_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, settings): return (self.settings_csv[settings][0], self.settings_csv[settings][1]) #STYLE class StylesCSVLoader: """ Loads csv file with styles. For migration purposes from automatic11111 webui. """ @staticmethod def load_styles_csv(styles_path: str): """Loads csv file with styles. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. 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): print(f"""Error. No styles.csv found. Put your styles.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) 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: print(f"""Error loading styles.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return styles @classmethod def INPUT_TYPES(cls): cls.styles_csv = cls.load_styles_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\styles.csv")) return { "required": { "styles": (list(cls.styles_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, styles): return (self.styles_csv[styles][0], self.styles_csv[styles][1]) #POSITIVE class PositiveCSVLoader: """ Loads csv file with positive. For migration purposes from automatic11111 webui. """ @staticmethod def load_positive_csv(positive_path: str): """Loads csv file with positive. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of positive. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ positive = {"Error loading positive.csv, check the console": ["",""]} if not os.path.exists(positive_path): print(f"""Error. No positive.csv found. Put your positive.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return positive try: with open(positive_path, "r", encoding="utf-8") as f: positive = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] positive = {x[0]: [x[1],x[2]] for x in positive} except Exception as e: print(f"""Error loading positive.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return positive @classmethod def INPUT_TYPES(cls): cls.positive_csv = cls.load_positive_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\positive.csv")) return { "required": { "positive": (list(cls.positive_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, positive): return (self.positive_csv[positive][0], self.positive_csv[positive][1]) #NEGATIVE class NegativeCSVLoader: """ Loads csv file with negative. For migration purposes from automatic11111 webui. """ @staticmethod def load_negative_csv(negative_path: str): """Loads csv file with negative. It has only one column. Ignore the first row (header). positive_prompt are strings separated by comma. Each string is a prompt. negative_prompt are strings separated by comma. Each string is a prompt. Returns: list: List of negative. Each style is a dict with keys: style_name and value: [positive_prompt, negative_prompt] """ negative = {"Error loading negative.csv, check the console": ["",""]} if not os.path.exists(negative_path): print(f"""Error. No negative.csv found. Put your negative.csv in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} """) return negative try: with open(negative_path, "r", encoding="utf-8") as f: negative = [[x.replace('"', '').replace('\n','') for x in re.split(',(?=(?:[^"]*"[^"]*")*[^"]*$)', line)] for line in f.readlines()[1:]] negative = {x[0]: [x[1],x[2]] for x in negative} except Exception as e: print(f"""Error loading negative.csv. Make sure it is in the custom_nodes-ComfyUI_Loader-CSV directory of ComfyUI. Then press "Refresh". Your current root directory is: {folder_paths.base_path} Error: {e} """) return negative @classmethod def INPUT_TYPES(cls): cls.negative_csv = cls.load_negative_csv(os.path.join(folder_paths.base_path, "custom_nodes\\ComfyUI-CSV-Loader\\CSV\\negative.csv")) return { "required": { "negative": (list(cls.negative_csv.keys()),), }, } RETURN_TYPES = ("STRING","STRING") RETURN_NAMES = ("positive prompt", "negative prompt") FUNCTION = "execute" CATEGORY = "CSV Loaders" def execute(self, negative): return (self.negative_csv[negative][0], self.negative_csv[negative][1]) #NODE NAMING NODE_CLASS_MAPPINGS = { "Load Artists CSV": ArtistsCSVLoader, "Load Artmovements CSV": ArtmovementsCSVLoader, "Load Characters CSV": CharactersCSVLoader, "Load Colors CSV": ColorsCSVLoader, "Load Composition CSV": CompositionCSVLoader, "Load Lighting CSV": LightingCSVLoader, "Load Settings CSV": SettingsCSVLoader, "Load Styles CSV": StylesCSVLoader, "Load Positive CSV": PositiveCSVLoader, "Load Negative CSV": NegativeCSVLoader } NODE_DISPLAY_NAME_MAPPINGS = { "ArtistsCSVLoader": "Load Artists CSV Node", "ArtmovementsCSVLoader": "Load Art Movements CSV Node", "CharactersCSVLoader": "Load Characters CSV Node", "ColorsCSVLoader": "Load Colors CSV Node", "CompositionCSVLoader": "Load Composition CSV Node", "LightingCSVLoader": "Load Lighting CSV Node", "SettingsCSVLoader": "Load Settings CSV Node", "StylesCSVLoader": "Load Styles CSV Node", "PositiveCSVLoader": "Load Positive CSV Node", "NegativeCSVLoader": "Load Negative CSV Node" }