mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 08:48:13 +00:00
Add output file count validation (#97)
* Worker file_list ignores hidden files * Add frame-count validation logic
This commit is contained in:
@@ -238,8 +238,13 @@ 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'):
|
||||||
logger.info(message)
|
if level == 'debug':
|
||||||
|
logger.debug(message)
|
||||||
|
elif level == 'error':
|
||||||
|
logger.error(message)
|
||||||
|
else:
|
||||||
|
logger.info(message)
|
||||||
log_file.write(f"{message}\n")
|
log_file.write(f"{message}\n")
|
||||||
|
|
||||||
def __run(self):
|
def __run(self):
|
||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user