From 4ef1e566227722f264fcaed5ffa7078d86d1c338 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 14 Aug 2025 10:14:16 -0400 Subject: [PATCH] simplify namegen seq Signed-off-by: Vladimir Mandic --- modules/images.py | 2 +- modules/images_namegen.py | 43 +++++++++++++++------------------------ 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/modules/images.py b/modules/images.py index 9c3992d23..1b8eb6cce 100644 --- a/modules/images.py +++ b/modules/images.py @@ -197,7 +197,7 @@ def save_image(image, dirname = os.path.dirname(params.filename) if dirname is not None and len(dirname) > 0: os.makedirs(dirname, exist_ok=True) - params.filename = namegen.sequence(params.filename, dirname, basename) + params.filename = namegen.sequence(params.filename) params.filename = namegen.sanitize(params.filename) # callbacks script_callbacks.before_image_saved_callback(params) diff --git a/modules/images_namegen.py b/modules/images_namegen.py index 673ab9cac..c8971eff2 100644 --- a/modules/images_namegen.py +++ b/modules/images_namegen.py @@ -15,6 +15,7 @@ re_pattern_arg = re.compile(r"(.*)<([^>]*)>$") re_attention = re.compile(r'[\(*\[*](\w+)(:\d+(\.\d+))?[\)*\]*]|') re_network = re.compile(r'\<\w+:(\w+)(:\d+(\.\d+))?\>|') re_brackets = re.compile(r'[\([{})\]]') +seq = 0 NOTHING = object() @@ -182,18 +183,20 @@ class FilenameGenerator: debug(f'Filename sanitize: input="{filename}" parts={parts} output="{fn}" ext={ext} max={max_length} len={len(fn)}') return fn - def sequence(self, fn, dirname, basename): + def sequence(self, fn): + global seq # pylint: disable=global-statement x = fn + dirname = os.path.dirname(fn) + if seq == 0: + seq = len(os.listdir(dirname)) if os.path.exists(dirname) and os.path.isdir(dirname) else 0 if shared.opts.save_images_add_number or '[seq]' in fn: if '[seq]' not in fn: fn = os.path.join(os.path.dirname(fn), f"[seq]-{os.path.basename(fn)}") - basecount = get_next_sequence_number(dirname, basename) - for i in range(9999): - seq = f"{basecount + i:05}" - filename = fn.replace('[seq]', seq) - if not os.path.exists(filename): - debug(f'Prompt sequence: input="{fn}" seq={seq} output="{filename}"') - x = filename + for _i in range(99999): # 99999/000001 + seq += 1 + dst = fn.replace('[seq]', f'{seq:05}') + if not os.path.exists(dst): + x = dst break return x @@ -220,7 +223,7 @@ class FilenameGenerator: replacement = fun(self, *pattern_args) except Exception as e: replacement = None - errors.display(e, 'Filename apply pattern') + errors.display(e, 'namegen') shared.log.error(f'Filename apply pattern: {x} {e}') if replacement == NOTHING: continue @@ -232,21 +235,7 @@ class FilenameGenerator: return res -def get_next_sequence_number(path, basename): - """ - Determines and returns the next sequence number to use when saving an image in the specified directory. - """ - result = -1 - if basename != '': - basename = f"{basename}-" - prefix_length = len(basename) - if not os.path.isdir(path): - return 0 - for p in os.listdir(path): - if p.startswith(basename): - parts = os.path.splitext(p[prefix_length:])[0].split('-') # splits the filename (removing the basename first if one is defined, so the sequence number is always the first element) - try: - result = max(int(parts[0]), result) - except ValueError: - pass - return result + 1 +def get_next_sequence_number(path, basename): # pylint: disable=unused-argument + global seq # pylint: disable=global-statement + seq += 1 + return seq # unused