Add output file count validation (#97)

* Worker file_list ignores hidden files

* Add frame-count validation logic
This commit is contained in:
2024-08-11 13:00:54 -05:00
committed by GitHub
parent 8104bd4e86
commit 94a40c46dc

View File

@@ -238,7 +238,12 @@ class BaseRenderWorker(Base):
DistributedJobManager.wait_for_subjobs(parent_job=self) DistributedJobManager.wait_for_subjobs(parent_job=self)
@staticmethod @staticmethod
def log_and_print(message, log_file): def log_and_print(message, log_file, level='info'):
if level == 'debug':
logger.debug(message)
elif level == 'error':
logger.error(message)
else:
logger.info(message) logger.info(message)
log_file.write(f"{message}\n") log_file.write(f"{message}\n")
@@ -259,26 +264,35 @@ class BaseRenderWorker(Base):
else: else:
self.__run__wait_for_subjobs(log_file) self.__run__wait_for_subjobs(log_file)
# Validate Output - End if missing frames
if self.status == RenderStatus.RUNNING:
file_list_length = len(self.file_list())
expected_list_length = (self.end_frame - self.start_frame + 1) if self.end_frame else 1
msg = f"Frames: Expected ({expected_list_length}) vs actual ({file_list_length}) for {self}"
self.log_and_print(msg, log_file, 'debug')
if file_list_length not in (expected_list_length, 1):
msg = f"Missing frames: Expected ({expected_list_length}) vs actual ({file_list_length})"
self.log_and_print(msg, log_file, 'error')
self.errors.append(msg)
self.status = RenderStatus.ERROR
# todo: create new subjob to generate missing frames
# cleanup and close if cancelled / error
if self.status in [RenderStatus.CANCELLED, RenderStatus.ERROR]: if self.status in [RenderStatus.CANCELLED, RenderStatus.ERROR]:
self.end_time = datetime.now() self.end_time = datetime.now()
message = f"{self.engine.name()} render ended with status '{self.status}' " \ message = f"{self.engine.name()} render ended with status '{self.status.value}' " \
f"after {self.time_elapsed()}" f"after {self.time_elapsed()}"
self.log_and_print(message, log_file) self.log_and_print(message, log_file)
return return
# Validate Output
file_list_length = len(self.file_list())
expected_list_length = (self.end_frame - self.start_frame + 1) if self.end_frame else 1
if file_list_length not in (expected_list_length, 1):
logger.error(f"Expected length: {expected_list_length} | actual length: {len(self.file_list())}")
# todo: create new subjob
# Post Render Work # Post Render Work
if not self.parent: if not self.parent:
logger.debug(f"Starting post-processing work for {self}") logger.debug(f"Starting post-processing work for {self}")
self.log_and_print(f"Starting post-processing work for {self}", log_file, 'debug')
self.post_processing() self.post_processing()
logger.debug(f"Completed post-processing work for {self}") self.log_and_print(f"Completed post-processing work for {self}", log_file, 'debug')
self.status = RenderStatus.COMPLETED self.status = RenderStatus.COMPLETED
self.end_time = datetime.now() self.end_time = datetime.now()
@@ -389,7 +403,11 @@ class BaseRenderWorker(Base):
def file_list(self): def file_list(self):
try: try:
job_dir = os.path.dirname(self.output_path) job_dir = os.path.dirname(self.output_path)
file_list = [os.path.join(job_dir, file) for file in os.listdir(job_dir)] file_list = [
os.path.join(job_dir, file)
for file in os.listdir(job_dir)
if not file.startswith('.') # Ignore hidden files
]
file_list.sort() file_list.sort()
return file_list return file_list
except FileNotFoundError: except FileNotFoundError: