|
"""This modules uses the JSON files created by the |
|
https://github.com/butaixianran/Stable-Diffusion-Webui-Civitai-Helper extension""" |
|
|
|
import sys |
|
import os |
|
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "scripts")) |
|
from scripts.Logger import Logger |
|
from scripts.Utils import Utils |
|
|
|
import modules.shared as shared |
|
import modules.scripts as scripts |
|
import json |
|
|
|
|
|
class CivitaihelperPrompts(): |
|
""" |
|
This class is used to get the prompts from the JSON files created by the |
|
Stable-Diffusion-Webui-Civitai-Helper extension |
|
""" |
|
|
|
def __init__(self) -> None: |
|
self.model_path = self.get_custom_model_folder() |
|
self.utils = Utils() |
|
self.logger = Logger() |
|
self.logger.debug = False |
|
|
|
def get_custom_model_folder(self) -> str: |
|
"""Get the custom model folder from the command line options or the default folder |
|
|
|
Returns: |
|
str: the model folder path |
|
""" |
|
if shared.cmd_opts.ckpt_dir and os.path.isdir(shared.cmd_opts.ckpt_dir): |
|
return shared.cmd_opts.ckpt_dir |
|
else: |
|
return os.path.join(scripts.basedir(), "models", "Stable-diffusion") |
|
|
|
|
|
def get_civitAi_prompt_from_model(self, path: str) -> str: |
|
"""Get the prompt from the civitai.info file |
|
|
|
Args: |
|
path (str): the path to the model |
|
|
|
Returns: |
|
str: the prompt |
|
""" |
|
path = path.replace(".ckpt", ".civitai.info").replace( |
|
".safetensors", ".civitai.info") |
|
path = self.utils.get_clean_checkpoint_path(path) |
|
path = os.path.join(self.model_path, path) |
|
self.logger.debug_log(f"{path} -> is file {os.path.isfile(path)}") |
|
if not os.path.exists(os.path.realpath(path)): |
|
return "{prompt};" |
|
model_info = None |
|
with open(os.path.realpath(path), 'r') as f: |
|
try: |
|
model_info = json.load(f) |
|
except Exception as e: |
|
self.logger.debug_log(f"Error loading civitai info: {e}", False) |
|
return "{prompt};" |
|
try: |
|
self.logger.debug_log(f"len: {len(model_info['images'])}") |
|
for i in range(0, len(model_info['images'])): |
|
try: |
|
info = model_info['images'][i]['meta']['prompt'] |
|
self.logger.debug_log(f"Prompt: {info}") |
|
if info: |
|
return f"{info};" |
|
except: |
|
pass |
|
return "{prompt};" |
|
except: |
|
return "{prompt};" |
|
|
|
def createCivitaiPromptString(self, checkpoints: str) -> str: |
|
"""Create a string with all the prompts from the checkpoints |
|
Indices are added to the prompts |
|
|
|
Args: |
|
checkpoints (str): the checkpoints |
|
|
|
Returns: |
|
str: the prompt string with indices |
|
""" |
|
checkpoints_list = self.utils.getCheckpointListFromInput(checkpoints) |
|
prompts = "" |
|
prompts_with_info = "" |
|
for i, checkpoint in enumerate(checkpoints_list): |
|
prompts += self.get_civitAi_prompt_from_model(checkpoint) |
|
|
|
prompts_with_info += self.utils.add_index_to_string( |
|
prompts, is_checkpoint=False) |
|
|
|
self.logger.log_info("loaded all prompts") |
|
return prompts_with_info |
|
|