Dreamspire's picture
custom_nodes
f2dbf59
import hashlib
import os
class BatchManagerNode:
def __init__(self, frames_per_batch=-1):
print("BatchNode init")
self.frames_per_batch = frames_per_batch
self.inputs = {}
self.outputs = {}
self.unique_id = None
self.has_closed_inputs = False
self.total_frames = float('inf')
def reset(self):
print("BatchNode reset")
self.close_inputs()
for key in self.outputs:
if getattr(self.outputs[key][-1], "gi_suspended", False):
try:
self.outputs[key][-1].send(None)
except StopIteration:
pass
self.__init__(self.frames_per_batch)
def has_open_inputs(self):
return len(self.inputs) > 0
def close_inputs(self):
for key in self.inputs:
if getattr(self.inputs[key][-1], "gi_suspended", False):
try:
self.inputs[key][-1].send(1)
except StopIteration:
pass
self.inputs = {}
@classmethod
def INPUT_TYPES(s):
return {
"required": {"frames_per_batch": ("INT", {"default": 16, "min": 1, "max": 128, "step": 1})},
"hidden": {"prompt": "PROMPT", "unique_id": "UNIQUE_ID"},
}
RETURN_TYPES = ("BatchManager",)
RETURN_NAMES = ("meta_batch",)
CATEGORY = "tbox/Video"
FUNCTION = "update_batch"
def update_batch(self, frames_per_batch, prompt=None, unique_id=None):
if unique_id is not None and prompt is not None:
requeue = prompt[unique_id]['inputs'].get('requeue', 0)
else:
requeue = 0
print(f'update_batch >> unique_id: {unique_id}; requeue: {requeue}')
if requeue == 0:
self.reset()
self.frames_per_batch = frames_per_batch
self.unique_id = unique_id
else:
num_batches = (self.total_frames+self.frames_per_batch-1)//frames_per_batch
print(f'Meta-Batch {requeue}/{num_batches}')
#onExecuted seems to not be called unless some message is sent
return (self,)
@classmethod
def IS_CHANGED(self, frames_per_batch, prompt=None, unique_id=None):
print(f"BatchManagerNode >>> IS_CHANGED : {result}")
random_bytes = os.urandom(32)
result = hashlib.sha256(random_bytes).hexdigest()
return result