Spaces:
Runtime error
Runtime error
| import glob | |
| import json | |
| import logging | |
| import os | |
| import re | |
| import shutil | |
| from pathlib import Path | |
| from animatediff import get_dir | |
| logger = logging.getLogger(__name__) | |
| data_dir = get_dir("data") | |
| extra_loading_regex = r'(<[^>]+?>)' | |
| def generate_config_from_civitai_info( | |
| lora_dir:Path, | |
| config_org:Path, | |
| out_dir:Path, | |
| lora_weight:float, | |
| ): | |
| lora_abs_dir = lora_dir.absolute() | |
| config_org = config_org.absolute() | |
| out_dir = out_dir.absolute() | |
| civitais = sorted(glob.glob( os.path.join(lora_abs_dir, "*.civitai.info"), recursive=False)) | |
| with open(config_org, "r") as cf: | |
| org_config = json.load(cf) | |
| for civ in civitais: | |
| logger.info(f"convert {civ}") | |
| with open(civ, "r") as f: | |
| # trim .civitai.info | |
| name = os.path.splitext(os.path.splitext(os.path.basename(civ))[0])[0] | |
| output_path = out_dir.joinpath(name + ".json") | |
| if os.path.isfile(output_path): | |
| logger.info("already converted -> skip") | |
| continue | |
| if os.path.isfile( lora_abs_dir.joinpath(name + ".safetensors")): | |
| lora_path = os.path.relpath(lora_abs_dir.joinpath(name + ".safetensors"), data_dir) | |
| elif os.path.isfile( lora_abs_dir.joinpath(name + ".ckpt")): | |
| lora_path = os.path.relpath(lora_abs_dir.joinpath(name + ".ckpt"), data_dir) | |
| else: | |
| logger.info("lora file not found -> skip") | |
| continue | |
| info = json.load(f) | |
| if not info: | |
| logger.info(f"empty civitai info -> skip") | |
| continue | |
| if info["model"]["type"] not in ("LORA","lora"): | |
| logger.info(f"unsupported type {info['model']['type']} -> skip") | |
| continue | |
| new_config = org_config.copy() | |
| new_config["name"] = name | |
| new_prompt_map = {} | |
| new_n_prompt = "" | |
| new_seed = -1 | |
| raw_prompt_map = {} | |
| i = 0 | |
| for img_info in info["images"]: | |
| if img_info["meta"]: | |
| try: | |
| raw_prompt = img_info["meta"]["prompt"] | |
| except Exception as e: | |
| logger.info("missing prompt") | |
| continue | |
| raw_prompt_map[str(10000 + i*32)] = raw_prompt | |
| new_prompt_map[str(i*32)] = re.sub(extra_loading_regex, '', raw_prompt) | |
| if not new_n_prompt: | |
| try: | |
| new_n_prompt = img_info["meta"]["negativePrompt"] | |
| except Exception as e: | |
| new_n_prompt = "" | |
| if new_seed == -1: | |
| try: | |
| new_seed = img_info["meta"]["seed"] | |
| except Exception as e: | |
| new_seed = -1 | |
| i += 1 | |
| if not new_prompt_map: | |
| new_prompt_map[str(0)] = "" | |
| for k in raw_prompt_map: | |
| # comment | |
| new_prompt_map[k] = raw_prompt_map[k] | |
| new_config["prompt_map"] = new_prompt_map | |
| new_config["n_prompt"] = [new_n_prompt] | |
| new_config["seed"] = [new_seed] | |
| new_config["lora_map"] = {lora_path.replace(os.sep,'/'):lora_weight} | |
| with open( out_dir.joinpath(name + ".json"), 'w') as wf: | |
| json.dump(new_config, wf, indent=4) | |
| logger.info("converted!") | |
| preview = lora_abs_dir.joinpath(name + ".preview.png") | |
| if preview.is_file(): | |
| shutil.copy(preview, out_dir.joinpath(name + ".preview.png")) | |