#!/usr/bin/env python """ Scan the models directory and print out a new models.yaml """ import os import sys import argparse 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}"] = dict( 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}"] = dict( 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()