From fb8cfcb38bc4d7c12d08faf46f90b5ef3b7c16ad Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 17:57:57 +0100 Subject: [PATCH 01/19] small formatting changes --- .../publish/integrate_ftrack_instances.py | 65 ++++++++++--------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 93a07a9fae..911becb24f 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -1,54 +1,55 @@ -import pyblish.api -import json import os +import json +import pyblish.api class IntegrateFtrackInstance(pyblish.api.InstancePlugin): - """Collect ftrack component data + """Collect ftrack component data (not integrate yet). Add ftrack component list to instance. - - """ order = pyblish.api.IntegratorOrder + 0.48 - label = 'Integrate Ftrack Component' + label = "Integrate Ftrack Component" families = ["ftrack"] - family_mapping = {'camera': 'cam', - 'look': 'look', - 'mayaascii': 'scene', - 'model': 'geo', - 'rig': 'rig', - 'setdress': 'setdress', - 'pointcache': 'cache', - 'render': 'render', - 'render2d': 'render', - 'nukescript': 'comp', - 'write': 'render', - 'review': 'mov', - 'plate': 'img', - 'audio': 'audio', - 'workfile': 'scene', - 'animation': 'cache', - 'image': 'img', - 'reference': 'reference' - } + family_mapping = { + "camera": "cam", + "look": "look", + "mayaascii": "scene", + "model": "geo", + "rig": "rig", + "setdress": "setdress", + "pointcache": "cache", + "render": "render", + "render2d": "render", + "nukescript": "comp", + "write": "render", + "review": "mov", + "plate": "img", + "audio": "audio", + "workfile": "scene", + "animation": "cache", + "image": "img", + "reference": "reference" + } def process(self, instance): self.ftrack_locations = {} - self.log.debug('instance {}'.format(instance)) + self.log.debug("instance {}".format(instance)) - if instance.data.get('version'): - version_number = int(instance.data.get('version')) - else: + instance_version = instance.data.get("version") + if instance_version is None: raise ValueError("Instance version not set") - family = instance.data['family'].lower() + version_number = int(instance_version) + + family = instance.data["family"] + family_low = instance.data["family"].lower() asset_type = instance.data.get("ftrackFamily") - if not asset_type and family in self.family_mapping: - asset_type = self.family_mapping[family] + if not asset_type and family_low in self.family_mapping: + asset_type = self.family_mapping[family_low] # Ignore this instance if neither "ftrackFamily" or a family mapping is # found. From 4e26e9571f4b6edc3de19299a8c003c3190f0c0b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 17:58:39 +0100 Subject: [PATCH 02/19] validate existence of representations on instance --- .../plugins/publish/integrate_ftrack_instances.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 911becb24f..0200603115 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -54,6 +54,16 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Ignore this instance if neither "ftrackFamily" or a family mapping is # found. if not asset_type: + self.log.info(( + "Family \"{}\" does not match any asset type mapping" + ).format(family)) + return + + instance_repres = instance.data.get("representations") + if not instance_repres: + self.log.info(( + "Skipping instance. Does not have any representations {}" + ).format(str(instance))) return componentList = [] From 8e8d7486ca11b31c1c675510768ce3b6684c7899 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:00:02 +0100 Subject: [PATCH 03/19] create base of each component that will be created --- .../publish/integrate_ftrack_instances.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 0200603115..63098b3f93 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -66,6 +66,32 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): ).format(str(instance))) return + # Prepare FPS + instance_fps = instance.data.get("fps") + if instance_fps is None: + instance_fps = instance.context.data["fps"] + + # Base of component item data + # - create a copy of this object when want to use it + base_component_item = { + "assettype_data": { + "short": asset_type, + }, + "asset_data": { + "name": instance.data["subset"], + }, + "assetversion_data": { + "version": version_number, + "comment": instance.context.data.get("comment") or "" + }, + "component_overwrite": False, + # This can be change optionally + "thumbnail": False, + # These must be changed for each component + "component_data": None, + "component_path": None, + "component_location": None + } componentList = [] ft_session = instance.context.data["ftrackSession"] From aa867ac64a6f6455a9b0ea025c663a19f525381a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:00:59 +0100 Subject: [PATCH 04/19] split representations into 3 types --- .../publish/integrate_ftrack_instances.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 63098b3f93..230afb42a7 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -95,6 +95,22 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): componentList = [] ft_session = instance.context.data["ftrackSession"] + # Filter types of representations + review_representations = [] + thumbnail_representations = [] + other_representations = [] + for repre in instance_repres: + self.log.debug("Representation {}".format(repre)) + repre_tags = repre.get("tags") or [] + if repre.get("thumbnail") or "thumbnail" in repre_tags: + thumbnail_representations.append(repre) + + elif "ftrackreview" in repre_tags: + review_representations.append(repre) + + else: + other_representations.append(repre) + for comp in instance.data['representations']: self.log.debug('component {}'.format(comp)) From 677dbffcdbb607a562f13fb4ed1ae43ec7179f07 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:01:41 +0100 Subject: [PATCH 05/19] prequery ftrack locations --- .../ftrack/plugins/publish/integrate_ftrack_instances.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 230afb42a7..b397586d43 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -111,6 +111,14 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): else: other_representations.append(repre) + # Prepare ftrack locations + unmanaged_location = ft_session.query( + "Location where name is \"ftrack.unmanaged\"" + ).one() + ftrack_server_location = ft_session.query( + "Location where name is \"ftrack.server\"" + ).one() + for comp in instance.data['representations']: self.log.debug('component {}'.format(comp)) From 8d909c129024178e79b9a725abcc540deca94d7f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:03:33 +0100 Subject: [PATCH 06/19] renamed variable --- .../ftrack/plugins/publish/integrate_ftrack_instances.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index b397586d43..896bab4646 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -92,7 +92,7 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): "component_path": None, "component_location": None } - componentList = [] + ft_session = instance.context.data["ftrackSession"] # Filter types of representations @@ -119,6 +119,8 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): "Location where name is \"ftrack.server\"" ).one() + # Components data + component_list = [] for comp in instance.data['representations']: self.log.debug('component {}'.format(comp)) @@ -256,7 +258,7 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): componentList.append(component_item_src) self.log.debug('componentsList: {}'.format(str(componentList))) - instance.data["ftrackComponentsList"] = componentList + instance.data["ftrackComponentsList"] = component_list def get_ftrack_location(self, name, session): if name in self.ftrack_locations: From 7abf942682255c0dc72e42031b3ca895665c1554 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:04:01 +0100 Subject: [PATCH 07/19] removed whole previous code --- .../publish/integrate_ftrack_instances.py | 150 +----------------- 1 file changed, 2 insertions(+), 148 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 896bab4646..fa61fb8289 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -1,5 +1,6 @@ import os import json +import copy import pyblish.api @@ -35,7 +36,6 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): } def process(self, instance): - self.ftrack_locations = {} self.log.debug("instance {}".format(instance)) instance_version = instance.data.get("version") @@ -121,151 +121,5 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Components data component_list = [] - for comp in instance.data['representations']: - self.log.debug('component {}'.format(comp)) - - if comp.get('thumbnail') or ("thumbnail" in comp.get('tags', [])): - location = self.get_ftrack_location( - 'ftrack.server', ft_session - ) - component_data = { - "name": "thumbnail" # Default component name is "main". - } - comp['thumbnail'] = True - comp_files = comp["files"] - if isinstance(comp_files, (tuple, list, set)): - filename = comp_files[0] - else: - filename = comp_files - - comp['published_path'] = os.path.join( - comp['stagingDir'], filename - ) - - elif comp.get('ftrackreview') or ("ftrackreview" in comp.get('tags', [])): - ''' - Ftrack bug requirement: - - Start frame must be 0 - - End frame must be {duration} - EXAMPLE: When mov has 55 frames: - - Start frame should be 0 - - End frame should be 55 (do not ask why please!) - ''' - start_frame = 0 - end_frame = 1 - if 'frameEndFtrack' in comp and 'frameStartFtrack' in comp: - end_frame += ( - comp['frameEndFtrack'] - comp['frameStartFtrack'] - ) - else: - end_frame += ( - instance.data["frameEnd"] - instance.data["frameStart"] - ) - - fps = comp.get('fps') - if fps is None: - fps = instance.data.get( - "fps", instance.context.data['fps'] - ) - - comp['fps'] = fps - - location = self.get_ftrack_location( - 'ftrack.server', ft_session - ) - component_data = { - # Default component name is "main". - "name": "ftrackreview-mp4", - "metadata": {'ftr_meta': json.dumps({ - 'frameIn': int(start_frame), - 'frameOut': int(end_frame), - 'frameRate': float(comp['fps'])})} - } - comp['thumbnail'] = False - else: - component_data = { - "name": comp['name'] - } - location = self.get_ftrack_location( - 'ftrack.unmanaged', ft_session - ) - comp['thumbnail'] = False - - self.log.debug('location {}'.format(location)) - - component_item = { - "assettype_data": { - "short": asset_type, - }, - "asset_data": { - "name": instance.data["subset"], - }, - "assetversion_data": { - "version": version_number, - "comment": instance.context.data.get("comment", "") - }, - "component_data": component_data, - "component_path": comp['published_path'], - 'component_location': location, - "component_overwrite": False, - "thumbnail": comp['thumbnail'] - } - - # Add custom attributes for AssetVersion - assetversion_cust_attrs = {} - intent_val = instance.context.data.get("intent") - if intent_val and isinstance(intent_val, dict): - intent_val = intent_val.get("value") - - if intent_val: - assetversion_cust_attrs["intent"] = intent_val - - component_item["assetversion_data"]["custom_attributes"] = ( - assetversion_cust_attrs - ) - - componentList.append(component_item) - # Create copy with ftrack.unmanaged location if thumb or prev - if comp.get('thumbnail') or comp.get('preview') \ - or ("preview" in comp.get('tags', [])) \ - or ("review" in comp.get('tags', [])) \ - or ("thumbnail" in comp.get('tags', [])): - unmanaged_loc = self.get_ftrack_location( - 'ftrack.unmanaged', ft_session - ) - - component_data_src = component_data.copy() - name = component_data['name'] + '_src' - component_data_src['name'] = name - - component_item_src = { - "assettype_data": { - "short": asset_type, - }, - "asset_data": { - "name": instance.data["subset"], - }, - "assetversion_data": { - "version": version_number, - }, - "component_data": component_data_src, - "component_path": comp['published_path'], - 'component_location': unmanaged_loc, - "component_overwrite": False, - "thumbnail": False - } - - componentList.append(component_item_src) - - self.log.debug('componentsList: {}'.format(str(componentList))) + instance.data["ftrackComponentsList"] = component_list - - def get_ftrack_location(self, name, session): - if name in self.ftrack_locations: - return self.ftrack_locations[name] - - location = session.query( - 'Location where name is "{}"'.format(name) - ).one() - self.ftrack_locations[name] = location - return location From 9f98bc60da4b39a2c555c87ac36ea3199b71e70d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:04:26 +0100 Subject: [PATCH 08/19] log component list at the end --- .../plugins/publish/integrate_ftrack_instances.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index fa61fb8289..1b58a8c7a2 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -122,4 +122,16 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Components data component_list = [] + + def json_obj_parser(obj): + return str(obj) + + self.log.debug("Components list: {}".format( + json.dumps( + component_list, + sort_keys=True, + indent=4, + default=json_obj_parser + ) + )) instance.data["ftrackComponentsList"] = component_list From e24e3fb380640e638cb38d249c709bb4fbe37ae0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:04:46 +0100 Subject: [PATCH 09/19] create components from others --- .../plugins/publish/integrate_ftrack_instances.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 1b58a8c7a2..20febe12ff 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -123,6 +123,16 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): component_list = [] + # Add others representations as component + for repre in other_representations: + # Create copy of base comp item and append it + component_item = copy.deepcopy(base_component_item) + component_item["component_data"] = { + "name": repre["name"] + } + component_item["component_location"] = unmanaged_location + component_list.append(component_item) + def json_obj_parser(obj): return str(obj) From 938013d09b444f3152d2d79ca82748b6322e54c3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:05:29 +0100 Subject: [PATCH 10/19] create components from thumbnail representations --- .../publish/integrate_ftrack_instances.py | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 20febe12ff..b8b3efd306 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -123,6 +123,30 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): component_list = [] + # Create thumbnail components + # TODO what if there is multiple thumbnails? + for repre in thumbnail_representations: + if not repre.get("published_path"): + comp_files = repre["files"] + if isinstance(comp_files, (tuple, list, set)): + filename = comp_files[0] + else: + filename = comp_files + + repre["published_path"] = os.path.join( + repre["stagingDir"], filename + ) + + component_item["component_path"] = repre["published_path"] + component_item["component_data"] = { + "name": "thumbnail" + } + component_item["thumbnail"] = True + # Set location + component_item["component_location"] = ftrack_server_location + # Add item to component list + component_list.append(component_item) + # Add others representations as component for repre in other_representations: # Create copy of base comp item and append it From 4d385efab6a61033cbbe907e0748054426cbde48 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:07:27 +0100 Subject: [PATCH 11/19] create components from review representations --- .../publish/integrate_ftrack_instances.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index b8b3efd306..4277d6f0f1 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -122,6 +122,51 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Components data component_list = [] + # Create review components + # Change asset name of each new component for review + first_review_repre = True + for repre in review_representations: + frame_start = repre.get("frameStartFtrack") + frame_end = repre.get("frameEndFtrack") + if frame_start is None or frame_end is None: + frame_start = instance.data["frameStart"] + frame_end = instance.data["frameEnd"] + + # Frame end of uploaded video file should be duration in frames + # - frame start is always 0 + # - frame end is duration in frames + duration = frame_end - frame_start + 1 + + fps = repre.get("fps") + if fps is None: + fps = instance_fps + + # Create copy of base comp item and append it + component_item = copy.deepcopy(base_component_item) + # Change location + component_item["component_path"] = repre["published_path"] + # Change component data + component_item["component_data"] = { + # Default component name is "main". + "name": "ftrackreview-mp4", + "metadata": { + "ftr_meta": json.dumps({ + "frameIn": 0, + "frameOut": int(duration), + "frameRate": float(fps) + }) + } + } + if first_review_repre: + first_review_repre = False + else: + # Add representation name to asset name of "not first" review + component_item["asset_data"]["name"] += repre["name"].title() + + # Set location + component_item["component_location"] = ftrack_server_location + # Add item to component list + component_list.append(component_item) # Create thumbnail components # TODO what if there is multiple thumbnails? From 6ca870870b30d4112bb1bc90bcef9abb7f47f6d4 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:08:02 +0100 Subject: [PATCH 12/19] create also components of source files for review and thumbnail --- .../publish/integrate_ftrack_instances.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 4277d6f0f1..8201372be0 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -121,7 +121,9 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Components data component_list = [] - + # Components that will be duplicated to unmanaged location + src_components_to_add = [] + # Create review components # Change asset name of each new component for review first_review_repre = True @@ -163,6 +165,10 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Add representation name to asset name of "not first" review component_item["asset_data"]["name"] += repre["name"].title() + # Create copy of item before setting location + src_components_to_add.append( + (repre, copy.deepcopy(component_item)) + ) # Set location component_item["component_location"] = ftrack_server_location # Add item to component list @@ -187,11 +193,27 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): "name": "thumbnail" } component_item["thumbnail"] = True + # Create copy of item before setting location + src_components_to_add.append( + (repre, copy.deepcopy(component_item)) + ) # Set location component_item["component_location"] = ftrack_server_location # Add item to component list component_list.append(component_item) + # Add source components for review and thubmnail components + for repre, component_item in src_components_to_add: + # Make sure thumbnail is disabled + component_item["thumbnail"] = False + # Set location + component_item["component_location"] = unmanaged_location + # Modify name of component to have suffix "_src" + component_data = component_item["component_data"] + component_name = component_data["name"] + component_data["name"] = component_name + "_src" + component_list.append(component_item) + # Add others representations as component for repre in other_representations: # Create copy of base comp item and append it From 4e3aa90cf07c2ccf9ee9a1e0cffc704cea124df2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:15:22 +0100 Subject: [PATCH 13/19] fix thumbnail component creation --- .../ftrack/plugins/publish/integrate_ftrack_instances.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 8201372be0..f70e81e8c9 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -188,6 +188,8 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): repre["stagingDir"], filename ) + # Create copy of base comp item and append it + component_item = copy.deepcopy(base_component_item) component_item["component_path"] = repre["published_path"] component_item["component_data"] = { "name": "thumbnail" From 695a8da239f4718bac9b5bdce4516555acb264da Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:16:39 +0100 Subject: [PATCH 14/19] renamed variables to avoid reusage of same variable name --- .../publish/integrate_ftrack_instances.py | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index f70e81e8c9..0ae750a530 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -144,11 +144,11 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): fps = instance_fps # Create copy of base comp item and append it - component_item = copy.deepcopy(base_component_item) + review_item = copy.deepcopy(base_component_item) # Change location - component_item["component_path"] = repre["published_path"] + review_item["component_path"] = repre["published_path"] # Change component data - component_item["component_data"] = { + review_item["component_data"] = { # Default component name is "main". "name": "ftrackreview-mp4", "metadata": { @@ -163,16 +163,16 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): first_review_repre = False else: # Add representation name to asset name of "not first" review - component_item["asset_data"]["name"] += repre["name"].title() + review_item["asset_data"]["name"] += repre["name"].title() # Create copy of item before setting location src_components_to_add.append( - (repre, copy.deepcopy(component_item)) + (repre, copy.deepcopy(review_item)) ) # Set location - component_item["component_location"] = ftrack_server_location + review_item["component_location"] = ftrack_server_location # Add item to component list - component_list.append(component_item) + component_list.append(review_item) # Create thumbnail components # TODO what if there is multiple thumbnails? @@ -189,42 +189,42 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): ) # Create copy of base comp item and append it - component_item = copy.deepcopy(base_component_item) - component_item["component_path"] = repre["published_path"] - component_item["component_data"] = { + thumbnail_item = copy.deepcopy(base_component_item) + thumbnail_item["component_path"] = repre["published_path"] + thumbnail_item["component_data"] = { "name": "thumbnail" } - component_item["thumbnail"] = True + thumbnail_item["thumbnail"] = True # Create copy of item before setting location src_components_to_add.append( - (repre, copy.deepcopy(component_item)) + (repre, copy.deepcopy(thumbnail_item)) ) # Set location - component_item["component_location"] = ftrack_server_location + thumbnail_item["component_location"] = ftrack_server_location # Add item to component list - component_list.append(component_item) + component_list.append(thumbnail_item) # Add source components for review and thubmnail components - for repre, component_item in src_components_to_add: + for repre, copy_src_item in src_components_to_add: # Make sure thumbnail is disabled - component_item["thumbnail"] = False + copy_src_item["thumbnail"] = False # Set location - component_item["component_location"] = unmanaged_location + copy_src_item["component_location"] = unmanaged_location # Modify name of component to have suffix "_src" - component_data = component_item["component_data"] + component_data = copy_src_item["component_data"] component_name = component_data["name"] component_data["name"] = component_name + "_src" - component_list.append(component_item) + component_list.append(copy_src_item) # Add others representations as component for repre in other_representations: # Create copy of base comp item and append it - component_item = copy.deepcopy(base_component_item) - component_item["component_data"] = { + other_item = copy.deepcopy(base_component_item) + other_item["component_data"] = { "name": repre["name"] } - component_item["component_location"] = unmanaged_location - component_list.append(component_item) + other_item["component_location"] = unmanaged_location + component_list.append(other_item) def json_obj_parser(obj): return str(obj) From 0fa2ea67bc791be4b3953c8c3141d41ece93b739 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:26:07 +0100 Subject: [PATCH 15/19] moved copy creation of review component --- .../ftrack/plugins/publish/integrate_ftrack_instances.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 0ae750a530..5028c4c464 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -159,16 +159,16 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): }) } } + # Create copy of item before setting location or changing asset + src_components_to_add.append( + (repre, copy.deepcopy(review_item)) + ) if first_review_repre: first_review_repre = False else: # Add representation name to asset name of "not first" review review_item["asset_data"]["name"] += repre["name"].title() - # Create copy of item before setting location - src_components_to_add.append( - (repre, copy.deepcopy(review_item)) - ) # Set location review_item["component_location"] = ftrack_server_location # Add item to component list From c11d9a3951cc3a1a5298e829b58c3e91b021c04c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Nov 2021 18:34:58 +0100 Subject: [PATCH 16/19] do not add repre to src_components_to_add as is not used --- .../plugins/publish/integrate_ftrack_instances.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 5028c4c464..3e29ae0759 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -160,9 +160,7 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): } } # Create copy of item before setting location or changing asset - src_components_to_add.append( - (repre, copy.deepcopy(review_item)) - ) + src_components_to_add.append(copy.deepcopy(review_item)) if first_review_repre: first_review_repre = False else: @@ -196,16 +194,14 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): } thumbnail_item["thumbnail"] = True # Create copy of item before setting location - src_components_to_add.append( - (repre, copy.deepcopy(thumbnail_item)) - ) + src_components_to_add.append(copy.deepcopy(thumbnail_item)) # Set location thumbnail_item["component_location"] = ftrack_server_location # Add item to component list component_list.append(thumbnail_item) # Add source components for review and thubmnail components - for repre, copy_src_item in src_components_to_add: + for copy_src_item in src_components_to_add: # Make sure thumbnail is disabled copy_src_item["thumbnail"] = False # Set location From 629d7f684b1663ffb55905b90495f91ef56ab469 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 19 Nov 2021 13:06:17 +0100 Subject: [PATCH 17/19] use underscore as separator between asset name and repre --- .../ftrack/plugins/publish/integrate_ftrack_instances.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index 3e29ae0759..fb3ccf1328 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -165,7 +165,10 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): first_review_repre = False else: # Add representation name to asset name of "not first" review - review_item["asset_data"]["name"] += repre["name"].title() + asset_name = review_item["asset_data"]["name"] + review_item["asset_data"]["name"] = "_".join( + (asset_name, repre["name"]) + ) # Set location review_item["component_location"] = ftrack_server_location From 77945a386483ac9d3a98297573e2e62deaccecf6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 19 Nov 2021 13:06:34 +0100 Subject: [PATCH 18/19] fixed component path of unmanager files --- .../plugins/publish/integrate_ftrack_instances.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index fb3ccf1328..fb98176d98 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -178,16 +178,20 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Create thumbnail components # TODO what if there is multiple thumbnails? for repre in thumbnail_representations: - if not repre.get("published_path"): + published_path = repre.get("published_path") + if not published_path: comp_files = repre["files"] if isinstance(comp_files, (tuple, list, set)): filename = comp_files[0] else: filename = comp_files - repre["published_path"] = os.path.join( + published_path = os.path.join( repre["stagingDir"], filename ) + if not os.path.exists(published_path): + continue + repre["published_path"] = published_path # Create copy of base comp item and append it thumbnail_item = copy.deepcopy(base_component_item) @@ -217,12 +221,16 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Add others representations as component for repre in other_representations: + published_path = repre.get("published_path") + if not published_path: + continue # Create copy of base comp item and append it other_item = copy.deepcopy(base_component_item) other_item["component_data"] = { "name": repre["name"] } other_item["component_location"] = unmanaged_location + other_item["component_path"] = published_path component_list.append(other_item) def json_obj_parser(obj): From 47093dbc9f125b90255893bd3f2a5b1a1e703079 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 19 Nov 2021 14:24:28 +0100 Subject: [PATCH 19/19] duplicate thumbnail component for all reviews --- .../publish/integrate_ftrack_instances.py | 85 ++++++++++++------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py index fb98176d98..8399e19184 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/integrate_ftrack_instances.py @@ -124,9 +124,46 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): # Components that will be duplicated to unmanaged location src_components_to_add = [] + # Create thumbnail components + # TODO what if there is multiple thumbnails? + first_thumbnail_component = None + for repre in thumbnail_representations: + published_path = repre.get("published_path") + if not published_path: + comp_files = repre["files"] + if isinstance(comp_files, (tuple, list, set)): + filename = comp_files[0] + else: + filename = comp_files + + published_path = os.path.join( + repre["stagingDir"], filename + ) + if not os.path.exists(published_path): + continue + repre["published_path"] = published_path + + # Create copy of base comp item and append it + thumbnail_item = copy.deepcopy(base_component_item) + thumbnail_item["component_path"] = repre["published_path"] + thumbnail_item["component_data"] = { + "name": "thumbnail" + } + thumbnail_item["thumbnail"] = True + # Create copy of item before setting location + src_components_to_add.append(copy.deepcopy(thumbnail_item)) + # Create copy of first thumbnail + if first_thumbnail_component is None: + first_thumbnail_component = copy.deepcopy(thumbnail_item) + # Set location + thumbnail_item["component_location"] = ftrack_server_location + # Add item to component list + component_list.append(thumbnail_item) + # Create review components # Change asset name of each new component for review - first_review_repre = True + is_first_review_repre = True + not_first_components = [] for repre in review_representations: frame_start = repre.get("frameStartFtrack") frame_end = repre.get("frameEndFtrack") @@ -161,51 +198,33 @@ class IntegrateFtrackInstance(pyblish.api.InstancePlugin): } # Create copy of item before setting location or changing asset src_components_to_add.append(copy.deepcopy(review_item)) - if first_review_repre: - first_review_repre = False + if is_first_review_repre: + is_first_review_repre = False else: # Add representation name to asset name of "not first" review asset_name = review_item["asset_data"]["name"] review_item["asset_data"]["name"] = "_".join( (asset_name, repre["name"]) ) + not_first_components.append(review_item) # Set location review_item["component_location"] = ftrack_server_location # Add item to component list component_list.append(review_item) - # Create thumbnail components - # TODO what if there is multiple thumbnails? - for repre in thumbnail_representations: - published_path = repre.get("published_path") - if not published_path: - comp_files = repre["files"] - if isinstance(comp_files, (tuple, list, set)): - filename = comp_files[0] - else: - filename = comp_files - - published_path = os.path.join( - repre["stagingDir"], filename + # Duplicate thumbnail component for all not first reviews + if first_thumbnail_component is not None: + for component_item in not_first_components: + asset_name = component_item["asset_data"]["name"] + new_thumbnail_component = copy.deepcopy( + first_thumbnail_component ) - if not os.path.exists(published_path): - continue - repre["published_path"] = published_path - - # Create copy of base comp item and append it - thumbnail_item = copy.deepcopy(base_component_item) - thumbnail_item["component_path"] = repre["published_path"] - thumbnail_item["component_data"] = { - "name": "thumbnail" - } - thumbnail_item["thumbnail"] = True - # Create copy of item before setting location - src_components_to_add.append(copy.deepcopy(thumbnail_item)) - # Set location - thumbnail_item["component_location"] = ftrack_server_location - # Add item to component list - component_list.append(thumbnail_item) + new_thumbnail_component["asset_data"]["name"] = asset_name + new_thumbnail_component["component_location"] = ( + ftrack_server_location + ) + component_list.append(new_thumbnail_component) # Add source components for review and thubmnail components for copy_src_item in src_components_to_add: