#!/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()