InvokeAI/scripts/scan_models_directory.py
2023-11-11 10:55:23 +11:00

62 lines
1.7 KiB
Python
Executable File

#!/usr/bin/env python
"""
Scan the models directory and print out a new models.yaml
"""
import argparse
import os
import sys
from pathlib import Path
from omegaconf import OmegaConf
def main():
parser = argparse.ArgumentParser(description="Model directory scanner")
parser.add_argument("models_directory")
parser.add_argument(
"--all-models",
default=False,
action="store_true",
help="If true, then generates stanzas for all models; otherwise just diffusers",
)
args = parser.parse_args()
directory = args.models_directory
conf = OmegaConf.create()
conf["_version"] = "3.0.0"
for root, dirs, files in os.walk(directory):
parents = root.split("/")
subpaths = parents[parents.index("models") + 1 :]
if len(subpaths) < 2:
continue
base, model_type, *_ = subpaths
if args.all_models or model_type == "diffusers":
for d in dirs:
conf[f"{base}/{model_type}/{d}"] = {
"path": os.path.join(root, d),
"description": f"{model_type} model {d}",
"format": "folder",
"base": base,
}
for f in files:
basename = Path(f).stem
format = Path(f).suffix[1:]
conf[f"{base}/{model_type}/{basename}"] = {
"path": os.path.join(root, f),
"description": f"{model_type} model {basename}",
"format": format,
"base": base,
}
OmegaConf.save(config=dict(sorted(conf.items())), f=sys.stdout)
if __name__ == "__main__":
main()