From 707b05869a93ea7d59357a442f8d61ae14f1fc9a Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Wed, 12 Feb 2025 16:34:47 +0100 Subject: [PATCH 1/2] Improve create_shot_clip code readability. --- .../plugins/create/create_shot_clip.py | 82 +++++++------------ 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/client/ayon_hiero/plugins/create/create_shot_clip.py b/client/ayon_hiero/plugins/create/create_shot_clip.py index afeaf0f..596e42d 100644 --- a/client/ayon_hiero/plugins/create/create_shot_clip.py +++ b/client/ayon_hiero/plugins/create/create_shot_clip.py @@ -224,18 +224,23 @@ def get_attr_defs_for_instance(self, instance): disabled=True, ) ] + + if self.product_type in ("audio", "plate"): + instance_attributes.append( + BoolDef( + "review", + label="Review", + tooltip="Switch to reviewable instance", + default=False, + ) + ) + if self.product_type == "plate": # Review track visibility current_review = instance.creator_attributes.get("review", False) instance_attributes.extend( [ - BoolDef( - "review", - label="Review", - tooltip="Switch to reviewable instance", - default=False, - ), EnumDef( "reviewableSource", label="Reviewable Source", @@ -268,17 +273,6 @@ class EditorialPlateInstanceCreator(_HieroInstanceClipCreatorBase): product_type = "plate" label = "Editorial Plate" - def create(self, instance_data, _): - """Return a new CreateInstance for new shot from Resolve. - - Args: - instance_data (dict): global data from original instance - - Return: - CreatedInstance: The created instance object for the new shot. - """ - return super().create(instance_data, None) - class EditorialAudioInstanceCreator(_HieroInstanceClipCreatorBase): """Audio product type creator class""" @@ -297,28 +291,6 @@ def get_product_name( project_entity=None): return f"{self.product_type}Main" - def get_attr_defs_for_instance(self, instance): - - instance_attributes = [ - TextDef( - "parentInstance", - label="Linked to", - disabled=True, - ) - ] - - instance_attributes.extend( - [ - BoolDef( - "review", - label="Review", - tooltip="Switch to reviewable instance", - default=False, - ), - ] - ) - return instance_attributes - class CreateShotClip(plugin.HieroCreator): """Publishable clip""" @@ -652,25 +624,27 @@ def create(self, subset_name, instance_data, pre_create_data): "variant": "main", "productType": "shot", "productName": "shotMain", - "creator_attributes": { - "workfileFrameStart": sub_instance_data[ - "workfileFrameStart" - ], - "handleStart": sub_instance_data["handleStart"], - "handleEnd": sub_instance_data["handleEnd"], - "frameStart": workfileFrameStart, - "frameEnd": ( - workfileFrameStart + track_item_duration), - "clipIn": track_item.timelineIn(), - "clipOut": track_item.timelineOut(), - "clipDuration": track_item_duration, - "sourceIn": track_item.sourceIn(), - "sourceOut": track_item.sourceOut(), - }, "label": ( f"{sub_instance_data['folderPath']} shotMain"), } ) + creator_attributes.update( + { + "workfileFrameStart": sub_instance_data[ + "workfileFrameStart" + ], + "handleStart": sub_instance_data["handleStart"], + "handleEnd": sub_instance_data["handleEnd"], + "frameStart": workfileFrameStart, + "frameEnd": ( + workfileFrameStart + track_item_duration), + "clipIn": track_item.timelineIn(), + "clipOut": track_item.timelineOut(), + "clipDuration": track_item_duration, + "sourceIn": track_item.sourceIn(), + "sourceOut": track_item.sourceOut(), + } + ) # Plate, Audio # insert parent instance data to allow From c88c55862e50c880e69da82774bc50b84ab58865 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Mon, 17 Feb 2025 12:57:19 +0100 Subject: [PATCH 2/2] Report changes from Resolve. --- client/ayon_hiero/api/plugin.py | 13 +++++----- .../plugins/create/create_shot_clip.py | 25 ++++++------------- .../plugins/publish/collect_audio.py | 14 +++++++++-- .../plugins/publish/collect_plates.py | 16 +++++++++--- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/client/ayon_hiero/api/plugin.py b/client/ayon_hiero/api/plugin.py index 06b58ae..735a1c8 100644 --- a/client/ayon_hiero/api/plugin.py +++ b/client/ayon_hiero/api/plugin.py @@ -655,8 +655,6 @@ class PublishClip: Returns: hiero.core.TrackItem: hiero track item object with AYON tag """ - vertical_clip_match = {} - vertical_clip_used = {} tag_data = {} types = { @@ -696,18 +694,18 @@ class PublishClip: "reviewableSource", } - @classmethod - def restore_all_caches(cls): - cls.vertical_clip_match = {} - cls.vertical_clip_used = {} - def __init__( self, track_item, + vertical_clip_match, + vertical_clip_used, pre_create_data=None, data=None, rename_index=0): + self.vertical_clip_match = vertical_clip_match + self.vertical_clip_used = vertical_clip_used + self.rename_index = rename_index # adding ui inputs if any @@ -812,6 +810,7 @@ def get(key): self.product_type = get("productType") or self.product_type_default self.vertical_sync = get("vSyncOn") or self.vertical_sync_default self.driving_layer = get("vSyncTrack") or self.driving_layer_default + self.driving_layer = self.driving_layer.replace(" ", "_") self.review_source = ( get("reviewableSource") or self.review_source_default) self.audio = get("audio") or False diff --git a/client/ayon_hiero/plugins/create/create_shot_clip.py b/client/ayon_hiero/plugins/create/create_shot_clip.py index 596e42d..430b0ea 100644 --- a/client/ayon_hiero/plugins/create/create_shot_clip.py +++ b/client/ayon_hiero/plugins/create/create_shot_clip.py @@ -280,17 +280,6 @@ class EditorialAudioInstanceCreator(_HieroInstanceClipCreatorBase): product_type = "audio" label = "Editorial Audio" - def get_product_name( - self, - project_name, - folder_entity, - task_entity, - variant, - host_name=None, - instance=None, - project_entity=None): - return f"{self.product_type}Main" - class CreateShotClip(plugin.HieroCreator): """Publishable clip""" @@ -308,8 +297,6 @@ class CreateShotClip(plugin.HieroCreator): """ create_allow_thumbnail = False - shot_instances = {} - def get_pre_create_attr_defs(self): def header_label(text): @@ -551,6 +538,10 @@ def create(self, subset_name, instance_data, pre_create_data): } instances = [] + all_shot_instances = {} + vertical_clip_match = {} + vertical_clip_used = {} + for idx, track_item in enumerate(sorted_selected_track_items): _instance_data = copy.deepcopy(instance_data) _instance_data["clip_index"] = track_item.guid() @@ -558,6 +549,8 @@ def create(self, subset_name, instance_data, pre_create_data): # convert track item to timeline media pool item publish_clip = plugin.PublishClip( track_item, + vertical_clip_match, + vertical_clip_used, pre_create_data=pre_create_data, rename_index=idx, data=_instance_data, @@ -590,7 +583,7 @@ def create(self, subset_name, instance_data, pre_create_data): # Create new product(s) instances. shot_folder_path = _instance_data["folderPath"] - shot_instances = self.shot_instances.setdefault( + shot_instances = all_shot_instances.setdefault( shot_folder_path, {}) # desable shot creator if heroTrack is not enabled @@ -704,10 +697,6 @@ def create(self, subset_name, instance_data, pre_create_data): ) instances.append(instance) - # restore all caches - plugin.PublishClip.restore_all_caches() - self.shot_instances = {} - return instances def _create_and_add_instance(self, data, creator_id, diff --git a/client/ayon_hiero/plugins/publish/collect_audio.py b/client/ayon_hiero/plugins/publish/collect_audio.py index 34a1517..eeb7050 100644 --- a/client/ayon_hiero/plugins/publish/collect_audio.py +++ b/client/ayon_hiero/plugins/publish/collect_audio.py @@ -19,8 +19,18 @@ def process(self, instance): """ # Retrieve instance data from parent instance shot instance. parent_instance_id = instance.data["parent_instance_id"] - edit_shared_data = instance.context.data["editorialSharedData"] - shot_instance_data = edit_shared_data[parent_instance_id] + + try: + edit_shared_data = instance.context.data["editorialSharedData"] + shot_instance_data = edit_shared_data[parent_instance_id] + + # Ensure shot instance related to the audio instance exists. + except KeyError: + raise PublishError( + f'Could not find shot instance for {instance.data["label"]}.' + " Please ensure it is set and enabled." + ) + instance.data.update(shot_instance_data) # Adjust instance data from parent otio timeline. diff --git a/client/ayon_hiero/plugins/publish/collect_plates.py b/client/ayon_hiero/plugins/publish/collect_plates.py index 500f2af..d2b5fa9 100644 --- a/client/ayon_hiero/plugins/publish/collect_plates.py +++ b/client/ayon_hiero/plugins/publish/collect_plates.py @@ -49,11 +49,19 @@ def process(self, instance): # Retrieve instance data from parent instance shot instance. parent_instance_id = instance.data["parent_instance_id"] - edit_shared_data = instance.context.data["editorialSharedData"] - instance.data.update( - edit_shared_data[parent_instance_id] - ) + try: + edit_shared_data = instance.context.data["editorialSharedData"] + instance.data.update( + edit_shared_data[parent_instance_id] + ) + + # Ensure shot instance related to the audio instance exists. + except KeyError: + raise PublishError( + f'Could not find shot instance for {instance.data["label"]}.' + " Please ensure it is set and enabled." + ) track_item = instance.data["item"] clip_colorspace = track_item.sourceMediaColourTransform()