mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 16:58:12 +00:00
Multi client jobs (#15)
* Add API to expose if RenderQueue is available to take new jobs for a given renderer and priority * Fix issue with calculating Blender percent complete when not starting at 1 * Rename owner / client properties to parent / children * Add make_ready method to API * Create and submit subjobs to other servers * Update make_ready to update children jobs and some misc fixes * Misc GUI cleanup
This commit is contained in:
@@ -22,10 +22,9 @@ class AERenderWorker(BaseRenderWorker):
|
||||
supported_extensions = ['.aep']
|
||||
engine = AERender
|
||||
|
||||
def __init__(self, input_path, output_path, priority=2, args=None, owner=None,
|
||||
client=None, name=None):
|
||||
def __init__(self, input_path, output_path, args=None, parent=None, name=None):
|
||||
super(AERenderWorker, self).__init__(input_path=input_path, output_path=output_path, args=args,
|
||||
client=client, priority=priority, owner=owner, name=name)
|
||||
parent=parent, name=name)
|
||||
|
||||
self.comp = args.get('comp', None)
|
||||
self.render_settings = args.get('render_settings', None)
|
||||
|
||||
@@ -26,6 +26,7 @@ class RenderStatus(Enum):
|
||||
CANCELLED = "cancelled"
|
||||
ERROR = "error"
|
||||
SCHEDULED = "scheduled"
|
||||
NOT_READY = "not_ready"
|
||||
UNDEFINED = "undefined"
|
||||
|
||||
|
||||
@@ -51,15 +52,15 @@ class BaseRenderWorker(Base):
|
||||
project_length = Column(Integer)
|
||||
start_frame = Column(Integer)
|
||||
end_frame = Column(Integer, nullable=True)
|
||||
owner = Column(String)
|
||||
client = Column(String)
|
||||
parent = Column(String, nullable=True)
|
||||
children = Column(String, nullable=True)
|
||||
name = Column(String)
|
||||
file_hash = Column(String)
|
||||
_status = Column(String)
|
||||
|
||||
engine = None
|
||||
|
||||
def __init__(self, input_path, output_path, priority=2, args=None, ignore_extensions=True, owner=None, client=None,
|
||||
def __init__(self, input_path, output_path, priority=2, args=None, ignore_extensions=True, parent=None,
|
||||
name=None):
|
||||
|
||||
if not ignore_extensions:
|
||||
@@ -83,9 +84,9 @@ class BaseRenderWorker(Base):
|
||||
self.renderer = self.engine.name()
|
||||
self.renderer_version = self.engine.version()
|
||||
self.priority = priority
|
||||
self.owner = owner
|
||||
self.client = client
|
||||
self.name = name
|
||||
self.parent = parent
|
||||
self.children = None
|
||||
self.name = name or os.path.basename(input_path)
|
||||
|
||||
# Frame Ranges
|
||||
self.project_length = -1
|
||||
@@ -98,7 +99,7 @@ class BaseRenderWorker(Base):
|
||||
self.end_time = None
|
||||
|
||||
# History
|
||||
self.status = RenderStatus.NOT_STARTED
|
||||
self.status = RenderStatus.NOT_READY
|
||||
self.warnings = []
|
||||
self.errors = []
|
||||
self.failed_attempts = 0
|
||||
@@ -127,8 +128,7 @@ class BaseRenderWorker(Base):
|
||||
def status(self):
|
||||
if self._status in [RenderStatus.RUNNING.value, RenderStatus.NOT_STARTED.value]:
|
||||
if not hasattr(self, 'errors'):
|
||||
self._status = RenderStatus.CANCELLED
|
||||
return RenderStatus.CANCELLED
|
||||
self._status = RenderStatus.CANCELLED.value
|
||||
return string_to_status(self._status)
|
||||
|
||||
def validate(self):
|
||||
@@ -184,6 +184,7 @@ class BaseRenderWorker(Base):
|
||||
return
|
||||
|
||||
self.status = RenderStatus.RUNNING
|
||||
self.start_time = datetime.now()
|
||||
logger.info(f'Starting {self.engine.name()} {self.engine.version()} Render for {self.input_path} | Frame Count: {self.total_frames}')
|
||||
self.__thread.start()
|
||||
|
||||
@@ -202,7 +203,6 @@ class BaseRenderWorker(Base):
|
||||
logger.debug("Renderer commands generated - {}".format(" ".join(subprocess_cmds)))
|
||||
self.__process = subprocess.Popen(subprocess_cmds, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
universal_newlines=False)
|
||||
self.start_time = datetime.now()
|
||||
|
||||
with open(self.log_path(), "a") as f:
|
||||
|
||||
@@ -298,8 +298,8 @@ class BaseRenderWorker(Base):
|
||||
'input_path': self.input_path,
|
||||
'output_path': self.output_path,
|
||||
'priority': self.priority,
|
||||
'owner': self.owner,
|
||||
'client': self.client,
|
||||
'parent': self.parent,
|
||||
'children': self.children,
|
||||
'date_created': self.date_created,
|
||||
'start_time': self.start_time,
|
||||
'end_time': self.end_time,
|
||||
@@ -310,6 +310,8 @@ class BaseRenderWorker(Base):
|
||||
'renderer': self.renderer,
|
||||
'renderer_version': self.renderer_version,
|
||||
'errors': getattr(self, 'errors', None),
|
||||
'start_frame': self.start_frame,
|
||||
'end_frame': self.end_frame,
|
||||
'total_frames': self.total_frames,
|
||||
'last_output': getattr(self, 'last_output', None),
|
||||
'log_path': self.log_path()
|
||||
|
||||
@@ -13,10 +13,9 @@ class BlenderRenderWorker(BaseRenderWorker):
|
||||
|
||||
engine = Blender
|
||||
|
||||
def __init__(self, input_path, output_path, priority=2, args=None, owner=None,
|
||||
client=None, name=None):
|
||||
def __init__(self, input_path, output_path, args=None, parent=None, name=None):
|
||||
super(BlenderRenderWorker, self).__init__(input_path=input_path, output_path=output_path, args=args,
|
||||
client=client, priority=priority, owner=owner, name=name)
|
||||
parent=parent, name=name)
|
||||
|
||||
# Args
|
||||
self.blender_engine = self.args.get('engine', 'BLENDER_EEVEE').upper()
|
||||
@@ -112,7 +111,7 @@ class BlenderRenderWorker(BaseRenderWorker):
|
||||
if self.total_frames <= 1:
|
||||
return self.__frame_percent_complete
|
||||
else:
|
||||
whole_frame_percent = (self.current_frame - 1) / self.total_frames
|
||||
whole_frame_percent = (self.current_frame - self.start_frame) / self.total_frames
|
||||
adjusted_frame_percent = self.__frame_percent_complete / self.total_frames
|
||||
total_percent = whole_frame_percent + adjusted_frame_percent
|
||||
return max(total_percent, 0)
|
||||
|
||||
@@ -8,10 +8,9 @@ class FFMPEGRenderWorker(BaseRenderWorker):
|
||||
|
||||
engine = FFMPEG
|
||||
|
||||
def __init__(self, input_path, output_path, priority=2, args=None, owner=None,
|
||||
client=None, name=None):
|
||||
def __init__(self, input_path, output_path, args=None, parent=None, name=None):
|
||||
super(FFMPEGRenderWorker, self).__init__(input_path=input_path, output_path=output_path, args=args,
|
||||
client=client, priority=priority, owner=owner, name=name)
|
||||
parent=parent, name=name)
|
||||
|
||||
stream_info = subprocess.check_output([self.engine.renderer_path(), "-i", # https://stackoverflow.com/a/61604105
|
||||
input_path, "-map", "0:v:0", "-c", "copy", "-f", "null", "-y",
|
||||
|
||||
@@ -10,11 +10,9 @@ class RenderWorkerFactory:
|
||||
return classes
|
||||
|
||||
@staticmethod
|
||||
def create_worker(renderer, input_path, output_path, priority=2, args=None, owner=None,
|
||||
client=None, name=None):
|
||||
def create_worker(renderer, input_path, output_path, args=None, parent=None, name=None):
|
||||
worker_class = RenderWorkerFactory.class_for_name(renderer)
|
||||
return worker_class(input_path=input_path, output_path=output_path, args=args, priority=priority, owner=owner,
|
||||
client=client, name=name)
|
||||
return worker_class(input_path=input_path, output_path=output_path, args=args, parent=parent, name=name)
|
||||
|
||||
@staticmethod
|
||||
def supported_renderers():
|
||||
|
||||
Reference in New Issue
Block a user