diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index dca3e49780..2a2ee24c48 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -172,6 +172,7 @@ class Args(object): command = cmd_string.replace("'", "\\'") try: elements = shlex.split(command) + elements = [x.replace("\\'","'") for x in elements] except ValueError: import sys, traceback print(traceback.format_exc(), file=sys.stderr) @@ -935,7 +936,7 @@ def metadata_loads(metadata) -> list: for image in images: # repack the prompt and variations if 'prompt' in image: - image['prompt'] = ','.join([':'.join([x['prompt'], str(x['weight'])]) for x in image['prompt']]) + image['prompt'] = repack_prompt(image['prompt']) if 'variations' in image: image['variations'] = ','.join([':'.join([str(x['seed']),str(x['weight'])]) for x in image['variations']]) # fix a bit of semantic drift here @@ -943,12 +944,19 @@ def metadata_loads(metadata) -> list: opt = Args() opt._cmd_switches = Namespace(**image) results.append(opt) - except KeyError as e: + except Exception as e: import sys, traceback - print('>> badly-formatted metadata',file=sys.stderr) + print('>> could not read metadata',file=sys.stderr) print(traceback.format_exc(), file=sys.stderr) return results +def repack_prompt(prompt_list:list)->str: + # in the common case of no weighting syntax, just return the prompt as is + if len(prompt_list) > 1: + return ','.join([':'.join([x['prompt'], str(x['weight'])]) for x in prompt_list]) + else: + return prompt_list[0]['prompt'] + # image can either be a file path on disk or a base64-encoded # representation of the file's contents def calculate_init_img_hash(image_string): diff --git a/scripts/invoke.py b/scripts/invoke.py index 2247f64219..b2f4e35518 100644 --- a/scripts/invoke.py +++ b/scripts/invoke.py @@ -800,19 +800,33 @@ def retrieve_dream_command(opt,command,completer): will retrieve and format the dream command used to generate the image, and pop it into the readline buffer (linux, Mac), or print out a comment for cut-and-paste (windows) + Given a wildcard path to a folder with image png files, will retrieve and format the dream command used to generate the images, and save them to a file commands.txt for further processing ''' if len(command) == 0: return + tokens = command.split() if len(tokens) > 1: - outfilepath = tokens[1] - else: - outfilepath = "commands.txt" - + return write_commands(opt,tokens) + + try: + cmd = dream_cmd_from_png(tokens[0]) + except OSError: + print(f'## {path}: file could not be read') + except (KeyError, AttributeError, IndexError): + print(f'## {path}: file has no metadata') + except: + print(f'## {path}: file could not be processed') + if len(cmd)>0: + completer.set_line(cmd) + +def write_commands(opt, tokens:list): file_path = tokens[0] + outfilepath = tokens[1] + dir,basename = os.path.split(file_path) if len(dir) == 0: dir = opt.outdir @@ -827,28 +841,23 @@ def retrieve_dream_command(opt,command,completer): return commands = [] + cmd = None for path in paths: try: cmd = dream_cmd_from_png(path) except OSError: print(f'## {path}: file could not be read') - continue except (KeyError, AttributeError, IndexError): print(f'## {path}: file has no metadata') - continue except: print(f'## {path}: file could not be processed') - continue - - commands.append(f'# {path}') - commands.append(cmd) - - with open(outfilepath, 'w', encoding='utf-8') as f: - f.write('\n'.join(commands)) - print(f'>> File {outfilepath} with commands created') - - if len(commands) == 2: - completer.set_line(commands[1]) + if cmd: + commands.append(f'# {path}') + commands.append(cmd) + if len(commands)>0: + with open(outfilepath, 'w', encoding='utf-8') as f: + f.write('\n'.join(commands)) + print(f'>> File {outfilepath} with commands created') ######################################