TheNetherWatcher's picture
Upload folder using huggingface_hub
d0ffe9c verified
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"))