From bf848cddfd0b20f8721cb2cfc6c111fd50fa7df5 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 13 Feb 2024 10:29:55 +0000 Subject: [PATCH 001/216] Add OTIO export action --- client/ayon_core/pipeline/editorial.py | 29 +++ client/ayon_core/plugins/load/export_otio.py | 187 +++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 client/ayon_core/plugins/load/export_otio.py diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 564d78ea6f..413114b6a6 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -281,3 +281,32 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): returning_dict.update(version_data) return returning_dict + + +def create_clip(path, name, frames, framerate): + range = otio.opentime.TimeRange( + start_time=otio.opentime.RationalTime(0, framerate), + duration=otio.opentime.RationalTime(frames, framerate) + ) + + media_reference = otio.schema.ExternalReference( + available_range=range, + target_url=f"file://{path}" + ) + + return otio.schema.Clip( + name=name, + media_reference=media_reference, + source_range=range + ) + + +def export_otio(clips_data, output_path): + clips = [] + for name, data in clips_data.items(): + clips.append( + create_clip(data["path"], name, data["frames"], data["framerate"]) + ) + + timeline = otio.schema.timeline_from_clips(clips) + otio.adapters.write_to_file(timeline, output_path) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py new file mode 100644 index 0000000000..87b2cf71d3 --- /dev/null +++ b/client/ayon_core/plugins/load/export_otio.py @@ -0,0 +1,187 @@ +from collections import defaultdict + +from qtpy import QtWidgets, QtCore, QtGui + +from ayon_core.client import ( + get_representations, + get_version_by_id +) +from ayon_core.pipeline import load, Anatomy +from ayon_core import resources, style +from ayon_core.pipeline.editorial import export_otio +from ayon_core.pipeline.load import get_representation_path_with_anatomy +from ayon_core.lib import run_subprocess + + +class ExportOTIO(load.SubsetLoaderPlugin): + """Export selected versions to OpenTimelineIO.""" + + is_multiple_contexts_compatible = True + sequence_splitter = "__sequence_splitter__" + + representations = ["*"] + families = ["*"] + tool_names = ["library_loader"] + + label = "Export OTIO" + order = 35 + icon = "save" + color = "#d8d8d8" + + def load(self, contexts, name=None, namespace=None, options=None): + try: + dialog = ExportOTIOOptionsDialog(contexts, self.log) + dialog.exec_() + except Exception: + self.log.error("Failed to export OTIO.", exc_info=True) + + +class ExportOTIOOptionsDialog(QtWidgets.QDialog): + """Dialog to select template where to deliver selected representations.""" + + def __init__(self, contexts, log=None, parent=None): + super(ExportOTIOOptionsDialog, self).__init__(parent=parent) + + self.setWindowTitle("AYON - Export OTIO") + icon = QtGui.QIcon(resources.get_ayon_icon_filepath()) + self.setWindowIcon(icon) + + self.setWindowFlags( + QtCore.Qt.WindowStaysOnTopHint + | QtCore.Qt.WindowCloseButtonHint + | QtCore.Qt.WindowMinimizeButtonHint + ) + + self.setStyleSheet(style.load_stylesheet()) + + input_widget = QtWidgets.QWidget(self) + input_layout = QtWidgets.QGridLayout(input_widget) + + self._project_name = contexts[0]["project"]["name"] + + representations_by_version_id = defaultdict(list) + self._version_by_representation_id = {} + all_representation_names = set() + self._version_path_by_id = {} + for context in contexts: + version_id = context["version"]["_id"] + version = get_version_by_id(self._project_name, version_id) + representations = list(get_representations( + self._project_name, version_ids=[version_id] + )) + representations_by_version_id[version_id] = representations + + for representation in representations: + all_representation_names.add(representation["name"]) + id = representation["_id"] + self._version_by_representation_id[id] = version + + self._version_path_by_id[version_id] = "{}/{}/{}/v{:03d}".format( + representations[0]["context"]["hierarchy"], + representations[0]["context"]["asset"], + representations[0]["context"]["subset"], + representations[0]["context"]["version"] + ) + + all_representation_names = sorted(all_representation_names) + + input_layout.addWidget(QtWidgets.QLabel("Representations:"), 0, 0) + toggle_all_checkboxes = {} + for count, name in enumerate(all_representation_names): + checkbox = QtWidgets.QCheckBox(name) + input_layout.addWidget( + checkbox, + 0, + count + 1, + alignment=QtCore.Qt.AlignCenter + ) + toggle_all_checkboxes[name] = checkbox + checkbox.stateChanged.connect(self.toggle_all) + + self._representation_checkboxes = defaultdict(list) + row = 1 + items = representations_by_version_id.items() + for version_id, representations in items: + version_path = self._version_path_by_id[version_id] + input_layout.addWidget(QtWidgets.QLabel(version_path), row, 0) + + representations_by_name = {x["name"]: x for x in representations} + for count, name in enumerate(all_representation_names): + checkbox = QtWidgets.QCheckBox() + checkbox.setChecked(False) + if name in representations_by_name.keys(): + self._representation_checkboxes[name].append( + { + "checkbox": checkbox, + "representation": representations_by_name[name] + } + ) + else: + checkbox.setEnabled(False) + + input_layout.addWidget( + checkbox, row, count + 1, alignment=QtCore.Qt.AlignCenter + ) + + row += 1 + + export_widget = QtWidgets.QWidget() + export_layout = QtWidgets.QVBoxLayout(export_widget) + + widget = QtWidgets.QWidget() + layout = QtWidgets.QHBoxLayout(widget) + layout.addWidget(QtWidgets.QLabel("Output Path:")) + self.lineedit_output_path = QtWidgets.QLineEdit() + layout.addWidget(self.lineedit_output_path) + export_layout.addWidget(widget) + + self.checkbox_inspect_otio_view = QtWidgets.QCheckBox( + "Inspect with OTIO view" + ) + export_layout.addWidget(self.checkbox_inspect_otio_view) + + self.btn_export = QtWidgets.QPushButton("Export") + export_layout.addWidget(self.btn_export) + + layout = QtWidgets.QVBoxLayout(self) + layout.addWidget(input_widget) + layout.addWidget(export_widget) + + self.btn_export.clicked.connect(self.export) + + def toggle_all(self, state): + representation_name = self.sender().text() + state = self.sender().checkState() + for item in self._representation_checkboxes[representation_name]: + item["checkbox"].setCheckState(state) + + def export(self): + representations = [] + for name, items in self._representation_checkboxes.items(): + for item in items: + check_state = item["checkbox"].checkState() + if check_state == QtCore.Qt.CheckState.Checked: + representations.append(item["representation"]) + + anatomy = Anatomy(self._project_name) + clips_data = {} + for representation in representations: + version = self._version_by_representation_id[representation["_id"]] + name = self._version_path_by_id[version["_id"]] + clips_data[name] = { + "path": get_representation_path_with_anatomy( + representation, anatomy + ), + "frames": ( + version["data"]["frameEnd"] - + version["data"]["frameStart"] + ), + "framerate": version["data"]["fps"] + } + + output_path = self.lineedit_output_path.text() + export_otio(clips_data, output_path) + + check_state = self.checkbox_inspect_otio_view.checkState() + if check_state == QtCore.Qt.CheckState.Checked: + run_subprocess(["otioview", output_path]) From ddabfebac6605d8f27d35453005eefb59fedff6e Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 13 Feb 2024 12:07:16 +0000 Subject: [PATCH 002/216] Update client/ayon_core/plugins/load/export_otio.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/load/export_otio.py | 30 ++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 87b2cf71d3..939aecd18b 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -63,12 +63,32 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self._version_by_representation_id = {} all_representation_names = set() self._version_path_by_id = {} + version_docs_by_id = { + context["version"]["_id"]: context["version"] + for context in contexts + } + repre_docs = list(get_representations( + self._project_name, version_ids=set(version_docs_by_id) + )) + repre_docs_by_id = { + repre_doc["_id"]: repre_doc + for repre_doc in repre_docs + } + self._version_by_representation_id = { + repre_doc["_id"]: version_docs_by_id[repre_doc["parent"]] + for repre_doc in repre_docs + } + self._version_path_by_id = {} for context in contexts: - version_id = context["version"]["_id"] - version = get_version_by_id(self._project_name, version_id) - representations = list(get_representations( - self._project_name, version_ids=[version_id] - )) + version_doc = context["version"] + version_id = version_doc["_id"] + if version_id in self._version_path_by_id: + continue + asset_doc = context["asset"] + folder_path = get_asset_name_identifier(asset_doc) + subset_name = context["subset"]["name"] + self._version_path_by_id[version_id] = "{}/{}/{}/v{:03d}".format( + folder_path, subset_name, version_doc["name"] representations_by_version_id[version_id] = representations for representation in representations: From 0fdb036d7ddc6a05adc1b01e58cab8b3f13769b4 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 13 Feb 2024 12:12:35 +0000 Subject: [PATCH 003/216] Move otio code from lib and account for import --- client/ayon_core/pipeline/editorial.py | 29 ---------------- client/ayon_core/plugins/load/export_otio.py | 36 ++++++++++++++++++-- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 413114b6a6..564d78ea6f 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -281,32 +281,3 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): returning_dict.update(version_data) return returning_dict - - -def create_clip(path, name, frames, framerate): - range = otio.opentime.TimeRange( - start_time=otio.opentime.RationalTime(0, framerate), - duration=otio.opentime.RationalTime(frames, framerate) - ) - - media_reference = otio.schema.ExternalReference( - available_range=range, - target_url=f"file://{path}" - ) - - return otio.schema.Clip( - name=name, - media_reference=media_reference, - source_range=range - ) - - -def export_otio(clips_data, output_path): - clips = [] - for name, data in clips_data.items(): - clips.append( - create_clip(data["path"], name, data["frames"], data["framerate"]) - ) - - timeline = otio.schema.timeline_from_clips(clips) - otio.adapters.write_to_file(timeline, output_path) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 87b2cf71d3..b90483c929 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -8,7 +8,6 @@ from ayon_core.client import ( ) from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style -from ayon_core.pipeline.editorial import export_otio from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.lib import run_subprocess @@ -40,6 +39,10 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): """Dialog to select template where to deliver selected representations.""" def __init__(self, contexts, log=None, parent=None): + # Not all hosts have OpenTimelineIO available. + import opentimelineio as otio + self.otio = otio + super(ExportOTIOOptionsDialog, self).__init__(parent=parent) self.setWindowTitle("AYON - Export OTIO") @@ -180,8 +183,37 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): } output_path = self.lineedit_output_path.text() - export_otio(clips_data, output_path) + self.export_otio(clips_data, output_path) check_state = self.checkbox_inspect_otio_view.checkState() if check_state == QtCore.Qt.CheckState.Checked: run_subprocess(["otioview", output_path]) + + def create_clip(self, path, name, frames, framerate): + range = self.otio.opentime.TimeRange( + start_time=self.otio.opentime.RationalTime(0, framerate), + duration=self.otio.opentime.RationalTime(frames, framerate) + ) + + media_reference = self.otio.schema.ExternalReference( + available_range=range, + target_url=f"file://{path}" + ) + + return self.otio.schema.Clip( + name=name, + media_reference=media_reference, + source_range=range + ) + + def export_otio(self, clips_data, output_path): + clips = [] + for name, data in clips_data.items(): + clips.append( + self.create_clip( + data["path"], name, data["frames"], data["framerate"] + ) + ) + + timeline = self.otio.schema.timeline_from_clips(clips) + self.otio.adapters.write_to_file(timeline, output_path) From afa243478340ddfde48cd51c3aff4fc853e519ef Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 13 Feb 2024 12:32:53 +0000 Subject: [PATCH 004/216] Fix suggestion --- client/ayon_core/plugins/load/export_otio.py | 29 ++++++-------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index ef081532b2..e728390d9d 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -4,7 +4,7 @@ from qtpy import QtWidgets, QtCore, QtGui from ayon_core.client import ( get_representations, - get_version_by_id + get_asset_name_identifier ) from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style @@ -62,7 +62,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self._project_name = contexts[0]["project"]["name"] - representations_by_version_id = defaultdict(list) self._version_by_representation_id = {} all_representation_names = set() self._version_path_by_id = {} @@ -73,10 +72,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): repre_docs = list(get_representations( self._project_name, version_ids=set(version_docs_by_id) )) - repre_docs_by_id = { - repre_doc["_id"]: repre_doc - for repre_doc in repre_docs - } self._version_by_representation_id = { repre_doc["_id"]: version_docs_by_id[repre_doc["parent"]] for repre_doc in repre_docs @@ -90,23 +85,17 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): asset_doc = context["asset"] folder_path = get_asset_name_identifier(asset_doc) subset_name = context["subset"]["name"] - self._version_path_by_id[version_id] = "{}/{}/{}/v{:03d}".format( + self._version_path_by_id[version_id] = "{}/{}/v{:03d}".format( folder_path, subset_name, version_doc["name"] - representations_by_version_id[version_id] = representations - - for representation in representations: - all_representation_names.add(representation["name"]) - id = representation["_id"] - self._version_by_representation_id[id] = version - - self._version_path_by_id[version_id] = "{}/{}/{}/v{:03d}".format( - representations[0]["context"]["hierarchy"], - representations[0]["context"]["asset"], - representations[0]["context"]["subset"], - representations[0]["context"]["version"] ) - all_representation_names = sorted(all_representation_names) + representations_by_version_id = defaultdict(list) + for repre_doc in repre_docs: + representations_by_version_id[repre_doc["parent"]].append( + repre_doc + ) + + all_representation_names = sorted(set(x["name"] for x in repre_docs)) input_layout.addWidget(QtWidgets.QLabel("Representations:"), 0, 0) toggle_all_checkboxes = {} From ea4480769c39bff6c1531e05bd7de2c70176f85d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 13 Feb 2024 15:28:20 +0000 Subject: [PATCH 005/216] Use radio buttons and buttons for toggle all --- client/ayon_core/plugins/load/export_otio.py | 47 +++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index e728390d9d..3192ac85a9 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -98,19 +98,17 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): all_representation_names = sorted(set(x["name"] for x in repre_docs)) input_layout.addWidget(QtWidgets.QLabel("Representations:"), 0, 0) - toggle_all_checkboxes = {} for count, name in enumerate(all_representation_names): - checkbox = QtWidgets.QCheckBox(name) + widget = QtWidgets.QPushButton(name) input_layout.addWidget( - checkbox, + widget, 0, count + 1, alignment=QtCore.Qt.AlignCenter ) - toggle_all_checkboxes[name] = checkbox - checkbox.stateChanged.connect(self.toggle_all) + widget.clicked.connect(self.toggle_all) - self._representation_checkboxes = defaultdict(list) + self._representation_widgets = defaultdict(list) row = 1 items = representations_by_version_id.items() for version_id, representations in items: @@ -118,22 +116,26 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): input_layout.addWidget(QtWidgets.QLabel(version_path), row, 0) representations_by_name = {x["name"]: x for x in representations} + group_box = QtWidgets.QGroupBox() + layout = QtWidgets.QHBoxLayout() + group_box.setLayout(layout) for count, name in enumerate(all_representation_names): - checkbox = QtWidgets.QCheckBox() - checkbox.setChecked(False) if name in representations_by_name.keys(): - self._representation_checkboxes[name].append( + widget = QtWidgets.QRadioButton() + self._representation_widgets[name].append( { - "checkbox": checkbox, + "widget": widget, "representation": representations_by_name[name] } ) else: - checkbox.setEnabled(False) + widget = QtWidgets.QLabel("x") - input_layout.addWidget( - checkbox, row, count + 1, alignment=QtCore.Qt.AlignCenter - ) + layout.addWidget(widget) + + input_layout.addWidget( + group_box, row, 1, 1, len(all_representation_names) + ) row += 1 @@ -161,25 +163,26 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self.btn_export.clicked.connect(self.export) - def toggle_all(self, state): + def toggle_all(self): representation_name = self.sender().text() - state = self.sender().checkState() - for item in self._representation_checkboxes[representation_name]: - item["checkbox"].setCheckState(state) + for item in self._representation_widgets[representation_name]: + item["widget"].setChecked(True) def export(self): representations = [] - for name, items in self._representation_checkboxes.items(): + for name, items in self._representation_widgets.items(): for item in items: - check_state = item["checkbox"].checkState() - if check_state == QtCore.Qt.CheckState.Checked: + if item["widget"].isChecked(): representations.append(item["representation"]) anatomy = Anatomy(self._project_name) clips_data = {} for representation in representations: version = self._version_by_representation_id[representation["_id"]] - name = self._version_path_by_id[version["_id"]] + name = "{}/{}".format( + self._version_path_by_id[version["_id"]], + representation["name"] + ) clips_data[name] = { "path": get_representation_path_with_anatomy( representation, anatomy From be78606e113cf9058b89f84657914e3a752c1b0a Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 13 Feb 2024 16:58:19 +0000 Subject: [PATCH 006/216] Jakub suggestions - validate output path with user feedback - easier path input with file browser - detach otio view process - feedback about successfull export --- client/ayon_core/plugins/load/export_otio.py | 63 +++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 3192ac85a9..c8801f4411 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -9,7 +9,8 @@ from ayon_core.client import ( from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style from ayon_core.pipeline.load import get_representation_path_with_anatomy -from ayon_core.lib import run_subprocess +from ayon_core.lib import run_detached_process +from ayon_core.tools.utils import show_message_dialog class ExportOTIO(load.SubsetLoaderPlugin): @@ -144,7 +145,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): widget = QtWidgets.QWidget() layout = QtWidgets.QHBoxLayout(widget) - layout.addWidget(QtWidgets.QLabel("Output Path:")) + self.button_output_path = QtWidgets.QPushButton("Output Path:") + layout.addWidget(self.button_output_path) self.lineedit_output_path = QtWidgets.QLineEdit() layout.addWidget(self.lineedit_output_path) export_layout.addWidget(widget) @@ -154,21 +156,59 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): ) export_layout.addWidget(self.checkbox_inspect_otio_view) - self.btn_export = QtWidgets.QPushButton("Export") - export_layout.addWidget(self.btn_export) + self.button_export = QtWidgets.QPushButton("Export") + export_layout.addWidget(self.button_export) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(input_widget) layout.addWidget(export_widget) - self.btn_export.clicked.connect(self.export) + self.button_export.clicked.connect(self.export) + self.button_output_path.clicked.connect(self.set_output_path) def toggle_all(self): representation_name = self.sender().text() for item in self._representation_widgets[representation_name]: item["widget"].setChecked(True) + def set_output_path(self): + file_dialog = QtWidgets.QFileDialog() + file_dialog.setNameFilter("OTIO Files (*.otio)") + file_dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile) + if file_dialog.exec_(): + selected_files = file_dialog.selectedFiles() + output_path = selected_files[0] if selected_files else None + if output_path: + self.lineedit_output_path.setText(output_path) + def export(self): + output_path = self.lineedit_output_path.text() + + # Validate output path is not empty. + if not output_path: + show_message_dialog( + "Missing output path", + ( + "Output path is empty. Please enter a path to export the " + "OTIO file to." + ), + level="critical", + parent=self + ) + return + + # Validate output path ends with .otio. + if not output_path.endswith(".otio"): + show_message_dialog( + "Wrong extension.", + ( + "Output path needs to end with .otio." + ), + level="critical", + parent=self + ) + return + representations = [] for name, items in self._representation_widgets.items(): for item in items: @@ -194,12 +234,21 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): "framerate": version["data"]["fps"] } - output_path = self.lineedit_output_path.text() self.export_otio(clips_data, output_path) check_state = self.checkbox_inspect_otio_view.checkState() if check_state == QtCore.Qt.CheckState.Checked: - run_subprocess(["otioview", output_path]) + run_detached_process(["otioview", output_path]) + + # Feedback about success. + show_message_dialog( + "Success!", + "Export was successfull.", + level="info", + parent=self + ) + + self.close() def create_clip(self, path, name, frames, framerate): range = self.otio.opentime.TimeRange( From 033666afa95948874c53c624b855fcbe4760e1fd Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 14 Mar 2024 12:17:06 +0000 Subject: [PATCH 007/216] Fix output path button. --- client/ayon_core/plugins/load/export_otio.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index c8801f4411..bbdcf27e8c 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -172,14 +172,11 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): item["widget"].setChecked(True) def set_output_path(self): - file_dialog = QtWidgets.QFileDialog() - file_dialog.setNameFilter("OTIO Files (*.otio)") - file_dialog.setFileMode(QtWidgets.QFileDialog.ExistingFile) - if file_dialog.exec_(): - selected_files = file_dialog.selectedFiles() - output_path = selected_files[0] if selected_files else None - if output_path: - self.lineedit_output_path.setText(output_path) + file_path, _ = QtWidgets.QFileDialog.getSaveFileName( + None, "Save OTIO file.", "", "OTIO Files (*.otio)" + ) + if file_path: + self.lineedit_output_path.setText(file_path) def export(self): output_path = self.lineedit_output_path.text() From 97decd748db1ba9955edf375cda6ac9e7e848a7d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 14 Mar 2024 12:17:14 +0000 Subject: [PATCH 008/216] Code cosmetics --- client/ayon_core/plugins/load/export_otio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index bbdcf27e8c..258a0130a5 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -199,7 +199,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): show_message_dialog( "Wrong extension.", ( - "Output path needs to end with .otio." + "Output path needs to end with \".otio\"." ), level="critical", parent=self From 3c5b26a08b0cfeda761718c3995e699a6e5f9756 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 14 Mar 2024 12:17:31 +0000 Subject: [PATCH 009/216] Remove otioview functionality --- client/ayon_core/plugins/load/export_otio.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 258a0130a5..86b541633a 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -9,7 +9,6 @@ from ayon_core.client import ( from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style from ayon_core.pipeline.load import get_representation_path_with_anatomy -from ayon_core.lib import run_detached_process from ayon_core.tools.utils import show_message_dialog @@ -151,11 +150,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): layout.addWidget(self.lineedit_output_path) export_layout.addWidget(widget) - self.checkbox_inspect_otio_view = QtWidgets.QCheckBox( - "Inspect with OTIO view" - ) - export_layout.addWidget(self.checkbox_inspect_otio_view) - self.button_export = QtWidgets.QPushButton("Export") export_layout.addWidget(self.button_export) @@ -233,10 +227,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self.export_otio(clips_data, output_path) - check_state = self.checkbox_inspect_otio_view.checkState() - if check_state == QtCore.Qt.CheckState.Checked: - run_detached_process(["otioview", output_path]) - # Feedback about success. show_message_dialog( "Success!", From 2d87f1b24cf8cae4ecd1839070ebcacd6dc559c4 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 18 Mar 2024 16:46:05 +0000 Subject: [PATCH 010/216] Update client/ayon_core/plugins/load/export_otio.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakub Ježek --- client/ayon_core/plugins/load/export_otio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 86b541633a..d1de4ad3e9 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -245,7 +245,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): media_reference = self.otio.schema.ExternalReference( available_range=range, - target_url=f"file://{path}" + target_url=path ) return self.otio.schema.Clip( From ff081b0e50bb1f542d3d07ad4b7535664d27bdbe Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Mon, 18 Mar 2024 17:59:15 +0000 Subject: [PATCH 011/216] Fix for latest develop --- client/ayon_core/plugins/load/export_otio.py | 33 +++++++++----------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index d1de4ad3e9..b3f8e0aaec 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -2,17 +2,14 @@ from collections import defaultdict from qtpy import QtWidgets, QtCore, QtGui -from ayon_core.client import ( - get_representations, - get_asset_name_identifier -) +from ayon_api import get_representations, get_folder_by_id from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.tools.utils import show_message_dialog -class ExportOTIO(load.SubsetLoaderPlugin): +class ExportOTIO(load.ProductLoaderPlugin): """Export selected versions to OpenTimelineIO.""" is_multiple_contexts_compatible = True @@ -66,32 +63,30 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): all_representation_names = set() self._version_path_by_id = {} version_docs_by_id = { - context["version"]["_id"]: context["version"] + context["version"]["id"]: context["version"] for context in contexts } repre_docs = list(get_representations( self._project_name, version_ids=set(version_docs_by_id) )) self._version_by_representation_id = { - repre_doc["_id"]: version_docs_by_id[repre_doc["parent"]] + repre_doc["id"]: version_docs_by_id[repre_doc["versionId"]] for repre_doc in repre_docs } self._version_path_by_id = {} for context in contexts: - version_doc = context["version"] - version_id = version_doc["_id"] + version_id = context["version"]["id"] if version_id in self._version_path_by_id: continue - asset_doc = context["asset"] - folder_path = get_asset_name_identifier(asset_doc) - subset_name = context["subset"]["name"] - self._version_path_by_id[version_id] = "{}/{}/v{:03d}".format( - folder_path, subset_name, version_doc["name"] - ) + self._version_path_by_id[version_id] = "/".join([ + context["folder"]["path"], + context["product"]["name"], + context["version"]["name"] + ]) representations_by_version_id = defaultdict(list) for repre_doc in repre_docs: - representations_by_version_id[repre_doc["parent"]].append( + representations_by_version_id[repre_doc["versionId"]].append( repre_doc ) @@ -209,9 +204,11 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): anatomy = Anatomy(self._project_name) clips_data = {} for representation in representations: - version = self._version_by_representation_id[representation["_id"]] + version = self._version_by_representation_id[ + representation["id"] + ] name = "{}/{}".format( - self._version_path_by_id[version["_id"]], + self._version_path_by_id[version["id"]], representation["name"] ) clips_data[name] = { From 7b60b82cc0311f2f3673d486a3252b21d8440211 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 9 Apr 2024 13:59:55 +0200 Subject: [PATCH 012/216] Update ayon_core export_otio.py: Refactor data attribute names and success message. - Renamed data attributes to attrib for frame calculations - Corrected success message typo from "successfull" to "successful" --- client/ayon_core/plugins/load/export_otio.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index b3f8e0aaec..fc1d58cd64 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -2,7 +2,7 @@ from collections import defaultdict from qtpy import QtWidgets, QtCore, QtGui -from ayon_api import get_representations, get_folder_by_id +from ayon_api import get_representations from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style from ayon_core.pipeline.load import get_representation_path_with_anatomy @@ -216,10 +216,10 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): representation, anatomy ), "frames": ( - version["data"]["frameEnd"] - - version["data"]["frameStart"] + version["attrib"]["frameEnd"] - + version["attrib"]["frameStart"] ), - "framerate": version["data"]["fps"] + "framerate": version["attrib"]["fps"] } self.export_otio(clips_data, output_path) @@ -227,7 +227,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): # Feedback about success. show_message_dialog( "Success!", - "Export was successfull.", + "Export was successful.", level="info", parent=self ) From fbe400a135cb3a1e4e8efeb989ae449d3bd3871e Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 30 Apr 2024 16:32:45 +0100 Subject: [PATCH 013/216] Update client/ayon_core/plugins/load/export_otio.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/load/export_otio.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index fc1d58cd64..35d1e464a9 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -15,8 +15,8 @@ class ExportOTIO(load.ProductLoaderPlugin): is_multiple_contexts_compatible = True sequence_splitter = "__sequence_splitter__" - representations = ["*"] - families = ["*"] + representations = {"*"} + product_types = {"*"} tool_names = ["library_loader"] label = "Export OTIO" From ff1b6b7e18c8953494adca79a896ae97a0e31de4 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Jun 2024 16:43:24 +0200 Subject: [PATCH 014/216] Add import statement, define constant, update variable names and refactor method for exporting OTIO files. - Added import statement for 'os'. - Defined constant 'FRAME_SPLITTER'. - Updated variable names for clarity. - Refactored method to create clips with correct paths and frame numbers. --- client/ayon_core/plugins/load/export_otio.py | 108 +++++++++++++------ 1 file changed, 76 insertions(+), 32 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 35d1e464a9..75376e7fde 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -1,3 +1,4 @@ +import os from collections import defaultdict from qtpy import QtWidgets, QtCore, QtGui @@ -9,6 +10,9 @@ from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.tools.utils import show_message_dialog +FRAME_SPLITTER = "__frame_splitter__" + + class ExportOTIO(load.ProductLoaderPlugin): """Export selected versions to OpenTimelineIO.""" @@ -37,8 +41,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): def __init__(self, contexts, log=None, parent=None): # Not all hosts have OpenTimelineIO available. - import opentimelineio as otio - self.otio = otio + import opentimelineio as OTIO + self.OTIO = OTIO super(ExportOTIOOptionsDialog, self).__init__(parent=parent) @@ -141,8 +145,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): layout = QtWidgets.QHBoxLayout(widget) self.button_output_path = QtWidgets.QPushButton("Output Path:") layout.addWidget(self.button_output_path) - self.lineedit_output_path = QtWidgets.QLineEdit() - layout.addWidget(self.lineedit_output_path) + self.line_edit_output_path = QtWidgets.QLineEdit() + layout.addWidget(self.line_edit_output_path) export_layout.addWidget(widget) self.button_export = QtWidgets.QPushButton("Export") @@ -165,10 +169,10 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): None, "Save OTIO file.", "", "OTIO Files (*.otio)" ) if file_path: - self.lineedit_output_path.setText(file_path) + self.line_edit_output_path.setText(file_path) def export(self): - output_path = self.lineedit_output_path.text() + output_path = self.line_edit_output_path.text() # Validate output path is not empty. if not output_path: @@ -211,15 +215,15 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self._version_path_by_id[version["id"]], representation["name"] ) + clips_data[name] = { - "path": get_representation_path_with_anatomy( - representation, anatomy - ), + "representation": representation, + "anatomy": anatomy, "frames": ( - version["attrib"]["frameEnd"] - - version["attrib"]["frameStart"] + version["attrib"]["frameEnd"] + - version["attrib"]["frameStart"] ), - "framerate": version["attrib"]["fps"] + "framerate": version["attrib"]["fps"], } self.export_otio(clips_data, output_path) @@ -234,31 +238,71 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self.close() - def create_clip(self, path, name, frames, framerate): - range = self.otio.opentime.TimeRange( - start_time=self.otio.opentime.RationalTime(0, framerate), - duration=self.otio.opentime.RationalTime(frames, framerate) - ) + def create_clip(self, name, clip_data): + representation = clip_data["representation"] + anatomy = clip_data["anatomy"] + frames = clip_data["frames"] + framerate = clip_data["framerate"] - media_reference = self.otio.schema.ExternalReference( - available_range=range, - target_url=path - ) + # Get path to representation with correct frame number + repre_path = get_representation_path_with_anatomy( + representation, anatomy) + first_frame = representation["context"].get("frame") + if first_frame is None: + range = self.OTIO.opentime.TimeRange( + start_time=self.OTIO.opentime.RationalTime(0, framerate), + duration=self.OTIO.opentime.RationalTime(frames, framerate), + ) + # Use 'repre_path' as single file + media_reference = self.OTIO.schema.ExternalReference( + available_range=range, target_url=repre_path + ) + else: + # This is sequence + repre_files = [ + file["path"].format(root=anatomy.roots) + for file in representation["files"] + ] + # Change frame in representation context to get path with frame + # splitter. + representation["context"]["frame"] = FRAME_SPLITTER + frame_repre_path = get_representation_path_with_anatomy( + representation, anatomy + ) + repre_dir, repre_filename = os.path.split(frame_repre_path) + # Get sequence prefix and suffix + file_prefix, file_suffix = repre_filename.split(FRAME_SPLITTER) + # Get frame number from path as string to get frame padding + frame_str = repre_path[len(file_prefix):][:len(file_suffix)] + frame_padding = len(frame_str) - return self.otio.schema.Clip( + range = self.OTIO.opentime.TimeRange( + start_time=self.OTIO.opentime.RationalTime(0, framerate), + duration=self.OTIO.opentime.RationalTime( + len(repre_files), framerate) + ) + + media_reference = self.OTIO.schema.ImageSequenceReference( + available_range=range, + start_frame=int(first_frame), + frame_step=1, + rate=framerate, + target_url_base=repre_dir, + name_prefix=file_prefix, + name_suffix=file_suffix, + frame_zero_padding=frame_padding, + ) + + return self.OTIO.schema.Clip( name=name, media_reference=media_reference, source_range=range ) def export_otio(self, clips_data, output_path): - clips = [] - for name, data in clips_data.items(): - clips.append( - self.create_clip( - data["path"], name, data["frames"], data["framerate"] - ) - ) - - timeline = self.otio.schema.timeline_from_clips(clips) - self.otio.adapters.write_to_file(timeline, output_path) + clips = [ + self.create_clip(name, clip_data) + for name, clip_data in clips_data.items() + ] + timeline = self.OTIO.schema.timeline_from_clips(clips) + self.OTIO.adapters.write_to_file(timeline, output_path) From 5678b2f842ab8a4dde98fb505ee058a4cd4cbdba Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Jun 2024 17:41:49 +0200 Subject: [PATCH 015/216] Add Pathlib usage for file path handling and URI conversion. Improve string formatting for file paths and names. --- client/ayon_core/plugins/load/export_otio.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 75376e7fde..03492e57c0 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -1,4 +1,5 @@ import os +from pathlib import Path from collections import defaultdict from qtpy import QtWidgets, QtCore, QtGui @@ -211,9 +212,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): version = self._version_by_representation_id[ representation["id"] ] - name = "{}/{}".format( - self._version_path_by_id[version["id"]], - representation["name"] + name = f'{self._version_path_by_id[version["id"]]}/{representation["name"]}'.replace( + "/", "_" ) clips_data[name] = { @@ -247,6 +247,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): # Get path to representation with correct frame number repre_path = get_representation_path_with_anatomy( representation, anatomy) + repre_path = Path(repre_path) + first_frame = representation["context"].get("frame") if first_frame is None: range = self.OTIO.opentime.TimeRange( @@ -255,7 +257,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): ) # Use 'repre_path' as single file media_reference = self.OTIO.schema.ExternalReference( - available_range=range, target_url=repre_path + available_range=range, + target_url=repre_path.as_uri() ) else: # This is sequence @@ -269,11 +272,13 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): frame_repre_path = get_representation_path_with_anatomy( representation, anatomy ) - repre_dir, repre_filename = os.path.split(frame_repre_path) + frame_repre_path = Path(frame_repre_path) + repre_dir, repre_filename = ( + frame_repre_path.parent, frame_repre_path.name) # Get sequence prefix and suffix file_prefix, file_suffix = repre_filename.split(FRAME_SPLITTER) # Get frame number from path as string to get frame padding - frame_str = repre_path[len(file_prefix):][:len(file_suffix)] + frame_str = str(repre_path)[len(file_prefix):][:len(file_suffix)] frame_padding = len(frame_str) range = self.OTIO.opentime.TimeRange( @@ -287,7 +292,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): start_frame=int(first_frame), frame_step=1, rate=framerate, - target_url_base=repre_dir, + target_url_base=f"{repre_dir.as_uri()}/", name_prefix=file_prefix, name_suffix=file_suffix, frame_zero_padding=frame_padding, From cdd0aa7795acd9bbd273a573ea4f2ac0d5e103d9 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 6 Jun 2024 16:36:43 +0200 Subject: [PATCH 016/216] Add get_image_info_metadata function for image metadata retrieval. - Added a new function to retrieve metadata from image files. - The function first tries OpenImageIO and then falls back to FFprobe if needed. --- client/ayon_core/lib/__init__.py | 21 +---- client/ayon_core/lib/transcoding.py | 84 ++++++++++++++++++ client/ayon_core/plugins/load/export_otio.py | 22 ++++- .../ayon_core/tests/lib/test_transcoding.py | 53 +++++++++++ .../a01vfxd_sh010_plateP01_v002.1013.exr | Bin 0 -> 1220753 bytes .../a01vfxd_sh010_plateP01_v002.mov | Bin 0 -> 41242 bytes 6 files changed, 157 insertions(+), 23 deletions(-) create mode 100644 client/ayon_core/tests/lib/test_transcoding.py create mode 100644 client/ayon_core/tests/resources/lib/transcoding/a01vfxd_sh010_plateP01_v002.1013.exr create mode 100644 client/ayon_core/tests/resources/lib/transcoding/a01vfxd_sh010_plateP01_v002.mov diff --git a/client/ayon_core/lib/__init__.py b/client/ayon_core/lib/__init__.py index e25d3479ee..561f71eb52 100644 --- a/client/ayon_core/lib/__init__.py +++ b/client/ayon_core/lib/__init__.py @@ -122,6 +122,7 @@ from .transcoding import ( convert_ffprobe_fps_value, convert_ffprobe_fps_to_float, get_rescaled_command_arguments, + get_image_info_metadata, ) from .plugin_tools import ( @@ -159,15 +160,11 @@ __all__ = [ "get_local_site_id", "get_ayon_username", "get_openpype_username", - "initialize_ayon_connection", - "CacheItem", "NestedCacheItem", - "emit_event", "register_event_callback", - "get_ayon_launcher_args", "get_openpype_execute_args", "get_linux_launcher_args", @@ -178,10 +175,8 @@ __all__ = [ "run_openpype_process", "path_to_subprocess_arg", "CREATE_NO_WINDOW", - "env_value_to_bool", "get_paths_from_environ", - "ToolNotFoundError", "find_executable", "get_oiio_tools_path", @@ -189,13 +184,10 @@ __all__ = [ "get_ffmpeg_tool_path", "get_ffmpeg_tool_args", "is_oiio_supported", - "AbstractAttrDef", - "UIDef", "UISeparatorDef", "UILabelDef", - "UnknownDef", "NumberDef", "TextDef", @@ -203,14 +195,12 @@ __all__ = [ "BoolDef", "FileDef", "FileDefItem", - "import_filepath", "modules_from_path", "recursive_bases_from_class", "classes_from_module", "import_module_from_dirpath", "is_func_signature_supported", - "get_transcode_temp_directory", "should_convert_for_ffmpeg", "convert_for_ffmpeg", @@ -222,33 +212,26 @@ __all__ = [ "convert_ffprobe_fps_value", "convert_ffprobe_fps_to_float", "get_rescaled_command_arguments", + "get_image_info_metadata", "compile_list_of_regexes", - "filter_profiles", - "prepare_template_data", "source_hash", - "format_file_size", "collect_frames", "create_hard_link", "version_up", "get_version_from_path", "get_last_version_from_path", - "TemplateUnsolved", "StringTemplate", "FormatObject", - "terminal", - "get_datetime_data", "get_timestamp", "get_formatted_current_time", - "Logger", - "is_in_ayon_launcher_process", "is_running_from_build", "is_using_ayon_console", diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 4d778c2091..0f220f1093 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -834,6 +834,90 @@ def get_ffprobe_streams(path_to_file, logger=None): return get_ffprobe_data(path_to_file, logger)["streams"] +def get_image_info_metadata( + path_to_file, + keys=None, + logger=None +): + """Get metadata from image file. + + At first it will try to detect if the image input is supported by + OpenImageIO. If it is then it gets the metadata from the image using + OpenImageIO. If it is not supported by OpenImageIO then it will try to + get the metadata using FFprobe. + + Args: + path_to_file (str): Path to image file. + keys (list[str]): List of keys that should be returned. If None then + all keys are returned. + logger (logging.Logger): Logger used for logging. + """ + if logger is None: + logger = logging.getLogger(__name__) + + def _ffprobe_metadata_conversion(metadata): + """Convert ffprobe metadata unified format.""" + output = {} + for key, val in metadata.items(): + if key in ("tags", "disposition"): + output.update(val) + else: + output[key] = val + return output + + metadata_stream = None + ext = os.path.splitext(path_to_file)[-1].lower() + if ext not in IMAGE_EXTENSIONS: + logger.info(( + "File extension \"{}\" is not supported by OpenImageIO." + " Trying to get metadata using FFprobe." + ).format(ext)) + ffprobe_stream = get_ffprobe_data(path_to_file, logger) + if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: + metadata_stream = _ffprobe_metadata_conversion( + ffprobe_stream["streams"][0]) + + if not metadata_stream and is_oiio_supported(): + oiio_stream = get_oiio_info_for_input(path_to_file, logger=logger) + if "attribs" in (oiio_stream or {}): + metadata_stream = {} + for key, val in oiio_stream["attribs"].items(): + if "smpte:" in key.lower(): + key = key.replace("smpte:", "") + metadata_stream[key.lower()] = val + for key, val in oiio_stream.items(): + if key == "attribs": + continue + metadata_stream[key] = val + else: + logger.info(( + "OpenImageIO is not supported on this system." + " Trying to get metadata using FFprobe." + )) + ffprobe_stream = get_ffprobe_data(path_to_file, logger) + if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: + metadata_stream = _ffprobe_metadata_conversion( + ffprobe_stream["streams"][0]) + + if not metadata_stream: + logger.warning("Failed to get metadata from image file.") + return {} + + if keys is None: + return metadata_stream + + output = {} + for key in keys: + for k, v in metadata_stream.items(): + if key == k: + output[key] = v + break + if isinstance(v, dict) and key in v: + output[key] = v[key] + break + return output + + def get_ffmpeg_format_args(ffprobe_data, source_ffmpeg_cmd=None): """Copy format from input metadata for output. diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 03492e57c0..ac236e1038 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -1,4 +1,3 @@ -import os from pathlib import Path from collections import defaultdict @@ -6,6 +5,7 @@ from qtpy import QtWidgets, QtCore, QtGui from ayon_api import get_representations from ayon_core.pipeline import load, Anatomy +from ayon_core.lib import get_image_info_metadata from ayon_core import resources, style from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.tools.utils import show_message_dialog @@ -44,6 +44,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): # Not all hosts have OpenTimelineIO available. import opentimelineio as OTIO self.OTIO = OTIO + self.log = log super(ExportOTIOOptionsDialog, self).__init__(parent=parent) @@ -247,12 +248,23 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): # Get path to representation with correct frame number repre_path = get_representation_path_with_anatomy( representation, anatomy) + + timecode_start_frame = 0 + if file_metadata := get_image_info_metadata( + repre_path, ["timecode"], self.log + ): + # use otio to convert timecode into frame number + timecode_start_frame = self.OTIO.opentime.from_timecode( + file_metadata["timecode"], framerate) + repre_path = Path(repre_path) first_frame = representation["context"].get("frame") if first_frame is None: range = self.OTIO.opentime.TimeRange( - start_time=self.OTIO.opentime.RationalTime(0, framerate), + start_time=self.OTIO.opentime.RationalTime( + timecode_start_frame, framerate + ), duration=self.OTIO.opentime.RationalTime(frames, framerate), ) # Use 'repre_path' as single file @@ -282,9 +294,11 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): frame_padding = len(frame_str) range = self.OTIO.opentime.TimeRange( - start_time=self.OTIO.opentime.RationalTime(0, framerate), + start_time=self.OTIO.opentime.RationalTime( + timecode_start_frame.to_frames(), float(framerate) + ), duration=self.OTIO.opentime.RationalTime( - len(repre_files), framerate) + len(repre_files), framerate), ) media_reference = self.OTIO.schema.ImageSequenceReference( diff --git a/client/ayon_core/tests/lib/test_transcoding.py b/client/ayon_core/tests/lib/test_transcoding.py new file mode 100644 index 0000000000..3f46eb960e --- /dev/null +++ b/client/ayon_core/tests/lib/test_transcoding.py @@ -0,0 +1,53 @@ +import pytest +import logging +from pathlib import Path +from ayon_core.lib.transcoding import get_image_info_metadata + +logger = logging.getLogger('test_transcoding') +logger.setLevel(logging.DEBUG) + + +@pytest.mark.parametrize( + "resources_path_factory, metadata, expected, test_id", + [ + ( + Path(__file__).parent.parent + / "resources" + / "lib" + / "transcoding" + / "a01vfxd_sh010_plateP01_v002.1013.exr", + ["timecode"], + {"timecode": "01:00:06:03"}, + "test_01", + ), + ( + Path(__file__).parent.parent + / "resources" + / "lib" + / "transcoding" + / "a01vfxd_sh010_plateP01_v002.1013.exr", + ["timecode", "width", "height", "duration"], + {"timecode": "01:00:06:03", "width": 1920, "height": 1080}, + "test_02", + ), + ( + Path(__file__).parent.parent + / "resources" + / "lib" + / "transcoding" + / "a01vfxd_sh010_plateP01_v002.mov", + ["width", "height", "duration"], + {"width": 1920, "height": 1080, "duration": "0.041708"}, + "test_03", + ), + ], +) +def test_get_image_info_metadata_happy_path( + resources_path_factory, metadata, expected, test_id +): + path_to_file = resources_path_factory.as_posix() + + returned_data = get_image_info_metadata(path_to_file, metadata, logger) + logger.debug(f"Returned data: {returned_data}") + + assert returned_data == expected diff --git a/client/ayon_core/tests/resources/lib/transcoding/a01vfxd_sh010_plateP01_v002.1013.exr b/client/ayon_core/tests/resources/lib/transcoding/a01vfxd_sh010_plateP01_v002.1013.exr new file mode 100644 index 0000000000000000000000000000000000000000..9f7bc625bc134a0206f5df9eb89522910add15a8 GIT binary patch literal 1220753 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%0A`YY1efEYC8Q;?YSmaakuX^QHx=?O# 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 Pvo@ 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

Ew*s5 zKYcX=_p>1Wv8Q;iis{|}X&BZ0SS}M+eZEL%I+uw{&X)sg(vTC(^`Bz+CWy!|I7Ii( zxNIXk1uh{;4XTvLqCJYA^o`-!Gw&58)P@`M?18JaD`N!Xsfb&zcN#Dh@RK&;kZp*I zd}NI2NsU&W1oFIbp{miF5*8xCmud)(9qM@U*7v?0 zpdEUm@od@zupHOE4ujgmMy~y{{jloW{atDXYpzcYyD3?uJ1^B3b~m;GMf;DhKdvxQf^< z2J5r8_5d1g=5+%C?O63gjWQm_wpLrPOi%1fP39fm|A(axQ49+-+tScj=U zZpuiwPE5lw>`nVp?WK?F^aLt^b>;-FZc4*Pv@s2@e~wTtZl#_%j50%tK`lu>*3^)e zWwUvSE125tNi3&YmlqepT8=avp8v>RfV|7yT)=PW9XXAniYRaxR3Lj@;S*SxZ{=&- z5w6n*8>F2g-eCXqHE%Go!&q@Gs*$;9=qyg|5a2|U$;e8q{zxz7Zr+8b7s~eK@|GX! zoa=D`*^?pTf!j0PLF2TWAS(6f{Otl1xgX#@6vh^rYeuq z77)1>l`J!vzE4B{1H5vB?K+?$Rl-N=ejjf)QsOydL>@>Meg}Y&q zJKg&@zL%ah+Lw63w&|JLq4GHc;4`5K#lC7OH=|w?yj2wRth^vYp_K%qnd%<{<=KWb`or&h-z!{eu7^OMRnE$G^>5ryT7e+x2Y(2}Y?uZQ zJpl2g1QME%Iy}6O%aLH}4^4ZIG z#1MjYYQQtb$VB{)xwRG5(+}q}MR9SnteKLj?nU2sjC4NxDsMPZy>@j@!gHeO6U>P| zV(N_JI3#r}De-GH{iq;%|ET`=H!sxl*=gl1+Lrwt67>i_A`a^m#}`l* zb#uw1l-X!{bKh_E=~KKjFyUKIq3DFKZNI9n7&hExPL7yi_`;%u&uKbxRD2nv`+7Wt z#QlHzs1X8yjYZ&YRJ_Fa5zjw$ zS8;&#orYrR<$d|l z$n~BCM6vSDdRyE5`x_NOUjQvYEp7rREX>*QrIqyktZ&id$X-Ox??EUz_fGf|LY~eB z^NY~|@IAt`3#&Z#2Yr`#l7uAe!*Yx)v>WPt_(PVPndLU^-6#6}e~Nly`teGDg9Bt% z3VQ?9_F)UJ(*tl>7H<)jh;!@RlP|&m;#p$BF2K9^KOWi)i1QGKyk@)(&Um2Dw7+

d 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%0Dyok0jR46 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 z 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 z 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

8xt8(lQ6H+;D{eRq>|9zkSf2{wB1u3aB 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 literal 0 HcmV?d00001 From 9528c6d281b22da994966279988e147b5add8c07 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 10:28:43 +0200 Subject: [PATCH 017/216] Update dependencies and pytest configuration Added a new dependency "semver" and configured pytest to log at INFO level, run quietly, and target specific test paths. --- client/ayon_core/tests/lib/test_transcoding.py | 1 - pyproject.toml | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tests/lib/test_transcoding.py b/client/ayon_core/tests/lib/test_transcoding.py index 3f46eb960e..47d9fc70d3 100644 --- a/client/ayon_core/tests/lib/test_transcoding.py +++ b/client/ayon_core/tests/lib/test_transcoding.py @@ -4,7 +4,6 @@ from pathlib import Path from ayon_core.lib.transcoding import get_image_info_metadata logger = logging.getLogger('test_transcoding') -logger.setLevel(logging.DEBUG) @pytest.mark.parametrize( diff --git a/pyproject.toml b/pyproject.toml index 2f30778519..bd3d48d53d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ ayon-python-api = "^1.0" ruff = "^0.3.3" pre-commit = "^3.6.2" codespell = "^2.2.6" +semver = "^3.0.2" [tool.ruff] @@ -119,3 +120,12 @@ quiet-level = 3 [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + + +[tool.pytest.ini_options] +log_cli = true +log_cli_level = "INFO" +addopts = "-ra -q" +testpaths = [ + "client/ayon_core/tests" +] From d0abc5416e1f94bda15fc9655d0b9b2aa59d05dc Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 10:33:29 +0200 Subject: [PATCH 018/216] Add support for setting timeline framerate based on highest clip framerate and adjust clip start frames accordingly. Include method to calculate timecode start frame from metadata. Add support for setting timeline framerate based on highest clip framerate and adjust clip start frames accordingly. Include method to calculate timecode start frame from metadata. --- client/ayon_core/plugins/load/export_otio.py | 77 +++++++++++++++----- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index ac236e1038..454babe67c 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -239,38 +239,53 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self.close() - def create_clip(self, name, clip_data): + def create_clip(self, name, clip_data, timeline_framerate): representation = clip_data["representation"] anatomy = clip_data["anatomy"] frames = clip_data["frames"] framerate = clip_data["framerate"] + print("_" * 50) + print(f"{name}") + print(f"{framerate}") # Get path to representation with correct frame number repre_path = get_representation_path_with_anatomy( representation, anatomy) - timecode_start_frame = 0 + media_start_frame = clip_start_frame = 0 if file_metadata := get_image_info_metadata( - repre_path, ["timecode"], self.log + repre_path, ["timecode", "duration"], self.log ): - # use otio to convert timecode into frame number - timecode_start_frame = self.OTIO.opentime.from_timecode( - file_metadata["timecode"], framerate) + framerate = round(framerate, 3) + media_start_frame = self.get_timecode_start_frame( + framerate, file_metadata) + clip_start_frame = self.get_timecode_start_frame( + timeline_framerate, file_metadata + ) + + if "duration" in file_metadata: + frames = int(float(file_metadata["duration"]) * framerate) repre_path = Path(repre_path) first_frame = representation["context"].get("frame") if first_frame is None: - range = self.OTIO.opentime.TimeRange( + media_range = self.OTIO.opentime.TimeRange( start_time=self.OTIO.opentime.RationalTime( - timecode_start_frame, framerate + media_start_frame, framerate ), duration=self.OTIO.opentime.RationalTime(frames, framerate), ) + clip_range = self.OTIO.opentime.TimeRange( + start_time=self.OTIO.opentime.RationalTime( + clip_start_frame, timeline_framerate + ), + duration=self.OTIO.opentime.RationalTime( + frames, timeline_framerate), + ) # Use 'repre_path' as single file media_reference = self.OTIO.schema.ExternalReference( - available_range=range, - target_url=repre_path.as_uri() + available_range=media_range, target_url=repre_path.as_posix() ) else: # This is sequence @@ -293,35 +308,59 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): frame_str = str(repre_path)[len(file_prefix):][:len(file_suffix)] frame_padding = len(frame_str) - range = self.OTIO.opentime.TimeRange( + media_range = self.OTIO.opentime.TimeRange( start_time=self.OTIO.opentime.RationalTime( - timecode_start_frame.to_frames(), float(framerate) + media_start_frame, float(framerate) ), duration=self.OTIO.opentime.RationalTime( len(repre_files), framerate), ) - + clip_range = self.OTIO.opentime.TimeRange( + start_time=self.OTIO.opentime.RationalTime( + clip_start_frame, timeline_framerate + ), + duration=self.OTIO.opentime.RationalTime( + len(repre_files), timeline_framerate + ), + ) media_reference = self.OTIO.schema.ImageSequenceReference( - available_range=range, + available_range=media_range, start_frame=int(first_frame), frame_step=1, rate=framerate, - target_url_base=f"{repre_dir.as_uri()}/", + target_url_base=f"{repre_dir.as_posix()}/", name_prefix=file_prefix, name_suffix=file_suffix, frame_zero_padding=frame_padding, ) return self.OTIO.schema.Clip( - name=name, - media_reference=media_reference, - source_range=range + name=name, media_reference=media_reference, source_range=clip_range ) + def get_timecode_start_frame(self, framerate, file_metadata): + # use otio to convert timecode into frame number + timecode_start_frame = self.OTIO.opentime.from_timecode( + file_metadata["timecode"], framerate) + return timecode_start_frame.to_frames() + def export_otio(self, clips_data, output_path): + # first find the highest framerate and set it as default framerate + # for the timeline + timeline_framerate = 0 + for clip_data in clips_data.values(): + framerate = clip_data["framerate"] + if framerate > timeline_framerate: + timeline_framerate = framerate + + timeline_framerate = round(timeline_framerate, 3) clips = [ - self.create_clip(name, clip_data) + self.create_clip(name, clip_data, timeline_framerate) for name, clip_data in clips_data.items() ] timeline = self.OTIO.schema.timeline_from_clips(clips) + # set the timeline framerate to the highest framerate + timeline.global_start_time = self.OTIO.opentime.RationalTime( + 0, timeline_framerate) + self.OTIO.adapters.write_to_file(timeline, output_path) From 104a71701eae2e57498652c1c87e41fcaaa95b71 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 12:16:28 +0200 Subject: [PATCH 019/216] Add URI path format option, improve output path handling, and convert paths to URI or Posix. Reduce decimal places for framerate values. Create clips from representations and set timeline framerate accordingly. --- client/ayon_core/plugins/load/export_otio.py | 52 ++++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 454babe67c..53d5d2ac08 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -145,10 +145,25 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): widget = QtWidgets.QWidget() layout = QtWidgets.QHBoxLayout(widget) + + layout.addWidget(QtWidgets.QLabel("URI paths:")) + self.uri_path_format = QtWidgets.QCheckBox() + self.uri_path_format.setToolTip( + 'Use URI paths (file:///) instead of absolute paths. ' + 'This is useful when the OTIO file will be used on Foundry Hiero.' + ) + layout.addWidget(self.uri_path_format) + self.button_output_path = QtWidgets.QPushButton("Output Path:") + self.button_output_path.setToolTip( + "Click to select the output path for the OTIO file." + ) layout.addWidget(self.button_output_path) - self.line_edit_output_path = QtWidgets.QLineEdit() + self.line_edit_output_path = QtWidgets.QLineEdit( + (Path.home() / f"{self._project_name}.otio").as_posix() + ) layout.addWidget(self.line_edit_output_path) + export_layout.addWidget(widget) self.button_export = QtWidgets.QPushButton("Export") @@ -244,9 +259,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): anatomy = clip_data["anatomy"] frames = clip_data["frames"] framerate = clip_data["framerate"] - print("_" * 50) - print(f"{name}") - print(f"{framerate}") # Get path to representation with correct frame number repre_path = get_representation_path_with_anatomy( @@ -256,7 +268,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): if file_metadata := get_image_info_metadata( repre_path, ["timecode", "duration"], self.log ): - framerate = round(framerate, 3) + framerate = float(f"{timeline_framerate:.3f}") media_start_frame = self.get_timecode_start_frame( framerate, file_metadata) clip_start_frame = self.get_timecode_start_frame( @@ -283,9 +295,11 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): duration=self.OTIO.opentime.RationalTime( frames, timeline_framerate), ) + # Use 'repre_path' as single file media_reference = self.OTIO.schema.ExternalReference( - available_range=media_range, target_url=repre_path.as_posix() + available_range=media_range, + target_url=self.convert_to_uri_or_posix(repre_path), ) else: # This is sequence @@ -323,12 +337,13 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): len(repre_files), timeline_framerate ), ) + media_reference = self.OTIO.schema.ImageSequenceReference( available_range=media_range, start_frame=int(first_frame), frame_step=1, rate=framerate, - target_url_base=f"{repre_dir.as_posix()}/", + target_url_base=f"{self.convert_to_uri_or_posix(repre_dir)}/", name_prefix=file_prefix, name_suffix=file_suffix, frame_zero_padding=frame_padding, @@ -338,10 +353,25 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): name=name, media_reference=media_reference, source_range=clip_range ) + def convert_to_uri_or_posix(self, path: Path) -> str: + """Convert path to URI or Posix path. + + Args: + path (Path): Path to convert. + + Returns: + str: Path as URI or Posix path. + """ + if self.uri_path_format.isChecked(): + return path.as_uri() + + return path.as_posix() + + def get_timecode_start_frame(self, framerate, file_metadata): # use otio to convert timecode into frame number timecode_start_frame = self.OTIO.opentime.from_timecode( - file_metadata["timecode"], framerate) + file_metadata["timecode"], framerate) return timecode_start_frame.to_frames() def export_otio(self, clips_data, output_path): @@ -353,12 +383,16 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): if framerate > timeline_framerate: timeline_framerate = framerate - timeline_framerate = round(timeline_framerate, 3) + # reduce decimal places to 3 - otio does not like more + timeline_framerate = float(f"{timeline_framerate:.3f}") + + # create clips from the representations clips = [ self.create_clip(name, clip_data, timeline_framerate) for name, clip_data in clips_data.items() ] timeline = self.OTIO.schema.timeline_from_clips(clips) + # set the timeline framerate to the highest framerate timeline.global_start_time = self.OTIO.opentime.RationalTime( 0, timeline_framerate) From 2d50546a45dd4c92f6449a214f9654afc583ff06 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 12:16:37 +0200 Subject: [PATCH 020/216] Add test fixture for generating resource paths A new test fixture was added to generate resource paths based on input arguments. This fixture constructs a path using the parent directory of the current file and specified arguments. --- client/ayon_core/tests/conftest.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 client/ayon_core/tests/conftest.py diff --git a/client/ayon_core/tests/conftest.py b/client/ayon_core/tests/conftest.py new file mode 100644 index 0000000000..f66af706e1 --- /dev/null +++ b/client/ayon_core/tests/conftest.py @@ -0,0 +1,16 @@ +import pytest +from pathlib import Path + +collect_ignore = ["vendor", "resources"] + +RESOURCES_PATH = 'resources' + + +@pytest.fixture +def resources_path_factory(): + def factory(*args): + dirpath = Path(__file__).parent / RESOURCES_PATH + for arg in args: + dirpath = dirpath / arg + return dirpath + return factory From 5b6211b9e33ea87341079b3e6c937e7443144d68 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 14:21:21 +0200 Subject: [PATCH 021/216] enhancing metadata info processing to include framerate - Create "framerate" key from "r_frame_rate" or "framespersecond" - Evaluate string expression value into float value - Log a warning if evaluation fails. --- client/ayon_core/lib/transcoding.py | 24 ++++++++++++++++++- .../ayon_core/tests/lib/test_transcoding.py | 6 ++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 0f220f1093..df00c0e6dd 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -849,7 +849,10 @@ def get_image_info_metadata( Args: path_to_file (str): Path to image file. keys (list[str]): List of keys that should be returned. If None then - all keys are returned. + all keys are returned. Keys are expected all lowercase. + Additional keys are: + - "framerate" - will be created from "r_frame_rate" or + "framespersecond" and evaluated to float value. logger (logging.Logger): Logger used for logging. """ if logger is None: @@ -906,6 +909,25 @@ def get_image_info_metadata( if keys is None: return metadata_stream + # create framerate key from available ffmpeg:r_frame_rate + # or oiiotool:framespersecond and evaluate its string expression + # value into flaot value + if ( + "r_frame_rate" in metadata_stream + or "framespersecond" in metadata_stream + ): + rate_info = metadata_stream.get("r_frame_rate") + if rate_info is None: + rate_info = metadata_stream.get("framespersecond") + + try: + metadata_stream["framerate"] = eval(str(rate_info)) + except Exception as e: + logger.warning( + "Failed to evaluate '{}' value to framerate. Error: {}".format( + rate_info, e) + ) + output = {} for key in keys: for k, v in metadata_stream.items(): diff --git a/client/ayon_core/tests/lib/test_transcoding.py b/client/ayon_core/tests/lib/test_transcoding.py index 47d9fc70d3..4fe694631f 100644 --- a/client/ayon_core/tests/lib/test_transcoding.py +++ b/client/ayon_core/tests/lib/test_transcoding.py @@ -15,8 +15,8 @@ logger = logging.getLogger('test_transcoding') / "lib" / "transcoding" / "a01vfxd_sh010_plateP01_v002.1013.exr", - ["timecode"], - {"timecode": "01:00:06:03"}, + ["timecode", "framerate"], + {"timecode": "01:00:06:03", "framerate": 23.976023976023978}, "test_01", ), ( @@ -47,6 +47,6 @@ def test_get_image_info_metadata_happy_path( path_to_file = resources_path_factory.as_posix() returned_data = get_image_info_metadata(path_to_file, metadata, logger) - logger.debug(f"Returned data: {returned_data}") + logger.info(f"Returned data: {returned_data}") assert returned_data == expected From 39cb0df68957687c83f31d3e2414563c2b8424ca Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 7 Jun 2024 14:22:40 +0200 Subject: [PATCH 022/216] media framerate separated and taken dirrectly from image info --- client/ayon_core/plugins/load/export_otio.py | 25 +++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 53d5d2ac08..f2351a84f6 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -265,12 +265,18 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): representation, anatomy) media_start_frame = clip_start_frame = 0 + media_framerate = framerate if file_metadata := get_image_info_metadata( - repre_path, ["timecode", "duration"], self.log + repre_path, ["timecode", "duration", "framerate"], self.log ): - framerate = float(f"{timeline_framerate:.3f}") + # get media framerate and convert to float with 3 decimal places + media_framerate = file_metadata["framerate"] + media_framerate = float(f"{media_framerate:.4f}") + framerate = float(f"{timeline_framerate:.4f}") + media_start_frame = self.get_timecode_start_frame( - framerate, file_metadata) + media_framerate, file_metadata + ) clip_start_frame = self.get_timecode_start_frame( timeline_framerate, file_metadata ) @@ -284,9 +290,10 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): if first_frame is None: media_range = self.OTIO.opentime.TimeRange( start_time=self.OTIO.opentime.RationalTime( - media_start_frame, framerate + media_start_frame, media_framerate ), - duration=self.OTIO.opentime.RationalTime(frames, framerate), + duration=self.OTIO.opentime.RationalTime( + frames, media_framerate), ) clip_range = self.OTIO.opentime.TimeRange( start_time=self.OTIO.opentime.RationalTime( @@ -324,10 +331,11 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): media_range = self.OTIO.opentime.TimeRange( start_time=self.OTIO.opentime.RationalTime( - media_start_frame, float(framerate) + media_start_frame, media_framerate ), duration=self.OTIO.opentime.RationalTime( - len(repre_files), framerate), + len(repre_files), media_framerate + ), ) clip_range = self.OTIO.opentime.TimeRange( start_time=self.OTIO.opentime.RationalTime( @@ -367,7 +375,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): return path.as_posix() - def get_timecode_start_frame(self, framerate, file_metadata): # use otio to convert timecode into frame number timecode_start_frame = self.OTIO.opentime.from_timecode( @@ -384,7 +391,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): timeline_framerate = framerate # reduce decimal places to 3 - otio does not like more - timeline_framerate = float(f"{timeline_framerate:.3f}") + timeline_framerate = float(f"{timeline_framerate:.4f}") # create clips from the representations clips = [ From 1ed870e0eb0628bda75f3dcdeb152bca8ce6b62e Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 16 Jul 2024 10:30:43 +0200 Subject: [PATCH 023/216] reversing autochanges --- client/ayon_core/lib/__init__.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/client/ayon_core/lib/__init__.py b/client/ayon_core/lib/__init__.py index d77ccb1a8b..aece8a723e 100644 --- a/client/ayon_core/lib/__init__.py +++ b/client/ayon_core/lib/__init__.py @@ -147,11 +147,15 @@ __all__ = [ "get_local_site_id", "get_ayon_username", "get_openpype_username", + "initialize_ayon_connection", + "CacheItem", "NestedCacheItem", + "emit_event", "register_event_callback", + "get_ayon_launcher_args", "get_openpype_execute_args", "get_linux_launcher_args", @@ -162,8 +166,10 @@ __all__ = [ "run_openpype_process", "path_to_subprocess_arg", "CREATE_NO_WINDOW", + "env_value_to_bool", "get_paths_from_environ", + "ToolNotFoundError", "find_executable", "get_oiio_tools_path", @@ -171,10 +177,13 @@ __all__ = [ "get_ffmpeg_tool_path", "get_ffmpeg_tool_args", "is_oiio_supported", + "AbstractAttrDef", + "UIDef", "UISeparatorDef", "UILabelDef", + "UnknownDef", "NumberDef", "TextDef", @@ -182,12 +191,14 @@ __all__ = [ "BoolDef", "FileDef", "FileDefItem", + "import_filepath", "modules_from_path", "recursive_bases_from_class", "classes_from_module", "import_module_from_dirpath", "is_func_signature_supported", + "get_transcode_temp_directory", "should_convert_for_ffmpeg", "convert_for_ffmpeg", @@ -202,7 +213,9 @@ __all__ = [ "get_image_info_metadata", "compile_list_of_regexes", + "filter_profiles", + "prepare_template_data", "source_hash", "format_file_size", @@ -211,10 +224,13 @@ __all__ = [ "version_up", "get_version_from_path", "get_last_version_from_path", + "TemplateUnsolved", "StringTemplate", "FormatObject", + "terminal", + "get_datetime_data", "get_timestamp", "get_formatted_current_time", From 62bfb66cda940306827096d9e6c5c167ed1d4ffd Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 16 Jul 2024 10:32:59 +0200 Subject: [PATCH 024/216] reversing auto changes --- client/ayon_core/lib/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/ayon_core/lib/__init__.py b/client/ayon_core/lib/__init__.py index aece8a723e..63d1e84781 100644 --- a/client/ayon_core/lib/__init__.py +++ b/client/ayon_core/lib/__init__.py @@ -218,6 +218,7 @@ __all__ = [ "prepare_template_data", "source_hash", + "format_file_size", "collect_frames", "create_hard_link", @@ -234,7 +235,9 @@ __all__ = [ "get_datetime_data", "get_timestamp", "get_formatted_current_time", + "Logger", + "is_in_ayon_launcher_process", "is_running_from_build", "is_using_ayon_console", From 85a5d16318efe464e0b58757e098ad79bf7276d8 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 16 Jul 2024 10:51:15 +0200 Subject: [PATCH 025/216] Update image metadata framerate evaluation to use float conversion The code now converts the framerate value to a float for better accuracy. --- client/ayon_core/lib/transcoding.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index f0c45a0fb8..5589cf909b 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -837,7 +837,7 @@ def get_ffprobe_streams(path_to_file, logger=None): def get_image_info_metadata( path_to_file, keys=None, - logger=None + logger=None, ): """Get metadata from image file. @@ -921,7 +921,7 @@ def get_image_info_metadata( rate_info = metadata_stream.get("framespersecond") try: - metadata_stream["framerate"] = eval(str(rate_info)) + metadata_stream["framerate"] = float(str(rate_info)) except Exception as e: logger.warning( "Failed to evaluate '{}' value to framerate. Error: {}".format( From 2c9571f9bf6315c401cf89ab1016d4e12b33128e Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 16 Jul 2024 10:53:46 +0200 Subject: [PATCH 026/216] adding comment for loop --- client/ayon_core/lib/transcoding.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 5589cf909b..5fafb8b3d6 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -928,6 +928,7 @@ def get_image_info_metadata( rate_info, e) ) + # aggregate all required metadata from prepared metadata stream output = {} for key in keys: for k, v in metadata_stream.items(): From c165eb24e69bab437823b59ea933cea33ddb6a44 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 29 Jul 2024 15:42:46 +0200 Subject: [PATCH 027/216] once both audio and video stream then audio is first --- client/ayon_core/lib/transcoding.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 5fafb8b3d6..d6b4550126 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -878,7 +878,7 @@ def get_image_info_metadata( ffprobe_stream = get_ffprobe_data(path_to_file, logger) if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: metadata_stream = _ffprobe_metadata_conversion( - ffprobe_stream["streams"][0]) + ffprobe_stream["streams"][-1]) if not metadata_stream and is_oiio_supported(): oiio_stream = get_oiio_info_for_input(path_to_file, logger=logger) From bd359b01b3ae9520d74f1070b6a2ab69a346907a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 29 Jul 2024 16:42:51 +0200 Subject: [PATCH 028/216] make sure only video stream is processed explicitly --- client/ayon_core/lib/transcoding.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index d6b4550126..9450bfb9b7 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -868,6 +868,23 @@ def get_image_info_metadata( output[key] = val return output + def _get_video_metadata_from_ffprobe(ffprobe_stream): + """Extract video metadata from ffprobe stream. + + Args: + ffprobe_stream (dict): Stream data obtained from ffprobe. + + Returns: + dict: Video metadata extracted from the ffprobe stream. + """ + video_stream = None + for stream in ffprobe_stream["streams"]: + if stream["codec_type"] == "video": + video_stream = stream + break + metadata_stream = _ffprobe_metadata_conversion(video_stream) + return metadata_stream + metadata_stream = None ext = os.path.splitext(path_to_file)[-1].lower() if ext not in IMAGE_EXTENSIONS: @@ -877,8 +894,7 @@ def get_image_info_metadata( ).format(ext)) ffprobe_stream = get_ffprobe_data(path_to_file, logger) if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: - metadata_stream = _ffprobe_metadata_conversion( - ffprobe_stream["streams"][-1]) + metadata_stream = _get_video_metadata_from_ffprobe(ffprobe_stream) if not metadata_stream and is_oiio_supported(): oiio_stream = get_oiio_info_for_input(path_to_file, logger=logger) @@ -899,8 +915,7 @@ def get_image_info_metadata( )) ffprobe_stream = get_ffprobe_data(path_to_file, logger) if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: - metadata_stream = _ffprobe_metadata_conversion( - ffprobe_stream["streams"][0]) + metadata_stream = _get_video_metadata_from_ffprobe(ffprobe_stream) if not metadata_stream: logger.warning("Failed to get metadata from image file.") @@ -938,6 +953,7 @@ def get_image_info_metadata( if isinstance(v, dict) and key in v: output[key] = v[key] break + return output From 00f168b250acf8f66f26fba806bcd4e872e92b8f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 29 Jul 2024 16:43:31 +0200 Subject: [PATCH 029/216] fixing the situation where `time/frame` expression is used. --- client/ayon_core/lib/transcoding.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 9450bfb9b7..905a2f03b1 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -935,6 +935,11 @@ def get_image_info_metadata( if rate_info is None: rate_info = metadata_stream.get("framespersecond") + # calculate framerate from string expression + if "/" in str(rate_info): + time, frame = str(rate_info).split("/") + rate_info = float(time) / float(frame) + try: metadata_stream["framerate"] = float(str(rate_info)) except Exception as e: From d7a2c57fd836ae6e26bc0f7e02f3b46a81a70dd8 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 31 Jul 2024 13:54:41 +0200 Subject: [PATCH 030/216] Refactor OCIO config handling, introduce fallback mechanism - Added function to extract config path from profile data - Updated global config retrieval to use new function - Introduced fallback mechanism for missing product entities --- client/ayon_core/pipeline/colorspace.py | 67 +++++++++++++++++----- server/settings/conversion.py | 38 +++++++++++++ server/settings/main.py | 75 ++++++++++++++++++++++--- 3 files changed, 156 insertions(+), 24 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 099616ff4a..1986e2d407 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -699,6 +699,33 @@ def get_ocio_config_views(config_path): ) +def _get_config_path_from_profile_data( + data, data_type, template_data) -> dict: + """Get config path from profile data. + + Args: + data (dict[str, Any]): Profile data. + data_type (str): Profile type. + template_data (dict[str, Any]): Template data. + + Returns: + dict[str, str]: Config data with path and template. + """ + template = data[data_type] + result = StringTemplate.format_strict_template( + template, template_data + ) + normalized_path = str(result.normalized()) + if not os.path.exists(normalized_path): + log.warning(f"Path was not found '{normalized_path}'.") + return None + + return { + "path": normalized_path, + "template": template + } + + def _get_global_config_data( project_name, host_name, @@ -717,7 +744,7 @@ def _get_global_config_data( 2. Custom path to ocio config. 3. Path to 'ocioconfig' representation on product. Name of product can be defined in settings. Product name can be regex but exact match is - always preferred. + always preferred. Fallback can be defined in case no product is found. None is returned when no profile is found, when path @@ -755,19 +782,8 @@ def _get_global_config_data( profile_type = profile["type"] if profile_type in ("builtin_path", "custom_path"): - template = profile[profile_type] - result = StringTemplate.format_strict_template( - template, template_data - ) - normalized_path = str(result.normalized()) - if not os.path.exists(normalized_path): - log.warning(f"Path was not found '{normalized_path}'.") - return None - - return { - "path": normalized_path, - "template": template - } + return _get_config_path_from_profile_data( + profile, profile_type, template_data) # TODO decide if this is the right name for representation repre_name = "ocioconfig" @@ -778,7 +794,21 @@ def _get_global_config_data( return None folder_path = folder_info["path"] - product_name = profile["product_name"] + # Backward compatibility for old projects + # TODO remove in future 0.4.4 onwards + product_name = profile.get("product_name") + # TODO: this should be required after backward compatibility is removed + fallback_data = None + published_product_data = profile.get("published_product") + + if product_name is None and published_product_data is None: + log.warning("Product name or published product is missing.") + return None + + if published_product_data: + product_name = published_product_data["product_name"] + fallback_data = published_product_data["fallback"] + if folder_id is None: folder_entity = ayon_api.get_folder_by_path( project_name, folder_path, fields={"id"} @@ -798,6 +828,13 @@ def _get_global_config_data( ) } if not product_entities_by_name: + # TODO: make this required in future 0.4.4 onwards + if fallback_data: + # in case no product was found we need to use fallback + fallback_type = fallback_data["type"] + return _get_config_path_from_profile_data( + fallback_data, fallback_type, template_data + ) log.debug( f"No product entities were found for folder '{folder_path}' with" f" product name filter '{product_name}'." diff --git a/server/settings/conversion.py b/server/settings/conversion.py index f513738603..b29c827cae 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -4,6 +4,43 @@ from typing import Any from .publish_plugins import DEFAULT_PUBLISH_VALUES +def _convert_imageio_configs_0_4_3(overrides): + """Imageio config settings did change to profiles since 0.4.3.""" + imageio_overrides = overrides.get("imageio") or {} + + # make sure settings are already converted to profiles + if ( + "ocio_config_profiles" not in imageio_overrides + ): + return + + ocio_config_profiles = imageio_overrides["ocio_config_profiles"] + + for inx, profile in enumerate(ocio_config_profiles): + if profile["type"] != "product_name": + continue + + # create new profile + new_profile = { + "type": "published_product", + "published_product": { + "product_name": profile["product_name"], + "fallback": { + "type": "builtin_path", + "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", + }, + }, + "host_names": profile["host_names"], + "task_names": profile["task_names"], + "task_types": profile["task_types"], + "custom_path": profile["custom_path"], + "builtin_path": profile["builtin_path"], + } + + # replace old profile with new profile + ocio_config_profiles[inx] = new_profile + + def _convert_imageio_configs_0_3_1(overrides): """Imageio config settings did change to profiles since 0.3.1. .""" imageio_overrides = overrides.get("imageio") or {} @@ -82,5 +119,6 @@ def convert_settings_overrides( overrides: dict[str, Any], ) -> dict[str, Any]: _convert_imageio_configs_0_3_1(overrides) + _convert_imageio_configs_0_4_3(overrides) _conver_publish_plugins(overrides) return overrides diff --git a/server/settings/main.py b/server/settings/main.py index 0972ccdfb9..09c9bf0065 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -58,7 +58,14 @@ def _ocio_config_profile_types(): return [ {"value": "builtin_path", "label": "AYON built-in OCIO config"}, {"value": "custom_path", "label": "Path to OCIO config"}, - {"value": "product_name", "label": "Published product"}, + {"value": "published_product", "label": "Published product"}, + ] + + +def _fallback_ocio_config_profile_types(): + return [ + {"value": "builtin_path", "label": "AYON built-in OCIO config"}, + {"value": "custom_path", "label": "Path to OCIO config"}, ] @@ -76,6 +83,49 @@ def _ocio_built_in_paths(): ] +class FallbackProductModel(BaseSettingsModel): + _layout = "expanded" + type: str = SettingsField( + title="Fallback config type", + enum_resolver=_fallback_ocio_config_profile_types, + conditionalEnum=True, + default="builtin_path", + description=( + "Type of config which needs to be used in case published " + "product is not found." + ), + ) + builtin_path: str = SettingsField( + "ACES 1.2", + title="Built-in OCIO config", + enum_resolver=_ocio_built_in_paths, + description=( + "AYON ocio addon distributed OCIO config. " + "Activated addon in bundle is required: 'ayon_ocio' >= 1.1.1" + ), + ) + custom_path: str = SettingsField( + "", + title="OCIO config path", + description="Path to OCIO config. Anatomy formatting is supported.", + ) + + +class PublishedProductModel(BaseSettingsModel): + _layout = "expanded" + product_name: str = SettingsField( + "", + title="Product name", + description=( + "Context related published product name to get OCIO config from. " + "Partial match is supported via use of regex expression." + ), + ) + fallback: FallbackProductModel = SettingsField( + default_factory=FallbackProductModel, + ) + + class CoreImageIOConfigProfilesModel(BaseSettingsModel): _layout = "expanded" host_names: list[str] = SettingsField( @@ -102,19 +152,19 @@ class CoreImageIOConfigProfilesModel(BaseSettingsModel): "ACES 1.2", title="Built-in OCIO config", enum_resolver=_ocio_built_in_paths, + description=( + "AYON ocio addon distributed OCIO config. " + "Activated addon in bundle is required: 'ayon_ocio' >= 1.1.1" + ), ) custom_path: str = SettingsField( "", title="OCIO config path", description="Path to OCIO config. Anatomy formatting is supported.", ) - product_name: str = SettingsField( - "", - title="Product name", - description=( - "Published product name to get OCIO config from. " - "Partial match is supported." - ), + published_product: PublishedProductModel = SettingsField( + default_factory=PublishedProductModel, + title="Published product", ) @@ -294,7 +344,14 @@ DEFAULT_VALUES = { "type": "builtin_path", "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", "custom_path": "", - "product_name": "", + "published_product": { + "product_name": "", + "fallback": { + "type": "builtin_path", + "builtin_path": "ACES 1.2", + "custom_path": "" + } + } } ], "file_rules": { From 9375b8bee2985f251e5aad1b6b4309caa1c4c5d1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 31 Jul 2024 13:57:47 +0200 Subject: [PATCH 031/216] Update version references for future removal and conversion functions in colorspace and conversion modules. - Update version references to 0.4.5 for future removal in colorspace module. - Update function name and version reference to 0.4.4 for imageio config conversion in the conversion module. --- client/ayon_core/pipeline/colorspace.py | 4 ++-- server/settings/conversion.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 1986e2d407..106d43d55a 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -795,7 +795,7 @@ def _get_global_config_data( folder_path = folder_info["path"] # Backward compatibility for old projects - # TODO remove in future 0.4.4 onwards + # TODO remove in future 0.4.5 onwards product_name = profile.get("product_name") # TODO: this should be required after backward compatibility is removed fallback_data = None @@ -828,7 +828,7 @@ def _get_global_config_data( ) } if not product_entities_by_name: - # TODO: make this required in future 0.4.4 onwards + # TODO: make this required in future 0.4.5 onwards if fallback_data: # in case no product was found we need to use fallback fallback_type = fallback_data["type"] diff --git a/server/settings/conversion.py b/server/settings/conversion.py index b29c827cae..d99483d21f 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -4,8 +4,8 @@ from typing import Any from .publish_plugins import DEFAULT_PUBLISH_VALUES -def _convert_imageio_configs_0_4_3(overrides): - """Imageio config settings did change to profiles since 0.4.3.""" +def _convert_imageio_configs_0_4_4(overrides): + """Imageio config settings did change to profiles since 0.4.4.""" imageio_overrides = overrides.get("imageio") or {} # make sure settings are already converted to profiles @@ -119,6 +119,6 @@ def convert_settings_overrides( overrides: dict[str, Any], ) -> dict[str, Any]: _convert_imageio_configs_0_3_1(overrides) - _convert_imageio_configs_0_4_3(overrides) + _convert_imageio_configs_0_4_4(overrides) _conver_publish_plugins(overrides) return overrides From 1e026d8fcb10e053615b1795edc5157600935e32 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 1 Aug 2024 15:50:45 +0200 Subject: [PATCH 032/216] Refactor config data retrieval logic in colorspace module - Removed redundant folder info handling - Added fallback mechanism for missing folder info --- client/ayon_core/pipeline/colorspace.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 106d43d55a..57a36286db 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -788,12 +788,6 @@ def _get_global_config_data( # TODO decide if this is the right name for representation repre_name = "ocioconfig" - folder_info = template_data.get("folder") - if not folder_info: - log.warning("Folder info is missing.") - return None - folder_path = folder_info["path"] - # Backward compatibility for old projects # TODO remove in future 0.4.5 onwards product_name = profile.get("product_name") @@ -809,6 +803,23 @@ def _get_global_config_data( product_name = published_product_data["product_name"] fallback_data = published_product_data["fallback"] + folder_info = template_data.get("folder") + if not folder_info: + log.warning("Folder info is missing.") + + # TODO: this fallback should be required after backward compatibility + # is removed + if fallback_data: + log.info("Using fallback data for ocio config path.") + # in case no product was found we need to use fallback + fallback_type = fallback_data["type"] + return _get_config_path_from_profile_data( + fallback_data, fallback_type, template_data + ) + return None + + folder_path = folder_info["path"] + if folder_id is None: folder_entity = ayon_api.get_folder_by_path( project_name, folder_path, fields={"id"} @@ -827,6 +838,7 @@ def _get_global_config_data( fields={"id", "name"} ) } + if not product_entities_by_name: # TODO: make this required in future 0.4.5 onwards if fallback_data: @@ -874,6 +886,7 @@ def _get_global_config_data( path = get_representation_path_with_anatomy(repre_entity, anatomy) template = repre_entity["attrib"]["template"] + return { "path": path, "template": template, From f9e0b05bf2dac3f596a9c53f32368219072970dd Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 9 Aug 2024 13:27:05 +0200 Subject: [PATCH 033/216] Refactor fallback handling in colorspace module Improve handling of fallback data for OCIO config path. Simplified logic and error messages for better clarity. --- client/ayon_core/pipeline/colorspace.py | 51 +++++++++---------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 57a36286db..82025fabaf 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -788,35 +788,27 @@ def _get_global_config_data( # TODO decide if this is the right name for representation repre_name = "ocioconfig" - # Backward compatibility for old projects - # TODO remove in future 0.4.5 onwards - product_name = profile.get("product_name") - # TODO: this should be required after backward compatibility is removed - fallback_data = None - published_product_data = profile.get("published_product") + published_product_data = profile["published_product"] + product_name = published_product_data["product_name"] + fallback_data = published_product_data["fallback"] - if product_name is None and published_product_data is None: - log.warning("Product name or published product is missing.") + if product_name == "": + log.error( + "Colorspace OCIO config path cannot be set. " + "Profile is set to published product but `Product name` is empty." + ) return None - if published_product_data: - product_name = published_product_data["product_name"] - fallback_data = published_product_data["fallback"] - folder_info = template_data.get("folder") if not folder_info: log.warning("Folder info is missing.") - # TODO: this fallback should be required after backward compatibility - # is removed - if fallback_data: - log.info("Using fallback data for ocio config path.") - # in case no product was found we need to use fallback - fallback_type = fallback_data["type"] - return _get_config_path_from_profile_data( - fallback_data, fallback_type, template_data - ) - return None + log.info("Using fallback data for ocio config path.") + # in case no product was found we need to use fallback + fallback_type = fallback_data["type"] + return _get_config_path_from_profile_data( + fallback_data, fallback_type, template_data + ) folder_path = folder_info["path"] @@ -840,18 +832,11 @@ def _get_global_config_data( } if not product_entities_by_name: - # TODO: make this required in future 0.4.5 onwards - if fallback_data: - # in case no product was found we need to use fallback - fallback_type = fallback_data["type"] - return _get_config_path_from_profile_data( - fallback_data, fallback_type, template_data - ) - log.debug( - f"No product entities were found for folder '{folder_path}' with" - f" product name filter '{product_name}'." + # in case no product was found we need to use fallback + fallback_type = fallback_data["type"] + return _get_config_path_from_profile_data( + fallback_data, fallback_type, template_data ) - return None # Try to use exact match first, otherwise use first available product product_entity = product_entities_by_name.get(product_name) From d51a04c8ac2b43f2b181709c728e7bda895e7658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Fri, 9 Aug 2024 13:31:25 +0200 Subject: [PATCH 034/216] Update client/ayon_core/pipeline/colorspace.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/pipeline/colorspace.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 82025fabaf..867c3ec22a 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -700,18 +700,19 @@ def get_ocio_config_views(config_path): def _get_config_path_from_profile_data( - data, data_type, template_data) -> dict: + profile, profile_type, template_data +): """Get config path from profile data. Args: - data (dict[str, Any]): Profile data. - data_type (str): Profile type. + profile(dict[str, Any]): Profile data. + profile_type (str): Profile type. template_data (dict[str, Any]): Template data. Returns: dict[str, str]: Config data with path and template. """ - template = data[data_type] + template = profile[profile_type] result = StringTemplate.format_strict_template( template, template_data ) From f87057506a63c12fcc9835e4a093f60da9e1c52c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 9 Aug 2024 13:34:46 +0200 Subject: [PATCH 035/216] adding space --- client/ayon_core/pipeline/colorspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 867c3ec22a..1e6f98f272 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -705,7 +705,7 @@ def _get_config_path_from_profile_data( """Get config path from profile data. Args: - profile(dict[str, Any]): Profile data. + profile (dict[str, Any]): Profile data. profile_type (str): Profile type. template_data (dict[str, Any]): Template data. From cc74f25e7a182363a82f319a97f4a24a61b80c02 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 14 Aug 2024 14:12:24 +0200 Subject: [PATCH 036/216] Provided unique file prefix Limits overwrites from multiple instances --- .../plugins/publish/extract_otio_review.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index be365520c7..8c7719ceb6 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -49,7 +49,6 @@ class ExtractOTIOReview(publish.Extractor): hosts = ["resolve", "hiero", "flame"] # plugin default attributes - temp_file_head = "tempFile." to_width = 1280 to_height = 720 output_ext = ".jpg" @@ -62,6 +61,8 @@ class ExtractOTIOReview(publish.Extractor): make_sequence_collection ) + self.temp_file_head = self._get_unique_file_prefix(instance) + # TODO: convert resulting image sequence to mp4 # get otio clip and other time info from instance clip @@ -491,3 +492,19 @@ class ExtractOTIOReview(publish.Extractor): out_frame_start = self.used_frames[-1] return output_path, out_frame_start + + def _get_unique_file_prefix(self, instance): + """Creates unique human readable file prefix to differentiate. + + Multiple instances might share same temp folder, this will provide + unique prefix for intermediate file for burnins. + """ + folder_path = instance.data["folderPath"] + folder_name = folder_path.split("/")[-1] + folder_path = folder_path.replace("/", "_").lstrip("_") + + file_prefix = f"{folder_path}_{folder_name}." + self.log.debug(f"file_prefix::{file_prefix}") + + return file_prefix + From fe9cef1c8fe931324ac880d4bb68a66e431b84d5 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 22 Aug 2024 23:07:14 +0300 Subject: [PATCH 037/216] Easier settings for ExtractOIIOTranscode --- server/settings/publish_plugins.py | 42 +++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 8ca96432f4..cce1891fda 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -57,7 +57,7 @@ class CollectFramesFixDefModel(BaseSettingsModel): True, title="Show 'Rewrite latest version' toggle" ) - + class ContributionLayersModel(BaseSettingsModel): _layout = "compact" @@ -256,8 +256,8 @@ class ExtractThumbnailModel(BaseSettingsModel): def _extract_oiio_transcoding_type(): return [ - {"value": "colorspace", "label": "Use Colorspace"}, - {"value": "display", "label": "Use Display&View"} + {"value": "use_colorspace", "label": "Use Colorspace"}, + {"value": "use_display_view", "label": "Use Display&View"} ] @@ -266,6 +266,17 @@ class OIIOToolArgumentsModel(BaseSettingsModel): default_factory=list, title="Arguments") +class UseColorspaceModel(BaseSettingsModel): + _layout = "expanded" + colorspace: str = SettingsField("", title="Target Colorspace") + + +class UseDisplayViewModel(BaseSettingsModel): + _layout = "expanded" + display: str = SettingsField("", title="Target Display") + view: str = SettingsField("", title="Target View") + + class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): _layout = "expanded" name: str = SettingsField( @@ -276,13 +287,20 @@ class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): ) extension: str = SettingsField("", title="Extension") transcoding_type: str = SettingsField( - "colorspace", + "use_colorspace", title="Transcoding type", - enum_resolver=_extract_oiio_transcoding_type + enum_resolver=_extract_oiio_transcoding_type, + conditionalEnum=True ) - colorspace: str = SettingsField("", title="Colorspace") - display: str = SettingsField("", title="Display") - view: str = SettingsField("", title="View") + use_colorspace: UseColorspaceModel = SettingsField( + title="Use Colorspace", + default_factory=UseColorspaceModel + ) + use_display_view: UseDisplayViewModel = SettingsField( + title="Use Display&View", + default_factory=UseDisplayViewModel + ) + oiiotool_args: OIIOToolArgumentsModel = SettingsField( default_factory=OIIOToolArgumentsModel, title="OIIOtool arguments") @@ -360,7 +378,7 @@ class ExtractReviewFFmpegModel(BaseSettingsModel): def extract_review_filter_enum(): return [ { - "value": "everytime", + "value": "everytime", # codespell:ignore everytime "label": "Always" }, { @@ -382,7 +400,7 @@ class ExtractReviewFilterModel(BaseSettingsModel): default_factory=list, title="Custom Tags" ) single_frame_filter: str = SettingsField( - "everytime", + "everytime", # codespell:ignore everytime description=( "Use output always / only if input is 1 frame" " image / only if has 2+ frames or is video" @@ -780,7 +798,7 @@ class IntegrateHeroVersionModel(BaseSettingsModel): class CleanUpModel(BaseSettingsModel): _isGroup = True - paterns: list[str] = SettingsField( + paterns: list[str] = SettingsField( # codespell:ignore paterns default_factory=list, title="Patterns (regex)" ) @@ -1200,7 +1218,7 @@ DEFAULT_PUBLISH_VALUES = { "use_hardlinks": False }, "CleanUp": { - "paterns": [], + "paterns": [], # codespell:ignore paterns "remove_temp_renders": False }, "CleanUpFarm": { From 00d7f6c378225b7643450605587bab0724243a3a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 22 Aug 2024 23:08:42 +0300 Subject: [PATCH 038/216] adopt to the new settings --- .../plugins/publish/extract_color_transcode.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_color_transcode.py b/client/ayon_core/plugins/publish/extract_color_transcode.py index a28a761e7e..c5f90e4c99 100644 --- a/client/ayon_core/plugins/publish/extract_color_transcode.py +++ b/client/ayon_core/plugins/publish/extract_color_transcode.py @@ -122,12 +122,15 @@ class ExtractOIIOTranscode(publish.Extractor): transcoding_type = output_def["transcoding_type"] target_colorspace = view = display = None - if transcoding_type == "colorspace": - target_colorspace = (output_def["colorspace"] or + # NOTE: we use colorspace_data as the fallback values for the target colorspace. + if transcoding_type == "use_colorspace": + # TODO: Should we fallback to the colorspace (which used as source above) ? + # or should we compute the target colorspace from current view and display ? + target_colorspace = (output_def["use_colorspace"]["colorspace"] or colorspace_data.get("colorspace")) - else: - view = output_def["view"] or colorspace_data.get("view") - display = (output_def["display"] or + elif transcoding_type == "use_display_view": + view = output_def["use_display_view"]["view"] or colorspace_data.get("view") + display = (output_def["use_display_view"]["display"] or colorspace_data.get("display")) # both could be already collected by DCC, @@ -192,7 +195,7 @@ class ExtractOIIOTranscode(publish.Extractor): new_repre["files"] = new_repre["files"][0] # If the source representation has "review" tag, but its not - # part of the output defintion tags, then both the + # part of the output definition tags, then both the # representations will be transcoded in ExtractReview and # their outputs will clash in integration. if "review" in repre.get("tags", []): From 050f816ce4cca5c314c8cb19bf2e3af8088f34d7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:35:19 +0200 Subject: [PATCH 039/216] controller has new method 'get_error_info' --- client/ayon_core/tools/publisher/abstract.py | 9 ++- client/ayon_core/tools/publisher/control.py | 4 +- .../tools/publisher/models/__init__.py | 3 +- .../tools/publisher/models/publish.py | 58 ++++++++++++++----- .../tools/publisher/widgets/publish_frame.py | 6 +- 5 files changed, 53 insertions(+), 27 deletions(-) diff --git a/client/ayon_core/tools/publisher/abstract.py b/client/ayon_core/tools/publisher/abstract.py index 362fa38882..78f7756c96 100644 --- a/client/ayon_core/tools/publisher/abstract.py +++ b/client/ayon_core/tools/publisher/abstract.py @@ -26,7 +26,7 @@ from ayon_core.tools.common_models import ( ) if TYPE_CHECKING: - from .models import CreatorItem + from .models import CreatorItem, PublishErrorInfo class CardMessageTypes: @@ -537,14 +537,13 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): pass @abstractmethod - def get_publish_error_msg(self) -> Union[str, None]: + def get_publish_error_info(self) -> Union["PublishErrorInfo", None]: """Current error message which cause fail of publishing. Returns: - Union[str, None]: Message which will be showed to artist or - None. - """ + Union[PublishErrorInfo, None]: Error info or None. + """ pass @abstractmethod diff --git a/client/ayon_core/tools/publisher/control.py b/client/ayon_core/tools/publisher/control.py index 257b45de08..5c76e01f0c 100644 --- a/client/ayon_core/tools/publisher/control.py +++ b/client/ayon_core/tools/publisher/control.py @@ -493,8 +493,8 @@ class PublisherController( def get_publish_progress(self): return self._publish_model.get_progress() - def get_publish_error_msg(self): - return self._publish_model.get_error_msg() + def get_publish_error_info(self): + return self._publish_model.get_error_info() def get_publish_report(self): return self._publish_model.get_publish_report() diff --git a/client/ayon_core/tools/publisher/models/__init__.py b/client/ayon_core/tools/publisher/models/__init__.py index bd593be29b..07f061deaa 100644 --- a/client/ayon_core/tools/publisher/models/__init__.py +++ b/client/ayon_core/tools/publisher/models/__init__.py @@ -1,5 +1,5 @@ from .create import CreateModel, CreatorItem -from .publish import PublishModel +from .publish import PublishModel, PublishErrorInfo __all__ = ( @@ -7,4 +7,5 @@ __all__ = ( "CreatorItem", "PublishModel", + "PublishErrorInfo", ) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index a60ef69fac..e15f4f6080 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -23,6 +23,40 @@ PUBLISH_EVENT_SOURCE = "publisher.publish.model" PLUGIN_ORDER_OFFSET = 0.5 +class PublishErrorInfo: + def __init__(self, description, title, detail): + self.description = description + self.title = title + self.detail = detail + + def __eq__(self, other): + if not isinstance(other, PublishErrorInfo): + return False + return ( + self.description == other.description + and self.title == other.title + and self.detail == other.detail + ) + + def __ne__(self, other): + return not self.__eq__(other) + + @classmethod + def from_exception(cls, exc): + title = "This is not your fault" + detail = ( + "Please report the error to your pipeline support" + " using one of the options below." + ) + if isinstance(exc, KnownPublishError): + msg = str(exc) + else: + msg = ( + "Something went wrong. Send report" + " to your supervisor or Ynput team." + ) + return cls(msg, title, detail) + class PublishReportMaker: """Report for single publishing process. @@ -801,7 +835,7 @@ class PublishModel: self._publish_comment_is_set: bool = False # Any other exception that happened during publishing - self._publish_error_msg: Optional[str] = None + self._publish_error_info: Optional[PublishErrorInfo] = None # Publishing is in progress self._publish_is_running: bool = False # Publishing is over validation order @@ -851,7 +885,7 @@ class PublishModel: self._publish_comment_is_set = False self._publish_has_started = False - self._set_publish_error_msg(None) + self._set_publish_error_info(None) self._set_progress(0) self._set_is_running(False) self._set_has_validated(False) @@ -977,8 +1011,8 @@ class PublishModel: def get_validation_errors(self) -> PublishValidationErrorsReport: return self._publish_validation_errors.create_report() - def get_error_msg(self) -> Optional[str]: - return self._publish_error_msg + def get_error_info(self) -> Optional[PublishErrorInfo]: + return self._publish_error_info def set_comment(self, comment: str): # Ignore change of comment when publishing started @@ -1077,9 +1111,9 @@ class PublishModel: {"value": value} ) - def _set_publish_error_msg(self, value: Optional[str]): - if self._publish_error_msg != value: - self._publish_error_msg = value + def _set_publish_error_info(self, value: Optional[PublishErrorInfo]): + if self._publish_error_info != value: + self._publish_error_info = value self._emit_event( "publish.publish_error.changed", {"value": value} @@ -1234,14 +1268,8 @@ class PublishModel: self._add_validation_error(result) else: - if isinstance(exception, KnownPublishError): - msg = str(exception) - else: - msg = ( - "Something went wrong. Send report" - " to your supervisor or Ynput team." - ) - self._set_publish_error_msg(msg) + error_info = PublishErrorInfo.from_exception(exception) + self._set_publish_error_info(error_info) self._set_is_crashed(True) result["is_validation_error"] = has_validation_error diff --git a/client/ayon_core/tools/publisher/widgets/publish_frame.py b/client/ayon_core/tools/publisher/widgets/publish_frame.py index 6eaeb6daf2..d9a9e501ef 100644 --- a/client/ayon_core/tools/publisher/widgets/publish_frame.py +++ b/client/ayon_core/tools/publisher/widgets/publish_frame.py @@ -411,10 +411,8 @@ class PublishFrame(QtWidgets.QWidget): """Show error message to artist on publish crash.""" self._set_main_label("Error happened") - - self._message_label_top.setText( - self._controller.get_publish_error_msg() - ) + error_info = self._controller.get_publish_error_info() + self._message_label_top.setText(error_info.description) self._set_success_property(1) From 830dd068696dc2651f496d97d7fb3c16a335ada9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:39:22 +0200 Subject: [PATCH 040/216] added new 'PublishArtistError' --- client/ayon_core/pipeline/__init__.py | 2 + client/ayon_core/pipeline/publish/__init__.py | 2 + .../pipeline/publish/publish_plugins.py | 37 +++++++++++++------ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/client/ayon_core/pipeline/__init__.py b/client/ayon_core/pipeline/__init__.py index 8fd00ee6b6..513dd10897 100644 --- a/client/ayon_core/pipeline/__init__.py +++ b/client/ayon_core/pipeline/__init__.py @@ -51,6 +51,7 @@ from .load import ( ) from .publish import ( + PublishArtistError, PublishValidationError, PublishXmlValidationError, KnownPublishError, @@ -164,6 +165,7 @@ __all__ = ( "get_repres_contexts", # --- Publish --- + "PublishArtistError", "PublishValidationError", "PublishXmlValidationError", "KnownPublishError", diff --git a/client/ayon_core/pipeline/publish/__init__.py b/client/ayon_core/pipeline/publish/__init__.py index ab19b6e360..cf07d47e9a 100644 --- a/client/ayon_core/pipeline/publish/__init__.py +++ b/client/ayon_core/pipeline/publish/__init__.py @@ -9,6 +9,7 @@ from .publish_plugins import ( AbstractMetaInstancePlugin, AbstractMetaContextPlugin, + PublishArtistError, PublishValidationError, PublishXmlValidationError, KnownPublishError, @@ -62,6 +63,7 @@ __all__ = ( "AbstractMetaInstancePlugin", "AbstractMetaContextPlugin", + "PublishArtistError", "PublishValidationError", "PublishXmlValidationError", "KnownPublishError", diff --git a/client/ayon_core/pipeline/publish/publish_plugins.py b/client/ayon_core/pipeline/publish/publish_plugins.py index 6b1984d92b..ababe1da1e 100644 --- a/client/ayon_core/pipeline/publish/publish_plugins.py +++ b/client/ayon_core/pipeline/publish/publish_plugins.py @@ -25,27 +25,40 @@ class AbstractMetaContextPlugin(ABCMeta, ExplicitMetaPlugin): pass -class PublishValidationError(Exception): - """Validation error happened during publishing. +class PublishArtistError(Exception): + """Publishing crashed because of known error. - This exception should be used when validation publishing failed. - - Has additional UI specific attributes that may be handy for artist. + Message will be shown in UI for artist. Args: - message(str): Message of error. Short explanation an issue. - title(str): Title showed in UI. All instances are grouped under - single title. - description(str): Detailed description of an error. It is possible - to use Markdown syntax. - """ + message (str): Message of error. Short explanation an issue. + title (Optional[str]): Title showed in UI. + description (Optional[str]): Detailed description of an error. + It is possible to use Markdown syntax. + """ def __init__(self, message, title=None, description=None, detail=None): self.message = message self.title = title self.description = description or message self.detail = detail - super(PublishValidationError, self).__init__(message) + super().__init__(message) + + +class PublishValidationError(PublishArtistError): + """Validation error happened during publishing. + + This exception should be used when validation publishing failed. + + Publishing does not stop during validation order if this + exception is raised. + + Has additional UI specific attributes that may be handy for artist. + + Argument 'title' is used to group errors. + + """ + pass class PublishXmlValidationError(PublishValidationError): From f5c331bcb982b20ed5bb02b97ceb88e851a1276a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:44:08 +0200 Subject: [PATCH 041/216] change docstring of KnownPublishError --- client/ayon_core/pipeline/__init__.py | 4 ++-- client/ayon_core/pipeline/publish/__init__.py | 6 ++++-- .../pipeline/publish/publish_plugins.py | 17 ++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/pipeline/__init__.py b/client/ayon_core/pipeline/__init__.py index 513dd10897..cb9d4ee46a 100644 --- a/client/ayon_core/pipeline/__init__.py +++ b/client/ayon_core/pipeline/__init__.py @@ -51,10 +51,10 @@ from .load import ( ) from .publish import ( + KnownPublishError, PublishArtistError, PublishValidationError, PublishXmlValidationError, - KnownPublishError, AYONPyblishPluginMixin, OpenPypePyblishPluginMixin, OptionalPyblishPluginMixin, @@ -165,10 +165,10 @@ __all__ = ( "get_repres_contexts", # --- Publish --- + "KnownPublishError", "PublishArtistError", "PublishValidationError", "PublishXmlValidationError", - "KnownPublishError", "AYONPyblishPluginMixin", "OpenPypePyblishPluginMixin", "OptionalPyblishPluginMixin", diff --git a/client/ayon_core/pipeline/publish/__init__.py b/client/ayon_core/pipeline/publish/__init__.py index cf07d47e9a..3f0bc0bb85 100644 --- a/client/ayon_core/pipeline/publish/__init__.py +++ b/client/ayon_core/pipeline/publish/__init__.py @@ -9,10 +9,11 @@ from .publish_plugins import ( AbstractMetaInstancePlugin, AbstractMetaContextPlugin, + KnownPublishError, PublishArtistError, PublishValidationError, PublishXmlValidationError, - KnownPublishError, + AYONPyblishPluginMixin, OpenPypePyblishPluginMixin, OptionalPyblishPluginMixin, @@ -63,10 +64,11 @@ __all__ = ( "AbstractMetaInstancePlugin", "AbstractMetaContextPlugin", + "KnownPublishError", "PublishArtistError", "PublishValidationError", "PublishXmlValidationError", - "KnownPublishError", + "AYONPyblishPluginMixin", "OpenPypePyblishPluginMixin", "OptionalPyblishPluginMixin", diff --git a/client/ayon_core/pipeline/publish/publish_plugins.py b/client/ayon_core/pipeline/publish/publish_plugins.py index ababe1da1e..70040d7395 100644 --- a/client/ayon_core/pipeline/publish/publish_plugins.py +++ b/client/ayon_core/pipeline/publish/publish_plugins.py @@ -25,6 +25,14 @@ class AbstractMetaContextPlugin(ABCMeta, ExplicitMetaPlugin): pass +class KnownPublishError(Exception): + """Publishing crashed because of known error. + + Artist can't affect source of the error. + """ + pass + + class PublishArtistError(Exception): """Publishing crashed because of known error. @@ -81,15 +89,6 @@ class PublishXmlValidationError(PublishValidationError): ) -class KnownPublishError(Exception): - """Publishing crashed because of known error. - - Message will be shown in UI for artist. - """ - - pass - - class AYONPyblishPluginMixin: # TODO # executable_in_thread = False From f45af87787a8f06e656ddbbb24df043d940271f4 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:48:00 +0200 Subject: [PATCH 042/216] handle PublishArtistError in a different way --- client/ayon_core/tools/publisher/models/publish.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index e15f4f6080..4afcc5772d 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -15,7 +15,10 @@ from ayon_core.pipeline import ( OptionalPyblishPluginMixin, ) from ayon_core.pipeline.plugin_discover import DiscoverResult -from ayon_core.pipeline.publish import get_publish_instance_label +from ayon_core.pipeline.publish import ( + get_publish_instance_label, + PublishArtistError, +) from ayon_core.tools.publisher.abstract import AbstractPublisherBackend PUBLISH_EVENT_SOURCE = "publisher.publish.model" @@ -43,6 +46,12 @@ class PublishErrorInfo: @classmethod def from_exception(cls, exc): + if isinstance(exc, PublishArtistError): + return cls( + exc.description or exc.message, + title=exc.title, + detail=exc.detail, + ) title = "This is not your fault" detail = ( "Please report the error to your pipeline support" From 90bc20a783d8a95ee9d8a9eb9c325970153c268f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:48:20 +0200 Subject: [PATCH 043/216] modified crash widget to show error info --- .../tools/publisher/widgets/report_page.py | 176 +++++++++++------- 1 file changed, 110 insertions(+), 66 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index ecf1376ec0..f63b58eab2 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1454,6 +1454,73 @@ class InstancesLogsView(QtWidgets.QFrame): self._update_instances() +class ErrorDetailWidget(QtWidgets.QWidget): + def __init__(self, parent): + super().__init__(parent) + + error_detail_top = ClickableFrame(self) + + error_detail_expand_btn = ClassicExpandBtn(error_detail_top) + error_detail_expand_label = QtWidgets.QLabel( + "Details", error_detail_top) + + line_widget = SeparatorWidget(1, parent=error_detail_top) + + error_detail_top_l = QtWidgets.QHBoxLayout(error_detail_top) + error_detail_top_l.setContentsMargins(0, 0, 10, 0) + error_detail_top_l.addWidget(error_detail_expand_btn, 0) + error_detail_top_l.addWidget(error_detail_expand_label, 0) + error_detail_top_l.addWidget(line_widget, 1) + + error_detail_input = ExpandingTextEdit(self) + error_detail_input.setObjectName("InfoText") + error_detail_input.setTextInteractionFlags( + QtCore.Qt.TextBrowserInteraction + ) + + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.setContentsMargins(0, 0, 0, 0) + main_layout.addWidget(error_detail_top, 0) + main_layout.addWidget(error_detail_input, 0) + main_layout.addStretch(1) + + error_detail_top.clicked.connect(self._on_detail_toggle) + + error_detail_input.setVisible(not error_detail_expand_btn.collapsed) + + self._error_detail_top = error_detail_top + self._error_detail_expand_btn = error_detail_expand_btn + self._error_detail_input = error_detail_input + + def set_detail(self, detail): + if not detail: + self._set_visible_inputs(False) + return + + if commonmark: + self._error_detail_input.setHtml( + commonmark.commonmark(detail) + ) + + elif hasattr(self._error_detail_input, "setMarkdown"): + self._error_detail_input.setMarkdown(detail) + + else: + self._error_detail_input.setText(detail) + + self._set_visible_inputs(True) + + def _set_visible_inputs(self, visible): + self._error_detail_top.setVisible(visible) + self._error_detail_input.setVisible(visible) + + def _on_detail_toggle(self): + self._error_detail_expand_btn.set_collapsed() + self._error_detail_input.setVisible( + not self._error_detail_expand_btn.collapsed + ) + + class CrashWidget(QtWidgets.QWidget): """Widget shown when publishing crashes. @@ -1466,20 +1533,16 @@ class CrashWidget(QtWidgets.QWidget): ): super().__init__(parent) - main_label = QtWidgets.QLabel("This is not your fault", self) - main_label.setAlignment(QtCore.Qt.AlignCenter) - main_label.setObjectName("PublishCrashMainLabel") + title_label = QtWidgets.QLabel("", self) + title_label.setAlignment(QtCore.Qt.AlignCenter) + title_label.setObjectName("PublishCrashMainLabel") - report_label = QtWidgets.QLabel( - ( - "Please report the error to your pipeline support" - " using one of the options below." - ), - self - ) - report_label.setAlignment(QtCore.Qt.AlignCenter) - report_label.setWordWrap(True) - report_label.setObjectName("PublishCrashReportLabel") + description_label = QtWidgets.QLabel("", self) + description_label.setAlignment(QtCore.Qt.AlignCenter) + description_label.setWordWrap(True) + description_label.setObjectName("PublishCrashReportLabel") + + detail_widget = ErrorDetailWidget(self) btns_widget = QtWidgets.QWidget(self) copy_clipboard_btn = QtWidgets.QPushButton( @@ -1488,6 +1551,8 @@ class CrashWidget(QtWidgets.QWidget): "Save to disk", btns_widget) btns_layout = QtWidgets.QHBoxLayout(btns_widget) + btns_layout.setContentsMargins(0, 0, 0, 0) + btns_layout.setSpacing(0) btns_layout.addStretch(1) btns_layout.addWidget(copy_clipboard_btn, 0) btns_layout.addSpacing(20) @@ -1495,19 +1560,38 @@ class CrashWidget(QtWidgets.QWidget): btns_layout.addStretch(1) layout = QtWidgets.QVBoxLayout(self) - layout.addStretch(1) - layout.addWidget(main_label, 0) + layout.setContentsMargins(5, 5, 5, 5) + layout.setSpacing(0) layout.addSpacing(20) - layout.addWidget(report_label, 0) + layout.addWidget(title_label, 0) layout.addSpacing(20) + layout.addWidget(description_label, 0) + layout.addSpacing(20) + layout.addWidget(detail_widget, 1) + layout.addSpacing(10) layout.addWidget(btns_widget, 0) - layout.addStretch(2) + layout.addSpacing(10) copy_clipboard_btn.clicked.connect(self._on_copy_to_clipboard) save_to_disk_btn.clicked.connect(self._on_save_to_disk_click) + self._title_label = title_label + self._description_label = description_label + self._detail_widget = detail_widget self._controller: AbstractPublisherFrontend = controller + def update_error_info(self): + error_info = self._controller.get_publish_error_info() + if error_info is None: + self._title_label.setText("Placeholder title") + self._description_label.setText("A bug happened if you see this") + self._detail_widget.set_detail(None) + return + + self._title_label.setText(error_info.title) + self._description_label.setText(error_info.description) + self._detail_widget.set_detail(error_info.detail) + def _on_copy_to_clipboard(self): self._controller.emit_event( "copy_report.request", {}, "report_page") @@ -1517,7 +1601,7 @@ class CrashWidget(QtWidgets.QWidget): "export_report.request", {}, "report_page") -class ErrorDetailsWidget(QtWidgets.QWidget): +class PublishFailWidget(QtWidgets.QWidget): def __init__(self, parent): super().__init__(parent) @@ -1529,35 +1613,7 @@ class ErrorDetailsWidget(QtWidgets.QWidget): QtCore.Qt.TextBrowserInteraction ) - # Error 'Details' widget -> Collapsible - error_details_widget = QtWidgets.QWidget(inputs_widget) - - error_details_top = ClickableFrame(error_details_widget) - - error_details_expand_btn = ClassicExpandBtn(error_details_top) - error_details_expand_label = QtWidgets.QLabel( - "Details", error_details_top) - - line_widget = SeparatorWidget(1, parent=error_details_top) - - error_details_top_l = QtWidgets.QHBoxLayout(error_details_top) - error_details_top_l.setContentsMargins(0, 0, 10, 0) - error_details_top_l.addWidget(error_details_expand_btn, 0) - error_details_top_l.addWidget(error_details_expand_label, 0) - error_details_top_l.addWidget(line_widget, 1) - - error_details_input = ExpandingTextEdit(error_details_widget) - error_details_input.setObjectName("InfoText") - error_details_input.setTextInteractionFlags( - QtCore.Qt.TextBrowserInteraction - ) - error_details_input.setVisible(not error_details_expand_btn.collapsed) - - error_details_layout = QtWidgets.QVBoxLayout(error_details_widget) - error_details_layout.setContentsMargins(0, 0, 0, 0) - error_details_layout.addWidget(error_details_top, 0) - error_details_layout.addWidget(error_details_input, 0) - error_details_layout.addStretch(1) + error_details_widget = ErrorDetailWidget(inputs_widget) # Description and Details layout inputs_layout = QtWidgets.QVBoxLayout(inputs_widget) @@ -1570,17 +1626,8 @@ class ErrorDetailsWidget(QtWidgets.QWidget): main_layout.setContentsMargins(0, 0, 0, 0) main_layout.addWidget(inputs_widget, 1) - error_details_top.clicked.connect(self._on_detail_toggle) - - self._error_details_widget = error_details_widget self._error_description_input = error_description_input - self._error_details_expand_btn = error_details_expand_btn - self._error_details_input = error_details_input - - def _on_detail_toggle(self): - self._error_details_expand_btn.set_collapsed() - self._error_details_input.setVisible( - not self._error_details_expand_btn.collapsed) + self._error_details_widget = error_details_widget def set_error_item(self, error_item): detail = "" @@ -1589,23 +1636,18 @@ class ErrorDetailsWidget(QtWidgets.QWidget): description = error_item.description or description detail = error_item.detail or detail + self._error_details_widget.set_detail(detail) + if commonmark: self._error_description_input.setHtml( commonmark.commonmark(description) ) - self._error_details_input.setHtml( - commonmark.commonmark(detail) - ) - elif hasattr(self._error_details_input, "setMarkdown"): + elif hasattr(self._error_description_input, "setMarkdown"): self._error_description_input.setMarkdown(description) - self._error_details_input.setMarkdown(detail) else: self._error_description_input.setText(description) - self._error_details_input.setText(detail) - - self._error_details_widget.setVisible(bool(detail)) class ReportsWidget(QtWidgets.QWidget): @@ -1671,7 +1713,7 @@ class ReportsWidget(QtWidgets.QWidget): detail_input_scroll = QtWidgets.QScrollArea(pages_widget) - detail_inputs_widget = ErrorDetailsWidget(detail_input_scroll) + detail_inputs_widget = PublishFailWidget(detail_input_scroll) detail_inputs_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) detail_input_scroll.setWidget(detail_inputs_widget) @@ -1768,6 +1810,8 @@ class ReportsWidget(QtWidgets.QWidget): self._crash_widget.setVisible(is_crashed) self._logs_view.setVisible(not is_crashed) + self._crash_widget.update_error_info() + # Instance view & logs update instance_items = self._get_instance_items() self._instances_view.update_instances(instance_items) From 2c362fb35fa73c35aa017402ded1619291e01d2c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:48:31 +0200 Subject: [PATCH 044/216] removed detail from default behavior --- client/ayon_core/tools/publisher/models/publish.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index 4afcc5772d..020436a466 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -53,10 +53,6 @@ class PublishErrorInfo: detail=exc.detail, ) title = "This is not your fault" - detail = ( - "Please report the error to your pipeline support" - " using one of the options below." - ) if isinstance(exc, KnownPublishError): msg = str(exc) else: @@ -64,7 +60,7 @@ class PublishErrorInfo: "Something went wrong. Send report" " to your supervisor or Ynput team." ) - return cls(msg, title, detail) + return cls(msg, title) class PublishReportMaker: From a1ed54c44db24e9ff797c20eff5a6cb7372a5270 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 13:57:26 +0200 Subject: [PATCH 045/216] added some typehints --- .../tools/publisher/models/publish.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index 020436a466..b01cfb30f9 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -27,12 +27,17 @@ PLUGIN_ORDER_OFFSET = 0.5 class PublishErrorInfo: - def __init__(self, description, title, detail): - self.description = description - self.title = title - self.detail = detail + def __init__( + self, + description: str, + title: Optional[str], + detail: Optional[str] + ): + self.description: str = description + self.title: Optional[str] = title + self.detail: Optional[str] = detail - def __eq__(self, other): + def __eq__(self, other: Any) -> bool: if not isinstance(other, PublishErrorInfo): return False return ( @@ -41,11 +46,11 @@ class PublishErrorInfo: and self.detail == other.detail ) - def __ne__(self, other): + def __ne__(self, other: Any) -> bool: return not self.__eq__(other) @classmethod - def from_exception(cls, exc): + def from_exception(cls, exc) -> "PublishErrorInfo": if isinstance(exc, PublishArtistError): return cls( exc.description or exc.message, @@ -60,7 +65,7 @@ class PublishErrorInfo: "Something went wrong. Send report" " to your supervisor or Ynput team." ) - return cls(msg, title) + return cls(msg, title, None) class PublishReportMaker: From 82ac6b332ca0aedd28d8b6f6bb162482656a80c7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:11:13 +0200 Subject: [PATCH 046/216] normalize collapse/expand pixmaps --- client/ayon_core/tools/utils/widgets.py | 31 +++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/utils/widgets.py b/client/ayon_core/tools/utils/widgets.py index 73c8819758..4c2b418c41 100644 --- a/client/ayon_core/tools/utils/widgets.py +++ b/client/ayon_core/tools/utils/widgets.py @@ -540,11 +540,38 @@ class ClassicExpandBtnLabel(ExpandBtnLabel): right_arrow_path = get_style_image_path("right_arrow") down_arrow_path = get_style_image_path("down_arrow") + def _normalize_pixmap(self, pixmap): + if pixmap.width() == pixmap.height(): + return pixmap + width = pixmap.width() + height = pixmap.height() + size = max(width, height) + pos_x = 0 + pos_y = 0 + if width > height: + pos_y = (size - height) // 2 + else: + pos_x = (size - width) // 2 + + new_pix = QtGui.QPixmap(size, size) + new_pix.fill(QtCore.Qt.transparent) + painter = QtGui.QPainter(new_pix) + render_hints = ( + QtGui.QPainter.Antialiasing + | QtGui.QPainter.SmoothPixmapTransform + ) + if hasattr(QtGui.QPainter, "HighQualityAntialiasing"): + render_hints |= QtGui.QPainter.HighQualityAntialiasing + painter.setRenderHints(render_hints) + painter.drawPixmap(QtCore.QPoint(pos_x, pos_y), pixmap) + painter.end() + return new_pix + def _create_collapsed_pixmap(self): - return QtGui.QPixmap(self.right_arrow_path) + return self._normalize_pixmap(QtGui.QPixmap(self.right_arrow_path)) def _create_expanded_pixmap(self): - return QtGui.QPixmap(self.down_arrow_path) + return self._normalize_pixmap(QtGui.QPixmap(self.down_arrow_path)) class ClassicExpandBtn(ExpandBtn): From cd6739763c326a888dd1bef7e069340f29f7bc3a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:21:41 +0200 Subject: [PATCH 047/216] fix hiding details --- .../ayon_core/tools/publisher/widgets/report_page.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index f63b58eab2..e9fbd13808 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1486,12 +1486,18 @@ class ErrorDetailWidget(QtWidgets.QWidget): error_detail_top.clicked.connect(self._on_detail_toggle) - error_detail_input.setVisible(not error_detail_expand_btn.collapsed) - self._error_detail_top = error_detail_top self._error_detail_expand_btn = error_detail_expand_btn self._error_detail_input = error_detail_input + def showEvent(self, event): + super().showEvent(event) + # Calling this in __init__ does not seem to propagate the visibility + # correctly + self._error_detail_input.setVisible( + not self._error_detail_expand_btn.collapsed + ) + def set_detail(self, detail): if not detail: self._set_visible_inputs(False) From 10684239e936ea88ade6c60d0e5c8e0adca6861f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:21:55 +0200 Subject: [PATCH 048/216] added line at the start of details too (shorter) --- client/ayon_core/tools/publisher/widgets/report_page.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index e9fbd13808..09b722ea54 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1460,17 +1460,19 @@ class ErrorDetailWidget(QtWidgets.QWidget): error_detail_top = ClickableFrame(self) + line_l_widget = SeparatorWidget(1, parent=error_detail_top) error_detail_expand_btn = ClassicExpandBtn(error_detail_top) error_detail_expand_label = QtWidgets.QLabel( "Details", error_detail_top) - line_widget = SeparatorWidget(1, parent=error_detail_top) + line_r_widget = SeparatorWidget(1, parent=error_detail_top) error_detail_top_l = QtWidgets.QHBoxLayout(error_detail_top) error_detail_top_l.setContentsMargins(0, 0, 10, 0) + error_detail_top_l.addWidget(line_l_widget, 1) error_detail_top_l.addWidget(error_detail_expand_btn, 0) error_detail_top_l.addWidget(error_detail_expand_label, 0) - error_detail_top_l.addWidget(line_widget, 1) + error_detail_top_l.addWidget(line_r_widget, 9) error_detail_input = ExpandingTextEdit(self) error_detail_input.setObjectName("InfoText") From 71623cd0bdbc2bf5aaa378b455d042dc95d6d27a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 14:32:52 +0200 Subject: [PATCH 049/216] fill title if is not avaialble in exception --- client/ayon_core/tools/publisher/models/publish.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index b01cfb30f9..7fc4ca8bb4 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -51,13 +51,13 @@ class PublishErrorInfo: @classmethod def from_exception(cls, exc) -> "PublishErrorInfo": + title = "This is not your fault" if isinstance(exc, PublishArtistError): return cls( exc.description or exc.message, - title=exc.title, + title=exc.title or title, detail=exc.detail, ) - title = "This is not your fault" if isinstance(exc, KnownPublishError): msg = str(exc) else: From 47e921ac43cd51c684efff8da9538b6d1ef977e7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 15:31:15 +0200 Subject: [PATCH 050/216] renamed 'PublishArtistError' to 'PublishError' --- client/ayon_core/pipeline/__init__.py | 4 ++-- client/ayon_core/pipeline/publish/__init__.py | 4 ++-- client/ayon_core/pipeline/publish/publish_plugins.py | 4 ++-- client/ayon_core/tools/publisher/models/publish.py | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/pipeline/__init__.py b/client/ayon_core/pipeline/__init__.py index cb9d4ee46a..e17ef66557 100644 --- a/client/ayon_core/pipeline/__init__.py +++ b/client/ayon_core/pipeline/__init__.py @@ -52,7 +52,7 @@ from .load import ( from .publish import ( KnownPublishError, - PublishArtistError, + PublishError, PublishValidationError, PublishXmlValidationError, AYONPyblishPluginMixin, @@ -166,7 +166,7 @@ __all__ = ( # --- Publish --- "KnownPublishError", - "PublishArtistError", + "PublishError", "PublishValidationError", "PublishXmlValidationError", "AYONPyblishPluginMixin", diff --git a/client/ayon_core/pipeline/publish/__init__.py b/client/ayon_core/pipeline/publish/__init__.py index 3f0bc0bb85..80671a43ac 100644 --- a/client/ayon_core/pipeline/publish/__init__.py +++ b/client/ayon_core/pipeline/publish/__init__.py @@ -10,7 +10,7 @@ from .publish_plugins import ( AbstractMetaContextPlugin, KnownPublishError, - PublishArtistError, + PublishError, PublishValidationError, PublishXmlValidationError, @@ -65,7 +65,7 @@ __all__ = ( "AbstractMetaContextPlugin", "KnownPublishError", - "PublishArtistError", + "PublishError", "PublishValidationError", "PublishXmlValidationError", diff --git a/client/ayon_core/pipeline/publish/publish_plugins.py b/client/ayon_core/pipeline/publish/publish_plugins.py index 70040d7395..4e7c5900c7 100644 --- a/client/ayon_core/pipeline/publish/publish_plugins.py +++ b/client/ayon_core/pipeline/publish/publish_plugins.py @@ -33,7 +33,7 @@ class KnownPublishError(Exception): pass -class PublishArtistError(Exception): +class PublishError(Exception): """Publishing crashed because of known error. Message will be shown in UI for artist. @@ -53,7 +53,7 @@ class PublishArtistError(Exception): super().__init__(message) -class PublishValidationError(PublishArtistError): +class PublishValidationError(PublishError): """Validation error happened during publishing. This exception should be used when validation publishing failed. diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index 7fc4ca8bb4..e0ceea825a 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -17,7 +17,7 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.plugin_discover import DiscoverResult from ayon_core.pipeline.publish import ( get_publish_instance_label, - PublishArtistError, + PublishError, ) from ayon_core.tools.publisher.abstract import AbstractPublisherBackend @@ -52,7 +52,7 @@ class PublishErrorInfo: @classmethod def from_exception(cls, exc) -> "PublishErrorInfo": title = "This is not your fault" - if isinstance(exc, PublishArtistError): + if isinstance(exc, PublishError): return cls( exc.description or exc.message, title=exc.title or title, From 4875cbe67f6f35cf7d4b169eba94772371b6b79a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:20:41 +0200 Subject: [PATCH 051/216] added deprecation warning --- client/ayon_core/pipeline/publish/publish_plugins.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/ayon_core/pipeline/publish/publish_plugins.py b/client/ayon_core/pipeline/publish/publish_plugins.py index 4e7c5900c7..d8ed4ec10c 100644 --- a/client/ayon_core/pipeline/publish/publish_plugins.py +++ b/client/ayon_core/pipeline/publish/publish_plugins.py @@ -29,6 +29,10 @@ class KnownPublishError(Exception): """Publishing crashed because of known error. Artist can't affect source of the error. + + Deprecated: + Please use `PublishError` instead. Marked as deprecated 24/09/02. + """ pass From c70a44f1f4ad784cdfe689e7941d0b4e73c17a43 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 2 Sep 2024 17:11:31 +0200 Subject: [PATCH 052/216] updated readme --- client/ayon_core/pipeline/publish/README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/pipeline/publish/README.md b/client/ayon_core/pipeline/publish/README.md index ee2124dfd3..316a0ee0f9 100644 --- a/client/ayon_core/pipeline/publish/README.md +++ b/client/ayon_core/pipeline/publish/README.md @@ -4,17 +4,19 @@ AYON is using `pyblish` for publishing process which is a little bit extented an ## Exceptions AYON define few specific exceptions that should be used in publish plugins. +### Publish error +Exception `PublishError` can be raised on known error. The message is shown to artist. +- **message** Error message. +- **title** Short description of error (2-5 words). Title can be used for grouping of exceptions per plugin. +- **description** Override of 'message' for UI, you can add markdown and html. By default, is filled with 'message'. +- **detail** Additional detail message that is hidden under collapsed component. + +Arguments `title`, `description` and `detail` are optional. Title is filled with generic message "This is not your fault" if is not passed. + ### Validation exception Validation plugins should raise `PublishValidationError` to show to an artist what's wrong and give him actions to fix it. The exception says that error happened in plugin can be fixed by artist himself (with or without action on plugin). Any other errors will stop publishing immediately. Exception `PublishValidationError` raised after validation order has same effect as any other exception. -Exception `PublishValidationError` 3 arguments: -- **message** Which is not used in UI but for headless publishing. -- **title** Short description of error (2-5 words). Title is used for grouping of exceptions per plugin. -- **description** Detailed description of happened issue where markdown and html can be used. - - -### Known errors -When there is a known error that can't be fixed by user (e.g. can't connect to deadline service, etc.) `KnownPublishError` should be raise. The only difference is that it's message is shown in UI to artist otherwise a neutral message without context is shown. +Exception expect same arguments as `PublishError`. Value of `title` is filled with plugin label if is not passed. ## Plugin extension Publish plugins can be extended by additional logic when inherits from `AYONPyblishPluginMixin` which can be used as mixin (additional inheritance of class). From d90310079cbd7a81a032be3f3d50f7346805ff76 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 3 Sep 2024 15:13:36 +0300 Subject: [PATCH 053/216] refactor settings names --- .../plugins/publish/extract_color_transcode.py | 15 +++++++++------ server/settings/publish_plugins.py | 18 +++++------------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_color_transcode.py b/client/ayon_core/plugins/publish/extract_color_transcode.py index c5f90e4c99..77ab6d0428 100644 --- a/client/ayon_core/plugins/publish/extract_color_transcode.py +++ b/client/ayon_core/plugins/publish/extract_color_transcode.py @@ -123,15 +123,18 @@ class ExtractOIIOTranscode(publish.Extractor): target_colorspace = view = display = None # NOTE: we use colorspace_data as the fallback values for the target colorspace. - if transcoding_type == "use_colorspace": + if transcoding_type == "colorspace": # TODO: Should we fallback to the colorspace (which used as source above) ? # or should we compute the target colorspace from current view and display ? - target_colorspace = (output_def["use_colorspace"]["colorspace"] or + target_colorspace = (output_def["colorspace"] or colorspace_data.get("colorspace")) - elif transcoding_type == "use_display_view": - view = output_def["use_display_view"]["view"] or colorspace_data.get("view") - display = (output_def["use_display_view"]["display"] or - colorspace_data.get("display")) + elif transcoding_type == "display_view": + display_view = output_def["display_view"] + view = display_view["view"] or colorspace_data.get("view") + display = ( + display_view["display"] + or colorspace_data.get("display") + ) # both could be already collected by DCC, # but could be overwritten when transcoding diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index cbfab4c5c6..98a50e6101 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -267,8 +267,8 @@ class ExtractThumbnailModel(BaseSettingsModel): def _extract_oiio_transcoding_type(): return [ - {"value": "use_colorspace", "label": "Use Colorspace"}, - {"value": "use_display_view", "label": "Use Display&View"} + {"value": "colorspace", "label": "Use Colorspace"}, + {"value": "display_view", "label": "Use Display&View"} ] @@ -277,11 +277,6 @@ class OIIOToolArgumentsModel(BaseSettingsModel): default_factory=list, title="Arguments") -class UseColorspaceModel(BaseSettingsModel): - _layout = "expanded" - colorspace: str = SettingsField("", title="Target Colorspace") - - class UseDisplayViewModel(BaseSettingsModel): _layout = "expanded" display: str = SettingsField("", title="Target Display") @@ -298,16 +293,13 @@ class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): ) extension: str = SettingsField("", title="Extension") transcoding_type: str = SettingsField( - "use_colorspace", + "colorspace", title="Transcoding type", enum_resolver=_extract_oiio_transcoding_type, conditionalEnum=True ) - use_colorspace: UseColorspaceModel = SettingsField( - title="Use Colorspace", - default_factory=UseColorspaceModel - ) - use_display_view: UseDisplayViewModel = SettingsField( + colorspace: str = SettingsField("", title="Target Colorspace") + display_view: UseDisplayViewModel = SettingsField( title="Use Display&View", default_factory=UseDisplayViewModel ) From f6477b98f1b25907d399a0966f90a4a7ce28ab09 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:24:08 +0200 Subject: [PATCH 054/216] added pycodestyle warnings to ruff validation --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f8f840d2c9..cb2991fe44 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,7 @@ target-version = "py39" [tool.ruff.lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. -select = ["E4", "E7", "E9", "F"] +select = ["E4", "E7", "E9", "F", "W"] ignore = [] # Allow fix for all enabled rules (when `--fix`) is provided. From a1b9d48c129321510ed29107a0dad4474879246b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:24:25 +0200 Subject: [PATCH 055/216] remove not existing path from ignore paths --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cb2991fe44..35d0df0964 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,7 +84,6 @@ exclude = [ [tool.ruff.lint.per-file-ignores] "client/ayon_core/lib/__init__.py" = ["E402"] -"client/ayon_core/hosts/max/startup/startup.py" = ["E402"] [tool.ruff.format] # Like Black, use double quotes for strings. From 9fa4144feb1f7abfab068dd87619e2539406e04b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:28:51 +0200 Subject: [PATCH 056/216] remove trailing spaces --- client/ayon_core/lib/path_templates.py | 2 +- .../plugins/publish/extract_usd_layer_contributions.py | 2 +- client/ayon_core/tools/tray/lib.py | 2 +- server/settings/publish_plugins.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/lib/path_templates.py b/client/ayon_core/lib/path_templates.py index ba0d26d5c1..dc88ec956b 100644 --- a/client/ayon_core/lib/path_templates.py +++ b/client/ayon_core/lib/path_templates.py @@ -503,7 +503,7 @@ class FormattingPart: # ensure key is properly formed [({})] properly closed. if not self.validate_key_is_matched(key): result.add_missing_key(key) - result.add_output(self.template) + result.add_output(self.template) return result # check if key expects subdictionary keys (e.g. project[name]) diff --git a/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py b/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py index 68f2a8f00d..03ea66f418 100644 --- a/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py +++ b/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py @@ -83,7 +83,7 @@ def get_representation_path_in_publish_context( Allow resolving 'latest' paths from a publishing context's instances as if they will exist after publishing without them being integrated yet. - + Use first instance that has same folder path and product name, and contains representation with passed name. diff --git a/client/ayon_core/tools/tray/lib.py b/client/ayon_core/tools/tray/lib.py index 5f92e8a04f..39fcc2cdd3 100644 --- a/client/ayon_core/tools/tray/lib.py +++ b/client/ayon_core/tools/tray/lib.py @@ -578,7 +578,7 @@ def make_sure_tray_is_running( args = get_ayon_launcher_args("tray", "--force") if env is None: env = os.environ.copy() - + # Make sure 'QT_API' is not set env.pop("QT_API", None) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 8e6b60f0d7..61972e64c4 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -57,7 +57,7 @@ class CollectFramesFixDefModel(BaseSettingsModel): True, title="Show 'Rewrite latest version' toggle" ) - + class ContributionLayersModel(BaseSettingsModel): _layout = "compact" From 809cb34171ff0e0c5c1f4c7c7d88706fa4be2366 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:29:03 +0200 Subject: [PATCH 057/216] add new line characters --- client/ayon_core/hooks/pre_global_host_data.py | 2 +- client/ayon_core/plugins/publish/collect_context_entities.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hooks/pre_global_host_data.py b/client/ayon_core/hooks/pre_global_host_data.py index e93b512742..12da6f12f8 100644 --- a/client/ayon_core/hooks/pre_global_host_data.py +++ b/client/ayon_core/hooks/pre_global_host_data.py @@ -94,4 +94,4 @@ class GlobalHostDataHook(PreLaunchHook): task_entity = get_task_by_name( project_name, folder_entity["id"], task_name ) - self.data["task_entity"] = task_entity \ No newline at end of file + self.data["task_entity"] = task_entity diff --git a/client/ayon_core/plugins/publish/collect_context_entities.py b/client/ayon_core/plugins/publish/collect_context_entities.py index f340178e4f..c8d25bc3e6 100644 --- a/client/ayon_core/plugins/publish/collect_context_entities.py +++ b/client/ayon_core/plugins/publish/collect_context_entities.py @@ -113,4 +113,4 @@ class CollectContextEntities(pyblish.api.ContextPlugin): "Task '{}' was not found in project '{}'.".format( task_path, project_name) ) - return task_entity \ No newline at end of file + return task_entity From 7a1950f98e01b28c0ae05360714c7101fff285e0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:33:29 +0200 Subject: [PATCH 058/216] use correct escape sequence --- client/ayon_core/plugins/publish/extract_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/extract_review.py b/client/ayon_core/plugins/publish/extract_review.py index c2793f98a2..4390b00754 100644 --- a/client/ayon_core/plugins/publish/extract_review.py +++ b/client/ayon_core/plugins/publish/extract_review.py @@ -1900,7 +1900,7 @@ class OverscanCrop: string_value = re.sub(r"([ ]+)?px", " ", string_value) string_value = re.sub(r"([ ]+)%", "%", string_value) # Make sure +/- sign at the beginning of string is next to number - string_value = re.sub(r"^([\+\-])[ ]+", "\g<1>", string_value) + string_value = re.sub(r"^([\+\-])[ ]+", r"\g<1>", string_value) # Make sure +/- sign in the middle has zero spaces before number under # which belongs string_value = re.sub( From 4b0d13c477308afcc665ec89464d00fcb4468e11 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:37:57 +0200 Subject: [PATCH 059/216] removed 'module' command from cli --- client/ayon_core/cli.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/client/ayon_core/cli.py b/client/ayon_core/cli.py index db6674d88f..b80b243db2 100644 --- a/client/ayon_core/cli.py +++ b/client/ayon_core/cli.py @@ -21,21 +21,7 @@ from ayon_core.lib import ( -class AliasedGroup(click.Group): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._aliases = {} - - def set_alias(self, src_name, dst_name): - self._aliases[dst_name] = src_name - - def get_command(self, ctx, cmd_name): - if cmd_name in self._aliases: - cmd_name = self._aliases[cmd_name] - return super().get_command(ctx, cmd_name) - - -@click.group(cls=AliasedGroup, invoke_without_command=True) +@click.group(invoke_without_command=True) @click.pass_context @click.option("--use-staging", is_flag=True, expose_value=False, help="use staging variants") @@ -86,10 +72,6 @@ def addon(ctx): pass -# Add 'addon' as alias for module -main_cli.set_alias("addon", "module") - - @main_cli.command() @click.pass_context @click.argument("output_json_path") From b887a91e207923850c31612ee2cad193ed47ca3b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 14:45:09 +0200 Subject: [PATCH 060/216] remove addon code from ayon_core/modules --- client/ayon_core/modules/__init__.py | 40 -------------------------- client/ayon_core/modules/base.py | 25 ---------------- client/ayon_core/modules/click_wrap.py | 1 - client/ayon_core/modules/interfaces.py | 21 -------------- 4 files changed, 87 deletions(-) delete mode 100644 client/ayon_core/modules/base.py delete mode 100644 client/ayon_core/modules/click_wrap.py delete mode 100644 client/ayon_core/modules/interfaces.py diff --git a/client/ayon_core/modules/__init__.py b/client/ayon_core/modules/__init__.py index f4e381f4a0..e69de29bb2 100644 --- a/client/ayon_core/modules/__init__.py +++ b/client/ayon_core/modules/__init__.py @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -from . import click_wrap -from .interfaces import ( - IPluginPaths, - ITrayAddon, - ITrayModule, - ITrayAction, - ITrayService, - IHostAddon, -) - -from .base import ( - AYONAddon, - OpenPypeModule, - OpenPypeAddOn, - - load_modules, - - ModulesManager, -) - - -__all__ = ( - "click_wrap", - - "IPluginPaths", - "ITrayAddon", - "ITrayModule", - "ITrayAction", - "ITrayService", - "IHostAddon", - - "AYONAddon", - "OpenPypeModule", - "OpenPypeAddOn", - - "load_modules", - - "ModulesManager", -) diff --git a/client/ayon_core/modules/base.py b/client/ayon_core/modules/base.py deleted file mode 100644 index df412d141e..0000000000 --- a/client/ayon_core/modules/base.py +++ /dev/null @@ -1,25 +0,0 @@ -# Backwards compatibility support -# - TODO should be removed before release 1.0.0 -from ayon_core.addon import ( - AYONAddon, - AddonsManager, - load_addons, -) -from ayon_core.addon.base import ( - OpenPypeModule, - OpenPypeAddOn, -) - -ModulesManager = AddonsManager -load_modules = load_addons - - -__all__ = ( - "AYONAddon", - "AddonsManager", - "load_addons", - "OpenPypeModule", - "OpenPypeAddOn", - "ModulesManager", - "load_modules", -) diff --git a/client/ayon_core/modules/click_wrap.py b/client/ayon_core/modules/click_wrap.py deleted file mode 100644 index 8f68de187a..0000000000 --- a/client/ayon_core/modules/click_wrap.py +++ /dev/null @@ -1 +0,0 @@ -from ayon_core.addon.click_wrap import * diff --git a/client/ayon_core/modules/interfaces.py b/client/ayon_core/modules/interfaces.py deleted file mode 100644 index 4b114b7a0e..0000000000 --- a/client/ayon_core/modules/interfaces.py +++ /dev/null @@ -1,21 +0,0 @@ -from ayon_core.addon.interfaces import ( - IPluginPaths, - ITrayAddon, - ITrayAction, - ITrayService, - IHostAddon, -) - -ITrayModule = ITrayAddon -ILaunchHookPaths = object - - -__all__ = ( - "IPluginPaths", - "ITrayAddon", - "ITrayAction", - "ITrayService", - "IHostAddon", - "ITrayModule", - "ILaunchHookPaths", -) From f68ae4833d6821acc68c7d90bbb841cf5c695fb6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:56:25 +0200 Subject: [PATCH 061/216] remove lib functions and classes with openpype --- client/ayon_core/lib/__init__.py | 10 ------- client/ayon_core/lib/execute.py | 38 -------------------------- client/ayon_core/lib/local_settings.py | 8 ------ 3 files changed, 56 deletions(-) diff --git a/client/ayon_core/lib/__init__.py b/client/ayon_core/lib/__init__.py index 0074c4d2bd..03ed574081 100644 --- a/client/ayon_core/lib/__init__.py +++ b/client/ayon_core/lib/__init__.py @@ -7,13 +7,10 @@ from .local_settings import ( JSONSettingRegistry, AYONSecureRegistry, AYONSettingsRegistry, - OpenPypeSecureRegistry, - OpenPypeSettingsRegistry, get_launcher_local_dir, get_launcher_storage_dir, get_local_site_id, get_ayon_username, - get_openpype_username, ) from .ayon_connection import initialize_ayon_connection from .cache import ( @@ -59,13 +56,11 @@ from .env_tools import ( from .terminal import Terminal from .execute import ( get_ayon_launcher_args, - get_openpype_execute_args, get_linux_launcher_args, execute, run_subprocess, run_detached_process, run_ayon_launcher_process, - run_openpype_process, path_to_subprocess_arg, CREATE_NO_WINDOW ) @@ -145,13 +140,10 @@ __all__ = [ "JSONSettingRegistry", "AYONSecureRegistry", "AYONSettingsRegistry", - "OpenPypeSecureRegistry", - "OpenPypeSettingsRegistry", "get_launcher_local_dir", "get_launcher_storage_dir", "get_local_site_id", "get_ayon_username", - "get_openpype_username", "initialize_ayon_connection", @@ -162,13 +154,11 @@ __all__ = [ "register_event_callback", "get_ayon_launcher_args", - "get_openpype_execute_args", "get_linux_launcher_args", "execute", "run_subprocess", "run_detached_process", "run_ayon_launcher_process", - "run_openpype_process", "path_to_subprocess_arg", "CREATE_NO_WINDOW", diff --git a/client/ayon_core/lib/execute.py b/client/ayon_core/lib/execute.py index 4e6cb415e7..768412b4dd 100644 --- a/client/ayon_core/lib/execute.py +++ b/client/ayon_core/lib/execute.py @@ -235,26 +235,6 @@ def run_ayon_launcher_process(*args, add_sys_paths=False, **kwargs): return run_subprocess(args, env=env, **kwargs) -def run_openpype_process(*args, **kwargs): - """Execute AYON process with passed arguments and wait. - - Wrapper for 'run_process' which prepends AYON executable arguments - before passed arguments and define environments if are not passed. - - Values from 'os.environ' are used for environments if are not passed. - They are cleaned using 'clean_envs_for_ayon_process' function. - - Example: - >>> run_openpype_process("version") - - Args: - *args (tuple): AYON cli arguments. - **kwargs (dict): Keyword arguments for subprocess.Popen. - - """ - return run_ayon_launcher_process(*args, **kwargs) - - def run_detached_process(args, **kwargs): """Execute process with passed arguments as separated process. @@ -414,21 +394,3 @@ def get_linux_launcher_args(*args): launch_args.extend(args) return launch_args - - -def get_openpype_execute_args(*args): - """Arguments to run pype command. - - Arguments for subprocess when need to spawn new pype process. Which may be - needed when new python process for pype scripts must be executed in build - pype. - - ## Why is this needed? - Pype executed from code has different executable set to virtual env python - and must have path to script as first argument which is not needed for - build pype. - - It is possible to pass any arguments that will be added after pype - executables. - """ - return get_ayon_launcher_args(*args) diff --git a/client/ayon_core/lib/local_settings.py b/client/ayon_core/lib/local_settings.py index 5f49dd512c..690781151c 100644 --- a/client/ayon_core/lib/local_settings.py +++ b/client/ayon_core/lib/local_settings.py @@ -584,11 +584,3 @@ def get_ayon_username(): """ return ayon_api.get_user()["name"] - - -def get_openpype_username(): - return get_ayon_username() - - -OpenPypeSecureRegistry = AYONSecureRegistry -OpenPypeSettingsRegistry = AYONSettingsRegistry From 0c830d7dc846fa4485c08a8e5844213892702383 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:10:31 +0200 Subject: [PATCH 062/216] remove openpype modules logic from addons --- client/ayon_core/addon/base.py | 321 +++++---------------------------- 1 file changed, 41 insertions(+), 280 deletions(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 7f0636ccca..982626ad9d 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -36,9 +36,6 @@ IGNORED_FILENAMES = { # Files ignored on addons import from "./ayon_core/modules" IGNORED_DEFAULT_FILENAMES = { "__init__.py", - "base.py", - "interfaces.py", - "click_wrap.py", } # When addon was moved from ayon-core codebase @@ -124,77 +121,10 @@ class ProcessContext: print(f"Unknown keys in ProcessContext: {unknown_keys}") -# Inherit from `object` for Python 2 hosts -class _ModuleClass(object): - """Fake module class for storing AYON addons. - - Object of this class can be stored to `sys.modules` and used for storing - dynamically imported modules. - """ - - def __init__(self, name): - # Call setattr on super class - super(_ModuleClass, self).__setattr__("name", name) - super(_ModuleClass, self).__setattr__("__name__", name) - - # Where modules and interfaces are stored - super(_ModuleClass, self).__setattr__("__attributes__", dict()) - super(_ModuleClass, self).__setattr__("__defaults__", set()) - - super(_ModuleClass, self).__setattr__("_log", None) - - def __getattr__(self, attr_name): - if attr_name not in self.__attributes__: - if attr_name in ("__path__", "__file__"): - return None - raise AttributeError("'{}' has not attribute '{}'".format( - self.name, attr_name - )) - return self.__attributes__[attr_name] - - def __iter__(self): - for module in self.values(): - yield module - - def __setattr__(self, attr_name, value): - if attr_name in self.__attributes__: - self.log.warning( - "Duplicated name \"{}\" in {}. Overriding.".format( - attr_name, self.name - ) - ) - self.__attributes__[attr_name] = value - - def __setitem__(self, key, value): - self.__setattr__(key, value) - - def __getitem__(self, key): - return getattr(self, key) - - @property - def log(self): - if self._log is None: - super(_ModuleClass, self).__setattr__( - "_log", Logger.get_logger(self.name) - ) - return self._log - - def get(self, key, default=None): - return self.__attributes__.get(key, default) - - def keys(self): - return self.__attributes__.keys() - - def values(self): - return self.__attributes__.values() - - def items(self): - return self.__attributes__.items() - - class _LoadCache: addons_lock = threading.Lock() addons_loaded = False + addon_modules = [] def load_addons(force=False): @@ -308,7 +238,7 @@ def _handle_moved_addons(addon_name, milestone_version, log): return addon_dir -def _load_ayon_addons(openpype_modules, modules_key, log): +def _load_ayon_addons(log): """Load AYON addons based on information from server. This function should not trigger downloading of any addons but only use @@ -316,23 +246,14 @@ def _load_ayon_addons(openpype_modules, modules_key, log): development). Args: - openpype_modules (_ModuleClass): Module object where modules are - stored. - modules_key (str): Key under which will be modules imported in - `sys.modules`. log (logging.Logger): Logger object. - Returns: - List[str]: List of v3 addons to skip to load because v4 alternative is - imported. """ - - addons_to_skip_in_core = [] - + all_addon_modules = [] bundle_info = _get_ayon_bundle_data() addons_info = _get_ayon_addons_information(bundle_info) if not addons_info: - return addons_to_skip_in_core + return all_addon_modules addons_dir = os.environ.get("AYON_ADDONS_DIR") if not addons_dir: @@ -355,7 +276,7 @@ def _load_ayon_addons(openpype_modules, modules_key, log): addon_version = addon_info["version"] # core addon does not have any addon object - if addon_name in ("openpype", "core"): + if addon_name == "core": continue dev_addon_info = dev_addons_info.get(addon_name, {}) @@ -394,7 +315,7 @@ def _load_ayon_addons(openpype_modules, modules_key, log): continue sys.path.insert(0, addon_dir) - imported_modules = [] + addon_modules = [] for name in os.listdir(addon_dir): # Ignore of files is implemented to be able to run code from code # where usually is more files than just the addon @@ -421,7 +342,7 @@ def _load_ayon_addons(openpype_modules, modules_key, log): inspect.isclass(attr) and issubclass(attr, AYONAddon) ): - imported_modules.append(mod) + addon_modules.append(mod) break except BaseException: @@ -430,50 +351,37 @@ def _load_ayon_addons(openpype_modules, modules_key, log): exc_info=True ) - if not imported_modules: + if not addon_modules: log.warning("Addon {} {} has no content to import".format( addon_name, addon_version )) continue - if len(imported_modules) > 1: + if len(addon_modules) > 1: log.warning(( - "Skipping addon '{}'." - " Multiple modules were found ({}) in dir {}." + "Multiple modules ({}) were found in addon '{}' in dir {}." ).format( + ", ".join([m.__name__ for m in addon_modules]), addon_name, - ", ".join([m.__name__ for m in imported_modules]), addon_dir, )) - continue + all_addon_modules.extend(addon_modules) - mod = imported_modules[0] - addon_alias = getattr(mod, "V3_ALIAS", None) - if not addon_alias: - addon_alias = addon_name - addons_to_skip_in_core.append(addon_alias) - new_import_str = "{}.{}".format(modules_key, addon_alias) - - sys.modules[new_import_str] = mod - setattr(openpype_modules, addon_alias, mod) - - return addons_to_skip_in_core + return all_addon_modules -def _load_addons_in_core( - ignore_addon_names, openpype_modules, modules_key, log -): +def _load_addons_in_core(log): # Add current directory at first place # - has small differences in import logic + addon_modules = [] modules_dir = os.path.join(AYON_CORE_ROOT, "modules") if not os.path.exists(modules_dir): log.warning( f"Could not find path when loading AYON addons \"{modules_dir}\"" ) - return + return addon_modules ignored_filenames = IGNORED_FILENAMES | IGNORED_DEFAULT_FILENAMES - for filename in os.listdir(modules_dir): # Ignore filenames if filename in ignored_filenames: @@ -482,9 +390,6 @@ def _load_addons_in_core( fullpath = os.path.join(modules_dir, filename) basename, ext = os.path.splitext(filename) - if basename in ignore_addon_names: - continue - # Validations if os.path.isdir(fullpath): # Check existence of init file @@ -503,69 +408,43 @@ def _load_addons_in_core( # - check manifest and content of manifest try: # Don't import dynamically current directory modules - new_import_str = f"{modules_key}.{basename}" - import_str = f"ayon_core.modules.{basename}" default_module = __import__(import_str, fromlist=("", )) - sys.modules[new_import_str] = default_module - setattr(openpype_modules, basename, default_module) + addon_modules.append(default_module) except Exception: log.error( f"Failed to import in-core addon '{basename}'.", exc_info=True ) + return addon_modules def _load_addons(): - # Key under which will be modules imported in `sys.modules` - modules_key = "openpype_modules" - - # Change `sys.modules` - sys.modules[modules_key] = openpype_modules = _ModuleClass(modules_key) - log = Logger.get_logger("AddonsLoader") - ignore_addon_names = _load_ayon_addons( - openpype_modules, modules_key, log - ) - _load_addons_in_core( - ignore_addon_names, openpype_modules, modules_key, log - ) + addon_modules = _load_ayon_addons(log) + # All addon in 'modules' folder are tray actions and should be moved + # to tray tool. + # TODO remove + addon_modules.extend(_load_addons_in_core(log)) - -_MARKING_ATTR = "_marking" -def mark_func(func): - """Mark function to be used in report. - - Args: - func (Callable): Function to mark. - - Returns: - Callable: Marked function. - """ - - setattr(func, _MARKING_ATTR, True) - return func - - -def is_func_marked(func): - return getattr(func, _MARKING_ATTR, False) + # Store modules to local cache + _LoadCache.addon_modules = addon_modules class AYONAddon(ABC): """Base class of AYON addon. Attributes: - id (UUID): Addon object id. enabled (bool): Is addon enabled. name (str): Addon name. Args: manager (AddonsManager): Manager object who discovered addon. settings (dict[str, Any]): AYON settings. - """ + """ enabled = True _id = None @@ -585,8 +464,8 @@ class AYONAddon(ABC): Returns: str: Object id. - """ + """ if self._id is None: self._id = uuid4() return self._id @@ -598,8 +477,8 @@ class AYONAddon(ABC): Returns: str: Addon name. - """ + """ pass @property @@ -630,16 +509,16 @@ class AYONAddon(ABC): Args: settings (dict[str, Any]): Settings. - """ + """ pass - @mark_func def connect_with_addons(self, enabled_addons): """Connect with other enabled addons. Args: enabled_addons (list[AYONAddon]): Addons that are enabled. + """ pass @@ -673,8 +552,8 @@ class AYONAddon(ABC): Returns: dict[str, str]: Environment variables. - """ + """ return {} def modify_application_launch_arguments(self, application, env): @@ -686,8 +565,8 @@ class AYONAddon(ABC): Args: application (Application): Application that is launched. env (dict[str, str]): Current environment variables. - """ + """ pass def on_host_install(self, host, host_name, project_name): @@ -706,8 +585,8 @@ class AYONAddon(ABC): host_name (str): Name of host. project_name (str): Project name which is main part of host context. - """ + """ pass def cli(self, addon_click_group): @@ -734,31 +613,11 @@ class AYONAddon(ABC): Args: addon_click_group (click.Group): Group to which can be added commands. + """ - pass -class OpenPypeModule(AYONAddon): - """Base class of OpenPype module. - - Deprecated: - Use `AYONAddon` instead. - - Args: - manager (AddonsManager): Manager object who discovered addon. - settings (dict[str, Any]): Module settings (OpenPype settings). - """ - - # Disable by default - enabled = False - - -class OpenPypeAddOn(OpenPypeModule): - # Enable Addon by default - enabled = True - - class _AddonReportInfo: def __init__( self, class_name, name, version, report_value_by_label @@ -790,8 +649,8 @@ class AddonsManager: settings (Optional[dict[str, Any]]): AYON studio settings. initialize (Optional[bool]): Initialize addons on init. True by default. - """ + """ # Helper attributes for report _report_total_key = "Total" _log = None @@ -827,8 +686,8 @@ class AddonsManager: Returns: Union[AYONAddon, Any]: Addon found by name or `default`. - """ + """ return self._addons_by_name.get(addon_name, default) @property @@ -855,8 +714,8 @@ class AddonsManager: Returns: Union[AYONAddon, None]: Enabled addon found by name or None. - """ + """ addon = self.get(addon_name) if addon is not None and addon.enabled: return addon @@ -867,8 +726,8 @@ class AddonsManager: Returns: list[AYONAddon]: Initialized and enabled addons. - """ + """ return [ addon for addon in self._addons @@ -880,8 +739,6 @@ class AddonsManager: # Make sure modules are loaded load_addons() - import openpype_modules - self.log.debug("*** AYON addons initialization.") # Prepare settings for addons @@ -889,14 +746,12 @@ class AddonsManager: if settings is None: settings = get_studio_settings() - modules_settings = {} - report = {} time_start = time.time() prev_start_time = time_start addon_classes = [] - for module in openpype_modules: + for module in _LoadCache.addon_modules: # Go through globals in `ayon_core.modules` for name in dir(module): modules_item = getattr(module, name, None) @@ -905,8 +760,6 @@ class AddonsManager: if ( not inspect.isclass(modules_item) or modules_item is AYONAddon - or modules_item is OpenPypeModule - or modules_item is OpenPypeAddOn or not issubclass(modules_item, AYONAddon) ): continue @@ -932,33 +785,14 @@ class AddonsManager: addon_classes.append(modules_item) - aliased_names = [] for addon_cls in addon_classes: name = addon_cls.__name__ - if issubclass(addon_cls, OpenPypeModule): - # TODO change to warning - self.log.debug(( - "Addon '{}' is inherited from 'OpenPypeModule'." - " Please use 'AYONAddon'." - ).format(name)) - try: - # Try initialize module - if issubclass(addon_cls, OpenPypeModule): - addon = addon_cls(self, modules_settings) - else: - addon = addon_cls(self, settings) + addon = addon_cls(self, settings) # Store initialized object self._addons.append(addon) self._addons_by_id[addon.id] = addon self._addons_by_name[addon.name] = addon - # NOTE This will be removed with release 1.0.0 of ayon-core - # please use carefully. - # Gives option to use alias name for addon for cases when - # name in OpenPype was not the same as in AYON. - name_alias = getattr(addon, "openpype_alias", None) - if name_alias: - aliased_names.append((name_alias, addon)) now = time.time() report[addon.__class__.__name__] = now - prev_start_time @@ -977,17 +811,6 @@ class AddonsManager: f"[{enabled_str}] {addon.name} ({addon.version})" ) - for item in aliased_names: - name_alias, addon = item - if name_alias not in self._addons_by_name: - self._addons_by_name[name_alias] = addon - continue - self.log.warning( - "Alias name '{}' of addon '{}' is already assigned.".format( - name_alias, addon.name - ) - ) - if self._report is not None: report[self._report_total_key] = time.time() - time_start self._report["Initialization"] = report @@ -1004,16 +827,7 @@ class AddonsManager: self.log.debug("Has {} enabled addons.".format(len(enabled_addons))) for addon in enabled_addons: try: - if not is_func_marked(addon.connect_with_addons): - addon.connect_with_addons(enabled_addons) - - elif hasattr(addon, "connect_with_modules"): - self.log.warning(( - "DEPRECATION WARNING: Addon '{}' still uses" - " 'connect_with_modules' method. Please switch to use" - " 'connect_with_addons' method." - ).format(addon.name)) - addon.connect_with_modules(enabled_addons) + addon.connect_with_addons(enabled_addons) except Exception: self.log.error( @@ -1362,56 +1176,3 @@ class AddonsManager: # Join rows with newline char and add new line at the end output = "\n".join(formatted_rows) + "\n" print(output) - - # DEPRECATED - Module compatibility - @property - def modules(self): - self.log.warning( - "DEPRECATION WARNING: Used deprecated property" - " 'modules' please use 'addons' instead." - ) - return self.addons - - @property - def modules_by_id(self): - self.log.warning( - "DEPRECATION WARNING: Used deprecated property" - " 'modules_by_id' please use 'addons_by_id' instead." - ) - return self.addons_by_id - - @property - def modules_by_name(self): - self.log.warning( - "DEPRECATION WARNING: Used deprecated property" - " 'modules_by_name' please use 'addons_by_name' instead." - ) - return self.addons_by_name - - def get_enabled_module(self, *args, **kwargs): - self.log.warning( - "DEPRECATION WARNING: Used deprecated method" - " 'get_enabled_module' please use 'get_enabled_addon' instead." - ) - return self.get_enabled_addon(*args, **kwargs) - - def initialize_modules(self): - self.log.warning( - "DEPRECATION WARNING: Used deprecated method" - " 'initialize_modules' please use 'initialize_addons' instead." - ) - self.initialize_addons() - - def get_enabled_modules(self): - self.log.warning( - "DEPRECATION WARNING: Used deprecated method" - " 'get_enabled_modules' please use 'get_enabled_addons' instead." - ) - return self.get_enabled_addons() - - def get_host_module(self, host_name): - self.log.warning( - "DEPRECATION WARNING: Used deprecated method" - " 'get_host_module' please use 'get_host_addon' instead." - ) - return self.get_host_addon(host_name) From b2849a648af72bb689197fe32ddd2aed224a3345 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:11:29 +0200 Subject: [PATCH 063/216] remove openpype compatibility from pipeline --- client/ayon_core/pipeline/__init__.py | 4 ---- client/ayon_core/pipeline/context_tools.py | 10 ---------- client/ayon_core/pipeline/publish/README.md | 2 +- client/ayon_core/pipeline/publish/__init__.py | 2 -- client/ayon_core/pipeline/publish/lib.py | 2 +- client/ayon_core/pipeline/publish/publish_plugins.py | 3 --- client/ayon_core/pipeline/tempdir.py | 8 +------- 7 files changed, 3 insertions(+), 28 deletions(-) diff --git a/client/ayon_core/pipeline/__init__.py b/client/ayon_core/pipeline/__init__.py index 8fd00ee6b6..e0b7d4acae 100644 --- a/client/ayon_core/pipeline/__init__.py +++ b/client/ayon_core/pipeline/__init__.py @@ -55,7 +55,6 @@ from .publish import ( PublishXmlValidationError, KnownPublishError, AYONPyblishPluginMixin, - OpenPypePyblishPluginMixin, OptionalPyblishPluginMixin, ) @@ -77,7 +76,6 @@ from .actions import ( from .context_tools import ( install_ayon_plugins, - install_openpype_plugins, install_host, uninstall_host, is_installed, @@ -168,7 +166,6 @@ __all__ = ( "PublishXmlValidationError", "KnownPublishError", "AYONPyblishPluginMixin", - "OpenPypePyblishPluginMixin", "OptionalPyblishPluginMixin", # --- Actions --- @@ -187,7 +184,6 @@ __all__ = ( # --- Process context --- "install_ayon_plugins", - "install_openpype_plugins", "install_host", "uninstall_host", "is_installed", diff --git a/client/ayon_core/pipeline/context_tools.py b/client/ayon_core/pipeline/context_tools.py index 8b72405048..5c14cf20e6 100644 --- a/client/ayon_core/pipeline/context_tools.py +++ b/client/ayon_core/pipeline/context_tools.py @@ -234,16 +234,6 @@ def install_ayon_plugins(project_name=None, host_name=None): register_inventory_action_path(path) -def install_openpype_plugins(project_name=None, host_name=None): - """Install AYON core plugins and make sure the core is initialized. - - Deprecated: - Use `install_ayon_plugins` instead. - - """ - install_ayon_plugins(project_name, host_name) - - def uninstall_host(): """Undo all of what `install()` did""" host = registered_host() diff --git a/client/ayon_core/pipeline/publish/README.md b/client/ayon_core/pipeline/publish/README.md index ee2124dfd3..954c10494f 100644 --- a/client/ayon_core/pipeline/publish/README.md +++ b/client/ayon_core/pipeline/publish/README.md @@ -1,5 +1,5 @@ # Publish -AYON is using `pyblish` for publishing process which is a little bit extented and modified mainly for UI purposes. OpenPype's (new) publish UI does not allow to enable/disable instances or plugins that can be done during creation part. Also does support actions only for validators after validation exception. +AYON is using `pyblish` for publishing process which is a little bit extented and modified mainly for UI purposes. AYON's (new) publish UI does not allow to enable/disable instances or plugins that can be done during creation part. Also does support actions only for validators after validation exception. ## Exceptions AYON define few specific exceptions that should be used in publish plugins. diff --git a/client/ayon_core/pipeline/publish/__init__.py b/client/ayon_core/pipeline/publish/__init__.py index ab19b6e360..cb181c2f2b 100644 --- a/client/ayon_core/pipeline/publish/__init__.py +++ b/client/ayon_core/pipeline/publish/__init__.py @@ -13,7 +13,6 @@ from .publish_plugins import ( PublishXmlValidationError, KnownPublishError, AYONPyblishPluginMixin, - OpenPypePyblishPluginMixin, OptionalPyblishPluginMixin, RepairAction, @@ -66,7 +65,6 @@ __all__ = ( "PublishXmlValidationError", "KnownPublishError", "AYONPyblishPluginMixin", - "OpenPypePyblishPluginMixin", "OptionalPyblishPluginMixin", "RepairAction", diff --git a/client/ayon_core/pipeline/publish/lib.py b/client/ayon_core/pipeline/publish/lib.py index 8b82622e4c..dc2eef3bb9 100644 --- a/client/ayon_core/pipeline/publish/lib.py +++ b/client/ayon_core/pipeline/publish/lib.py @@ -379,7 +379,7 @@ def get_plugin_settings(plugin, project_settings, log, category=None): plugin_kind = split_path[-2] # TODO: change after all plugins are moved one level up - if category_from_file in ("ayon_core", "openpype"): + if category_from_file == "ayon_core": category_from_file = "core" try: diff --git a/client/ayon_core/pipeline/publish/publish_plugins.py b/client/ayon_core/pipeline/publish/publish_plugins.py index 6b1984d92b..1eca8df7cb 100644 --- a/client/ayon_core/pipeline/publish/publish_plugins.py +++ b/client/ayon_core/pipeline/publish/publish_plugins.py @@ -165,9 +165,6 @@ class AYONPyblishPluginMixin: return self.get_attr_values_from_data_for_plugin(self.__class__, data) -OpenPypePyblishPluginMixin = AYONPyblishPluginMixin - - class OptionalPyblishPluginMixin(AYONPyblishPluginMixin): """Prepare mixin for optional plugins. diff --git a/client/ayon_core/pipeline/tempdir.py b/client/ayon_core/pipeline/tempdir.py index 29d4659393..d8f42ea60a 100644 --- a/client/ayon_core/pipeline/tempdir.py +++ b/client/ayon_core/pipeline/tempdir.py @@ -25,13 +25,7 @@ def create_custom_tempdir(project_name, anatomy=None): """ env_tmpdir = os.getenv("AYON_TMPDIR") if not env_tmpdir: - env_tmpdir = os.getenv("OPENPYPE_TMPDIR") - if not env_tmpdir: - return - print( - "DEPRECATION WARNING: Used 'OPENPYPE_TMPDIR' environment" - " variable. Please use 'AYON_TMPDIR' instead." - ) + return custom_tempdir = None if "{" in env_tmpdir: From 7a2a2c67171edf381fafb4c9e81eb5f5b9eda266 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:12:12 +0200 Subject: [PATCH 064/216] removed ayon/openpype compatible constants --- client/ayon_core/__init__.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/client/ayon_core/__init__.py b/client/ayon_core/__init__.py index ce5a28601c..6cde11c822 100644 --- a/client/ayon_core/__init__.py +++ b/client/ayon_core/__init__.py @@ -9,10 +9,6 @@ AYON_CORE_ROOT = os.path.dirname(os.path.abspath(__file__)) # ------------------------- PACKAGE_DIR = AYON_CORE_ROOT PLUGINS_DIR = os.path.join(AYON_CORE_ROOT, "plugins") -AYON_SERVER_ENABLED = True - -# Indicate if AYON entities should be used instead of OpenPype entities -USE_AYON_ENTITIES = True # ------------------------- @@ -23,6 +19,4 @@ __all__ = ( "AYON_CORE_ROOT", "PACKAGE_DIR", "PLUGINS_DIR", - "AYON_SERVER_ENABLED", - "USE_AYON_ENTITIES", ) From f194ddcc49cc743f2d7e18cfb4075237809c1d46 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:12:37 +0200 Subject: [PATCH 065/216] removed openpype functions from resources and tools --- client/ayon_core/resources/__init__.py | 16 ---------------- client/ayon_core/tools/utils/__init__.py | 2 -- client/ayon_core/tools/utils/lib.py | 4 ---- 3 files changed, 22 deletions(-) diff --git a/client/ayon_core/resources/__init__.py b/client/ayon_core/resources/__init__.py index 2a98cc1968..ea8bf7ca6c 100644 --- a/client/ayon_core/resources/__init__.py +++ b/client/ayon_core/resources/__init__.py @@ -70,19 +70,3 @@ def get_ayon_splash_filepath(staging=None): else: splash_file_name = "AYON_splash.png" return get_resource("icons", splash_file_name) - - -def get_openpype_production_icon_filepath(): - return get_ayon_production_icon_filepath() - - -def get_openpype_staging_icon_filepath(): - return get_ayon_staging_icon_filepath() - - -def get_openpype_icon_filepath(staging=None): - return get_ayon_icon_filepath(staging) - - -def get_openpype_splash_filepath(staging=None): - return get_ayon_splash_filepath(staging) diff --git a/client/ayon_core/tools/utils/__init__.py b/client/ayon_core/tools/utils/__init__.py index 3e265c7692..4714e76ea3 100644 --- a/client/ayon_core/tools/utils/__init__.py +++ b/client/ayon_core/tools/utils/__init__.py @@ -38,7 +38,6 @@ from .lib import ( qt_app_context, get_qt_app, get_ayon_qt_app, - get_openpype_qt_app, get_qt_icon, ) @@ -122,7 +121,6 @@ __all__ = ( "qt_app_context", "get_qt_app", "get_ayon_qt_app", - "get_openpype_qt_app", "get_qt_icon", "RecursiveSortFilterProxyModel", diff --git a/client/ayon_core/tools/utils/lib.py b/client/ayon_core/tools/utils/lib.py index 8689a97451..200e281664 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -196,10 +196,6 @@ def get_ayon_qt_app(): return app -def get_openpype_qt_app(): - return get_ayon_qt_app() - - def iter_model_rows(model, column=0, include_root=False): """Iterate over all row indices in a model""" indexes_queue = collections.deque() From f54ff5622e8e5e00de3531a71006c224cd30c001 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:13:38 +0200 Subject: [PATCH 066/216] use correct naming --- .../publish/collect_input_representations_to_versions.py | 2 +- .../plugins/publish/extract_usd_layer_contributions.py | 2 +- client/ayon_core/tools/publisher/widgets/overview_widget.py | 2 +- client/ayon_core/tools/publisher/widgets/widgets.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/collect_input_representations_to_versions.py b/client/ayon_core/plugins/publish/collect_input_representations_to_versions.py index b9fe97b80b..f8311f7dfb 100644 --- a/client/ayon_core/plugins/publish/collect_input_representations_to_versions.py +++ b/client/ayon_core/plugins/publish/collect_input_representations_to_versions.py @@ -7,7 +7,7 @@ class CollectInputRepresentationsToVersions(pyblish.api.ContextPlugin): """Converts collected input representations to input versions. Any data in `instance.data["inputRepresentations"]` gets converted into - `instance.data["inputVersions"]` as supported in OpenPype v3. + `instance.data["inputVersions"]` as supported in OpenPype. """ # This is a ContextPlugin because then we can query the database only once diff --git a/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py b/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py index 68f2a8f00d..89fc7acb6d 100644 --- a/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py +++ b/client/ayon_core/plugins/publish/extract_usd_layer_contributions.py @@ -238,7 +238,7 @@ def add_representation(instance, name, class CollectUSDLayerContributions(pyblish.api.InstancePlugin, - publish.OpenPypePyblishPluginMixin): + publish.AYONPyblishPluginMixin): """Collect the USD Layer Contributions and create dependent instances. Our contributions go to the layer diff --git a/client/ayon_core/tools/publisher/widgets/overview_widget.py b/client/ayon_core/tools/publisher/widgets/overview_widget.py index 52a45d0881..d00edb9883 100644 --- a/client/ayon_core/tools/publisher/widgets/overview_widget.py +++ b/client/ayon_core/tools/publisher/widgets/overview_widget.py @@ -387,7 +387,7 @@ class OverviewWidget(QtWidgets.QFrame): Returns: list[str]: Selected legacy convertor identifiers. - Example: ['io.openpype.creators.houdini.legacy'] + Example: ['io.ayon.creators.houdini.legacy'] """ _, _, convertor_identifiers = self.get_selected_items() diff --git a/client/ayon_core/tools/publisher/widgets/widgets.py b/client/ayon_core/tools/publisher/widgets/widgets.py index 1f782ddc67..affa0f1423 100644 --- a/client/ayon_core/tools/publisher/widgets/widgets.py +++ b/client/ayon_core/tools/publisher/widgets/widgets.py @@ -1339,7 +1339,7 @@ class CreatorAttrsWidget(QtWidgets.QWidget): Attributes are defined on creator so are dynamic. Their look and type is based on attribute definitions that are defined in `~/ayon_core/lib/attribute_definitions.py` and their widget - representation in `~/openpype/tools/attribute_defs/*`. + representation in `~/ayon_core/tools/attribute_defs/*`. Widgets are disabled if context of instance is not valid. From 84f1f6f17a417c8b184f3402c0d6d16ed3b30a4f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:13:54 +0200 Subject: [PATCH 067/216] removed openpype env variables for webserver --- client/ayon_core/tools/tray/ui/addons_manager.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/client/ayon_core/tools/tray/ui/addons_manager.py b/client/ayon_core/tools/tray/ui/addons_manager.py index 3fe4bb8dd8..2e6f0c0aae 100644 --- a/client/ayon_core/tools/tray/ui/addons_manager.py +++ b/client/ayon_core/tools/tray/ui/addons_manager.py @@ -237,11 +237,8 @@ class TrayAddonsManager(AddonsManager): webserver_url = self.webserver_url statics_url = f"{webserver_url}/res" + # Deprecated # TODO stop using these env variables # - function 'get_tray_server_url' should be used instead os.environ[self.webserver_url_env] = webserver_url os.environ["AYON_STATICS_SERVER"] = statics_url - - # Deprecated - os.environ["OPENPYPE_WEBSERVER_URL"] = webserver_url - os.environ["OPENPYPE_STATICS_SERVER"] = statics_url From a9c100c91ee56a92432db84e413f3289975a13ef Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:14:04 +0200 Subject: [PATCH 068/216] removed unused 'OpenPypeVersionLabel' style --- client/ayon_core/style/style.css | 8 -------- 1 file changed, 8 deletions(-) diff --git a/client/ayon_core/style/style.css b/client/ayon_core/style/style.css index 8578522c79..10aa918d08 100644 --- a/client/ayon_core/style/style.css +++ b/client/ayon_core/style/style.css @@ -1472,14 +1472,6 @@ CreateNextPageOverlay { border-radius: 5px; } -#OpenPypeVersionLabel[state="success"] { - color: {color:settings:version-exists}; -} - -#OpenPypeVersionLabel[state="warning"] { - color: {color:settings:version-not-found}; -} - #ShadowWidget { font-size: 36pt; } From a08a1af331163492644fa8f5713328c95c51cc44 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:14:35 +0200 Subject: [PATCH 069/216] don't use openpype naming keys --- client/ayon_core/plugins/publish/collect_addons.py | 2 -- client/ayon_core/plugins/publish/collect_rendered_files.py | 5 +---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/client/ayon_core/plugins/publish/collect_addons.py b/client/ayon_core/plugins/publish/collect_addons.py index 9bba9978ab..661cf9cb31 100644 --- a/client/ayon_core/plugins/publish/collect_addons.py +++ b/client/ayon_core/plugins/publish/collect_addons.py @@ -15,5 +15,3 @@ class CollectAddons(pyblish.api.ContextPlugin): manager = AddonsManager() context.data["ayonAddonsManager"] = manager context.data["ayonAddons"] = manager.addons_by_name - # Backwards compatibility - remove - context.data["openPypeModules"] = manager.addons_by_name diff --git a/client/ayon_core/plugins/publish/collect_rendered_files.py b/client/ayon_core/plugins/publish/collect_rendered_files.py index 8a60e7619d..42ba096d14 100644 --- a/client/ayon_core/plugins/publish/collect_rendered_files.py +++ b/client/ayon_core/plugins/publish/collect_rendered_files.py @@ -138,10 +138,7 @@ class CollectRenderedFiles(pyblish.api.ContextPlugin): def process(self, context): self._context = context - publish_data_paths = ( - os.environ.get("AYON_PUBLISH_DATA") - or os.environ.get("OPENPYPE_PUBLISH_DATA") - ) + publish_data_paths = os.environ.get("AYON_PUBLISH_DATA") if not publish_data_paths: raise KnownPublishError("Missing `AYON_PUBLISH_DATA`") From 55061e6f65ae29d933fb87940284a1e37c0a3137 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:22:37 +0200 Subject: [PATCH 070/216] added ayon prefix option to OTIO extraction --- .../plugins/publish/extract_otio_review.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index be365520c7..f879ad2d36 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -104,10 +104,19 @@ class ExtractOTIOReview(publish.Extractor): media_metadata = otio_media.metadata # get from media reference metadata source - if media_metadata.get("openpype.source.width"): - width = int(media_metadata.get("openpype.source.width")) - if media_metadata.get("openpype.source.height"): - height = int(media_metadata.get("openpype.source.height")) + # TODO 'openpype' prefix should be removed (added 24/09/03) + # NOTE it looks like it is set only in hiero integration + for key in {"ayon.source.width", "openpype.source.width"}: + value = media_metadata.get(key) + if value is not None: + width = int(value) + break + + for key in {"ayon.source.height", "openpype.source.height"}: + value = media_metadata.get(key) + if value is not None: + height = int(value) + break # compare and reset if width != self.to_width: From d24187a1544aeb7a14111adf6a3c46f7ce2bf642 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:43:41 +0200 Subject: [PATCH 071/216] removed local_settings.md --- client/ayon_core/settings/local_settings.md | 79 --------------------- 1 file changed, 79 deletions(-) delete mode 100644 client/ayon_core/settings/local_settings.md diff --git a/client/ayon_core/settings/local_settings.md b/client/ayon_core/settings/local_settings.md deleted file mode 100644 index fbb5cf3df1..0000000000 --- a/client/ayon_core/settings/local_settings.md +++ /dev/null @@ -1,79 +0,0 @@ -# Structure of local settings -- local settings do not have any validation schemas right now this should help to see what is stored to local settings and how it works -- they are stored by identifier site_id which should be unified identifier of workstation -- all keys may and may not available on load -- contain main categories: `general`, `applications`, `projects` - -## Categories -### General -- ATM contain only label of site -```json -{ - "general": { - "site_label": "MySite" - } -} -``` - -### Applications -- modifications of application executables -- output should match application groups and variants -```json -{ - "applications": { - "": { - "": { - "executable": "/my/path/to/nuke_12_2" - } - } - } -} -``` - -### Projects -- project specific modifications -- default project is stored under constant key defined in `pype.settings.contants` -```json -{ - "projects": { - "": { - "active_site": "", - "remote_site": "", - "roots": { - "": { - "": "" - } - } - } - } -} -``` - -## Final document -```json -{ - "_id": "", - "site_id": "", - "general": { - "site_label": "MySite" - }, - "applications": { - "": { - "": { - "executable": "" - } - } - }, - "projects": { - "": { - "active_site": "", - "remote_site": "", - "roots": { - "": { - "": "" - } - } - } - } -} -``` From f0f64a1f76f4952795e1926ef5d2b94cb6360f60 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:43:59 +0200 Subject: [PATCH 072/216] modified 'get_ayon_launcher_args' docstring --- client/ayon_core/lib/execute.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/lib/execute.py b/client/ayon_core/lib/execute.py index 768412b4dd..95696fd272 100644 --- a/client/ayon_core/lib/execute.py +++ b/client/ayon_core/lib/execute.py @@ -321,14 +321,12 @@ def path_to_subprocess_arg(path): def get_ayon_launcher_args(*args): - """Arguments to run ayon-launcher process. + """Arguments to run AYON launcher process. - Arguments for subprocess when need to spawn new pype process. Which may be - needed when new python process for pype scripts must be executed in build - pype. + Arguments for subprocess when need to spawn new AYON launcher process. Reasons: - Ayon-launcher started from code has different executable set to + AYON launcher started from code has different executable set to virtual env python and must have path to script as first argument which is not needed for built application. @@ -336,7 +334,8 @@ def get_ayon_launcher_args(*args): *args (str): Any arguments that will be added after executables. Returns: - list[str]: List of arguments to run ayon-launcher process. + list[str]: List of arguments to run AYON launcher process. + """ executable = os.environ["AYON_EXECUTABLE"] launch_args = [executable] From 6c189f6c3682c569d1f0307542cd9ed6ab1d176e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:44:12 +0200 Subject: [PATCH 073/216] remove pype todo --- client/ayon_core/tools/pyblish_pype/util.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/tools/pyblish_pype/util.py b/client/ayon_core/tools/pyblish_pype/util.py index 09a370c6e4..d24b07a409 100644 --- a/client/ayon_core/tools/pyblish_pype/util.py +++ b/client/ayon_core/tools/pyblish_pype/util.py @@ -135,7 +135,6 @@ class OrderGroups: def env_variable_to_bool(env_key, default=False): """Boolean based on environment variable value.""" - # TODO: move to pype lib value = os.environ.get(env_key) if value is not None: value = value.lower() From 614f2d4f6334186ee7d9673e61d9f4617534743f Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 3 Sep 2024 22:18:16 +0200 Subject: [PATCH 074/216] Avoid double quotes around paths --- .../plugins/publish/collect_anatomy_instance_data.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py b/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py index 5b750a5232..925e14166e 100644 --- a/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py +++ b/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py @@ -217,9 +217,8 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): joined_paths = ", ".join( ["\"{}\"".format(path) for path in not_found_task_paths] ) - self.log.warning(( - "Not found task entities with paths \"{}\"." - ).format(joined_paths)) + self.log.warning( + f"Not found task entities with paths {joined_paths}.") def fill_latest_versions(self, context, project_name): """Try to find latest version for each instance's product name. From 73e125639bbeab03649022322d1165b54084937a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 4 Sep 2024 10:29:56 +0200 Subject: [PATCH 075/216] remove trailing spaces --- client/ayon_core/plugins/publish/validate_file_saved.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_file_saved.py b/client/ayon_core/plugins/publish/validate_file_saved.py index 8f956f586b..d132ba8d3a 100644 --- a/client/ayon_core/plugins/publish/validate_file_saved.py +++ b/client/ayon_core/plugins/publish/validate_file_saved.py @@ -51,9 +51,9 @@ class ValidateCurrentSaveFile(pyblish.api.ContextPlugin): def get_description(self): return inspect.cleandoc(""" ### File not saved - + Your workfile must be saved to continue publishing. - - The **Save Workfile** action will save it for you with the first + + The **Save Workfile** action will save it for you with the first available workfile version number in your current context. """) From 916c9a625783522366778ce170bf882ec832a137 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 5 Sep 2024 12:48:32 +0200 Subject: [PATCH 076/216] Added todo note to get rid of instance variable --- .../plugins/publish/extract_otio_review.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 8c7719ceb6..c1cf50333c 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -61,7 +61,8 @@ class ExtractOTIOReview(publish.Extractor): make_sequence_collection ) - self.temp_file_head = self._get_unique_file_prefix(instance) + # TODO refactore from using instance variable + self.temp_file_head = self._get_folder_name_based_prefix(instance) # TODO: convert resulting image sequence to mp4 @@ -493,11 +494,13 @@ class ExtractOTIOReview(publish.Extractor): return output_path, out_frame_start - def _get_unique_file_prefix(self, instance): - """Creates unique human readable file prefix to differentiate. + def _get_folder_name_based_prefix(self, instance): + """Creates 'unique' human readable file prefix to differentiate. - Multiple instances might share same temp folder, this will provide - unique prefix for intermediate file for burnins. + Multiple instances might share same temp folder, but each instance + would be differentiated by asset, eg. folder name. + + It ix expected that there won't be multiple instances for same asset. """ folder_path = instance.data["folderPath"] folder_name = folder_path.split("/")[-1] From 49448fc3ffb13d04281e9bb691ab443f0ed2dbd2 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 5 Sep 2024 16:08:03 +0300 Subject: [PATCH 077/216] fix running builder on start if scene is the default scene --- .../workfile/workfile_template_builder.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 7b15dff049..1fce07a722 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -533,29 +533,20 @@ class AbstractTemplateBuilder(ABC): if create_first_version: created_version_workfile = self.create_first_workfile_version() - # if first version is created, import template - # and populate placeholders + # Build the template if ( create_first_version and workfile_creation_enabled - and created_version_workfile + and (created_version_workfile or self.host.get_current_workfile() is None) ): self.import_template(template_path) self.populate_scene_placeholders( level_limit, keep_placeholders) - # save workfile after template is populated + # save workfile if a workfile was created. + if created_version_workfile: self.save_workfile(created_version_workfile) - # ignore process if first workfile is enabled - # but a version is already created - if workfile_creation_enabled: - return - - self.import_template(template_path) - self.populate_scene_placeholders( - level_limit, keep_placeholders) - def rebuild_template(self): """Go through existing placeholders in scene and update them. From b636658f43d89cb093948363486f1ea5d70f75ea Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 5 Sep 2024 20:57:20 +0200 Subject: [PATCH 078/216] Allow placeholder representation name to be set as an empty value to load all representations --- .../pipeline/workfile/workfile_template_builder.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 7b15dff049..be5b7437de 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -1519,9 +1519,10 @@ class PlaceholderLoadMixin(object): if "asset" in placeholder.data: return [] - representation_name = placeholder.data["representation"] - if not representation_name: - return [] + representation_names = None + representation_name: str = placeholder.data["representation"] + if representation_name: + representation_names = [representation_name] project_name = self.builder.project_name current_folder_entity = self.builder.current_folder_entity @@ -1578,7 +1579,7 @@ class PlaceholderLoadMixin(object): ) return list(get_representations( project_name, - representation_names={representation_name}, + representation_names=representation_names, version_ids=version_ids )) From e4881e2fec7599863e311fd9124db89bc35fd2b8 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 5 Sep 2024 22:04:55 +0300 Subject: [PATCH 079/216] refactor and simplify `build_template` method --- .../workfile/workfile_template_builder.py | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 1fce07a722..283408452e 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -512,39 +512,28 @@ class AbstractTemplateBuilder(ABC): process if version is created """ - if any( - value is None - for value in [ - template_path, - keep_placeholders, - create_first_version, - ] - ): - template_preset = self.get_template_preset() - if template_path is None: - template_path = template_preset["path"] + # Get default values if not provided + if template_path is None or keep_placeholders is None or create_first_version is None: + preset = self.get_template_preset() + template_path = template_path or preset["path"] if keep_placeholders is None: - keep_placeholders = template_preset["keep_placeholder"] + keep_placeholders = preset["keep_placeholder"] if create_first_version is None: - create_first_version = template_preset["create_first_version"] + create_first_version = preset["create_first_version"] # check if first version is created - created_version_workfile = False - if create_first_version: - created_version_workfile = self.create_first_workfile_version() + created_version_workfile = create_first_version and self.create_first_workfile_version() # Build the template if ( - create_first_version - and workfile_creation_enabled - and (created_version_workfile or self.host.get_current_workfile() is None) + not self.host.get_current_workfile() or created_version_workfile ): self.import_template(template_path) self.populate_scene_placeholders( level_limit, keep_placeholders) # save workfile if a workfile was created. - if created_version_workfile: + if workfile_creation_enabled and created_version_workfile: self.save_workfile(created_version_workfile) def rebuild_template(self): From 2e039af0151c9ee8920c51a6d3dba1ff8b383122 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 10:30:51 +0200 Subject: [PATCH 080/216] Fix if statement --- client/ayon_core/vendor/python/scriptsmenu/launchformaya.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/vendor/python/scriptsmenu/launchformaya.py b/client/ayon_core/vendor/python/scriptsmenu/launchformaya.py index c8b0c777de..496278ac6f 100644 --- a/client/ayon_core/vendor/python/scriptsmenu/launchformaya.py +++ b/client/ayon_core/vendor/python/scriptsmenu/launchformaya.py @@ -130,7 +130,7 @@ def main(title="Scripts", parent=None, objectName=None): # Register control + shift callback to add to shelf (maya behavior) modifiers = QtCore.Qt.ControlModifier | QtCore.Qt.ShiftModifier - if int(cmds.about(version=True)) <= 2025: + if int(cmds.about(version=True)) < 2025: modifiers = int(modifiers) menu.register_callback(modifiers, to_shelf) From 274585ced6e7a7c1c4582e0c28ddf0346b4a9039 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 6 Sep 2024 11:41:21 +0300 Subject: [PATCH 081/216] Optimize the code --- .../workfile/workfile_template_builder.py | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 283408452e..abee71f8ec 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -521,19 +521,26 @@ class AbstractTemplateBuilder(ABC): if create_first_version is None: create_first_version = preset["create_first_version"] - # check if first version is created + # Create, open and return the first workfile version. + # This only works if there are no existent files and + # create_first_version is enabled. created_version_workfile = create_first_version and self.create_first_workfile_version() - # Build the template - if ( - not self.host.get_current_workfile() or created_version_workfile - ): + # # Abort the process if workfile_creation_enabled. + # if workfile_creation_enabled: + # return + + # Build the template if the current scene is empty + # or if we have created new file. + # which basically avoids any + if not self.host.get_current_workfile() or created_version_workfile: + self.log.info(f"Building the workfile template: {template_path}") self.import_template(template_path) self.populate_scene_placeholders( level_limit, keep_placeholders) # save workfile if a workfile was created. - if workfile_creation_enabled and created_version_workfile: + if created_version_workfile: self.save_workfile(created_version_workfile) def rebuild_template(self): @@ -833,11 +840,10 @@ class AbstractTemplateBuilder(ABC): keep_placeholder = True if not path: - raise TemplateLoadFailed(( - "Template path is not set.\n" - "Path need to be set in {}\\Template Workfile Build " - "Settings\\Profiles" - ).format(host_name.title())) + self.log.info( + "Template path is not set." + ) + return # Try fill path with environments and anatomy roots anatomy = Anatomy(project_name) From df203db3d7fa5c9e2d8877f550372c96b8496616 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 17:16:28 +0200 Subject: [PATCH 082/216] Refactor the `build_template` function for readability --- .../workfile/workfile_template_builder.py | 68 +++++++++++-------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index abee71f8ec..c535173038 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -15,6 +15,7 @@ import os import re import collections import copy +import warnings from abc import ABC, abstractmethod from ayon_api import ( @@ -489,7 +490,7 @@ class AbstractTemplateBuilder(ABC): level_limit=None, keep_placeholders=None, create_first_version=None, - workfile_creation_enabled=False + workfile_creation_enabled=None ): """Main callback for building workfile from template path. @@ -507,41 +508,49 @@ class AbstractTemplateBuilder(ABC): hosts to decide if they want to remove placeholder after it is used. create_first_version (bool): create first version of a workfile - workfile_creation_enabled (bool): If True, it might create - first version but ignore - process if version is created + workfile_creation_enabled (Any): Deprecated unused variable. """ + + if workfile_creation_enabled is not None: + warnings.warn( + ( + "Using deprecated argument `workfile_creation_enabled`. " + "It has been removed because it remained unused." + ), + category=DeprecationWarning + ) + # Get default values if not provided - if template_path is None or keep_placeholders is None or create_first_version is None: + if ( + template_path is None + or keep_placeholders is None + or create_first_version is None + ): preset = self.get_template_preset() - template_path = template_path or preset["path"] + template_path: str = template_path or preset["path"] if keep_placeholders is None: - keep_placeholders = preset["keep_placeholder"] + keep_placeholders: bool = preset["keep_placeholder"] if create_first_version is None: - create_first_version = preset["create_first_version"] + create_first_version: bool = preset["create_first_version"] - # Create, open and return the first workfile version. - # This only works if there are no existent files and - # create_first_version is enabled. - created_version_workfile = create_first_version and self.create_first_workfile_version() - - # # Abort the process if workfile_creation_enabled. - # if workfile_creation_enabled: - # return - - # Build the template if the current scene is empty - # or if we have created new file. - # which basically avoids any - if not self.host.get_current_workfile() or created_version_workfile: + # Build the template if current workfile is a new unsaved file + # (that's detected by checking if it returns any current filepath) + if not self.host.get_current_workfile(): self.log.info(f"Building the workfile template: {template_path}") self.import_template(template_path) self.populate_scene_placeholders( level_limit, keep_placeholders) - # save workfile if a workfile was created. - if created_version_workfile: - self.save_workfile(created_version_workfile) + if not create_first_version: + # Do not save whatsoever + return + + # If there is no existing workfile, save the first version + workfile_path = self.get_first_workfile_version_to_create() + if workfile_path: + self.log.info("Saving first workfile: %s", workfile_path) + self.save_workfile(workfile_path) def rebuild_template(self): """Go through existing placeholders in scene and update them. @@ -595,7 +604,7 @@ class AbstractTemplateBuilder(ABC): pass - def create_first_workfile_version(self): + def get_first_workfile_version_to_create(self): """ Create first version of workfile. @@ -605,7 +614,12 @@ class AbstractTemplateBuilder(ABC): Args: template_path (str): Fullpath for current task and host's template file. + + Return: + Optional[str]: Filepath to save to, if we should save. """ + # AYON_LAST_WORKFILE will be set to the last existing workfile OR + # if none exist it will be set to the first version. last_workfile_path = os.environ.get("AYON_LAST_WORKFILE") self.log.info("__ last_workfile_path: {}".format(last_workfile_path)) if os.path.exists(last_workfile_path): @@ -613,10 +627,6 @@ class AbstractTemplateBuilder(ABC): self.log.info("Workfile already exists, skipping creation.") return False - # Create first version - self.log.info("Creating first version of workfile.") - self.save_workfile(last_workfile_path) - # Confirm creation of first version return last_workfile_path From f0af0a5700c8f18113099381d37ccfe73e222689 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 17:17:45 +0200 Subject: [PATCH 083/216] Allow custom `resolve_template_path` to be implemented by AYON addon integrations --- .../workfile/workfile_template_builder.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index be5b7437de..b65355fe8b 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -876,6 +876,8 @@ class AbstractTemplateBuilder(ABC): if result.solved: path = result.normalized() + path = self.resolve_template_path(path) + if path and os.path.exists(path): self.log.info("Found template at: '{}'".format(path)) return { @@ -914,6 +916,23 @@ class AbstractTemplateBuilder(ABC): "create_first_version": create_first_version } + def resolve_template_path(self, path: str) -> str: + """Resolve the template path. + + By default, this does nothing except returning the path directly. + But, this allows additional resolving over the template path inside + a custom AYON integration. Like, in Houdini using + `hou.text.expandString` + + Arguments: + path (str): The input path. + + Returns: + str: The resolved path. + + """ + return path + def emit_event(self, topic, data=None, source=None) -> Event: return self._event_system.emit(topic, data, source) From a653ed64e45a20f35f449e8d84a180d5651e4a78 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 17:31:24 +0200 Subject: [PATCH 084/216] :tada: `workfile_creation_enabled` argument was actually useful after all --- .../workfile/workfile_template_builder.py | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index c535173038..9986e8ddae 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -15,7 +15,6 @@ import os import re import collections import copy -import warnings from abc import ABC, abstractmethod from ayon_api import ( @@ -508,19 +507,12 @@ class AbstractTemplateBuilder(ABC): hosts to decide if they want to remove placeholder after it is used. create_first_version (bool): create first version of a workfile - workfile_creation_enabled (Any): Deprecated unused variable. + workfile_creation_enabled (Any): Whether we are creating a new + workfile. If False, we assume we just want to build the + template in our current scene. """ - if workfile_creation_enabled is not None: - warnings.warn( - ( - "Using deprecated argument `workfile_creation_enabled`. " - "It has been removed because it remained unused." - ), - category=DeprecationWarning - ) - # Get default values if not provided if ( template_path is None @@ -542,6 +534,12 @@ class AbstractTemplateBuilder(ABC): self.populate_scene_placeholders( level_limit, keep_placeholders) + if not workfile_creation_enabled: + # Do not consider saving a first workfile version, if this + # is not set to be a "workfile creation". Then we assume + # only the template should get build. + return + if not create_first_version: # Do not save whatsoever return From b470ff214d2c05dbd367e9bf6438caa768aaf39c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 17:33:55 +0200 Subject: [PATCH 085/216] Elaborate `create_first_version` argument to differentiate from `workfile_creation_enabled` --- .../ayon_core/pipeline/workfile/workfile_template_builder.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 9986e8ddae..c28b156e46 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -506,7 +506,10 @@ class AbstractTemplateBuilder(ABC): keep_placeholders (bool): Add flag to placeholder data for hosts to decide if they want to remove placeholder after it is used. - create_first_version (bool): create first version of a workfile + create_first_version (bool): Create first version of a workfile. + When set to True, this option initiates the saving of the + workfile for an initial version. It will skip saving if + a version already exists. workfile_creation_enabled (Any): Whether we are creating a new workfile. If False, we assume we just want to build the template in our current scene. From 0ca2e1044f0efdd3e25cde6ce391b2cd4ab6d8f7 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 17:35:43 +0200 Subject: [PATCH 086/216] Fix argument signature --- .../ayon_core/pipeline/workfile/workfile_template_builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index c28b156e46..e2c06db328 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -489,7 +489,7 @@ class AbstractTemplateBuilder(ABC): level_limit=None, keep_placeholders=None, create_first_version=None, - workfile_creation_enabled=None + workfile_creation_enabled=False ): """Main callback for building workfile from template path. @@ -510,7 +510,7 @@ class AbstractTemplateBuilder(ABC): When set to True, this option initiates the saving of the workfile for an initial version. It will skip saving if a version already exists. - workfile_creation_enabled (Any): Whether we are creating a new + workfile_creation_enabled (bool): Whether we are creating a new workfile. If False, we assume we just want to build the template in our current scene. From 0faaadab51b0e7b74c483a32e406f90b49f45636 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 6 Sep 2024 17:47:25 +0200 Subject: [PATCH 087/216] Fix case of explicit load import and improve docstring --- .../workfile/workfile_template_builder.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index b24a4ab653..8bd9c00773 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -511,8 +511,10 @@ class AbstractTemplateBuilder(ABC): workfile for an initial version. It will skip saving if a version already exists. workfile_creation_enabled (bool): Whether we are creating a new - workfile. If False, we assume we just want to build the - template in our current scene. + workfile. If False, we assume we explicitly want to build the + template in our current scene. Otherwise we only build if the + current file is not an existing saved workfile but a "new" + file. """ @@ -531,7 +533,14 @@ class AbstractTemplateBuilder(ABC): # Build the template if current workfile is a new unsaved file # (that's detected by checking if it returns any current filepath) - if not self.host.get_current_workfile(): + if ( + # If not a workfile creation, an explicit load template + # was requested, so we always want to build the template + not workfile_creation_enabled + # Or if workfile creation, but we're not in an active file + # we still need to build the "new workfile template" + or not self.host.get_current_workfile() + ): self.log.info(f"Building the workfile template: {template_path}") self.import_template(template_path) self.populate_scene_placeholders( From a27157f46d90b8f08fc858583dc4dd85ffc15940 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 15:58:20 +0200 Subject: [PATCH 088/216] Please @fabiaserra's eyes with better indentation --- .../pipeline/workfile/workfile_template_builder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 8bd9c00773..aaa8a951c2 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -520,9 +520,9 @@ class AbstractTemplateBuilder(ABC): # Get default values if not provided if ( - template_path is None - or keep_placeholders is None - or create_first_version is None + template_path is None + or keep_placeholders is None + or create_first_version is None ): preset = self.get_template_preset() template_path: str = template_path or preset["path"] From 3df68ef2a5b1e6c8bda457b96ebfe153480e1bbe Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 15:59:32 +0200 Subject: [PATCH 089/216] `workfile_creation_enabled` docstring, first explain the `True` case. --- .../pipeline/workfile/workfile_template_builder.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index aaa8a951c2..9537096794 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -511,10 +511,11 @@ class AbstractTemplateBuilder(ABC): workfile for an initial version. It will skip saving if a version already exists. workfile_creation_enabled (bool): Whether we are creating a new - workfile. If False, we assume we explicitly want to build the - template in our current scene. Otherwise we only build if the - current file is not an existing saved workfile but a "new" - file. + workfile. When True, we only build if the current file is not + an existing saved workfile but a "new" file. When False, the + default value, we assume we explicitly want to build the + template in our current scene regardless of current scene + state. """ From e7f7eaba680a779323f1a4cd1b28d68d8c346593 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 16:01:57 +0200 Subject: [PATCH 090/216] Elaborate more --- .../workfile/workfile_template_builder.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 9537096794..86cb4b3f86 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -510,12 +510,15 @@ class AbstractTemplateBuilder(ABC): When set to True, this option initiates the saving of the workfile for an initial version. It will skip saving if a version already exists. - workfile_creation_enabled (bool): Whether we are creating a new - workfile. When True, we only build if the current file is not - an existing saved workfile but a "new" file. When False, the - default value, we assume we explicitly want to build the - template in our current scene regardless of current scene - state. + workfile_creation_enabled (bool): Whether the call is part of + creating a new workfile. + When True, we only build if the current file is not + an existing saved workfile but a "new" file. Basically when + enabled we assume the user tries to load it only into a + "New File" (unsaved empty workfile). + When False, the default value, we assume we explicitly want to + build the template in our current scene regardless of current + scene state. """ From 522b205a92625eb5c2188f8f6e0d5b6a7bb6e72b Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 16:07:17 +0200 Subject: [PATCH 091/216] Refactor logic with better function names --- .../workfile/workfile_template_builder.py | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 86cb4b3f86..7ea69b3f8f 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -561,10 +561,14 @@ class AbstractTemplateBuilder(ABC): return # If there is no existing workfile, save the first version - workfile_path = self.get_first_workfile_version_to_create() - if workfile_path: + workfile_path = self.get_workfile_path() + if not os.path.exists(workfile_path): self.log.info("Saving first workfile: %s", workfile_path) self.save_workfile(workfile_path) + else: + self.log.info( + "A workfile already exists. Skipping save of workfile as " + "initial version.") def rebuild_template(self): """Go through existing placeholders in scene and update them. @@ -618,30 +622,16 @@ class AbstractTemplateBuilder(ABC): pass - def get_first_workfile_version_to_create(self): - """ - Create first version of workfile. - - Should load the content of template into scene so - 'populate_scene_placeholders' can be started. - - Args: - template_path (str): Fullpath for current task and - host's template file. + def get_workfile_path(self): + """Return last known workfile path or the first workfile path create. Return: - Optional[str]: Filepath to save to, if we should save. + str: Last workfile path, or first version to create if none exist. """ # AYON_LAST_WORKFILE will be set to the last existing workfile OR # if none exist it will be set to the first version. last_workfile_path = os.environ.get("AYON_LAST_WORKFILE") self.log.info("__ last_workfile_path: {}".format(last_workfile_path)) - if os.path.exists(last_workfile_path): - # ignore in case workfile existence - self.log.info("Workfile already exists, skipping creation.") - return False - - # Confirm creation of first version return last_workfile_path def save_workfile(self, workfile_path): From d65b84cf2fea40c615fdf04a14831175e1e37c59 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 16:09:21 +0200 Subject: [PATCH 092/216] Tweak comment to describe both the cases in the if statement --- .../ayon_core/pipeline/workfile/workfile_template_builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 7ea69b3f8f..8495529924 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -535,8 +535,8 @@ class AbstractTemplateBuilder(ABC): if create_first_version is None: create_first_version: bool = preset["create_first_version"] - # Build the template if current workfile is a new unsaved file - # (that's detected by checking if it returns any current filepath) + # Build the template if we are explicitly requesting it or if it's + # an unsaved "new file". if ( # If not a workfile creation, an explicit load template # was requested, so we always want to build the template From cfcce2138347a0928e42021384960a87797bc567 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 16:14:25 +0200 Subject: [PATCH 093/216] Separate into variables for readability --- .../pipeline/workfile/workfile_template_builder.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 8495529924..673ca7922e 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -537,14 +537,9 @@ class AbstractTemplateBuilder(ABC): # Build the template if we are explicitly requesting it or if it's # an unsaved "new file". - if ( - # If not a workfile creation, an explicit load template - # was requested, so we always want to build the template - not workfile_creation_enabled - # Or if workfile creation, but we're not in an active file - # we still need to build the "new workfile template" - or not self.host.get_current_workfile() - ): + is_new_file = not self.host.get_current_workfile() + explicit_build_requested = not workfile_creation_enabled + if is_new_file or explicit_build_requested: self.log.info(f"Building the workfile template: {template_path}") self.import_template(template_path) self.populate_scene_placeholders( From a8a69766ad00ea56b51f5e0c8dd3bdffebc1c67d Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 16:22:29 +0200 Subject: [PATCH 094/216] Move more logic into the `resolve_template_path` method --- .../workfile/workfile_template_builder.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index b65355fe8b..51dcb48420 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -872,11 +872,7 @@ class AbstractTemplateBuilder(ABC): "code": anatomy.project_code, } - result = StringTemplate.format_template(path, fill_data) - if result.solved: - path = result.normalized() - - path = self.resolve_template_path(path) + path = self.resolve_template_path(path, fill_data) if path and os.path.exists(path): self.log.info("Found template at: '{}'".format(path)) @@ -916,21 +912,25 @@ class AbstractTemplateBuilder(ABC): "create_first_version": create_first_version } - def resolve_template_path(self, path: str) -> str: + def resolve_template_path(self, path, fill_data) -> str: """Resolve the template path. By default, this does nothing except returning the path directly. - But, this allows additional resolving over the template path inside - a custom AYON integration. Like, in Houdini using - `hou.text.expandString` + + This can be overridden in host integrations to perform additional + resolving over the template. Like, `hou.text.expandString` in Houdini. Arguments: path (str): The input path. + fill_data (dict[str, str]): Data to use for template formatting. Returns: str: The resolved path. """ + result = StringTemplate.format_template(path, fill_data) + if result.solved: + path = result.normalized() return path def emit_event(self, topic, data=None, source=None) -> Event: From 0f0b7db2e1f01c57911baa323bedfb77b4922474 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 16:22:37 +0200 Subject: [PATCH 095/216] Fix grammar in comment --- client/ayon_core/pipeline/workfile/workfile_template_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 51dcb48420..c38725ffba 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -859,7 +859,7 @@ class AbstractTemplateBuilder(ABC): "Settings\\Profiles" ).format(host_name.title())) - # Try fill path with environments and anatomy roots + # Try to fill path with environments and anatomy roots anatomy = Anatomy(project_name) fill_data = { key: value From 057a5fffcf96a6c7dc48efb845e21c47de935d6a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 9 Sep 2024 17:23:26 +0200 Subject: [PATCH 096/216] Simplify logic --- .../pipeline/workfile/workfile_template_builder.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 673ca7922e..026eacc19f 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -545,14 +545,9 @@ class AbstractTemplateBuilder(ABC): self.populate_scene_placeholders( level_limit, keep_placeholders) - if not workfile_creation_enabled: - # Do not consider saving a first workfile version, if this - # is not set to be a "workfile creation". Then we assume - # only the template should get build. - return - - if not create_first_version: - # Do not save whatsoever + # Do not consider saving a first workfile version, if this is not set + # to be a "workfile creation" or `create_first_version` is disabled. + if explicit_build_requested or not create_first_version: return # If there is no existing workfile, save the first version From 2a2b9563123818969bf9910bf19c826a7493d378 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 10:46:50 +0200 Subject: [PATCH 097/216] do not log into console during publishing --- .../tools/publisher/models/publish.py | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index a60ef69fac..c22f2d263c 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -1,6 +1,7 @@ import uuid import copy import inspect +import logging import traceback import collections from functools import partial @@ -23,6 +24,14 @@ PUBLISH_EVENT_SOURCE = "publisher.publish.model" PLUGIN_ORDER_OFFSET = 0.5 +class MessageHandler(logging.Handler): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.records = [] + + def emit(self, record): + self.records.append(record) + class PublishReportMaker: """Report for single publishing process. @@ -869,6 +878,9 @@ class PublishModel: # - pop the key after first collector using it would be safest option? self._publish_context.data["create_context"] = create_context publish_plugins = create_context.publish_plugins + for plugin in publish_plugins: + plugin.log.propagate = False + self._publish_plugins = publish_plugins self._publish_plugins_proxy = PublishPluginsProxy( publish_plugins @@ -1219,9 +1231,18 @@ class PublishModel: plugin: pyblish.api.Plugin, instance: pyblish.api.Instance ): - result = pyblish.plugin.process( - plugin, self._publish_context, instance - ) + handler = MessageHandler() + root = logging.getLogger() + plugin.log.addHandler(handler) + root.addHandler(handler) + try: + result = pyblish.plugin.process( + plugin, self._publish_context, instance + ) + result["records"] = handler.records + finally: + plugin.log.removeHandler(handler) + root.removeHandler(handler) exception = result.get("error") if exception: From 6099d4a5ae00b5c7a0ea20672eb61e8fe5b021ca Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:03:44 +0200 Subject: [PATCH 098/216] move propagate to publish iterator --- client/ayon_core/tools/publisher/models/publish.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index c22f2d263c..2041faab54 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -878,9 +878,6 @@ class PublishModel: # - pop the key after first collector using it would be safest option? self._publish_context.data["create_context"] = create_context publish_plugins = create_context.publish_plugins - for plugin in publish_plugins: - plugin.log.propagate = False - self._publish_plugins = publish_plugins self._publish_plugins_proxy = PublishPluginsProxy( publish_plugins @@ -1233,6 +1230,8 @@ class PublishModel: ): handler = MessageHandler() root = logging.getLogger() + + plugin.log.propagate = False plugin.log.addHandler(handler) root.addHandler(handler) try: @@ -1241,6 +1240,7 @@ class PublishModel: ) result["records"] = handler.records finally: + plugin.log.propagate = True plugin.log.removeHandler(handler) root.removeHandler(handler) From 4c809f9278364057252e11a833d5e1f524a13c8a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:09:47 +0200 Subject: [PATCH 099/216] calculate message at the time of emit --- client/ayon_core/tools/publisher/models/publish.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index 2041faab54..4c21a6d5b5 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -30,6 +30,7 @@ class MessageHandler(logging.Handler): self.records = [] def emit(self, record): + record.msg = record.getMessage() self.records.append(record) From 17f76c761f93539f4d00b0fe9981755852fac5df Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:01:47 +0200 Subject: [PATCH 100/216] use explicit margins --- client/ayon_core/tools/publisher/widgets/report_page.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index 09b722ea54..4eb71ccc99 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1740,11 +1740,8 @@ class ReportsWidget(QtWidgets.QWidget): pages_layout.addWidget(crash_widget, 1) details_layout = QtWidgets.QVBoxLayout(details_widget) - margins = details_layout.contentsMargins() - margins.setTop(margins.top() * 2) - margins.setBottom(margins.bottom() * 2) - details_layout.setContentsMargins(margins) - details_layout.setSpacing(margins.top()) + details_layout.setContentsMargins(8, 16, 8, 16) + details_layout.setSpacing(8) details_layout.addWidget(actions_widget, 0) details_layout.addWidget(pages_widget, 1) From 56b8ca9d38dbce36bf8a3dd6e47332b203305062 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:02:01 +0200 Subject: [PATCH 101/216] added is_unknown_error to error info --- client/ayon_core/tools/publisher/models/publish.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index e0ceea825a..b0a360fcda 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -30,10 +30,12 @@ class PublishErrorInfo: def __init__( self, description: str, + is_unknown_error: bool, title: Optional[str], - detail: Optional[str] + detail: Optional[str], ): self.description: str = description + self.is_unknown_error = is_unknown_error self.title: Optional[str] = title self.detail: Optional[str] = detail @@ -42,6 +44,7 @@ class PublishErrorInfo: return False return ( self.description == other.description + and self.is_unknown_error == other.is_unknown_error and self.title == other.title and self.detail == other.detail ) @@ -55,6 +58,7 @@ class PublishErrorInfo: if isinstance(exc, PublishError): return cls( exc.description or exc.message, + is_unknown_error=False, title=exc.title or title, detail=exc.detail, ) @@ -65,7 +69,7 @@ class PublishErrorInfo: "Something went wrong. Send report" " to your supervisor or Ynput team." ) - return cls(msg, title, None) + return cls(msg, True, title, None) class PublishReportMaker: From 58fc67eed880d25a9a060d9e0a81b6480a3b08b9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:02:19 +0200 Subject: [PATCH 102/216] make logs visible based on unknown error --- .../tools/publisher/widgets/report_page.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index 4eb71ccc99..d0af34035f 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1588,8 +1588,7 @@ class CrashWidget(QtWidgets.QWidget): self._detail_widget = detail_widget self._controller: AbstractPublisherFrontend = controller - def update_error_info(self): - error_info = self._controller.get_publish_error_info() + def update_error_info(self, error_info): if error_info is None: self._title_label.setText("Placeholder title") self._description_label.setText("A bug happened if you see this") @@ -1799,8 +1798,9 @@ class ReportsWidget(QtWidgets.QWidget): def update_data(self): view = self._instances_view validation_error_mode = False + is_crashed = self._controller.publish_has_crashed() if ( - not self._controller.publish_has_crashed() + not is_crashed and self._controller.publish_has_validation_errors() ): view = self._validation_error_view @@ -1811,11 +1811,15 @@ class ReportsWidget(QtWidgets.QWidget): self._detail_input_scroll.setVisible(validation_error_mode) self._views_layout.setCurrentWidget(view) - is_crashed = self._controller.publish_has_crashed() - self._crash_widget.setVisible(is_crashed) - self._logs_view.setVisible(not is_crashed) + error_info = self._controller.get_publish_error_info() + logs_visible = True + if is_crashed and error_info.is_unknown_error: + logs_visible = False - self._crash_widget.update_error_info() + self._crash_widget.setVisible(is_crashed) + self._logs_view.setVisible(logs_visible) + + self._crash_widget.update_error_info(error_info) # Instance view & logs update instance_items = self._get_instance_items() From 079a7967b784b59500eefb39d542534edf75e762 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:02:28 +0200 Subject: [PATCH 103/216] move crash widget to left --- client/ayon_core/tools/publisher/widgets/report_page.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index d0af34035f..ebe84457f9 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1708,6 +1708,9 @@ class ReportsWidget(QtWidgets.QWidget): pages_widget = QtWidgets.QWidget(details_widget) + # Crash information + crash_widget = CrashWidget(controller, details_widget) + # Logs view logs_view = InstancesLogsView(pages_widget) @@ -1727,16 +1730,13 @@ class ReportsWidget(QtWidgets.QWidget): detail_input_scroll.setWidgetResizable(True) detail_input_scroll.setViewportMargins(0, 0, 0, 0) - # Crash information - crash_widget = CrashWidget(controller, details_widget) - # Layout pages pages_layout = QtWidgets.QHBoxLayout(pages_widget) pages_layout.setContentsMargins(0, 0, 0, 0) + pages_layout.addWidget(crash_widget, 1) pages_layout.addWidget(logs_view, 1) pages_layout.addWidget(detail_inputs_spacer, 0) pages_layout.addWidget(detail_input_scroll, 1) - pages_layout.addWidget(crash_widget, 1) details_layout = QtWidgets.QVBoxLayout(details_widget) details_layout.setContentsMargins(8, 16, 8, 16) From 66353ec8c4f0d81d29c7b1ef7fd997e07bf754ec Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 18:29:48 +0200 Subject: [PATCH 104/216] change how context validation happens on instances --- client/ayon_core/pipeline/create/context.py | 127 +++++++++++++----- .../ayon_core/pipeline/create/structures.py | 76 +++++------ client/ayon_core/tools/publisher/abstract.py | 6 + client/ayon_core/tools/publisher/control.py | 3 + .../tools/publisher/models/create.py | 8 ++ .../publisher/widgets/card_view_widgets.py | 44 +++--- .../publisher/widgets/list_view_widgets.py | 29 ++-- .../tools/publisher/widgets/widgets.py | 26 +++- client/ayon_core/tools/publisher/window.py | 16 ++- 9 files changed, 213 insertions(+), 122 deletions(-) diff --git a/client/ayon_core/pipeline/create/context.py b/client/ayon_core/pipeline/create/context.py index 3f067427fa..7706860499 100644 --- a/client/ayon_core/pipeline/create/context.py +++ b/client/ayon_core/pipeline/create/context.py @@ -6,7 +6,8 @@ import traceback import collections import inspect from contextlib import contextmanager -from typing import Optional +import typing +from typing import Optional, Iterable, Dict import pyblish.logic import pyblish.api @@ -31,13 +32,15 @@ from .exceptions import ( HostMissRequiredMethod, ) from .changes import TrackChangesItem -from .structures import PublishAttributes, ConvertorItem +from .structures import PublishAttributes, ConvertorItem, InstanceContextInfo from .creator_plugins import ( Creator, AutoCreator, discover_creator_plugins, discover_convertor_plugins, ) +if typing.TYPE_CHECKING: + from .structures import CreatedInstance # Import of functions and classes that were moved to different file # TODO Should be removed in future release - Added 24/08/28, 0.4.3-dev.1 @@ -183,6 +186,10 @@ class CreateContext: # Shared data across creators during collection phase self._collection_shared_data = None + # Context validation cache + self._folder_id_by_folder_path = {} + self._task_names_by_folder_path = {} + self.thumbnail_paths_by_instance_id = {} # Trigger reset if was enabled @@ -202,17 +209,19 @@ class CreateContext: """Access to global publish attributes.""" return self._publish_attributes - def get_instance_by_id(self, instance_id): + def get_instance_by_id( + self, instance_id: str + ) -> Optional["CreatedInstance"]: """Receive instance by id. Args: instance_id (str): Instance id. Returns: - Union[CreatedInstance, None]: Instance or None if instance with + Optional[CreatedInstance]: Instance or None if instance with given id is not available. - """ + """ return self._instances_by_id.get(instance_id) def get_sorted_creators(self, identifiers=None): @@ -224,8 +233,8 @@ class CreateContext: Returns: List[BaseCreator]: Sorted creator plugins by 'order' value. - """ + """ if identifiers is not None: identifiers = set(identifiers) creators = [ @@ -491,6 +500,8 @@ class CreateContext: # Give ability to store shared data for collection phase self._collection_shared_data = {} + self._folder_id_by_folder_path = {} + self._task_names_by_folder_path = {} def reset_finalization(self): """Cleanup of attributes after reset.""" @@ -715,7 +726,7 @@ class CreateContext: self._original_context_data, self.context_data_to_store() ) - def creator_adds_instance(self, instance): + def creator_adds_instance(self, instance: "CreatedInstance"): """Creator adds new instance to context. Instances should be added only from creators. @@ -942,7 +953,7 @@ class CreateContext: def _remove_instance(self, instance): self._instances_by_id.pop(instance.id, None) - def creator_removed_instance(self, instance): + def creator_removed_instance(self, instance: "CreatedInstance"): """When creator removes instance context should be acknowledged. If creator removes instance conext should know about it to avoid @@ -990,7 +1001,7 @@ class CreateContext: [], self._bulk_instances_to_process ) - self.validate_instances_context(instances_to_validate) + self.get_instances_context_info(instances_to_validate) def reset_instances(self): """Reload instances""" @@ -1079,26 +1090,70 @@ class CreateContext: if failed_info: raise CreatorsCreateFailed(failed_info) - def validate_instances_context(self, instances=None): - """Validate 'folder' and 'task' instance context.""" + def get_instances_context_info( + self, instances: Optional[Iterable["CreatedInstance"]] = None + ) -> Dict[str, InstanceContextInfo]: + """Validate 'folder' and 'task' instance context. + + Args: + instances (Optional[Iterable[CreatedInstance]]): Instances to + validate. If not provided all instances are validated. + + Returns: + Dict[str, InstanceContextInfo]: Validation results by instance id. + + """ # Use all instances from context if 'instances' are not passed if instances is None: - instances = tuple(self._instances_by_id.values()) + instances = self._instances_by_id.values() + instances = tuple(instances) + info_by_instance_id = { + instance.id: InstanceContextInfo( + instance.get("folderPath"), + instance.get("task"), + False, + False, + ) + for instance in instances + } # Skip if instances are empty - if not instances: - return + if not info_by_instance_id: + return info_by_instance_id project_name = self.project_name - task_names_by_folder_path = {} + to_validate = [] + task_names_by_folder_path = collections.defaultdict(set) for instance in instances: - folder_path = instance.get("folderPath") - task_name = instance.get("task") - if folder_path: - task_names_by_folder_path[folder_path] = set() - if task_name: - task_names_by_folder_path[folder_path].add(task_name) + context_info = info_by_instance_id[instance.id] + if instance.has_promised_context: + context_info.folder_is_valid = True + context_info.task_is_valid = True + continue + # TODO allow context promise + folder_path = context_info.folder_path + if not folder_path: + continue + + if folder_path in self._folder_id_by_folder_path: + folder_id = self._folder_id_by_folder_path[folder_path] + if folder_id is None: + continue + context_info.folder_is_valid = True + + task_name = context_info.task_name + if task_name is not None: + tasks_cache = self._task_names_by_folder_path.get(folder_path) + if tasks_cache is not None: + context_info.task_is_valid = task_name in tasks_cache + continue + + to_validate.append(instance) + task_names_by_folder_path[folder_path].add(task_name) + + if not to_validate: + return info_by_instance_id # Backwards compatibility for cases where folder name is set instead # of folder path @@ -1120,7 +1175,9 @@ class CreateContext: fields={"id", "path"} ): folder_id = folder_entity["id"] - folder_paths_by_id[folder_id] = folder_entity["path"] + folder_path = folder_entity["path"] + folder_paths_by_id[folder_id] = folder_path + self._folder_id_by_folder_path[folder_path] = folder_id folder_entities_by_name = collections.defaultdict(list) if folder_names: @@ -1131,8 +1188,10 @@ class CreateContext: ): folder_id = folder_entity["id"] folder_name = folder_entity["name"] - folder_paths_by_id[folder_id] = folder_entity["path"] + folder_path = folder_entity["path"] + folder_paths_by_id[folder_id] = folder_path folder_entities_by_name[folder_name].append(folder_entity) + self._folder_id_by_folder_path[folder_path] = folder_id tasks_entities = ayon_api.get_tasks( project_name, @@ -1145,12 +1204,11 @@ class CreateContext: folder_id = task_entity["folderId"] folder_path = folder_paths_by_id[folder_id] task_names_by_folder_path[folder_path].add(task_entity["name"]) + self._task_names_by_folder_path.update(task_names_by_folder_path) - for instance in instances: - if not instance.has_valid_folder or not instance.has_valid_task: - continue - + for instance in to_validate: folder_path = instance["folderPath"] + task_name = instance.get("task") if folder_path and "/" not in folder_path: folder_entities = folder_entities_by_name.get(folder_path) if len(folder_entities) == 1: @@ -1158,15 +1216,16 @@ class CreateContext: instance["folderPath"] = folder_path if folder_path not in task_names_by_folder_path: - instance.set_folder_invalid(True) continue + context_info = info_by_instance_id[instance.id] + context_info.folder_is_valid = True - task_name = instance["task"] - if not task_name: - continue - - if task_name not in task_names_by_folder_path[folder_path]: - instance.set_task_invalid(True) + if ( + not task_name + or task_name in task_names_by_folder_path[folder_path] + ): + context_info.task_is_valid = True + return info_by_instance_id def save_changes(self): """Save changes. Update all changed values.""" diff --git a/client/ayon_core/pipeline/create/structures.py b/client/ayon_core/pipeline/create/structures.py index 4f7caa6e11..311d382ac9 100644 --- a/client/ayon_core/pipeline/create/structures.py +++ b/client/ayon_core/pipeline/create/structures.py @@ -1,6 +1,7 @@ import copy import collections from uuid import uuid4 +from typing import Optional from ayon_core.lib.attribute_definitions import ( UnknownDef, @@ -396,6 +397,24 @@ class PublishAttributes: ) +class InstanceContextInfo: + def __init__( + self, + folder_path: Optional[str], + task_name: Optional[str], + folder_is_valid: bool, + task_is_valid: bool, + ): + self.folder_path: Optional[str] = folder_path + self.task_name: Optional[str] = task_name + self.folder_is_valid: bool = folder_is_valid + self.task_is_valid: bool = task_is_valid + + @property + def is_valid(self) -> bool: + return self.folder_is_valid and self.task_is_valid + + class CreatedInstance: """Instance entity with data that will be stored to workfile. @@ -528,9 +547,6 @@ class CreatedInstance: if not self._data.get("instance_id"): self._data["instance_id"] = str(uuid4()) - self._folder_is_valid = self.has_set_folder - self._task_is_valid = self.has_set_task - def __str__(self): return ( " bool: + """Get context data that are promised to be set by creator. + + Returns: + bool: Has context that won't bo validated. Artist can't change + value when set to True. + + """ + return self._data.get("has_promised_context", False) + def data_to_store(self): """Collect data that contain json parsable types. @@ -826,46 +853,3 @@ class CreatedInstance: obj.publish_attributes.deserialize_attributes(publish_attributes) return obj - - # Context validation related methods/properties - @property - def has_set_folder(self): - """Folder path is set in data.""" - - return "folderPath" in self._data - - @property - def has_set_task(self): - """Task name is set in data.""" - - return "task" in self._data - - @property - def has_valid_context(self): - """Context data are valid for publishing.""" - - return self.has_valid_folder and self.has_valid_task - - @property - def has_valid_folder(self): - """Folder set in context exists in project.""" - - if not self.has_set_folder: - return False - return self._folder_is_valid - - @property - def has_valid_task(self): - """Task set in context exists in project.""" - - if not self.has_set_task: - return False - return self._task_is_valid - - def set_folder_invalid(self, invalid): - # TODO replace with `set_folder_path` - self._folder_is_valid = not invalid - - def set_task_invalid(self, invalid): - # TODO replace with `set_task_name` - self._task_is_valid = not invalid diff --git a/client/ayon_core/tools/publisher/abstract.py b/client/ayon_core/tools/publisher/abstract.py index 362fa38882..ad566eb354 100644 --- a/client/ayon_core/tools/publisher/abstract.py +++ b/client/ayon_core/tools/publisher/abstract.py @@ -322,6 +322,12 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): ) -> Dict[str, Union[CreatedInstance, None]]: pass + @abstractmethod + def get_instances_context_info( + self, instance_ids: Optional[Iterable[str]] = None + ): + pass + @abstractmethod def get_existing_product_names(self, folder_path: str) -> List[str]: pass diff --git a/client/ayon_core/tools/publisher/control.py b/client/ayon_core/tools/publisher/control.py index 257b45de08..fe1545f219 100644 --- a/client/ayon_core/tools/publisher/control.py +++ b/client/ayon_core/tools/publisher/control.py @@ -190,6 +190,9 @@ class PublisherController( def get_instances_by_id(self, instance_ids=None): return self._create_model.get_instances_by_id(instance_ids) + def get_instances_context_info(self, instance_ids=None): + return self._create_model.get_instances_context_info(instance_ids) + def get_convertor_items(self): return self._create_model.get_convertor_items() diff --git a/client/ayon_core/tools/publisher/models/create.py b/client/ayon_core/tools/publisher/models/create.py index 9fe114f4bd..dcd2ce4acc 100644 --- a/client/ayon_core/tools/publisher/models/create.py +++ b/client/ayon_core/tools/publisher/models/create.py @@ -306,6 +306,14 @@ class CreateModel: for instance_id in instance_ids } + def get_instances_context_info( + self, instance_ids: Optional[Iterable[str]] = None + ): + instances = self.get_instances_by_id(instance_ids).values() + return self._create_context.get_instances_context_info( + instances + ) + def get_convertor_items(self) -> Dict[str, ConvertorItem]: return self._create_context.convertor_items_by_id diff --git a/client/ayon_core/tools/publisher/widgets/card_view_widgets.py b/client/ayon_core/tools/publisher/widgets/card_view_widgets.py index d67252e302..c0e27d9c60 100644 --- a/client/ayon_core/tools/publisher/widgets/card_view_widgets.py +++ b/client/ayon_core/tools/publisher/widgets/card_view_widgets.py @@ -217,20 +217,22 @@ class InstanceGroupWidget(BaseGroupWidget): def update_icons(self, group_icons): self._group_icons = group_icons - def update_instance_values(self): + def update_instance_values(self, context_info_by_id): """Trigger update on instance widgets.""" - for widget in self._widgets_by_id.values(): - widget.update_instance_values() + for instance_id, widget in self._widgets_by_id.items(): + widget.update_instance_values(context_info_by_id[instance_id]) - def update_instances(self, instances): + def update_instances(self, instances, context_info_by_id): """Update instances for the group. Args: - instances(list): List of instances in + instances (list[CreatedInstance]): List of instances in CreateContext. - """ + context_info_by_id (Dict[str, InstanceContextInfo]): Instance + context info by instance id. + """ # Store instances by id and by product name instances_by_id = {} instances_by_product_name = collections.defaultdict(list) @@ -249,13 +251,14 @@ class InstanceGroupWidget(BaseGroupWidget): widget_idx = 1 for product_names in sorted_product_names: for instance in instances_by_product_name[product_names]: + context_info = context_info_by_id[instance.id] if instance.id in self._widgets_by_id: widget = self._widgets_by_id[instance.id] - widget.update_instance(instance) + widget.update_instance(instance, context_info) else: group_icon = self._group_icons[instance.creator_identifier] widget = InstanceCardWidget( - instance, group_icon, self + instance, context_info, group_icon, self ) widget.selected.connect(self._on_widget_selection) widget.active_changed.connect(self._on_active_changed) @@ -388,7 +391,7 @@ class ConvertorItemCardWidget(CardWidget): self._icon_widget = icon_widget self._label_widget = label_widget - def update_instance_values(self): + def update_instance_values(self, context_info): pass @@ -397,7 +400,7 @@ class InstanceCardWidget(CardWidget): active_changed = QtCore.Signal(str, bool) - def __init__(self, instance, group_icon, parent): + def __init__(self, instance, context_info, group_icon, parent): super().__init__(parent) self._id = instance.id @@ -458,7 +461,7 @@ class InstanceCardWidget(CardWidget): self._active_checkbox = active_checkbox self._expand_btn = expand_btn - self.update_instance_values() + self.update_instance_values(context_info) def set_active_toggle_enabled(self, enabled): self._active_checkbox.setEnabled(enabled) @@ -480,13 +483,13 @@ class InstanceCardWidget(CardWidget): if checkbox_value != new_value: self._active_checkbox.setChecked(new_value) - def update_instance(self, instance): + def update_instance(self, instance, context_info): """Update instance object and update UI.""" self.instance = instance - self.update_instance_values() + self.update_instance_values(context_info) - def _validate_context(self): - valid = self.instance.has_valid_context + def _validate_context(self, context_info): + valid = context_info.is_valid self._icon_widget.setVisible(valid) self._context_warning.setVisible(not valid) @@ -519,11 +522,11 @@ class InstanceCardWidget(CardWidget): QtCore.Qt.NoTextInteraction ) - def update_instance_values(self): + def update_instance_values(self, context_info): """Update instance data""" self._update_product_name() self.set_active(self.instance["active"]) - self._validate_context() + self._validate_context(context_info) def _set_expanded(self, expanded=None): if expanded is None: @@ -694,6 +697,8 @@ class InstanceCardView(AbstractInstanceView): self._update_convertor_items_group() + context_info_by_id = self._controller.get_instances_context_info() + # Prepare instances by group and identifiers by group instances_by_group = collections.defaultdict(list) identifiers_by_group = collections.defaultdict(set) @@ -747,7 +752,7 @@ class InstanceCardView(AbstractInstanceView): widget_idx += 1 group_widget.update_instances( - instances_by_group[group_name] + instances_by_group[group_name], context_info_by_id ) group_widget.set_active_toggle_enabled( self._active_toggle_enabled @@ -814,8 +819,9 @@ class InstanceCardView(AbstractInstanceView): def refresh_instance_states(self): """Trigger update of instances on group widgets.""" + context_info_by_id = self._controller.get_instances_context_info() for widget in self._widgets_by_group.values(): - widget.update_instance_values() + widget.update_instance_values(context_info_by_id) def _on_active_changed(self, group_name, instance_id, value): group_widget = self._widgets_by_group[group_name] diff --git a/client/ayon_core/tools/publisher/widgets/list_view_widgets.py b/client/ayon_core/tools/publisher/widgets/list_view_widgets.py index 930d6bb88c..ab9f2db52c 100644 --- a/client/ayon_core/tools/publisher/widgets/list_view_widgets.py +++ b/client/ayon_core/tools/publisher/widgets/list_view_widgets.py @@ -115,7 +115,7 @@ class InstanceListItemWidget(QtWidgets.QWidget): active_changed = QtCore.Signal(str, bool) double_clicked = QtCore.Signal() - def __init__(self, instance, parent): + def __init__(self, instance, context_info, parent): super().__init__(parent) self.instance = instance @@ -151,7 +151,7 @@ class InstanceListItemWidget(QtWidgets.QWidget): self._has_valid_context = None - self._set_valid_property(instance.has_valid_context) + self._set_valid_property(context_info.is_valid) def mouseDoubleClickEvent(self, event): widget = self.childAt(event.pos()) @@ -188,12 +188,12 @@ class InstanceListItemWidget(QtWidgets.QWidget): if checkbox_value != new_value: self._active_checkbox.setChecked(new_value) - def update_instance(self, instance): + def update_instance(self, instance, context_info): """Update instance object.""" self.instance = instance - self.update_instance_values() + self.update_instance_values(context_info) - def update_instance_values(self): + def update_instance_values(self, context_info): """Update instance data propagated to widgets.""" # Check product name label = self.instance.label @@ -202,7 +202,7 @@ class InstanceListItemWidget(QtWidgets.QWidget): # Check active state self.set_active(self.instance["active"]) # Check valid states - self._set_valid_property(self.instance.has_valid_context) + self._set_valid_property(context_info.is_valid) def _on_active_change(self): new_value = self._active_checkbox.isChecked() @@ -583,6 +583,8 @@ class InstanceListView(AbstractInstanceView): self._update_convertor_items_group() + context_info_by_id = self._controller.get_instances_context_info() + # Prepare instances by their groups instances_by_group_name = collections.defaultdict(list) group_names = set() @@ -643,13 +645,15 @@ class InstanceListView(AbstractInstanceView): elif activity != instance["active"]: activity = -1 + context_info = context_info_by_id[instance_id] + self._group_by_instance_id[instance_id] = group_name # Remove instance id from `to_remove` if already exists and # trigger update of widget if instance_id in to_remove: to_remove.remove(instance_id) widget = self._widgets_by_id[instance_id] - widget.update_instance(instance) + widget.update_instance(instance, context_info) continue # Create new item and store it as new @@ -695,7 +699,8 @@ class InstanceListView(AbstractInstanceView): group_item.appendRows(new_items) for item, instance in new_items_with_instance: - if not instance.has_valid_context: + context_info = context_info_by_id[instance.id] + if not context_info.is_valid: expand_groups.add(group_name) item_index = self._instance_model.index( item.row(), @@ -704,7 +709,7 @@ class InstanceListView(AbstractInstanceView): ) proxy_index = self._proxy_model.mapFromSource(item_index) widget = InstanceListItemWidget( - instance, self._instance_view + instance, context_info, self._instance_view ) widget.set_active_toggle_enabled( self._active_toggle_enabled @@ -870,8 +875,10 @@ class InstanceListView(AbstractInstanceView): def refresh_instance_states(self): """Trigger update of all instances.""" - for widget in self._widgets_by_id.values(): - widget.update_instance_values() + context_info_by_id = self._controller.get_instances_context_info() + for instance_id, widget in self._widgets_by_id.items(): + context_info = context_info_by_id[instance_id] + widget.update_instance_values(context_info) def _on_active_changed(self, changed_instance_id, new_value): selected_instance_ids, _, _ = self.get_selected_items() diff --git a/client/ayon_core/tools/publisher/widgets/widgets.py b/client/ayon_core/tools/publisher/widgets/widgets.py index 1f782ddc67..4ad527126b 100644 --- a/client/ayon_core/tools/publisher/widgets/widgets.py +++ b/client/ayon_core/tools/publisher/widgets/widgets.py @@ -1206,7 +1206,6 @@ class GlobalAttrsWidget(QtWidgets.QWidget): except TaskNotSetError: invalid_tasks = True - instance.set_task_invalid(True) product_names.add(instance["productName"]) continue @@ -1216,11 +1215,9 @@ class GlobalAttrsWidget(QtWidgets.QWidget): if folder_path is not None: instance["folderPath"] = folder_path - instance.set_folder_invalid(False) if task_name is not None: instance["task"] = task_name or None - instance.set_task_invalid(False) instance["productName"] = new_product_name @@ -1768,9 +1765,16 @@ class ProductAttributesWidget(QtWidgets.QWidget): self.bottom_separator = bottom_separator def _on_instance_context_changed(self): + instance_ids = { + instance.id + for instance in self._current_instances + } + context_info_by_id = self._controller.get_instances_context_info( + instance_ids + ) all_valid = True - for instance in self._current_instances: - if not instance.has_valid_context: + for instance_id, context_info in context_info_by_id.items(): + if not context_info.is_valid: all_valid = False break @@ -1795,9 +1799,17 @@ class ProductAttributesWidget(QtWidgets.QWidget): convertor_identifiers(List[str]): Identifiers of convert items. """ + instance_ids = { + instance.id + for instance in instances + } + context_info_by_id = self._controller.get_instances_context_info( + instance_ids + ) + all_valid = True - for instance in instances: - if not instance.has_valid_context: + for context_info in context_info_by_id.values(): + if not context_info.is_valid: all_valid = False break diff --git a/client/ayon_core/tools/publisher/window.py b/client/ayon_core/tools/publisher/window.py index 0c6087b41d..a8ca605ecb 100644 --- a/client/ayon_core/tools/publisher/window.py +++ b/client/ayon_core/tools/publisher/window.py @@ -913,12 +913,18 @@ class PublisherWindow(QtWidgets.QDialog): self._set_footer_enabled(True) return + active_instances_by_id = { + instance.id: instance + for instance in self._controller.get_instances() + if instance["active"] + } + context_info_by_id = self._controller.get_instances_context_info( + active_instances_by_id.keys() + ) all_valid = None - for instance in self._controller.get_instances(): - if not instance["active"]: - continue - - if not instance.has_valid_context: + for instance_id, instance in active_instances_by_id.items(): + context_info = context_info_by_id[instance_id] + if not context_info.is_valid: all_valid = False break From 930e10f63dca9ced383327e2a31c1fcbd641ca3b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 10 Sep 2024 18:30:09 +0200 Subject: [PATCH 105/216] insntances with context promise have disabled inputs --- .../tools/publisher/widgets/widgets.py | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/widgets.py b/client/ayon_core/tools/publisher/widgets/widgets.py index 4ad527126b..2427195812 100644 --- a/client/ayon_core/tools/publisher/widgets/widgets.py +++ b/client/ayon_core/tools/publisher/widgets/widgets.py @@ -1182,6 +1182,10 @@ class GlobalAttrsWidget(QtWidgets.QWidget): invalid_tasks = False folder_paths = [] for instance in self._current_instances: + # Ignore instances that have promised context + if instance.has_promised_context: + continue + new_variant_value = instance.get("variant") new_folder_path = instance.get("folderPath") new_task_name = instance.get("task") @@ -1303,7 +1307,13 @@ class GlobalAttrsWidget(QtWidgets.QWidget): editable = False folder_task_combinations = [] + context_editable = None for instance in instances: + if not instance.has_promised_context: + context_editable = True + elif context_editable is None: + context_editable = False + # NOTE I'm not sure how this can even happen? if instance.creator_identifier is None: editable = False @@ -1316,6 +1326,11 @@ class GlobalAttrsWidget(QtWidgets.QWidget): folder_task_combinations.append((folder_path, task_name)) product_names.add(instance.get("productName") or self.unknown_value) + if not editable: + context_editable = False + elif context_editable is None: + context_editable = True + self.variant_input.set_value(variants) # Set context of folder widget @@ -1326,8 +1341,21 @@ class GlobalAttrsWidget(QtWidgets.QWidget): self.product_value_widget.set_value(product_names) self.variant_input.setEnabled(editable) - self.folder_value_widget.setEnabled(editable) - self.task_value_widget.setEnabled(editable) + self.folder_value_widget.setEnabled(context_editable) + self.task_value_widget.setEnabled(context_editable) + + if not editable: + folder_tooltip = "Select instances to change folder path." + task_tooltip = "Select instances to change task name." + elif not context_editable: + folder_tooltip = "Folder path is defined by Create plugin." + task_tooltip = "Task is defined by Create plugin." + else: + folder_tooltip = "Change folder path of selected instances." + task_tooltip = "Change task of selected instances." + + self.folder_value_widget.setToolTip(folder_tooltip) + self.task_value_widget.setToolTip(task_tooltip) class CreatorAttrsWidget(QtWidgets.QWidget): From ed987073478f9f3ba53c393edcd33711a0e9d1a0 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 10 Sep 2024 21:41:00 +0200 Subject: [PATCH 106/216] Add missing space in log message --- client/ayon_core/plugins/publish/extract_burnin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/extract_burnin.py b/client/ayon_core/plugins/publish/extract_burnin.py index 58a032a030..a25b7244d4 100644 --- a/client/ayon_core/plugins/publish/extract_burnin.py +++ b/client/ayon_core/plugins/publish/extract_burnin.py @@ -198,7 +198,7 @@ class ExtractBurnin(publish.Extractor): ) if not burnins_per_repres: self.log.debug( - "Skipped instance. No representations found matching a burnin" + "Skipped instance. No representations found matching a burnin " "definition in: %s", burnin_defs ) return From 264ff3f217c974fb36d1c070fec27dd761e37c4c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 10 Sep 2024 21:58:52 +0200 Subject: [PATCH 107/216] Cosmetics --- .../ayon_core/plugins/publish/extract_burnin.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_burnin.py b/client/ayon_core/plugins/publish/extract_burnin.py index a25b7244d4..12cc9fbc71 100644 --- a/client/ayon_core/plugins/publish/extract_burnin.py +++ b/client/ayon_core/plugins/publish/extract_burnin.py @@ -399,7 +399,7 @@ class ExtractBurnin(publish.Extractor): add_repre_files_for_cleanup(instance, new_repre) - # Cleanup temp staging dir after procesisng of output definitions + # Cleanup temp staging dir after processing of output definitions if do_convert: temp_dir = repre["stagingDir"] shutil.rmtree(temp_dir) @@ -420,6 +420,11 @@ class ExtractBurnin(publish.Extractor): self.log.debug("Removed: \"{}\"".format(filepath)) def _get_burnin_options(self): + """Get the burnin options from `ExtractBurnin` settings. + + Returns: + dict[str, Any]: Burnin options. + """ # Prepare burnin options burnin_options = copy.deepcopy(self.default_options) if self.options: @@ -696,7 +701,7 @@ class ExtractBurnin(publish.Extractor): """Prepare data for representation. Args: - instance (Instance): Currently processed Instance. + instance (pyblish.api.Instance): Currently processed Instance. repre (dict): Currently processed representation. burnin_data (dict): Copy of basic burnin data based on instance data. @@ -752,9 +757,10 @@ class ExtractBurnin(publish.Extractor): Args: profile (dict): Profile from presets matching current context. + instance (pyblish.api.Instance): Publish instance. Returns: - list: Contain all valid output definitions. + list[dict[str, Any]]: Contain all valid output definitions. """ filtered_burnin_defs = [] @@ -774,8 +780,8 @@ class ExtractBurnin(publish.Extractor): families, families_filters ): self.log.debug(( - "Skipped burnin definition \"{}\". Family" - " filters ({}) does not match current instance families: {}" + "Skipped burnin definition \"{}\". Family filters ({}) " + "does not match current instance families: {}" ).format( filename_suffix, str(families_filters), str(families) )) From f38fad901d164475500f7e0a5f5ab65a439655fe Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 10 Sep 2024 22:02:05 +0200 Subject: [PATCH 108/216] Allow `.tif` and `.tiff` extensions for review --- client/ayon_core/plugins/publish/extract_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/extract_review.py b/client/ayon_core/plugins/publish/extract_review.py index 4390b00754..06b451bfbe 100644 --- a/client/ayon_core/plugins/publish/extract_review.py +++ b/client/ayon_core/plugins/publish/extract_review.py @@ -95,7 +95,7 @@ class ExtractReview(pyblish.api.InstancePlugin): ] # Supported extensions - image_exts = ["exr", "jpg", "jpeg", "png", "dpx", "tga"] + image_exts = ["exr", "jpg", "jpeg", "png", "dpx", "tga", "tiff", "tif"] video_exts = ["mov", "mp4"] supported_exts = image_exts + video_exts From b55a3e5974f76690cfad853d3b4354a27e6c3baf Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 10 Sep 2024 23:10:28 +0200 Subject: [PATCH 109/216] Get context attributes from current task entity (if current task is set) instead of from folder entity --- .../plugins/publish/collect_context_entities.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/plugins/publish/collect_context_entities.py b/client/ayon_core/plugins/publish/collect_context_entities.py index c8d25bc3e6..4de83f0d53 100644 --- a/client/ayon_core/plugins/publish/collect_context_entities.py +++ b/client/ayon_core/plugins/publish/collect_context_entities.py @@ -53,8 +53,9 @@ class CollectContextEntities(pyblish.api.ContextPlugin): context.data["folderEntity"] = folder_entity context.data["taskEntity"] = task_entity - - folder_attributes = folder_entity["attrib"] + context_attributes = ( + task_entity["attrib"] if task_entity else folder_entity["attrib"] + ) # Task type task_type = None @@ -63,12 +64,12 @@ class CollectContextEntities(pyblish.api.ContextPlugin): context.data["taskType"] = task_type - frame_start = folder_attributes.get("frameStart") + frame_start = context_attributes.get("frameStart") if frame_start is None: frame_start = 1 self.log.warning("Missing frame start. Defaulting to 1.") - frame_end = folder_attributes.get("frameEnd") + frame_end = context_attributes.get("frameEnd") if frame_end is None: frame_end = 2 self.log.warning("Missing frame end. Defaulting to 2.") @@ -76,8 +77,8 @@ class CollectContextEntities(pyblish.api.ContextPlugin): context.data["frameStart"] = frame_start context.data["frameEnd"] = frame_end - handle_start = folder_attributes.get("handleStart") or 0 - handle_end = folder_attributes.get("handleEnd") or 0 + handle_start = context_attributes.get("handleStart") or 0 + handle_end = context_attributes.get("handleEnd") or 0 context.data["handleStart"] = int(handle_start) context.data["handleEnd"] = int(handle_end) @@ -87,7 +88,7 @@ class CollectContextEntities(pyblish.api.ContextPlugin): context.data["frameStartHandle"] = frame_start_h context.data["frameEndHandle"] = frame_end_h - context.data["fps"] = folder_attributes["fps"] + context.data["fps"] = context_attributes["fps"] def _get_folder_entity(self, project_name, folder_path): if not folder_path: From e29ade4e7d36d3f0def6bf4b8c998b3fd3fb446d Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 11 Sep 2024 11:49:09 +0300 Subject: [PATCH 110/216] Add tool tips for `ExtractOIIOTranscode` settings --- server/settings/publish_plugins.py | 72 ++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 98a50e6101..cdcd28a9ce 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -274,13 +274,30 @@ def _extract_oiio_transcoding_type(): class OIIOToolArgumentsModel(BaseSettingsModel): additional_command_args: list[str] = SettingsField( - default_factory=list, title="Arguments") + default_factory=list, + title="Arguments", + description="Additional command line arguments for *oiiotool*." + ) class UseDisplayViewModel(BaseSettingsModel): _layout = "expanded" - display: str = SettingsField("", title="Target Display") - view: str = SettingsField("", title="Target View") + display: str = SettingsField( + "", + title="Target Display", + description=( + "Display of the target transform. If left empty, the" + " source Display value will be used." + ) + ) + view: str = SettingsField( + "", + title="Target View", + description=( + "View of the target transform. If left empty, the" + " source View value will be used." + ) + ) class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): @@ -291,14 +308,35 @@ class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): description="Output name (no space)", regex=r"[a-zA-Z0-9_]([a-zA-Z0-9_\.\-]*[a-zA-Z0-9_])?$", ) - extension: str = SettingsField("", title="Extension") + extension: str = SettingsField( + "", + title="Extension", + description=( + "Target extension. If left empty, original" + " extension is used." + ), + ) transcoding_type: str = SettingsField( "colorspace", title="Transcoding type", enum_resolver=_extract_oiio_transcoding_type, - conditionalEnum=True + conditionalEnum=True, + description=( + "Select the transcoding type for your output, choosing either " + "*Colorspace* or *Display&View* transform." + " Only one option can be applied per output definition." + ), + ) + colorspace: str = SettingsField( + "", + title="Target Colorspace", + description=( + "Choose the desired target colorspace, confirming its availability" + " in the active OCIO config. If left empty, the" + " source colorspace value will be used, resulting in no" + " colorspace conversion." + ) ) - colorspace: str = SettingsField("", title="Target Colorspace") display_view: UseDisplayViewModel = SettingsField( title="Use Display&View", default_factory=UseDisplayViewModel @@ -308,9 +346,19 @@ class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): default_factory=OIIOToolArgumentsModel, title="OIIOtool arguments") - tags: list[str] = SettingsField(default_factory=list, title="Tags") + tags: list[str] = SettingsField( + default_factory=list, + title="Tags", + description=( + "Additional tags that will be added to the created representation." + "\nAdd *review* tag to create review from the transcoded" + " representation instead of the original." + ) + ) custom_tags: list[str] = SettingsField( - default_factory=list, title="Custom Tags" + default_factory=list, + title="Custom Tags", + description="Additional custom tags that will be added to the created representation." ) @@ -338,7 +386,13 @@ class ExtractOIIOTranscodeProfileModel(BaseSettingsModel): ) delete_original: bool = SettingsField( True, - title="Delete Original Representation" + title="Delete Original Representation", + description=( + "Choose to preserve or remove the original representation.\n" + "Keep in mind that if the transcoded representation includes" + " a `review` tag, it will take precedence over" + " the original for creating reviews." + ), ) outputs: list[ExtractOIIOTranscodeOutputModel] = SettingsField( default_factory=list, From e0ab613d965c79ba3e5944f3fe9f94541aca26ec Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 11 Sep 2024 19:55:36 +0200 Subject: [PATCH 111/216] Fix typos, ported from https://github.com/ynput/OpenPype/pull/6346 --- client/ayon_core/lib/attribute_definitions.py | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/client/ayon_core/lib/attribute_definitions.py b/client/ayon_core/lib/attribute_definitions.py index 7e022f6dba..fd0de2e41b 100644 --- a/client/ayon_core/lib/attribute_definitions.py +++ b/client/ayon_core/lib/attribute_definitions.py @@ -60,7 +60,7 @@ def get_default_values(attribute_definitions): for which default values should be collected. Returns: - Dict[str, Any]: Default values for passet attribute definitions. + Dict[str, Any]: Default values for passed attribute definitions. """ output = {} @@ -75,13 +75,13 @@ def get_default_values(attribute_definitions): class AbstractAttrDefMeta(ABCMeta): - """Metaclass to validate existence of 'key' attribute. + """Metaclass to validate the existence of 'key' attribute. - Each object of `AbstractAttrDef` mus have defined 'key' attribute. + Each object of `AbstractAttrDef` must have defined 'key' attribute. """ - def __call__(self, *args, **kwargs): - obj = super(AbstractAttrDefMeta, self).__call__(*args, **kwargs) + def __call__(cls, *args, **kwargs): + obj = super(AbstractAttrDefMeta, cls).__call__(*args, **kwargs) init_class = getattr(obj, "__init__class__", None) if init_class is not AbstractAttrDef: raise TypeError("{} super was not called in __init__.".format( @@ -162,7 +162,8 @@ class AbstractAttrDef(metaclass=AbstractAttrDefMeta): def __ne__(self, other): return not self.__eq__(other) - @abstractproperty + @property + @abstractmethod def type(self): """Attribute definition type also used as identifier of class. @@ -215,10 +216,11 @@ class AbstractAttrDef(metaclass=AbstractAttrDefMeta): # ----------------------------------------- -# UI attribute definitoins won't hold value +# UI attribute definitions won't hold value # ----------------------------------------- class UIDef(AbstractAttrDef): + type = "ui-def" is_value_def = False def __init__(self, key=None, default=None, *args, **kwargs): @@ -245,7 +247,7 @@ class UILabelDef(UIDef): # --------------------------------------- -# Attribute defintioins should hold value +# Attribute definitions should hold value # --------------------------------------- class UnknownDef(AbstractAttrDef): @@ -311,7 +313,7 @@ class NumberDef(AbstractAttrDef): ): minimum = 0 if minimum is None else minimum maximum = 999999 if maximum is None else maximum - # Swap min/max when are passed in opposited order + # Swap min/max when are passed in opposite order if minimum > maximum: maximum, minimum = minimum, maximum @@ -364,10 +366,10 @@ class NumberDef(AbstractAttrDef): class TextDef(AbstractAttrDef): """Text definition. - Text can have multiline option so endline characters are allowed regex + Text can have multiline option so end-line characters are allowed regex validation can be applied placeholder for UI purposes and default value. - Regex validation is not part of attribute implemntentation. + Regex validation is not part of attribute implementation. Args: multiline(bool): Text has single or multiline support. @@ -949,7 +951,8 @@ def deserialize_attr_def(attr_def_data): """Deserialize attribute definition from data. Args: - attr_def (Dict[str, Any]): Attribute definition data to deserialize. + attr_def_data (Dict[str, Any]): Attribute definition data to + deserialize. """ attr_type = attr_def_data.pop("type") From 440d2271d46d3eeb49a763f459266b3740e18069 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 11 Sep 2024 20:33:45 +0200 Subject: [PATCH 112/216] Fix variable redeclaration --- client/ayon_core/scripts/slates/slate_base/items.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/scripts/slates/slate_base/items.py b/client/ayon_core/scripts/slates/slate_base/items.py index 6d19fc6a0c..ec3358ed5e 100644 --- a/client/ayon_core/scripts/slates/slate_base/items.py +++ b/client/ayon_core/scripts/slates/slate_base/items.py @@ -486,11 +486,11 @@ class TableField(BaseItem): line = self.ellide_text break - for idx, char in enumerate(_word): + for char_index, char in enumerate(_word): _line = line + char + self.ellide_text _line_width = font.getsize(_line)[0] if _line_width > max_width: - if idx == 0: + if char_index == 0: line = _line break line = line + char From ab498dd7e1edd5f4db0003dcb314aa016dfa889a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 12 Sep 2024 15:03:14 +0200 Subject: [PATCH 113/216] Update client/ayon_core/pipeline/workfile/workfile_template_builder.py Co-authored-by: Mustafa Jafar --- .../pipeline/workfile/workfile_template_builder.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index a908e76222..17debdb2e8 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -844,10 +844,11 @@ class AbstractTemplateBuilder(ABC): keep_placeholder = True if not path: - self.log.info( - "Template path is not set." - ) - return + raise TemplateLoadFailed(( + "Template path is not set.\n" + "Path need to be set in {}\\Template Workfile Build " + "Settings\\Profiles" + ).format(host_name.title())) # Try to fill path with environments and anatomy roots anatomy = Anatomy(project_name) From 23ac8b9ca7117262db82e001b2eff636f89903d2 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 12 Sep 2024 15:49:42 +0200 Subject: [PATCH 114/216] Update client/ayon_core/lib/attribute_definitions.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/lib/attribute_definitions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/lib/attribute_definitions.py b/client/ayon_core/lib/attribute_definitions.py index fd0de2e41b..bda5bc2c47 100644 --- a/client/ayon_core/lib/attribute_definitions.py +++ b/client/ayon_core/lib/attribute_definitions.py @@ -220,7 +220,6 @@ class AbstractAttrDef(metaclass=AbstractAttrDefMeta): # ----------------------------------------- class UIDef(AbstractAttrDef): - type = "ui-def" is_value_def = False def __init__(self, key=None, default=None, *args, **kwargs): From f4c63805853014f5c31ea53d942e632fc3a753a4 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 12 Sep 2024 15:51:22 +0200 Subject: [PATCH 115/216] Remove unused import --- client/ayon_core/lib/attribute_definitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/lib/attribute_definitions.py b/client/ayon_core/lib/attribute_definitions.py index fd0de2e41b..0a00e0e3ac 100644 --- a/client/ayon_core/lib/attribute_definitions.py +++ b/client/ayon_core/lib/attribute_definitions.py @@ -4,7 +4,7 @@ import collections import uuid import json import copy -from abc import ABCMeta, abstractmethod, abstractproperty +from abc import ABCMeta, abstractmethod import clique From ed2a3102039d84be7d830a6ca20a910daac3c514 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 12 Sep 2024 15:51:57 +0200 Subject: [PATCH 116/216] Grammar --- client/ayon_core/lib/attribute_definitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/lib/attribute_definitions.py b/client/ayon_core/lib/attribute_definitions.py index 0a00e0e3ac..c2563333be 100644 --- a/client/ayon_core/lib/attribute_definitions.py +++ b/client/ayon_core/lib/attribute_definitions.py @@ -16,7 +16,7 @@ _attr_defs_by_type = {} def register_attr_def_class(cls): """Register attribute definition. - Currently are registered definitions used to deserialize data to objects. + Currently registered definitions are used to deserialize data to objects. Attrs: cls (AbstractAttrDef): Non-abstract class to be registered with unique From f5c26e3d6e54e2941331ccb0cb23361ab3a8edb6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 11:18:06 +0200 Subject: [PATCH 117/216] call getMessage in try block --- client/ayon_core/pipeline/context_tools.py | 5 ++++- client/ayon_core/tools/publisher/models/publish.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/context_tools.py b/client/ayon_core/pipeline/context_tools.py index 8b72405048..5fb48cd79b 100644 --- a/client/ayon_core/pipeline/context_tools.py +++ b/client/ayon_core/pipeline/context_tools.py @@ -132,7 +132,10 @@ def install_host(host): def modified_emit(obj, record): """Method replacing `emit` in Pyblish's MessageHandler.""" - record.msg = record.getMessage() + try: + record.msg = record.getMessage() + except Exception: + record.msg = str(record.msg) obj.records.append(record) MessageHandler.emit = modified_emit diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index 4c21a6d5b5..e7e765c4d2 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -30,7 +30,10 @@ class MessageHandler(logging.Handler): self.records = [] def emit(self, record): - record.msg = record.getMessage() + try: + record.msg = record.getMessage() + except Exception: + record.msg = str(record.msg) self.records.append(record) From 0b352273959db9b1a6508d2f3821684664ad8b50 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:03:35 +0200 Subject: [PATCH 118/216] fix images used for collapsed widget --- client/ayon_core/tools/utils/widgets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/utils/widgets.py b/client/ayon_core/tools/utils/widgets.py index 4c2b418c41..9092283221 100644 --- a/client/ayon_core/tools/utils/widgets.py +++ b/client/ayon_core/tools/utils/widgets.py @@ -466,10 +466,10 @@ class ExpandBtnLabel(QtWidgets.QLabel): self._collapsed = True def _create_collapsed_pixmap(self): - return QtGui.QPixmap(self.branch_closed_path) + return QtGui.QPixmap(self.branch_open_path) def _create_expanded_pixmap(self): - return QtGui.QPixmap(self.branch_open_path) + return QtGui.QPixmap(self.branch_closed_path) @property def collapsed(self): From a14df299c8f4fc1d8e8dde049eb62b5ae96f4804 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:04:06 +0200 Subject: [PATCH 119/216] don't show detail until it should be visible --- .../tools/publisher/widgets/report_page.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index ebe84457f9..cc0f425c30 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1486,19 +1486,14 @@ class ErrorDetailWidget(QtWidgets.QWidget): main_layout.addWidget(error_detail_input, 0) main_layout.addStretch(1) + error_detail_input.setVisible(not error_detail_expand_btn.collapsed) + error_detail_top.clicked.connect(self._on_detail_toggle) self._error_detail_top = error_detail_top self._error_detail_expand_btn = error_detail_expand_btn self._error_detail_input = error_detail_input - def showEvent(self, event): - super().showEvent(event) - # Calling this in __init__ does not seem to propagate the visibility - # correctly - self._error_detail_input.setVisible( - not self._error_detail_expand_btn.collapsed - ) def set_detail(self, detail): if not detail: @@ -1520,7 +1515,10 @@ class ErrorDetailWidget(QtWidgets.QWidget): def _set_visible_inputs(self, visible): self._error_detail_top.setVisible(visible) - self._error_detail_input.setVisible(visible) + input_visible = visible + if input_visible: + input_visible = not self._error_detail_expand_btn.collapsed + self._error_detail_input.setVisible(input_visible) def _on_detail_toggle(self): self._error_detail_expand_btn.set_collapsed() From 9cbfecf92c643d3d2e5f40942ccb2d7ce944919d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:04:25 +0200 Subject: [PATCH 120/216] fill title in exception if is missing --- client/ayon_core/tools/publisher/models/publish.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index b0a360fcda..58598602d5 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -1282,6 +1282,11 @@ class PublishModel: self._add_validation_error(result) else: + if isinstance(exception, PublishError): + if not exception.title: + exception.title = plugin.label or plugin.__name__ + self._add_validation_error(result) + error_info = PublishErrorInfo.from_exception(exception) self._set_publish_error_info(error_info) self._set_is_crashed(True) From d3d2f836773210e4ef0d0b5e43d048af2d604cec Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:04:51 +0200 Subject: [PATCH 121/216] added message to error info and simplified initialization --- .../tools/publisher/models/publish.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index 58598602d5..a3bfad091a 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -29,14 +29,16 @@ PLUGIN_ORDER_OFFSET = 0.5 class PublishErrorInfo: def __init__( self, - description: str, + message: str, is_unknown_error: bool, - title: Optional[str], - detail: Optional[str], + description: Optional[str] = None, + title: Optional[str] = None, + detail: Optional[str] = None, ): - self.description: str = description + self.message: str = message self.is_unknown_error = is_unknown_error - self.title: Optional[str] = title + self.description: str = description or message + self.title: Optional[str] = title or "Unknown error" self.detail: Optional[str] = detail def __eq__(self, other: Any) -> bool: @@ -54,12 +56,12 @@ class PublishErrorInfo: @classmethod def from_exception(cls, exc) -> "PublishErrorInfo": - title = "This is not your fault" if isinstance(exc, PublishError): return cls( - exc.description or exc.message, - is_unknown_error=False, - title=exc.title or title, + exc.message, + False, + exc.description, + title=exc.title, detail=exc.detail, ) if isinstance(exc, KnownPublishError): @@ -69,7 +71,7 @@ class PublishErrorInfo: "Something went wrong. Send report" " to your supervisor or Ynput team." ) - return cls(msg, True, title, None) + return cls(msg, True) class PublishReportMaker: From d62b31c981632e2de591e71d247fd13d328de7d8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:05:18 +0200 Subject: [PATCH 122/216] fix error message shown in progress bar --- client/ayon_core/tools/publisher/widgets/publish_frame.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/publisher/widgets/publish_frame.py b/client/ayon_core/tools/publisher/widgets/publish_frame.py index d9a9e501ef..55051d2c40 100644 --- a/client/ayon_core/tools/publisher/widgets/publish_frame.py +++ b/client/ayon_core/tools/publisher/widgets/publish_frame.py @@ -412,7 +412,12 @@ class PublishFrame(QtWidgets.QWidget): self._set_main_label("Error happened") error_info = self._controller.get_publish_error_info() - self._message_label_top.setText(error_info.description) + + error_message = "Unknown error happened" + if error_info is not None: + error_message = error_info.message + + self._message_label_top.setText(error_message) self._set_success_property(1) From b4e0e32e1bfdd108a2aa134ae6963b608549579c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:05:39 +0200 Subject: [PATCH 123/216] show publish error as validation error --- .../tools/publisher/widgets/report_page.py | 73 +++++++++---------- 1 file changed, 34 insertions(+), 39 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index cc0f425c30..0580777669 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1539,16 +1539,20 @@ class CrashWidget(QtWidgets.QWidget): ): super().__init__(parent) - title_label = QtWidgets.QLabel("", self) - title_label.setAlignment(QtCore.Qt.AlignCenter) - title_label.setObjectName("PublishCrashMainLabel") + main_label = QtWidgets.QLabel("This is not your fault", self) + main_label.setAlignment(QtCore.Qt.AlignCenter) + main_label.setObjectName("PublishCrashMainLabel") - description_label = QtWidgets.QLabel("", self) - description_label.setAlignment(QtCore.Qt.AlignCenter) - description_label.setWordWrap(True) - description_label.setObjectName("PublishCrashReportLabel") - - detail_widget = ErrorDetailWidget(self) + report_label = QtWidgets.QLabel( + ( + "Please report the error to your pipeline support" + " using one of the options below." + ), + self + ) + report_label.setAlignment(QtCore.Qt.AlignCenter) + report_label.setWordWrap(True) + report_label.setObjectName("PublishCrashReportLabel") btns_widget = QtWidgets.QWidget(self) copy_clipboard_btn = QtWidgets.QPushButton( @@ -1569,34 +1573,18 @@ class CrashWidget(QtWidgets.QWidget): layout.setContentsMargins(5, 5, 5, 5) layout.setSpacing(0) layout.addSpacing(20) - layout.addWidget(title_label, 0) + layout.addWidget(main_label, 0) layout.addSpacing(20) - layout.addWidget(description_label, 0) + layout.addWidget(report_label, 0) layout.addSpacing(20) - layout.addWidget(detail_widget, 1) - layout.addSpacing(10) layout.addWidget(btns_widget, 0) layout.addSpacing(10) copy_clipboard_btn.clicked.connect(self._on_copy_to_clipboard) save_to_disk_btn.clicked.connect(self._on_save_to_disk_click) - self._title_label = title_label - self._description_label = description_label - self._detail_widget = detail_widget self._controller: AbstractPublisherFrontend = controller - def update_error_info(self, error_info): - if error_info is None: - self._title_label.setText("Placeholder title") - self._description_label.setText("A bug happened if you see this") - self._detail_widget.set_detail(None) - return - - self._title_label.setText(error_info.title) - self._description_label.setText(error_info.description) - self._detail_widget.set_detail(error_info.detail) - def _on_copy_to_clipboard(self): self._controller.emit_event( "copy_report.request", {}, "report_page") @@ -1618,6 +1606,7 @@ class PublishFailWidget(QtWidgets.QWidget): QtCore.Qt.TextBrowserInteraction ) + # Error 'Details' widget -> Collapsible error_details_widget = ErrorDetailWidget(inputs_widget) # Description and Details layout @@ -1794,30 +1783,36 @@ class ReportsWidget(QtWidgets.QWidget): return instance_items def update_data(self): - view = self._instances_view - validation_error_mode = False is_crashed = self._controller.publish_has_crashed() + error_info = None + if is_crashed: + error_info = self._controller.get_publish_error_info() + + validation_error_mode = False if ( + error_info is not None + and not error_info.is_unknown_error + ): + validation_error_mode = True + + elif ( not is_crashed and self._controller.publish_has_validation_errors() ): - view = self._validation_error_view validation_error_mode = True + if validation_error_mode: + view = self._validation_error_view + else: + view = self._instances_view + self._actions_widget.set_visible_mode(validation_error_mode) self._detail_inputs_spacer.setVisible(validation_error_mode) self._detail_input_scroll.setVisible(validation_error_mode) self._views_layout.setCurrentWidget(view) - error_info = self._controller.get_publish_error_info() - logs_visible = True - if is_crashed and error_info.is_unknown_error: - logs_visible = False - - self._crash_widget.setVisible(is_crashed) - self._logs_view.setVisible(logs_visible) - - self._crash_widget.update_error_info(error_info) + self._crash_widget.setVisible(not validation_error_mode) + self._logs_view.setVisible(validation_error_mode) # Instance view & logs update instance_items = self._get_instance_items() From 5be47d4f5b7a324d72c38447d8f8bc12e12aeb63 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:05:50 +0200 Subject: [PATCH 124/216] better typehint --- client/ayon_core/tools/publisher/abstract.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/publisher/abstract.py b/client/ayon_core/tools/publisher/abstract.py index f5c8306631..04a1985cbb 100644 --- a/client/ayon_core/tools/publisher/abstract.py +++ b/client/ayon_core/tools/publisher/abstract.py @@ -543,11 +543,11 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): pass @abstractmethod - def get_publish_error_info(self) -> Union["PublishErrorInfo", None]: + def get_publish_error_info(self) -> Optional["PublishErrorInfo"]: """Current error message which cause fail of publishing. Returns: - Union[PublishErrorInfo, None]: Error info or None. + Optional[PublishErrorInfo]: Error info or None. """ pass From 7ca0a354cac0f8d5011ae280c97fb411a6215684 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 17:27:44 +0200 Subject: [PATCH 125/216] remove double line --- client/ayon_core/tools/publisher/widgets/report_page.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index 0580777669..64281a7046 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1494,7 +1494,6 @@ class ErrorDetailWidget(QtWidgets.QWidget): self._error_detail_expand_btn = error_detail_expand_btn self._error_detail_input = error_detail_input - def set_detail(self, detail): if not detail: self._set_visible_inputs(False) From 882d61f2f34460ee13ccd621ee03103049645cd5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 18:53:39 +0200 Subject: [PATCH 126/216] refactored validation error handling to publish error handling --- client/ayon_core/style/style.css | 16 +- client/ayon_core/tools/publisher/abstract.py | 2 +- client/ayon_core/tools/publisher/control.py | 4 +- .../tools/publisher/models/publish.py | 82 ++++---- .../tools/publisher/widgets/report_page.py | 195 ++++++++++-------- 5 files changed, 159 insertions(+), 140 deletions(-) diff --git a/client/ayon_core/style/style.css b/client/ayon_core/style/style.css index 8578522c79..aaaf358f97 100644 --- a/client/ayon_core/style/style.css +++ b/client/ayon_core/style/style.css @@ -1118,39 +1118,39 @@ ValidationArtistMessage QLabel { font-weight: bold; } -#ValidationActionButton { +#PublishActionButton { border-radius: 0.2em; padding: 4px 6px 4px 6px; background: {color:bg-buttons}; } -#ValidationActionButton:hover { +#PublishActionButton:hover { background: {color:bg-buttons-hover}; color: {color:font-hover}; } -#ValidationActionButton:disabled { +#PublishActionButton:disabled { background: {color:bg-buttons-disabled}; } -#ValidationErrorTitleFrame { +#PublishErrorTitleFrame { border-radius: 0.2em; background: {color:bg-buttons}; } -#ValidationErrorTitleFrame:hover { +#PublishErrorTitleFrame:hover { background: {color:bg-buttons-hover}; } -#ValidationErrorTitleFrame[selected="1"] { +#PublishErrorTitleFrame[selected="1"] { background: {color:bg-view-selection}; } -#ValidationErrorInstanceList { +#PublishErrorInstanceList { border-radius: 0; } -#ValidationErrorInstanceList::item { +#PublishErrorInstanceList::item { border-bottom: 1px solid {color:border}; border-left: 1px solid {color:border}; } diff --git a/client/ayon_core/tools/publisher/abstract.py b/client/ayon_core/tools/publisher/abstract.py index 04a1985cbb..6bea4cc247 100644 --- a/client/ayon_core/tools/publisher/abstract.py +++ b/client/ayon_core/tools/publisher/abstract.py @@ -557,7 +557,7 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): pass @abstractmethod - def get_validation_errors(self): + def get_publish_errors_report(self): pass @abstractmethod diff --git a/client/ayon_core/tools/publisher/control.py b/client/ayon_core/tools/publisher/control.py index bc7ed994bd..c7fd75b3c3 100644 --- a/client/ayon_core/tools/publisher/control.py +++ b/client/ayon_core/tools/publisher/control.py @@ -502,8 +502,8 @@ class PublisherController( def get_publish_report(self): return self._publish_model.get_publish_report() - def get_validation_errors(self): - return self._publish_model.get_validation_errors() + def get_publish_errors_report(self): + return self._publish_model.get_publish_errors_report() def set_comment(self, comment): """Set comment from ui to pyblish context. diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index a3bfad091a..fbfc2dcdf1 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -529,10 +529,10 @@ class PublishPluginsProxy: ) -class ValidationErrorItem: - """Data driven validation error item. +class PublishErrorItem: + """Data driven publish error item. - Prepared data container with information about validation error and it's + Prepared data container with information about publish error and it's source plugin. Can be converted to raw data and recreated should be used for controller @@ -540,11 +540,11 @@ class ValidationErrorItem: Args: instance_id (Optional[str]): Pyblish instance id to which is - validation error connected. + publish error connected. instance_label (Optional[str]): Prepared instance label. - plugin_id (str): Pyblish plugin id which triggered the validation + plugin_id (str): Pyblish plugin id which triggered the publish error. Id is generated using 'PublishPluginsProxy'. - context_validation (bool): Error happened on context. + is_context_plugin (bool): Error happened on context. title (str): Error title. description (str): Error description. detail (str): Error detail. @@ -555,7 +555,8 @@ class ValidationErrorItem: instance_id: Optional[str], instance_label: Optional[str], plugin_id: str, - context_validation: bool, + is_context_plugin: bool, + is_validation_error: bool, title: str, description: str, detail: str @@ -563,7 +564,8 @@ class ValidationErrorItem: self.instance_id: Optional[str] = instance_id self.instance_label: Optional[str] = instance_label self.plugin_id: str = plugin_id - self.context_validation: bool = context_validation + self.is_context_plugin: bool = is_context_plugin + self.is_validation_error: bool = is_validation_error self.title: str = title self.description: str = description self.detail: str = detail @@ -579,7 +581,8 @@ class ValidationErrorItem: "instance_id": self.instance_id, "instance_label": self.instance_label, "plugin_id": self.plugin_id, - "context_validation": self.context_validation, + "is_context_plugin": self.is_context_plugin, + "is_validation_error": self.is_validation_error, "title": self.title, "description": self.description, "detail": self.detail, @@ -589,13 +592,13 @@ class ValidationErrorItem: def from_result( cls, plugin_id: str, - error: PublishValidationError, + error: PublishError, instance: Union[pyblish.api.Instance, None] ): """Create new object based on resukt from controller. Returns: - ValidationErrorItem: New object with filled data. + PublishErrorItem: New object with filled data. """ instance_label = None @@ -611,6 +614,7 @@ class ValidationErrorItem: instance_label, plugin_id, instance is None, + isinstance(error, PublishValidationError), error.title, error.description, error.detail, @@ -621,11 +625,11 @@ class ValidationErrorItem: return cls(**data) -class PublishValidationErrorsReport: - """Publish validation errors report that can be parsed to raw data. +class PublishErrorsReport: + """Publish errors report that can be parsed to raw data. Args: - error_items (List[ValidationErrorItem]): List of validation errors. + error_items (List[PublishErrorItem]): List of publish errors. plugin_action_items (Dict[str, List[PublishPluginActionItem]]): Action items by plugin id. @@ -634,7 +638,7 @@ class PublishValidationErrorsReport: self._error_items = error_items self._plugin_action_items = plugin_action_items - def __iter__(self) -> Iterable[ValidationErrorItem]: + def __iter__(self) -> Iterable[PublishErrorItem]: for item in self._error_items: yield item @@ -708,7 +712,7 @@ class PublishValidationErrorsReport: @classmethod def from_data( cls, data: Dict[str, Any] - ) -> "PublishValidationErrorsReport": + ) -> "PublishErrorsReport": """Recreate object from data. Args: @@ -716,11 +720,11 @@ class PublishValidationErrorsReport: using 'to_data' method. Returns: - PublishValidationErrorsReport: New object based on data. + PublishErrorsReport: New object based on data. """ error_items = [ - ValidationErrorItem.from_data(error_item) + PublishErrorItem.from_data(error_item) for error_item in data["error_items"] ] plugin_action_items = {} @@ -732,12 +736,12 @@ class PublishValidationErrorsReport: return cls(error_items, plugin_action_items) -class PublishValidationErrors: - """Object to keep track about validation errors by plugin.""" +class PublishErrors: + """Object to keep track about publish errors by plugin.""" def __init__(self): self._plugins_proxy: Union[PublishPluginsProxy, None] = None - self._error_items: List[ValidationErrorItem] = [] + self._error_items: List[PublishErrorItem] = [] self._plugin_action_items: Dict[ str, List[PublishPluginActionItem] ] = {} @@ -763,29 +767,29 @@ class PublishValidationErrors: self._error_items = [] self._plugin_action_items = {} - def create_report(self) -> PublishValidationErrorsReport: + def create_report(self) -> PublishErrorsReport: """Create report based on currently existing errors. Returns: - PublishValidationErrorsReport: Validation error report with all + PublishErrorsReport: Publish error report with all error information and publish plugin action items. """ - return PublishValidationErrorsReport( + return PublishErrorsReport( self._error_items, self._plugin_action_items ) def add_error( self, plugin: pyblish.api.Plugin, - error: PublishValidationError, + error: PublishError, instance: Union[pyblish.api.Instance, None] ): """Add error from pyblish result. Args: plugin (pyblish.api.Plugin): Plugin which triggered error. - error (PublishValidationError): Validation error. + error (PublishError): Publish error. instance (Union[pyblish.api.Instance, None]): Instance on which was error raised or None if was raised on context. """ @@ -800,7 +804,7 @@ class PublishValidationErrors: error.title = plugin_label self._error_items.append( - ValidationErrorItem.from_result(plugin_id, error, instance) + PublishErrorItem.from_result(plugin_id, error, instance) ) if plugin_id in self._plugin_action_items: return @@ -874,10 +878,8 @@ class PublishModel: self._publish_context = None # Pyblish report self._publish_report: PublishReportMaker = PublishReportMaker() - # Store exceptions of validation error - self._publish_validation_errors: PublishValidationErrors = ( - PublishValidationErrors() - ) + # Store exceptions of publish error + self._publish_errors: PublishErrors = PublishErrors() # This information is not much important for controller but for widget # which can change (and set) the comment. @@ -931,7 +933,7 @@ class PublishModel: ) for plugin in create_context.publish_plugins_mismatch_targets: self._publish_report.set_plugin_skipped(plugin.id) - self._publish_validation_errors.reset(self._publish_plugins_proxy) + self._publish_errors.reset(self._publish_plugins_proxy) self._set_max_progress(len(publish_plugins)) @@ -1024,8 +1026,8 @@ class PublishModel: self._publish_context ) - def get_validation_errors(self) -> PublishValidationErrorsReport: - return self._publish_validation_errors.create_report() + def get_publish_errors_report(self) -> PublishErrorsReport: + return self._publish_errors.create_report() def get_error_info(self) -> Optional[PublishErrorInfo]: return self._publish_error_info @@ -1275,31 +1277,33 @@ class PublishModel: exception = result.get("error") if exception: - has_validation_error = False if ( isinstance(exception, PublishValidationError) and not self._publish_has_validated ): - has_validation_error = True + result["is_validation_error"] = True self._add_validation_error(result) else: if isinstance(exception, PublishError): if not exception.title: exception.title = plugin.label or plugin.__name__ - self._add_validation_error(result) + self._add_publish_error_to_report(result) error_info = PublishErrorInfo.from_exception(exception) self._set_publish_error_info(error_info) self._set_is_crashed(True) - result["is_validation_error"] = has_validation_error + result["is_validation_error"] = False self._publish_report.add_result(plugin.id, result) def _add_validation_error(self, result: Dict[str, Any]): self._set_has_validation_errors(True) - self._publish_validation_errors.add_error( + self._add_publish_error_to_report(result) + + def _add_publish_error_to_report(self, result: Dict[str, Any]): + self._publish_errors.add_error( result["plugin"], result["error"], result["instance"] diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index 64281a7046..d491c300d3 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -26,7 +26,7 @@ from ayon_core.tools.publisher.constants import ( CONTEXT_LABEL, ) -from .widgets import IconValuePixmapLabel +from .widgets import PublishPixmapLabel, IconValuePixmapLabel from .icons import ( get_pixmap, get_image, @@ -42,7 +42,7 @@ INFO_VISIBLE = 1 << 6 class VerticalScrollArea(QtWidgets.QScrollArea): - """Scroll area for validation error titles. + """Scroll area for publish error titles. The biggest difference is that the scroll area has scroll bar on left side and resize of content will also resize scrollarea itself. @@ -126,7 +126,7 @@ class ActionButton(BaseClickableFrame): def __init__(self, plugin_action_item, parent): super().__init__(parent) - self.setObjectName("ValidationActionButton") + self.setObjectName("PublishActionButton") self.plugin_action_item = plugin_action_item @@ -155,10 +155,10 @@ class ActionButton(BaseClickableFrame): ) -class ValidateActionsWidget(QtWidgets.QFrame): +class PublishActionsWidget(QtWidgets.QFrame): """Wrapper widget for plugin actions. - Change actions based on selected validation error. + Change actions based on selected publish error. """ def __init__( @@ -243,16 +243,16 @@ class ValidateActionsWidget(QtWidgets.QFrame): self._controller.run_action(plugin_id, action_id) -# --- Validation error titles --- -class ValidationErrorInstanceList(QtWidgets.QListView): - """List of publish instances that caused a validation error. +# --- Publish error titles --- +class PublishErrorInstanceList(QtWidgets.QListView): + """List of publish instances that caused a publish error. - Instances are collected per plugin's validation error title. + Instances are collected per plugin's publish error title. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.setObjectName("ValidationErrorInstanceList") + self.setObjectName("PublishErrorInstanceList") self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) @@ -270,18 +270,19 @@ class ValidationErrorInstanceList(QtWidgets.QListView): return result -class ValidationErrorTitleWidget(QtWidgets.QWidget): - """Title of validation error. +class PublishErrorTitleWidget(QtWidgets.QWidget): + """Title of publish error. Widget is used as radio button so requires clickable functionality and changing style on selection/deselection. - Has toggle button to show/hide instances on which validation error happened + Has toggle button to show/hide instances on which publish error happened if there is a list (Valdation error may happen on context). """ selected = QtCore.Signal(str) instance_changed = QtCore.Signal(str) + _error_pixmap = None def __init__(self, title_id, error_info, parent): super().__init__(parent) @@ -290,30 +291,17 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): self._error_info = error_info self._selected = False - title_frame = ClickableFrame(self) - title_frame.setObjectName("ValidationErrorTitleFrame") - - toggle_instance_btn = QtWidgets.QToolButton(title_frame) - toggle_instance_btn.setObjectName("ArrowBtn") - toggle_instance_btn.setArrowType(QtCore.Qt.RightArrow) - toggle_instance_btn.setMaximumWidth(14) - - label_widget = QtWidgets.QLabel(error_info["title"], title_frame) - - title_frame_layout = QtWidgets.QHBoxLayout(title_frame) - title_frame_layout.addWidget(label_widget, 1) - title_frame_layout.addWidget(toggle_instance_btn, 0) - instances_model = QtGui.QStandardItemModel() instance_ids = [] items = [] - context_validation = False + is_context_plugin = False + is_crashing_error = False for error_item in error_info["error_items"]: - context_validation = error_item.context_validation - if context_validation: - toggle_instance_btn.setArrowType(QtCore.Qt.NoArrow) + is_crashing_error = not error_item.is_validation_error + is_context_plugin = error_item.is_context_plugin + if is_context_plugin: instance_ids.append(CONTEXT_ID) # Add fake item to have minimum size hint of view widget items.append(QtGui.QStandardItem(CONTEXT_LABEL)) @@ -333,7 +321,33 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): root_item = instances_model.invisibleRootItem() root_item.appendRows(items) - instances_view = ValidationErrorInstanceList(self) + title_frame = ClickableFrame(self) + title_frame.setObjectName("PublishErrorTitleFrame") + + toggle_instance_btn = QtWidgets.QToolButton(title_frame) + toggle_instance_btn.setObjectName("ArrowBtn") + toggle_instance_btn.setArrowType(QtCore.Qt.RightArrow) + toggle_instance_btn.setMaximumWidth(14) + if is_context_plugin: + toggle_instance_btn.setArrowType(QtCore.Qt.NoArrow) + + icon_label = None + if is_crashing_error: + error_pixmap = self._get_error_pixmap() + icon_label = PublishPixmapLabel(error_pixmap, self) + + label_widget = QtWidgets.QLabel(error_info["title"], title_frame) + + title_frame_layout = QtWidgets.QHBoxLayout(title_frame) + title_frame_layout.setContentsMargins(8, 8, 8, 8) + title_frame_layout.setSpacing(0) + if icon_label is not None: + title_frame_layout.addWidget(icon_label, 0) + title_frame_layout.addSpacing(6) + title_frame_layout.addWidget(label_widget, 1) + title_frame_layout.addWidget(toggle_instance_btn, 0) + + instances_view = PublishErrorInstanceList(self) instances_view.setModel(instances_model) self.setLayoutDirection(QtCore.Qt.LeftToRight) @@ -352,7 +366,7 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): layout.addWidget(view_widget, 0) view_widget.setVisible(False) - if not context_validation: + if not is_context_plugin: toggle_instance_btn.clicked.connect(self._on_toggle_btn_click) title_frame.clicked.connect(self._mouse_release_callback) @@ -369,7 +383,8 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): self._instances_model = instances_model self._instances_view = instances_view - self._context_validation = context_validation + self._is_context_plugin = is_context_plugin + self._is_crashing_error = is_crashing_error self._instance_ids = instance_ids self._expanded = False @@ -411,6 +426,10 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): def id(self): return self._title_id + @property + def is_crashing_error(self): + return self._is_crashing_error + def _change_style_property(self, selected): """Change style of widget based on selection.""" @@ -438,6 +457,12 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): self.selected.emit(self._title_id) self._set_expanded(True) + @classmethod + def _get_error_pixmap(cls): + if cls._error_pixmap is None: + cls._error_pixmap = get_pixmap("error") + return cls._error_pixmap + def _on_toggle_btn_click(self): """Show/hide instances list.""" @@ -450,7 +475,7 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): elif expanded is self._expanded: return - if expanded and self._context_validation: + if expanded and self._is_context_plugin: return self._expanded = expanded @@ -464,7 +489,7 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): self.instance_changed.emit(self._title_id) def get_selected_instances(self): - if self._context_validation: + if self._is_context_plugin: return [CONTEXT_ID] sel_model = self._instances_view.selectionModel() return [ @@ -477,21 +502,7 @@ class ValidationErrorTitleWidget(QtWidgets.QWidget): return list(self._instance_ids) -class ValidationArtistMessage(QtWidgets.QWidget): - def __init__(self, message, parent): - super().__init__(parent) - - artist_msg_label = QtWidgets.QLabel(message, self) - artist_msg_label.setAlignment(QtCore.Qt.AlignCenter) - - main_layout = QtWidgets.QHBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - main_layout.addWidget( - artist_msg_label, 1, QtCore.Qt.AlignCenter - ) - - -class ValidationErrorsView(QtWidgets.QWidget): +class PublishErrorsView(QtWidgets.QWidget): selection_changed = QtCore.Signal() def __init__(self, parent): @@ -510,8 +521,9 @@ class ValidationErrorsView(QtWidgets.QWidget): # scroll widget errors_layout.setContentsMargins(5, 0, 0, 0) - layout = QtWidgets.QVBoxLayout(self) - layout.addWidget(errors_scroll, 1) + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.setContentsMargins(8, 8, 8, 8) + main_layout.addWidget(errors_scroll, 1) self._errors_widget = errors_widget self._errors_layout = errors_layout @@ -533,28 +545,30 @@ class ValidationErrorsView(QtWidgets.QWidget): """Set errors into context and created titles. Args: - validation_error_report (PublishValidationErrorsReport): Report - with information about validation errors and publish plugin + grouped_error_items (List[Dict[str, Any]]): Report + with information about publish errors and publish plugin actions. """ self._clear() - first_id = None + select_id = None for title_item in grouped_error_items: title_id = title_item["id"] - if first_id is None: - first_id = title_id - widget = ValidationErrorTitleWidget(title_id, title_item, self) + if select_id is None: + select_id = title_id + widget = PublishErrorTitleWidget(title_id, title_item, self) widget.selected.connect(self._on_select) widget.instance_changed.connect(self._on_instance_change) + if widget.is_crashing_error: + select_id = title_id self._errors_layout.addWidget(widget) self._title_widgets[title_id] = widget self._errors_layout.addStretch(1) - if first_id: - self._title_widgets[first_id].set_selected(True) + if select_id: + self._title_widgets[select_id].set_selected(True) else: self.selection_changed.emit() @@ -1319,6 +1333,7 @@ class InstancesLogsView(QtWidgets.QFrame): content_widget = QtWidgets.QWidget(content_wrap_widget) content_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) content_layout = QtWidgets.QVBoxLayout(content_widget) + content_layout.setContentsMargins(8, 8, 8, 8) content_layout.setSpacing(15) scroll_area.setWidget(content_wrap_widget) @@ -1657,7 +1672,7 @@ class ReportsWidget(QtWidgets.QWidget): │ │ │ │ │ │ └──────┴───────────────────┘ - # Validation errors layout + # Publish errors layout ┌──────┬─────────┬─────────┐ │Views │ Actions │ │ │ ├─────────┤ Details │ @@ -1676,12 +1691,12 @@ class ReportsWidget(QtWidgets.QWidget): instances_view = PublishInstancesViewWidget(controller, views_widget) - validation_error_view = ValidationErrorsView(views_widget) + publish_error_view = PublishErrorsView(views_widget) views_layout = QtWidgets.QStackedLayout(views_widget) views_layout.setContentsMargins(0, 0, 0, 0) views_layout.addWidget(instances_view) - views_layout.addWidget(validation_error_view) + views_layout.addWidget(publish_error_view) views_layout.setCurrentWidget(instances_view) @@ -1690,7 +1705,7 @@ class ReportsWidget(QtWidgets.QWidget): details_widget.setObjectName("PublishInstancesDetails") # Actions widget - actions_widget = ValidateActionsWidget(controller, details_widget) + actions_widget = PublishActionsWidget(controller, details_widget) pages_widget = QtWidgets.QWidget(details_widget) @@ -1736,12 +1751,12 @@ class ReportsWidget(QtWidgets.QWidget): content_layout.addWidget(details_widget, 1) instances_view.selection_changed.connect(self._on_instance_selection) - validation_error_view.selection_changed.connect( + publish_error_view.selection_changed.connect( self._on_error_selection) self._views_layout = views_layout self._instances_view = instances_view - self._validation_error_view = validation_error_view + self._publish_error_view = publish_error_view self._actions_widget = actions_widget self._detail_inputs_widget = detail_inputs_widget @@ -1752,7 +1767,7 @@ class ReportsWidget(QtWidgets.QWidget): self._controller: AbstractPublisherFrontend = controller - self._validation_errors_by_id = {} + self._publish_errors_by_id = {} def _get_instance_items(self): report = self._controller.get_publish_report() @@ -1787,48 +1802,48 @@ class ReportsWidget(QtWidgets.QWidget): if is_crashed: error_info = self._controller.get_publish_error_info() - validation_error_mode = False + publish_error_mode = False if ( error_info is not None and not error_info.is_unknown_error ): - validation_error_mode = True + publish_error_mode = True elif ( not is_crashed and self._controller.publish_has_validation_errors() ): - validation_error_mode = True + publish_error_mode = True - if validation_error_mode: - view = self._validation_error_view + if publish_error_mode: + view = self._publish_error_view else: view = self._instances_view - self._actions_widget.set_visible_mode(validation_error_mode) - self._detail_inputs_spacer.setVisible(validation_error_mode) - self._detail_input_scroll.setVisible(validation_error_mode) + self._actions_widget.set_visible_mode(publish_error_mode) + self._detail_inputs_spacer.setVisible(publish_error_mode) + self._detail_input_scroll.setVisible(publish_error_mode) self._views_layout.setCurrentWidget(view) - self._crash_widget.setVisible(not validation_error_mode) - self._logs_view.setVisible(validation_error_mode) + self._crash_widget.setVisible(not publish_error_mode) + self._logs_view.setVisible(publish_error_mode) # Instance view & logs update instance_items = self._get_instance_items() self._instances_view.update_instances(instance_items) self._logs_view.update_instances(instance_items) - # Validation errors - validation_errors = self._controller.get_validation_errors() - grouped_error_items = validation_errors.group_items_by_title() + # Publish errors + publish_errors_report = self._controller.get_publish_errors_report() + grouped_error_items = publish_errors_report.group_items_by_title() - validation_errors_by_id = { + publish_errors_by_id = { title_item["id"]: title_item for title_item in grouped_error_items } - self._validation_errors_by_id = validation_errors_by_id - self._validation_error_view.set_errors(grouped_error_items) + self._publish_errors_by_id = publish_errors_by_id + self._publish_error_view.set_errors(grouped_error_items) def _on_instance_selection(self): instance_ids = self._instances_view.get_selected_instance_ids() @@ -1836,8 +1851,8 @@ class ReportsWidget(QtWidgets.QWidget): def _on_error_selection(self): title_id, instance_ids = ( - self._validation_error_view.get_selected_items()) - error_info = self._validation_errors_by_id.get(title_id) + self._publish_error_view.get_selected_items()) + error_info = self._publish_errors_by_id.get(title_id) if error_info is None: self._actions_widget.set_error_info(None) self._detail_inputs_widget.set_error_item(None) @@ -1865,12 +1880,12 @@ class ReportPageWidget(QtWidgets.QFrame): 2. Publishing is paused. ┐ 3. Publishing successfully finished. │> Instances with logs. 4. Publishing crashed. ┘ - 5. Crashed because of validation error. > Errors with logs. + 5. Crashed because of publish error. > Errors with logs. - This widget is shown if validation errors happened during validation part. + This widget is shown if publish errors happened. - Shows validation error titles with instances on which they happened - and validation error detail with possible actions (repair). + Shows publish error titles with instances on which they happened + and publish error detail with possible actions (repair). """ def __init__( From 2fd99f232aee15fdd8d683df552a66664deeaa3d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Sep 2024 18:56:37 +0200 Subject: [PATCH 127/216] fix expand button --- client/ayon_core/tools/utils/widgets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/utils/widgets.py b/client/ayon_core/tools/utils/widgets.py index 9092283221..4c2b418c41 100644 --- a/client/ayon_core/tools/utils/widgets.py +++ b/client/ayon_core/tools/utils/widgets.py @@ -466,10 +466,10 @@ class ExpandBtnLabel(QtWidgets.QLabel): self._collapsed = True def _create_collapsed_pixmap(self): - return QtGui.QPixmap(self.branch_open_path) + return QtGui.QPixmap(self.branch_closed_path) def _create_expanded_pixmap(self): - return QtGui.QPixmap(self.branch_closed_path) + return QtGui.QPixmap(self.branch_open_path) @property def collapsed(self): From 484bd4455ce5a01f8c68f18e744f405bd7a2b4e0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 16 Sep 2024 19:08:07 +0200 Subject: [PATCH 128/216] use transient data for promised context --- client/ayon_core/pipeline/create/structures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/create/structures.py b/client/ayon_core/pipeline/create/structures.py index 311d382ac9..9019b05b21 100644 --- a/client/ayon_core/pipeline/create/structures.py +++ b/client/ayon_core/pipeline/create/structures.py @@ -724,7 +724,7 @@ class CreatedInstance: value when set to True. """ - return self._data.get("has_promised_context", False) + return self._transient_data.get("has_promised_context", False) def data_to_store(self): """Collect data that contain json parsable types. From 3c5603c9241560b578b28d4b27ab8eb3da486085 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 16 Sep 2024 23:47:41 +0300 Subject: [PATCH 129/216] fix line lengths --- .../ayon_core/plugins/publish/extract_color_transcode.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_color_transcode.py b/client/ayon_core/plugins/publish/extract_color_transcode.py index 77ab6d0428..3e54d324e3 100644 --- a/client/ayon_core/plugins/publish/extract_color_transcode.py +++ b/client/ayon_core/plugins/publish/extract_color_transcode.py @@ -122,10 +122,13 @@ class ExtractOIIOTranscode(publish.Extractor): transcoding_type = output_def["transcoding_type"] target_colorspace = view = display = None - # NOTE: we use colorspace_data as the fallback values for the target colorspace. + # NOTE: we use colorspace_data as the fallback values for + # the target colorspace. if transcoding_type == "colorspace": - # TODO: Should we fallback to the colorspace (which used as source above) ? - # or should we compute the target colorspace from current view and display ? + # TODO: Should we fallback to the colorspace + # (which used as source above) ? + # or should we compute the target colorspace from + # current view and display ? target_colorspace = (output_def["colorspace"] or colorspace_data.get("colorspace")) elif transcoding_type == "display_view": From 57266dc7b660226fc6fddddecb4b1b9e89bfde1b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 17 Sep 2024 09:59:48 +0200 Subject: [PATCH 130/216] use single object of handler --- .../tools/publisher/models/publish.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index e7e765c4d2..6848e27bc4 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -29,6 +29,9 @@ class MessageHandler(logging.Handler): super().__init__(*args, **kwargs) self.records = [] + def clear_records(self): + self.records = [] + def emit(self, record): try: record.msg = record.getMessage() @@ -858,6 +861,8 @@ class PublishModel: self._default_iterator() ) + self._log_handler: MessageHandler = MessageHandler() + def reset(self): create_context = self._controller.get_create_context() self._publish_up_validation = False @@ -1232,21 +1237,20 @@ class PublishModel: plugin: pyblish.api.Plugin, instance: pyblish.api.Instance ): - handler = MessageHandler() root = logging.getLogger() - + self._log_handler.clear_records() plugin.log.propagate = False - plugin.log.addHandler(handler) - root.addHandler(handler) + plugin.log.addHandler(self._log_handler) + root.addHandler(self._log_handler) try: result = pyblish.plugin.process( plugin, self._publish_context, instance ) - result["records"] = handler.records + result["records"] = self._log_handler.records finally: plugin.log.propagate = True - plugin.log.removeHandler(handler) - root.removeHandler(handler) + plugin.log.removeHandler(self._log_handler) + root.removeHandler(self._log_handler) exception = result.get("error") if exception: From ede1b1737013df3b8f0a38d5d781511e9915d10c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 17 Sep 2024 10:26:45 +0200 Subject: [PATCH 131/216] moving out specific method from generic library --- client/ayon_core/lib/__init__.py | 2 - client/ayon_core/lib/transcoding.py | 128 ---------------- client/ayon_core/plugins/load/export_otio.py | 153 ++++++++++++++++++- 3 files changed, 149 insertions(+), 134 deletions(-) diff --git a/client/ayon_core/lib/__init__.py b/client/ayon_core/lib/__init__.py index d803af23c7..03ed574081 100644 --- a/client/ayon_core/lib/__init__.py +++ b/client/ayon_core/lib/__init__.py @@ -107,7 +107,6 @@ from .transcoding import ( convert_ffprobe_fps_to_float, get_rescaled_command_arguments, get_media_mime_type, - get_image_info_metadata, ) from .plugin_tools import ( @@ -207,7 +206,6 @@ __all__ = [ "convert_ffprobe_fps_to_float", "get_rescaled_command_arguments", "get_media_mime_type", - "get_image_info_metadata", "compile_list_of_regexes", diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index 9ff824f395..ead8b621b9 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -835,134 +835,6 @@ def get_ffprobe_streams(path_to_file, logger=None): return get_ffprobe_data(path_to_file, logger)["streams"] -def get_image_info_metadata( - path_to_file, - keys=None, - logger=None, -): - """Get metadata from image file. - - At first it will try to detect if the image input is supported by - OpenImageIO. If it is then it gets the metadata from the image using - OpenImageIO. If it is not supported by OpenImageIO then it will try to - get the metadata using FFprobe. - - Args: - path_to_file (str): Path to image file. - keys (list[str]): List of keys that should be returned. If None then - all keys are returned. Keys are expected all lowercase. - Additional keys are: - - "framerate" - will be created from "r_frame_rate" or - "framespersecond" and evaluated to float value. - logger (logging.Logger): Logger used for logging. - """ - if logger is None: - logger = logging.getLogger(__name__) - - def _ffprobe_metadata_conversion(metadata): - """Convert ffprobe metadata unified format.""" - output = {} - for key, val in metadata.items(): - if key in ("tags", "disposition"): - output.update(val) - else: - output[key] = val - return output - - def _get_video_metadata_from_ffprobe(ffprobe_stream): - """Extract video metadata from ffprobe stream. - - Args: - ffprobe_stream (dict): Stream data obtained from ffprobe. - - Returns: - dict: Video metadata extracted from the ffprobe stream. - """ - video_stream = None - for stream in ffprobe_stream["streams"]: - if stream["codec_type"] == "video": - video_stream = stream - break - metadata_stream = _ffprobe_metadata_conversion(video_stream) - return metadata_stream - - metadata_stream = None - ext = os.path.splitext(path_to_file)[-1].lower() - if ext not in IMAGE_EXTENSIONS: - logger.info(( - "File extension \"{}\" is not supported by OpenImageIO." - " Trying to get metadata using FFprobe." - ).format(ext)) - ffprobe_stream = get_ffprobe_data(path_to_file, logger) - if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: - metadata_stream = _get_video_metadata_from_ffprobe(ffprobe_stream) - - if not metadata_stream and is_oiio_supported(): - oiio_stream = get_oiio_info_for_input(path_to_file, logger=logger) - if "attribs" in (oiio_stream or {}): - metadata_stream = {} - for key, val in oiio_stream["attribs"].items(): - if "smpte:" in key.lower(): - key = key.replace("smpte:", "") - metadata_stream[key.lower()] = val - for key, val in oiio_stream.items(): - if key == "attribs": - continue - metadata_stream[key] = val - else: - logger.info(( - "OpenImageIO is not supported on this system." - " Trying to get metadata using FFprobe." - )) - ffprobe_stream = get_ffprobe_data(path_to_file, logger) - if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: - metadata_stream = _get_video_metadata_from_ffprobe(ffprobe_stream) - - if not metadata_stream: - logger.warning("Failed to get metadata from image file.") - return {} - - if keys is None: - return metadata_stream - - # create framerate key from available ffmpeg:r_frame_rate - # or oiiotool:framespersecond and evaluate its string expression - # value into flaot value - if ( - "r_frame_rate" in metadata_stream - or "framespersecond" in metadata_stream - ): - rate_info = metadata_stream.get("r_frame_rate") - if rate_info is None: - rate_info = metadata_stream.get("framespersecond") - - # calculate framerate from string expression - if "/" in str(rate_info): - time, frame = str(rate_info).split("/") - rate_info = float(time) / float(frame) - - try: - metadata_stream["framerate"] = float(str(rate_info)) - except Exception as e: - logger.warning( - "Failed to evaluate '{}' value to framerate. Error: {}".format( - rate_info, e) - ) - - # aggregate all required metadata from prepared metadata stream - output = {} - for key in keys: - for k, v in metadata_stream.items(): - if key == k: - output[key] = v - break - if isinstance(v, dict) and key in v: - output[key] = v[key] - break - - return output - - def get_ffmpeg_format_args(ffprobe_data, source_ffmpeg_cmd=None): """Copy format from input metadata for output. diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index f2351a84f6..bcfae1404a 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -1,3 +1,5 @@ +import logging +import os from pathlib import Path from collections import defaultdict @@ -5,8 +7,15 @@ from qtpy import QtWidgets, QtCore, QtGui from ayon_api import get_representations from ayon_core.pipeline import load, Anatomy -from ayon_core.lib import get_image_info_metadata from ayon_core import resources, style +from ayon_core.lib.transcoding import ( + IMAGE_EXTENSIONS, + get_oiio_info_for_input, +) +from ayon_core.lib import ( + get_ffprobe_data, + is_oiio_supported, +) from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.tools.utils import show_message_dialog @@ -228,9 +237,10 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): version = self._version_by_representation_id[ representation["id"] ] - name = f'{self._version_path_by_id[version["id"]]}/{representation["name"]}'.replace( - "/", "_" - ) + name = ( + f'{self._version_path_by_id[version["id"]]}' + f'/{representation["name"]}' + ).replace("/", "_") clips_data[name] = { "representation": representation, @@ -405,3 +415,138 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): 0, timeline_framerate) self.OTIO.adapters.write_to_file(timeline, output_path) + + +def get_image_info_metadata( + path_to_file, + keys=None, + logger=None, +): + """Get flattened metadata from image file + + With combined approach via FFMPEG and OIIOTool. + + At first it will try to detect if the image input is supported by + OpenImageIO. If it is then it gets the metadata from the image using + OpenImageIO. If it is not supported by OpenImageIO then it will try to + get the metadata using FFprobe. + + Args: + path_to_file (str): Path to image file. + keys (list[str]): List of keys that should be returned. If None then + all keys are returned. Keys are expected all lowercase. + Additional keys are: + - "framerate" - will be created from "r_frame_rate" or + "framespersecond" and evaluated to float value. + logger (logging.Logger): Logger used for logging. + """ + if logger is None: + logger = logging.getLogger(__name__) + + def _ffprobe_metadata_conversion(metadata): + """Convert ffprobe metadata unified format.""" + output = {} + for key, val in metadata.items(): + if key in ("tags", "disposition"): + output.update(val) + else: + output[key] = val + return output + + def _get_video_metadata_from_ffprobe(ffprobe_stream): + """Extract video metadata from ffprobe stream. + + Args: + ffprobe_stream (dict): Stream data obtained from ffprobe. + + Returns: + dict: Video metadata extracted from the ffprobe stream. + """ + video_stream = None + for stream in ffprobe_stream["streams"]: + if stream["codec_type"] == "video": + video_stream = stream + break + metadata_stream = _ffprobe_metadata_conversion(video_stream) + return metadata_stream + + metadata_stream = None + ext = os.path.splitext(path_to_file)[-1].lower() + if ext not in IMAGE_EXTENSIONS: + logger.info( + ( + 'File extension "{}" is not supported by OpenImageIO.' + " Trying to get metadata using FFprobe." + ).format(ext) + ) + ffprobe_stream = get_ffprobe_data(path_to_file, logger) + if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: + metadata_stream = _get_video_metadata_from_ffprobe(ffprobe_stream) + + if not metadata_stream and is_oiio_supported(): + oiio_stream = get_oiio_info_for_input(path_to_file, logger=logger) + if "attribs" in (oiio_stream or {}): + metadata_stream = {} + for key, val in oiio_stream["attribs"].items(): + if "smpte:" in key.lower(): + key = key.replace("smpte:", "") + metadata_stream[key.lower()] = val + for key, val in oiio_stream.items(): + if key == "attribs": + continue + metadata_stream[key] = val + else: + logger.info( + ( + "OpenImageIO is not supported on this system." + " Trying to get metadata using FFprobe." + ) + ) + ffprobe_stream = get_ffprobe_data(path_to_file, logger) + if "streams" in ffprobe_stream and len(ffprobe_stream["streams"]) > 0: + metadata_stream = _get_video_metadata_from_ffprobe(ffprobe_stream) + + if not metadata_stream: + logger.warning("Failed to get metadata from image file.") + return {} + + if keys is None: + return metadata_stream + + # create framerate key from available ffmpeg:r_frame_rate + # or oiiotool:framespersecond and evaluate its string expression + # value into flaot value + if ( + "r_frame_rate" in metadata_stream + or "framespersecond" in metadata_stream + ): + rate_info = metadata_stream.get("r_frame_rate") + if rate_info is None: + rate_info = metadata_stream.get("framespersecond") + + # calculate framerate from string expression + if "/" in str(rate_info): + time, frame = str(rate_info).split("/") + rate_info = float(time) / float(frame) + + try: + metadata_stream["framerate"] = float(str(rate_info)) + except Exception as e: + logger.warning( + "Failed to evaluate '{}' value to framerate. Error: {}".format( + rate_info, e + ) + ) + + # aggregate all required metadata from prepared metadata stream + output = {} + for key in keys: + for k, v in metadata_stream.items(): + if key == k: + output[key] = v + break + if isinstance(v, dict) and key in v: + output[key] = v[key] + break + + return output From e485eda6110e89a70c11672f89cb96187b8fc1ad Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 17 Sep 2024 10:36:31 +0200 Subject: [PATCH 132/216] Rename test file for OTIO export plugin - Renamed test_transcoding.py to test_export_otio.py - Updated import path for get_image_info_metadata function. --- .../test_transcoding.py => plugins/load/test_export_otio.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename client/ayon_core/tests/{lib/test_transcoding.py => plugins/load/test_export_otio.py} (95%) diff --git a/client/ayon_core/tests/lib/test_transcoding.py b/client/ayon_core/tests/plugins/load/test_export_otio.py similarity index 95% rename from client/ayon_core/tests/lib/test_transcoding.py rename to client/ayon_core/tests/plugins/load/test_export_otio.py index 4fe694631f..cdcb15033a 100644 --- a/client/ayon_core/tests/lib/test_transcoding.py +++ b/client/ayon_core/tests/plugins/load/test_export_otio.py @@ -1,7 +1,7 @@ import pytest import logging from pathlib import Path -from ayon_core.lib.transcoding import get_image_info_metadata +from ayon_core.plugins.load.export_otio import get_image_info_metadata logger = logging.getLogger('test_transcoding') From 64f45cf7c2689350eb2638a3ead68d79436dea53 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:15:05 +0200 Subject: [PATCH 133/216] added 'OTIO' to globals --- client/ayon_core/plugins/load/export_otio.py | 51 +++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index bcfae1404a..b3bbdc6109 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -4,8 +4,8 @@ from pathlib import Path from collections import defaultdict from qtpy import QtWidgets, QtCore, QtGui - from ayon_api import get_representations + from ayon_core.pipeline import load, Anatomy from ayon_core import resources, style from ayon_core.lib.transcoding import ( @@ -19,9 +19,15 @@ from ayon_core.lib import ( from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.tools.utils import show_message_dialog - +OTIO = None FRAME_SPLITTER = "__frame_splitter__" +def _import_otio(): + global OTIO + if OTIO is None: + import opentimelineio + OTIO = opentimelineio + class ExportOTIO(load.ProductLoaderPlugin): """Export selected versions to OpenTimelineIO.""" @@ -39,6 +45,7 @@ class ExportOTIO(load.ProductLoaderPlugin): color = "#d8d8d8" def load(self, contexts, name=None, namespace=None, options=None): + _import_otio() try: dialog = ExportOTIOOptionsDialog(contexts, self.log) dialog.exec_() @@ -51,8 +58,6 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): def __init__(self, contexts, log=None, parent=None): # Not all hosts have OpenTimelineIO available. - import opentimelineio as OTIO - self.OTIO = OTIO self.log = log super(ExportOTIOOptionsDialog, self).__init__(parent=parent) @@ -298,23 +303,23 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): first_frame = representation["context"].get("frame") if first_frame is None: - media_range = self.OTIO.opentime.TimeRange( - start_time=self.OTIO.opentime.RationalTime( + media_range = OTIO.opentime.TimeRange( + start_time=OTIO.opentime.RationalTime( media_start_frame, media_framerate ), - duration=self.OTIO.opentime.RationalTime( + duration=OTIO.opentime.RationalTime( frames, media_framerate), ) - clip_range = self.OTIO.opentime.TimeRange( - start_time=self.OTIO.opentime.RationalTime( + clip_range = OTIO.opentime.TimeRange( + start_time=OTIO.opentime.RationalTime( clip_start_frame, timeline_framerate ), - duration=self.OTIO.opentime.RationalTime( + duration=OTIO.opentime.RationalTime( frames, timeline_framerate), ) # Use 'repre_path' as single file - media_reference = self.OTIO.schema.ExternalReference( + media_reference = OTIO.schema.ExternalReference( available_range=media_range, target_url=self.convert_to_uri_or_posix(repre_path), ) @@ -339,24 +344,24 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): frame_str = str(repre_path)[len(file_prefix):][:len(file_suffix)] frame_padding = len(frame_str) - media_range = self.OTIO.opentime.TimeRange( - start_time=self.OTIO.opentime.RationalTime( + media_range = OTIO.opentime.TimeRange( + start_time=OTIO.opentime.RationalTime( media_start_frame, media_framerate ), - duration=self.OTIO.opentime.RationalTime( + duration=OTIO.opentime.RationalTime( len(repre_files), media_framerate ), ) - clip_range = self.OTIO.opentime.TimeRange( - start_time=self.OTIO.opentime.RationalTime( + clip_range = OTIO.opentime.TimeRange( + start_time=OTIO.opentime.RationalTime( clip_start_frame, timeline_framerate ), - duration=self.OTIO.opentime.RationalTime( + duration=OTIO.opentime.RationalTime( len(repre_files), timeline_framerate ), ) - media_reference = self.OTIO.schema.ImageSequenceReference( + media_reference = OTIO.schema.ImageSequenceReference( available_range=media_range, start_frame=int(first_frame), frame_step=1, @@ -367,7 +372,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): frame_zero_padding=frame_padding, ) - return self.OTIO.schema.Clip( + return OTIO.schema.Clip( name=name, media_reference=media_reference, source_range=clip_range ) @@ -387,7 +392,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): def get_timecode_start_frame(self, framerate, file_metadata): # use otio to convert timecode into frame number - timecode_start_frame = self.OTIO.opentime.from_timecode( + timecode_start_frame = OTIO.opentime.from_timecode( file_metadata["timecode"], framerate) return timecode_start_frame.to_frames() @@ -408,13 +413,13 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): self.create_clip(name, clip_data, timeline_framerate) for name, clip_data in clips_data.items() ] - timeline = self.OTIO.schema.timeline_from_clips(clips) + timeline = OTIO.schema.timeline_from_clips(clips) # set the timeline framerate to the highest framerate - timeline.global_start_time = self.OTIO.opentime.RationalTime( + timeline.global_start_time = OTIO.opentime.RationalTime( 0, timeline_framerate) - self.OTIO.adapters.write_to_file(timeline, output_path) + OTIO.adapters.write_to_file(timeline, output_path) def get_image_info_metadata( From dae923f286001d5f651c928831cf3f1e5e9b47c7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:15:38 +0200 Subject: [PATCH 134/216] better parenting and layout of widgets --- client/ayon_core/plugins/load/export_otio.py | 200 +++++++++++-------- 1 file changed, 118 insertions(+), 82 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index b3bbdc6109..28b91aee86 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -1,5 +1,6 @@ import logging import os +import uuid from pathlib import Path from collections import defaultdict @@ -60,7 +61,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): # Not all hosts have OpenTimelineIO available. self.log = log - super(ExportOTIOOptionsDialog, self).__init__(parent=parent) + super().__init__(parent=parent) self.setWindowTitle("AYON - Export OTIO") icon = QtGui.QIcon(resources.get_ayon_icon_filepath()) @@ -72,139 +73,174 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): | QtCore.Qt.WindowMinimizeButtonHint ) - self.setStyleSheet(style.load_stylesheet()) - - input_widget = QtWidgets.QWidget(self) - input_layout = QtWidgets.QGridLayout(input_widget) - - self._project_name = contexts[0]["project"]["name"] - - self._version_by_representation_id = {} - all_representation_names = set() - self._version_path_by_id = {} - version_docs_by_id = { + project_name = contexts[0]["project"]["name"] + versions_by_id = { context["version"]["id"]: context["version"] for context in contexts } - repre_docs = list(get_representations( - self._project_name, version_ids=set(version_docs_by_id) + repre_entities = list(get_representations( + project_name, version_ids=set(versions_by_id) )) - self._version_by_representation_id = { - repre_doc["id"]: version_docs_by_id[repre_doc["versionId"]] - for repre_doc in repre_docs + version_by_representation_id = { + repre_entity["id"]: versions_by_id[repre_entity["versionId"]] + for repre_entity in repre_entities } - self._version_path_by_id = {} + version_path_by_id = {} + representations_by_version_id = {} for context in contexts: version_id = context["version"]["id"] - if version_id in self._version_path_by_id: + if version_id in version_path_by_id: continue - self._version_path_by_id[version_id] = "/".join([ + representations_by_version_id[version_id] = [] + version_path_by_id[version_id] = "/".join([ context["folder"]["path"], context["product"]["name"], context["version"]["name"] ]) - representations_by_version_id = defaultdict(list) - for repre_doc in repre_docs: - representations_by_version_id[repre_doc["versionId"]].append( - repre_doc + for repre_entity in repre_entities: + representations_by_version_id[repre_entity["versionId"]].append( + repre_entity ) - all_representation_names = sorted(set(x["name"] for x in repre_docs)) + all_representation_names = list(sorted({ + repo_entity["name"] + for repo_entity in repre_entities + })) - input_layout.addWidget(QtWidgets.QLabel("Representations:"), 0, 0) - for count, name in enumerate(all_representation_names): - widget = QtWidgets.QPushButton(name) + input_widget = QtWidgets.QWidget(self) + input_layout = QtWidgets.QGridLayout(input_widget) + input_layout.setContentsMargins(8, 8, 8, 8) + + row = 0 + repres_label = QtWidgets.QLabel("Representations:", input_widget) + input_layout.addWidget(repres_label, row, 0) + repre_name_buttons = [] + for idx, name in enumerate(all_representation_names): + repre_name_btn = QtWidgets.QPushButton(name, input_widget) + col = idx + 1 input_layout.addWidget( - widget, - 0, - count + 1, + repre_name_btn, row, col, alignment=QtCore.Qt.AlignCenter ) - widget.clicked.connect(self.toggle_all) + repre_name_btn.clicked.connect(self._toggle_all) + repre_name_buttons.append(repre_name_btn) - self._representation_widgets = defaultdict(list) - row = 1 + row += 1 + + representation_widgets = defaultdict(list) items = representations_by_version_id.items() for version_id, representations in items: - version_path = self._version_path_by_id[version_id] - input_layout.addWidget(QtWidgets.QLabel(version_path), row, 0) + version_path = version_path_by_id[version_id] + label_widget = QtWidgets.QLabel(version_path, input_widget) + input_layout.addWidget(label_widget, row, 0) - representations_by_name = {x["name"]: x for x in representations} - group_box = QtWidgets.QGroupBox() - layout = QtWidgets.QHBoxLayout() - group_box.setLayout(layout) - for count, name in enumerate(all_representation_names): - if name in representations_by_name.keys(): - widget = QtWidgets.QRadioButton() - self._representation_widgets[name].append( + repres_by_name = { + repre_entity["name"]: repre_entity + for repre_entity in representations + } + radio_group = QtWidgets.QButtonGroup(input_widget) + for idx, name in enumerate(all_representation_names): + if name in repres_by_name: + widget = QtWidgets.QRadioButton(input_widget) + radio_group.addButton(widget) + representation_widgets[name].append( { "widget": widget, - "representation": representations_by_name[name] + "representation": repres_by_name[name] } ) else: - widget = QtWidgets.QLabel("x") + widget = QtWidgets.QLabel("x", input_widget) - layout.addWidget(widget) - - input_layout.addWidget( - group_box, row, 1, 1, len(all_representation_names) - ) + input_layout.addWidget( + widget, row, idx + 1, 1, 1, + alignment=QtCore.Qt.AlignCenter + ) row += 1 - export_widget = QtWidgets.QWidget() - export_layout = QtWidgets.QVBoxLayout(export_widget) + export_widget = QtWidgets.QWidget(self) - widget = QtWidgets.QWidget() - layout = QtWidgets.QHBoxLayout(widget) + options_widget = QtWidgets.QWidget(export_widget) - layout.addWidget(QtWidgets.QLabel("URI paths:")) - self.uri_path_format = QtWidgets.QCheckBox() - self.uri_path_format.setToolTip( - 'Use URI paths (file:///) instead of absolute paths. ' - 'This is useful when the OTIO file will be used on Foundry Hiero.' + uri_label = QtWidgets.QLabel("URI paths:", options_widget) + uri_path_format = QtWidgets.QCheckBox(options_widget) + uri_path_format.setToolTip( + "Use URI paths (file:///) instead of absolute paths. " + "This is useful when the OTIO file will be used on Foundry Hiero." ) - layout.addWidget(self.uri_path_format) - self.button_output_path = QtWidgets.QPushButton("Output Path:") - self.button_output_path.setToolTip( + button_output_path = QtWidgets.QPushButton( + "Output Path:", options_widget + ) + button_output_path.setToolTip( "Click to select the output path for the OTIO file." ) - layout.addWidget(self.button_output_path) - self.line_edit_output_path = QtWidgets.QLineEdit( - (Path.home() / f"{self._project_name}.otio").as_posix() + + line_edit_output_path = QtWidgets.QLineEdit( + (Path.home() / f"{project_name}.otio").as_posix(), + options_widget ) - layout.addWidget(self.line_edit_output_path) - export_layout.addWidget(widget) + options_layout = QtWidgets.QHBoxLayout(options_widget) + options_layout.setContentsMargins(0, 0, 0, 0) + options_layout.addWidget(uri_label) + options_layout.addWidget(uri_path_format) + options_layout.addWidget(button_output_path) + options_layout.addWidget(line_edit_output_path) - self.button_export = QtWidgets.QPushButton("Export") - export_layout.addWidget(self.button_export) + button_export = QtWidgets.QPushButton("Export", export_widget) - layout = QtWidgets.QVBoxLayout(self) - layout.addWidget(input_widget) - layout.addWidget(export_widget) + export_layout = QtWidgets.QVBoxLayout(export_widget) + export_layout.setContentsMargins(0, 0, 0, 0) + export_layout.addWidget(options_widget, 0) + export_layout.addWidget(button_export, 0) - self.button_export.clicked.connect(self.export) - self.button_output_path.clicked.connect(self.set_output_path) + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.setContentsMargins(8, 8, 8, 8) + main_layout.addWidget(input_widget, 0) + main_layout.addStretch(1) + # TODO add line spacer? + main_layout.addSpacing(30) + main_layout.addWidget(export_widget, 0) - def toggle_all(self): + button_export.clicked.connect(self._on_export_click) + button_output_path.clicked.connect(self._set_output_path) + + self._project_name = project_name + self._version_path_by_id = version_path_by_id + self._version_by_representation_id = version_by_representation_id + self._representation_widgets = representation_widgets + self._repre_name_buttons = repre_name_buttons + + self._uri_path_format = uri_path_format + self._button_output_path = button_output_path + self._line_edit_output_path = line_edit_output_path + self._button_export = button_export + + self._first_show = True + + def showEvent(self, event): + super().showEvent(event) + if self._first_show: + self._first_show = False + self.setStyleSheet(style.load_stylesheet()) + + def _toggle_all(self): representation_name = self.sender().text() for item in self._representation_widgets[representation_name]: item["widget"].setChecked(True) - def set_output_path(self): + def _set_output_path(self): file_path, _ = QtWidgets.QFileDialog.getSaveFileName( None, "Save OTIO file.", "", "OTIO Files (*.otio)" ) if file_path: - self.line_edit_output_path.setText(file_path) - - def export(self): - output_path = self.line_edit_output_path.text() + self._line_edit_output_path.setText(file_path) + def _on_export_click(self): + output_path = self._line_edit_output_path.text() # Validate output path is not empty. if not output_path: show_message_dialog( @@ -385,7 +421,7 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): Returns: str: Path as URI or Posix path. """ - if self.uri_path_format.isChecked(): + if self._uri_path_format.isChecked(): return path.as_uri() return path.as_posix() From 15c8aad1d899693eb9b0ef869757338503902a6e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:20:21 +0200 Subject: [PATCH 135/216] removed unused import --- client/ayon_core/plugins/load/export_otio.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/ayon_core/plugins/load/export_otio.py b/client/ayon_core/plugins/load/export_otio.py index 28b91aee86..e7a844aed3 100644 --- a/client/ayon_core/plugins/load/export_otio.py +++ b/client/ayon_core/plugins/load/export_otio.py @@ -1,6 +1,5 @@ import logging import os -import uuid from pathlib import Path from collections import defaultdict @@ -118,9 +117,8 @@ class ExportOTIOOptionsDialog(QtWidgets.QDialog): repre_name_buttons = [] for idx, name in enumerate(all_representation_names): repre_name_btn = QtWidgets.QPushButton(name, input_widget) - col = idx + 1 input_layout.addWidget( - repre_name_btn, row, col, + repre_name_btn, row, idx + 1, alignment=QtCore.Qt.AlignCenter ) repre_name_btn.clicked.connect(self._toggle_all) From 15c7256901575c86fed29951bc78a217e9d78c35 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 17 Sep 2024 20:30:11 +0200 Subject: [PATCH 136/216] Add "Show in AYON" launcher action --- .../ayon_core/plugins/actions/show_in_ayon.py | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 client/ayon_core/plugins/actions/show_in_ayon.py diff --git a/client/ayon_core/plugins/actions/show_in_ayon.py b/client/ayon_core/plugins/actions/show_in_ayon.py new file mode 100644 index 0000000000..8859f79171 --- /dev/null +++ b/client/ayon_core/plugins/actions/show_in_ayon.py @@ -0,0 +1,91 @@ +import os +import urllib.parse +import webbrowser + +from ayon_core.pipeline import LauncherAction +from ayon_core.resources import get_ayon_icon_filepath +import ayon_api + + +def get_ayon_entity_uri( + project_name, + entity_id, + entity_type, +) -> str: + """Resolve AYON Entity URI from representation context. + + Note: + The representation context is the `get_representation_context` dict + containing the `project`, `folder, `representation` and so forth. + It is not the representation entity `context` key. + + Arguments: + project_name (str): The project name. + entity_id (str): The entity UUID. + entity_type (str): The entity type, like "folder" or"task". + + Raises: + RuntimeError: Unable to resolve to a single valid URI. + + Returns: + str: The AYON entity URI. + + """ + response = ayon_api.post( + f"projects/{project_name}/uris", + entityType=entity_type, + ids=[entity_id]) + if response.status_code != 200: + raise RuntimeError( + f"Unable to resolve AYON entity URI for '{project_name}' " + f"{entity_type} id '{entity_id}': {response.text}" + ) + uris = response.data["uris"] + if len(uris) != 1: + raise RuntimeError( + f"Unable to resolve AYON entity URI for '{project_name}' " + f"{entity_type} id '{entity_id}' to single URI. " + f"Received data: {response.data}" + ) + return uris[0]["uri"] + + +class ShowInAyon(LauncherAction): + """Open AYON browser page to the current context.""" + name = "showinayon" + label = "Show in AYON" + icon = get_ayon_icon_filepath() + color = "#e0e1e1" + order = 999 + + def process(self, selection, **kwargs): + + url = os.environ["AYON_SERVER_URL"] + if selection.is_project_selected: + project_name = selection.project_name + url += f"/projects/{project_name}/browser" + + # Specify entity URI if task or folder is select + entity = None + entity_type = None + if selection.is_task_selected: + entity = selection.get_task_entity() + entity_type = "task" + elif selection.is_folder_selected: + entity = selection.get_folder_entity() + entity_type = "folder" + + if entity and entity_type: + uri = get_ayon_entity_uri( + project_name, + entity_id=entity["id"], + entity_type=entity_type + ) + uri_encoded = urllib.parse.quote_plus(uri) + url += f"?uri={uri_encoded}" + + # Open URL in webbrowser + self.log.info(f"Opening URL: {url}") + webbrowser.open(url, + # Try in new tab + new=2) From 14244e184c932831b4efbecec37d6444087e13a5 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 17 Sep 2024 18:29:59 -0400 Subject: [PATCH 137/216] Fix wrong retimed detection on image sequence clip. --- client/ayon_core/pipeline/editorial.py | 42 ++++++++++++++++---------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 84bffbe1ec..2934e3073b 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -179,6 +179,24 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): media_in = available_range.start_time.value media_out = available_range.end_time_inclusive().value + # Ensure image sequence media_ref source and + # available range are absolute. + media_ref = otio_clip.media_reference + if ( + hasattr(otio.schema, "ImageSequenceReference") and + isinstance(media_ref, otio.schema.ImageSequenceReference) and + media_in != media_ref.start_frame + ): + media_in = media_ref.start_frame + media_out += media_ref.start_frame + source_range_start = otio.opentime.RationalTime( + media_in + source_range.start_time.value, + ) + source_range = otio.opentime.TimeRange( + start_time=source_range_start, + duration=source_range.duration + ) + # modifiers time_scalar = 1. offset_in = 0 @@ -224,38 +242,30 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): offset_in *= time_scalar offset_out *= time_scalar - # filip offset if reversed speed + # flip offset if reversed speed if time_scalar < 0: - _offset_in = offset_out - _offset_out = offset_in - offset_in = _offset_in - offset_out = _offset_out + offset_in, offset_out = offset_out, offset_in # scale handles handle_start *= abs(time_scalar) handle_end *= abs(time_scalar) - # filip handles if reversed speed + # flip handles if reversed speed if time_scalar < 0: - _handle_start = handle_end - _handle_end = handle_start - handle_start = _handle_start - handle_end = _handle_end + handle_start, handle_end = handle_end, handle_start source_in = source_range.start_time.value - media_in_trimmed = ( - media_in + source_in + offset_in) - media_out_trimmed = ( - media_in + source_in + ( + media_in_trimmed = (source_in + offset_in) + media_out_trimmed = ( media_in_trimmed + ( ((source_range.duration.value - 1) * abs( time_scalar)) + offset_out)) # calculate available handles if (media_in_trimmed - media_in) < handle_start: - handle_start = (media_in_trimmed - media_in) + handle_start = max(0, media_in_trimmed - media_in) if (media_out - media_out_trimmed) < handle_end: - handle_end = (media_out - media_out_trimmed) + handle_end = max(0, media_out - media_out_trimmed) # create version data version_data = { From 318ce6b32122afaf65701e505e842550ed769a23 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 17 Sep 2024 18:41:57 -0400 Subject: [PATCH 138/216] Fix lint. --- client/ayon_core/pipeline/editorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 2934e3073b..83035616c6 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -179,7 +179,7 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): media_in = available_range.start_time.value media_out = available_range.end_time_inclusive().value - # Ensure image sequence media_ref source and + # Ensure image sequence media_ref source and # available range are absolute. media_ref = otio_clip.media_reference if ( From c2cfef7703d7ee9bb8ddd77b18d848ef4efdbdd5 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 18 Sep 2024 00:48:44 +0200 Subject: [PATCH 139/216] Apply suggestions from code review Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/publish/extract_burnin.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_burnin.py b/client/ayon_core/plugins/publish/extract_burnin.py index 12cc9fbc71..00f49a55b9 100644 --- a/client/ayon_core/plugins/publish/extract_burnin.py +++ b/client/ayon_core/plugins/publish/extract_burnin.py @@ -198,8 +198,8 @@ class ExtractBurnin(publish.Extractor): ) if not burnins_per_repres: self.log.debug( - "Skipped instance. No representations found matching a burnin " - "definition in: %s", burnin_defs + "Skipped instance. No representations found matching a burnin" + " definition in: %s", burnin_defs ) return @@ -424,6 +424,7 @@ class ExtractBurnin(publish.Extractor): Returns: dict[str, Any]: Burnin options. + """ # Prepare burnin options burnin_options = copy.deepcopy(self.default_options) @@ -761,6 +762,7 @@ class ExtractBurnin(publish.Extractor): Returns: list[dict[str, Any]]: Contain all valid output definitions. + """ filtered_burnin_defs = [] From 086b452a02e4c94bf4457c13271019de2908dadf Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 18 Sep 2024 00:51:19 +0200 Subject: [PATCH 140/216] Reformat based on code review --- client/ayon_core/plugins/publish/extract_burnin.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_burnin.py b/client/ayon_core/plugins/publish/extract_burnin.py index 12cc9fbc71..dff82f3a80 100644 --- a/client/ayon_core/plugins/publish/extract_burnin.py +++ b/client/ayon_core/plugins/publish/extract_burnin.py @@ -779,12 +779,11 @@ class ExtractBurnin(publish.Extractor): if not self.families_filter_validation( families, families_filters ): - self.log.debug(( - "Skipped burnin definition \"{}\". Family filters ({}) " - "does not match current instance families: {}" - ).format( - filename_suffix, str(families_filters), str(families) - )) + self.log.debug( + f"Skipped burnin definition \"{filename_suffix}\"." + f" Family filters ({families_filters}) does not match" + f" current instance families: {families}" + ) continue # Burnin values From 5090732cf8c6d0b104eeed4fbcd57bb3b93d2ebc Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 18 Sep 2024 12:02:25 +0200 Subject: [PATCH 141/216] Apply suggestions from code review Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/actions/show_in_ayon.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/plugins/actions/show_in_ayon.py b/client/ayon_core/plugins/actions/show_in_ayon.py index 8859f79171..e30eaa2bc9 100644 --- a/client/ayon_core/plugins/actions/show_in_ayon.py +++ b/client/ayon_core/plugins/actions/show_in_ayon.py @@ -50,16 +50,14 @@ def get_ayon_entity_uri( return uris[0]["uri"] -class ShowInAyon(LauncherAction): +class ShowInAYON(LauncherAction): """Open AYON browser page to the current context.""" name = "showinayon" label = "Show in AYON" icon = get_ayon_icon_filepath() - color = "#e0e1e1" order = 999 def process(self, selection, **kwargs): - url = os.environ["AYON_SERVER_URL"] if selection.is_project_selected: project_name = selection.project_name @@ -86,6 +84,4 @@ class ShowInAyon(LauncherAction): # Open URL in webbrowser self.log.info(f"Opening URL: {url}") - webbrowser.open(url, - # Try in new tab - new=2) + webbrowser.open_new_tab(url) From ac226a360aa7f75fc89f38676ecda916af8f966d Mon Sep 17 00:00:00 2001 From: Robin De Lillo Date: Wed, 18 Sep 2024 08:14:59 -0400 Subject: [PATCH 142/216] Apply suggestions from code review Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/pipeline/editorial.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 83035616c6..d69ca8714a 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -256,8 +256,8 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): source_in = source_range.start_time.value - media_in_trimmed = (source_in + offset_in) - media_out_trimmed = ( media_in_trimmed + ( + media_in_trimmed = source_in + offset_in + media_out_trimmed = (media_in_trimmed + ( ((source_range.duration.value - 1) * abs( time_scalar)) + offset_out)) From 0836fb810e70220ac1a1dd38443de6c065d24740 Mon Sep 17 00:00:00 2001 From: Robin De Lillo Date: Wed, 18 Sep 2024 08:15:13 -0400 Subject: [PATCH 143/216] Apply suggestions from code review Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/pipeline/editorial.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index d69ca8714a..ad56eb247f 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -183,9 +183,9 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # available range are absolute. media_ref = otio_clip.media_reference if ( - hasattr(otio.schema, "ImageSequenceReference") and - isinstance(media_ref, otio.schema.ImageSequenceReference) and - media_in != media_ref.start_frame + hasattr(otio.schema, "ImageSequenceReference") + and isinstance(media_ref, otio.schema.ImageSequenceReference) + and media_in != media_ref.start_frame ): media_in = media_ref.start_frame media_out += media_ref.start_frame From efc31f01443bf3b9747d72e77ac2fa3b1c5737d8 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Wed, 18 Sep 2024 15:45:45 -0400 Subject: [PATCH 144/216] Consolidate pipeline.editorial.get_media_range_with_retimes --- client/ayon_core/pipeline/editorial.py | 106 ++++++++++++------ .../publish/extract_otio_trimming_video.py | 7 +- 2 files changed, 74 insertions(+), 39 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 83035616c6..bc02ae9b00 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -176,26 +176,36 @@ def _sequence_resize(source, length): def get_media_range_with_retimes(otio_clip, handle_start, handle_end): source_range = otio_clip.source_range available_range = otio_clip.available_range() - media_in = available_range.start_time.value - media_out = available_range.end_time_inclusive().value - # Ensure image sequence media_ref source and - # available range are absolute. - media_ref = otio_clip.media_reference - if ( - hasattr(otio.schema, "ImageSequenceReference") and - isinstance(media_ref, otio.schema.ImageSequenceReference) and - media_in != media_ref.start_frame - ): - media_in = media_ref.start_frame - media_out += media_ref.start_frame - source_range_start = otio.opentime.RationalTime( - media_in + source_range.start_time.value, - ) - source_range = otio.opentime.TimeRange( - start_time=source_range_start, - duration=source_range.duration - ) + source_range_rate = source_range.start_time.rate + available_range_rate = available_range.start_time.rate + + # Conform source range bounds to available range rate + # .e.g. embedded TC of (3600 sec/ 1h), duration 100 frames + # + # available |----------------------------------------| 24fps + # 86400 86500 + # + # + # 90010 90060 + # src |-----|______duration 2s___|----| 25fps + # 90000 + # + # + # 86409.6 86466.8 + # conformed |-------|_____duration _2.38s____|-------| 24fps + # 86400 + # + # Note that 24fps is slower than 25fps hence extended duration + # to preserve media range + + # Compute new source range based on available rate + conformed_src_in = source_range.start_time.rescaled_to(available_range_rate) + conformed_src_duration = source_range.duration.rescaled_to(available_range_rate) + conformed_source_range = otio.opentime.TimeRange( + start_time=conformed_src_in, + duration=conformed_src_duration + ) # modifiers time_scalar = 1. @@ -242,47 +252,75 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): offset_in *= time_scalar offset_out *= time_scalar - # flip offset if reversed speed - if time_scalar < 0: - offset_in, offset_out = offset_out, offset_in - # scale handles handle_start *= abs(time_scalar) handle_end *= abs(time_scalar) - # flip handles if reversed speed + # flip offset and handles if reversed speed if time_scalar < 0: + offset_in, offset_out = offset_out, offset_in handle_start, handle_end = handle_end, handle_start - source_in = source_range.start_time.value + # compute retimed range + media_in_trimmed = conformed_source_range.start_time.value + offset_in + media_out_trimmed = media_in_trimmed + ( + (conformed_source_range.duration.value * abs( + time_scalar) + offset_out) - 1) - media_in_trimmed = (source_in + offset_in) - media_out_trimmed = ( media_in_trimmed + ( - ((source_range.duration.value - 1) * abs( - time_scalar)) + offset_out)) + media_in = available_range.start_time.value + media_out = available_range.end_time_inclusive().value - # calculate available handles + # If media source is an image sequence, returned + # mediaIn/mediaOut have to correspond + # to frame numbers from source sequence. + media_ref = otio_clip.media_reference + is_input_sequence = ( + hasattr(otio.schema, "ImageSequenceReference") and + isinstance(media_ref, otio.schema.ImageSequenceReference) + ) + + if is_input_sequence: + # preserve discreet frame numbers + media_in_trimmed = otio.opentime.RationalTime.from_frames( + media_in_trimmed - media_in + media_ref.start_frame, + rate=available_range_rate, + ).to_frames() + media_out_trimmed = otio.opentime.RationalTime.from_frames( + media_out_trimmed - media_in + media_ref.start_frame, + rate=available_range_rate, + ).to_frames() + + media_in = media_ref.start_frame + media_out = media_in + available_range.duration.to_frames() - 1 + + # adjust available handles if needed if (media_in_trimmed - media_in) < handle_start: handle_start = max(0, media_in_trimmed - media_in) if (media_out - media_out_trimmed) < handle_end: handle_end = max(0, media_out - media_out_trimmed) + # FFmpeg extraction ignores embedded timecode + # so substract to get a (mediaIn-mediaOut) range from 0. + if not is_input_sequence: + media_in_trimmed -= media_in + media_out_trimmed -= media_in + # create version data version_data = { "versionData": { "retime": True, "speed": time_scalar, "timewarps": time_warp_nodes, - "handleStart": int(round(handle_start)), - "handleEnd": int(round(handle_end)) + "handleStart": int(handle_start), + "handleEnd": int(handle_end) } } returning_dict = { "mediaIn": media_in_trimmed, "mediaOut": media_out_trimmed, - "handleStart": int(round(handle_start)), - "handleEnd": int(round(handle_end)), + "handleStart": int(handle_start), + "handleEnd": int(handle_end), "speed": time_scalar } diff --git a/client/ayon_core/plugins/publish/extract_otio_trimming_video.py b/client/ayon_core/plugins/publish/extract_otio_trimming_video.py index 9736c30b73..0c77602681 100644 --- a/client/ayon_core/plugins/publish/extract_otio_trimming_video.py +++ b/client/ayon_core/plugins/publish/extract_otio_trimming_video.py @@ -84,11 +84,8 @@ class ExtractOTIOTrimmingVideo(publish.Extractor): command = get_ffmpeg_tool_args("ffmpeg") video_path = input_file_path - frame_start = otio_range.start_time.value - input_fps = otio_range.start_time.rate - frame_duration = otio_range.duration.value - 1 - sec_start = frames_to_seconds(frame_start, input_fps) - sec_duration = frames_to_seconds(frame_duration, input_fps) + sec_start = otio_range.start_time.to_seconds() + sec_duration = otio_range.duration.to_seconds() # form command for rendering gap files command.extend([ From ef6693f8a0c53b418765a0b88f131fdd911d1e3b Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Wed, 18 Sep 2024 16:28:45 -0400 Subject: [PATCH 145/216] Add unit tests. --- .../resources/img_seq_embedded_tc.json | 363 +++++++++++++++++ .../resources/img_seq_no_handles.json | 363 +++++++++++++++++ .../resources/img_seq_with_handles.json | 363 +++++++++++++++++ .../resources/movie_with_handles.json | 358 +++++++++++++++++ .../editorial/resources/qt_embedded_tc.json | 356 +++++++++++++++++ .../editorial/resources/qt_retimed_speed.json | 365 ++++++++++++++++++ 6 files changed, 2168 insertions(+) create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/img_seq_no_handles.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/img_seq_with_handles.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/movie_with_handles.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/qt_retimed_speed.json diff --git a/tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc.json b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc.json new file mode 100644 index 0000000000..a7c3ee00cf --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc.json @@ -0,0 +1,363 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "output.[1000-1100].exr", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 74.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 91046.625 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "-6": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "994": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "-6": { + "Value": 0.8, + "Variant Type": "Double" + }, + "994": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"f2918dd7-a30b-4b7d-8ac1-7d5f400058bf\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"ade94deb-f104-47dc-b8e9-04943f900914\", \"reviewTrack\": null, \"label\": \"/shots/sq01/Video_1sq01sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"5109899f-d744-4ed3-8547-8585ef9b703b\", \"creator_attributes\": {\"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1075, \"clipIn\": 655, \"clipOut\": 729, \"clipDuration\": 74, \"sourceIn\": 6, \"sourceOut\": 80, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"f2918dd7-a30b-4b7d-8ac1-7d5f400058bf\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"ade94deb-f104-47dc-b8e9-04943f900914\", \"reviewTrack\": null, \"parent_instance_id\": \"5109899f-d744-4ed3-8547-8585ef9b703b\", \"label\": \"/shots/sq01/Video_1sq01sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"85c729e9-0503-4c3a-8d7f-be0920f047d8\", \"creator_attributes\": {\"parentInstance\": \"/shots/sq01/Video_1sq01sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"f2918dd7-a30b-4b7d-8ac1-7d5f400058bf\", \"publish\": true}" + }, + "clip_index": "f2918dd7-a30b-4b7d-8ac1-7d5f400058bf", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "f2918dd7-a30b-4b7d-8ac1-7d5f400058bf", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq01/Video_1sq01sh010 shot", + "vSyncOn": false, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "85c729e9-0503-4c3a-8d7f-be0920f047d8", + "label": "/shots/sq01/Video_1sq01sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "5109899f-d744-4ed3-8547-8585ef9b703b", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "ade94deb-f104-47dc-b8e9-04943f900914", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "f2918dd7-a30b-4b7d-8ac1-7d5f400058bf", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 74, + "clipIn": 655, + "clipOut": 729, + "folderPath": "/shots/sq01/Video_1sq01sh010", + "fps": "from_selection", + "frameEnd": 1075, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 6, + "sourceOut": 80, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "5109899f-d744-4ed3-8547-8585ef9b703b", + "label": "/shots/sq01/Video_1sq01sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "ade94deb-f104-47dc-b8e9-04943f900914", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 91083.625 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": {}, + "name": "output.[1000-1100].exr", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 87399.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\samples\\exr_embedded_tc", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/img_seq_no_handles.json b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_no_handles.json new file mode 100644 index 0000000000..9dccb51197 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_no_handles.json @@ -0,0 +1,363 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "output.[1000-1100].tif", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "0": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "1000": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "0": { + "Value": 0.8, + "Variant Type": "Double" + }, + "1000": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"647b2ba6-6fca-4219-b163-cd321df9652f\", \"reviewTrack\": null, \"label\": \"/shots/sq01/Video_1sq01sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"2ab8f149-e32c-40f5-a6cb-ad1ca567ccc1\", \"creator_attributes\": {\"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1102, \"clipIn\": 509, \"clipOut\": 610, \"clipDuration\": 101, \"sourceIn\": 0, \"sourceOut\": 101, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"647b2ba6-6fca-4219-b163-cd321df9652f\", \"reviewTrack\": null, \"parent_instance_id\": \"2ab8f149-e32c-40f5-a6cb-ad1ca567ccc1\", \"label\": \"/shots/sq01/Video_1sq01sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"9f866936-966b-4a73-8e61-1a5b6e648a3f\", \"creator_attributes\": {\"parentInstance\": \"/shots/sq01/Video_1sq01sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184\", \"publish\": true}" + }, + "clip_index": "cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq01/Video_1sq01sh010 shot", + "vSyncOn": false, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "9f866936-966b-4a73-8e61-1a5b6e648a3f", + "label": "/shots/sq01/Video_1sq01sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "2ab8f149-e32c-40f5-a6cb-ad1ca567ccc1", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "647b2ba6-6fca-4219-b163-cd321df9652f", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 101, + "clipIn": 509, + "clipOut": 610, + "folderPath": "/shots/sq01/Video_1sq01sh010", + "fps": "from_selection", + "frameEnd": 1102, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 0, + "sourceOut": 101, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "2ab8f149-e32c-40f5-a6cb-ad1ca567ccc1", + "label": "/shots/sq01/Video_1sq01sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "647b2ba6-6fca-4219-b163-cd321df9652f", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 50.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": {}, + "name": "output.[1000-1100].tif", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\samples", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/img_seq_with_handles.json b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_with_handles.json new file mode 100644 index 0000000000..eb8876354c --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_with_handles.json @@ -0,0 +1,363 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "output.[1000-1100].tif", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 39.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 34.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "-34": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "966": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "-34": { + "Value": 0.8, + "Variant Type": "Double" + }, + "966": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5ca7b240-ec4c-49d1-841d-a96c33a08b1b\", \"reviewTrack\": null, \"label\": \"/shots/sq01/Video_1sq01sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"5b526964-5805-4412-af09-2da696c4978b\", \"creator_attributes\": {\"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1040, \"clipIn\": 543, \"clipOut\": 582, \"clipDuration\": 39, \"sourceIn\": 34, \"sourceOut\": 73, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5ca7b240-ec4c-49d1-841d-a96c33a08b1b\", \"reviewTrack\": null, \"parent_instance_id\": \"5b526964-5805-4412-af09-2da696c4978b\", \"label\": \"/shots/sq01/Video_1sq01sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"992ab293-943b-4894-8a7f-c42b54b4d582\", \"creator_attributes\": {\"parentInstance\": \"/shots/sq01/Video_1sq01sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184\", \"publish\": true}" + }, + "clip_index": "cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq01/Video_1sq01sh010 shot", + "vSyncOn": false, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "992ab293-943b-4894-8a7f-c42b54b4d582", + "label": "/shots/sq01/Video_1sq01sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "5b526964-5805-4412-af09-2da696c4978b", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "5ca7b240-ec4c-49d1-841d-a96c33a08b1b", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "cfea9be4-3ecd-4253-a0a9-1a2bc9a4a184", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 39, + "clipIn": 543, + "clipOut": 582, + "folderPath": "/shots/sq01/Video_1sq01sh010", + "fps": "from_selection", + "frameEnd": 1040, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 34, + "sourceOut": 73, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "5b526964-5805-4412-af09-2da696c4978b", + "label": "/shots/sq01/Video_1sq01sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "5ca7b240-ec4c-49d1-841d-a96c33a08b1b", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 53.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": {}, + "name": "output.[1000-1100].tif", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\samples", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/movie_with_handles.json b/tests/client/ayon_core/pipeline/editorial/resources/movie_with_handles.json new file mode 100644 index 0000000000..47b5772b49 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/movie_with_handles.json @@ -0,0 +1,358 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": { + "Link Group ID": 1 + } + }, + "name": "simple_editorial_setup.mp4", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 171.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "0": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "1000": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "0": { + "Value": 0.8, + "Variant Type": "Double" + }, + "1000": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cef0267f-bbf4-4959-9f22-d225e03f2532\", \"clip_source_resolution\": {\"width\": \"640\", \"height\": \"360\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"3af1b00a-5625-468d-af17-8ed29fa8608a\", \"reviewTrack\": null, \"label\": \"/shots/sq01/Video_1sq01sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"b6e33343-2410-4de4-935e-724bc74301e1\", \"creator_attributes\": {\"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1172, \"clipIn\": 1097, \"clipOut\": 1268, \"clipDuration\": 171, \"sourceIn\": 0, \"sourceOut\": 171, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cef0267f-bbf4-4959-9f22-d225e03f2532\", \"clip_source_resolution\": {\"width\": \"640\", \"height\": \"360\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"3af1b00a-5625-468d-af17-8ed29fa8608a\", \"reviewTrack\": null, \"parent_instance_id\": \"b6e33343-2410-4de4-935e-724bc74301e1\", \"label\": \"/shots/sq01/Video_1sq01sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"ef8fe238-c970-4a16-be67-76f446113c4b\", \"creator_attributes\": {\"parentInstance\": \"/shots/sq01/Video_1sq01sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"cef0267f-bbf4-4959-9f22-d225e03f2532\", \"publish\": true}" + }, + "clip_index": "cef0267f-bbf4-4959-9f22-d225e03f2532", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "cef0267f-bbf4-4959-9f22-d225e03f2532", + "clip_source_resolution": { + "height": "360", + "pixelAspect": 1.0, + "width": "640" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq01/Video_1sq01sh010 shot", + "vSyncOn": false, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "ef8fe238-c970-4a16-be67-76f446113c4b", + "label": "/shots/sq01/Video_1sq01sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "b6e33343-2410-4de4-935e-724bc74301e1", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "3af1b00a-5625-468d-af17-8ed29fa8608a", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "cef0267f-bbf4-4959-9f22-d225e03f2532", + "clip_source_resolution": { + "height": "360", + "pixelAspect": 1.0, + "width": "640" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 171, + "clipIn": 1097, + "clipOut": 1268, + "folderPath": "/shots/sq01/Video_1sq01sh010", + "fps": "from_selection", + "frameEnd": 1172, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 0, + "sourceOut": 171, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "b6e33343-2410-4de4-935e-724bc74301e1", + "label": "/shots/sq01/Video_1sq01sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "3af1b00a-5625-468d-af17-8ed29fa8608a", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 85.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": {}, + "name": "simple_editorial_setup.mp4", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 16450.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\data\\simple_editorial_setup.mp4" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc.json b/tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc.json new file mode 100644 index 0000000000..1b74ea4f37 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc.json @@ -0,0 +1,356 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "qt_embedded_tc.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 44.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 90032.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "-32": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "1009": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "-32": { + "Value": 0.8, + "Variant Type": "Double" + }, + "1009": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"297fbf7a-7636-44b5-a308-809098298fae\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"3e459c3f-cc87-42c6-95c0-f11435ec8ace\", \"reviewTrack\": null, \"label\": \"/shots/sq01/Video_1sq01sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"acebdee4-5f4a-4ebd-8c22-6ef2725c2070\", \"creator_attributes\": {\"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1045, \"clipIn\": 509, \"clipOut\": 553, \"clipDuration\": 44, \"sourceIn\": 32, \"sourceOut\": 76, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"297fbf7a-7636-44b5-a308-809098298fae\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"3e459c3f-cc87-42c6-95c0-f11435ec8ace\", \"reviewTrack\": null, \"parent_instance_id\": \"acebdee4-5f4a-4ebd-8c22-6ef2725c2070\", \"label\": \"/shots/sq01/Video_1sq01sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"ffd09d3c-227c-4be0-8788-dec30daf7f78\", \"creator_attributes\": {\"parentInstance\": \"/shots/sq01/Video_1sq01sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"297fbf7a-7636-44b5-a308-809098298fae\", \"publish\": true}" + }, + "clip_index": "297fbf7a-7636-44b5-a308-809098298fae", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "297fbf7a-7636-44b5-a308-809098298fae", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq01/Video_1sq01sh010 shot", + "vSyncOn": false, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "ffd09d3c-227c-4be0-8788-dec30daf7f78", + "label": "/shots/sq01/Video_1sq01sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "acebdee4-5f4a-4ebd-8c22-6ef2725c2070", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "3e459c3f-cc87-42c6-95c0-f11435ec8ace", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "297fbf7a-7636-44b5-a308-809098298fae", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 44, + "clipIn": 509, + "clipOut": 553, + "folderPath": "/shots/sq01/Video_1sq01sh010", + "fps": "from_selection", + "frameEnd": 1045, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 32, + "sourceOut": 76, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "acebdee4-5f4a-4ebd-8c22-6ef2725c2070", + "label": "/shots/sq01/Video_1sq01sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "3e459c3f-cc87-42c6-95c0-f11435ec8ace", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 90054.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": {}, + "name": "qt_embedded_tc.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86400.0 + } + }, + "available_image_bounds": null, + "target_url": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\data\\qt_embedded_tc.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/qt_retimed_speed.json b/tests/client/ayon_core/pipeline/editorial/resources/qt_retimed_speed.json new file mode 100644 index 0000000000..61838d2755 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/qt_retimed_speed.json @@ -0,0 +1,365 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": { + "Link Group ID": 1 + } + }, + "name": "simple_editorial_setup.mp4", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 171.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "LinearTimeWarp.1", + "metadata": {}, + "name": "", + "effect_name": "", + "time_scalar": 2.5 + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "0": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "1000": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "0": { + "Value": 0.8, + "Variant Type": "Double" + }, + "1000": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cef0267f-bbf4-4959-9f22-d225e03f2532\", \"clip_source_resolution\": {\"width\": \"640\", \"height\": \"360\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"2a780b95-14cc-45de-acc0-3ecd1f504325\", \"reviewTrack\": null, \"label\": \"/shots/sq01/Video_1sq01sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"e8af785a-484f-452b-8c9c-ac31ef0696c4\", \"creator_attributes\": {\"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1172, \"clipIn\": 805, \"clipOut\": 976, \"clipDuration\": 171, \"sourceIn\": 0, \"sourceOut\": 171, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/sq01/Video_1sq01sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"cef0267f-bbf4-4959-9f22-d225e03f2532\", \"clip_source_resolution\": {\"width\": \"640\", \"height\": \"360\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/sq01\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"sq01\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"sq01\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"2a780b95-14cc-45de-acc0-3ecd1f504325\", \"reviewTrack\": null, \"parent_instance_id\": \"e8af785a-484f-452b-8c9c-ac31ef0696c4\", \"label\": \"/shots/sq01/Video_1sq01sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"a34e7048-3d86-4c29-88c7-f65b1ba3d777\", \"creator_attributes\": {\"parentInstance\": \"/shots/sq01/Video_1sq01sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"cef0267f-bbf4-4959-9f22-d225e03f2532\", \"publish\": true}" + }, + "clip_index": "cef0267f-bbf4-4959-9f22-d225e03f2532", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "cef0267f-bbf4-4959-9f22-d225e03f2532", + "clip_source_resolution": { + "height": "360", + "pixelAspect": 1.0, + "width": "640" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq01/Video_1sq01sh010 shot", + "vSyncOn": false, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "a34e7048-3d86-4c29-88c7-f65b1ba3d777", + "label": "/shots/sq01/Video_1sq01sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "e8af785a-484f-452b-8c9c-ac31ef0696c4", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "2a780b95-14cc-45de-acc0-3ecd1f504325", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "cef0267f-bbf4-4959-9f22-d225e03f2532", + "clip_source_resolution": { + "height": "360", + "pixelAspect": 1.0, + "width": "640" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 171, + "clipIn": 805, + "clipOut": 976, + "folderPath": "/shots/sq01/Video_1sq01sh010", + "fps": "from_selection", + "frameEnd": 1172, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 0, + "sourceOut": 171, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/sq01/Video_1sq01sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq01", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq01", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "e8af785a-484f-452b-8c9c-ac31ef0696c4", + "label": "/shots/sq01/Video_1sq01sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq01", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": null, + "sequence": "sq01", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "2a780b95-14cc-45de-acc0-3ecd1f504325", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 85.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": {}, + "name": "simple_editorial_setup.mp4", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 16450.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\data\\simple_editorial_setup.mp4" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file From b0b509d431eee02e193211efd52a0126af18e476 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Wed, 18 Sep 2024 16:34:05 -0400 Subject: [PATCH 146/216] Add unit tests --- .../test_media_range_with_retimes.py | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py diff --git a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py new file mode 100644 index 0000000000..7dca2e087a --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py @@ -0,0 +1,150 @@ +import os +import pytest + +import opentimelineio as otio + +from ayon_core.pipeline.editorial import get_media_range_with_retimes + + +_RESOURCE_DIR = os.path.join( + os.path.dirname(__file__), + "resources" +) + + +def _check_expected_retimed_values( + file_name: str, + expected_retimed_data: dict, + handle_start: int = 10, + handle_end: int = 10, +): + file_path = os.path.join(_RESOURCE_DIR, file_name) + otio_clip = otio.schema.Clip.from_json_file(file_path) + + retimed_data = get_media_range_with_retimes( + otio_clip, handle_start, handle_end + ) + assert retimed_data == expected_retimed_data + + +def test_movie_with_end_handle_end_only(): + """ + Movie clip (no embedded timecode) + available_range = 0-171 25fps + source_range = 0-16450 25fps + """ + expected_data = { + 'mediaIn': 0.0, + 'mediaOut': 170.0, + 'handleStart': 0, + 'handleEnd': 10, + 'speed': 1.0 + } + _check_expected_retimed_values( + "movie_with_handles.json", + expected_data, + ) + + +def test_movie_embedded_tc_handle(): + """ + Movie clip (embedded timecode 1h) + available_range = 86400-86500 24fps + source_range = 90032-90076 25fps + """ + expected_data = { + 'mediaIn': 30.720000000001164, + 'mediaOut': 71.9600000000064, + 'handleStart': 10, + 'handleEnd': 10, + 'speed': 1.0 + } + _check_expected_retimed_values( + "qt_embedded_tc.json", + expected_data + ) + + +def test_movie_retime_effect(): + """ + Movie clip (embedded timecode 1h) + available_range = 0-171 25fps + source_range = 0-16450 25fps + retimed speed: 250% + """ + expected_data = { + 'mediaIn': 0.0, + 'mediaOut': 426.5, + 'handleStart': 0, + 'handleEnd': 25, + 'speed': 2.5, + 'versionData': { + 'retime': True, + 'speed': 2.5, + 'timewarps': [], + 'handleStart': 0, + 'handleEnd': 25 + } + } +# import rpdb ; rpdb.Rpdb().set_trace() + _check_expected_retimed_values( + "qt_retimed_speed.json", + expected_data + ) + + +def test_img_sequence_no_handles(): + """ + Img sequence clip (no embedded timecode) + available files = 1000-1100 + source_range = 0-100 25fps + """ + expected_data = { + 'mediaIn': 1000, + 'mediaOut': 1100, + 'handleStart': 0, + 'handleEnd': 0, + 'speed': 1.0 + } + _check_expected_retimed_values( + "img_seq_no_handles.json", + expected_data + ) + + +def test_img_sequence_with_handles(): + """ + Img sequence clip (no embedded timecode) + available files = 1000-1100 + source_range = 34-72 25fps + """ + expected_data = { + 'mediaIn': 1034, + 'mediaOut': 1072, + 'handleStart': 10, + 'handleEnd': 10, + 'speed': 1.0 + } + _check_expected_retimed_values( + "img_seq_with_handles.json", + expected_data + ) + + +def test_img_sequence_with_embedded_tc_and_handles(): + """ + Img sequence clip (embedded timecode 1h) + available files = 1000-1100 + source_range = 91046.625-91,120.625 25fps + """ + expected_data = { + 'mediaIn': 1005, + 'mediaOut': 1075, + 'handleStart': 5, + 'handleEnd': 10, + 'speed': 1.0 + } + _check_expected_retimed_values( + "img_seq_embedded_tc.json", + expected_data + ) From be2b8d5c60087d53e84f84bf9392f0ece2812c91 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Wed, 18 Sep 2024 16:46:49 -0400 Subject: [PATCH 147/216] Fix lint. --- client/ayon_core/pipeline/editorial.py | 8 +++----- .../plugins/publish/extract_otio_trimming_video.py | 3 --- .../pipeline/editorial/test_media_range_with_retimes.py | 1 - 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index bc02ae9b00..ca62c13e7d 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -176,8 +176,6 @@ def _sequence_resize(source, length): def get_media_range_with_retimes(otio_clip, handle_start, handle_end): source_range = otio_clip.source_range available_range = otio_clip.available_range() - - source_range_rate = source_range.start_time.rate available_range_rate = available_range.start_time.rate # Conform source range bounds to available range rate @@ -187,9 +185,9 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # 86400 86500 # # - # 90010 90060 - # src |-----|______duration 2s___|----| 25fps - # 90000 + # 90010 90060 + # src |-----|______duration 2s___|----| 25fps + # 90000 # # # 86409.6 86466.8 diff --git a/client/ayon_core/plugins/publish/extract_otio_trimming_video.py b/client/ayon_core/plugins/publish/extract_otio_trimming_video.py index 0c77602681..59b8a714f0 100644 --- a/client/ayon_core/plugins/publish/extract_otio_trimming_video.py +++ b/client/ayon_core/plugins/publish/extract_otio_trimming_video.py @@ -74,9 +74,6 @@ class ExtractOTIOTrimmingVideo(publish.Extractor): otio_range (opentime.TimeRange): range to trim to """ - # Not all hosts can import this module. - from ayon_core.pipeline.editorial import frames_to_seconds - # create path to destination output_path = self._get_ffmpeg_output(input_file_path) diff --git a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py index 7dca2e087a..ea0b7fbf82 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py +++ b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py @@ -1,5 +1,4 @@ import os -import pytest import opentimelineio as otio From ac8848dd1975e93847c0d0afc19eb51b403ca69b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:28:59 +0200 Subject: [PATCH 148/216] fix crash widget layour --- client/ayon_core/tools/publisher/widgets/report_page.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index d491c300d3..5e48cef0d2 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1586,13 +1586,13 @@ class CrashWidget(QtWidgets.QWidget): layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(5, 5, 5, 5) layout.setSpacing(0) - layout.addSpacing(20) + layout.addStretch(1) layout.addWidget(main_label, 0) - layout.addSpacing(20) + layout.addSpacing(30) layout.addWidget(report_label, 0) - layout.addSpacing(20) + layout.addSpacing(30) layout.addWidget(btns_widget, 0) - layout.addSpacing(10) + layout.addStretch(2) copy_clipboard_btn.clicked.connect(self._on_copy_to_clipboard) save_to_disk_btn.clicked.connect(self._on_save_to_disk_click) From f5182f277cb4e4472ad76f8fa14a3f8460fe4294 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:33:31 +0200 Subject: [PATCH 149/216] fix success publish page --- .../ayon_core/tools/publisher/widgets/report_page.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index 5e48cef0d2..7ee7ad76f3 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1802,8 +1802,11 @@ class ReportsWidget(QtWidgets.QWidget): if is_crashed: error_info = self._controller.get_publish_error_info() + publish_finished = self._controller.publish_has_finished() publish_error_mode = False - if ( + if publish_finished: + publish_error_mode = False + elif ( error_info is not None and not error_info.is_unknown_error ): @@ -1819,14 +1822,15 @@ class ReportsWidget(QtWidgets.QWidget): view = self._publish_error_view else: view = self._instances_view + self._views_layout.setCurrentWidget(view) self._actions_widget.set_visible_mode(publish_error_mode) self._detail_inputs_spacer.setVisible(publish_error_mode) self._detail_input_scroll.setVisible(publish_error_mode) - self._views_layout.setCurrentWidget(view) - self._crash_widget.setVisible(not publish_error_mode) - self._logs_view.setVisible(publish_error_mode) + logs_visible = publish_error_mode or publish_finished + self._logs_view.setVisible(logs_visible) + self._crash_widget.setVisible(not logs_visible) # Instance view & logs update instance_items = self._get_instance_items() From b2b933bc029026034e374079a427514a5cb6a07e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:03:24 +0200 Subject: [PATCH 150/216] fix and simplify the visibility --- .../tools/publisher/widgets/report_page.py | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/client/ayon_core/tools/publisher/widgets/report_page.py b/client/ayon_core/tools/publisher/widgets/report_page.py index 7ee7ad76f3..b7afcf470a 100644 --- a/client/ayon_core/tools/publisher/widgets/report_page.py +++ b/client/ayon_core/tools/publisher/widgets/report_page.py @@ -1797,38 +1797,31 @@ class ReportsWidget(QtWidgets.QWidget): return instance_items def update_data(self): - is_crashed = self._controller.publish_has_crashed() + has_validation_error = self._controller.publish_has_validation_errors() + has_finished = self._controller.publish_has_finished() + has_crashed = self._controller.publish_has_crashed() error_info = None - if is_crashed: + if has_crashed: error_info = self._controller.get_publish_error_info() - publish_finished = self._controller.publish_has_finished() publish_error_mode = False - if publish_finished: - publish_error_mode = False - elif ( - error_info is not None - and not error_info.is_unknown_error - ): - publish_error_mode = True - - elif ( - not is_crashed - and self._controller.publish_has_validation_errors() - ): + if error_info is not None: + publish_error_mode = not error_info.is_unknown_error + elif has_validation_error: publish_error_mode = True if publish_error_mode: view = self._publish_error_view else: view = self._instances_view + self._views_layout.setCurrentWidget(view) self._actions_widget.set_visible_mode(publish_error_mode) self._detail_inputs_spacer.setVisible(publish_error_mode) self._detail_input_scroll.setVisible(publish_error_mode) - logs_visible = publish_error_mode or publish_finished + logs_visible = publish_error_mode or has_finished or not has_crashed self._logs_view.setVisible(logs_visible) self._crash_widget.setVisible(not logs_visible) From 98918b1dd4e4140f93f23de8f16178d43494cd65 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 20 Sep 2024 00:23:28 +0300 Subject: [PATCH 151/216] Add `ExtractOIIOTranscode` settings override --- server/settings/conversion.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index f513738603..7eed13bb69 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -71,10 +71,36 @@ def _convert_validate_version_0_3_3(publish_overrides): validate_version["plugin_state_profiles"] = [profile] +def _convert_oiio_transcode_0_4_5(publish_overrides): + """ExtractOIIOTranscode plugin changed in 0.4.5.""" + if "ExtractOIIOTranscode" not in publish_overrides: + return + + transcode_profiles = publish_overrides["ExtractOIIOTranscode"]["profiles"] + + for profile in transcode_profiles: + for output in profile["outputs"]: + transcode_type = output["transcoding_type"] + if transcode_type == "display": + output["transcoding_type"] = "display_view" + # Already new settings + if "display_view" in output: + continue + + output["display_view"] = {} + if output["display"]: + output["display_view"].update({"display": output["display"]}) + output.pop("display") + if output["view"]: + output["display_view"].update({"view": output["view"]}) + output.pop("view") + + def _conver_publish_plugins(overrides): if "publish" not in overrides: return _convert_validate_version_0_3_3(overrides["publish"]) + _convert_oiio_transcode_0_4_5(overrides["publish"]) def convert_settings_overrides( From 9ea9e344a2e147e1681a291795f3352ea71cb5af Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 20 Sep 2024 12:28:34 +0200 Subject: [PATCH 152/216] Log the filepath it invalidated for clearer log --- client/ayon_core/plugins/publish/integrate.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index d3f6c04333..e8fe09bab7 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -509,8 +509,11 @@ class IntegrateAsset(pyblish.api.InstancePlugin): if not is_sequence_representation: files = [files] - if any(os.path.isabs(fname) for fname in files): - raise KnownPublishError("Given file names contain full paths") + for fname in files: + if os.path.isabs(fname): + raise KnownPublishError( + f"Representation file names contains full paths: {fname}" + ) if not is_sequence_representation: return From 451d5e77cd4edeadd5cc18bcf14fdc9d350c3a5c Mon Sep 17 00:00:00 2001 From: Mustafa Jafar Date: Mon, 23 Sep 2024 12:13:23 +0300 Subject: [PATCH 153/216] exit _convert_oiio_transcode_0_4_5 if there are no profiles Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server/settings/conversion.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 7eed13bb69..06a1c2c02b 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -76,7 +76,9 @@ def _convert_oiio_transcode_0_4_5(publish_overrides): if "ExtractOIIOTranscode" not in publish_overrides: return - transcode_profiles = publish_overrides["ExtractOIIOTranscode"]["profiles"] + transcode_profiles = publish_overrides["ExtractOIIOTranscode"].get("profiles") + if not transcode_profiles: + return for profile in transcode_profiles: for output in profile["outputs"]: From 50428f1528a241176da08092eceeef746e8b4359 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 23 Sep 2024 13:55:09 +0200 Subject: [PATCH 154/216] Fix delivering UDIMs using {udim} in delivery template --- client/ayon_core/lib/path_tools.py | 5 ++++- client/ayon_core/plugins/load/delivery.py | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/lib/path_tools.py b/client/ayon_core/lib/path_tools.py index a65f0f8e13..5c81fbfebf 100644 --- a/client/ayon_core/lib/path_tools.py +++ b/client/ayon_core/lib/path_tools.py @@ -81,7 +81,10 @@ def collect_frames(files): dict: {'/folder/product_v001.0001.png': '0001', ....} """ - patterns = [clique.PATTERNS["frames"]] + # clique.PATTERNS["frames"] supports only `.1001.exr` not `_1001.exr` so + # we use a customized pattern. + pattern = "[_.](?P(?P0*)\\d+)\\.\\D+\\d?$" + patterns = [pattern] collections, remainder = clique.assemble( files, minimum_items=1, patterns=patterns) diff --git a/client/ayon_core/plugins/load/delivery.py b/client/ayon_core/plugins/load/delivery.py index c7954a18b2..449d4f0554 100644 --- a/client/ayon_core/plugins/load/delivery.py +++ b/client/ayon_core/plugins/load/delivery.py @@ -231,6 +231,11 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): self.log ] + # TODO: This will currently incorrectly detect 'resources' + # that are published along with the publish, because those should + # not adhere to the template directly but are ingested in a + # customized way. For example, maya look textures or any publish + # that directly adds files into `instance.data["transfers"]`. if repre.get("files"): src_paths = [] for repre_file in repre["files"]: @@ -263,7 +268,18 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): frame = dst_frame if frame is not None: - anatomy_data["frame"] = frame + if repre["context"].get("frame"): + anatomy_data["frame"] = frame + elif repre["context"].get("udim"): + anatomy_data["udim"] = frame + else: + # Fallback + self.log.warning( + "Representation context has no frame or udim" + " data. Supplying sequence frame to '{frame}'" + " formatting data." + ) + anatomy_data["frame"] = frame new_report_items, uploaded = deliver_single_file(*args) report_items.update(new_report_items) self._update_progress(uploaded) From 4f2340adea40e8c2e589387a115ae1c083041d9a Mon Sep 17 00:00:00 2001 From: Robin De Lillo Date: Mon, 23 Sep 2024 08:14:55 -0400 Subject: [PATCH 155/216] Update client/ayon_core/pipeline/editorial.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/pipeline/editorial.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index ca62c13e7d..4b823f130f 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -262,8 +262,12 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # compute retimed range media_in_trimmed = conformed_source_range.start_time.value + offset_in media_out_trimmed = media_in_trimmed + ( - (conformed_source_range.duration.value * abs( - time_scalar) + offset_out) - 1) + ( + conformed_source_range.duration.value + * abs(time_scalar) + + offset_out + ) - 1 + ) media_in = available_range.start_time.value media_out = available_range.end_time_inclusive().value From f9ed6f58774cb14c132ed53856d8a966838131a1 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Mon, 23 Sep 2024 08:19:12 -0400 Subject: [PATCH 156/216] Fix typos. --- client/ayon_core/pipeline/editorial.py | 2 +- .../pipeline/editorial/test_media_range_with_retimes.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 4b823f130f..7d6d6f5882 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -282,7 +282,7 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): ) if is_input_sequence: - # preserve discreet frame numbers + # preserve discrete frame numbers media_in_trimmed = otio.opentime.RationalTime.from_frames( media_in_trimmed - media_in + media_ref.start_frame, rate=available_range_rate, diff --git a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py index ea0b7fbf82..82512df7b8 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py +++ b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py @@ -85,7 +85,6 @@ def test_movie_retime_effect(): 'handleEnd': 25 } } -# import rpdb ; rpdb.Rpdb().set_trace() _check_expected_retimed_values( "qt_retimed_speed.json", expected_data From d2b933718d85d996fe4217f490e5fbd65a916a42 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Mon, 23 Sep 2024 08:22:54 -0400 Subject: [PATCH 157/216] Adjust test docstring. --- .../pipeline/editorial/test_media_range_with_retimes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py index 82512df7b8..270b01a799 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py +++ b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py @@ -133,7 +133,7 @@ def test_img_sequence_with_embedded_tc_and_handles(): """ Img sequence clip (embedded timecode 1h) available files = 1000-1100 - source_range = 91046.625-91,120.625 25fps + source_range = 91046.625-91120.625 25fps """ expected_data = { 'mediaIn': 1005, From cd5303ef7b09014115f56432337a4b461617d2df Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 23 Sep 2024 14:42:01 +0200 Subject: [PATCH 158/216] Remove legacy code --- client/ayon_core/plugins/load/delivery.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/plugins/load/delivery.py b/client/ayon_core/plugins/load/delivery.py index c7954a18b2..60d4c01258 100644 --- a/client/ayon_core/plugins/load/delivery.py +++ b/client/ayon_core/plugins/load/delivery.py @@ -267,17 +267,11 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): new_report_items, uploaded = deliver_single_file(*args) report_items.update(new_report_items) self._update_progress(uploaded) - else: # fallback for Pype2 and representations without files - frame = repre["context"].get("frame") - if frame: - repre["context"]["frame"] = len(str(frame)) * "#" - - if not frame: - new_report_items, uploaded = deliver_single_file(*args) - else: - new_report_items, uploaded = deliver_sequence(*args) - report_items.update(new_report_items) - self._update_progress(uploaded) + else: + raise ValueError( + "Representation entity is lacking `files`." + f" Unable to process entity: {repre}" + ) self.text_area.setText(self._format_report(report_items)) self.text_area.setVisible(True) From b85289080e4289810bdebbca9b87f490ddac19fa Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 23 Sep 2024 15:02:12 +0200 Subject: [PATCH 159/216] Remove unused import --- client/ayon_core/plugins/load/delivery.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/load/delivery.py b/client/ayon_core/plugins/load/delivery.py index 60d4c01258..09c396ff6f 100644 --- a/client/ayon_core/plugins/load/delivery.py +++ b/client/ayon_core/plugins/load/delivery.py @@ -17,8 +17,7 @@ from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.pipeline.delivery import ( get_format_dict, check_destination_path, - deliver_single_file, - deliver_sequence, + deliver_single_file ) From ffd548201849c20436f147d109998e8cd1a98dbd Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 23 Sep 2024 15:17:47 +0200 Subject: [PATCH 160/216] Fix not removing absolute path in Maya DL submission This occured only in Maya (or DCC with AOV), caused pasting whole absolute path to metadata.json which could caused `Given file names contain full paths` (if ValidateExpectedFiles was disabled). 'files' is expecting only file names, not full path. --- client/ayon_core/pipeline/farm/pyblish_functions.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/ayon_core/pipeline/farm/pyblish_functions.py b/client/ayon_core/pipeline/farm/pyblish_functions.py index b218dc78e5..af90903bd8 100644 --- a/client/ayon_core/pipeline/farm/pyblish_functions.py +++ b/client/ayon_core/pipeline/farm/pyblish_functions.py @@ -788,6 +788,11 @@ def _create_instances_for_aov(instance, skeleton, aov_filter, additional_data, colorspace = product.colorspace break + if isinstance(files, (list, tuple)): + files = [os.path.basename(f) for f in files] + else: + files = os.path.basename(files) + rep = { "name": ext, "ext": ext, From e9b67edc0f16f972c6d0d53f056ff69c03f49653 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 23 Sep 2024 15:37:58 +0200 Subject: [PATCH 161/216] Remove legacy condition completely --- client/ayon_core/plugins/load/delivery.py | 70 +++++++++++------------ 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/client/ayon_core/plugins/load/delivery.py b/client/ayon_core/plugins/load/delivery.py index 09c396ff6f..6a0947cc42 100644 --- a/client/ayon_core/plugins/load/delivery.py +++ b/client/ayon_core/plugins/load/delivery.py @@ -230,47 +230,41 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): self.log ] - if repre.get("files"): - src_paths = [] - for repre_file in repre["files"]: - src_path = self.anatomy.fill_root(repre_file["path"]) - src_paths.append(src_path) - sources_and_frames = collect_frames(src_paths) + src_paths = [] + for repre_file in repre["files"]: + src_path = self.anatomy.fill_root(repre_file["path"]) + src_paths.append(src_path) + sources_and_frames = collect_frames(src_paths) - frames = set(sources_and_frames.values()) - frames.discard(None) - first_frame = None - if frames: - first_frame = min(frames) + frames = set(sources_and_frames.values()) + frames.discard(None) + first_frame = None + if frames: + first_frame = min(frames) - for src_path, frame in sources_and_frames.items(): - args[0] = src_path - # Renumber frames - if renumber_frame and frame is not None: - # Calculate offset between - # first frame and current frame - # - '0' for first frame - offset = frame_offset - int(first_frame) - # Add offset to new frame start - dst_frame = int(frame) + offset - if dst_frame < 0: - msg = "Renumber frame has a smaller number than original frame" # noqa - report_items[msg].append(src_path) - self.log.warning("{} <{}>".format( - msg, dst_frame)) - continue - frame = dst_frame + for src_path, frame in sources_and_frames.items(): + args[0] = src_path + # Renumber frames + if renumber_frame and frame is not None: + # Calculate offset between + # first frame and current frame + # - '0' for first frame + offset = frame_offset - int(first_frame) + # Add offset to new frame start + dst_frame = int(frame) + offset + if dst_frame < 0: + msg = "Renumber frame has a smaller number than original frame" # noqa + report_items[msg].append(src_path) + self.log.warning("{} <{}>".format( + msg, dst_frame)) + continue + frame = dst_frame - if frame is not None: - anatomy_data["frame"] = frame - new_report_items, uploaded = deliver_single_file(*args) - report_items.update(new_report_items) - self._update_progress(uploaded) - else: - raise ValueError( - "Representation entity is lacking `files`." - f" Unable to process entity: {repre}" - ) + if frame is not None: + anatomy_data["frame"] = frame + new_report_items, uploaded = deliver_single_file(*args) + report_items.update(new_report_items) + self._update_progress(uploaded) self.text_area.setText(self._format_report(report_items)) self.text_area.setVisible(True) From d93c114d14bab45a0406588414999844c5a6c62a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 12:45:18 +0200 Subject: [PATCH 162/216] Fix querying of loadedVersions It si only in context.data, without it 'reference' links (of loaded containers) won't be created. --- client/ayon_core/plugins/publish/integrate_inputlinks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/integrate_inputlinks.py b/client/ayon_core/plugins/publish/integrate_inputlinks.py index 16aef09a39..113d6144ce 100644 --- a/client/ayon_core/plugins/publish/integrate_inputlinks.py +++ b/client/ayon_core/plugins/publish/integrate_inputlinks.py @@ -97,7 +97,7 @@ class IntegrateInputLinksAYON(pyblish.api.ContextPlugin): instance.data["versionEntity"]["id"], ) - loaded_versions = workfile_instance.context.get("loadedVersions") + loaded_versions = workfile_instance.context.data.get("loadedVersions") if not loaded_versions: return From 5189ee77243c7e6f4633f3b7a0e2251b0d88252f Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 12:45:37 +0200 Subject: [PATCH 163/216] Added docstrings --- .../plugins/publish/integrate_inputlinks.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/integrate_inputlinks.py b/client/ayon_core/plugins/publish/integrate_inputlinks.py index 113d6144ce..912420e7b3 100644 --- a/client/ayon_core/plugins/publish/integrate_inputlinks.py +++ b/client/ayon_core/plugins/publish/integrate_inputlinks.py @@ -9,7 +9,14 @@ from ayon_api import ( class IntegrateInputLinksAYON(pyblish.api.ContextPlugin): - """Connecting version level dependency links""" + """Connecting version level dependency links + + Handles links: + - generative - what gets produced from workfile + - reference - what was loaded into workfile + + It expects workfile instance is being published. + """ order = pyblish.api.IntegratorOrder + 0.2 label = "Connect Dependency InputLinks AYON" @@ -47,6 +54,11 @@ class IntegrateInputLinksAYON(pyblish.api.ContextPlugin): self.create_links_on_server(context, new_links_by_type) def split_instances(self, context): + """Separates published instances into workfile and other + + Returns: + (tuple(pyblish.plugin.Instance), list(pyblish.plugin.Instance)) + """ workfile_instance = None other_instances = [] @@ -83,6 +95,15 @@ class IntegrateInputLinksAYON(pyblish.api.ContextPlugin): def create_workfile_links( self, workfile_instance, other_instances, new_links_by_type ): + """Adds links (generative and reference) for workfile. + + Args: + workfile_instance (pyblish.plugin.Instance): published workfile + other_instances (list[pyblish.plugin.Instance]): other published + instances + new_links_by_type (dict[str, list[str]): dictionary collecting new + created links by its type + """ if workfile_instance is None: self.log.warn("No workfile in this publish session.") return From ebbd65cc6902bde884c120f3219467ad1ff6a24a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 12:45:54 +0200 Subject: [PATCH 164/216] Refactor imports --- client/ayon_core/tools/loader/models/sitesync.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/loader/models/sitesync.py b/client/ayon_core/tools/loader/models/sitesync.py index 02504c2ad3..753a2e4d5c 100644 --- a/client/ayon_core/tools/loader/models/sitesync.py +++ b/client/ayon_core/tools/loader/models/sitesync.py @@ -1,6 +1,9 @@ import collections -from ayon_api import get_representations, get_versions_links +from ayon_api import ( + get_representations, + get_versions_links, +) from ayon_core.lib import Logger, NestedCacheItem from ayon_core.addon import AddonsManager From 2bd7f814bfbedd8fa300d1f9c2f929a662ba6377 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 12:47:12 +0200 Subject: [PATCH 165/216] Fix directions of links Currently workfile instance is on 'outside' side of reference link, we must look for 'input' reference links for it --- client/ayon_core/tools/loader/models/sitesync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/loader/models/sitesync.py b/client/ayon_core/tools/loader/models/sitesync.py index 753a2e4d5c..8d29845f5d 100644 --- a/client/ayon_core/tools/loader/models/sitesync.py +++ b/client/ayon_core/tools/loader/models/sitesync.py @@ -578,7 +578,7 @@ class SiteSyncModel: project_name, versions_to_check, link_types=link_types, - link_direction="out") + link_direction="in") # looking for 'in'puts for version versions_to_check = set() for links in versions_links.values(): From 2c673ea4c4563822292e77c4414750e141e5b249 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 12:48:34 +0200 Subject: [PATCH 166/216] Refactor adding site to linked representations Previously it was handled by ugly exception, not it actually checks if representation files are present and if not it forces redownload immediately. --- client/ayon_core/tools/loader/models/sitesync.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/loader/models/sitesync.py b/client/ayon_core/tools/loader/models/sitesync.py index 8d29845f5d..375ef9aa26 100644 --- a/client/ayon_core/tools/loader/models/sitesync.py +++ b/client/ayon_core/tools/loader/models/sitesync.py @@ -512,18 +512,19 @@ class SiteSyncModel: "reference" ) for link_repre_id in links: - try: + if not self._sitesync_addon.is_representation_on_site( + project_name, + link_repre_id, + site_name + ): print("Adding {} to linked representation: {}".format( site_name, link_repre_id)) self._sitesync_addon.add_site( project_name, link_repre_id, site_name, - force=False + force=True ) - except Exception: - # do not add/reset working site for references - log.debug("Site present", exc_info=True) def _get_linked_representation_id( self, From 7106ff04416c11de216943ba330e45c92c3fe919 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 12:49:19 +0200 Subject: [PATCH 167/216] Refactor remove unneeded check for adding to set --- client/ayon_core/tools/loader/models/sitesync.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/ayon_core/tools/loader/models/sitesync.py b/client/ayon_core/tools/loader/models/sitesync.py index 375ef9aa26..c7f0038df4 100644 --- a/client/ayon_core/tools/loader/models/sitesync.py +++ b/client/ayon_core/tools/loader/models/sitesync.py @@ -588,9 +588,6 @@ class SiteSyncModel: if link["entityType"] != "version": continue entity_id = link["entityId"] - # Skip already found linked version ids - if entity_id in linked_version_ids: - continue linked_version_ids.add(entity_id) versions_to_check.add(entity_id) From 7c1602340949fa3576eec1eec49720d5a3e7fcb6 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 24 Sep 2024 14:49:20 +0200 Subject: [PATCH 168/216] Fix docstring type definition Co-authored-by: Roy Nieterau --- client/ayon_core/plugins/publish/integrate_inputlinks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/integrate_inputlinks.py b/client/ayon_core/plugins/publish/integrate_inputlinks.py index 912420e7b3..a3b6a228d6 100644 --- a/client/ayon_core/plugins/publish/integrate_inputlinks.py +++ b/client/ayon_core/plugins/publish/integrate_inputlinks.py @@ -101,7 +101,7 @@ class IntegrateInputLinksAYON(pyblish.api.ContextPlugin): workfile_instance (pyblish.plugin.Instance): published workfile other_instances (list[pyblish.plugin.Instance]): other published instances - new_links_by_type (dict[str, list[str]): dictionary collecting new + new_links_by_type (dict[str, list[str]]): dictionary collecting new created links by its type """ if workfile_instance is None: From 77fac00ecc68be9189dc321381880a432c7b617c Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 24 Sep 2024 12:50:52 -0400 Subject: [PATCH 169/216] Make it work even with image sequence and embedded timecodes. --- client/ayon_core/pipeline/editorial.py | 80 +++++-- .../plugins/publish/extract_otio_review.py | 208 +++++++++++------- 2 files changed, 189 insertions(+), 99 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 7d6d6f5882..23c49154ac 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -88,7 +88,7 @@ def trim_media_range(media_range, source_range): """ rw_media_start = _ot.RationalTime( - media_range.start_time.value + source_range.start_time.value, + source_range.start_time.value, media_range.start_time.rate ) rw_media_duration = _ot.RationalTime( @@ -173,6 +173,66 @@ def _sequence_resize(source, length): yield (1 - ratio) * source[int(low)] + ratio * source[int(high)] +def is_clip_from_media_sequence(otio_clip): + """ + Args: + otio_clip (otio.schema.Clip): The OTIO clip to check. + + Returns: + bool. Is the provided clip from an input media sequence ? + """ + media_ref = otio_clip.media_reference + metadata = media_ref.metadata + + # OpenTimelineIO 0.13 and newer + is_input_sequence = ( + hasattr(otio.schema, "ImageSequenceReference") and + isinstance(media_ref, otio.schema.ImageSequenceReference) + ) + + # OpenTimelineIO 0.12 and older + is_input_sequence_legacy = bool(metadata.get("padding")) + + return is_input_sequence or is_input_sequence_legacy + + +def remap_range_on_file_sequence(otio_clip, in_out_range): + """ + Args: + otio_clip (otio.schema.Clip): The OTIO clip to check. + in_out_range (tuple[float, float]): The in-out range to remap. + + Returns: + tuple(int, int): The remapped range as discrete frame number. + + Raises: + ValueError. When the otio_clip or provided range is invalid. + """ + if not is_clip_from_media_sequence(otio_clip): + raise ValueError(f"Cannot map on non-file sequence clip {otio_clip}.") + + try: + media_in_trimmed, media_out_trimmed = in_out_range + + except ValueError as error: + raise ValueError("Invalid in_out_range provided.") from error + + media_ref = otio_clip.media_reference + media_in = otio_clip.available_range().start_time.value + available_range_rate = otio_clip.available_range().start_time.rate + + frame_in = otio.opentime.RationalTime.from_frames( + media_in_trimmed - media_in + media_ref.start_frame, + rate=available_range_rate, + ).to_frames() + frame_out = otio.opentime.RationalTime.from_frames( + media_out_trimmed - media_in + media_ref.start_frame, + rate=available_range_rate, + ).to_frames() + + return frame_in, frame_out + + def get_media_range_with_retimes(otio_clip, handle_start, handle_end): source_range = otio_clip.source_range available_range = otio_clip.available_range() @@ -276,22 +336,14 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # mediaIn/mediaOut have to correspond # to frame numbers from source sequence. media_ref = otio_clip.media_reference - is_input_sequence = ( - hasattr(otio.schema, "ImageSequenceReference") and - isinstance(media_ref, otio.schema.ImageSequenceReference) - ) + is_input_sequence = is_clip_from_media_sequence(otio_clip) if is_input_sequence: # preserve discrete frame numbers - media_in_trimmed = otio.opentime.RationalTime.from_frames( - media_in_trimmed - media_in + media_ref.start_frame, - rate=available_range_rate, - ).to_frames() - media_out_trimmed = otio.opentime.RationalTime.from_frames( - media_out_trimmed - media_in + media_ref.start_frame, - rate=available_range_rate, - ).to_frames() - + media_in_trimmed, media_out_trimmed = remap_range_on_file_sequence( + otio_clip, + (media_in_trimmed, media_out_trimmed) + ) media_in = media_ref.start_frame media_out = media_in + available_range.duration.to_frames() - 1 diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 64c73adbd5..b96f716ac9 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -58,7 +58,9 @@ class ExtractOTIOReview(publish.Extractor): import opentimelineio as otio from ayon_core.pipeline.editorial import ( otio_range_to_frame_range, - make_sequence_collection + make_sequence_collection, + remap_range_on_file_sequence, + is_clip_from_media_sequence ) # TODO refactore from using instance variable @@ -105,42 +107,48 @@ class ExtractOTIOReview(publish.Extractor): otio_media = r_otio_cl.media_reference media_metadata = otio_media.metadata + variables = (self.to_width, self.to_height) + keys = ("width", "height") + # get from media reference metadata source # TODO 'openpype' prefix should be removed (added 24/09/03) # NOTE it looks like it is set only in hiero integration - for key in {"ayon.source.width", "openpype.source.width"}: - value = media_metadata.get(key) - if value is not None: - width = int(value) - break - - for key in {"ayon.source.height", "openpype.source.height"}: - value = media_metadata.get(key) - if value is not None: - height = int(value) - break - - # compare and reset - if width != self.to_width: - self.to_width = width - if height != self.to_height: - self.to_height = height + for variable, key in zip(variables, keys): + for meta_prefix in ("ayon.source.", "openpype.source."): + meta_key = f"{meta_prefix}.{key}" + if media_metadata.get(meta_key): + variable = media_metadata[meta_key] + break self.log.debug("> self.to_width x self.to_height: {} x {}".format( self.to_width, self.to_height )) - # get frame range values + # Clip: compute process range from available media range. src_range = r_otio_cl.source_range - start = src_range.start_time.value - duration = src_range.duration.value - available_range = None - self.actual_fps = src_range.duration.rate - - # add available range only if not gap if isinstance(r_otio_cl, otio.schema.Clip): available_range = r_otio_cl.available_range() + processing_range = None self.actual_fps = available_range.duration.rate + start = src_range.start_time.rescaled_to(self.actual_fps) + duration = src_range.duration.rescaled_to(self.actual_fps) + + # Gap: no media, generate range based on source range + else: + available_range = processing_range = None + self.actual_fps = src_range.duration.rate + start = src_range.start_time + duration = src_range.duration + + # Create handle offsets. + handle_start = otio.opentime.RationalTime( + handle_start, + rate=self.actual_fps, + ) + handle_end = otio.opentime.RationalTime( + handle_end, + rate=self.actual_fps, + ) # reframing handles conditions if (len(otio_review_clips) > 1) and (index == 0): @@ -157,35 +165,33 @@ class ExtractOTIOReview(publish.Extractor): duration += (handle_start + handle_end) if available_range: - available_range = self._trim_available_range( - available_range, start, duration, self.actual_fps) + processing_range = self._trim_available_range( + available_range, start, duration) # process all track items of the track if isinstance(r_otio_cl, otio.schema.Clip): # process Clip media_ref = r_otio_cl.media_reference metadata = media_ref.metadata - is_sequence = None - - # check in two way if it is sequence - if hasattr(otio.schema, "ImageSequenceReference"): - # for OpenTimelineIO 0.13 and newer - if isinstance(media_ref, - otio.schema.ImageSequenceReference): - is_sequence = True - else: - # for OpenTimelineIO 0.12 and older - if metadata.get("padding"): - is_sequence = True + is_sequence = is_clip_from_media_sequence(r_otio_cl) + # File sequence way if is_sequence: - # file sequence way + # Remap processing range to input file sequence. + processing_range_as_frames = ( + processing_range.start_time.to_frames(), + processing_range.end_time_inclusive().to_frames() + ) + first, last = remap_range_on_file_sequence( + r_otio_cl, + processing_range_as_frames, + ) + input_fps = processing_range.start_time.rate + if hasattr(media_ref, "target_url_base"): dirname = media_ref.target_url_base head = media_ref.name_prefix tail = media_ref.name_suffix - first, last = otio_range_to_frame_range( - available_range) collection = clique.Collection( head=head, tail=tail, @@ -195,7 +201,7 @@ class ExtractOTIOReview(publish.Extractor): [i for i in range(first, (last + 1))]) # render segment self._render_seqment( - sequence=[dirname, collection]) + sequence=[dirname, collection, input_fps]) # generate used frames self._generate_used_frames( len(collection.indexes)) @@ -204,24 +210,38 @@ class ExtractOTIOReview(publish.Extractor): # `ImageSequenceReference` path = media_ref.target_url collection_data = make_sequence_collection( - path, available_range, metadata) + path, processing_range, metadata) dir_path, collection = collection_data # render segment self._render_seqment( - sequence=[dir_path, collection]) + sequence=[dir_path, collection, input_fps]) # generate used frames self._generate_used_frames( len(collection.indexes)) + + # Single video way. + # Extraction via FFmpeg. else: - # single video file way path = media_ref.target_url + # Set extract range from 0 (FFmpeg ignores embedded timecode). + extract_range = otio.opentime.TimeRange( + otio.opentime.RationalTime( + ( + processing_range.start_time.value + - available_range.start_time.value + ), + rate=available_range.start_time.rate, + ), + duration=processing_range.duration, + ) # render video file to sequence self._render_seqment( - video=[path, available_range]) + video=[path, extract_range]) # generate used frames self._generate_used_frames( - available_range.duration.value) + processing_range.duration.value) + # QUESTION: what if nested track composition is in place? else: # at last process a Gap @@ -276,7 +296,7 @@ class ExtractOTIOReview(publish.Extractor): }) return representation_data - def _trim_available_range(self, avl_range, start, duration, fps): + def _trim_available_range(self, avl_range, start, duration): """ Trim available media range to source range. @@ -285,57 +305,62 @@ class ExtractOTIOReview(publish.Extractor): Args: avl_range (otio.time.TimeRange): media available time range - start (int): start frame - duration (int): duration frames - fps (float): frame rate + start (otio.time.RationalTime): start + duration (otio.time.RationalTime): duration Returns: otio.time.TimeRange: trimmed available range """ # Not all hosts can import these modules. + import opentimelineio as otio from ayon_core.pipeline.editorial import ( trim_media_range, - range_from_frames ) - avl_start = int(avl_range.start_time.value) - src_start = int(avl_start + start) - avl_durtation = int(avl_range.duration.value) + avl_start = avl_range.start_time + avl_duration = avl_range.duration - self.need_offset = bool(avl_start != 0 and src_start != 0) + # TODO investigate + #self.need_offset = bool(avl_start != 0 and src_start != 0) - # if media start is les then clip requires - if src_start < avl_start: - # calculate gap - gap_duration = avl_start - src_start - - # create gap data to disk - self._render_seqment(gap=gap_duration) - # generate used frames - self._generate_used_frames(gap_duration) - - # fix start and end to correct values - start = 0 + # A gap is required before available range + # range to conform start point. + if start < avl_start: + gap_duration = avl_start - start + start = avl_start duration -= gap_duration + # create gap data to disk + self._render_seqment(gap=gap_duration.to_frames()) + # generate used frames + self._generate_used_frames(gap_duration.to_frames()) + + # A gap is required after available range # if media duration is shorter then clip requirement - if duration > avl_durtation: - # calculate gap - gap_start = int(src_start + avl_durtation) - gap_end = int(src_start + duration) - gap_duration = gap_end - gap_start + end_point = start + duration + avl_end_point = avl_range.end_time_exclusive() + if end_point > avl_end_point: + gap_duration = end_point - avl_end_point + duration -= gap_duration # create gap data to disk - self._render_seqment(gap=gap_duration, end_offset=avl_durtation) + self._render_seqment( + gap=gap_duration.to_frames(), + end_offset=avl_duration.to_frames() + ) # generate used frames - self._generate_used_frames(gap_duration, end_offset=avl_durtation) - - # fix duration lenght - duration = avl_durtation + self._generate_used_frames( + gap_duration.to_frames(), + end_offset=avl_duration.to_frames() + ) # return correct trimmed range return trim_media_range( - avl_range, range_from_frames(start, duration, fps) + avl_range, + otio.opentime.TimeRange( + start, + duration + ) ) def _render_seqment(self, sequence=None, @@ -347,7 +372,7 @@ class ExtractOTIOReview(publish.Extractor): to defined image sequence format. Args: - sequence (list): input dir path string, collection object in list + sequence (list): input dir path string, collection object, fps in list video (list)[optional]: video_path string, otio_range in list gap (int)[optional]: gap duration end_offset (int)[optional]: offset gap frame start in frames @@ -369,7 +394,7 @@ class ExtractOTIOReview(publish.Extractor): input_extension = None if sequence: - input_dir, collection = sequence + input_dir, collection, sequence_fps = sequence in_frame_start = min(collection.indexes) # converting image sequence to image sequence @@ -377,9 +402,22 @@ class ExtractOTIOReview(publish.Extractor): input_path = os.path.join(input_dir, input_file) input_extension = os.path.splitext(input_path)[-1] - # form command for rendering gap files + # form command for rendering sequence files + # (need to explicit set the input frame range + # if case input sequence has framerate metadata + # to preserve frame range and avoid silent dropped + # frames caused by input mismatch with FFmpeg default + # rate 25.0 fps) more info refer to FFmpeg image2 demuxer + # + # Implicit + # [Input 100 frames (24fps from metadata)] -> [Demuxer video 25fps] -> [Output 98 frames, dropped 2] + # + # Explicit with "-framerate" + # [Input 100 frames (24fps from metadata)] -> [Demuxer video 24fps] -> [Output 100 frames] + command.extend([ "-start_number", str(in_frame_start), + "-framerate", str(sequence_fps), "-i", input_path ]) @@ -456,8 +494,8 @@ class ExtractOTIOReview(publish.Extractor): # create frame offset offset = 0 - if self.need_offset: - offset = 1 +# if self.need_offset: +# offset = 1 if end_offset: new_frames = list() From 6d31cd723c0043e12a5f64219a39cda981332f5e Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 24 Sep 2024 17:14:42 -0400 Subject: [PATCH 170/216] Add unit tests. --- .../plugins/publish/extract_otio_review.py | 20 +- .../resources/img_seq_embedded_tc_review.json | 363 ++++++++++++++++++ .../editorial/resources/img_seq_review.json | 363 ++++++++++++++++++ .../resources/qt_embedded_tc_review.json | 356 +++++++++++++++++ .../editorial/resources/qt_review.json | 356 +++++++++++++++++ .../editorial/test_extract_otio_review.py | 180 +++++++++ 6 files changed, 1624 insertions(+), 14 deletions(-) create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc_review.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/img_seq_review.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc_review.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/qt_review.json create mode 100644 tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index b96f716ac9..d1ac019c3a 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -320,9 +320,6 @@ class ExtractOTIOReview(publish.Extractor): avl_start = avl_range.start_time avl_duration = avl_range.duration - # TODO investigate - #self.need_offset = bool(avl_start != 0 and src_start != 0) - # A gap is required before available range # range to conform start point. if start < avl_start: @@ -331,9 +328,9 @@ class ExtractOTIOReview(publish.Extractor): duration -= gap_duration # create gap data to disk - self._render_seqment(gap=gap_duration.to_frames()) + self._render_seqment(gap=gap_duration.round().to_frames()) # generate used frames - self._generate_used_frames(gap_duration.to_frames()) + self._generate_used_frames(gap_duration.round().to_frames()) # A gap is required after available range # if media duration is shorter then clip requirement @@ -345,12 +342,12 @@ class ExtractOTIOReview(publish.Extractor): # create gap data to disk self._render_seqment( - gap=gap_duration.to_frames(), + gap=gap_duration.round().to_frames(), end_offset=avl_duration.to_frames() ) # generate used frames self._generate_used_frames( - gap_duration.to_frames(), + gap_duration.round().to_frames(), end_offset=avl_duration.to_frames() ) @@ -492,16 +489,11 @@ class ExtractOTIOReview(publish.Extractor): padding = "{{:0{}d}}".format(self.padding) - # create frame offset - offset = 0 -# if self.need_offset: -# offset = 1 - if end_offset: new_frames = list() start_frame = self.used_frames[-1] - for index in range((end_offset + offset), - (int(end_offset + duration) + offset)): + for index in range(end_offset, + (int(end_offset + duration))): seq_number = padding.format(start_frame + index) self.log.debug( "index: `{}` | seq_number: `{}`".format(index, seq_number)) diff --git a/tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc_review.json b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc_review.json new file mode 100644 index 0000000000..3437692155 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_embedded_tc_review.json @@ -0,0 +1,363 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "output.[1000-1100].exr", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 87399.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "0": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "1000": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "0": { + "Value": 0.8, + "Variant Type": "Double" + }, + "1000": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/seq_img_tc_handles_out/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"adca7e5b-b53c-48ab-8469-abe4db3c276a\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_tc_handles_out\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_img_tc_handles_out\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_img_tc_handles_out\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_tc_handles_out\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"fca94ed7-1e74-4ddc-8d56-05696e8c472a\", \"reviewTrack\": \"Video1\", \"label\": \"/shots/seq_img_tc_handles_out/sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"6c2baba3-183c-41f0-b9a9-596d315fd162\", \"creator_attributes\": {\"folderPath\": \"/shots/seq_img_tc_handles_out/sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1102, \"clipIn\": 86524, \"clipOut\": 86625, \"clipDuration\": 101, \"sourceIn\": 0, \"sourceOut\": 101, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video1\", \"folderPath\": \"/shots/seq_img_tc_handles_out/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"adca7e5b-b53c-48ab-8469-abe4db3c276a\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_tc_handles_out\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_img_tc_handles_out\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_img_tc_handles_out\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_tc_handles_out\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"fca94ed7-1e74-4ddc-8d56-05696e8c472a\", \"reviewTrack\": \"Video1\", \"parent_instance_id\": \"6c2baba3-183c-41f0-b9a9-596d315fd162\", \"label\": \"/shots/seq_img_tc_handles_out/sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"8b1f1e6f-699a-4481-b9be-92d819bc4096\", \"creator_attributes\": {\"parentInstance\": \"/shots/seq_img_tc_handles_out/sh010 shot\", \"vSyncOn\": true, \"vSyncTrack\": \"Video1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"adca7e5b-b53c-48ab-8469-abe4db3c276a\", \"publish\": true}" + }, + "clip_index": "adca7e5b-b53c-48ab-8469-abe4db3c276a", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "adca7e5b-b53c-48ab-8469-abe4db3c276a", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/seq_img_tc_handles_out/sh010 shot", + "vSyncOn": true, + "vSyncTrack": "Video1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_img_tc_handles_out/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_img_tc_handles_out", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_img_tc_handles_out", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "8b1f1e6f-699a-4481-b9be-92d819bc4096", + "label": "/shots/seq_img_tc_handles_out/sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "6c2baba3-183c-41f0-b9a9-596d315fd162", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_img_tc_handles_out", + "folder_type": "sequence" + } + ], + "productName": "plateVideo1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_img_tc_handles_out", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "fca94ed7-1e74-4ddc-8d56-05696e8c472a", + "variant": "Video1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "adca7e5b-b53c-48ab-8469-abe4db3c276a", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 101, + "clipIn": 86524, + "clipOut": 86625, + "folderPath": "/shots/seq_img_tc_handles_out/sh010", + "fps": "from_selection", + "frameEnd": 1102, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 0, + "sourceOut": 101, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_img_tc_handles_out/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_img_tc_handles_out", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_img_tc_handles_out", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "6c2baba3-183c-41f0-b9a9-596d315fd162", + "label": "/shots/seq_img_tc_handles_out/sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_img_tc_handles_out", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_img_tc_handles_out", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "fca94ed7-1e74-4ddc-8d56-05696e8c472a", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 87449.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": {}, + "name": "output.[1000-1100].exr", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 87399.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\exr_embedded_tc", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/img_seq_review.json b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_review.json new file mode 100644 index 0000000000..ed19d65744 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_review.json @@ -0,0 +1,363 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "output.[1000-1100].tif", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 91.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 5.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "-5": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "955": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "-5": { + "Value": 0.8, + "Variant Type": "Double" + }, + "955": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/seq_img_notc_blackhandles/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"a82520bd-f231-4a23-9cb7-8823141232db\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_notc_blackhandles\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_img_notc_blackhandles\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_img_notc_blackhandles\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_notc_blackhandles\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5d6be326-f1d0-4416-b6aa-780d05a8dd6d\", \"reviewTrack\": \"Video1\", \"label\": \"/shots/seq_img_notc_blackhandles/sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"e196263f-c584-40b4-bc27-018051a3bc92\", \"creator_attributes\": {\"folderPath\": \"/shots/seq_img_notc_blackhandles/sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1092, \"clipIn\": 86511, \"clipOut\": 86602, \"clipDuration\": 91, \"sourceIn\": 5, \"sourceOut\": 96, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video1\", \"folderPath\": \"/shots/seq_img_notc_blackhandles/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"a82520bd-f231-4a23-9cb7-8823141232db\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_notc_blackhandles\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_img_notc_blackhandles\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_img_notc_blackhandles\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_img_notc_blackhandles\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5d6be326-f1d0-4416-b6aa-780d05a8dd6d\", \"reviewTrack\": \"Video1\", \"parent_instance_id\": \"e196263f-c584-40b4-bc27-018051a3bc92\", \"label\": \"/shots/seq_img_notc_blackhandles/sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"ced7e9b8-721a-4377-a827-15fbf7f2831a\", \"creator_attributes\": {\"parentInstance\": \"/shots/seq_img_notc_blackhandles/sh010 shot\", \"vSyncOn\": true, \"vSyncTrack\": \"Video1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"a82520bd-f231-4a23-9cb7-8823141232db\", \"publish\": true}" + }, + "clip_index": "a82520bd-f231-4a23-9cb7-8823141232db", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "a82520bd-f231-4a23-9cb7-8823141232db", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/seq_img_notc_blackhandles/sh010 shot", + "vSyncOn": true, + "vSyncTrack": "Video1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_img_notc_blackhandles/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_img_notc_blackhandles", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_img_notc_blackhandles", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "ced7e9b8-721a-4377-a827-15fbf7f2831a", + "label": "/shots/seq_img_notc_blackhandles/sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "e196263f-c584-40b4-bc27-018051a3bc92", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_img_notc_blackhandles", + "folder_type": "sequence" + } + ], + "productName": "plateVideo1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_img_notc_blackhandles", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "5d6be326-f1d0-4416-b6aa-780d05a8dd6d", + "variant": "Video1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "a82520bd-f231-4a23-9cb7-8823141232db", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 91, + "clipIn": 86511, + "clipOut": 86602, + "folderPath": "/shots/seq_img_notc_blackhandles/sh010", + "fps": "from_selection", + "frameEnd": 1092, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 5, + "sourceOut": 96, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_img_notc_blackhandles/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_img_notc_blackhandles", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_img_notc_blackhandles", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "e196263f-c584-40b4-bc27-018051a3bc92", + "label": "/shots/seq_img_notc_blackhandles/sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_img_notc_blackhandles", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_img_notc_blackhandles", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "5d6be326-f1d0-4416-b6aa-780d05a8dd6d", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 50.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": {}, + "name": "output.[1000-1100].tif", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\tif_seq", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc_review.json b/tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc_review.json new file mode 100644 index 0000000000..629e9e04af --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/qt_embedded_tc_review.json @@ -0,0 +1,356 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "qt_embedded_tc.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 68.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86414.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "-14": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "986": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "-14": { + "Value": 0.8, + "Variant Type": "Double" + }, + "986": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/seq_qt_tc/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"12cce00c-eadf-4abd-ac80-0816a24506ab\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_tc\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_qt_tc\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_qt_tc\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_tc\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5dc397e0-1142-4a35-969d-d4c35c512f0f\", \"reviewTrack\": \"Video1\", \"label\": \"/shots/seq_qt_tc/sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"6f4bbf76-6638-4645-9059-0f516c0c12c2\", \"creator_attributes\": {\"folderPath\": \"/shots/seq_qt_tc/sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1069, \"clipIn\": 86516, \"clipOut\": 86584, \"clipDuration\": 68, \"sourceIn\": 14, \"sourceOut\": 82, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video1\", \"folderPath\": \"/shots/seq_qt_tc/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"12cce00c-eadf-4abd-ac80-0816a24506ab\", \"clip_source_resolution\": {\"width\": \"956\", \"height\": \"720\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_tc\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_qt_tc\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_qt_tc\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_tc\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5dc397e0-1142-4a35-969d-d4c35c512f0f\", \"reviewTrack\": \"Video1\", \"parent_instance_id\": \"6f4bbf76-6638-4645-9059-0f516c0c12c2\", \"label\": \"/shots/seq_qt_tc/sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"1d11a6b5-cc2b-49d8-8bcb-35187c785b22\", \"creator_attributes\": {\"parentInstance\": \"/shots/seq_qt_tc/sh010 shot\", \"vSyncOn\": true, \"vSyncTrack\": \"Video1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"12cce00c-eadf-4abd-ac80-0816a24506ab\", \"publish\": true}" + }, + "clip_index": "12cce00c-eadf-4abd-ac80-0816a24506ab", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "12cce00c-eadf-4abd-ac80-0816a24506ab", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/seq_qt_tc/sh010 shot", + "vSyncOn": true, + "vSyncTrack": "Video1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_qt_tc/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_qt_tc", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_qt_tc", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "1d11a6b5-cc2b-49d8-8bcb-35187c785b22", + "label": "/shots/seq_qt_tc/sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "6f4bbf76-6638-4645-9059-0f516c0c12c2", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_qt_tc", + "folder_type": "sequence" + } + ], + "productName": "plateVideo1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_qt_tc", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "5dc397e0-1142-4a35-969d-d4c35c512f0f", + "variant": "Video1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "12cce00c-eadf-4abd-ac80-0816a24506ab", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 68, + "clipIn": 86516, + "clipOut": 86584, + "folderPath": "/shots/seq_qt_tc/sh010", + "fps": "from_selection", + "frameEnd": 1069, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 14, + "sourceOut": 82, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_qt_tc/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_qt_tc", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_qt_tc", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "6f4bbf76-6638-4645-9059-0f516c0c12c2", + "label": "/shots/seq_qt_tc/sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_qt_tc", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_qt_tc", + "shot": "sh###", + "sourceResolution": false, + "task": "Generic", + "track": "{_track_}", + "uuid": "5dc397e0-1142-4a35-969d-d4c35c512f0f", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86448.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": {}, + "name": "qt_embedded_tc.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 100.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 86400.0 + } + }, + "available_image_bounds": null, + "target_url": "C:\\data\\qt_embedded_tc.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/qt_review.json b/tests/client/ayon_core/pipeline/editorial/resources/qt_review.json new file mode 100644 index 0000000000..4dabb7d58f --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/qt_review.json @@ -0,0 +1,356 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "3 jours dans les coulisses du ZEvent 2024.mp4", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 50.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "0": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "1000": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "0": { + "Value": 0.8, + "Variant Type": "Double" + }, + "1000": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/seq_qt_no_tc/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"c3d9fb4f-afdf-49e3-9733-bf80e40e0de3\", \"clip_source_resolution\": {\"width\": \"640\", \"height\": \"360\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_no_tc\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_qt_no_tc\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_qt_no_tc\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_no_tc\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5ab44838-a173-422a-8750-d5265e5a4ab5\", \"reviewTrack\": \"Video1\", \"label\": \"/shots/seq_qt_no_tc/sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"ba8e76cd-7319-449d-93b5-93fd65cf3e83\", \"creator_attributes\": {\"folderPath\": \"/shots/seq_qt_no_tc/sh010\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1051, \"clipIn\": 86477, \"clipOut\": 86527, \"clipDuration\": 50, \"sourceIn\": 0, \"sourceOut\": 50, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"Video1\", \"folderPath\": \"/shots/seq_qt_no_tc/sh010\", \"task\": \"Generic\", \"clip_variant\": \"\", \"clip_index\": \"c3d9fb4f-afdf-49e3-9733-bf80e40e0de3\", \"clip_source_resolution\": {\"width\": \"640\", \"height\": \"360\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_no_tc\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_qt_no_tc\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_qt_no_tc\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_qt_no_tc\", \"track\": \"Video1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"5ab44838-a173-422a-8750-d5265e5a4ab5\", \"reviewTrack\": \"Video1\", \"parent_instance_id\": \"ba8e76cd-7319-449d-93b5-93fd65cf3e83\", \"label\": \"/shots/seq_qt_no_tc/sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"4a1cd220-c638-4e77-855c-cebd43b5dbc3\", \"creator_attributes\": {\"parentInstance\": \"/shots/seq_qt_no_tc/sh010 shot\", \"vSyncOn\": true, \"vSyncTrack\": \"Video1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"c3d9fb4f-afdf-49e3-9733-bf80e40e0de3\", \"publish\": true}" + }, + "clip_index": "c3d9fb4f-afdf-49e3-9733-bf80e40e0de3", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "c3d9fb4f-afdf-49e3-9733-bf80e40e0de3", + "clip_source_resolution": { + "height": "360", + "pixelAspect": 1.0, + "width": "640" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/seq_qt_no_tc/sh010 shot", + "vSyncOn": true, + "vSyncTrack": "Video1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_qt_no_tc/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_qt_no_tc", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_qt_no_tc", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "4a1cd220-c638-4e77-855c-cebd43b5dbc3", + "label": "/shots/seq_qt_no_tc/sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "ba8e76cd-7319-449d-93b5-93fd65cf3e83", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_qt_no_tc", + "folder_type": "sequence" + } + ], + "productName": "plateVideo1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_qt_no_tc", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "5ab44838-a173-422a-8750-d5265e5a4ab5", + "variant": "Video1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "c3d9fb4f-afdf-49e3-9733-bf80e40e0de3", + "clip_source_resolution": { + "height": "360", + "pixelAspect": 1.0, + "width": "640" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 50, + "clipIn": 86477, + "clipOut": 86527, + "folderPath": "/shots/seq_qt_no_tc/sh010", + "fps": "from_selection", + "frameEnd": 1051, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 0, + "sourceOut": 50, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_qt_no_tc/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_qt_no_tc", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_qt_no_tc", + "shot": "sh010", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "ba8e76cd-7319-449d-93b5-93fd65cf3e83", + "label": "/shots/seq_qt_no_tc/sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_qt_no_tc", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_qt_no_tc", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "5ab44838-a173-422a-8750-d5265e5a4ab5", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 25.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": {}, + "name": "3 jours dans les coulisses du ZEvent 2024.mp4", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 30822.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "C:\\data\\movie.mp4" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py new file mode 100644 index 0000000000..3623f6129d --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py @@ -0,0 +1,180 @@ +import mock +import os +import pytest +from typing import NamedTuple + +import opentimelineio as otio + +import ayon_core.lib +from ayon_core.plugins.publish import extract_otio_review + + +_RESOURCE_DIR = os.path.join( + os.path.dirname(__file__), + "resources" +) + + +class MockInstance(): + """ Mock pyblish instance for testing purpose. + """ + def __init__(self, data: dict): + self.data = data + self.context = self + + +class CaptureFFmpegCalls(): + """ Mock calls made to ffmpeg subprocess. + """ + def __init__(self): + self.calls = [] + + def append_call(self, *args, **kwargs): + ffmpeg_args_list, = args + self.calls.append(" ".join(ffmpeg_args_list)) + return True + + def get_fmpeg_executable(self, _): + return ["/path/to/ffmpeg"] + + +def run_process(file_name: str): + """ + """ + # Get OTIO review data from serialized file_name + file_path = os.path.join(_RESOURCE_DIR, file_name) + clip = otio.schema.Clip.from_json_file(file_path) + + # Prepare dummy instance and capture call object + capture_call = CaptureFFmpegCalls() + processor = extract_otio_review.ExtractOTIOReview() + instance = MockInstance({ + "otioReviewClips": [clip], + "handleStart": 10, + "handleEnd": 10, + "workfileFrameStart": 1001, + "folderPath": "/dummy/path", + "anatomy": NamedTuple("Anatomy", [('project_name', "test_project")]) + }) + + # Mock calls to extern and run plugins. + with mock.patch.object( + extract_otio_review, + "get_ffmpeg_tool_args", + side_effect=capture_call.get_fmpeg_executable, + ): + with mock.patch.object( + extract_otio_review, + "run_subprocess", + side_effect=capture_call.append_call, + ): + with mock.patch.object( + processor, + "_get_folder_name_based_prefix", + return_value="C:/result/output." + ): + processor.process(instance) + + # return all calls made to ffmpeg subprocess + return capture_call.calls + + +def test_image_sequence_with_embedded_tc_and_handles_out_of_range(): + """ + Img sequence clip (embedded timecode 1h/24fps) + available_files = 1000-1100 + available_range = 87399-87500 24fps + source_range = 87399-87500 24fps + """ + calls = run_process("img_seq_embedded_tc_review.json") + + expected = [ + # 10 head black handles generated from gap (991-1000) + "/path/to/ffmpeg -t 0.4166666666666667 -r 24.0 -f lavfi -i " + "color=c=black:s=1280x720 -tune stillimage -start_number 991 " + "C:/result/output.%03d.jpg", + + # 10 tail black handles generated from gap (1102-1111) + "/path/to/ffmpeg -t 0.4166666666666667 -r 24.0 -f lavfi -i " + "color=c=black:s=1280x720 -tune stillimage -start_number 1102 " + "C:/result/output.%03d.jpg", + + # Report from source exr (1001-1101) with enforce framerate + "/path/to/ffmpeg -start_number 1000 -framerate 24.0 -i " + "C:\\exr_embedded_tc\\output.%04d.exr -start_number 1001 " + "C:/result/output.%03d.jpg" + ] + + assert calls == expected + + +def test_image_sequence_and_handles_out_of_range(): + """ + Img sequence clip (no timecode) + available_files = 1000-1100 + available_range = 0-101 25fps + source_range = 5-91 24fps + """ + calls = run_process("img_seq_review.json") + + expected = [ + # 5 head black frames generated from gap (991-995) + "/path/to/ffmpeg -t 0.2 -r 25.0 -f lavfi -i color=c=black:s=1280x720 -tune " + "stillimage -start_number 991 C:/result/output.%03d.jpg", + + # 9 tail back frames generated from gap (1097-1105) + "/path/to/ffmpeg -t 0.36 -r 25.0 -f lavfi -i color=c=black:s=1280x720 -tune " + "stillimage -start_number 1097 C:/result/output.%03d.jpg", + + # Report from source tiff (996-1096) + # 996-1000 = additional 5 head frames + # 1001-1095 = source range conformed to 25fps + # 1096-1096 = additional 1 tail frames + "/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i " + "C:\\tif_seq\\output.%04d.tif -start_number 996 C:/result/output.%03d.jpg" + ] + + assert calls == expected + + +def test_movie_with_embedded_tc_no_gap_handles(): + """ + Qt movie clip (embedded timecode 1h/24fps) + available_range = 86400-86500 24fps + source_range = 86414-86482 24fps + """ + calls = run_process("qt_embedded_tc_review.json") + + expected = [ + # Handles are all included in media available range. + # Extract source range from Qt + # - first_frame = 14 src - 10 (head tail) = frame 4 = 0.1666s + # - duration = 68fr (source) + 20fr (handles) = 88frames = 3.666s + "/path/to/ffmpeg -ss 0.16666666666666666 -t 3.6666666666666665 " + "-i C:\\data\\qt_embedded_tc.mov -start_number 991 " + "C:/result/output.%03d.jpg" + ] + + assert calls == expected + + +def test_movie_tail_gap_handles(): + """ + Qt movie clip (embedded timecode 1h/24fps) + available_range = 0-30822 25fps + source_range = 0-50 24fps + """ + calls = run_process("qt_review.json") + + expected = [ + # 10 head black frames generated from gap (991-1000) + "/path/to/ffmpeg -t 0.4 -r 25.0 -f lavfi -i color=c=black:s=1280x720 -tune " + "stillimage -start_number 991 C:/result/output.%03d.jpg", + + # source range + 10 tail frames + # duration = 50fr (source) + 10fr (tail handle) = 60 fr = 2.4s + "/path/to/ffmpeg -ss 0.0 -t 2.4 -i C:\\data\\movie.mp4 -start_number 1001 " + "C:/result/output.%03d.jpg" + ] + + assert calls == expected From 4b27971a8e6d292d4f06c21733dca33be40a017d Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 24 Sep 2024 17:26:37 -0400 Subject: [PATCH 171/216] Adjust comment. --- client/ayon_core/plugins/publish/extract_otio_review.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index d1ac019c3a..01cd974dad 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -320,8 +320,8 @@ class ExtractOTIOReview(publish.Extractor): avl_start = avl_range.start_time avl_duration = avl_range.duration - # A gap is required before available range - # range to conform start point. + # An additional gap is required before the available + # range to conform source start point and head handles. if start < avl_start: gap_duration = avl_start - start start = avl_start @@ -332,8 +332,9 @@ class ExtractOTIOReview(publish.Extractor): # generate used frames self._generate_used_frames(gap_duration.round().to_frames()) - # A gap is required after available range - # if media duration is shorter then clip requirement + # An additional gap is required after the available + # range to conform to source end point + tail handles + # (media duration is shorter then clip requirement). end_point = start + duration avl_end_point = avl_range.end_time_exclusive() if end_point > avl_end_point: From 885f8acd2b59748facb35b2b64b244bd4d670493 Mon Sep 17 00:00:00 2001 From: Robin De Lillo Date: Tue, 24 Sep 2024 17:33:17 -0400 Subject: [PATCH 172/216] Update client/ayon_core/pipeline/editorial.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/pipeline/editorial.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 7d6d6f5882..2dc15bd645 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -277,8 +277,8 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # to frame numbers from source sequence. media_ref = otio_clip.media_reference is_input_sequence = ( - hasattr(otio.schema, "ImageSequenceReference") and - isinstance(media_ref, otio.schema.ImageSequenceReference) + hasattr(otio.schema, "ImageSequenceReference") + and isinstance(media_ref, otio.schema.ImageSequenceReference) ) if is_input_sequence: From 453995ac5795489bd5eb7390717021c832a321b1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 25 Sep 2024 14:16:39 +0200 Subject: [PATCH 173/216] Update imageio config conversion to 0.4.5 version Adjust imageio config conversion function to handle changes in settings from 0.4.4 to 0.4.5, ensuring proper profile usage and plugin conversion consistency. --- server/settings/conversion.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index d99483d21f..634e5ab438 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -4,8 +4,8 @@ from typing import Any from .publish_plugins import DEFAULT_PUBLISH_VALUES -def _convert_imageio_configs_0_4_4(overrides): - """Imageio config settings did change to profiles since 0.4.4.""" +def _convert_imageio_configs_0_4_5(overrides): + """Imageio config settings did change to profiles since 0.4.5.""" imageio_overrides = overrides.get("imageio") or {} # make sure settings are already converted to profiles @@ -119,6 +119,6 @@ def convert_settings_overrides( overrides: dict[str, Any], ) -> dict[str, Any]: _convert_imageio_configs_0_3_1(overrides) - _convert_imageio_configs_0_4_4(overrides) + _convert_imageio_configs_0_4_5(overrides) _conver_publish_plugins(overrides) return overrides From 6085b6bd8237b7049714ecf5f03c20cfd738d086 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 25 Sep 2024 14:17:26 +0200 Subject: [PATCH 174/216] Refactor imageio settings conversion logic Simplified conditional check for ocio_config_profiles presence. --- server/settings/conversion.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 634e5ab438..3b51e46dba 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -9,9 +9,7 @@ def _convert_imageio_configs_0_4_5(overrides): imageio_overrides = overrides.get("imageio") or {} # make sure settings are already converted to profiles - if ( - "ocio_config_profiles" not in imageio_overrides - ): + if "ocio_config_profiles" not in imageio_overrides: return ocio_config_profiles = imageio_overrides["ocio_config_profiles"] From 07ea80d2d70fd611b7687eba45e8d9a3fe294405 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 25 Sep 2024 14:23:31 +0200 Subject: [PATCH 175/216] Update fallback type field names in colorspace and settings modules The commit updates the field name from "type" to "fallback_type" for consistency in the colorspace and settings modules. --- client/ayon_core/pipeline/colorspace.py | 2 +- server/settings/main.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 1e6f98f272..8c4f97ab1c 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -806,7 +806,7 @@ def _get_global_config_data( log.info("Using fallback data for ocio config path.") # in case no product was found we need to use fallback - fallback_type = fallback_data["type"] + fallback_type = fallback_data["fallback_type"] return _get_config_path_from_profile_data( fallback_data, fallback_type, template_data ) diff --git a/server/settings/main.py b/server/settings/main.py index 09c9bf0065..249bab85fd 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -85,7 +85,7 @@ def _ocio_built_in_paths(): class FallbackProductModel(BaseSettingsModel): _layout = "expanded" - type: str = SettingsField( + fallback_type: str = SettingsField( title="Fallback config type", enum_resolver=_fallback_ocio_config_profile_types, conditionalEnum=True, @@ -347,7 +347,7 @@ DEFAULT_VALUES = { "published_product": { "product_name": "", "fallback": { - "type": "builtin_path", + "fallback_type": "builtin_path", "builtin_path": "ACES 1.2", "custom_path": "" } From 6aa31e8788dbeb316b2c3efcc480675aa9386cc0 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 25 Sep 2024 14:24:52 +0200 Subject: [PATCH 176/216] fixing typo Changed function name from '_conver_publish_plugins' to '_convert_publish_plugins' for consistency and clarity. Updated the function call accordingly in 'convert_settings_overrides'. --- server/settings/conversion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 3b51e46dba..b933d5856f 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -106,7 +106,7 @@ def _convert_validate_version_0_3_3(publish_overrides): validate_version["plugin_state_profiles"] = [profile] -def _conver_publish_plugins(overrides): +def _convert_publish_plugins(overrides): if "publish" not in overrides: return _convert_validate_version_0_3_3(overrides["publish"]) @@ -118,5 +118,5 @@ def convert_settings_overrides( ) -> dict[str, Any]: _convert_imageio_configs_0_3_1(overrides) _convert_imageio_configs_0_4_5(overrides) - _conver_publish_plugins(overrides) + _convert_publish_plugins(overrides) return overrides From 2980f100400ca3951cd82c8fd6c70b346733e1fa Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 25 Sep 2024 16:06:24 +0200 Subject: [PATCH 177/216] Add client path to sys.path and run repository from code - Added client path to sys.path in conftest.py - Implemented function to run the repository from code in manage.ps1 --- tests/conftest.py | 9 +++++++++ tools/manage.ps1 | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/conftest.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000000..a3c46a9dd7 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,9 @@ +import sys +from pathlib import Path + +client_path = Path(__file__).resolve().parent.parent / "client" + +# add client path to sys.path +sys.path.append(str(client_path)) + +print(f"Added {client_path} to sys.path") diff --git a/tools/manage.ps1 b/tools/manage.ps1 index 23c52d57be..1fb57fe445 100755 --- a/tools/manage.ps1 +++ b/tools/manage.ps1 @@ -233,6 +233,13 @@ function Invoke-Codespell { & $Poetry $CodespellArgs } +function Run-From-Code { + $Poetry = "$RepoRoot\.poetry\bin\poetry.exe" + $RunArgs = @( "run") + + & $Poetry $RunArgs @arguments +} + function Write-Help { <# .SYNOPSIS @@ -248,6 +255,7 @@ function Write-Help { Write-Info -Text " ruff-check ", "Run Ruff check for the repository" -Color White, Cyan Write-Info -Text " ruff-fix ", "Run Ruff fix for the repository" -Color White, Cyan Write-Info -Text " codespell ", "Run codespell check for the repository" -Color White, Cyan + Write-Info -Text " run ", "Run the repository" -Color White, Cyan Write-Host "" } @@ -269,6 +277,9 @@ function Resolve-Function { } elseif ($FunctionName -eq "codespell") { Set-Cwd Invoke-CodeSpell + } elseif ($FunctionName -eq "run") { + Set-Cwd + Run-From-Code } else { Write-Host "Unknown function ""$FunctionName""" Write-Help From 7a83b8ec97d36ed489b3b7b1ac7e8013c287aa79 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Wed, 25 Sep 2024 13:06:28 -0400 Subject: [PATCH 178/216] Add test for tail handles only. --- .../plugins/publish/extract_otio_review.py | 4 +- .../resources/qt_handle_tail_review.json | 417 ++++++++++++++++++ .../editorial/test_extract_otio_review.py | 27 +- 3 files changed, 444 insertions(+), 4 deletions(-) create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/qt_handle_tail_review.json diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 01cd974dad..dfc028a785 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -344,12 +344,12 @@ class ExtractOTIOReview(publish.Extractor): # create gap data to disk self._render_seqment( gap=gap_duration.round().to_frames(), - end_offset=avl_duration.to_frames() + end_offset=duration.to_frames() ) # generate used frames self._generate_used_frames( gap_duration.round().to_frames(), - end_offset=avl_duration.to_frames() + end_offset=duration.to_frames() ) # return correct trimmed range diff --git a/tests/client/ayon_core/pipeline/editorial/resources/qt_handle_tail_review.json b/tests/client/ayon_core/pipeline/editorial/resources/qt_handle_tail_review.json new file mode 100644 index 0000000000..5d97628c47 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/qt_handle_tail_review.json @@ -0,0 +1,417 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "Resolve_OTIO": {} + }, + "name": "qt_no_tc_24fps.mov", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 66.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 35.0 + } + }, + "effects": [ + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Transform", + "Enabled": true, + "Name": "Transform", + "Parameters": [], + "Type": 2 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Cropping", + "Enabled": true, + "Name": "Cropping", + "Parameters": [], + "Type": 3 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Dynamic Zoom", + "Enabled": false, + "Name": "Dynamic Zoom", + "Parameters": [ + { + "Default Parameter Value": [ + 0.0, + 0.0 + ], + "Key Frames": { + "-35": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + "965": { + "Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + } + }, + "Parameter ID": "dynamicZoomCenter", + "Parameter Value": [ + 0.0, + 0.0 + ], + "Variant Type": "POINTF" + }, + { + "Default Parameter Value": 1.0, + "Key Frames": { + "-35": { + "Value": 0.8, + "Variant Type": "Double" + }, + "965": { + "Value": 1.0, + "Variant Type": "Double" + } + }, + "Parameter ID": "dynamicZoomScale", + "Parameter Value": 1.0, + "Variant Type": "Double", + "maxValue": 100.0, + "minValue": 0.01 + } + ], + "Type": 59 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Composite", + "Enabled": true, + "Name": "Composite", + "Parameters": [], + "Type": 1 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Lens Correction", + "Enabled": true, + "Name": "Lens Correction", + "Parameters": [], + "Type": 43 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Retime and Scaling", + "Enabled": true, + "Name": "Retime and Scaling", + "Parameters": [], + "Type": 22 + } + }, + "name": "", + "effect_name": "Resolve Effect" + }, + { + "OTIO_SCHEMA": "Effect.1", + "metadata": { + "Resolve_OTIO": { + "Effect Name": "Video Faders", + "Enabled": true, + "Name": "Video Faders", + "Parameters": [], + "Type": 36 + } + }, + "name": "", + "effect_name": "Resolve Effect" + } + ], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "Resolve_OTIO": { + "Keywords": [], + "Note": "{\"resolve_sub_products\": {\"io.ayon.creators.resolve.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.shot\", \"variant\": \"Main\", \"folderPath\": \"/shots/seq_native_otio_resolve/sh040\", \"task\": \"Generic\", \"clip_variant\": \"main\", \"clip_index\": \"1c8b84d2-4cf0-4528-9854-5c13a7ab64f7\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_native_otio_resolve\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_native_otio_resolve\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_native_otio_resolve\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_native_otio_resolve\", \"track\": \"Video1\", \"shot\": \"sh040\"}, \"heroTrack\": true, \"uuid\": \"6259d185-d57e-444f-b667-b5970a67a655\", \"reviewTrack\": \"Video1\", \"label\": \"/shots/seq_native_otio_resolve/sh040 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"24c94533-8ae5-490c-98cf-cd3a27183d3e\", \"creator_attributes\": {\"folderPath\": \"/shots/seq_native_otio_resolve/sh040\", \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1067, \"clipIn\": 87088, \"clipOut\": 87154, \"clipDuration\": 66, \"sourceIn\": 35, \"sourceOut\": 101, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"platemain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.resolve.plate\", \"variant\": \"main\", \"folderPath\": \"/shots/seq_native_otio_resolve/sh040\", \"task\": \"Generic\", \"clip_variant\": \"main\", \"clip_index\": \"1c8b84d2-4cf0-4528-9854-5c13a7ab64f7\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_native_otio_resolve\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_native_otio_resolve\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_native_otio_resolve\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_native_otio_resolve\", \"track\": \"Video1\", \"shot\": \"sh040\"}, \"heroTrack\": true, \"uuid\": \"6259d185-d57e-444f-b667-b5970a67a655\", \"reviewTrack\": \"Video1\", \"parent_instance_id\": \"24c94533-8ae5-490c-98cf-cd3a27183d3e\", \"label\": \"/shots/seq_native_otio_resolve/sh040 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"92adedc5-4e65-4a0a-9f09-e6522f2327d2\", \"creator_attributes\": {\"parentInstance\": \"/shots/seq_native_otio_resolve/sh040 shot\", \"vSyncOn\": true, \"vSyncTrack\": \"Video1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.resolve.audio\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"audio\", \"productName\": \"audioMain\", \"active\": false, \"creator_identifier\": \"io.ayon.creators.resolve.audio\", \"variant\": \"Main\", \"folderPath\": \"/shots/seq_native_otio_resolve/sh040\", \"task\": \"Generic\", \"clip_variant\": \"main\", \"clip_index\": \"1c8b84d2-4cf0-4528-9854-5c13a7ab64f7\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_native_otio_resolve\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/seq_native_otio_resolve\", \"sourceResolution\": true, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"seq_native_otio_resolve\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"seq_native_otio_resolve\", \"track\": \"Video1\", \"shot\": \"sh040\"}, \"heroTrack\": true, \"uuid\": \"6259d185-d57e-444f-b667-b5970a67a655\", \"reviewTrack\": \"Video1\", \"parent_instance_id\": \"24c94533-8ae5-490c-98cf-cd3a27183d3e\", \"label\": \"/shots/seq_native_otio_resolve/sh040 audio\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"f22878b9-e9d2-415f-93f7-784474d2ff2f\", \"creator_attributes\": {\"parentInstance\": \"/shots/seq_native_otio_resolve/sh040 shot\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"1c8b84d2-4cf0-4528-9854-5c13a7ab64f7\", \"publish\": true}" + }, + "clip_index": "1c8b84d2-4cf0-4528-9854-5c13a7ab64f7", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.audio": { + "active": false, + "clip_index": "1c8b84d2-4cf0-4528-9854-5c13a7ab64f7", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "main", + "creator_attributes": { + "parentInstance": "/shots/seq_native_otio_resolve/sh040 shot" + }, + "creator_identifier": "io.ayon.creators.resolve.audio", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_native_otio_resolve/sh040", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_native_otio_resolve", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_native_otio_resolve", + "shot": "sh040", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "f22878b9-e9d2-415f-93f7-784474d2ff2f", + "label": "/shots/seq_native_otio_resolve/sh040 audio", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "24c94533-8ae5-490c-98cf-cd3a27183d3e", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_native_otio_resolve", + "folder_type": "sequence" + } + ], + "productName": "audioMain", + "productType": "audio", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_native_otio_resolve", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "6259d185-d57e-444f-b667-b5970a67a655", + "variant": "Main", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "1c8b84d2-4cf0-4528-9854-5c13a7ab64f7", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "main", + "creator_attributes": { + "parentInstance": "/shots/seq_native_otio_resolve/sh040 shot", + "vSyncOn": true, + "vSyncTrack": "Video1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_native_otio_resolve/sh040", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_native_otio_resolve", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_native_otio_resolve", + "shot": "sh040", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "92adedc5-4e65-4a0a-9f09-e6522f2327d2", + "label": "/shots/seq_native_otio_resolve/sh040 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "24c94533-8ae5-490c-98cf-cd3a27183d3e", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_native_otio_resolve", + "folder_type": "sequence" + } + ], + "productName": "platemain", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_native_otio_resolve", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "6259d185-d57e-444f-b667-b5970a67a655", + "variant": "main", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "1c8b84d2-4cf0-4528-9854-5c13a7ab64f7", + "clip_source_resolution": { + "height": "1080", + "pixelAspect": 1.0, + "width": "1920" + }, + "clip_variant": "main", + "creator_attributes": { + "clipDuration": 66, + "clipIn": 87088, + "clipOut": 87154, + "folderPath": "/shots/seq_native_otio_resolve/sh040", + "fps": "from_selection", + "frameEnd": 1067, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 35, + "sourceOut": 101, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "shots", + "folderPath": "/shots/seq_native_otio_resolve/sh040", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/seq_native_otio_resolve", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "seq_native_otio_resolve", + "shot": "sh040", + "track": "Video1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "24c94533-8ae5-490c-98cf-cd3a27183d3e", + "label": "/shots/seq_native_otio_resolve/sh040 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "seq_native_otio_resolve", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video1", + "sequence": "seq_native_otio_resolve", + "shot": "sh###", + "sourceResolution": true, + "task": "Generic", + "track": "{_track_}", + "uuid": "6259d185-d57e-444f-b667-b5970a67a655", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AyonData", + "color": "GREEN", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 68.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ExternalReference.1", + "metadata": {}, + "name": "qt_no_tc_24fps.mov", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0.0 + } + }, + "available_image_bounds": null, + "target_url": "C:\\data\\qt_no_tc_24fps.mov" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py index 3623f6129d..f266a40f50 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py +++ b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py @@ -158,9 +158,9 @@ def test_movie_with_embedded_tc_no_gap_handles(): assert calls == expected -def test_movie_tail_gap_handles(): +def test_short_movie_head_gap_handles(): """ - Qt movie clip (embedded timecode 1h/24fps) + Qt movie clip. available_range = 0-30822 25fps source_range = 0-50 24fps """ @@ -178,3 +178,26 @@ def test_movie_tail_gap_handles(): ] assert calls == expected + + +def test_short_movie_tail_gap_handles(): + """ + Qt movie clip. + available_range = 0-101 24fps + source_range = 35-101 24fps + """ + calls = run_process("qt_handle_tail_review.json") + + expected = [ + # 10 tail black frames generated from gap (1067-1076) + "/path/to/ffmpeg -t 0.4166666666666667 -r 24.0 -f lavfi -i " + "color=c=black:s=1280x720 -tune stillimage -start_number 1067 " + "C:/result/output.%03d.jpg", + + # 10 head frames + source range + # duration = 10fr (head handle) + 66fr (source) = 76fr = 3.16s + "/path/to/ffmpeg -ss 1.0416666666666667 -t 3.1666666666666665 -i " + "C:\\data\\qt_no_tc_24fps.mov -start_number 991 C:/result/output.%03d.jpg" + ] + + assert calls == expected From a10f0e5968068d4c747f52669c623fd5b8c86c65 Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 25 Sep 2024 17:52:46 -0400 Subject: [PATCH 179/216] Implement linux counterpart to manage.sh --- tools/manage.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/manage.sh b/tools/manage.sh index 923953bf96..02648e3775 100755 --- a/tools/manage.sh +++ b/tools/manage.sh @@ -157,6 +157,7 @@ default_help() { echo -e " ${BWhite}ruff-check${RST} ${BCyan}Run Ruff check for the repository${RST}" echo -e " ${BWhite}ruff-fix${RST} ${BCyan}Run Ruff fix for the repository${RST}" echo -e " ${BWhite}codespell${RST} ${BCyan}Run codespell check for the repository${RST}" + echo -e " ${BWhite}run${RST} ${BCyan}Run the repository${RST}" echo "" } @@ -175,6 +176,12 @@ run_codespell () { "$POETRY_HOME/bin/poetry" run codespell } +run_command () { + echo -e "${BIGreen}>>>${RST} Running ..." + shift; # will remove first arg ("run") from the "$@" + "$POETRY_HOME/bin/poetry" run "$@" +} + main () { detect_python || return 1 @@ -207,6 +214,10 @@ main () { run_codespell || return_code=$? exit $return_code ;; + "run") + run_command "$@" || return_code=$? + exit $return_code + ;; esac if [ "$function_name" != "" ]; then From 166ac0a5f75821e9331c0cdb57169fafc7af38d3 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 25 Sep 2024 23:57:12 +0200 Subject: [PATCH 180/216] Add cinema4d to OCIO prelaunch hook --- client/ayon_core/hooks/pre_ocio_hook.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hooks/pre_ocio_hook.py b/client/ayon_core/hooks/pre_ocio_hook.py index 6c30b267bc..7406aa42cf 100644 --- a/client/ayon_core/hooks/pre_ocio_hook.py +++ b/client/ayon_core/hooks/pre_ocio_hook.py @@ -19,7 +19,8 @@ class OCIOEnvHook(PreLaunchHook): "nuke", "hiero", "resolve", - "openrv" + "openrv", + "cinema4d" } launch_types = set() From f9b962d233639067436e21bab54c9f4a5b1a6817 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 26 Sep 2024 00:07:26 +0200 Subject: [PATCH 181/216] Add `cinema4d` to `HOST_WORKFILE_EXTENSIONS` constants --- client/ayon_core/pipeline/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/pipeline/constants.py b/client/ayon_core/pipeline/constants.py index 7a08cbb3aa..88cddc6e1a 100644 --- a/client/ayon_core/pipeline/constants.py +++ b/client/ayon_core/pipeline/constants.py @@ -9,6 +9,7 @@ AVALON_INSTANCE_ID = "pyblish.avalon.instance" HOST_WORKFILE_EXTENSIONS = { "blender": [".blend"], "celaction": [".scn"], + "cinema4d": [".c4d"], "tvpaint": [".tvpp"], "fusion": [".comp"], "harmony": [".zip"], From 7d9390e9d5e3167ccca5063a3231e8381d0feff5 Mon Sep 17 00:00:00 2001 From: ReeceMulley <153881471+ReeceMulley@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:34:31 +1000 Subject: [PATCH 182/216] improved OIIO subimages handling --- client/ayon_core/lib/transcoding.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/lib/transcoding.py b/client/ayon_core/lib/transcoding.py index ead8b621b9..e9750864ac 100644 --- a/client/ayon_core/lib/transcoding.py +++ b/client/ayon_core/lib/transcoding.py @@ -1152,9 +1152,7 @@ def convert_colorspace( input_arg, input_path, # Tell oiiotool which channels should be put to top stack # (and output) - "--ch", channels_arg, - # Use first subimage - "--subimage", "0" + "--ch", channels_arg ]) if all([target_colorspace, view, display]): @@ -1168,12 +1166,12 @@ def convert_colorspace( oiio_cmd.extend(additional_command_args) if target_colorspace: - oiio_cmd.extend(["--colorconvert", + oiio_cmd.extend(["--colorconvert:subimages=0", source_colorspace, target_colorspace]) if view and display: oiio_cmd.extend(["--iscolorspace", source_colorspace]) - oiio_cmd.extend(["--ociodisplay", display, view]) + oiio_cmd.extend(["--ociodisplay:subimages=0", display, view]) oiio_cmd.extend(["-o", output_path]) From 85752510f0fe90a91e5f6a1c774264a8b788e64f Mon Sep 17 00:00:00 2001 From: Mustafa Jafar Date: Thu, 26 Sep 2024 11:57:49 +0300 Subject: [PATCH 183/216] optimize `_convert_oiio_transcode_0_4_5` Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server/settings/conversion.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 06a1c2c02b..0a345e2059 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -81,21 +81,25 @@ def _convert_oiio_transcode_0_4_5(publish_overrides): return for profile in transcode_profiles: - for output in profile["outputs"]: - transcode_type = output["transcoding_type"] + outputs = profile.get("outputs") + if outputs is None: + return + + for output in outputs : + # Already new settings + if "display" not in output and "view" not in output: + break + + # Fix 'display' -> 'display_view' in 'transcoding_type' + transcode_type = output.get("transcoding_type") if transcode_type == "display": output["transcoding_type"] = "display_view" - # Already new settings - if "display_view" in output: - continue - - output["display_view"] = {} - if output["display"]: - output["display_view"].update({"display": output["display"]}) - output.pop("display") - if output["view"]: - output["display_view"].update({"view": output["view"]}) - output.pop("view") + + # Convert 'display' and 'view' to new values + output["display_view"] = { + "display": output.pop("display", ""), + "view": output.pop("view", ""), + } def _conver_publish_plugins(overrides): From 6f2e69c3f7f24a0499a430d6f282647a672d4428 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 26 Sep 2024 12:02:39 +0300 Subject: [PATCH 184/216] fix code linting --- server/settings/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 0a345e2059..2337492ef2 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -94,7 +94,7 @@ def _convert_oiio_transcode_0_4_5(publish_overrides): transcode_type = output.get("transcoding_type") if transcode_type == "display": output["transcoding_type"] = "display_view" - + # Convert 'display' and 'view' to new values output["display_view"] = { "display": output.pop("display", ""), From fa54805d94152b92bcb3c0a7903f2a10528e6409 Mon Sep 17 00:00:00 2001 From: Mustafa Jafar Date: Thu, 26 Sep 2024 12:06:28 +0300 Subject: [PATCH 185/216] enhance a condition in `_convert_oiio_transcode_0_4_5` Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server/settings/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 2337492ef2..c855863591 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -87,7 +87,7 @@ def _convert_oiio_transcode_0_4_5(publish_overrides): for output in outputs : # Already new settings - if "display" not in output and "view" not in output: + if "display_view" in output: break # Fix 'display' -> 'display_view' in 'transcoding_type' From ceea08636bb9f951246c408b79fb51dfcd0f4e0e Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 26 Sep 2024 17:06:34 +0200 Subject: [PATCH 186/216] Add validate file saved for Cinema4D --- client/ayon_core/plugins/publish/validate_file_saved.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/validate_file_saved.py b/client/ayon_core/plugins/publish/validate_file_saved.py index d132ba8d3a..f52998cef3 100644 --- a/client/ayon_core/plugins/publish/validate_file_saved.py +++ b/client/ayon_core/plugins/publish/validate_file_saved.py @@ -36,7 +36,8 @@ class ValidateCurrentSaveFile(pyblish.api.ContextPlugin): label = "Validate File Saved" order = pyblish.api.ValidatorOrder - 0.1 - hosts = ["fusion", "houdini", "max", "maya", "nuke", "substancepainter"] + hosts = ["fusion", "houdini", "max", "maya", "nuke", "substancepainter", + "cinema4d"] actions = [SaveByVersionUpAction, ShowWorkfilesAction] def process(self, context): From f17529b0510704d29e1ae83c784f553e71060e22 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 27 Sep 2024 13:05:31 +0200 Subject: [PATCH 187/216] Make Publisher UI raised to the front when clicking `AYON > Create...` or `AYON > Publish...` in host integrations if it was already opened. --- client/ayon_core/tools/utils/host_tools.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/ayon_core/tools/utils/host_tools.py b/client/ayon_core/tools/utils/host_tools.py index 1eff746b9e..3cddb69eae 100644 --- a/client/ayon_core/tools/utils/host_tools.py +++ b/client/ayon_core/tools/utils/host_tools.py @@ -252,6 +252,9 @@ class HostToolsHelper: if tab: window.set_current_tab(tab) window.make_sure_is_visible() + window.raise_() + window.activateWindow() + window.showNormal() def get_tool_by_name(self, tool_name, parent=None, *args, **kwargs): """Show tool by it's name. From 28d30bc4ba7d9cbc95e5cde311db963d36645e66 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:11:11 +0200 Subject: [PATCH 188/216] added release trigger action --- .github/workflows/release_trigger.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/workflows/release_trigger.yml diff --git a/.github/workflows/release_trigger.yml b/.github/workflows/release_trigger.yml new file mode 100644 index 0000000000..01a3b3a682 --- /dev/null +++ b/.github/workflows/release_trigger.yml @@ -0,0 +1,12 @@ +name: 🚀 Release Trigger + +on: + workflow_dispatch: + +jobs: + call-release-trigger: + uses: ynput/ops-repo-automation/.github/workflows/release_trigger.yml@main + secrets: + token: ${{ secrets.YNPUT_BOT_TOKEN }} + email: ${{ secrets.CI_EMAIL }} + user: ${{ secrets.CI_USER }} From beee0efab3593416d261c81451ae828d104f9c13 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Mon, 30 Sep 2024 09:59:01 -0400 Subject: [PATCH 189/216] Adjust feedback from PR. --- client/ayon_core/plugins/publish/extract_otio_review.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index dfc028a785..30c6dfd424 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -113,13 +113,16 @@ class ExtractOTIOReview(publish.Extractor): # get from media reference metadata source # TODO 'openpype' prefix should be removed (added 24/09/03) # NOTE it looks like it is set only in hiero integration - for variable, key in zip(variables, keys): + res_data = {"width": self.to_width, "height": self.to_height} + for key in res_data: for meta_prefix in ("ayon.source.", "openpype.source."): meta_key = f"{meta_prefix}.{key}" - if media_metadata.get(meta_key): - variable = media_metadata[meta_key] + value = media_metadata.get(meta_key) + if value is not None: + res_data[key] = value break + self.to_width, self.to_height = res_data["width"], res_data["height"] self.log.debug("> self.to_width x self.to_height: {} x {}".format( self.to_width, self.to_height )) From 3712152cb7d5d45abad425d97e235b234f93d797 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:52:48 +0200 Subject: [PATCH 190/216] removed 'HOST_WORKFILE_EXTENSIONS' --- client/ayon_core/pipeline/__init__.py | 2 -- client/ayon_core/pipeline/constants.py | 18 ------------------ 2 files changed, 20 deletions(-) diff --git a/client/ayon_core/pipeline/__init__.py b/client/ayon_core/pipeline/__init__.py index 4fcea60d5e..8e89029e7b 100644 --- a/client/ayon_core/pipeline/__init__.py +++ b/client/ayon_core/pipeline/__init__.py @@ -3,7 +3,6 @@ from .constants import ( AVALON_INSTANCE_ID, AYON_CONTAINER_ID, AYON_INSTANCE_ID, - HOST_WORKFILE_EXTENSIONS, ) from .anatomy import Anatomy @@ -114,7 +113,6 @@ __all__ = ( "AVALON_INSTANCE_ID", "AYON_CONTAINER_ID", "AYON_INSTANCE_ID", - "HOST_WORKFILE_EXTENSIONS", # --- Anatomy --- "Anatomy", diff --git a/client/ayon_core/pipeline/constants.py b/client/ayon_core/pipeline/constants.py index 88cddc6e1a..e6156b3138 100644 --- a/client/ayon_core/pipeline/constants.py +++ b/client/ayon_core/pipeline/constants.py @@ -4,21 +4,3 @@ AYON_INSTANCE_ID = "ayon.create.instance" # Backwards compatibility AVALON_CONTAINER_ID = "pyblish.avalon.container" AVALON_INSTANCE_ID = "pyblish.avalon.instance" - -# TODO get extensions from host implementations -HOST_WORKFILE_EXTENSIONS = { - "blender": [".blend"], - "celaction": [".scn"], - "cinema4d": [".c4d"], - "tvpaint": [".tvpp"], - "fusion": [".comp"], - "harmony": [".zip"], - "houdini": [".hip", ".hiplc", ".hipnc"], - "maya": [".ma", ".mb"], - "nuke": [".nk"], - "hiero": [".hrox"], - "photoshop": [".psd", ".psb"], - "premiere": [".prproj"], - "resolve": [".drp"], - "aftereffects": [".aep"] -} From 3a75ebcc8935ae5fd0f0dd69044e9ea272296e59 Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Mon, 30 Sep 2024 15:29:57 -0400 Subject: [PATCH 191/216] Adjust manage.sh and manage.ps1 run documentation. --- tools/manage.ps1 | 2 +- tools/manage.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/manage.ps1 b/tools/manage.ps1 index 1fb57fe445..9a9a9a2eff 100755 --- a/tools/manage.ps1 +++ b/tools/manage.ps1 @@ -255,7 +255,7 @@ function Write-Help { Write-Info -Text " ruff-check ", "Run Ruff check for the repository" -Color White, Cyan Write-Info -Text " ruff-fix ", "Run Ruff fix for the repository" -Color White, Cyan Write-Info -Text " codespell ", "Run codespell check for the repository" -Color White, Cyan - Write-Info -Text " run ", "Run the repository" -Color White, Cyan + Write-Info -Text " run ", "Run a poetry command in the repository environment" -Color White, Cyan Write-Host "" } diff --git a/tools/manage.sh b/tools/manage.sh index 02648e3775..6b0a4d6978 100755 --- a/tools/manage.sh +++ b/tools/manage.sh @@ -157,7 +157,7 @@ default_help() { echo -e " ${BWhite}ruff-check${RST} ${BCyan}Run Ruff check for the repository${RST}" echo -e " ${BWhite}ruff-fix${RST} ${BCyan}Run Ruff fix for the repository${RST}" echo -e " ${BWhite}codespell${RST} ${BCyan}Run codespell check for the repository${RST}" - echo -e " ${BWhite}run${RST} ${BCyan}Run the repository${RST}" + echo -e " ${BWhite}run${RST} ${BCyan}Run a poetry command in the repository environment${RST}" echo "" } From d667f21625bdd043a3642fad5f36e7f0b6357ec0 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 1 Oct 2024 10:15:23 +0200 Subject: [PATCH 192/216] Move logic to `make_sure_is_visible` --- client/ayon_core/tools/publisher/window.py | 5 ++++- client/ayon_core/tools/utils/host_tools.py | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/publisher/window.py b/client/ayon_core/tools/publisher/window.py index a8ca605ecb..434c2ca602 100644 --- a/client/ayon_core/tools/publisher/window.py +++ b/client/ayon_core/tools/publisher/window.py @@ -439,10 +439,13 @@ class PublisherWindow(QtWidgets.QDialog): def make_sure_is_visible(self): if self._window_is_visible: self.setWindowState(QtCore.Qt.WindowActive) - else: self.show() + self.raise_() + self.activateWindow() + self.showNormal() + def showEvent(self, event): self._window_is_visible = True super().showEvent(event) diff --git a/client/ayon_core/tools/utils/host_tools.py b/client/ayon_core/tools/utils/host_tools.py index 3cddb69eae..1eff746b9e 100644 --- a/client/ayon_core/tools/utils/host_tools.py +++ b/client/ayon_core/tools/utils/host_tools.py @@ -252,9 +252,6 @@ class HostToolsHelper: if tab: window.set_current_tab(tab) window.make_sure_is_visible() - window.raise_() - window.activateWindow() - window.showNormal() def get_tool_by_name(self, tool_name, parent=None, *args, **kwargs): """Show tool by it's name. From 93793655ea2e29ade756bbc66c4087280beeecd4 Mon Sep 17 00:00:00 2001 From: Robin De Lillo Date: Tue, 1 Oct 2024 08:00:43 -0400 Subject: [PATCH 193/216] Update client/ayon_core/plugins/publish/extract_otio_review.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/publish/extract_otio_review.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 30c6dfd424..a7ef819c5d 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -107,9 +107,6 @@ class ExtractOTIOReview(publish.Extractor): otio_media = r_otio_cl.media_reference media_metadata = otio_media.metadata - variables = (self.to_width, self.to_height) - keys = ("width", "height") - # get from media reference metadata source # TODO 'openpype' prefix should be removed (added 24/09/03) # NOTE it looks like it is set only in hiero integration From d69edc69d5ce5201f9185402395374f8e58416ea Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 1 Oct 2024 17:10:41 -0400 Subject: [PATCH 194/216] Add backward-compatibility for relative source ranges. --- client/ayon_core/pipeline/editorial.py | 33 ++- .../resources/legacy_img_sequence.json | 216 ++++++++++++++++++ .../test_media_range_with_retimes.py | 20 ++ 3 files changed, 260 insertions(+), 9 deletions(-) create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/legacy_img_sequence.json diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 2dc15bd645..8d81737533 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -178,6 +178,30 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): available_range = otio_clip.available_range() available_range_rate = available_range.start_time.rate + # If media source is an image sequence, returned + # mediaIn/mediaOut have to correspond + # to frame numbers from source sequence. + media_ref = otio_clip.media_reference + is_input_sequence = ( + hasattr(otio.schema, "ImageSequenceReference") + and isinstance(media_ref, otio.schema.ImageSequenceReference) + ) + + # Temporary. + # Some AYON custom OTIO exporter were implemented with relative + # source range for image sequence. Following code maintain + # backward-compatibility by adjusting available range + # while we are updating those. + if ( + is_input_sequence + and available_range.start_time.to_frames() == media_ref.start_frame + and source_range.start_time.to_frames() < media_ref.start_frame + ): + available_range = _ot.TimeRange( + _ot.RationalTime(0, rate=available_range_rate), + available_range.duration, + ) + # Conform source range bounds to available range rate # .e.g. embedded TC of (3600 sec/ 1h), duration 100 frames # @@ -272,15 +296,6 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): media_in = available_range.start_time.value media_out = available_range.end_time_inclusive().value - # If media source is an image sequence, returned - # mediaIn/mediaOut have to correspond - # to frame numbers from source sequence. - media_ref = otio_clip.media_reference - is_input_sequence = ( - hasattr(otio.schema, "ImageSequenceReference") - and isinstance(media_ref, otio.schema.ImageSequenceReference) - ) - if is_input_sequence: # preserve discrete frame numbers media_in_trimmed = otio.opentime.RationalTime.from_frames( diff --git a/tests/client/ayon_core/pipeline/editorial/resources/legacy_img_sequence.json b/tests/client/ayon_core/pipeline/editorial/resources/legacy_img_sequence.json new file mode 100644 index 0000000000..a50ca102fe --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/legacy_img_sequence.json @@ -0,0 +1,216 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output.[1000-1100].exr", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 104.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "clip_index": "18b19490-21ea-4533-9e0c-03f434c66f14", + "publish": true, + "resolve_sub_products": { + "io.ayon.creators.resolve.plate": { + "active": true, + "clip_index": "18b19490-21ea-4533-9e0c-03f434c66f14", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "parentInstance": "/shots/sq_old_otio/sh010 shot", + "vSyncOn": true, + "vSyncTrack": "Video 1" + }, + "creator_identifier": "io.ayon.creators.resolve.plate", + "episode": "ep01", + "folder": "/shots/sq_old_otio/sh010", + "folderPath": "/shots/sq_old_otio/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq_old_otio", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq_old_otio", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "d27c5f77-7218-44ca-8061-5b6d33f96116", + "label": "/shots/sq_old_otio/sh010 plate", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parent_instance_id": "24792946-9ac4-4c8d-922f-80a83dea4be1", + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq_old_otio", + "folder_type": "sequence" + } + ], + "productName": "plateVideo_1", + "productType": "plate", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video 1", + "sequence": "sq_old_otio", + "shot": "sh###", + "sourceResolution": false, + "task": null, + "track": "{_track_}", + "uuid": "dec1a40b-7ce8-43cd-94b8-08a53056a171", + "variant": "Video_1", + "workfileFrameStart": 1001 + }, + "io.ayon.creators.resolve.shot": { + "active": true, + "clip_index": "18b19490-21ea-4533-9e0c-03f434c66f14", + "clip_source_resolution": { + "height": "720", + "pixelAspect": 1.0, + "width": "956" + }, + "clip_variant": "", + "creator_attributes": { + "clipDuration": 104, + "clipIn": 90000, + "clipOut": 90104, + "fps": "from_selection", + "frameEnd": 1105, + "frameStart": 1001, + "handleEnd": 10, + "handleStart": 10, + "sourceIn": 0, + "sourceOut": 104, + "workfileFrameStart": 1001 + }, + "creator_identifier": "io.ayon.creators.resolve.shot", + "episode": "ep01", + "folder": "/shots/sq_old_otio/sh010", + "folderPath": "/shots/sq_old_otio/sh010", + "handleEnd": 10, + "handleStart": 10, + "has_promised_context": true, + "heroTrack": true, + "hierarchy": "shots/sq_old_otio", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq_old_otio", + "shot": "sh010", + "track": "Video_1" + }, + "id": "pyblish.avalon.instance", + "instance_id": "24792946-9ac4-4c8d-922f-80a83dea4be1", + "label": "/shots/sq_old_otio/sh010 shot", + "newAssetPublishing": true, + "newHierarchyIntegration": true, + "parents": [ + { + "entity_name": "shots", + "folder_type": "folder" + }, + { + "entity_name": "sq_old_otio", + "folder_type": "sequence" + } + ], + "productName": "shotMain", + "productType": "shot", + "publish_attributes": { + "CollectSlackFamilies": { + "additional_message": "" + } + }, + "reviewTrack": "Video 1", + "sequence": "sq_old_otio", + "shot": "sh###", + "sourceResolution": false, + "task": null, + "track": "{_track_}", + "uuid": "dec1a40b-7ce8-43cd-94b8-08a53056a171", + "variant": "Main", + "workfileFrameStart": 1001 + } + } + }, + "name": "AYONData", + "color": "MINT", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 52.0 + } + }, + "comment": "" + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "height": 720, + "isSequence": true, + "padding": 4, + "pixelAspect": 1.0, + "width": 956 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\legacy\\", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py index 270b01a799..e5f0d335b5 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py +++ b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py @@ -146,3 +146,23 @@ def test_img_sequence_with_embedded_tc_and_handles(): "img_seq_embedded_tc.json", expected_data ) + + +def test_img_sequence_relative_source_range(): + """ + Img sequence clip (embedded timecode 1h) + available files = 1000-1100 + source_range = fps + """ + expected_data = { + 'mediaIn': 1000, + 'mediaOut': 1098, + 'handleStart': 0, + 'handleEnd': 2, + 'speed': 1.0 + } + + _check_expected_retimed_values( + "legacy_img_sequence.json", + expected_data + ) From 8182914f112a2790437c986a09d54b08102ce6fb Mon Sep 17 00:00:00 2001 From: "robin@ynput.io" Date: Tue, 1 Oct 2024 17:48:44 -0400 Subject: [PATCH 195/216] Fix linting. --- client/ayon_core/pipeline/editorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 8d81737533..f42c0a2fe5 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -190,7 +190,7 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # Temporary. # Some AYON custom OTIO exporter were implemented with relative # source range for image sequence. Following code maintain - # backward-compatibility by adjusting available range + # backward-compatibility by adjusting available range # while we are updating those. if ( is_input_sequence From 09b0eb9ed2e0150d9121b1e268254e8c185404c2 Mon Sep 17 00:00:00 2001 From: ReeceMulley <153881471+ReeceMulley@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:13:57 +1000 Subject: [PATCH 196/216] taskType bugfix --- .../ayon_core/tools/push_to_project/models/integrate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/push_to_project/models/integrate.py b/client/ayon_core/tools/push_to_project/models/integrate.py index 5937ffa4da..ba603699bc 100644 --- a/client/ayon_core/tools/push_to_project/models/integrate.py +++ b/client/ayon_core/tools/push_to_project/models/integrate.py @@ -777,7 +777,7 @@ class ProjectPushItemProcess: task_info = copy.deepcopy(task_info) task_info["name"] = dst_task_name # Fill rest of task information based on task type - task_type_name = task_info["type"] + task_type_name = task_info["taskType"] task_types_by_name = { task_type["name"]: task_type for task_type in self._project_entity["taskTypes"] @@ -821,7 +821,7 @@ class ProjectPushItemProcess: task_name = task_type = None if task_info: task_name = task_info["name"] - task_type = task_info["type"] + task_type = task_info["taskType"] product_name = get_product_name( self._item.dst_project_name, @@ -905,7 +905,7 @@ class ProjectPushItemProcess: project_name, self.host_name, task_name=self._task_info["name"], - task_type=self._task_info["type"], + task_type=self._task_info["taskType"], product_type=product_type, product_name=product_entity["name"] ) @@ -959,7 +959,7 @@ class ProjectPushItemProcess: formatting_data = get_template_data( self._project_entity, self._folder_entity, - self._task_info.get("name"), + self._task_info, self.host_name ) formatting_data.update({ From e299b405fc01fc6d5daac5d40a6da1b3955853c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Wed, 2 Oct 2024 10:01:33 +0200 Subject: [PATCH 197/216] Update server/settings/conversion.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server/settings/conversion.py | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index b933d5856f..aabf41f8d3 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -14,30 +14,19 @@ def _convert_imageio_configs_0_4_5(overrides): ocio_config_profiles = imageio_overrides["ocio_config_profiles"] - for inx, profile in enumerate(ocio_config_profiles): - if profile["type"] != "product_name": + for profile in ocio_config_profiles: + if profile.get("type") != "product_name": continue - - # create new profile - new_profile = { - "type": "published_product", - "published_product": { - "product_name": profile["product_name"], - "fallback": { - "type": "builtin_path", - "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", - }, + + profile["type"] = "published_product" + profile["published_product"] = { + "product_name": profile.pop("product_name"), + "fallback": { + "type": "builtin_path", + "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", }, - "host_names": profile["host_names"], - "task_names": profile["task_names"], - "task_types": profile["task_types"], - "custom_path": profile["custom_path"], - "builtin_path": profile["builtin_path"], } - # replace old profile with new profile - ocio_config_profiles[inx] = new_profile - def _convert_imageio_configs_0_3_1(overrides): """Imageio config settings did change to profiles since 0.3.1. .""" From 8b14e79629058d4c44f2ecc89f1262bb0a157825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Wed, 2 Oct 2024 10:03:28 +0200 Subject: [PATCH 198/216] Update server/settings/conversion.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server/settings/conversion.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index aabf41f8d3..315f5a2027 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -9,11 +9,10 @@ def _convert_imageio_configs_0_4_5(overrides): imageio_overrides = overrides.get("imageio") or {} # make sure settings are already converted to profiles - if "ocio_config_profiles" not in imageio_overrides: + ocio_config_profiles = imageio_overrides.get("ocio_config_profiles") + if not ocio_config_profiles: return - ocio_config_profiles = imageio_overrides["ocio_config_profiles"] - for profile in ocio_config_profiles: if profile.get("type") != "product_name": continue From 589a642d69e85d4a9b9b6364b57cfa3a4d20624b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 2 Oct 2024 10:10:57 +0200 Subject: [PATCH 199/216] Merge branch 'develop' into enhancement/AY-6198_OCIO-fallback-for-profiles-and-templated-values --- .github/workflows/release_trigger.yml | 12 +++ client/ayon_core/hooks/pre_ocio_hook.py | 3 +- client/ayon_core/lib/path_tools.py | 5 +- client/ayon_core/pipeline/__init__.py | 2 - client/ayon_core/pipeline/constants.py | 17 ---- client/ayon_core/plugins/load/delivery.py | 18 +++- .../publish/extract_color_transcode.py | 19 +++- client/ayon_core/plugins/publish/integrate.py | 7 +- .../plugins/publish/validate_file_saved.py | 3 +- client/ayon_core/tools/publisher/window.py | 5 +- server/settings/conversion.py | 35 ++++++- server/settings/publish_plugins.py | 92 ++++++++++++++++--- 12 files changed, 172 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/release_trigger.yml diff --git a/.github/workflows/release_trigger.yml b/.github/workflows/release_trigger.yml new file mode 100644 index 0000000000..01a3b3a682 --- /dev/null +++ b/.github/workflows/release_trigger.yml @@ -0,0 +1,12 @@ +name: 🚀 Release Trigger + +on: + workflow_dispatch: + +jobs: + call-release-trigger: + uses: ynput/ops-repo-automation/.github/workflows/release_trigger.yml@main + secrets: + token: ${{ secrets.YNPUT_BOT_TOKEN }} + email: ${{ secrets.CI_EMAIL }} + user: ${{ secrets.CI_USER }} diff --git a/client/ayon_core/hooks/pre_ocio_hook.py b/client/ayon_core/hooks/pre_ocio_hook.py index 6c30b267bc..7406aa42cf 100644 --- a/client/ayon_core/hooks/pre_ocio_hook.py +++ b/client/ayon_core/hooks/pre_ocio_hook.py @@ -19,7 +19,8 @@ class OCIOEnvHook(PreLaunchHook): "nuke", "hiero", "resolve", - "openrv" + "openrv", + "cinema4d" } launch_types = set() diff --git a/client/ayon_core/lib/path_tools.py b/client/ayon_core/lib/path_tools.py index a65f0f8e13..5c81fbfebf 100644 --- a/client/ayon_core/lib/path_tools.py +++ b/client/ayon_core/lib/path_tools.py @@ -81,7 +81,10 @@ def collect_frames(files): dict: {'/folder/product_v001.0001.png': '0001', ....} """ - patterns = [clique.PATTERNS["frames"]] + # clique.PATTERNS["frames"] supports only `.1001.exr` not `_1001.exr` so + # we use a customized pattern. + pattern = "[_.](?P(?P0*)\\d+)\\.\\D+\\d?$" + patterns = [pattern] collections, remainder = clique.assemble( files, minimum_items=1, patterns=patterns) diff --git a/client/ayon_core/pipeline/__init__.py b/client/ayon_core/pipeline/__init__.py index 4fcea60d5e..8e89029e7b 100644 --- a/client/ayon_core/pipeline/__init__.py +++ b/client/ayon_core/pipeline/__init__.py @@ -3,7 +3,6 @@ from .constants import ( AVALON_INSTANCE_ID, AYON_CONTAINER_ID, AYON_INSTANCE_ID, - HOST_WORKFILE_EXTENSIONS, ) from .anatomy import Anatomy @@ -114,7 +113,6 @@ __all__ = ( "AVALON_INSTANCE_ID", "AYON_CONTAINER_ID", "AYON_INSTANCE_ID", - "HOST_WORKFILE_EXTENSIONS", # --- Anatomy --- "Anatomy", diff --git a/client/ayon_core/pipeline/constants.py b/client/ayon_core/pipeline/constants.py index 7a08cbb3aa..e6156b3138 100644 --- a/client/ayon_core/pipeline/constants.py +++ b/client/ayon_core/pipeline/constants.py @@ -4,20 +4,3 @@ AYON_INSTANCE_ID = "ayon.create.instance" # Backwards compatibility AVALON_CONTAINER_ID = "pyblish.avalon.container" AVALON_INSTANCE_ID = "pyblish.avalon.instance" - -# TODO get extensions from host implementations -HOST_WORKFILE_EXTENSIONS = { - "blender": [".blend"], - "celaction": [".scn"], - "tvpaint": [".tvpp"], - "fusion": [".comp"], - "harmony": [".zip"], - "houdini": [".hip", ".hiplc", ".hipnc"], - "maya": [".ma", ".mb"], - "nuke": [".nk"], - "hiero": [".hrox"], - "photoshop": [".psd", ".psb"], - "premiere": [".prproj"], - "resolve": [".drp"], - "aftereffects": [".aep"] -} diff --git a/client/ayon_core/plugins/load/delivery.py b/client/ayon_core/plugins/load/delivery.py index 6a0947cc42..5c53d170eb 100644 --- a/client/ayon_core/plugins/load/delivery.py +++ b/client/ayon_core/plugins/load/delivery.py @@ -230,6 +230,11 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): self.log ] + # TODO: This will currently incorrectly detect 'resources' + # that are published along with the publish, because those should + # not adhere to the template directly but are ingested in a + # customized way. For example, maya look textures or any publish + # that directly adds files into `instance.data["transfers"]` src_paths = [] for repre_file in repre["files"]: src_path = self.anatomy.fill_root(repre_file["path"]) @@ -261,7 +266,18 @@ class DeliveryOptionsDialog(QtWidgets.QDialog): frame = dst_frame if frame is not None: - anatomy_data["frame"] = frame + if repre["context"].get("frame"): + anatomy_data["frame"] = frame + elif repre["context"].get("udim"): + anatomy_data["udim"] = frame + else: + # Fallback + self.log.warning( + "Representation context has no frame or udim" + " data. Supplying sequence frame to '{frame}'" + " formatting data." + ) + anatomy_data["frame"] = frame new_report_items, uploaded = deliver_single_file(*args) report_items.update(new_report_items) self._update_progress(uploaded) diff --git a/client/ayon_core/plugins/publish/extract_color_transcode.py b/client/ayon_core/plugins/publish/extract_color_transcode.py index a28a761e7e..3e54d324e3 100644 --- a/client/ayon_core/plugins/publish/extract_color_transcode.py +++ b/client/ayon_core/plugins/publish/extract_color_transcode.py @@ -122,13 +122,22 @@ class ExtractOIIOTranscode(publish.Extractor): transcoding_type = output_def["transcoding_type"] target_colorspace = view = display = None + # NOTE: we use colorspace_data as the fallback values for + # the target colorspace. if transcoding_type == "colorspace": + # TODO: Should we fallback to the colorspace + # (which used as source above) ? + # or should we compute the target colorspace from + # current view and display ? target_colorspace = (output_def["colorspace"] or colorspace_data.get("colorspace")) - else: - view = output_def["view"] or colorspace_data.get("view") - display = (output_def["display"] or - colorspace_data.get("display")) + elif transcoding_type == "display_view": + display_view = output_def["display_view"] + view = display_view["view"] or colorspace_data.get("view") + display = ( + display_view["display"] + or colorspace_data.get("display") + ) # both could be already collected by DCC, # but could be overwritten when transcoding @@ -192,7 +201,7 @@ class ExtractOIIOTranscode(publish.Extractor): new_repre["files"] = new_repre["files"][0] # If the source representation has "review" tag, but its not - # part of the output defintion tags, then both the + # part of the output definition tags, then both the # representations will be transcoded in ExtractReview and # their outputs will clash in integration. if "review" in repre.get("tags", []): diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index d3f6c04333..e8fe09bab7 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -509,8 +509,11 @@ class IntegrateAsset(pyblish.api.InstancePlugin): if not is_sequence_representation: files = [files] - if any(os.path.isabs(fname) for fname in files): - raise KnownPublishError("Given file names contain full paths") + for fname in files: + if os.path.isabs(fname): + raise KnownPublishError( + f"Representation file names contains full paths: {fname}" + ) if not is_sequence_representation: return diff --git a/client/ayon_core/plugins/publish/validate_file_saved.py b/client/ayon_core/plugins/publish/validate_file_saved.py index d132ba8d3a..f52998cef3 100644 --- a/client/ayon_core/plugins/publish/validate_file_saved.py +++ b/client/ayon_core/plugins/publish/validate_file_saved.py @@ -36,7 +36,8 @@ class ValidateCurrentSaveFile(pyblish.api.ContextPlugin): label = "Validate File Saved" order = pyblish.api.ValidatorOrder - 0.1 - hosts = ["fusion", "houdini", "max", "maya", "nuke", "substancepainter"] + hosts = ["fusion", "houdini", "max", "maya", "nuke", "substancepainter", + "cinema4d"] actions = [SaveByVersionUpAction, ShowWorkfilesAction] def process(self, context): diff --git a/client/ayon_core/tools/publisher/window.py b/client/ayon_core/tools/publisher/window.py index a8ca605ecb..434c2ca602 100644 --- a/client/ayon_core/tools/publisher/window.py +++ b/client/ayon_core/tools/publisher/window.py @@ -439,10 +439,13 @@ class PublisherWindow(QtWidgets.QDialog): def make_sure_is_visible(self): if self._window_is_visible: self.setWindowState(QtCore.Qt.WindowActive) - else: self.show() + self.raise_() + self.activateWindow() + self.showNormal() + def showEvent(self, event): self._window_is_visible = True super().showEvent(event) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 315f5a2027..34820b5b32 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -16,7 +16,7 @@ def _convert_imageio_configs_0_4_5(overrides): for profile in ocio_config_profiles: if profile.get("type") != "product_name": continue - + profile["type"] = "published_product" profile["published_product"] = { "product_name": profile.pop("product_name"), @@ -94,10 +94,43 @@ def _convert_validate_version_0_3_3(publish_overrides): validate_version["plugin_state_profiles"] = [profile] +def _convert_oiio_transcode_0_4_5(publish_overrides): + """ExtractOIIOTranscode plugin changed in 0.4.5.""" + if "ExtractOIIOTranscode" not in publish_overrides: + return + + transcode_profiles = publish_overrides["ExtractOIIOTranscode"].get( + "profiles") + if not transcode_profiles: + return + + for profile in transcode_profiles: + outputs = profile.get("outputs") + if outputs is None: + return + + for output in outputs: + # Already new settings + if "display_view" in output: + break + + # Fix 'display' -> 'display_view' in 'transcoding_type' + transcode_type = output.get("transcoding_type") + if transcode_type == "display": + output["transcoding_type"] = "display_view" + + # Convert 'display' and 'view' to new values + output["display_view"] = { + "display": output.pop("display", ""), + "view": output.pop("view", ""), + } + + def _convert_publish_plugins(overrides): if "publish" not in overrides: return _convert_validate_version_0_3_3(overrides["publish"]) + _convert_oiio_transcode_0_4_5(overrides["publish"]) def convert_settings_overrides( diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 61972e64c4..cdcd28a9ce 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -268,13 +268,36 @@ class ExtractThumbnailModel(BaseSettingsModel): def _extract_oiio_transcoding_type(): return [ {"value": "colorspace", "label": "Use Colorspace"}, - {"value": "display", "label": "Use Display&View"} + {"value": "display_view", "label": "Use Display&View"} ] class OIIOToolArgumentsModel(BaseSettingsModel): additional_command_args: list[str] = SettingsField( - default_factory=list, title="Arguments") + default_factory=list, + title="Arguments", + description="Additional command line arguments for *oiiotool*." + ) + + +class UseDisplayViewModel(BaseSettingsModel): + _layout = "expanded" + display: str = SettingsField( + "", + title="Target Display", + description=( + "Display of the target transform. If left empty, the" + " source Display value will be used." + ) + ) + view: str = SettingsField( + "", + title="Target View", + description=( + "View of the target transform. If left empty, the" + " source View value will be used." + ) + ) class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): @@ -285,22 +308,57 @@ class ExtractOIIOTranscodeOutputModel(BaseSettingsModel): description="Output name (no space)", regex=r"[a-zA-Z0-9_]([a-zA-Z0-9_\.\-]*[a-zA-Z0-9_])?$", ) - extension: str = SettingsField("", title="Extension") + extension: str = SettingsField( + "", + title="Extension", + description=( + "Target extension. If left empty, original" + " extension is used." + ), + ) transcoding_type: str = SettingsField( "colorspace", title="Transcoding type", - enum_resolver=_extract_oiio_transcoding_type + enum_resolver=_extract_oiio_transcoding_type, + conditionalEnum=True, + description=( + "Select the transcoding type for your output, choosing either " + "*Colorspace* or *Display&View* transform." + " Only one option can be applied per output definition." + ), ) - colorspace: str = SettingsField("", title="Colorspace") - display: str = SettingsField("", title="Display") - view: str = SettingsField("", title="View") + colorspace: str = SettingsField( + "", + title="Target Colorspace", + description=( + "Choose the desired target colorspace, confirming its availability" + " in the active OCIO config. If left empty, the" + " source colorspace value will be used, resulting in no" + " colorspace conversion." + ) + ) + display_view: UseDisplayViewModel = SettingsField( + title="Use Display&View", + default_factory=UseDisplayViewModel + ) + oiiotool_args: OIIOToolArgumentsModel = SettingsField( default_factory=OIIOToolArgumentsModel, title="OIIOtool arguments") - tags: list[str] = SettingsField(default_factory=list, title="Tags") + tags: list[str] = SettingsField( + default_factory=list, + title="Tags", + description=( + "Additional tags that will be added to the created representation." + "\nAdd *review* tag to create review from the transcoded" + " representation instead of the original." + ) + ) custom_tags: list[str] = SettingsField( - default_factory=list, title="Custom Tags" + default_factory=list, + title="Custom Tags", + description="Additional custom tags that will be added to the created representation." ) @@ -328,7 +386,13 @@ class ExtractOIIOTranscodeProfileModel(BaseSettingsModel): ) delete_original: bool = SettingsField( True, - title="Delete Original Representation" + title="Delete Original Representation", + description=( + "Choose to preserve or remove the original representation.\n" + "Keep in mind that if the transcoded representation includes" + " a `review` tag, it will take precedence over" + " the original for creating reviews." + ), ) outputs: list[ExtractOIIOTranscodeOutputModel] = SettingsField( default_factory=list, @@ -371,7 +435,7 @@ class ExtractReviewFFmpegModel(BaseSettingsModel): def extract_review_filter_enum(): return [ { - "value": "everytime", + "value": "everytime", # codespell:ignore everytime "label": "Always" }, { @@ -393,7 +457,7 @@ class ExtractReviewFilterModel(BaseSettingsModel): default_factory=list, title="Custom Tags" ) single_frame_filter: str = SettingsField( - "everytime", + "everytime", # codespell:ignore everytime description=( "Use output always / only if input is 1 frame" " image / only if has 2+ frames or is video" @@ -791,7 +855,7 @@ class IntegrateHeroVersionModel(BaseSettingsModel): class CleanUpModel(BaseSettingsModel): _isGroup = True - paterns: list[str] = SettingsField( + paterns: list[str] = SettingsField( # codespell:ignore paterns default_factory=list, title="Patterns (regex)" ) @@ -1225,7 +1289,7 @@ DEFAULT_PUBLISH_VALUES = { "use_hardlinks": False }, "CleanUp": { - "paterns": [], + "paterns": [], # codespell:ignore paterns "remove_temp_renders": False }, "CleanUpFarm": { From 0b9cea926cf8d061128321708d10f395453cf18c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 2 Oct 2024 10:12:51 +0200 Subject: [PATCH 200/216] Refactor code for better readability and consistency. - Refactored code to improve readability by adjusting indentation and line breaks. - Made changes to ensure consistent formatting of the code. --- server/settings/conversion.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 04ab0f8d81..34820b5b32 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -99,7 +99,8 @@ def _convert_oiio_transcode_0_4_5(publish_overrides): if "ExtractOIIOTranscode" not in publish_overrides: return - transcode_profiles = publish_overrides["ExtractOIIOTranscode"].get("profiles") + transcode_profiles = publish_overrides["ExtractOIIOTranscode"].get( + "profiles") if not transcode_profiles: return @@ -108,7 +109,7 @@ def _convert_oiio_transcode_0_4_5(publish_overrides): if outputs is None: return - for output in outputs : + for output in outputs: # Already new settings if "display_view" in output: break From 7298ddb745e003ca8e317eae3baccab246a2ad37 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 2 Oct 2024 12:27:32 +0300 Subject: [PATCH 201/216] add note about using more accurate variable names --- .../ayon_core/pipeline/workfile/workfile_template_builder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/workfile/workfile_template_builder.py b/client/ayon_core/pipeline/workfile/workfile_template_builder.py index 17debdb2e8..4412e4489b 100644 --- a/client/ayon_core/pipeline/workfile/workfile_template_builder.py +++ b/client/ayon_core/pipeline/workfile/workfile_template_builder.py @@ -521,6 +521,9 @@ class AbstractTemplateBuilder(ABC): scene state. """ + # More accurate variable name + # - logic related to workfile creation should be moved out in future + explicit_build_requested = not workfile_creation_enabled # Get default values if not provided if ( @@ -538,7 +541,6 @@ class AbstractTemplateBuilder(ABC): # Build the template if we are explicitly requesting it or if it's # an unsaved "new file". is_new_file = not self.host.get_current_workfile() - explicit_build_requested = not workfile_creation_enabled if is_new_file or explicit_build_requested: self.log.info(f"Building the workfile template: {template_path}") self.import_template(template_path) From 05291b2fe9b46e513c0d8bdae6640e4a36ddb8a8 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 2 Oct 2024 11:51:21 +0200 Subject: [PATCH 202/216] ruff suggestions --- .../plugins/publish/extract_otio_review.py | 61 ++++++++++--------- .../editorial/test_extract_otio_review.py | 28 +++++---- 2 files changed, 46 insertions(+), 43 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 2a0b51b123..55eff782d9 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -57,13 +57,12 @@ class ExtractOTIOReview(publish.Extractor): # Not all hosts can import these modules. import opentimelineio as otio from ayon_core.pipeline.editorial import ( - otio_range_to_frame_range, make_sequence_collection, remap_range_on_file_sequence, is_clip_from_media_sequence ) - # TODO refactore from using instance variable + # TODO refactor from using instance variable self.temp_file_head = self._get_folder_name_based_prefix(instance) # TODO: convert resulting image sequence to mp4 @@ -75,8 +74,8 @@ class ExtractOTIOReview(publish.Extractor): otio_review_clips = instance.data["otioReviewClips"] # add plugin wide attributes - self.representation_files = list() - self.used_frames = list() + self.representation_files = [] + self.used_frames = [] self.workfile_start = int(instance.data.get( "workfileFrameStart", 1001)) - handle_start self.padding = len(str(self.workfile_start)) @@ -101,9 +100,7 @@ class ExtractOTIOReview(publish.Extractor): for index, r_otio_cl in enumerate(otio_review_clips): # QUESTION: what if transition on clip? - # check if resolution is the same - width = self.to_width - height = self.to_height + # check if resolution is the same as source otio_media = r_otio_cl.media_reference media_metadata = otio_media.metadata @@ -151,7 +148,7 @@ class ExtractOTIOReview(publish.Extractor): # Gap: no media, generate range based on source range else: - available_range = processing_range = None + available_range = processing_range = None self.actual_fps = src_range.duration.rate start = src_range.start_time duration = src_range.duration @@ -216,7 +213,7 @@ class ExtractOTIOReview(publish.Extractor): collection.indexes.update( [i for i in range(first, (last + 1))]) # render segment - self._render_seqment( + self._render_segment( sequence=[dirname, collection, input_fps]) # generate used frames self._generate_used_frames( @@ -230,7 +227,7 @@ class ExtractOTIOReview(publish.Extractor): dir_path, collection = collection_data # render segment - self._render_seqment( + self._render_segment( sequence=[dir_path, collection, input_fps]) # generate used frames self._generate_used_frames( @@ -252,7 +249,7 @@ class ExtractOTIOReview(publish.Extractor): duration=processing_range.duration, ) # render video file to sequence - self._render_seqment( + self._render_segment( video=[path, extract_range]) # generate used frames self._generate_used_frames( @@ -261,7 +258,7 @@ class ExtractOTIOReview(publish.Extractor): # QUESTION: what if nested track composition is in place? else: # at last process a Gap - self._render_seqment(gap=duration) + self._render_segment(gap=duration) # generate used frames self._generate_used_frames(duration) @@ -334,7 +331,6 @@ class ExtractOTIOReview(publish.Extractor): ) avl_start = avl_range.start_time - avl_duration = avl_range.duration # An additional gap is required before the available # range to conform source start point and head handles. @@ -344,7 +340,7 @@ class ExtractOTIOReview(publish.Extractor): duration -= gap_duration # create gap data to disk - self._render_seqment(gap=gap_duration.round().to_frames()) + self._render_segment(gap=gap_duration.round().to_frames()) # generate used frames self._generate_used_frames(gap_duration.round().to_frames()) @@ -358,7 +354,7 @@ class ExtractOTIOReview(publish.Extractor): duration -= gap_duration # create gap data to disk - self._render_seqment( + self._render_segment( gap=gap_duration.round().to_frames(), end_offset=duration.to_frames() ) @@ -377,10 +373,10 @@ class ExtractOTIOReview(publish.Extractor): ) ) - def _render_seqment(self, sequence=None, + def _render_segment(self, sequence=None, video=None, gap=None, end_offset=None): """ - Render seqment into image sequence frames. + Render segment into image sequence frames. Using ffmpeg to convert compatible video and image source to defined image sequence format. @@ -416,18 +412,24 @@ class ExtractOTIOReview(publish.Extractor): input_path = os.path.join(input_dir, input_file) input_extension = os.path.splitext(input_path)[-1] - # form command for rendering sequence files - # (need to explicit set the input frame range - # if case input sequence has framerate metadata - # to preserve frame range and avoid silent dropped - # frames caused by input mismatch with FFmpeg default - # rate 25.0 fps) more info refer to FFmpeg image2 demuxer - # - # Implicit - # [Input 100 frames (24fps from metadata)] -> [Demuxer video 25fps] -> [Output 98 frames, dropped 2] - # - # Explicit with "-framerate" - # [Input 100 frames (24fps from metadata)] -> [Demuxer video 24fps] -> [Output 100 frames] + """ + Form Command for Rendering Sequence Files + + To explicitly set the input frame range and preserve the frame + range, avoid silent dropped frames caused by input mismatch + with FFmpeg's default rate of 25.0 fps. For more info, + refer to the FFmpeg image2 demuxer. + + Implicit: + - Input: 100 frames (24fps from metadata) + - Demuxer: video 25fps + - Output: 98 frames, dropped 2 + + Explicit with "-framerate": + - Input: 100 frames (24fps from metadata) + - Demuxer: video 24fps + - Output: 100 frames, no dropped frames + """ command.extend([ "-start_number", str(in_frame_start), @@ -566,4 +568,3 @@ class ExtractOTIOReview(publish.Extractor): self.log.debug(f"file_prefix::{file_prefix}") return file_prefix - diff --git a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py index f266a40f50..0a38301755 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py +++ b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py @@ -1,11 +1,10 @@ import mock import os -import pytest +import pytest # noqa from typing import NamedTuple import opentimelineio as otio -import ayon_core.lib from ayon_core.plugins.publish import extract_otio_review @@ -19,7 +18,7 @@ class MockInstance(): """ Mock pyblish instance for testing purpose. """ def __init__(self, data: dict): - self.data = data + self.data = data self.context = self @@ -34,7 +33,7 @@ class CaptureFFmpegCalls(): self.calls.append(" ".join(ffmpeg_args_list)) return True - def get_fmpeg_executable(self, _): + def get_ffmpeg_executable(self, _): return ["/path/to/ffmpeg"] @@ -48,20 +47,23 @@ def run_process(file_name: str): # Prepare dummy instance and capture call object capture_call = CaptureFFmpegCalls() processor = extract_otio_review.ExtractOTIOReview() - instance = MockInstance({ - "otioReviewClips": [clip], - "handleStart": 10, - "handleEnd": 10, - "workfileFrameStart": 1001, - "folderPath": "/dummy/path", - "anatomy": NamedTuple("Anatomy", [('project_name', "test_project")]) - }) + Anatomy = NamedTuple("Anatomy", [("project_name")]) + instance = MockInstance( + { + "otioReviewClips": [clip], + "handleStart": 10, + "handleEnd": 10, + "workfileFrameStart": 1001, + "folderPath": "/dummy/path", + "anatomy": Anatomy("test_project"), + } + ) # Mock calls to extern and run plugins. with mock.patch.object( extract_otio_review, "get_ffmpeg_tool_args", - side_effect=capture_call.get_fmpeg_executable, + side_effect=capture_call.get_ffmpeg_executable, ): with mock.patch.object( extract_otio_review, From 7bd382a1874eb22b822790a6461e39d1399956d3 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 2 Oct 2024 11:57:38 +0200 Subject: [PATCH 203/216] Refactor Anatomy NamedTuple for project_name\nUpdate Anatomy NamedTuple to specify project_name as string type. This change ensures consistency and clarity in the codebase. --- .../ayon_core/pipeline/editorial/test_extract_otio_review.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py index 0a38301755..7bc1a750d7 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py +++ b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py @@ -47,7 +47,7 @@ def run_process(file_name: str): # Prepare dummy instance and capture call object capture_call = CaptureFFmpegCalls() processor = extract_otio_review.ExtractOTIOReview() - Anatomy = NamedTuple("Anatomy", [("project_name")]) + Anatomy = NamedTuple("Anatomy", project_name=str) instance = MockInstance( { "otioReviewClips": [clip], From db41e53511870112df72631ad5123566ca04e943 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:40:01 +0200 Subject: [PATCH 204/216] updated create package script --- create_package.py | 514 +++++++++++++++++++++++++++++----------------- 1 file changed, 326 insertions(+), 188 deletions(-) diff --git a/create_package.py b/create_package.py index 48952c43c5..843e993de1 100644 --- a/create_package.py +++ b/create_package.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + """Prepares server package from addon repo to upload to server. Requires Python 3.9. (Or at least 3.8+). @@ -22,32 +24,39 @@ client side code zipped in `private` subfolder. import os import sys import re +import io import shutil -import argparse import platform +import argparse import logging import collections import zipfile -import hashlib +import subprocess +from typing import Optional, Iterable, Pattern, Union, List, Tuple -from typing import Optional +import package -CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) -PACKAGE_PATH = os.path.join(CURRENT_DIR, "package.py") -package_content = {} -with open(PACKAGE_PATH, "r") as stream: - exec(stream.read(), package_content) +FileMapping = Tuple[Union[str, io.BytesIO], str] +ADDON_NAME: str = package.name +ADDON_VERSION: str = package.version +ADDON_CLIENT_DIR: Union[str, None] = getattr(package, "client_dir", None) -ADDON_VERSION = package_content["version"] -ADDON_NAME = package_content["name"] -ADDON_CLIENT_DIR = package_content["client_dir"] -CLIENT_VERSION_CONTENT = '''# -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" -__version__ = "{}" +CURRENT_ROOT: str = os.path.dirname(os.path.abspath(__file__)) +SERVER_ROOT: str = os.path.join(CURRENT_ROOT, "server") +FRONTEND_ROOT: str = os.path.join(CURRENT_ROOT, "frontend") +FRONTEND_DIST_ROOT: str = os.path.join(FRONTEND_ROOT, "dist") +DST_DIST_DIR: str = os.path.join("frontend", "dist") +PRIVATE_ROOT: str = os.path.join(CURRENT_ROOT, "private") +PUBLIC_ROOT: str = os.path.join(CURRENT_ROOT, "public") +CLIENT_ROOT: str = os.path.join(CURRENT_ROOT, "client") + +VERSION_PY_CONTENT = f'''# -*- coding: utf-8 -*- +"""Package declaring AYON addon '{ADDON_NAME}' version.""" +__version__ = "{ADDON_VERSION}" ''' # Patterns of directories to be skipped for server part of addon -IGNORE_DIR_PATTERNS = [ +IGNORE_DIR_PATTERNS: List[Pattern] = [ re.compile(pattern) for pattern in { # Skip directories starting with '.' @@ -58,7 +67,7 @@ IGNORE_DIR_PATTERNS = [ ] # Patterns of files to be skipped for server part of addon -IGNORE_FILE_PATTERNS = [ +IGNORE_FILE_PATTERNS: List[Pattern] = [ re.compile(pattern) for pattern in { # Skip files starting with '.' @@ -70,15 +79,6 @@ IGNORE_FILE_PATTERNS = [ ] -def calculate_file_checksum(filepath, hash_algorithm, chunk_size=10000): - func = getattr(hashlib, hash_algorithm) - hash_obj = func() - with open(filepath, "rb") as f: - for chunk in iter(lambda: f.read(chunk_size), b""): - hash_obj.update(chunk) - return hash_obj.hexdigest() - - class ZipFileLongPaths(zipfile.ZipFile): """Allows longer paths in zip files. @@ -97,12 +97,28 @@ class ZipFileLongPaths(zipfile.ZipFile): else: tpath = "\\\\?\\" + tpath - return super(ZipFileLongPaths, self)._extract_member( - member, tpath, pwd - ) + return super()._extract_member(member, tpath, pwd) -def safe_copy_file(src_path, dst_path): +def _get_yarn_executable() -> Union[str, None]: + cmd = "which" + if platform.system().lower() == "windows": + cmd = "where" + + for line in subprocess.check_output( + [cmd, "yarn"], encoding="utf-8" + ).splitlines(): + if not line or not os.path.exists(line): + continue + try: + subprocess.call([line, "--version"]) + return line + except OSError: + continue + return None + + +def safe_copy_file(src_path: str, dst_path: str): """Copy file and make sure destination directory exists. Ignore if destination already contains directories from source. @@ -115,210 +131,335 @@ def safe_copy_file(src_path, dst_path): if src_path == dst_path: return - dst_dir = os.path.dirname(dst_path) - try: - os.makedirs(dst_dir) - except Exception: - pass + dst_dir: str = os.path.dirname(dst_path) + os.makedirs(dst_dir, exist_ok=True) shutil.copy2(src_path, dst_path) -def _value_match_regexes(value, regexes): - for regex in regexes: - if regex.search(value): - return True - return False +def _value_match_regexes(value: str, regexes: Iterable[Pattern]) -> bool: + return any( + regex.search(value) + for regex in regexes + ) def find_files_in_subdir( - src_path, - ignore_file_patterns=None, - ignore_dir_patterns=None -): + src_path: str, + ignore_file_patterns: Optional[List[Pattern]] = None, + ignore_dir_patterns: Optional[List[Pattern]] = None +) -> List[Tuple[str, str]]: + """Find all files to copy in subdirectories of given path. + + All files that match any of the patterns in 'ignore_file_patterns' will + be skipped and any directories that match any of the patterns in + 'ignore_dir_patterns' will be skipped with all subfiles. + + Args: + src_path (str): Path to directory to search in. + ignore_file_patterns (Optional[list[Pattern]]): List of regexes + to match files to ignore. + ignore_dir_patterns (Optional[list[Pattern]]): List of regexes + to match directories to ignore. + + Returns: + list[tuple[str, str]]: List of tuples with path to file and parent + directories relative to 'src_path'. + """ + if ignore_file_patterns is None: ignore_file_patterns = IGNORE_FILE_PATTERNS if ignore_dir_patterns is None: ignore_dir_patterns = IGNORE_DIR_PATTERNS - output = [] + output: List[Tuple[str, str]] = [] + if not os.path.exists(src_path): + return output - hierarchy_queue = collections.deque() + hierarchy_queue: collections.deque = collections.deque() hierarchy_queue.append((src_path, [])) while hierarchy_queue: - item = hierarchy_queue.popleft() + item: Tuple[str, str] = hierarchy_queue.popleft() dirpath, parents = item for name in os.listdir(dirpath): - path = os.path.join(dirpath, name) + path: str = os.path.join(dirpath, name) if os.path.isfile(path): if not _value_match_regexes(name, ignore_file_patterns): - items = list(parents) + items: List[str] = list(parents) items.append(name) output.append((path, os.path.sep.join(items))) continue if not _value_match_regexes(name, ignore_dir_patterns): - items = list(parents) + items: List[str] = list(parents) items.append(name) hierarchy_queue.append((path, items)) return output -def copy_server_content(addon_output_dir, current_dir, log): +def update_client_version(logger): + """Update version in client code if version.py is present.""" + if not ADDON_CLIENT_DIR: + return + + version_path: str = os.path.join( + CLIENT_ROOT, ADDON_CLIENT_DIR, "version.py" + ) + if not os.path.exists(version_path): + logger.debug("Did not find version.py in client directory") + return + + logger.info("Updating client version") + with open(version_path, "w") as stream: + stream.write(VERSION_PY_CONTENT) + + +def update_pyproject_toml(logger): + filepath = os.path.join(CURRENT_ROOT, "pyproject.toml") + new_lines = [] + with open(filepath, "r") as stream: + version_found = False + for line in stream.readlines(): + if not version_found and line.startswith("version ="): + line = f'version = "{ADDON_VERSION}"\n' + version_found = True + + new_lines.append(line) + + with open(filepath, "w") as stream: + stream.write("".join(new_lines)) + + +def build_frontend(): + yarn_executable = _get_yarn_executable() + if yarn_executable is None: + raise RuntimeError("Yarn executable was not found.") + + subprocess.run([yarn_executable, "install"], cwd=FRONTEND_ROOT) + subprocess.run([yarn_executable, "build"], cwd=FRONTEND_ROOT) + if not os.path.exists(FRONTEND_DIST_ROOT): + raise RuntimeError( + "Frontend build failed. Did not find 'dist' folder." + ) + + +def get_client_files_mapping() -> List[Tuple[str, str]]: + """Mapping of source client code files to destination paths. + + Example output: + [ + ( + "C:/addons/MyAddon/version.py", + "my_addon/version.py" + ), + ( + "C:/addons/MyAddon/client/my_addon/__init__.py", + "my_addon/__init__.py" + ) + ] + + Returns: + list[tuple[str, str]]: List of path mappings to copy. The destination + path is relative to expected output directory. + + """ + # Add client code content to zip + client_code_dir: str = os.path.join(CLIENT_ROOT, ADDON_CLIENT_DIR) + mapping = [ + (path, os.path.join(ADDON_CLIENT_DIR, sub_path)) + for path, sub_path in find_files_in_subdir(client_code_dir) + ] + + license_path = os.path.join(CURRENT_ROOT, "LICENSE") + if os.path.exists(license_path): + mapping.append((license_path, f"{ADDON_CLIENT_DIR}/LICENSE")) + return mapping + + +def get_client_zip_content(log) -> io.BytesIO: + log.info("Preparing client code zip") + files_mapping: List[Tuple[str, str]] = get_client_files_mapping() + stream = io.BytesIO() + with ZipFileLongPaths(stream, "w", zipfile.ZIP_DEFLATED) as zipf: + for src_path, subpath in files_mapping: + zipf.write(src_path, subpath) + stream.seek(0) + return stream + + +def get_base_files_mapping() -> List[FileMapping]: + filepaths_to_copy: List[FileMapping] = [ + ( + os.path.join(CURRENT_ROOT, "package.py"), + "package.py" + ) + ] + # Add license file to package if exists + license_path = os.path.join(CURRENT_ROOT, "LICENSE") + if os.path.exists(license_path): + filepaths_to_copy.append((license_path, "LICENSE")) + + # Go through server, private and public directories and find all files + for dirpath in (SERVER_ROOT, PRIVATE_ROOT, PUBLIC_ROOT): + if not os.path.exists(dirpath): + continue + + dirname = os.path.basename(dirpath) + for src_file, subpath in find_files_in_subdir(dirpath): + dst_subpath = os.path.join(dirname, subpath) + filepaths_to_copy.append((src_file, dst_subpath)) + + if os.path.exists(FRONTEND_DIST_ROOT): + for src_file, subpath in find_files_in_subdir(FRONTEND_DIST_ROOT): + dst_subpath = os.path.join(DST_DIST_DIR, subpath) + filepaths_to_copy.append((src_file, dst_subpath)) + + pyproject_toml = os.path.join(CLIENT_ROOT, "pyproject.toml") + if os.path.exists(pyproject_toml): + filepaths_to_copy.append( + (pyproject_toml, "private/pyproject.toml") + ) + + return filepaths_to_copy + + +def copy_client_code(output_dir: str, log: logging.Logger): """Copies server side folders to 'addon_package_dir' Args: - addon_output_dir (str): package dir in addon repo dir - current_dir (str): addon repo dir + output_dir (str): Output directory path. log (logging.Logger) + """ + log.info(f"Copying client for {ADDON_NAME}-{ADDON_VERSION}") - log.info("Copying server content") + full_output_path = os.path.join( + output_dir, f"{ADDON_NAME}_{ADDON_VERSION}" + ) + if os.path.exists(full_output_path): + shutil.rmtree(full_output_path) + os.makedirs(full_output_path, exist_ok=True) - filepaths_to_copy = [] - server_dirpath = os.path.join(current_dir, "server") - - for item in find_files_in_subdir(server_dirpath): - src_path, dst_subpath = item - dst_path = os.path.join(addon_output_dir, "server", dst_subpath) - filepaths_to_copy.append((src_path, dst_path)) - - # Copy files - for src_path, dst_path in filepaths_to_copy: + for src_path, dst_subpath in get_client_files_mapping(): + dst_path = os.path.join(full_output_path, dst_subpath) safe_copy_file(src_path, dst_path) - -def _update_client_version(client_addon_dir): - """Write version.py file to 'client' directory. - - Make sure the version in client dir is the same as in package.py. - - Args: - client_addon_dir (str): Directory path of client addon. - """ - - dst_version_path = os.path.join(client_addon_dir, "version.py") - with open(dst_version_path, "w") as stream: - stream.write(CLIENT_VERSION_CONTENT.format(ADDON_VERSION)) + log.info("Client copy finished") -def zip_client_side(addon_package_dir, current_dir, log): - """Copy and zip `client` content into 'addon_package_dir'. - - Args: - addon_package_dir (str): Output package directory path. - current_dir (str): Directory path of addon source. - log (logging.Logger): Logger object. - """ - - client_dir = os.path.join(current_dir, "client") - client_addon_dir = os.path.join(client_dir, ADDON_CLIENT_DIR) - if not os.path.isdir(client_addon_dir): - raise ValueError( - f"Failed to find client directory '{client_addon_dir}'" - ) - - log.info("Preparing client code zip") - private_dir = os.path.join(addon_package_dir, "private") - - if not os.path.exists(private_dir): - os.makedirs(private_dir) - - _update_client_version(client_addon_dir) - - zip_filepath = os.path.join(os.path.join(private_dir, "client.zip")) - with ZipFileLongPaths(zip_filepath, "w", zipfile.ZIP_DEFLATED) as zipf: - # Add client code content to zip - for path, sub_path in find_files_in_subdir(client_addon_dir): - sub_path = os.path.join(ADDON_CLIENT_DIR, sub_path) - zipf.write(path, sub_path) - - shutil.copy(os.path.join(client_dir, "pyproject.toml"), private_dir) - - -def create_server_package( +def copy_addon_package( output_dir: str, - addon_output_dir: str, + files_mapping: List[FileMapping], log: logging.Logger ): - """Create server package zip file. - - The zip file can be installed to a server using UI or rest api endpoints. + """Copy client code to output directory. Args: - output_dir (str): Directory path to output zip file. - addon_output_dir (str): Directory path to addon output directory. + output_dir (str): Directory path to output client code. + files_mapping (List[FileMapping]): List of tuples with source file + and destination subpath. log (logging.Logger): Logger object. - """ - log.info("Creating server package") + """ + log.info(f"Copying package for {ADDON_NAME}-{ADDON_VERSION}") + + # Add addon name and version to output directory + addon_output_dir: str = os.path.join( + output_dir, ADDON_NAME, ADDON_VERSION + ) + if os.path.isdir(addon_output_dir): + log.info(f"Purging {addon_output_dir}") + shutil.rmtree(addon_output_dir) + + os.makedirs(addon_output_dir, exist_ok=True) + + # Copy server content + for src_file, dst_subpath in files_mapping: + dst_path: str = os.path.join(addon_output_dir, dst_subpath) + dst_dir: str = os.path.dirname(dst_path) + os.makedirs(dst_dir, exist_ok=True) + if isinstance(src_file, io.BytesIO): + with open(dst_path, "wb") as stream: + stream.write(src_file.getvalue()) + else: + safe_copy_file(src_file, dst_path) + + log.info("Package copy finished") + + +def create_addon_package( + output_dir: str, + files_mapping: List[FileMapping], + log: logging.Logger +): + log.info(f"Creating package for {ADDON_NAME}-{ADDON_VERSION}") + + os.makedirs(output_dir, exist_ok=True) output_path = os.path.join( output_dir, f"{ADDON_NAME}-{ADDON_VERSION}.zip" ) + with ZipFileLongPaths(output_path, "w", zipfile.ZIP_DEFLATED) as zipf: - # Move addon content to zip into 'addon' directory - addon_output_dir_offset = len(addon_output_dir) + 1 - for root, _, filenames in os.walk(addon_output_dir): - if not filenames: - continue + # Copy server content + for src_file, dst_subpath in files_mapping: + if isinstance(src_file, io.BytesIO): + zipf.writestr(dst_subpath, src_file.getvalue()) + else: + zipf.write(src_file, dst_subpath) - dst_root = None - if root != addon_output_dir: - dst_root = root[addon_output_dir_offset:] - for filename in filenames: - src_path = os.path.join(root, filename) - dst_path = filename - if dst_root: - dst_path = os.path.join(dst_root, dst_path) - zipf.write(src_path, dst_path) - - log.info(f"Output package can be found: {output_path}") + log.info("Package created") def main( - output_dir: Optional[str]=None, - skip_zip: bool=False, - keep_sources: bool=False, - clear_output_dir: bool=False + output_dir: Optional[str] = None, + skip_zip: Optional[bool] = False, + only_client: Optional[bool] = False ): - log = logging.getLogger("create_package") - log.info("Start creating package") + log: logging.Logger = logging.getLogger("create_package") + log.info("Package creation started") - current_dir = os.path.dirname(os.path.abspath(__file__)) if not output_dir: - output_dir = os.path.join(current_dir, "package") + output_dir = os.path.join(CURRENT_ROOT, "package") + has_client_code = bool(ADDON_CLIENT_DIR) + if has_client_code: + client_dir: str = os.path.join(CLIENT_ROOT, ADDON_CLIENT_DIR) + if not os.path.exists(client_dir): + raise RuntimeError( + f"Client directory was not found '{client_dir}'." + " Please check 'client_dir' in 'package.py'." + ) + update_client_version(log) - new_created_version_dir = os.path.join( - output_dir, ADDON_NAME, ADDON_VERSION - ) + update_pyproject_toml(log) - if os.path.isdir(new_created_version_dir) and clear_output_dir: - log.info(f"Purging {new_created_version_dir}") - shutil.rmtree(output_dir) + if only_client: + if not has_client_code: + raise RuntimeError("Client code is not available. Skipping") + + copy_client_code(output_dir, log) + return log.info(f"Preparing package for {ADDON_NAME}-{ADDON_VERSION}") - addon_output_root = os.path.join(output_dir, ADDON_NAME) - addon_output_dir = os.path.join(addon_output_root, ADDON_VERSION) - if not os.path.exists(addon_output_dir): - os.makedirs(addon_output_dir) + if os.path.exists(FRONTEND_ROOT): + build_frontend() - copy_server_content(addon_output_dir, current_dir, log) - safe_copy_file( - PACKAGE_PATH, - os.path.join(addon_output_dir, os.path.basename(PACKAGE_PATH)) - ) - zip_client_side(addon_output_dir, current_dir, log) + files_mapping: List[FileMapping] = [] + files_mapping.extend(get_base_files_mapping()) + + if has_client_code: + files_mapping.append( + (get_client_zip_content(log), "private/client.zip") + ) # Skip server zipping - if not skip_zip: - create_server_package(output_dir, addon_output_dir, log) - # Remove sources only if zip file is created - if not keep_sources: - log.info("Removing source files for server package") - shutil.rmtree(addon_output_root) + if skip_zip: + copy_addon_package(output_dir, files_mapping, log) + else: + create_addon_package(output_dir, files_mapping, log) + log.info("Package creation finished") @@ -333,23 +474,6 @@ if __name__ == "__main__": " server folder structure." ) ) - parser.add_argument( - "--keep-sources", - dest="keep_sources", - action="store_true", - help=( - "Keep folder structure when server package is created." - ) - ) - parser.add_argument( - "-c", "--clear-output-dir", - dest="clear_output_dir", - action="store_true", - help=( - "Clear output directory before package creation." - ) - ) - parser.add_argument( "-o", "--output", dest="output_dir", @@ -359,11 +483,25 @@ if __name__ == "__main__": " (Will be purged if already exists!)" ) ) + parser.add_argument( + "--only-client", + dest="only_client", + action="store_true", + help=( + "Extract only client code. This is useful for development." + " Requires '-o', '--output' argument to be filled." + ) + ) + parser.add_argument( + "--debug", + dest="debug", + action="store_true", + help="Debug log messages." + ) args = parser.parse_args(sys.argv[1:]) - main( - args.output_dir, - args.skip_zip, - args.keep_sources, - args.clear_output_dir - ) + level = logging.INFO + if args.debug: + level = logging.DEBUG + logging.basicConfig(level=level) + main(args.output_dir, args.skip_zip, args.only_client) From ba002d56377a5c221c80bb91fd515bade2c87dbf Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:40:13 +0200 Subject: [PATCH 205/216] bump version to '1.0.0' --- client/ayon_core/version.py | 2 +- package.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index 3ee3c976b9..0b6322645f 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON core addon version.""" -__version__ = "0.4.5-dev.1" +__version__ = "1.0.0" diff --git a/package.py b/package.py index 26c004ae84..b06959d5cf 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "0.4.5-dev.1" +version = "1.0.0" client_dir = "ayon_core" diff --git a/pyproject.toml b/pyproject.toml index db98ee4eba..091cdc273d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ [tool.poetry] name = "ayon-core" -version = "0.4.3-dev.1" +version = "1.0.0" description = "" authors = ["Ynput Team "] readme = "README.md" From 10ffb37518349101598a23399878c8a86957fd5e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:41:27 +0200 Subject: [PATCH 206/216] bump version to '1.0.0+dev' --- client/ayon_core/version.py | 4 ++-- package.py | 2 +- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index 0b6322645f..75116c703e 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" -__version__ = "1.0.0" +"""Package declaring AYON addon 'core' version.""" +__version__ = "1.0.0+dev" diff --git a/package.py b/package.py index b06959d5cf..1466031daa 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "1.0.0" +version = "1.0.0+dev" client_dir = "ayon_core" diff --git a/pyproject.toml b/pyproject.toml index 091cdc273d..4a63529c67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ [tool.poetry] name = "ayon-core" -version = "1.0.0" +version = "1.0.0+dev" description = "" authors = ["Ynput Team "] readme = "README.md" From a834e2c6639c22e617caa6cab0cb4dd3ee9f74f4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 2 Oct 2024 12:43:29 +0000 Subject: [PATCH 207/216] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e6badf936a..54f5d68b98 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,6 +1,6 @@ name: Bug Report description: File a bug report -title: 'Your issue title here' +title: Your issue title here labels: - 'type: bug' body: @@ -36,6 +36,16 @@ body: description: What version are you running? Look to AYON Tray options: - 1.0.0 + - 0.4.4 + - 0.4.3 + - 0.4.2 + - 0.4.1 + - 0.4.0 + - 0.3.2 + - 0.3.1 + - 0.3.0 + - 0.2.1 + - 0.2.0 validations: required: true - type: dropdown From 41302936c26156b36627a43a413bd1b95cecd511 Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 2 Oct 2024 11:06:29 -0400 Subject: [PATCH 208/216] Fix multiple review clips in OTIO review plugins with tests. --- .../plugins/publish/extract_otio_review.py | 61 +- .../resources/multiple_review_clips.json | 1511 +++++++++++++++++ .../resources/multiple_review_clips_gap.json | 289 ++++ .../editorial/test_extract_otio_review.py | 153 +- 4 files changed, 1969 insertions(+), 45 deletions(-) create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips.json create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips_gap.json diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 55eff782d9..00a90df695 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -100,30 +100,30 @@ class ExtractOTIOReview(publish.Extractor): for index, r_otio_cl in enumerate(otio_review_clips): # QUESTION: what if transition on clip? - # check if resolution is the same as source - otio_media = r_otio_cl.media_reference - media_metadata = otio_media.metadata - - # get from media reference metadata source - # TODO 'openpype' prefix should be removed (added 24/09/03) - # NOTE it looks like it is set only in hiero integration - res_data = {"width": self.to_width, "height": self.to_height} - for key in res_data: - for meta_prefix in ("ayon.source.", "openpype.source."): - meta_key = f"{meta_prefix}.{key}" - value = media_metadata.get(meta_key) - if value is not None: - res_data[key] = value - break - - self.to_width, self.to_height = res_data["width"], res_data["height"] - self.log.debug("> self.to_width x self.to_height: {} x {}".format( - self.to_width, self.to_height - )) - # Clip: compute process range from available media range. src_range = r_otio_cl.source_range if isinstance(r_otio_cl, otio.schema.Clip): + # check if resolution is the same as source + media_ref = r_otio_cl.media_reference + media_metadata = media_ref.metadata + + # get from media reference metadata source + # TODO 'openpype' prefix should be removed (added 24/09/03) + # NOTE it looks like it is set only in hiero integration + res_data = {"width": self.to_width, "height": self.to_height} + for key in res_data: + for meta_prefix in ("ayon.source.", "openpype.source."): + meta_key = f"{meta_prefix}.{key}" + value = media_metadata.get(meta_key) + if value is not None: + res_data[key] = value + break + + self.to_width, self.to_height = res_data["width"], res_data["height"] + self.log.debug("> self.to_width x self.to_height: {} x {}".format( + self.to_width, self.to_height + )) + available_range = r_otio_cl.available_range() processing_range = None self.actual_fps = available_range.duration.rate @@ -135,7 +135,6 @@ class ExtractOTIOReview(publish.Extractor): # source range for image sequence. Following code maintain # backward-compatibility by adjusting available range # while we are updating those. - media_ref = r_otio_cl.media_reference if ( is_clip_from_media_sequence(r_otio_cl) and available_range.start_time.to_frames() == media_ref.start_frame @@ -154,11 +153,11 @@ class ExtractOTIOReview(publish.Extractor): duration = src_range.duration # Create handle offsets. - handle_start = otio.opentime.RationalTime( + clip_handle_start = otio.opentime.RationalTime( handle_start, rate=self.actual_fps, ) - handle_end = otio.opentime.RationalTime( + clip_handle_end = otio.opentime.RationalTime( handle_end, rate=self.actual_fps, ) @@ -166,16 +165,16 @@ class ExtractOTIOReview(publish.Extractor): # reframing handles conditions if (len(otio_review_clips) > 1) and (index == 0): # more clips | first clip reframing with handle - start -= handle_start - duration += handle_start + start -= clip_handle_start + duration += clip_handle_start elif len(otio_review_clips) > 1 \ and (index == len(otio_review_clips) - 1): # more clips | last clip reframing with handle - duration += handle_end + duration += clip_handle_end elif len(otio_review_clips) == 1: # one clip | add both handles - start -= handle_start - duration += (handle_start + handle_end) + start -= clip_handle_start + duration += (clip_handle_start + clip_handle_end) if available_range: processing_range = self._trim_available_range( @@ -258,9 +257,9 @@ class ExtractOTIOReview(publish.Extractor): # QUESTION: what if nested track composition is in place? else: # at last process a Gap - self._render_segment(gap=duration) + self._render_segment(gap=duration.to_frames()) # generate used frames - self._generate_used_frames(duration) + self._generate_used_frames(duration.to_frames()) # creating and registering representation representation = self._create_representation(start, duration) diff --git a/tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips.json b/tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips.json new file mode 100644 index 0000000000..dcf60abb7d --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips.json @@ -0,0 +1,1511 @@ +{ + "OTIO_SCHEMA": "Track.1", + "metadata": {}, + "name": "review", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "scene_linear", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.exr 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "24", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Float16) Open Color IO space: 7", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.exr 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "87399", + "foundry.source.umid": "bbfe0c90-5b76-424a-6351-4dac36a8dde7", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "scene_linear", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "24", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAAFAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAAAAAAC2VkZ2VfcGl4ZWxzAAAABWludDMyAAAAAAAAABFpZ25vcmVfcGFydF9uYW1lcwAAAARib29sAAAAAAhub3ByZWZpeAAAAARib29sAAAAAB5vZmZzZXRfbmVnYXRpdmVfZGlzcGxheV93aW5kb3cAAAAEYm9vbAE=", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.exr.channels": "B:{1 0 1 1},G:{1 0 1 1},R:{1 0 1 1}", + "media.exr.compression": "2", + "media.exr.compressionName": "Zip (1 scanline)", + "media.exr.dataWindow": "1,1,1918,1078", + "media.exr.displayWindow": "0,0,1919,1079", + "media.exr.lineOrder": "0", + "media.exr.nuke.input.frame_rate": "24", + "media.exr.nuke.input.timecode": "01:00:41:15", + "media.exr.pixelAspectRatio": "1", + "media.exr.screenWindowCenter": "0,0", + "media.exr.screenWindowWidth": "1", + "media.exr.type": "scanlineimage", + "media.exr.version": "1", + "media.input.bitsperchannel": "16-bit half float", + "media.input.ctime": "2024-09-23 08:37:23", + "media.input.filereader": "exr", + "media.input.filesize": "1095868", + "media.input.frame": "1", + "media.input.frame_rate": "24", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:37:23", + "media.input.timecode": "01:00:41:15", + "media.input.width": "1920", + "media.nuke.full_layer_names": "0", + "media.nuke.node_hash": "9b", + "media.nuke.version": "15.1v2", + "openpype.source.colourtransform": "scene_linear", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\with_tc", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "scene_linear", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.exr 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "24", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Float16) Open Color IO space: 7", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.exr 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "87399", + "foundry.source.umid": "bbfe0c90-5b76-424a-6351-4dac36a8dde7", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "scene_linear", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "24", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAAFAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAAAAAAC2VkZ2VfcGl4ZWxzAAAABWludDMyAAAAAAAAABFpZ25vcmVfcGFydF9uYW1lcwAAAARib29sAAAAAAhub3ByZWZpeAAAAARib29sAAAAAB5vZmZzZXRfbmVnYXRpdmVfZGlzcGxheV93aW5kb3cAAAAEYm9vbAE=", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.exr.channels": "B:{1 0 1 1},G:{1 0 1 1},R:{1 0 1 1}", + "media.exr.compression": "2", + "media.exr.compressionName": "Zip (1 scanline)", + "media.exr.dataWindow": "1,1,1918,1078", + "media.exr.displayWindow": "0,0,1919,1079", + "media.exr.lineOrder": "0", + "media.exr.nuke.input.frame_rate": "24", + "media.exr.nuke.input.timecode": "01:00:41:15", + "media.exr.pixelAspectRatio": "1", + "media.exr.screenWindowCenter": "0,0", + "media.exr.screenWindowWidth": "1", + "media.exr.type": "scanlineimage", + "media.exr.version": "1", + "media.input.bitsperchannel": "16-bit half float", + "media.input.ctime": "2024-09-23 08:37:23", + "media.input.filereader": "exr", + "media.input.filesize": "1095868", + "media.input.frame": "1", + "media.input.frame_rate": "24", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:37:23", + "media.input.timecode": "01:00:41:15", + "media.input.width": "1920", + "media.nuke.full_layer_names": "0", + "media.nuke.node_hash": "9b", + "media.nuke.version": "15.1v2", + "openpype.source.colourtransform": "scene_linear", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\with_tc", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 31.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "matte_paint", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.tif 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "25", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Int8) Open Color IO space: 5", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.tif 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "1000", + "foundry.source.umid": "918126ef-7109-4835-492e-67d31cd7f798", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "matte_paint", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "25", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAABAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAA", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.input.bitsperchannel": "8-bit fixed", + "media.input.ctime": "2024-09-23 08:36:04", + "media.input.filereader": "tiff", + "media.input.filesize": "784446", + "media.input.frame": "1", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:36:04", + "media.input.width": "1920", + "media.tiff.resolution_unit": "1", + "media.tiff.xresolution": "72", + "media.tiff.yresolution": "72", + "openpype.source.colourtransform": "matte_paint", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 25.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\no_tc", + "name_prefix": "output.", + "name_suffix": ".tif", + "start_frame": 1000, + "frame_step": 1, + "rate": 25.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Video" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips_gap.json b/tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips_gap.json new file mode 100644 index 0000000000..85667a00dc --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/multiple_review_clips_gap.json @@ -0,0 +1,289 @@ +{ + "OTIO_SCHEMA": "Track.1", + "metadata": {}, + "name": "Video 2", + "source_range": null, + "effects": [], + "markers": [], + "enabled": true, + "children": [ + { + "OTIO_SCHEMA": "Gap.1", + "metadata": {}, + "name": "", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 2.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 88.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default ()", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "scene_linear", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.exr 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "24", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Float16) Open Color IO space: 7", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.exr 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "87399", + "foundry.source.umid": "bbfe0c90-5b76-424a-6351-4dac36a8dde7", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "scene_linear", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "24", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAAFAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAAAAAAC2VkZ2VfcGl4ZWxzAAAABWludDMyAAAAAAAAABFpZ25vcmVfcGFydF9uYW1lcwAAAARib29sAAAAAAhub3ByZWZpeAAAAARib29sAAAAAB5vZmZzZXRfbmVnYXRpdmVfZGlzcGxheV93aW5kb3cAAAAEYm9vbAE=", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.exr.channels": "B:{1 0 1 1},G:{1 0 1 1},R:{1 0 1 1}", + "media.exr.compression": "2", + "media.exr.compressionName": "Zip (1 scanline)", + "media.exr.dataWindow": "1,1,1918,1078", + "media.exr.displayWindow": "0,0,1919,1079", + "media.exr.lineOrder": "0", + "media.exr.nuke.input.frame_rate": "24", + "media.exr.nuke.input.timecode": "01:00:41:15", + "media.exr.pixelAspectRatio": "1", + "media.exr.screenWindowCenter": "0,0", + "media.exr.screenWindowWidth": "1", + "media.exr.type": "scanlineimage", + "media.exr.version": "1", + "media.input.bitsperchannel": "16-bit half float", + "media.input.ctime": "2024-09-23 08:37:23", + "media.input.filereader": "exr", + "media.input.filesize": "1095868", + "media.input.frame": "1", + "media.input.frame_rate": "24", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:37:23", + "media.input.timecode": "01:00:41:15", + "media.input.width": "1920", + "media.nuke.full_layer_names": "0", + "media.nuke.node_hash": "9b", + "media.nuke.version": "15.1v2", + "openpype.source.colourtransform": "scene_linear", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\with_tc", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + }, + { + "OTIO_SCHEMA": "Clip.2", + "metadata": {}, + "name": "output", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 11.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 0.0 + } + }, + "effects": [], + "markers": [], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default ()", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "scene_linear", + "foundry.source.duration": "101", + "foundry.source.filename": "output.%04d.exr 1000-1100", + "foundry.source.filesize": "", + "foundry.source.fragments": "101", + "foundry.source.framerate": "24", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Float16) Open Color IO space: 7", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "output.%04d.exr 1000-1100", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "1000", + "foundry.source.timecode": "87399", + "foundry.source.umid": "bbfe0c90-5b76-424a-6351-4dac36a8dde7", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "scene_linear", + "foundry.timeline.duration": "101", + "foundry.timeline.framerate": "24", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAAFAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAAAAAAC2VkZ2VfcGl4ZWxzAAAABWludDMyAAAAAAAAABFpZ25vcmVfcGFydF9uYW1lcwAAAARib29sAAAAAAhub3ByZWZpeAAAAARib29sAAAAAB5vZmZzZXRfbmVnYXRpdmVfZGlzcGxheV93aW5kb3cAAAAEYm9vbAE=", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.exr.channels": "B:{1 0 1 1},G:{1 0 1 1},R:{1 0 1 1}", + "media.exr.compression": "2", + "media.exr.compressionName": "Zip (1 scanline)", + "media.exr.dataWindow": "1,1,1918,1078", + "media.exr.displayWindow": "0,0,1919,1079", + "media.exr.lineOrder": "0", + "media.exr.nuke.input.frame_rate": "24", + "media.exr.nuke.input.timecode": "01:00:41:15", + "media.exr.pixelAspectRatio": "1", + "media.exr.screenWindowCenter": "0,0", + "media.exr.screenWindowWidth": "1", + "media.exr.type": "scanlineimage", + "media.exr.version": "1", + "media.input.bitsperchannel": "16-bit half float", + "media.input.ctime": "2024-09-23 08:37:23", + "media.input.filereader": "exr", + "media.input.filesize": "1095868", + "media.input.frame": "1", + "media.input.frame_rate": "24", + "media.input.height": "1080", + "media.input.mtime": "2024-09-23 08:37:23", + "media.input.timecode": "01:00:41:15", + "media.input.width": "1920", + "media.nuke.full_layer_names": "0", + "media.nuke.node_hash": "9b", + "media.nuke.version": "15.1v2", + "openpype.source.colourtransform": "scene_linear", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 101.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 24.0, + "value": 1000.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:\\with_tc", + "name_prefix": "output.", + "name_suffix": ".exr", + "start_frame": 1000, + "frame_step": 1, + "rate": 24.0, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" + } + ], + "kind": "Video" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py index 7bc1a750d7..25d689e7c1 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py +++ b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py @@ -37,27 +37,31 @@ class CaptureFFmpegCalls(): return ["/path/to/ffmpeg"] -def run_process(file_name: str): +def run_process(file_name: str, instance_data: dict = None): """ """ - # Get OTIO review data from serialized file_name - file_path = os.path.join(_RESOURCE_DIR, file_name) - clip = otio.schema.Clip.from_json_file(file_path) - # Prepare dummy instance and capture call object capture_call = CaptureFFmpegCalls() processor = extract_otio_review.ExtractOTIOReview() Anatomy = NamedTuple("Anatomy", project_name=str) - instance = MockInstance( - { + + if not instance_data: + # Get OTIO review data from serialized file_name + file_path = os.path.join(_RESOURCE_DIR, file_name) + clip = otio.schema.Clip.from_json_file(file_path) + + instance_data = { "otioReviewClips": [clip], "handleStart": 10, "handleEnd": 10, "workfileFrameStart": 1001, - "folderPath": "/dummy/path", - "anatomy": Anatomy("test_project"), } - ) + + instance_data.update({ + "folderPath": "/dummy/path", + "anatomy": Anatomy("test_project"), + }) + instance = MockInstance(instance_data) # Mock calls to extern and run plugins. with mock.patch.object( @@ -73,9 +77,14 @@ def run_process(file_name: str): with mock.patch.object( processor, "_get_folder_name_based_prefix", - return_value="C:/result/output." + return_value="output." ): - processor.process(instance) + with mock.patch.object( + processor, + "staging_dir", + return_value="C:/result/" + ): + processor.process(instance) # return all calls made to ffmpeg subprocess return capture_call.calls @@ -103,7 +112,7 @@ def test_image_sequence_with_embedded_tc_and_handles_out_of_range(): # Report from source exr (1001-1101) with enforce framerate "/path/to/ffmpeg -start_number 1000 -framerate 24.0 -i " - "C:\\exr_embedded_tc\\output.%04d.exr -start_number 1001 " + f"C:\\exr_embedded_tc{os.sep}output.%04d.exr -start_number 1001 " "C:/result/output.%03d.jpg" ] @@ -133,7 +142,7 @@ def test_image_sequence_and_handles_out_of_range(): # 1001-1095 = source range conformed to 25fps # 1096-1096 = additional 1 tail frames "/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i " - "C:\\tif_seq\\output.%04d.tif -start_number 996 C:/result/output.%03d.jpg" + f"C:\\tif_seq{os.sep}output.%04d.tif -start_number 996 C:/result/output.%03d.jpg" ] assert calls == expected @@ -203,3 +212,119 @@ def test_short_movie_tail_gap_handles(): ] assert calls == expected + +def test_multiple_review_clips_no_gap(): + """ + Use multiple review clips (image sequence). + Timeline 25fps + """ + file_path = os.path.join(_RESOURCE_DIR, "multiple_review_clips.json") + clips = otio.schema.Track.from_json_file(file_path) + instance_data = { + "otioReviewClips": clips, + "handleStart": 10, + "handleEnd": 10, + "workfileFrameStart": 1001, + } + + calls = run_process( + None, + instance_data=instance_data + ) + + expected = [ + # 10 head black frames generated from gap (991-1000) + '/path/to/ffmpeg -t 0.4 -r 25.0 -f lavfi -i color=c=black:s=1280x720 -tune ' + 'stillimage -start_number 991 C:/result/output.%03d.jpg', + + # Alternance 25fps tiff sequence and 24fps exr sequence for 100 frames each + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1001 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 24.0 -i ' + f'C:\\with_tc{os.sep}output.%04d.exr ' + '-start_number 1102 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1199 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 24.0 -i ' + f'C:\\with_tc{os.sep}output.%04d.exr ' + '-start_number 1300 C:/result/output.%03d.jpg', + + # Repeated 25fps tiff sequence multiple times till the end + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1397 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1498 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1599 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1700 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1801 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 1902 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 2003 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 2104 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' + f'C:\\no_tc{os.sep}output.%04d.tif ' + '-start_number 2205 C:/result/output.%03d.jpg' + ] + + assert calls == expected + +def test_multiple_review_clips_with_gap(): + """ + Use multiple review clips (image sequence) with gap. + Timeline 24fps + """ + file_path = os.path.join(_RESOURCE_DIR, "multiple_review_clips_gap.json") + clips = otio.schema.Track.from_json_file(file_path) + instance_data = { + "otioReviewClips": clips, + "handleStart": 10, + "handleEnd": 10, + "workfileFrameStart": 1001, + } + + calls = run_process( + None, + instance_data=instance_data + ) + + expected = [ + # Gap on review track (12 frames) + '/path/to/ffmpeg -t 0.5 -r 24.0 -f lavfi -i color=c=black:s=1280x720 -tune ' + 'stillimage -start_number 991 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 24.0 -i ' + f'C:\\with_tc{os.sep}output.%04d.exr ' + '-start_number 1003 C:/result/output.%03d.jpg', + + '/path/to/ffmpeg -start_number 1000 -framerate 24.0 -i ' + f'C:\\with_tc{os.sep}output.%04d.exr ' + '-start_number 1091 C:/result/output.%03d.jpg' + ] + + assert calls == expected From 1fce6108c69b15a8aeb3660182d4b6c17530bf84 Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 2 Oct 2024 11:09:01 -0400 Subject: [PATCH 209/216] Fix linting --- .../pipeline/editorial/test_extract_otio_review.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py index 25d689e7c1..ea31e1a260 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py +++ b/tests/client/ayon_core/pipeline/editorial/test_extract_otio_review.py @@ -83,7 +83,7 @@ def run_process(file_name: str, instance_data: dict = None): processor, "staging_dir", return_value="C:/result/" - ): + ): processor.process(instance) # return all calls made to ffmpeg subprocess @@ -233,11 +233,11 @@ def test_multiple_review_clips_no_gap(): ) expected = [ - # 10 head black frames generated from gap (991-1000) + # 10 head black frames generated from gap (991-1000) '/path/to/ffmpeg -t 0.4 -r 25.0 -f lavfi -i color=c=black:s=1280x720 -tune ' 'stillimage -start_number 991 C:/result/output.%03d.jpg', - # Alternance 25fps tiff sequence and 24fps exr sequence for 100 frames each + # Alternance 25fps tiff sequence and 24fps exr sequence for 100 frames each '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' f'C:\\no_tc{os.sep}output.%04d.tif ' '-start_number 1001 C:/result/output.%03d.jpg', @@ -254,7 +254,7 @@ def test_multiple_review_clips_no_gap(): f'C:\\with_tc{os.sep}output.%04d.exr ' '-start_number 1300 C:/result/output.%03d.jpg', - # Repeated 25fps tiff sequence multiple times till the end + # Repeated 25fps tiff sequence multiple times till the end '/path/to/ffmpeg -start_number 1000 -framerate 25.0 -i ' f'C:\\no_tc{os.sep}output.%04d.tif ' '-start_number 1397 C:/result/output.%03d.jpg', @@ -292,7 +292,7 @@ def test_multiple_review_clips_no_gap(): '-start_number 2205 C:/result/output.%03d.jpg' ] - assert calls == expected + assert calls == expected def test_multiple_review_clips_with_gap(): """ From 0ab128b3bfac5aae72f10df11887e1ecf8b26968 Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 2 Oct 2024 16:10:27 -0400 Subject: [PATCH 210/216] Add rounding support for OTIO <= 0.16.0 --- .../plugins/publish/extract_otio_review.py | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/extract_otio_review.py b/client/ayon_core/plugins/publish/extract_otio_review.py index 00a90df695..faba9fd36d 100644 --- a/client/ayon_core/plugins/publish/extract_otio_review.py +++ b/client/ayon_core/plugins/publish/extract_otio_review.py @@ -329,6 +329,20 @@ class ExtractOTIOReview(publish.Extractor): trim_media_range, ) + def _round_to_frame(rational_time): + """ Handle rounding duration to frame. + """ + # OpentimelineIO >= 0.16.0 + try: + return rational_time.round().to_frames() + + # OpentimelineIO < 0.16.0 + except AttributeError: + return otio.opentime.RationalTime( + round(rational_time.value), + rate=rational_time.rate, + ).to_frames() + avl_start = avl_range.start_time # An additional gap is required before the available @@ -337,11 +351,12 @@ class ExtractOTIOReview(publish.Extractor): gap_duration = avl_start - start start = avl_start duration -= gap_duration + gap_duration = _round_to_frame(gap_duration) # create gap data to disk - self._render_segment(gap=gap_duration.round().to_frames()) + self._render_segment(gap=gap_duration) # generate used frames - self._generate_used_frames(gap_duration.round().to_frames()) + self._generate_used_frames(gap_duration) # An additional gap is required after the available # range to conform to source end point + tail handles @@ -351,15 +366,16 @@ class ExtractOTIOReview(publish.Extractor): if end_point > avl_end_point: gap_duration = end_point - avl_end_point duration -= gap_duration + gap_duration = _round_to_frame(gap_duration) # create gap data to disk self._render_segment( - gap=gap_duration.round().to_frames(), + gap=gap_duration, end_offset=duration.to_frames() ) # generate used frames self._generate_used_frames( - gap_duration.round().to_frames(), + gap_duration, end_offset=duration.to_frames() ) From 84d6daf60c357735588f669e4c35a4d5f52febdc Mon Sep 17 00:00:00 2001 From: robin Date: Thu, 3 Oct 2024 08:36:34 -0400 Subject: [PATCH 211/216] Fix NTSC framerates floating issue comparison. --- client/ayon_core/pipeline/editorial.py | 24 +- .../resources/img_seq_23.976_metadata.json | 255 ++++++++++++++++++ .../test_media_range_with_retimes.py | 21 ++ 3 files changed, 293 insertions(+), 7 deletions(-) create mode 100644 tests/client/ayon_core/pipeline/editorial/resources/img_seq_23.976_metadata.json diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index f382f91fec..af2a6ef88c 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -292,13 +292,23 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # Note that 24fps is slower than 25fps hence extended duration # to preserve media range - # Compute new source range based on available rate - conformed_src_in = source_range.start_time.rescaled_to(available_range_rate) - conformed_src_duration = source_range.duration.rescaled_to(available_range_rate) - conformed_source_range = otio.opentime.TimeRange( - start_time=conformed_src_in, - duration=conformed_src_duration - ) + # Compute new source range based on available rate. + # NSTC compatibility might introduce floating rates, when these are + # not exactly the same (23.976 vs 23.976024627685547) + # this will cause precision issue in computation. + # Round to 2 decimals for comparison. + rounded_av_rate = round(available_range_rate, 2) + rounded_src_rate = round(source_range.start_time.rate, 2) + if rounded_av_rate != rounded_src_rate: + conformed_src_in = source_range.start_time.rescaled_to(available_range_rate) + conformed_src_duration = source_range.duration.rescaled_to(available_range_rate) + conformed_source_range = otio.opentime.TimeRange( + start_time=conformed_src_in, + duration=conformed_src_duration + ) + + else: + conformed_source_range = source_range # modifiers time_scalar = 1. diff --git a/tests/client/ayon_core/pipeline/editorial/resources/img_seq_23.976_metadata.json b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_23.976_metadata.json new file mode 100644 index 0000000000..af74ab4252 --- /dev/null +++ b/tests/client/ayon_core/pipeline/editorial/resources/img_seq_23.976_metadata.json @@ -0,0 +1,255 @@ +{ + "OTIO_SCHEMA": "Clip.2", + "metadata": { + "active": true, + "applieswhole": 1, + "asset": "sh020", + "audio": true, + "families": [ + "clip" + ], + "family": "plate", + "handleEnd": 8, + "handleStart": 0, + "heroTrack": true, + "hierarchy": "shots/sq001", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq001", + "shot": "sh020", + "track": "reference" + }, + "hiero_source_type": "TrackItem", + "id": "pyblish.avalon.instance", + "label": "openpypeData", + "note": "OpenPype data container", + "parents": [ + { + "entity_name": "shots", + "entity_type": "folder" + }, + { + "entity_name": "sq001", + "entity_type": "sequence" + } + ], + "publish": true, + "reviewTrack": null, + "sourceResolution": false, + "subset": "plateP01", + "variant": "Main", + "workfileFrameStart": 1001 + }, + "name": "sh020", + "source_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976024627685547, + "value": 51.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976024627685547, + "value": 0.0 + } + }, + "effects": [], + "markers": [ + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "active": true, + "applieswhole": 1, + "asset": "sh020", + "audio": true, + "families": [ + "clip" + ], + "family": "plate", + "handleEnd": 8, + "handleStart": 0, + "heroTrack": true, + "hierarchy": "shots/sq001", + "hierarchyData": { + "episode": "ep01", + "folder": "shots", + "sequence": "sq001", + "shot": "sh020", + "track": "reference" + }, + "hiero_source_type": "TrackItem", + "id": "pyblish.avalon.instance", + "label": "openpypeData", + "note": "OpenPype data container", + "parents": [ + { + "entity_name": "shots", + "entity_type": "folder" + }, + { + "entity_name": "sq001", + "entity_type": "sequence" + } + ], + "publish": true, + "reviewTrack": null, + "sourceResolution": false, + "subset": "plateP01", + "variant": "Main", + "workfileFrameStart": 1001 + }, + "name": "openpypeData", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976024627685547, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976024627685547, + "value": 0.0 + } + } + }, + { + "OTIO_SCHEMA": "Marker.2", + "metadata": { + "applieswhole": 1, + "family": "task", + "hiero_source_type": "TrackItem", + "label": "comp", + "note": "Compositing", + "type": "Compositing" + }, + "name": "comp", + "color": "RED", + "marked_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976024627685547, + "value": 0.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976024627685547, + "value": 0.0 + } + } + } + ], + "enabled": true, + "media_references": { + "DEFAULT_MEDIA": { + "OTIO_SCHEMA": "ImageSequenceReference.1", + "metadata": { + "clip.properties.blendfunc": "0", + "clip.properties.colourspacename": "default", + "clip.properties.domainroot": "", + "clip.properties.enabled": "1", + "clip.properties.expanded": "1", + "clip.properties.opacity": "1", + "clip.properties.valuesource": "", + "foundry.source.audio": "", + "foundry.source.bitmapsize": "0", + "foundry.source.bitsperchannel": "0", + "foundry.source.channelformat": "integer", + "foundry.source.colourtransform": "ACES - ACES2065-1", + "foundry.source.duration": "59", + "foundry.source.filename": "MER_sq001_sh020_P01.%04d.exr 997-1055", + "foundry.source.filesize": "", + "foundry.source.fragments": "59", + "foundry.source.framerate": "23.98", + "foundry.source.fullpath": "", + "foundry.source.height": "1080", + "foundry.source.layers": "colour", + "foundry.source.path": "C:/projects/AY01_VFX_demo/resources/plates/MER_sq001_sh020_P01/MER_sq001_sh020_P01.%04d.exr 997-1055", + "foundry.source.pixelAspect": "1", + "foundry.source.pixelAspectRatio": "", + "foundry.source.pixelformat": "RGBA (Float16) Open Color IO space: 11", + "foundry.source.reelID": "", + "foundry.source.resolution": "", + "foundry.source.samplerate": "Invalid", + "foundry.source.shortfilename": "MER_sq001_sh020_P01.%04d.exr 997-1055", + "foundry.source.shot": "", + "foundry.source.shotDate": "", + "foundry.source.startTC": "", + "foundry.source.starttime": "997", + "foundry.source.timecode": "172800", + "foundry.source.umid": "1bf7437a-b446-440c-07c5-7cae7acf4f5e", + "foundry.source.umidOriginator": "foundry.source.umid", + "foundry.source.width": "1920", + "foundry.timeline.autodiskcachemode": "Manual", + "foundry.timeline.colorSpace": "ACES - ACES2065-1", + "foundry.timeline.duration": "59", + "foundry.timeline.framerate": "23.98", + "foundry.timeline.outputformat": "", + "foundry.timeline.poster": "0", + "foundry.timeline.posterLayer": "colour", + "foundry.timeline.readParams": "AAAAAQAAAAAAAAAFAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAAAMAAAAC2VkZ2VfcGl4ZWxzAAAABWludDMyAAAAAAAAABFpZ25vcmVfcGFydF9uYW1lcwAAAARib29sAAAAAAhub3ByZWZpeAAAAARib29sAAAAAB5vZmZzZXRfbmVnYXRpdmVfZGlzcGxheV93aW5kb3cAAAAEYm9vbAE=", + "foundry.timeline.samplerate": "Invalid", + "isSequence": true, + "media.exr.channels": "B:{1 0 1 1},G:{1 0 1 1},R:{1 0 1 1}", + "media.exr.compression": "8", + "media.exr.compressionName": "DWAA", + "media.exr.dataWindow": "0,0,1919,1079", + "media.exr.displayWindow": "0,0,1919,1079", + "media.exr.dwaCompressionLevel": "90", + "media.exr.lineOrder": "0", + "media.exr.pixelAspectRatio": "1", + "media.exr.screenWindowCenter": "0,0", + "media.exr.screenWindowWidth": "1", + "media.exr.type": "scanlineimage", + "media.exr.version": "1", + "media.input.bitsperchannel": "16-bit half float", + "media.input.ctime": "2022-04-21 11:56:03", + "media.input.filename": "C:/projects/AY01_VFX_demo/resources/plates/MER_sq001_sh020_P01/MER_sq001_sh020_P01.0997.exr", + "media.input.filereader": "exr", + "media.input.filesize": "1235182", + "media.input.frame": "1", + "media.input.frame_rate": "23.976", + "media.input.height": "1080", + "media.input.mtime": "2022-03-06 10:14:41", + "media.input.timecode": "02:00:00:00", + "media.input.width": "1920", + "media.nuke.full_layer_names": "0", + "media.nuke.node_hash": "ffffffffffffffff", + "media.nuke.version": "12.2v3", + "openpype.source.colourtransform": "ACES - ACES2065-1", + "openpype.source.height": 1080, + "openpype.source.pixelAspect": 1.0, + "openpype.source.width": 1920, + "padding": 4 + }, + "name": "", + "available_range": { + "OTIO_SCHEMA": "TimeRange.1", + "duration": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976, + "value": 59.0 + }, + "start_time": { + "OTIO_SCHEMA": "RationalTime.1", + "rate": 23.976, + "value": 997.0 + } + }, + "available_image_bounds": null, + "target_url_base": "C:/projects/AY01_VFX_demo/resources/plates/MER_sq001_sh020_P01\\", + "name_prefix": "MER_sq001_sh020_P01.", + "name_suffix": ".exr", + "start_frame": 997, + "frame_step": 1, + "rate": 23.976, + "frame_zero_padding": 4, + "missing_frame_policy": "error" + } + }, + "active_media_reference_key": "DEFAULT_MEDIA" +} \ No newline at end of file diff --git a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py index e5f0d335b5..7f9256c6d8 100644 --- a/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py +++ b/tests/client/ayon_core/pipeline/editorial/test_media_range_with_retimes.py @@ -166,3 +166,24 @@ def test_img_sequence_relative_source_range(): "legacy_img_sequence.json", expected_data ) + +def test_img_sequence_conform_to_23_976fps(): + """ + Img sequence clip + available files = 997-1047 23.976fps + source_range = 997-1055 23.976024627685547fps + """ + expected_data = { + 'mediaIn': 997, + 'mediaOut': 1047, + 'handleStart': 0, + 'handleEnd': 8, + 'speed': 1.0 + } + + _check_expected_retimed_values( + "img_seq_23.976_metadata.json", + expected_data, + handle_start=0, + handle_end=8, + ) From a3c9106f35dd3c5876cb216ff4a9ad4f1ba9cac4 Mon Sep 17 00:00:00 2001 From: robin Date: Thu, 3 Oct 2024 09:07:26 -0400 Subject: [PATCH 212/216] Fix typo --- client/ayon_core/pipeline/editorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index af2a6ef88c..94b101d3d3 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -293,7 +293,7 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # to preserve media range # Compute new source range based on available rate. - # NSTC compatibility might introduce floating rates, when these are + # NTSC compatibility might introduce floating rates, when these are # not exactly the same (23.976 vs 23.976024627685547) # this will cause precision issue in computation. # Round to 2 decimals for comparison. From c315c96755c450849dc5af6ce25a36e7664822b6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:51:46 +0200 Subject: [PATCH 213/216] print logs based on env variable --- .../tools/publisher/models/publish.py | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/tools/publisher/models/publish.py b/client/ayon_core/tools/publisher/models/publish.py index ff20d8ec3e..6dfda38885 100644 --- a/client/ayon_core/tools/publisher/models/publish.py +++ b/client/ayon_core/tools/publisher/models/publish.py @@ -4,12 +4,14 @@ import inspect import logging import traceback import collections +from contextlib import contextmanager from functools import partial from typing import Optional, Dict, List, Union, Any, Iterable import arrow import pyblish.plugin +from ayon_core.lib import env_value_to_bool from ayon_core.pipeline import ( PublishValidationError, KnownPublishError, @@ -867,6 +869,10 @@ class PublishModel: def __init__(self, controller: AbstractPublisherBackend): self._controller = controller + self._log_to_console: bool = env_value_to_bool( + "AYON_PUBLISHER_PRINT_LOGS", default=False + ) + # Publishing should stop at validation stage self._publish_up_validation: bool = False self._publish_comment_is_set: bool = False @@ -917,7 +923,13 @@ class PublishModel: self._log_handler: MessageHandler = MessageHandler() def reset(self): + # Allow to change behavior during process lifetime + self._log_to_console = env_value_to_bool( + "AYON_PUBLISHER_PRINT_LOGS", default=False + ) + create_context = self._controller.get_create_context() + self._publish_up_validation = False self._publish_comment_is_set = False self._publish_has_started = False @@ -1285,25 +1297,38 @@ class PublishModel: self._set_progress(self._publish_max_progress) yield partial(self.stop_publish) + @contextmanager + def _log_manager(self, plugin: pyblish.api.Plugin): + root = logging.getLogger() + if not self._log_to_console: + plugin.log.propagate = False + plugin.log.addHandler(self._log_handler) + root.addHandler(self._log_handler) + + try: + if self._log_to_console: + yield None + else: + yield self._log_handler + + finally: + if not self._log_to_console: + plugin.log.propagate = True + plugin.log.removeHandler(self._log_handler) + root.removeHandler(self._log_handler) + self._log_handler.clear_records() + def _process_and_continue( self, plugin: pyblish.api.Plugin, instance: pyblish.api.Instance ): - root = logging.getLogger() - self._log_handler.clear_records() - plugin.log.propagate = False - plugin.log.addHandler(self._log_handler) - root.addHandler(self._log_handler) - try: + with self._log_manager(plugin) as log_handler: result = pyblish.plugin.process( plugin, self._publish_context, instance ) - result["records"] = self._log_handler.records - finally: - plugin.log.propagate = True - plugin.log.removeHandler(self._log_handler) - root.removeHandler(self._log_handler) + if log_handler is not None: + result["records"] = log_handler.records exception = result.get("error") if exception: From 412b4b8d3a558449d2d29ef3353cef22dcddfc71 Mon Sep 17 00:00:00 2001 From: robin Date: Thu, 3 Oct 2024 10:18:12 -0400 Subject: [PATCH 214/216] Address feedback from PR. --- client/ayon_core/pipeline/editorial.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/editorial.py b/client/ayon_core/pipeline/editorial.py index 94b101d3d3..a49a981d2a 100644 --- a/client/ayon_core/pipeline/editorial.py +++ b/client/ayon_core/pipeline/editorial.py @@ -293,10 +293,13 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end): # to preserve media range # Compute new source range based on available rate. + + # Backward-compatibility for Hiero OTIO exporter. # NTSC compatibility might introduce floating rates, when these are # not exactly the same (23.976 vs 23.976024627685547) # this will cause precision issue in computation. - # Round to 2 decimals for comparison. + # Currently round to 2 decimals for comparison, + # but this should always rescale after that. rounded_av_rate = round(available_range_rate, 2) rounded_src_rate = round(source_range.start_time.rate, 2) if rounded_av_rate != rounded_src_rate: From 162a47db60d61a80774b86b00daddcae7d34298c Mon Sep 17 00:00:00 2001 From: Ynbot Date: Thu, 3 Oct 2024 14:27:19 +0000 Subject: [PATCH 215/216] [Automated] Add generated package files from main --- client/ayon_core/version.py | 2 +- package.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index 75116c703e..e6d6c6f373 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'core' version.""" -__version__ = "1.0.0+dev" +__version__ = "1.0.1" diff --git a/package.py b/package.py index 1466031daa..b7f74e5126 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "1.0.0+dev" +version = "1.0.1" client_dir = "ayon_core" diff --git a/pyproject.toml b/pyproject.toml index 4a63529c67..afb48efec3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ [tool.poetry] name = "ayon-core" -version = "1.0.0+dev" +version = "1.0.1" description = "" authors = ["Ynput Team "] readme = "README.md" From d2cbdc1d2147a3fa134e651655b61ca3dc5131b4 Mon Sep 17 00:00:00 2001 From: Ynbot Date: Thu, 3 Oct 2024 14:27:53 +0000 Subject: [PATCH 216/216] [Automated] Update version in package.py for develop --- client/ayon_core/version.py | 2 +- package.py | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index e6d6c6f373..458129f367 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'core' version.""" -__version__ = "1.0.1" +__version__ = "1.0.1+dev" diff --git a/package.py b/package.py index b7f74e5126..c059eed423 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "1.0.1" +version = "1.0.1+dev" client_dir = "ayon_core" diff --git a/pyproject.toml b/pyproject.toml index afb48efec3..0a7d0d76c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ [tool.poetry] name = "ayon-core" -version = "1.0.1" +version = "1.0.1+dev" description = "" authors = ["Ynput Team "] readme = "README.md"