Merge branch 'feature/909-define-basic-trait-type-using-dataclasses' into feature/911-new-traits-based-integrator

This commit is contained in:
Ondřej Samohel 2025-02-06 15:02:18 +01:00
commit 71ca34be9a
No known key found for this signature in database
GPG key ID: 02376E18990A97C6
68 changed files with 4131 additions and 453 deletions

View file

@ -35,6 +35,20 @@ body:
label: Version
description: What version are you running? Look to AYON Tray
options:
- 1.0.14
- 1.0.13
- 1.0.12
- 1.0.11
- 1.0.10
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.4.4
- 0.4.3

View file

@ -1,44 +1,38 @@
# -*- coding: utf-8 -*-
"""Addons for AYON."""
from . import click_wrap
from .interfaces import (
IPluginPaths,
ITrayAddon,
ITrayAction,
ITrayService,
IHostAddon,
ITraits,
)
from .base import (
ProcessPreparationError,
ProcessContext,
AYONAddon,
AddonsManager,
AYONAddon,
ProcessContext,
ProcessPreparationError,
load_addons,
)
from .interfaces import (
IHostAddon,
IPluginPaths,
ITraits,
ITrayAction,
ITrayAddon,
ITrayService,
)
from .utils import (
ensure_addons_are_process_context_ready,
ensure_addons_are_process_ready,
)
__all__ = (
"click_wrap",
"IPluginPaths",
"ITrayAddon",
"ITrayAction",
"ITrayService",
"IHostAddon",
"ITraits",
"ProcessPreparationError",
"ProcessContext",
"AYONAddon",
"AddonsManager",
"load_addons",
"IHostAddon",
"IPluginPaths",
"ITraits",
"ITrayAction",
"ITrayAddon",
"ITrayService",
"ProcessContext",
"ProcessPreparationError",
"click_wrap",
"ensure_addons_are_process_context_ready",
"ensure_addons_are_process_ready",
"load_addons",
)

View file

@ -1,7 +1,6 @@
"""Interfaces for AYON addons."""
"""Addon interfaces for AYON."""
from __future__ import annotations
import logging
from abc import ABCMeta, abstractmethod
from typing import TYPE_CHECKING, Callable, Optional, Type
@ -10,8 +9,9 @@ from ayon_core import resources
if TYPE_CHECKING:
from qtpy import QtWidgets
from ayon_core.addon import AddonsManager
from ayon_core.addon.base import AddonsManager
from ayon_core.pipeline.traits import TraitBase
from ayon_core.tools.tray.ui.tray import TrayManager
class _AYONInterfaceMeta(ABCMeta):
@ -37,10 +37,6 @@ class AYONInterface(metaclass=_AYONInterfaceMeta):
log = None
def __init__(self):
"""Initialize interface."""
self.log = logging.getLogger(self.__class__.__name__)
class IPluginPaths(AYONInterface):
"""Addon has plugin paths to return.
@ -162,7 +158,7 @@ class ITrayAddon(AYONInterface):
"""
manager: AddonsManager
tray_initialized = False
_tray_manager = None
_tray_manager: TrayManager = None
_admin_submenu = None
@abstractmethod
@ -175,18 +171,14 @@ class ITrayAddon(AYONInterface):
prepared
"""
raise NotImplementedError
@abstractmethod
def tray_menu(self, tray_menu: QtWidgets.QMenu) -> None:
"""Add addon's action to tray menu."""
raise NotImplementedError
@abstractmethod
def tray_start(self) -> None:
"""Start procedure in tray tool."""
raise NotImplementedError
@abstractmethod
def tray_exit(self) -> None:
@ -195,7 +187,6 @@ class ITrayAddon(AYONInterface):
This is place where all threads should be shut.
"""
raise NotImplementedError
def execute_in_main_thread(self, callback: Callable) -> None:
"""Pushes callback to the queue or process 'callback' on a main thread.
@ -208,6 +199,8 @@ class ITrayAddon(AYONInterface):
"""
if not self.tray_initialized:
# TODO (Illicit): Called without initialized tray, still
# main thread needed.
try:
callback()
@ -286,12 +279,10 @@ class ITrayAction(ITrayAddon):
@abstractmethod
def label(self) -> str:
"""Service label showed in menu."""
raise NotImplementedError
@abstractmethod
def on_action_trigger(self) -> None:
"""What happens on actions click."""
raise NotImplementedError
def tray_menu(self, tray_menu: QtWidgets.QMenu) -> None:
"""Add action to tray menu."""
@ -330,7 +321,11 @@ class ITrayService(ITrayAddon):
@abstractmethod
def label(self) -> str:
"""Service label showed in menu."""
raise NotImplementedError
# TODO (Illicit): be able to get any sort of information to show/print
# @abstractmethod
# def get_service_info(self):
# pass
@staticmethod
def services_submenu(tray_menu: QtWidgets.QMenu) -> QtWidgets.QMenu:
@ -423,7 +418,6 @@ class IHostAddon(AYONInterface):
@abstractmethod
def host_name(self) -> str:
"""Name of host which addon represents."""
raise NotImplementedError
def get_workfile_extensions(self) -> list[str]:
"""Define workfile extensions for host.
@ -448,4 +442,3 @@ class ITraits(AYONInterface):
list[Type[TraitBase]]: Traits for the addon.
"""
raise NotImplementedError

View file

@ -26,10 +26,12 @@ class AddLastWorkfileToLaunchArgs(PreLaunchHook):
"photoshop",
"tvpaint",
"substancepainter",
"substancedesigner",
"aftereffects",
"wrap",
"openrv",
"cinema4d"
"cinema4d",
"silhouette",
}
launch_types = {LaunchTypes.local}

View file

@ -10,6 +10,7 @@ class OCIOEnvHook(PreLaunchHook):
order = 0
hosts = {
"substancepainter",
"substancedesigner",
"fusion",
"blender",
"aftereffects",
@ -20,7 +21,8 @@ class OCIOEnvHook(PreLaunchHook):
"hiero",
"resolve",
"openrv",
"cinema4d"
"cinema4d",
"silhouette",
}
launch_types = set()

View file

@ -108,21 +108,29 @@ def run_subprocess(*args, **kwargs):
| getattr(subprocess, "CREATE_NO_WINDOW", 0)
)
# Escape parentheses for bash
# Escape special characters in certain shells
if (
kwargs.get("shell") is True
and len(args) == 1
and isinstance(args[0], str)
and os.getenv("SHELL") in ("/bin/bash", "/bin/sh")
):
new_arg = (
args[0]
.replace("(", "\\(")
.replace(")", "\\)")
)
args = (new_arg, )
# Escape parentheses for bash
if os.getenv("SHELL") in ("/bin/bash", "/bin/sh"):
new_arg = (
args[0]
.replace("(", "\\(")
.replace(")", "\\)")
)
args = (new_arg,)
# Escape & on Windows in shell with `cmd.exe` using ^&
elif (
platform.system().lower() == "windows"
and os.getenv("COMSPEC").endswith("cmd.exe")
):
new_arg = args[0].replace("&", "^&")
args = (new_arg, )
# Get environents from kwarg or use current process environments if were
# Get environments from kwarg or use current process environments if were
# not passed.
env = kwargs.get("env") or os.environ
# Make sure environment contains only strings

View file

@ -587,8 +587,8 @@ class FormattingPart:
if sub_key < 0:
sub_key = len(value) + sub_key
invalid = 0 > sub_key < len(data)
if invalid:
valid = 0 <= sub_key < len(value)
if not valid:
used_keys.append(sub_key)
missing_key = True
break

View file

@ -29,6 +29,7 @@ from ayon_core.lib.events import QueuedEventSystem
from ayon_core.lib.attribute_definitions import get_default_values
from ayon_core.host import IPublishHost, IWorkfileHost
from ayon_core.pipeline import Anatomy
from ayon_core.pipeline.template_data import get_template_data
from ayon_core.pipeline.plugin_discover import DiscoverResult
from .exceptions import (
@ -480,6 +481,36 @@ class CreateContext:
self.get_current_project_name())
return self._current_project_settings
def get_template_data(
self, folder_path: Optional[str], task_name: Optional[str]
) -> Dict[str, Any]:
"""Prepare template data for given context.
Method is using cached entities and settings to prepare template data.
Args:
folder_path (Optional[str]): Folder path.
task_name (Optional[str]): Task name.
Returns:
dict[str, Any]: Template data.
"""
project_entity = self.get_current_project_entity()
folder_entity = task_entity = None
if folder_path:
folder_entity = self.get_folder_entity(folder_path)
if task_name and folder_entity:
task_entity = self.get_task_entity(folder_path, task_name)
return get_template_data(
project_entity,
folder_entity,
task_entity,
host_name=self.host_name,
settings=self.get_current_project_settings(),
)
@property
def context_has_changed(self):
"""Host context has changed.

View file

@ -15,7 +15,7 @@ from ayon_core.pipeline.plugin_discover import (
deregister_plugin,
deregister_plugin_path
)
from ayon_core.pipeline import get_staging_dir_info
from ayon_core.pipeline.staging_dir import get_staging_dir_info, StagingDir
from .constants import DEFAULT_VARIANT_VALUE
from .product_name import get_product_name
@ -562,6 +562,10 @@ class BaseCreator(ABC):
instance
)
cur_project_name = self.create_context.get_current_project_name()
if not project_entity and project_name == cur_project_name:
project_entity = self.create_context.get_current_project_entity()
return get_product_name(
project_name,
task_name,
@ -833,7 +837,7 @@ class Creator(BaseCreator):
"""
return self.pre_create_attr_defs
def get_staging_dir(self, instance):
def get_staging_dir(self, instance) -> Optional[StagingDir]:
"""Return the staging dir and persistence from instance.
Args:
@ -858,18 +862,30 @@ class Creator(BaseCreator):
["CollectAnatomyInstanceData"]
["follow_workfile_version"]
)
follow_version_hosts = (
publish_settings
["CollectSceneVersion"]
["hosts"]
)
current_host = create_ctx.host.name
follow_workfile_version = (
follow_workfile_version and
current_host in follow_version_hosts
)
# Gather version number provided from the instance.
current_workfile = create_ctx.get_current_workfile_path()
version = instance.get("version")
# If follow workfile, gather version from workfile path.
if version is None and follow_workfile_version:
current_workfile = self.create_context.get_current_workfile_path()
if version is None and follow_workfile_version and current_workfile:
workfile_version = get_version_from_path(current_workfile)
version = int(workfile_version)
if workfile_version is not None:
version = int(workfile_version)
# Fill-up version with next version available.
elif version is None:
if version is None:
versions = self.get_next_versions_for_instances(
[instance]
)
@ -915,7 +931,8 @@ class Creator(BaseCreator):
instance.transient_data.update({
"stagingDir": staging_dir_path,
"stagingDir_persistent": staging_dir_info.persistent,
"stagingDir_persistent": staging_dir_info.is_persistent,
"stagingDir_is_custom": staging_dir_info.is_custom,
})
self.log.info(f"Applied staging dir to instance: {staging_dir_path}")

View file

@ -9,7 +9,7 @@ import os
import logging
import collections
from ayon_core.pipeline.constants import AVALON_INSTANCE_ID
from ayon_core.pipeline.constants import AYON_INSTANCE_ID
from .product_name import get_product_name
@ -34,7 +34,7 @@ class LegacyCreator:
# Default data
self.data = collections.OrderedDict()
# TODO use 'AYON_INSTANCE_ID' when all hosts support it
self.data["id"] = AVALON_INSTANCE_ID
self.data["id"] = AYON_INSTANCE_ID
self.data["productType"] = self.product_type
self.data["folderPath"] = folder_path
self.data["productName"] = name

View file

@ -1,6 +1,7 @@
import copy
import collections
from uuid import uuid4
import typing
from typing import Optional, Dict, List, Any
from ayon_core.lib.attribute_definitions import (
@ -17,6 +18,9 @@ from ayon_core.pipeline import (
from .exceptions import ImmutableKeyError
from .changes import TrackChangesItem
if typing.TYPE_CHECKING:
from .creator_plugins import BaseCreator
class ConvertorItem:
"""Item representing convertor plugin.
@ -444,10 +448,11 @@ class CreatedInstance:
def __init__(
self,
product_type,
product_name,
data,
creator,
product_type: str,
product_name: str,
data: Dict[str, Any],
creator: "BaseCreator",
transient_data: Optional[Dict[str, Any]] = None,
):
self._creator = creator
creator_identifier = creator.identifier
@ -462,7 +467,9 @@ class CreatedInstance:
self._members = []
# Data that can be used for lifetime of object
self._transient_data = {}
if transient_data is None:
transient_data = {}
self._transient_data = transient_data
# Create a copy of passed data to avoid changing them on the fly
data = copy.deepcopy(data or {})
@ -492,7 +499,7 @@ class CreatedInstance:
item_id = data.get("id")
# TODO use only 'AYON_INSTANCE_ID' when all hosts support it
if item_id not in {AYON_INSTANCE_ID, AVALON_INSTANCE_ID}:
item_id = AVALON_INSTANCE_ID
item_id = AYON_INSTANCE_ID
self._data["id"] = item_id
self._data["productType"] = product_type
self._data["productName"] = product_name
@ -787,16 +794,26 @@ class CreatedInstance:
self._create_context.instance_create_attr_defs_changed(self.id)
@classmethod
def from_existing(cls, instance_data, creator):
def from_existing(
cls,
instance_data: Dict[str, Any],
creator: "BaseCreator",
transient_data: Optional[Dict[str, Any]] = None,
) -> "CreatedInstance":
"""Convert instance data from workfile to CreatedInstance.
Args:
instance_data (Dict[str, Any]): Data in a structure ready for
'CreatedInstance' object.
creator (BaseCreator): Creator plugin which is creating the
instance of for which the instance belong.
"""
instance of for which the instance belongs.
transient_data (Optional[dict[str, Any]]): Instance transient
data.
Returns:
CreatedInstance: Instance object.
"""
instance_data = copy.deepcopy(instance_data)
product_type = instance_data.get("productType")
@ -809,7 +826,11 @@ class CreatedInstance:
product_name = instance_data.get("subset")
return cls(
product_type, product_name, instance_data, creator
product_type,
product_name,
instance_data,
creator,
transient_data=transient_data,
)
def attribute_value_changed(self, key, changes):

View file

@ -1,6 +1,7 @@
import os
import re
import clique
import math
import opentimelineio as otio
from opentimelineio import opentime as _ot
@ -196,11 +197,11 @@ def is_clip_from_media_sequence(otio_clip):
return is_input_sequence or is_input_sequence_legacy
def remap_range_on_file_sequence(otio_clip, in_out_range):
def remap_range_on_file_sequence(otio_clip, otio_range):
"""
Args:
otio_clip (otio.schema.Clip): The OTIO clip to check.
in_out_range (tuple[float, float]): The in-out range to remap.
otio_range (otio.schema.TimeRange): The trim range to apply.
Returns:
tuple(int, int): The remapped range as discrete frame number.
@ -211,17 +212,24 @@ def remap_range_on_file_sequence(otio_clip, in_out_range):
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
available_range = otio_clip.available_range()
source_range = otio_clip.source_range
available_range_rate = available_range.start_time.rate
media_in = available_range.start_time.value
# 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.
# Currently round to 2 decimals for comparison,
# but this should always rescale after that.
rounded_av_rate = round(available_range_rate, 2)
rounded_range_rate = round(otio_range.start_time.rate, 2)
if rounded_av_rate != rounded_range_rate:
raise ValueError("Inconsistent range between clip and provided clip")
source_range = otio_clip.source_range
media_in = available_range.start_time
available_range_start_frame = (
available_range.start_time.to_frames()
)
@ -231,19 +239,32 @@ def remap_range_on_file_sequence(otio_clip, in_out_range):
# source range for image sequence. Following code maintain
# backward-compatibility by adjusting media_in
# while we are updating those.
conformed_src_in = source_range.start_time.rescaled_to(
available_range_rate
)
if (
is_clip_from_media_sequence(otio_clip)
and available_range_start_frame == media_ref.start_frame
and source_range.start_time.to_frames() < media_ref.start_frame
and conformed_src_in.to_frames() < media_ref.start_frame
):
media_in = 0
media_in = otio.opentime.RationalTime(
0, rate=available_range_rate
)
src_offset_in = otio_range.start_time - media_in
frame_in = otio.opentime.RationalTime.from_frames(
media_in_trimmed - media_in + media_ref.start_frame,
media_ref.start_frame + src_offset_in.to_frames(),
rate=available_range_rate,
).to_frames()
# e.g.:
# duration = 10 frames at 24fps
# if frame_in = 1001 then
# frame_out = 1010
offset_duration = max(0, otio_range.duration.to_frames() - 1)
frame_out = otio.opentime.RationalTime.from_frames(
media_out_trimmed - media_in + media_ref.start_frame,
frame_in + offset_duration,
rate=available_range_rate,
).to_frames()
@ -261,21 +282,6 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end):
media_ref = otio_clip.media_reference
is_input_sequence = is_clip_from_media_sequence(otio_clip)
# 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
#
@ -320,10 +326,24 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end):
else:
conformed_source_range = source_range
# 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 conformed_source_range.start_time.to_frames() <
media_ref.start_frame
):
available_range = _ot.TimeRange(
_ot.RationalTime(0, rate=available_range_rate),
available_range.duration,
)
# modifiers
time_scalar = 1.
offset_in = 0
offset_out = 0
time_warp_nodes = []
# Check for speed effects and adjust playback speed accordingly
@ -354,51 +374,134 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end):
tw_node.update(metadata)
tw_node["lookup"] = list(lookup)
# get first and last frame offsets
offset_in += lookup[0]
offset_out += lookup[-1]
# add to timewarp nodes
time_warp_nodes.append(tw_node)
# multiply by time scalar
offset_in *= time_scalar
offset_out *= time_scalar
# scale handles
handle_start *= abs(time_scalar)
handle_end *= abs(time_scalar)
# 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
# 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 = 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.
if is_input_sequence:
src_in = conformed_source_range.start_time
src_duration = math.ceil(
otio_clip.source_range.duration.value
* abs(time_scalar)
)
retimed_duration = otio.opentime.RationalTime(
src_duration,
otio_clip.source_range.duration.rate
)
retimed_duration = retimed_duration.rescaled_to(src_in.rate)
trim_range = otio.opentime.TimeRange(
start_time=src_in,
duration=retimed_duration,
)
# preserve discrete frame numbers
media_in_trimmed, media_out_trimmed = remap_range_on_file_sequence(
otio_clip,
(media_in_trimmed, media_out_trimmed)
trim_range,
)
media_in = media_ref.start_frame
media_out = media_in + available_range.duration.to_frames() - 1
else:
# compute retimed range
media_in_trimmed = conformed_source_range.start_time.value
offset_duration = (
conformed_source_range.duration.value
* abs(time_scalar)
)
# Offset duration by 1 for media out frame
# - only if duration is not single frame (start frame != end frame)
if offset_duration > 0:
offset_duration -= 1
media_out_trimmed = media_in_trimmed + offset_duration
media_in = available_range.start_time.value
media_out = available_range.end_time_inclusive().value
if time_warp_nodes:
# Naive approach: Resolve consecutive timewarp(s) on range,
# then check if plate range has to be extended beyond source range.
in_frame = media_in_trimmed
frame_range = [in_frame]
for _ in range(otio_clip.source_range.duration.to_frames() - 1):
in_frame += time_scalar
frame_range.append(in_frame)
# Different editorial DCC might have different TimeWarp logic.
# The following logic assumes that the "lookup" list values are
# frame offsets relative to the current source frame number.
#
# media_source_range |______1_____|______2______|______3______|
#
# media_retimed_range |______2_____|______2______|______3______|
#
# TimeWarp lookup +1 0 0
for tw_idx, tw in enumerate(time_warp_nodes):
for idx, frame_number in enumerate(frame_range):
# First timewarp, apply on media range
if tw_idx == 0:
frame_range[idx] = round(
frame_number +
(tw["lookup"][idx] * time_scalar)
)
# Consecutive timewarp, apply on the previous result
else:
new_idx = round(idx + tw["lookup"][idx])
if 0 <= new_idx < len(frame_range):
frame_range[idx] = frame_range[new_idx]
continue
# TODO: implementing this would need to actually have
# retiming engine resolve process within AYON,
# resolving wraps as curves, then projecting
# those into the previous media_range.
raise NotImplementedError(
"Unsupported consecutive timewarps "
"(out of computed range)"
)
# adjust range if needed
media_in_trimmed_before_tw = media_in_trimmed
media_in_trimmed = max(min(frame_range), media_in)
media_out_trimmed = min(max(frame_range), media_out)
# If TimeWarp changes the first frame of the soure range,
# we need to offset the first TimeWarp values accordingly.
#
# expected_range |______2_____|______2______|______3______|
#
# EDITORIAL
# media_source_range |______1_____|______2______|______3______|
#
# TimeWarp lookup +1 0 0
#
# EXTRACTED PLATE
# plate_range |______2_____|______3______|_ _ _ _ _ _ _|
#
# expected TimeWarp 0 -1 -1
if media_in_trimmed != media_in_trimmed_before_tw:
offset = media_in_trimmed_before_tw - media_in_trimmed
offset *= 1.0 / time_scalar
time_warp_nodes[0]["lookup"] = [
value + offset
for value in time_warp_nodes[0]["lookup"]
]
# adjust available handles if needed
if (media_in_trimmed - media_in) < handle_start:
handle_start = max(0, media_in_trimmed - media_in)
@ -417,16 +520,16 @@ def get_media_range_with_retimes(otio_clip, handle_start, handle_end):
"retime": True,
"speed": time_scalar,
"timewarps": time_warp_nodes,
"handleStart": int(handle_start),
"handleEnd": int(handle_end)
"handleStart": math.ceil(handle_start),
"handleEnd": math.ceil(handle_end)
}
}
returning_dict = {
"mediaIn": media_in_trimmed,
"mediaOut": media_out_trimmed,
"handleStart": int(handle_start),
"handleEnd": int(handle_end),
"handleStart": math.ceil(handle_start),
"handleEnd": math.ceil(handle_end),
"speed": time_scalar
}

View file

@ -464,6 +464,12 @@ def filter_pyblish_plugins(plugins):
if getattr(plugin, "enabled", True) is False:
plugins.remove(plugin)
# Pyblish already operated a filter based on host.
# But applying settings might have changed "hosts"
# value in plugin so re-filter.
elif not pyblish.plugin.host_is_compatible(plugin):
plugins.remove(plugin)
def get_errored_instances_from_context(context, plugin=None):
"""Collect failed instances from pyblish context.
@ -708,6 +714,7 @@ def get_instance_staging_dir(instance):
project_settings=context.data["project_settings"],
template_data=template_data,
always_return_path=True,
username=context.data["user"],
)
staging_dir_path = staging_dir_info.directory
@ -716,8 +723,8 @@ def get_instance_staging_dir(instance):
os.makedirs(staging_dir_path, exist_ok=True)
instance.data.update({
"stagingDir": staging_dir_path,
"stagingDir_persistent": staging_dir_info.persistent,
"stagingDir_custom": staging_dir_info.custom
"stagingDir_persistent": staging_dir_info.is_persistent,
"stagingDir_is_custom": staging_dir_info.is_custom
})
return staging_dir_path

View file

@ -292,6 +292,9 @@ class OptionalPyblishPluginMixin(AYONPyblishPluginMixin):
```
"""
# Allow exposing tooltip from class with `optional_tooltip` attribute
optional_tooltip: Optional[str] = None
@classmethod
def get_attribute_defs(cls):
"""Attribute definitions based on plugin's optional attribute."""
@ -304,8 +307,14 @@ class OptionalPyblishPluginMixin(AYONPyblishPluginMixin):
active = getattr(cls, "active", True)
# Return boolean stored under 'active' key with label of the class name
label = cls.label or cls.__name__
return [
BoolDef("active", default=active, label=label)
BoolDef(
"active",
default=active,
label=label,
tooltip=cls.optional_tooltip,
)
]
def is_active(self, data):

View file

@ -1,3 +1,6 @@
import logging
import warnings
from typing import Optional, Dict, Any
from dataclasses import dataclass
from ayon_core.lib import Logger, filter_profiles
@ -11,21 +14,41 @@ from .tempdir import get_temp_dir
@dataclass
class StagingDir:
directory: str
persistent: bool
custom: bool # Whether the staging dir is a custom staging dir
is_persistent: bool
# Whether the staging dir is a custom staging dir
is_custom: bool
def __setattr__(self, key, value):
if key == "persistent":
warnings.warn(
"'StagingDir.persistent' is deprecated."
" Use 'StagingDir.is_persistent' instead.",
DeprecationWarning
)
key = "is_persistent"
super().__setattr__(key, value)
@property
def persistent(self):
warnings.warn(
"'StagingDir.persistent' is deprecated."
" Use 'StagingDir.is_persistent' instead.",
DeprecationWarning
)
return self.is_persistent
def get_staging_dir_config(
project_name,
task_type,
task_name,
product_type,
product_name,
host_name,
project_settings=None,
anatomy=None,
log=None,
):
project_name: str,
task_type: Optional[str],
task_name: Optional[str],
product_type: str,
product_name: str,
host_name: str,
project_settings: Optional[Dict[str, Any]] = None,
anatomy: Optional[Anatomy] = None,
log: Optional[logging.Logger] = None,
) -> Optional[Dict[str, Any]]:
"""Get matching staging dir profile.
Args:
@ -76,7 +99,6 @@ def get_staging_dir_config(
# get template from template name
template_name = profile["template_name"]
_validate_template_name(project_name, template_name, anatomy)
template = anatomy.get_template_item("staging", template_name)
@ -93,35 +115,23 @@ def get_staging_dir_config(
return {"template": template, "persistence": data_persistence}
def _validate_template_name(project_name, template_name, anatomy):
"""Check that staging dir section with appropriate template exist.
Raises:
ValueError - if misconfigured template
"""
if template_name not in anatomy.templates["staging"]:
raise ValueError(
f'Anatomy of project "{project_name}" does not have set'
f' "{template_name}" template key at Staging Dir category!'
)
def get_staging_dir_info(
project_entity,
folder_entity,
task_entity,
product_type,
product_name,
host_name,
anatomy=None,
project_settings=None,
template_data=None,
always_return_path=True,
force_tmp_dir=False,
logger=None,
prefix=None,
suffix=None,
):
project_entity: Dict[str, Any],
folder_entity: Optional[Dict[str, Any]],
task_entity: Optional[Dict[str, Any]],
product_type: str,
product_name: str,
host_name: str,
anatomy: Optional[Anatomy] = None,
project_settings: Optional[Dict[str, Any]] = None,
template_data: Optional[Dict[str, Any]] = None,
always_return_path: bool = True,
force_tmp_dir: bool = False,
logger: Optional[logging.Logger] = None,
prefix: Optional[str] = None,
suffix: Optional[str] = None,
username: Optional[str] = None,
) -> Optional[StagingDir]:
"""Get staging dir info data.
If `force_temp` is set, staging dir will be created as tempdir.
@ -148,6 +158,7 @@ def get_staging_dir_info(
logger (Optional[logging.Logger]): Logger instance.
prefix (Optional[str]) Optional prefix for staging dir name.
suffix (Optional[str]): Optional suffix for staging dir name.
username (Optional[str]): AYON Username.
Returns:
Optional[StagingDir]: Staging dir info data
@ -161,16 +172,22 @@ def get_staging_dir_info(
)
if force_tmp_dir:
return get_temp_dir(
project_name=project_entity["name"],
anatomy=anatomy,
prefix=prefix,
suffix=suffix,
return StagingDir(
get_temp_dir(
project_name=project_entity["name"],
anatomy=anatomy,
prefix=prefix,
suffix=suffix,
),
is_persistent=False,
is_custom=False
)
# making few queries to database
ctx_data = get_template_data(
project_entity, folder_entity, task_entity, host_name
project_entity, folder_entity, task_entity, host_name,
settings=project_settings,
username=username
)
# add additional data
@ -205,8 +222,8 @@ def get_staging_dir_info(
dir_template = staging_dir_config["template"]["directory"]
return StagingDir(
dir_template.format_strict(ctx_data),
persistent=staging_dir_config["persistence"],
custom=True
is_persistent=staging_dir_config["persistence"],
is_custom=True
)
# no config found but force an output
@ -218,8 +235,8 @@ def get_staging_dir_info(
prefix=prefix,
suffix=suffix,
),
persistent=False,
custom=False
is_persistent=False,
is_custom=False
)
return None

View file

@ -4,7 +4,7 @@ from ayon_core.settings import get_studio_settings
from ayon_core.lib.local_settings import get_ayon_username
def get_general_template_data(settings=None):
def get_general_template_data(settings=None, username=None):
"""General template data based on system settings or machine.
Output contains formatting keys:
@ -14,17 +14,22 @@ def get_general_template_data(settings=None):
Args:
settings (Dict[str, Any]): Studio or project settings.
username (Optional[str]): AYON Username.
"""
if not settings:
settings = get_studio_settings()
if username is None:
username = get_ayon_username()
core_settings = settings["core"]
return {
"studio": {
"name": core_settings["studio_name"],
"code": core_settings["studio_code"]
},
"user": get_ayon_username()
"user": username
}
@ -145,6 +150,7 @@ def get_template_data(
task_entity=None,
host_name=None,
settings=None,
username=None
):
"""Prepare data for templates filling from entered documents and info.
@ -167,12 +173,13 @@ def get_template_data(
host_name (Optional[str]): Used to fill '{app}' key.
settings (Union[Dict, None]): Prepared studio or project settings.
They're queried if not passed (may be slower).
username (Optional[str]): AYON Username.
Returns:
Dict[str, Any]: Data prepared for filling workdir template.
"""
template_data = get_general_template_data(settings)
template_data = get_general_template_data(settings, username=username)
template_data.update(get_project_template_data(project_entity))
if folder_entity:
template_data.update(get_folder_template_data(

View file

@ -165,6 +165,8 @@ to different packages based on their use:
| | Variant | Used to differentiate between data variants of the same output (mp4 as h.264 and h.265 for example)
| | KeepOriginalLocation | Marks the representation to keep the original location of the file
| | KeepOriginalName | Marks the representation to keep the original name of the file
| | SourceApplication | Holds information about producing application, about it's version, variant and platform.
| | IntendedUse | For specifying the intended use of the representation if it cannot be easily determined by other traits.
| three dimensional | Spatial | Spatial information like up-axis, units and handedness.
| | Geometry | Type trait to mark the representation as a geometry.
| | Shader | Type trait to mark the representation as a Shader.
@ -317,4 +319,4 @@ class MyAddon(AYONAddon, ITraits):
If you want to use MyPy linter, you need to make sure that
optional fields typed as `Optional[Type]` needs to set default value
using `default` or `default_factory` parameter. Otherwise MyPy will
complain about missing named arguments.
complain about missing named arguments.

View file

@ -12,10 +12,16 @@ from .content import (
)
from .cryptography import DigitallySigned, PGPSigned
from .lifecycle import Persistent, Transient
from .meta import Tagged, TemplatePath, Variant
from .meta import (
IntendedUse,
KeepOriginalLocation,
SourceApplication,
Tagged,
TemplatePath,
Variant,
)
from .representation import Representation
from .three_dimensional import Geometry, IESProfile, Lighting, Shader, Spatial
from .time import (
from .temporal import (
FrameRanged,
GapPolicy,
Handles,
@ -23,6 +29,7 @@ from .time import (
SMPTETimecode,
Static,
)
from .three_dimensional import Geometry, IESProfile, Lighting, Shader, Spatial
from .trait import (
MissingTraitError,
TraitBase,
@ -40,25 +47,25 @@ from .utils import (
get_sequence_from_files,
)
__all__ = [
__all__ = [ # noqa: RUF022
# base
"Representation",
"TraitBase",
"MissingTraitError",
"TraitValidationError",
# color
"ColorManaged",
# content
"Bundle",
"Compressed",
"FileLocation",
"FileLocations",
"MimeType",
"RootlessLocation",
"Fragment",
"LocatableContent",
# color
"ColorManaged",
"MimeType",
"RootlessLocation",
# cryptography
"DigitallySigned",
@ -69,10 +76,28 @@ __all__ = [
"Transient",
# meta
"IntendedUse",
"KeepOriginalLocation",
"SourceApplication",
"Tagged",
"TemplatePath",
"Variant",
# temporal
"FrameRanged",
"GapPolicy",
"Handles",
"Sequence",
"SMPTETimecode",
"Static",
# three-dimensional
"Geometry",
"IESProfile",
"Lighting",
"Shader",
"Spatial",
# two-dimensional
"Compressed",
"Deep",
@ -82,21 +107,6 @@ __all__ = [
"Planar",
"UDIM",
# three-dimensional
"Geometry",
"IESProfile",
"Lighting",
"Shader",
"Spatial",
# time
"FrameRanged",
"Static",
"Handles",
"GapPolicy",
"Sequence",
"SMPTETimecode",
# utils
"get_sequence_from_files",
]

View file

@ -21,6 +21,7 @@ class ColorManaged(TraitBase):
in the "current" OCIO context.
config (str): An OCIO config name defining color space.
"""
id: ClassVar[str] = "ayon.color.ColorManaged.v1"
name: ClassVar[str] = "ColorManaged"
description: ClassVar[str] = "Color Managed trait."

View file

@ -11,7 +11,7 @@ from typing import ClassVar, Generator, Optional
from pydantic import Field
from .representation import Representation
from .time import FrameRanged, Handles, Sequence
from .temporal import FrameRanged, Handles, Sequence
from .trait import (
MissingTraitError,
TraitBase,
@ -35,7 +35,6 @@ class MimeType(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
mime_type (str): Mime type like image/jpeg.
"""
name: ClassVar[str] = "MimeType"
@ -43,6 +42,7 @@ class MimeType(TraitBase):
id: ClassVar[str] = "ayon.content.MimeType.v1"
mime_type: str = Field(..., title="Mime Type")
class LocatableContent(TraitBase):
"""LocatableContent trait model.
@ -57,7 +57,6 @@ class LocatableContent(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
location (str): Location.
"""
name: ClassVar[str] = "LocatableContent"
@ -66,6 +65,7 @@ class LocatableContent(TraitBase):
location: str = Field(..., title="Location")
is_templated: Optional[bool] = Field(default=None, title="Is Templated")
class FileLocation(TraitBase):
"""FileLocation trait model.
@ -80,8 +80,8 @@ class FileLocation(TraitBase):
file_path (str): File path.
file_size (int): File size in bytes.
file_hash (str): File hash.
"""
name: ClassVar[str] = "FileLocation"
description: ClassVar[str] = "FileLocation Trait Model"
id: ClassVar[str] = "ayon.content.FileLocation.v1"
@ -89,6 +89,7 @@ class FileLocation(TraitBase):
file_size: Optional[int] = Field(default=None, title="File Size")
file_hash: Optional[str] = Field(default=None, title="File Hash")
class FileLocations(TraitBase):
"""FileLocation trait model.
@ -114,7 +115,7 @@ class FileLocations(TraitBase):
This method will return all file paths from the trait.
Yeilds:
Yields:
Path: List of file paths.
"""
@ -356,7 +357,6 @@ class RootlessLocation(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
rootless_path (str): Rootless path.
"""
name: ClassVar[str] = "RootlessLocation"
@ -380,7 +380,6 @@ class Compressed(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
compression_type (str): Compression type.
"""
name: ClassVar[str] = "Compressed"
@ -419,7 +418,6 @@ class Bundle(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
items (list[list[TraitBase]]): List of representations.
"""
name: ClassVar[str] = "Bundle"
@ -432,7 +430,6 @@ class Bundle(TraitBase):
"""Convert bundle to representations."""
for idx, item in enumerate(self.items):
yield Representation(name=f"{self.name} {idx}", traits=item)
class Fragment(TraitBase):
@ -458,7 +455,6 @@ class Fragment(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
parent (str): Parent representation id.
"""
name: ClassVar[str] = "Fragment"

View file

@ -16,6 +16,7 @@ class DigitallySigned(TraitBase):
Attributes:
signature (str): Digital signature.
"""
id: ClassVar[str] = "ayon.cryptography.DigitallySigned.v1"
name: ClassVar[str] = "DigitallySigned"
description: ClassVar[str] = "Digitally signed trait."
@ -29,6 +30,7 @@ class PGPSigned(DigitallySigned):
Attributes:
signature (str): PGP signature.
"""
id: ClassVar[str] = "ayon.cryptography.PGPSigned.v1"
name: ClassVar[str] = "PGPSigned"
description: ClassVar[str] = "PGP signed trait."

View file

@ -1,5 +1,7 @@
"""Metadata traits."""
from typing import ClassVar, List
from __future__ import annotations
from typing import ClassVar, List, Optional
from pydantic import Field
@ -78,7 +80,7 @@ class Variant(TraitBase):
class KeepOriginalLocation(TraitBase):
"""Keep files in its original location.
Note:
This is not a persistent trait.
@ -86,16 +88,58 @@ class KeepOriginalLocation(TraitBase):
name: ClassVar[str] = "KeepOriginalLocation"
description: ClassVar[str] = "Keep Original Location Trait Model"
id: ClassVar[str] = "ayon.meta.KeepOriginalLocation.v1"
persistent: bool = Field(False, title="Persistent")
persistent: bool = Field(default=False, title="Persistent")
class KeepOriginalName(TraitBase):
"""Keep files in its original name.
Note:
This is not a persistent trait.
"""
name: ClassVar[str] = "KeepOriginalName"
description: ClassVar[str] = "Keep Original Name Trait Model"
id: ClassVar[str] = "ayon.meta.KeepOriginalName.v1"
persistent: bool = Field(False, title="Persistent")
persistent: bool = Field(default=False, title="Persistent")
class SourceApplication(TraitBase):
"""Metadata about the source (producing) application.
This can be useful in cases, where this information is
needed but it cannot be determined from other means - like
.txt files used for various motion tracking applications that
must be interpreted by the loader.
Note that this is not really connected to any logic in
ayon-applications addon.
"""
name: ClassVar[str] = "SourceApplication"
description: ClassVar[str] = "Source Application Trait Model"
id: ClassVar[str] = "ayon.meta.SourceApplication.v1"
application: str = Field(..., title="Application Name")
variant: Optional[str] = Field(
None, title="Application Variant (e.g. Pro)")
version: Optional[str] = Field(
None, title="Application Version")
platform: Optional[str] = Field(
None, title="Platform Name (e.g. Windows)")
host_name: Optional[str] = Field(
None, title="AYON host Name if applicable")
class IntendedUse(TraitBase):
"""Intended use of the representation.
This trait describes the intended use of the representation. It
can be used in cases, where the other traits are not enough to
describe the intended use. For example txt file with tracking
points can be used as corner pin in After Effect but not in Nuke.
"""
name: ClassVar[str] = "IntendedUse"
description: ClassVar[str] = "Intended Use Trait Model"
id: ClassVar[str] = "ayon.meta.IntendedUse.v1"
use: str = Field(..., title="Intended Use")

View file

@ -8,18 +8,25 @@ import sys
import uuid
from functools import lru_cache
from types import GenericAlias
from typing import ClassVar, Generic, ItemsView, Optional, Type, TypeVar, Union
from typing import (
ClassVar,
Generic,
ItemsView,
Optional,
Type,
TypeVar,
Union,
)
from .trait import (
IncompatibleTraitVersionError,
LooseMatchingTraitError,
MissingTraitError,
TraitBase,
UpgradableTraitError,
TraitValidationError,
UpgradableTraitError,
)
T = TypeVar("T", bound="TraitBase")
@ -50,8 +57,8 @@ class Representation(Generic[T]):
Arguments:
name (str): Representation name. Must be unique within instance.
representation_id (str): Representation ID.
"""
_data: dict[str, T]
_module_blacklist: ClassVar[list[str]] = [
"_", "builtins", "pydantic",
@ -127,7 +134,7 @@ class Representation(Generic[T]):
"""Return the traits as items."""
return ItemsView(self._data)
def add_trait(self, trait: T, *, exists_ok: bool=False) -> None:
def add_trait(self, trait: T, *, exists_ok: bool = False) -> None:
"""Add a trait to the Representation.
Args:
@ -149,7 +156,7 @@ class Representation(Generic[T]):
self._data[trait.id] = trait
def add_traits(
self, traits: list[T], *, exists_ok: bool=False) -> None:
self, traits: list[T], *, exists_ok: bool = False) -> None:
"""Add a list of traits to the Representation.
Args:
@ -333,14 +340,14 @@ class Representation(Generic[T]):
),
None,
)
if not result:
if result is None:
msg = f"Trait with ID {trait_id} not found."
raise MissingTraitError(msg)
return result
def get_traits(self,
traits: Optional[list[Type[T]]]=None
) -> dict[str, T]:
traits: Optional[list[Type[T]]] = None
) -> dict[str, T]:
"""Get a list of traits from the representation.
If no trait IDs or traits are provided, all traits will be returned.
@ -399,14 +406,15 @@ class Representation(Generic[T]):
def __init__(
self,
name: str,
representation_id: Optional[str]=None,
traits: Optional[list[T]]=None):
representation_id: Optional[str] = None,
traits: Optional[list[T]] = None):
"""Initialize the data.
Args:
name (str): Representation name. Must be unique within instance.
representation_id (str, optional): Representation ID.
traits (list[TraitBase], optional): List of traits.
"""
self.name = name
self.representation_id = representation_id or uuid.uuid4().hex
@ -493,7 +501,7 @@ class Representation(Generic[T]):
klass = getattr(module, attr_name)
if not inspect.isclass(klass):
continue
# this needs to be done because of the bug? in
# this needs to be done because of the bug? in
# python ABCMeta, where ``issubclass`` is not working
# if it hits the GenericAlias (that is in fact
# tuple[int, int]). This is added to the scope by
@ -503,7 +511,8 @@ class Representation(Generic[T]):
if issubclass(klass, TraitBase) \
and str(klass.id).startswith(trait_id):
trait_candidates.add(klass)
return trait_candidates # type: ignore
# I
return trait_candidates # type: ignore[return-value]
@classmethod
@lru_cache(maxsize=64)
@ -607,31 +616,30 @@ class Representation(Generic[T]):
)
raise IncompatibleTraitVersionError(msg) from e
else:
if requested_version > found_version:
error_msg = (
f"Requested trait version {requested_version} is "
f"higher than the found trait version {found_version}."
)
raise IncompatibleTraitVersionError(error_msg) from e
if requested_version > found_version:
error_msg = (
f"Requested trait version {requested_version} is "
f"higher than the found trait version {found_version}."
)
raise IncompatibleTraitVersionError(error_msg) from e
if requested_version < found_version and hasattr(
e.found_trait, "upgrade"):
error_msg = (
"Requested trait version "
f"{requested_version} is lower "
f"than the found trait version {found_version}."
)
error: UpgradableTraitError = UpgradableTraitError(error_msg)
error.trait = e.found_trait
raise error from e
return trait_class
if requested_version < found_version and hasattr(
e.found_trait, "upgrade"):
error_msg = (
"Requested trait version "
f"{requested_version} is lower "
f"than the found trait version {found_version}."
)
error: UpgradableTraitError = UpgradableTraitError(error_msg)
error.trait = e.found_trait
raise error from e
return trait_class # type: ignore[return-value]
@classmethod
def from_dict(
cls,
cls: Type[Representation],
name: str,
representation_id: Optional[str]=None,
representation_id: Optional[str] = None,
trait_data: Optional[dict] = None) -> Representation:
"""Create a representation from a dictionary.
@ -701,10 +709,12 @@ class Representation(Generic[T]):
"""
errors = []
for trait in self._data.values():
# we do this in the loop to catch all the errors
try:
trait.validate_trait(self)
except TraitValidationError as e:
except TraitValidationError as e: # noqa: PERF203
errors.append(str(e))
if errors:
raise TraitValidationError(
f"representation {self.name}", "\n".join(errors))
msg = "\n".join(errors)
scope = self.name
raise TraitValidationError(scope, msg)

View file

@ -2,20 +2,18 @@
from __future__ import annotations
import contextlib
import re
from enum import Enum, auto
from re import Pattern
from typing import TYPE_CHECKING, ClassVar, Optional, Union
import clique
from pydantic import Field, field_validator
import re
from re import Pattern
from .trait import MissingTraitError, TraitBase, TraitValidationError
if TYPE_CHECKING:
from pathlib import Path
from .content import FileLocations
from .representation import Representation
@ -31,11 +29,13 @@ class GapPolicy(Enum):
hold (int): Gaps are interpreted as hold frames (last existing frames).
black (int): Gaps are interpreted as black frames.
"""
forbidden = auto()
missing = auto()
hold = auto()
black = auto()
class FrameRanged(TraitBase):
"""Frame ranged trait model.
@ -65,8 +65,8 @@ class FrameRanged(TraitBase):
frame_out (int): Frame out.
frames_per_second (str): Frames per second.
step (int): Step.
"""
name: ClassVar[str] = "FrameRanged"
description: ClassVar[str] = "Frame Ranged Trait"
id: ClassVar[str] = "ayon.time.FrameRanged.v1"
@ -93,8 +93,8 @@ class Handles(TraitBase):
inclusive (bool): Handles are inclusive.
frame_start_handle (int): Frame start handle.
frame_end_handle (int): Frame end handle.
"""
name: ClassVar[str] = "Handles"
description: ClassVar[str] = "Handles Trait"
id: ClassVar[str] = "ayon.time.Handles.v1"
@ -105,6 +105,7 @@ class Handles(TraitBase):
frame_end_handle: Optional[int] = Field(
0, title="Frame End Handle")
class Sequence(TraitBase):
"""Sequence trait model.
@ -124,21 +125,24 @@ class Sequence(TraitBase):
named group.
frame_spec (str): Frame list specification of frames. This takes
string like "1-10,20-30,40-50" etc.
"""
name: ClassVar[str] = "Sequence"
description: ClassVar[str] = "Sequence Trait Model"
id: ClassVar[str] = "ayon.time.Sequence.v1"
gaps_policy: Optional[GapPolicy] = Field(
default=GapPolicy.forbidden, title="Gaps Policy")
frame_padding: int = Field(..., title="Frame Padding")
frame_regex: Optional[Union[Pattern, str]] = Field(default=None, title="Frame Regex")
frame_spec: Optional[str] = Field(default=None, title="Frame Specification")
frame_regex: Optional[Union[Pattern, str]] = Field(
default=None, title="Frame Regex")
frame_spec: Optional[str] = Field(default=None,
title="Frame Specification")
@field_validator("frame_regex")
@classmethod
def validate_frame_regex(
cls, v: Optional[Union[Pattern, str]]) -> Optional[Union[Pattern, str]]:
cls, v: Optional[Union[Pattern, str]]
) -> Optional[Union[Pattern, str]]:
"""Validate frame regex."""
_v = v
if v and isinstance(v, Pattern):
@ -204,9 +208,8 @@ class Sequence(TraitBase):
handles_frame_end)
self.validate_frame_padding(file_locs)
def validate_frame_list(
def validate_frame_list( # noqa: C901
self,
file_locations: FileLocations,
frame_start: Optional[int] = None,
@ -245,7 +248,7 @@ class Sequence(TraitBase):
frame_regex = re.compile(self.frame_regex)
elif isinstance(self.frame_regex, Pattern):
frame_regex = self.frame_regex
frames = self.get_frame_list(
file_locations, frame_regex)
else:
@ -329,7 +332,6 @@ class Sequence(TraitBase):
frames.extend(range(int(start), int(end) + 1))
return frames
@staticmethod
def _get_collection(
file_locations: FileLocations,
@ -391,10 +393,10 @@ class Sequence(TraitBase):
"""
src_collection = Sequence._get_collection(file_locations, regex)
return list(src_collection.indexes)
def get_frame_pattern(self) -> Pattern:
"""Get frame regex as pattern.
If the regex is string, it will compile it to the pattern.
"""
@ -405,9 +407,11 @@ class Sequence(TraitBase):
return re.compile(
r"\.(?P<index>(?P<padding>0*)\d+)\.\D+\d?$")
# Do we need one for drop and non-drop frame?
class SMPTETimecode(TraitBase):
"""SMPTE Timecode trait model."""
name: ClassVar[str] = "Timecode"
description: ClassVar[str] = "SMPTE Timecode Trait"
id: ClassVar[str] = "ayon.time.SMPTETimecode.v1"
@ -418,8 +422,8 @@ class Static(TraitBase):
"""Static time trait.
Used to define static time (single frame).
"""
name: ClassVar[str] = "Static"
description: ClassVar[str] = "Static Time Trait"
id: ClassVar[str] = "ayon.time.Static.v1"

View file

@ -24,8 +24,8 @@ class Spatial(TraitBase):
up_axis (str): Up axis.
handedness (str): Handedness.
meters_per_unit (float): Meters per unit.
"""
id: ClassVar[str] = "ayon.3d.Spatial.v1"
name: ClassVar[str] = "Spatial"
description: ClassVar[str] = "Spatial trait model."
@ -46,6 +46,7 @@ class Geometry(TraitBase):
name: ClassVar[str] = "Geometry"
description: ClassVar[str] = "Geometry trait model."
class Shader(TraitBase):
"""Shader trait model.
@ -58,6 +59,7 @@ class Shader(TraitBase):
name: ClassVar[str] = "Shader"
description: ClassVar[str] = "Shader trait model."
class Lighting(TraitBase):
"""Lighting trait model.
@ -70,6 +72,7 @@ class Lighting(TraitBase):
name: ClassVar[str] = "Lighting"
description: ClassVar[str] = "Lighting trait model."
class IESProfile(TraitBase):
"""IES profile (IES-LM-64) type trait model.

View file

@ -27,7 +27,6 @@ class TraitBase(ABC, BaseModel):
It is using Pydantic BaseModel for serialization and validation.
``id``, ``name``, and ``description`` are abstract attributes that must be
implemented in the derived classes.
"""
model_config = ConfigDict(
@ -118,6 +117,7 @@ class UpgradableTraitError(Generic[T], Exception):
trait: T
old_data: dict
class LooseMatchingTraitError(Generic[T], Exception):
"""Loose matching trait exception.
@ -128,6 +128,7 @@ class LooseMatchingTraitError(Generic[T], Exception):
found_trait: T
expected_id: str
class TraitValidationError(Exception):
"""Trait validation error exception.

View file

@ -11,6 +11,7 @@ from .trait import TraitBase
if TYPE_CHECKING:
from .content import FileLocation, FileLocations
class Image(TraitBase):
"""Image trait model.
@ -20,7 +21,6 @@ class Image(TraitBase):
name (str): Trait name.
description (str): Trait description.
id (str): id should be namespaced trait name with version
"""
name: ClassVar[str] = "Image"
@ -40,7 +40,6 @@ class PixelBased(TraitBase):
display_window_width (int): Width of the image display window.
display_window_height (int): Height of the image display window.
pixel_aspect_ratio (float): Pixel aspect ratio.
"""
name: ClassVar[str] = "PixelBased"
@ -66,7 +65,6 @@ class Planar(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
planar_configuration (str): Planar configuration.
"""
name: ClassVar[str] = "Planar"
@ -84,7 +82,6 @@ class Deep(TraitBase):
name (str): Trait name.
description (str): Trait description.
id (str): id should be namespaced trait name with version
"""
name: ClassVar[str] = "Deep"
@ -106,7 +103,6 @@ class Overscan(TraitBase):
right (int): Right overscan/underscan.
top (int): Top overscan/underscan.
bottom (int): Bottom overscan/underscan.
"""
name: ClassVar[str] = "Overscan"
@ -128,7 +124,6 @@ class UDIM(TraitBase):
description (str): Trait description.
id (str): id should be namespaced trait name with version
udim (int): UDIM value.
"""
name: ClassVar[str] = "UDIM"

View file

@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
from clique import assemble
from ayon_core.pipeline.traits.time import FrameRanged
from ayon_core.pipeline.traits.temporal import FrameRanged
if TYPE_CHECKING:
from pathlib import Path
@ -15,6 +15,8 @@ def get_sequence_from_files(paths: list[Path]) -> FrameRanged:
"""Get original frame range from files.
Note that this cannot guess frame rate, so it's set to 25.
This will also fail on paths that cannot be assembled into
one collection without any reminders.
Args:
paths (list[Path]): List of file paths.
@ -23,7 +25,15 @@ def get_sequence_from_files(paths: list[Path]) -> FrameRanged:
FrameRanged: FrameRanged trait.
"""
col = assemble([path.as_posix() for path in paths])[0][0]
cols, rems = assemble([path.as_posix() for path in paths])
if rems:
msg = "Cannot assemble paths into one collection"
raise ValueError(msg)
if len(cols) != 1:
msg = "More than one collection found"
raise ValueError(msg)
col = cols[0]
sorted_frames = sorted(col.indexes)
# First frame used for end value
first_frame = sorted_frames[0]

View file

@ -24,6 +24,7 @@ class CollectCoreJobEnvVars(pyblish.api.ContextPlugin):
# NOTE we should use 'context.data["user"]' but that has higher
# order.
("AYON_USERNAME", get_ayon_username()),
("AYON_HOST_NAME", context.data["hostName"]),
):
if value:
self.log.debug(f"Setting job env: {key}: {value}")

View file

@ -36,6 +36,16 @@ class CollectOtioReview(pyblish.api.InstancePlugin):
# optionally get `reviewTrack`
review_track_name = instance.data.get("reviewTrack")
# [clip_media] setting:
# Extract current clip source range as reviewable.
# Flag review content from otio_clip.
if not review_track_name and "review" in instance.data["families"]:
otio_review_clips = [otio_clip]
# skip if no review track available
elif not review_track_name:
return
# generate range in parent
otio_tl_range = otio_clip.range_in_parent()
@ -43,12 +53,14 @@ class CollectOtioReview(pyblish.api.InstancePlugin):
clip_frame_end = int(
otio_tl_range.start_time.value + otio_tl_range.duration.value)
# skip if no review track available
if not review_track_name:
return
# loop all tracks and match with name in `reviewTrack`
for track in otio_timeline.tracks:
# No review track defined, skip the loop
if review_track_name is None:
break
# Not current review track, skip it.
if review_track_name != track.name:
continue

View file

@ -6,6 +6,7 @@ Provides:
instance -> otioReviewClips
"""
import os
import math
import clique
import pyblish.api
@ -69,9 +70,17 @@ class CollectOtioSubsetResources(
self.log.debug(
">> retimed_attributes: {}".format(retimed_attributes))
# break down into variables
media_in = int(retimed_attributes["mediaIn"])
media_out = int(retimed_attributes["mediaOut"])
# break down into variables as rounded frame numbers
#
# 0 1 2 3 4
# |-------------|---------------|--------------|-------------|
# |_______________media range_______________|
# 0.6 3.2
#
# As rounded frames, media_in = 0 and media_out = 4
media_in = math.floor(retimed_attributes["mediaIn"])
media_out = math.ceil(retimed_attributes["mediaOut"])
handle_start = int(retimed_attributes["handleStart"])
handle_end = int(retimed_attributes["handleEnd"])
@ -149,7 +158,6 @@ class CollectOtioSubsetResources(
self.log.info(
"frame_start-frame_end: {}-{}".format(frame_start, frame_end))
review_repre = None
if is_sequence:
# file sequence way
@ -174,17 +182,18 @@ class CollectOtioSubsetResources(
path, trimmed_media_range_h, metadata)
self.staging_dir, collection = collection_data
self.log.debug(collection)
repre = self._create_representation(
frame_start, frame_end, collection=collection)
if len(collection.indexes) > 1:
self.log.debug(collection)
repre = self._create_representation(
frame_start, frame_end, collection=collection)
else:
filename = tuple(collection)[0]
self.log.debug(filename)
# TODO: discuss this, it erases frame number.
repre = self._create_representation(
frame_start, frame_end, file=filename)
if (
not instance.data.get("otioReviewClips")
and "review" in instance.data["families"]
):
review_repre = self._create_representation(
frame_start, frame_end, collection=collection,
delete=True, review=True)
else:
_trim = False
@ -200,13 +209,6 @@ class CollectOtioSubsetResources(
repre = self._create_representation(
frame_start, frame_end, file=filename, trim=_trim)
if (
not instance.data.get("otioReviewClips")
and "review" in instance.data["families"]
):
review_repre = self._create_representation(
frame_start, frame_end,
file=filename, delete=True, review=True)
instance.data["originalDirname"] = self.staging_dir
@ -219,9 +221,6 @@ class CollectOtioSubsetResources(
instance.data["representations"].append(repre)
# add review representation to instance data
if review_repre:
instance.data["representations"].append(review_repre)
self.log.debug(instance.data)

View file

@ -93,8 +93,7 @@ class CollectRenderedFiles(pyblish.api.ContextPlugin):
# now we can just add instances from json file and we are done
any_staging_dir_persistent = False
for instance_data in data.get("instances"):
for instance_data in data["instances"]:
self.log.debug(" - processing instance for {}".format(
instance_data.get("productName")))
instance = self._context.create_instance(
@ -105,7 +104,11 @@ class CollectRenderedFiles(pyblish.api.ContextPlugin):
instance.data.update(instance_data)
# stash render job id for later validation
instance.data["render_job_id"] = data.get("job").get("_id")
instance.data["publishJobMetadata"] = data
# TODO remove 'render_job_id' here and rather use
# 'publishJobMetadata' where is needed.
# - this is deadline specific
instance.data["render_job_id"] = data.get("job", {}).get("_id")
staging_dir_persistent = instance.data.get(
"stagingDir_persistent", False
)

View file

@ -66,7 +66,8 @@ class CollectResourcesPath(pyblish.api.InstancePlugin):
"yeticacheUE",
"tycache",
"usd",
"oxrig"
"oxrig",
"sbsar",
]
def process(self, instance):

View file

@ -14,23 +14,7 @@ class CollectSceneVersion(pyblish.api.ContextPlugin):
order = pyblish.api.CollectorOrder
label = 'Collect Scene Version'
# configurable in Settings
hosts = [
"aftereffects",
"blender",
"celaction",
"fusion",
"harmony",
"hiero",
"houdini",
"maya",
"max",
"nuke",
"photoshop",
"resolve",
"tvpaint",
"motionbuilder",
"substancepainter"
]
hosts = ["*"]
# in some cases of headless publishing (for example webpublisher using PS)
# you want to ignore version from name and let integrate use next version

View file

@ -147,7 +147,6 @@ class ExtractOTIOReview(
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)
src_frame_start = src_range.start_time.to_frames()
# Temporary.
# Some AYON custom OTIO exporter were implemented with
@ -157,7 +156,7 @@ class ExtractOTIOReview(
if (
is_clip_from_media_sequence(r_otio_cl)
and available_range_start_frame == media_ref.start_frame
and src_frame_start < media_ref.start_frame
and start.to_frames() < media_ref.start_frame
):
available_range = otio.opentime.TimeRange(
otio.opentime.RationalTime(0, rate=self.actual_fps),
@ -209,13 +208,9 @@ class ExtractOTIOReview(
# File sequence way
if is_sequence:
# 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,
processing_range,
)
input_fps = processing_range.start_time.rate
@ -325,6 +320,9 @@ class ExtractOTIOReview(
end = max(collection.indexes)
files = [f for f in collection]
# single frame sequence
if len(files) == 1:
files = files[0]
ext = collection.format("{tail}")
representation_data.update({
"name": ext[1:],

View file

@ -35,6 +35,7 @@ class ExtractThumbnail(pyblish.api.InstancePlugin):
"resolve",
"traypublisher",
"substancepainter",
"substancedesigner",
"nuke",
"aftereffects",
"unreal",

View file

@ -37,7 +37,7 @@ class ValidateCurrentSaveFile(pyblish.api.ContextPlugin):
label = "Validate File Saved"
order = pyblish.api.ValidatorOrder - 0.1
hosts = ["fusion", "houdini", "max", "maya", "nuke", "substancepainter",
"cinema4d"]
"cinema4d", "silhouette"]
actions = [SaveByVersionUpAction, ShowWorkfilesAction]
def process(self, context):

View file

@ -23,6 +23,9 @@ Enabled vs Disabled logic in most of stylesheets
font-family: "Noto Sans";
font-weight: 450;
outline: none;
/* Define icon size to fix size issues for most of DCCs */
icon-size: 16px;
}
QWidget {
@ -1168,6 +1171,8 @@ ValidationArtistMessage QLabel {
#PublishLogMessage {
font-family: "Noto Sans Mono";
border: none;
padding: 0;
}
#PublishInstanceLogsLabel {

View file

@ -197,7 +197,7 @@ class ConvertorItemsGroupWidget(BaseGroupWidget):
else:
widget = ConvertorItemCardWidget(item, self)
widget.selected.connect(self._on_widget_selection)
widget.double_clicked(self.double_clicked)
widget.double_clicked.connect(self.double_clicked)
self._widgets_by_id[item.id] = widget
self._content_layout.insertWidget(widget_idx, widget)
widget_idx += 1

View file

@ -1117,6 +1117,57 @@ class LogIconFrame(QtWidgets.QFrame):
painter.end()
class LogItemMessage(QtWidgets.QTextEdit):
def __init__(self, msg, parent):
super().__init__(parent)
# Set as plain text to propagate new line characters
self.setPlainText(msg)
self.setObjectName("PublishLogMessage")
self.setReadOnly(True)
self.setFrameStyle(QtWidgets.QFrame.NoFrame)
self.setLineWidth(0)
self.setMidLineWidth(0)
pal = self.palette()
pal.setColor(QtGui.QPalette.Base, QtCore.Qt.transparent)
self.setPalette(pal)
self.setContentsMargins(0, 0, 0, 0)
viewport = self.viewport()
viewport.setContentsMargins(0, 0, 0, 0)
self.setTextInteractionFlags(
QtCore.Qt.TextBrowserInteraction)
self.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))
self.setLineWrapMode(QtWidgets.QTextEdit.WidgetWidth)
self.setWordWrapMode(
QtGui.QTextOption.WrapMode.WrapAtWordBoundaryOrAnywhere
)
self.setSizePolicy(
QtWidgets.QSizePolicy.Preferred,
QtWidgets.QSizePolicy.Maximum
)
document = self.document()
document.documentLayout().documentSizeChanged.connect(
self._adjust_minimum_size
)
document.setDocumentMargin(0.0)
self._height = None
def _adjust_minimum_size(self, size):
self._height = size.height() + (2 * self.frameWidth())
self.updateGeometry()
def sizeHint(self):
size = super().sizeHint()
if self._height is not None:
size.setHeight(self._height)
return size
def minimumSizeHint(self):
return self.sizeHint()
class LogItemWidget(QtWidgets.QWidget):
log_level_to_flag = {
10: LOG_DEBUG_VISIBLE,
@ -1132,12 +1183,7 @@ class LogItemWidget(QtWidgets.QWidget):
type_flag, level_n = self._get_log_info(log)
icon_label = LogIconFrame(
self, log["type"], level_n, log.get("is_validation_error"))
message_label = QtWidgets.QLabel(log["msg"].rstrip(), self)
message_label.setObjectName("PublishLogMessage")
message_label.setTextInteractionFlags(
QtCore.Qt.TextBrowserInteraction)
message_label.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))
message_label.setWordWrap(True)
message_label = LogItemMessage(log["msg"].rstrip(), self)
main_layout = QtWidgets.QHBoxLayout(self)
main_layout.setContentsMargins(0, 0, 0, 0)
@ -1290,6 +1336,7 @@ class InstanceLogsWidget(QtWidgets.QWidget):
label_widget = QtWidgets.QLabel(instance.label, self)
label_widget.setObjectName("PublishInstanceLogsLabel")
label_widget.setWordWrap(True)
logs_grid = LogsWithIconsView(instance.logs, self)
layout = QtWidgets.QVBoxLayout(self)
@ -1329,9 +1376,11 @@ class InstancesLogsView(QtWidgets.QFrame):
content_wrap_widget = QtWidgets.QWidget(scroll_area)
content_wrap_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground)
content_wrap_widget.setMinimumWidth(80)
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)

View file

@ -28,7 +28,7 @@ def find_free_port(
exclude_ports (list, tuple, set): List of ports that won't be
checked form entered range.
host (str): Host where will check for free ports. Set to
"localhost" by default.
"127.0.0.1" by default.
"""
if port_from is None:
port_from = 8079
@ -42,7 +42,7 @@ def find_free_port(
# Default host is localhost but it is possible to look for other hosts
if host is None:
host = "localhost"
host = "127.0.0.1"
found_port = None
while True:
@ -78,7 +78,7 @@ class WebServerManager:
self._log = None
self.port = port or 8079
self.host = host or "localhost"
self.host = host or "127.0.0.1"
self.on_stop_callbacks = []

View file

@ -1,7 +1,6 @@
from ayon_core.resources import get_image_path
from ayon_core.tools.flickcharm import FlickCharm
from qtpy import QtWidgets, QtCore, QtGui, QtSvg
from qtpy import QtWidgets, QtCore, QtGui
class DeselectableTreeView(QtWidgets.QTreeView):
@ -19,48 +18,6 @@ class DeselectableTreeView(QtWidgets.QTreeView):
QtWidgets.QTreeView.mousePressEvent(self, event)
class TreeViewSpinner(QtWidgets.QTreeView):
size = 160
def __init__(self, parent=None):
super(TreeViewSpinner, self).__init__(parent=parent)
loading_image_path = get_image_path("spinner-200.svg")
self.spinner = QtSvg.QSvgRenderer(loading_image_path)
self.is_loading = False
self.is_empty = True
def paint_loading(self, event):
rect = event.rect()
rect = QtCore.QRectF(rect.topLeft(), rect.bottomRight())
rect.moveTo(
rect.x() + rect.width() / 2 - self.size / 2,
rect.y() + rect.height() / 2 - self.size / 2
)
rect.setSize(QtCore.QSizeF(self.size, self.size))
painter = QtGui.QPainter(self.viewport())
self.spinner.render(painter, rect)
def paint_empty(self, event):
painter = QtGui.QPainter(self.viewport())
rect = event.rect()
rect = QtCore.QRectF(rect.topLeft(), rect.bottomRight())
qtext_opt = QtGui.QTextOption(
QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter
)
painter.drawText(rect, "No Data", qtext_opt)
def paintEvent(self, event):
if self.is_loading:
self.paint_loading(event)
elif self.is_empty:
self.paint_empty(event)
else:
super(TreeViewSpinner, self).paintEvent(event)
class TreeView(QtWidgets.QTreeView):
"""Ultimate TreeView with flick charm and double click signals.

View file

@ -184,9 +184,10 @@ class WorkareaModel:
return items
for filename in os.listdir(workdir):
# We want to support both files and folders. e.g. Silhoutte uses
# folders as its project files. So we do not check whether it is
# a file or not.
filepath = os.path.join(workdir, filename)
if not os.path.isfile(filepath):
continue
ext = os.path.splitext(filename)[1].lower()
if ext not in self._extensions:

View file

@ -136,6 +136,8 @@ class FilesWidget(QtWidgets.QWidget):
# Initial setup
workarea_btn_open.setEnabled(False)
workarea_btn_browse.setEnabled(False)
workarea_btn_save.setEnabled(False)
published_btn_copy_n_open.setEnabled(False)
published_btn_change_context.setEnabled(False)
published_btn_cancel.setVisible(False)
@ -278,8 +280,9 @@ class FilesWidget(QtWidgets.QWidget):
self._published_btn_change_context.setEnabled(enabled)
def _update_workarea_btns_state(self):
enabled = self._is_save_enabled
enabled = self._is_save_enabled and self._valid_selected_context
self._workarea_btn_save.setEnabled(enabled)
self._workarea_btn_browse.setEnabled(self._valid_selected_context)
def _on_published_repre_changed(self, event):
self._valid_representation_id = event["representation_id"] is not None
@ -294,6 +297,7 @@ class FilesWidget(QtWidgets.QWidget):
and self._selected_task_id is not None
)
self._update_published_btns_state()
self._update_workarea_btns_state()
def _on_published_save_clicked(self):
result = self._exec_save_as_dialog()

View file

@ -113,6 +113,7 @@ class WorkfilesToolWindow(QtWidgets.QWidget):
main_layout = QtWidgets.QHBoxLayout(self)
main_layout.addWidget(pages_widget, 1)
main_layout.setContentsMargins(0, 0, 0, 0)
overlay_messages_widget = MessageOverlayObject(self)
overlay_invalid_host = InvalidHostOverlay(self)

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'core' version."""
__version__ = "1.0.12+dev"
__version__ = "1.1.0+dev"

View file

@ -1,6 +1,6 @@
name = "core"
title = "Core"
version = "1.0.12+dev"
version = "1.1.0+dev"
client_dir = "ayon_core"

39
poetry.lock generated
View file

@ -719,28 +719,29 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "ruff"
version = "0.3.7"
version = "0.9.4"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
{file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"},
{file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"},
{file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"},
{file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"},
{file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"},
{file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"},
{file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"},
{file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"},
{file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"},
{file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"},
{file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"},
{file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"},
{file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"},
{file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"},
{file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"},
{file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"},
{file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"},
{file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"},
{file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"},
{file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"},
{file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"},
{file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"},
{file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"},
]
[[package]]
@ -857,4 +858,4 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
[metadata]
lock-version = "2.0"
python-versions = ">=3.9.1,<3.10"
content-hash = "5fb5a45697502e537b9f6cf618d744a4cece4803ef65f6315186e83d1cd90f3a"
content-hash = "1b63a1723ed91520787257791fe7d9b55557e5e12b5c41661a83f1911bc42675"

View file

@ -5,7 +5,7 @@
[tool.poetry]
name = "ayon-core"
version = "1.0.12+dev"
version = "1.1.0+dev"
description = ""
authors = ["Ynput Team <team@ynput.io>"]
readme = "README.md"
@ -25,7 +25,7 @@ pytest = "^8.0"
pytest-print = "^1.0"
ayon-python-api = "^1.0"
# linting dependencies
ruff = "^0.3.3"
ruff = "^0.9.3"
pre-commit = "^4"
codespell = "^2.2.6"
semver = "^3.0.2"
@ -79,8 +79,7 @@ pydocstyle.convention = "google"
select = ["ALL"]
ignore = [
"PTH",
"ANN101",
"ANN102",
"ANN101", # must be set in older version of ruff
"ANN204",
"COM812",
"S603",
@ -90,7 +89,9 @@ ignore = [
"UP007", # ..^
"UP035", # ..
"ARG002",
"INP001" # add `__init__.py` to namespaced package
"INP001", # add `__init__.py` to namespaced package
"FIX002", # FIX all TODOs
"TD003", # missing issue link
]
# Allow fix for all enabled rules (when `--fix`) is provided.

View file

@ -1008,8 +1008,8 @@ DEFAULT_PUBLISH_VALUES = {
{"name": "model", "order": 100},
{"name": "assembly", "order": 150},
{"name": "groom", "order": 175},
{"name": "look", "order": 300},
{"name": "rig", "order": 100},
{"name": "look", "order": 200},
{"name": "rig", "order": 300},
# Shot layers
{"name": "layout", "order": 200},
{"name": "animation", "order": 300},
@ -1033,7 +1033,8 @@ DEFAULT_PUBLISH_VALUES = {
"maya",
"nuke",
"photoshop",
"substancepainter"
"substancepainter",
"silhouette",
],
"enabled": True,
"optional": False,
@ -1053,7 +1054,8 @@ DEFAULT_PUBLISH_VALUES = {
"harmony",
"photoshop",
"aftereffects",
"fusion"
"fusion",
"silhouette",
],
"enabled": True,
"optional": True,

View file

@ -0,0 +1,51 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976,
"value": 108.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976,
"value": 883159.0
}
},
"effects": [],
"markers": [],
"enabled": true,
"media_references": {
"DEFAULT_MEDIA": {
"OTIO_SCHEMA": "ImageSequenceReference.1",
"metadata": {},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 755.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 883750.0
}
},
"available_image_bounds": null,
"target_url_base": "/mnt/jobs/yahoo_theDog_1132/IN/FOOTAGE/SCANS_LINEAR/Panasonic Rec 709 to ACESCG/Panasonic P2 /A001_S001_S001_T004/",
"name_prefix": "A001_S001_S001_T004.",
"name_suffix": ".exr",
"start_frame": 883750,
"frame_step": 1,
"rate": 1.0,
"frame_zero_padding": 0,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,160 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 909986.0387191772
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "Speed",
"effect_name": "LinearTimeWarp",
"time_scalar": 2.0
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_retime_2x/sh010\", \"task\": null, \"clip_index\": \"37BA620A-6580-A543-ADF3-5A7133F41BB6\", \"hierarchy\": \"shots/hiero_retime_2x\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_retime_2x\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_retime_2x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_retime_2x\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"c60086c3-9ec3-448a-9bc5-6aa9f6af0fd5\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_retime_2x/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"8cdde735-d5a7-4f95-9cff-ded20ff21135\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 176.0, \"sourceOut\": 196.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_retime_2x/sh010\", \"task\": null, \"clip_index\": \"37BA620A-6580-A543-ADF3-5A7133F41BB6\", \"hierarchy\": \"shots/hiero_retime_2x\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_retime_2x\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_retime_2x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_retime_2x\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"c60086c3-9ec3-448a-9bc5-6aa9f6af0fd5\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"parent_instance_id\": \"8cdde735-d5a7-4f95-9cff-ded20ff21135\", \"label\": \"/shots/hiero_retime_2x/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"064a92fc-5704-4316-8cc9-780e430ae2e5\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_retime_2x/sh010 shotMain\", \"review\": true, \"reviewableSource\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"37BA620A-6580-A543-ADF3-5A7133F41BB6\"}",
"label": "AYONdata_3c3f54af",
"note": "AYON data container"
},
"name": "AYONdata_3c3f54af",
"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": {
"ayon.source.colorspace": "ACES - ACES2065-1",
"ayon.source.height": 720,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1280,
"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": "301",
"foundry.source.filename": "output.%07d.exr 948674-948974",
"foundry.source.filesize": "",
"foundry.source.fragments": "301",
"foundry.source.framerate": "25",
"foundry.source.fullpath": "",
"foundry.source.height": "720",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.%07d.exr 948674-948974",
"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": "output.%07d.exr 948674-948974",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "948674",
"foundry.source.timecode": "948674",
"foundry.source.umid": "28c4702f-5af7-4980-52c9-6eb875968890",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1280",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "ACES - ACES2065-1",
"foundry.timeline.duration": "301",
"foundry.timeline.framerate": "25",
"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,1278,718",
"media.exr.displayWindow": "0,0,1279,719",
"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": "2025-01-13 14:26:25",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.0948674.exr",
"media.input.filereader": "exr",
"media.input.filesize": "214941",
"media.input.frame": "1",
"media.input.height": "720",
"media.input.mtime": "2025-01-13 14:26:25",
"media.input.width": "1280",
"media.nuke.full_layer_names": "0",
"media.nuke.node_hash": "b13e3153b31d8f14",
"media.nuke.version": "15.0v5",
"padding": 7
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 301.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 948674.0
}
},
"available_image_bounds": null,
"target_url_base": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange\\",
"name_prefix": "output.",
"name_suffix": ".exr",
"start_frame": 948674,
"frame_step": 1,
"rate": 25.0,
"frame_zero_padding": 7,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,369 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {
"Resolve_OTIO": {}
},
"name": "output.[1001-1099].tif",
"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": 39.0
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "",
"effect_name": "",
"time_scalar": 2.0
},
{
"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": {
"-19": {
"Value": [
0.0,
0.0
],
"Variant Type": "POINTF"
},
"981": {
"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": {
"-19": {
"Value": 0.8,
"Variant Type": "Double"
},
"981": {
"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/resolve_2x/sh010\", \"task\": null, \"clip_variant\": \"<track_name>\", \"clip_index\": \"51983d2a-8a54-45fc-b17d-b837bdcb2545\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"/shots/resolve_2x/sh010\", \"episode\": \"ep01\", \"sequence\": \"resolve_2x\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/resolve_2x\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"resolve_2x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"resolve_2x\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"04cd97b0-7e6e-4f58-b8b1-5f1956d53bfb\", \"reviewTrack\": \"Video 1\", \"label\": \"/shots/resolve_2x/sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"cc8b970c-69c1-4eab-b94f-ae41358a80ba\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 86400, \"clipOut\": 86411, \"clipDuration\": 11, \"sourceIn\": 19, \"sourceOut\": 30, \"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/resolve_2x/sh010\", \"task\": null, \"clip_variant\": \"<track_name>\", \"clip_index\": \"51983d2a-8a54-45fc-b17d-b837bdcb2545\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"/shots/resolve_2x/sh010\", \"episode\": \"ep01\", \"sequence\": \"resolve_2x\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/resolve_2x\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"resolve_2x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"resolve_2x\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"04cd97b0-7e6e-4f58-b8b1-5f1956d53bfb\", \"reviewTrack\": \"Video 1\", \"parent_instance_id\": \"cc8b970c-69c1-4eab-b94f-ae41358a80ba\", \"label\": \"/shots/resolve_2x/sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"564ef731-c518-4c8f-918d-b27d0c35856c\", \"creator_attributes\": {\"parentInstance\": \"/shots/resolve_2x/sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"51983d2a-8a54-45fc-b17d-b837bdcb2545\", \"publish\": true}"
},
"clip_index": "51983d2a-8a54-45fc-b17d-b837bdcb2545",
"publish": true,
"resolve_sub_products": {
"io.ayon.creators.resolve.plate": {
"active": true,
"clip_index": "51983d2a-8a54-45fc-b17d-b837bdcb2545",
"clip_source_resolution": {
"height": "1080",
"pixelAspect": 1.0,
"width": "1920"
},
"clip_variant": "<track_name>",
"creator_attributes": {
"parentInstance": "/shots/resolve_2x/sh010 shot",
"vSyncOn": false,
"vSyncTrack": "Video 1"
},
"creator_identifier": "io.ayon.creators.resolve.plate",
"episode": "ep01",
"folder": "/shots/resolve_2x/sh010",
"folderPath": "/shots/resolve_2x/sh010",
"handleEnd": 10,
"handleStart": 10,
"has_promised_context": true,
"heroTrack": true,
"hierarchy": "shots/resolve_2x",
"hierarchyData": {
"episode": "ep01",
"folder": "shots",
"sequence": "resolve_2x",
"shot": "sh010",
"track": "Video_1"
},
"id": "pyblish.avalon.instance",
"instance_id": "564ef731-c518-4c8f-918d-b27d0c35856c",
"label": "/shots/resolve_2x/sh010 plate",
"newAssetPublishing": true,
"newHierarchyIntegration": true,
"parent_instance_id": "cc8b970c-69c1-4eab-b94f-ae41358a80ba",
"parents": [
{
"entity_name": "shots",
"folder_type": "folder"
},
{
"entity_name": "resolve_2x",
"folder_type": "sequence"
}
],
"productName": "plateVideo_1",
"productType": "plate",
"publish_attributes": {
"CollectSlackFamilies": {
"additional_message": ""
}
},
"reviewTrack": "Video 1",
"sequence": "resolve_2x",
"shot": "sh###",
"sourceResolution": false,
"task": null,
"track": "{_track_}",
"uuid": "04cd97b0-7e6e-4f58-b8b1-5f1956d53bfb",
"variant": "Video_1",
"workfileFrameStart": 1001
},
"io.ayon.creators.resolve.shot": {
"active": true,
"clip_index": "51983d2a-8a54-45fc-b17d-b837bdcb2545",
"clip_source_resolution": {
"height": "1080",
"pixelAspect": 1.0,
"width": "1920"
},
"clip_variant": "<track_name>",
"creator_attributes": {
"clipDuration": 11,
"clipIn": 86400,
"clipOut": 86411,
"fps": "from_selection",
"frameEnd": 1012,
"frameStart": 1001,
"handleEnd": 10,
"handleStart": 10,
"sourceIn": 19,
"sourceOut": 30,
"workfileFrameStart": 1001
},
"creator_identifier": "io.ayon.creators.resolve.shot",
"episode": "ep01",
"folder": "/shots/resolve_2x/sh010",
"folderPath": "/shots/resolve_2x/sh010",
"handleEnd": 10,
"handleStart": 10,
"has_promised_context": true,
"heroTrack": true,
"hierarchy": "shots/resolve_2x",
"hierarchyData": {
"episode": "ep01",
"folder": "shots",
"sequence": "resolve_2x",
"shot": "sh010",
"track": "Video_1"
},
"id": "pyblish.avalon.instance",
"instance_id": "cc8b970c-69c1-4eab-b94f-ae41358a80ba",
"label": "/shots/resolve_2x/sh010 shot",
"newAssetPublishing": true,
"newHierarchyIntegration": true,
"parents": [
{
"entity_name": "shots",
"folder_type": "folder"
},
{
"entity_name": "resolve_2x",
"folder_type": "sequence"
}
],
"productName": "shotMain",
"productType": "shot",
"publish_attributes": {
"CollectSlackFamilies": {
"additional_message": ""
}
},
"reviewTrack": "Video 1",
"sequence": "resolve_2x",
"shot": "sh###",
"sourceResolution": false,
"task": null,
"track": "{_track_}",
"uuid": "04cd97b0-7e6e-4f58-b8b1-5f1956d53bfb",
"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": 24.0
}
},
"comment": ""
}
],
"enabled": true,
"media_references": {
"DEFAULT_MEDIA": {
"OTIO_SCHEMA": "ImageSequenceReference.1",
"metadata": {},
"name": "output.[1001-1099].tif",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 99.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 0.0
}
},
"available_image_bounds": null,
"target_url_base": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\data\\img_sequence\\tif",
"name_prefix": "output.",
"name_suffix": ".tif",
"start_frame": 1001,
"frame_step": 1,
"rate": 24.0,
"frame_zero_padding": 4,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,181 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 909986.0387191772
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "Speed",
"effect_name": "LinearTimeWarp",
"time_scalar": 2.0
},
{
"OTIO_SCHEMA": "TimeEffect.1",
"metadata": {
"length": 4.0,
"lookup": [
2.0,
1.7039999923706057,
1.431999991416931,
1.2079999942779533,
1.055999998092652,
1.0,
1.056000007629395,
1.208000022888184,
1.432000034332276,
1.7040000305175766,
2.0
]
},
"name": "TimeWarp6",
"effect_name": "TimeWarp"
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_img_seq_tw_speed/sh010\", \"task\": null, \"clip_index\": \"699C12C3-07B7-E74E-A8BC-07554560B91E\", \"hierarchy\": \"shots/hiero_img_seq_tw_speed\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_img_seq_tw_speed\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": null, \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 0, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_img_seq_tw_speed\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_img_seq_tw_speed\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"731977d8-6f06-415d-9086-b04b58a16ce3\", \"reviewTrack\": null, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_img_seq_tw_speed/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"d157ce1c-3157-4a34-a8b5-14c881387239\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 0, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 176.0, \"sourceOut\": 196.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_img_seq_tw_speed/sh010\", \"task\": null, \"clip_index\": \"699C12C3-07B7-E74E-A8BC-07554560B91E\", \"hierarchy\": \"shots/hiero_img_seq_tw_speed\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_img_seq_tw_speed\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": null, \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 0, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_img_seq_tw_speed\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_img_seq_tw_speed\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"731977d8-6f06-415d-9086-b04b58a16ce3\", \"reviewTrack\": null, \"folderName\": \"sh010\", \"parent_instance_id\": \"d157ce1c-3157-4a34-a8b5-14c881387239\", \"label\": \"/shots/hiero_img_seq_tw_speed/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"daf5d8e4-5698-4a41-90eb-05eea2992dff\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_img_seq_tw_speed/sh010 shotMain\", \"review\": false, \"reviewableSource\": \"clip_media\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"699C12C3-07B7-E74E-A8BC-07554560B91E\"}",
"label": "AYONdata_9f37cdbf",
"note": "AYON data container"
},
"name": "AYONdata_9f37cdbf",
"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": {
"ayon.source.colorspace": "ACES - ACES2065-1",
"ayon.source.height": 720,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1280,
"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": "301",
"foundry.source.filename": "output.%07d.exr 948674-948974",
"foundry.source.filesize": "",
"foundry.source.fragments": "301",
"foundry.source.framerate": "25",
"foundry.source.fullpath": "",
"foundry.source.height": "720",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.%07d.exr 948674-948974",
"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": "output.%07d.exr 948674-948974",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "948674",
"foundry.source.timecode": "948674",
"foundry.source.umid": "28c4702f-5af7-4980-52c9-6eb875968890",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1280",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "ACES - ACES2065-1",
"foundry.timeline.duration": "301",
"foundry.timeline.framerate": "25",
"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,1278,718",
"media.exr.displayWindow": "0,0,1279,719",
"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": "2025-01-13 14:26:25",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.0948674.exr",
"media.input.filereader": "exr",
"media.input.filesize": "214941",
"media.input.frame": "1",
"media.input.height": "720",
"media.input.mtime": "2025-01-13 14:26:25",
"media.input.width": "1280",
"media.nuke.full_layer_names": "0",
"media.nuke.node_hash": "b13e3153b31d8f14",
"media.nuke.version": "15.0v5",
"padding": 7
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 301.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 948674.0
}
},
"available_image_bounds": null,
"target_url_base": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange\\",
"name_prefix": "output.",
"name_suffix": ".exr",
"start_frame": 948674,
"frame_step": 1,
"rate": 25.0,
"frame_zero_padding": 7,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,160 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 5.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 909990.8339241028
}
},
"effects": [
{
"OTIO_SCHEMA": "FreezeFrame.1",
"metadata": {},
"name": "FreezeFrame",
"effect_name": "FreezeFrame",
"time_scalar": 0.0
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_freeze_frame/sh010\", \"task\": null, \"clip_index\": \"85ABEEEA-6A90-CE47-9DE2-73BAB11EE31D\", \"hierarchy\": \"shots/hiero_freeze_frame\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_freeze_frame\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_freeze_frame\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_freeze_frame\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"08ba1c0a-fc51-4275-b6c8-1cb81381b043\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_freeze_frame/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"892de813-fc78-4d92-b25f-4ea5c4791bb8\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1006, \"clipIn\": 0, \"clipOut\": 4, \"clipDuration\": 5, \"sourceIn\": 181.0, \"sourceOut\": 181.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_freeze_frame/sh010\", \"task\": null, \"clip_index\": \"85ABEEEA-6A90-CE47-9DE2-73BAB11EE31D\", \"hierarchy\": \"shots/hiero_freeze_frame\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_freeze_frame\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_freeze_frame\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_freeze_frame\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"08ba1c0a-fc51-4275-b6c8-1cb81381b043\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"parent_instance_id\": \"892de813-fc78-4d92-b25f-4ea5c4791bb8\", \"label\": \"/shots/hiero_freeze_frame/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"24eb8386-4c42-4439-ac41-17ec4efb0073\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_freeze_frame/sh010 shotMain\", \"review\": true, \"reviewableSource\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"85ABEEEA-6A90-CE47-9DE2-73BAB11EE31D\"}",
"label": "AYONdata_a8304fcf",
"note": "AYON data container"
},
"name": "AYONdata_a8304fcf",
"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": {
"ayon.source.colorspace": "ACES - ACES2065-1",
"ayon.source.height": 720,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1280,
"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": "301",
"foundry.source.filename": "output.%07d.exr 948674-948974",
"foundry.source.filesize": "",
"foundry.source.fragments": "301",
"foundry.source.framerate": "25",
"foundry.source.fullpath": "",
"foundry.source.height": "720",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.%07d.exr 948674-948974",
"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": "output.%07d.exr 948674-948974",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "948674",
"foundry.source.timecode": "948674",
"foundry.source.umid": "28c4702f-5af7-4980-52c9-6eb875968890",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1280",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "ACES - ACES2065-1",
"foundry.timeline.duration": "301",
"foundry.timeline.framerate": "25",
"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,1278,718",
"media.exr.displayWindow": "0,0,1279,719",
"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": "2025-01-13 14:26:25",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.0948674.exr",
"media.input.filereader": "exr",
"media.input.filesize": "214941",
"media.input.frame": "1",
"media.input.height": "720",
"media.input.mtime": "2025-01-13 14:26:25",
"media.input.width": "1280",
"media.nuke.full_layer_names": "0",
"media.nuke.node_hash": "b13e3153b31d8f14",
"media.nuke.version": "15.0v5",
"padding": 7
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 301.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 948674.0
}
},
"available_image_bounds": null,
"target_url_base": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange\\",
"name_prefix": "output.",
"name_suffix": ".exr",
"start_frame": 948674,
"frame_step": 1,
"rate": 25.0,
"frame_zero_padding": 7,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,216 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 909986.0387191772
}
},
"effects": [
{
"OTIO_SCHEMA": "TimeEffect.1",
"metadata": {
"length": 1.0,
"lookup": [
-5.0,
-3.9440000305175777,
-2.852000034332275,
-1.6880000228881844,
-0.4160000076293944,
1.0,
2.5839999923706056,
4.311999977111817,
6.147999965667726,
8.055999969482421,
10.0
]
},
"name": "TimeWarp3",
"effect_name": "TimeWarp"
},
{
"OTIO_SCHEMA": "TimeEffect.1",
"metadata": {
"length": 1.0,
"lookup": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"name": "TimeWarp4",
"effect_name": "TimeWarp"
},
{
"OTIO_SCHEMA": "TimeEffect.1",
"metadata": {
"length": 1.0,
"lookup": [
0.0,
-1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-1.0
]
},
"name": "TimeWarp5",
"effect_name": "TimeWarp"
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_seq_max_tw/sh010\", \"task\": null, \"clip_index\": \"4C055A68-8354-474A-A6F8-B0CBF9A537CD\", \"hierarchy\": \"shots/hiero_seq_max_tw\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": null, \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_seq_max_tw\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"5e82a346-17c4-4ccb-a795-35e1a809b243\", \"reviewTrack\": null, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_seq_max_tw/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"9cb2a119-8aa6-487e-a46b-9b9ff25323be\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 176.0, \"sourceOut\": 186.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_seq_max_tw/sh010\", \"task\": null, \"clip_index\": \"4C055A68-8354-474A-A6F8-B0CBF9A537CD\", \"hierarchy\": \"shots/hiero_seq_max_tw\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": null, \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_seq_max_tw\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"5e82a346-17c4-4ccb-a795-35e1a809b243\", \"reviewTrack\": null, \"folderName\": \"sh010\", \"parent_instance_id\": \"9cb2a119-8aa6-487e-a46b-9b9ff25323be\", \"label\": \"/shots/hiero_seq_max_tw/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"771e41ed-74b0-4fcc-882c-6a248d45a464\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_seq_max_tw/sh010 shotMain\", \"review\": false, \"reviewableSource\": \"clip_media\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"4C055A68-8354-474A-A6F8-B0CBF9A537CD\"}",
"label": "AYONdata_b6896763",
"note": "AYON data container"
},
"name": "AYONdata_b6896763",
"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": {
"ayon.source.colorspace": "ACES - ACES2065-1",
"ayon.source.height": 720,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1280,
"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": "301",
"foundry.source.filename": "output.%07d.exr 948674-948974",
"foundry.source.filesize": "",
"foundry.source.fragments": "301",
"foundry.source.framerate": "25",
"foundry.source.fullpath": "",
"foundry.source.height": "720",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.%07d.exr 948674-948974",
"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": "output.%07d.exr 948674-948974",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "948674",
"foundry.source.timecode": "948674",
"foundry.source.umid": "28c4702f-5af7-4980-52c9-6eb875968890",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1280",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "ACES - ACES2065-1",
"foundry.timeline.duration": "301",
"foundry.timeline.framerate": "25",
"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,1278,718",
"media.exr.displayWindow": "0,0,1279,719",
"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": "2025-01-13 14:26:25",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.0948674.exr",
"media.input.filereader": "exr",
"media.input.filesize": "214941",
"media.input.frame": "1",
"media.input.height": "720",
"media.input.mtime": "2025-01-13 14:26:25",
"media.input.width": "1280",
"media.nuke.full_layer_names": "0",
"media.nuke.node_hash": "b13e3153b31d8f14",
"media.nuke.version": "15.0v5",
"padding": 7
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 301.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 948674.0
}
},
"available_image_bounds": null,
"target_url_base": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange\\",
"name_prefix": "output.",
"name_suffix": ".exr",
"start_frame": 948674,
"frame_step": 1,
"rate": 25.0,
"frame_zero_padding": 7,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,235 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "img_seq_revsh0010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 41.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 1040.0
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "Speed",
"effect_name": "LinearTimeWarp",
"time_scalar": -0.7
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"clip_index": "e7fede03-d769-4827-a014-35b50170e914",
"flame_sub_products": {
"io.ayon.creators.flame.plate": {
"active": true,
"clipName": "{sequence}{shot}",
"clipRename": true,
"clipVariant": "<track_name>",
"clip_index": "e7fede03-d769-4827-a014-35b50170e914",
"countFrom": 10,
"countSteps": 10,
"creator_attributes": {
"parentInstance": "/test_robin/img_seq_rev/img_seq_revsh0010 shot",
"review": false,
"reviewableSource": "clip_media"
},
"creator_identifier": "io.ayon.creators.flame.plate",
"episode": "ep01",
"export_audio": false,
"folder": "test_robin",
"folderName": "img_seq_revsh0010",
"folderPath": "/test_robin/img_seq_rev/img_seq_revsh0010",
"handleEnd": 5,
"handleStart": 5,
"heroTrack": true,
"hierarchy": "test_robin/img_seq_rev",
"hierarchyData": {
"episode": "ep01",
"folder": "test_robin",
"sequence": "img_seq_rev",
"track": "noname1"
},
"id": "pyblish.avalon.instance",
"includeHandles": false,
"instance_id": "a06107cd-49ad-48cb-a84f-67f53dfd58ef",
"label": "/test_robin/img_seq_rev/img_seq_revsh0010 plateNoname1",
"newAssetPublishing": true,
"newHierarchyIntegration": true,
"parent_instance_id": "896c2dad-03a6-4a18-97f5-ecf8f00a6180",
"parents": [
{
"entity_name": "test_robin",
"folder_type": "folder"
},
{
"entity_name": "img_seq_rev",
"folder_type": "sequence"
}
],
"productName": "plateNoname1",
"productType": "plate",
"publish": true,
"publish_attributes": {},
"retimedFramerange": true,
"retimedHandles": true,
"reviewTrack": null,
"reviewableSource": null,
"segmentIndex": true,
"sequence": "img_seq_rev",
"shot": "sh####",
"sourceResolution": false,
"task": null,
"track": "{_track_}",
"useShotName": false,
"use_selection": true,
"vSyncOn": false,
"vSyncTrack": "*",
"variant": "noname1",
"workfileFrameStart": 1001
},
"io.ayon.creators.flame.shot": {
"active": true,
"clipName": "{sequence}{shot}",
"clipRename": true,
"clipVariant": "<track_name>",
"clip_index": "e7fede03-d769-4827-a014-35b50170e914",
"countFrom": 10,
"countSteps": 10,
"creator_attributes": {
"clipDuration": 41,
"clipIn": 1,
"clipOut": 41,
"fps": "from_selection",
"frameEnd": 1042,
"frameStart": 1001,
"handleEnd": 5,
"handleStart": 5,
"includeHandles": false,
"retimedFramerange": true,
"retimedHandles": true,
"sourceIn": 1068,
"sourceOut": 1040,
"workfileFrameStart": 1001
},
"creator_identifier": "io.ayon.creators.flame.shot",
"episode": "ep01",
"export_audio": false,
"folder": "test_robin",
"folderName": "img_seq_revsh0010",
"folderPath": "/test_robin/img_seq_rev/img_seq_revsh0010",
"handleEnd": 5,
"handleStart": 5,
"heroTrack": true,
"hierarchy": "test_robin/img_seq_rev",
"hierarchyData": {
"episode": "ep01",
"folder": "test_robin",
"sequence": "img_seq_rev",
"track": "noname1"
},
"id": "pyblish.avalon.instance",
"includeHandles": false,
"instance_id": "896c2dad-03a6-4a18-97f5-ecf8f00a6180",
"label": "/test_robin/img_seq_rev/img_seq_revsh0010 shot",
"newAssetPublishing": true,
"newHierarchyIntegration": true,
"parents": [
{
"entity_name": "test_robin",
"folder_type": "folder"
},
{
"entity_name": "img_seq_rev",
"folder_type": "sequence"
}
],
"productName": "shotMain",
"productType": "shot",
"publish": true,
"publish_attributes": {},
"retimedFramerange": true,
"retimedHandles": true,
"reviewTrack": null,
"reviewableSource": null,
"segmentIndex": true,
"sequence": "img_seq_rev",
"shot": "sh####",
"sourceResolution": false,
"task": null,
"track": "{_track_}",
"useShotName": false,
"use_selection": true,
"vSyncOn": false,
"vSyncTrack": "*",
"variant": "main",
"workfileFrameStart": 1001
}
},
"publish": true
},
"name": "AYONData",
"color": "CYAN",
"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": 22.0
}
},
"comment": ""
}
],
"enabled": true,
"media_references": {
"DEFAULT_MEDIA": {
"OTIO_SCHEMA": "ImageSequenceReference.1",
"metadata": {
"ayon.source.height": 1080,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1920,
"isSequence": true,
"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": "/home/ynput/CODE/testing_flame/test_data/sample_media_robin/Samples media/img_sequence/tif/",
"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"
}

View file

@ -0,0 +1,59 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976,
"value": 32.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976,
"value": 947726.0
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "",
"effect_name": "LinearTimeWarp",
"time_scalar": -1.0
}
],
"markers": [],
"enabled": true,
"media_references": {
"DEFAULT_MEDIA": {
"OTIO_SCHEMA": "ImageSequenceReference.1",
"metadata": {},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 7607.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 941478.0
}
},
"available_image_bounds": null,
"target_url_base": "/mnt/jobs/yahoo_theDog_1132/IN/FOOTAGE/SCANS_LINEAR/Panasonic Rec 709 to ACESCG/Panasonic P2 /A001_S001_S001_T012/",
"name_prefix": "A001_S001_S001_T012.",
"name_suffix": ".exr",
"start_frame": 941478,
"frame_step": 1,
"rate": 24.0,
"frame_zero_padding": 0,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,369 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {
"Resolve_OTIO": {}
},
"name": "output.[1000-1099].tif",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 41.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 24.0,
"value": 20.000000000000004
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "",
"effect_name": "",
"time_scalar": -1.0
},
{
"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": {
"-39": {
"Value": [
0.0,
0.0
],
"Variant Type": "POINTF"
},
"961": {
"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": {
"-39": {
"Value": 0.8,
"Variant Type": "Double"
},
"961": {
"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/reverse_speed/sh010\", \"task\": null, \"clip_variant\": \"<track_name>\", \"clip_index\": \"2cb93726-2f27-41b0-b7f7-f48998327ce8\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"/shots/reverse_speed/sh010\", \"episode\": \"ep01\", \"sequence\": \"reverse_speed\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/reverse_speed\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"reverse_speed\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"reverse_speed\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"d08c8422-29a9-46e9-9d6d-37e2dd9f9f8b\", \"reviewTrack\": null, \"label\": \"/shots/reverse_speed/sh010 shot\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"087e8c66-3ce7-41bf-a27e-3e5f7abc12fb\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1042, \"clipIn\": 86400, \"clipOut\": 86441, \"clipDuration\": 41, \"sourceIn\": 39, \"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/reverse_speed/sh010\", \"task\": null, \"clip_variant\": \"<track_name>\", \"clip_index\": \"2cb93726-2f27-41b0-b7f7-f48998327ce8\", \"clip_source_resolution\": {\"width\": \"1920\", \"height\": \"1080\", \"pixelAspect\": 1.0}, \"folder\": \"/shots/reverse_speed/sh010\", \"episode\": \"ep01\", \"sequence\": \"reverse_speed\", \"track\": \"{_track_}\", \"shot\": \"sh###\", \"hierarchy\": \"shots/reverse_speed\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"folder_type\": \"sequence\", \"entity_name\": \"reverse_speed\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"reverse_speed\", \"track\": \"Video_1\", \"shot\": \"sh010\"}, \"heroTrack\": true, \"uuid\": \"d08c8422-29a9-46e9-9d6d-37e2dd9f9f8b\", \"reviewTrack\": null, \"parent_instance_id\": \"087e8c66-3ce7-41bf-a27e-3e5f7abc12fb\", \"label\": \"/shots/reverse_speed/sh010 plate\", \"has_promised_context\": true, \"newHierarchyIntegration\": true, \"newAssetPublishing\": true, \"instance_id\": \"63b97e7f-834f-490d-bba5-ae0e584f4a17\", \"creator_attributes\": {\"parentInstance\": \"/shots/reverse_speed/sh010 shot\", \"vSyncOn\": false, \"vSyncTrack\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"2cb93726-2f27-41b0-b7f7-f48998327ce8\", \"publish\": true}"
},
"clip_index": "2cb93726-2f27-41b0-b7f7-f48998327ce8",
"publish": true,
"resolve_sub_products": {
"io.ayon.creators.resolve.plate": {
"active": true,
"clip_index": "2cb93726-2f27-41b0-b7f7-f48998327ce8",
"clip_source_resolution": {
"height": "1080",
"pixelAspect": 1.0,
"width": "1920"
},
"clip_variant": "<track_name>",
"creator_attributes": {
"parentInstance": "/shots/reverse_speed/sh010 shot",
"vSyncOn": false,
"vSyncTrack": "Video 1"
},
"creator_identifier": "io.ayon.creators.resolve.plate",
"episode": "ep01",
"folder": "/shots/reverse_speed/sh010",
"folderPath": "/shots/reverse_speed/sh010",
"handleEnd": 10,
"handleStart": 10,
"has_promised_context": true,
"heroTrack": true,
"hierarchy": "shots/reverse_speed",
"hierarchyData": {
"episode": "ep01",
"folder": "shots",
"sequence": "reverse_speed",
"shot": "sh010",
"track": "Video_1"
},
"id": "pyblish.avalon.instance",
"instance_id": "63b97e7f-834f-490d-bba5-ae0e584f4a17",
"label": "/shots/reverse_speed/sh010 plate",
"newAssetPublishing": true,
"newHierarchyIntegration": true,
"parent_instance_id": "087e8c66-3ce7-41bf-a27e-3e5f7abc12fb",
"parents": [
{
"entity_name": "shots",
"folder_type": "folder"
},
{
"entity_name": "reverse_speed",
"folder_type": "sequence"
}
],
"productName": "plateVideo_1",
"productType": "plate",
"publish_attributes": {
"CollectSlackFamilies": {
"additional_message": ""
}
},
"reviewTrack": null,
"sequence": "reverse_speed",
"shot": "sh###",
"sourceResolution": false,
"task": null,
"track": "{_track_}",
"uuid": "d08c8422-29a9-46e9-9d6d-37e2dd9f9f8b",
"variant": "Video_1",
"workfileFrameStart": 1001
},
"io.ayon.creators.resolve.shot": {
"active": true,
"clip_index": "2cb93726-2f27-41b0-b7f7-f48998327ce8",
"clip_source_resolution": {
"height": "1080",
"pixelAspect": 1.0,
"width": "1920"
},
"clip_variant": "<track_name>",
"creator_attributes": {
"clipDuration": 41,
"clipIn": 86400,
"clipOut": 86441,
"fps": "from_selection",
"frameEnd": 1042,
"frameStart": 1001,
"handleEnd": 10,
"handleStart": 10,
"sourceIn": 39,
"sourceOut": 80,
"workfileFrameStart": 1001
},
"creator_identifier": "io.ayon.creators.resolve.shot",
"episode": "ep01",
"folder": "/shots/reverse_speed/sh010",
"folderPath": "/shots/reverse_speed/sh010",
"handleEnd": 10,
"handleStart": 10,
"has_promised_context": true,
"heroTrack": true,
"hierarchy": "shots/reverse_speed",
"hierarchyData": {
"episode": "ep01",
"folder": "shots",
"sequence": "reverse_speed",
"shot": "sh010",
"track": "Video_1"
},
"id": "pyblish.avalon.instance",
"instance_id": "087e8c66-3ce7-41bf-a27e-3e5f7abc12fb",
"label": "/shots/reverse_speed/sh010 shot",
"newAssetPublishing": true,
"newHierarchyIntegration": true,
"parents": [
{
"entity_name": "shots",
"folder_type": "folder"
},
{
"entity_name": "reverse_speed",
"folder_type": "sequence"
}
],
"productName": "shotMain",
"productType": "shot",
"publish_attributes": {
"CollectSlackFamilies": {
"additional_message": ""
}
},
"reviewTrack": null,
"sequence": "reverse_speed",
"shot": "sh###",
"sourceResolution": false,
"task": null,
"track": "{_track_}",
"uuid": "d08c8422-29a9-46e9-9d6d-37e2dd9f9f8b",
"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": 59.0
}
},
"comment": ""
}
],
"enabled": true,
"media_references": {
"DEFAULT_MEDIA": {
"OTIO_SCHEMA": "ImageSequenceReference.1",
"metadata": {},
"name": "output.[1000-1099].tif",
"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": 0.0
}
},
"available_image_bounds": null,
"target_url_base": "C:\\Users\\robin\\OneDrive\\Bureau\\dev_ayon\\data\\img_sequence\\tif",
"name_prefix": "output.",
"name_suffix": ".tif",
"start_frame": 1000,
"frame_step": 1,
"rate": 24.0,
"frame_zero_padding": 4,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,174 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 909986.0387191772
}
},
"effects": [
{
"OTIO_SCHEMA": "TimeEffect.1",
"metadata": {
"length": 1.0,
"lookup": [
-5.0,
-3.9440000305175777,
-2.852000034332275,
-1.6880000228881844,
-0.4160000076293944,
1.0,
2.5839999923706056,
4.311999977111817,
6.147999965667726,
8.055999969482421,
10.0
]
},
"name": "TimeWarp3",
"effect_name": "TimeWarp"
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_seq_max_tw/sh010\", \"task\": null, \"clip_index\": \"4C055A68-8354-474A-A6F8-B0CBF9A537CD\", \"hierarchy\": \"shots/hiero_seq_max_tw\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": null, \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_seq_max_tw\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"5e82a346-17c4-4ccb-a795-35e1a809b243\", \"reviewTrack\": null, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_seq_max_tw/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"9cb2a119-8aa6-487e-a46b-9b9ff25323be\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 176.0, \"sourceOut\": 186.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_seq_max_tw/sh010\", \"task\": null, \"clip_index\": \"4C055A68-8354-474A-A6F8-B0CBF9A537CD\", \"hierarchy\": \"shots/hiero_seq_max_tw\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": null, \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_seq_max_tw\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_max_tw\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"5e82a346-17c4-4ccb-a795-35e1a809b243\", \"reviewTrack\": null, \"folderName\": \"sh010\", \"parent_instance_id\": \"9cb2a119-8aa6-487e-a46b-9b9ff25323be\", \"label\": \"/shots/hiero_seq_max_tw/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"771e41ed-74b0-4fcc-882c-6a248d45a464\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_seq_max_tw/sh010 shotMain\", \"review\": false, \"reviewableSource\": \"clip_media\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"4C055A68-8354-474A-A6F8-B0CBF9A537CD\"}",
"label": "AYONdata_b6896763",
"note": "AYON data container"
},
"name": "AYONdata_b6896763",
"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": {
"ayon.source.colorspace": "ACES - ACES2065-1",
"ayon.source.height": 720,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1280,
"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": "301",
"foundry.source.filename": "output.%07d.exr 948674-948974",
"foundry.source.filesize": "",
"foundry.source.fragments": "301",
"foundry.source.framerate": "25",
"foundry.source.fullpath": "",
"foundry.source.height": "720",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.%07d.exr 948674-948974",
"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": "output.%07d.exr 948674-948974",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "948674",
"foundry.source.timecode": "948674",
"foundry.source.umid": "28c4702f-5af7-4980-52c9-6eb875968890",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1280",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "ACES - ACES2065-1",
"foundry.timeline.duration": "301",
"foundry.timeline.framerate": "25",
"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,1278,718",
"media.exr.displayWindow": "0,0,1279,719",
"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": "2025-01-13 14:26:25",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.0948674.exr",
"media.input.filereader": "exr",
"media.input.filesize": "214941",
"media.input.frame": "1",
"media.input.height": "720",
"media.input.mtime": "2025-01-13 14:26:25",
"media.input.width": "1280",
"media.nuke.full_layer_names": "0",
"media.nuke.node_hash": "b13e3153b31d8f14",
"media.nuke.version": "15.0v5",
"padding": 7
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 301.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 948674.0
}
},
"available_image_bounds": null,
"target_url_base": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange\\",
"name_prefix": "output.",
"name_suffix": ".exr",
"start_frame": 948674,
"frame_step": 1,
"rate": 25.0,
"frame_zero_padding": 7,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,174 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "Main088sh110",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 82.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 1937905.9905694576
}
},
"effects": [],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/088/Main088sh110\", \"task\": null, \"clip_index\": \"70C9FA86-76A5-A045-A004-3158FB3F27C5\", \"hierarchy\": \"shots/088\", \"folder\": \"shots\", \"episode\": \"404\", \"sequence\": \"088\", \"track\": \"Main\", \"shot\": \"sh110\", \"reviewableSource\": \"Reference\", \"sourceResolution\": false, \"workfileFrameStart\": 1009, \"handleStart\": 8, \"handleEnd\": 8, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"088\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"404\", \"sequence\": \"088\", \"track\": \"Main\"}, \"heroTrack\": true, \"uuid\": \"8b0d1db8-7094-48ba-b2cd-df0d43cfffda\", \"reviewTrack\": \"Reference\", \"review\": true, \"folderName\": \"Main088sh110\", \"label\": \"/shots/088/Main088sh110 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"f6b7f12c-f3a8-44fd-b4e4-acc63ed80bb1\", \"creator_attributes\": {\"workfileFrameStart\": 1009, \"handleStart\": 8, \"handleEnd\": 8, \"frameStart\": 1009, \"frameEnd\": 1091, \"clipIn\": 80, \"clipOut\": 161, \"clipDuration\": 82, \"sourceIn\": 8.0, \"sourceOut\": 89.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Main\", \"folderPath\": \"/shots/088/Main088sh110\", \"task\": null, \"clip_index\": \"70C9FA86-76A5-A045-A004-3158FB3F27C5\", \"hierarchy\": \"shots/088\", \"folder\": \"shots\", \"episode\": \"404\", \"sequence\": \"088\", \"track\": \"Main\", \"shot\": \"sh110\", \"reviewableSource\": \"Reference\", \"sourceResolution\": false, \"workfileFrameStart\": 1009, \"handleStart\": 8, \"handleEnd\": 8, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"088\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"404\", \"sequence\": \"088\", \"track\": \"Main\"}, \"heroTrack\": true, \"uuid\": \"8b0d1db8-7094-48ba-b2cd-df0d43cfffda\", \"reviewTrack\": \"Reference\", \"review\": true, \"folderName\": \"Main088sh110\", \"parent_instance_id\": \"f6b7f12c-f3a8-44fd-b4e4-acc63ed80bb1\", \"label\": \"/shots/088/Main088sh110 plateMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"64b54c11-7ab1-45ef-b156-9ed5d5552b9b\", \"creator_attributes\": {\"parentInstance\": \"/shots/088/Main088sh110 shotMain\", \"review\": true, \"reviewableSource\": \"Reference\"}, \"publish_attributes\": {}}}, \"clip_index\": \"70C9FA86-76A5-A045-A004-3158FB3F27C5\"}",
"label": "AYONdata_6b797112",
"note": "AYON data container"
},
"name": "AYONdata_6b797112",
"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
}
},
"comment": ""
}
],
"enabled": true,
"media_references": {
"DEFAULT_MEDIA": {
"OTIO_SCHEMA": "ImageSequenceReference.1",
"metadata": {
"ayon.source.colorspace": "Input - Sony - Linear - Venice S-Gamut3.Cine",
"ayon.source.height": 2160,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 4096,
"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": "Input - Sony - Linear - Venice S-Gamut3.Cine",
"foundry.source.duration": "98",
"foundry.source.filename": "409_083_0015.%04d.exr 1001-1098",
"foundry.source.filesize": "",
"foundry.source.fragments": "98",
"foundry.source.framerate": "23.98",
"foundry.source.fullpath": "",
"foundry.source.height": "2160",
"foundry.source.layers": "colour",
"foundry.source.path": "X:/prj/AYON_CIRCUIT_TEST/data/OBX_20240729_P159_DOG_409/EXR/409_083_0015/409_083_0015.%04d.exr 1001-1098",
"foundry.source.pixelAspect": "1",
"foundry.source.pixelAspectRatio": "",
"foundry.source.pixelformat": "RGBA (Float16) Open Color IO space: 368",
"foundry.source.reelID": "",
"foundry.source.resolution": "",
"foundry.source.samplerate": "Invalid",
"foundry.source.shortfilename": "409_083_0015.%04d.exr 1001-1098",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "1001",
"foundry.source.timecode": "1937896",
"foundry.source.umid": "4b3e13b3-e465-4df4-cb1f-257091b63815",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "4096",
"foundry.timeline.colorSpace": "Input - Sony - Linear - Venice S-Gamut3.Cine",
"foundry.timeline.duration": "98",
"foundry.timeline.framerate": "23.98",
"foundry.timeline.outputformat": "",
"foundry.timeline.poster": "0",
"foundry.timeline.posterLayer": "colour",
"foundry.timeline.readParams": "AAAAAQAAAAAAAAAFAAAACmNvbG9yc3BhY2UAAAAFaW50MzIAAABqAAAAC2VkZ2VfcGl4ZWxzAAAABWludDMyAAAAAAAAABFpZ25vcmVfcGFydF9uYW1lcwAAAARib29sAAAAAAhub3ByZWZpeAAAAARib29sAAAAAB5vZmZzZXRfbmVnYXRpdmVfZGlzcGxheV93aW5kb3cAAAAEYm9vbAE=",
"foundry.timeline.samplerate": "Invalid",
"isSequence": true,
"media.exr.camera_camera_type": "AXS-R7",
"media.exr.camera_fps": "23.976",
"media.exr.camera_id": "MPC-3610 0010762 Version6.30",
"media.exr.camera_iso": "2500",
"media.exr.camera_lens_type": "Unknown",
"media.exr.camera_monitor_space": "OBX4_LUT_1_Night.cube",
"media.exr.camera_nd_filter": "1",
"media.exr.camera_roll_angle": "0.3",
"media.exr.camera_shutter_angle": "180.0",
"media.exr.camera_shutter_speed": "0.0208333",
"media.exr.camera_shutter_type": "Speed and Angle",
"media.exr.camera_sl_num": "00011434",
"media.exr.camera_tilt_angle": "-7.4",
"media.exr.camera_type": "Sony",
"media.exr.camera_white_kelvin": "3200",
"media.exr.channels": "B:{1 0 1 1},G:{1 0 1 1},R:{1 0 1 1}",
"media.exr.clip_details_codec": "F55_X-OCN_ST_4096_2160",
"media.exr.clip_details_pixel_aspect_ratio": "1",
"media.exr.clip_details_shot_frame_rate": "23.98p",
"media.exr.compression": "0",
"media.exr.compressionName": "none",
"media.exr.dataWindow": "0,0,4095,2159",
"media.exr.displayWindow": "0,0,4095,2159",
"media.exr.lineOrder": "0",
"media.exr.owner": "C272C010_240530HO",
"media.exr.pixelAspectRatio": "1",
"media.exr.screenWindowCenter": "0,0",
"media.exr.screenWindowWidth": "1",
"media.exr.tech_details_aspect_ratio": "1.8963",
"media.exr.tech_details_cdl_sat": "1",
"media.exr.tech_details_cdl_sop": "(1 1 1)(0 0 0)(1 1 1)",
"media.exr.tech_details_gamma_space": "R709 Video",
"media.exr.tech_details_par": "1",
"media.exr.type": "scanlineimage",
"media.input.bitsperchannel": "16-bit half float",
"media.input.ctime": "2024-07-30 18:51:38",
"media.input.filename": "X:/prj/AYON_CIRCUIT_TEST/data/OBX_20240729_P159_DOG_409/EXR/409_083_0015/409_083_0015.1001.exr",
"media.input.filereader": "exr",
"media.input.filesize": "53120020",
"media.input.frame": "1",
"media.input.frame_rate": "23.976",
"media.input.height": "2160",
"media.input.mtime": "2024-07-30 18:51:38",
"media.input.timecode": "22:25:45:16",
"media.input.width": "4096",
"padding": 4
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976,
"value": 98.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976,
"value": 1937896.0
}
},
"available_image_bounds": null,
"target_url_base": "X:/prj/AYON_CIRCUIT_TEST/data/OBX_20240729_P159_DOG_409/EXR/409_083_0015\\",
"name_prefix": "409_083_0015.",
"name_suffix": ".exr",
"start_frame": 1001,
"frame_step": 1,
"rate": 23.976,
"frame_zero_padding": 4,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,159 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 29.970030784606934
}
},
"effects": [
{
"OTIO_SCHEMA": "FreezeFrame.1",
"metadata": {},
"name": "FreezeFrame",
"effect_name": "FreezeFrame",
"time_scalar": 0.0
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_qt_freeze_frame/sh010\", \"task\": null, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\", \"hierarchy\": \"shots/hiero_qt_freeze_frame\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_freeze_frame\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_qt_freeze_frame\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_freeze_frame\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"e896c630-8c44-408f-a1a0-bffbe330dbe9\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_qt_freeze_frame/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"75b9112f-6357-4235-8a74-252467d6553d\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 30.0, \"sourceOut\": 30.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_qt_freeze_frame/sh010\", \"task\": null, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\", \"hierarchy\": \"shots/hiero_qt_freeze_frame\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_freeze_frame\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_qt_freeze_frame\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_freeze_frame\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"e896c630-8c44-408f-a1a0-bffbe330dbe9\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"parent_instance_id\": \"75b9112f-6357-4235-8a74-252467d6553d\", \"label\": \"/shots/hiero_qt_freeze_frame/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"95912bf0-aa1c-47ae-a821-fef410c32687\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_qt_freeze_frame/sh010 shotMain\", \"review\": true, \"reviewableSource\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\"}",
"label": "AYONdata_e681ec48",
"note": "AYON data container"
},
"name": "AYONdata_e681ec48",
"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": "ExternalReference.1",
"metadata": {
"ayon.source.colorspace": "Gamma2.2",
"ayon.source.height": 1080,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1920,
"clip.properties.blendfunc": "0",
"clip.properties.colourspacename": "error",
"clip.properties.domainroot": "",
"clip.properties.enabled": "1",
"clip.properties.expanded": "1",
"clip.properties.opacity": "1",
"clip.properties.valuesource": "",
"clip.properties.ycbcrmatrix": "default (Rec 709)",
"com.apple.quicktime.codec": "H.264",
"foundry.source.audio": "",
"foundry.source.bitmapsize": "0",
"foundry.source.bitsperchannel": "0",
"foundry.source.channelformat": "integer",
"foundry.source.colourtransform": "Gamma2.2",
"foundry.source.duration": "101",
"foundry.source.filename": "qt_no_tc_24fps.mov",
"foundry.source.filesize": "",
"foundry.source.fragments": "1",
"foundry.source.framerate": "24",
"foundry.source.fullpath": "",
"foundry.source.height": "1080",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov",
"foundry.source.pixelAspect": "1",
"foundry.source.pixelAspectRatio": "",
"foundry.source.pixelformat": "RGBA (Float32) Open Color IO space: 114",
"foundry.source.reelID": "",
"foundry.source.resolution": "",
"foundry.source.samplerate": "Invalid",
"foundry.source.shoottime": "4294967295",
"foundry.source.shortfilename": "qt_no_tc_24fps.mov",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "0",
"foundry.source.timecode": "0",
"foundry.source.type": "QuickTime H.264",
"foundry.source.umid": "16634e88-6450-4727-6c6e-501f4b31b637",
"foundry.source.width": "1920",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "Gamma2.2",
"foundry.timeline.duration": "101",
"foundry.timeline.framerate": "24",
"foundry.timeline.outputformat": "",
"foundry.timeline.poster": "0",
"foundry.timeline.posterLayer": "colour",
"foundry.timeline.samplerate": "Invalid",
"media.input.bitsperchannel": "8-bit fixed",
"media.input.ctime": "2024-09-25 17:16:12",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov",
"media.input.filereader": "mov64",
"media.input.filesize": "14631252",
"media.input.frame": "1",
"media.input.frame_rate": "24",
"media.input.height": "1080",
"media.input.mtime": "2024-09-25 17:16:16",
"media.input.pixel_aspect": "1",
"media.input.timecode": "00:00:00:00",
"media.input.width": "1920",
"media.quicktime.codec_id": "avc1",
"media.quicktime.codec_name": "h264",
"media.quicktime.encoder": "H.264",
"media.quicktime.nclc_matrix": "BT709",
"media.quicktime.nclc_primaries": "ITU-R BT.709",
"media.quicktime.nclc_transfer_function": "ITU-R BT.709",
"media.quicktime.thefoundry.Application": "Nuke",
"media.quicktime.thefoundry.ApplicationVersion": "15.0v5",
"media.quicktime.thefoundry.Colorspace": "Gamma2.2",
"media.quicktime.thefoundry.Writer": "mov64",
"media.quicktime.thefoundry.YCbCrMatrix": "Rec 709",
"media.stream.pixel_format": "yuv420p",
"uk.co.thefoundry.Application": "Nuke",
"uk.co.thefoundry.ApplicationVersion": "15.0v5",
"uk.co.thefoundry.Colorspace": "Gamma2.2",
"uk.co.thefoundry.Writer": "mov64",
"uk.co.thefoundry.YCbCrMatrix": "Rec 709"
},
"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": 0.0
}
},
"available_image_bounds": null,
"target_url": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,160 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 29.970030784606934
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "Speed",
"effect_name": "LinearTimeWarp",
"time_scalar": -0.699999988079071
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_qt_neg07x/sh010\", \"task\": null, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\", \"hierarchy\": \"shots/hiero_qt_neg07x\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg07x\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"clip_media\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_qt_neg07x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg07x\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"d7c96d32-6884-452f-9f8c-2383e20ca2db\", \"reviewTrack\": \"clip_media\", \"review\": true, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_qt_neg07x/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"dae8823d-d664-4afd-9d9d-be20647ad756\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceOut\": 30.0, \"fps\": \"from_selection\", \"sourceIn\": 0}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_qt_neg07x/sh010\", \"task\": null, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\", \"hierarchy\": \"shots/hiero_qt_neg07x\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg07x\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"clip_media\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_qt_neg07x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg07x\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"d7c96d32-6884-452f-9f8c-2383e20ca2db\", \"reviewTrack\": \"clip_media\", \"review\": true, \"folderName\": \"sh010\", \"parent_instance_id\": \"dae8823d-d664-4afd-9d9d-be20647ad756\", \"label\": \"/shots/hiero_qt_neg07x/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"a1aa49c0-49a1-4499-a3ec-1ac35982d92b\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_qt_neg07x/sh010 shotMain\", \"review\": true, \"reviewableSource\": \"clip_media\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\"}",
"label": "AYONdata_26480dbf",
"note": "AYON data container"
},
"name": "AYONdata_26480dbf",
"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": "ExternalReference.1",
"metadata": {
"ayon.source.colorspace": "Gamma2.2",
"ayon.source.height": 1080,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1920,
"clip.properties.blendfunc": "0",
"clip.properties.colourspacename": "error",
"clip.properties.domainroot": "",
"clip.properties.enabled": "1",
"clip.properties.expanded": "1",
"clip.properties.opacity": "1",
"clip.properties.valuesource": "",
"clip.properties.ycbcrmatrix": "0",
"com.apple.quicktime.codec": "H.264",
"foundry.source.audio": "",
"foundry.source.bitmapsize": "0",
"foundry.source.bitsperchannel": "0",
"foundry.source.channelformat": "integer",
"foundry.source.colourtransform": "Gamma2.2",
"foundry.source.duration": "101",
"foundry.source.filename": "qt_no_tc_24fps.mov",
"foundry.source.filesize": "",
"foundry.source.fragments": "1",
"foundry.source.framerate": "24",
"foundry.source.fullpath": "",
"foundry.source.height": "1080",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov",
"foundry.source.pixelAspect": "1",
"foundry.source.pixelAspectRatio": "",
"foundry.source.pixelformat": "RGBA (Float32) Open Color IO space: 114",
"foundry.source.reelID": "",
"foundry.source.resolution": "",
"foundry.source.samplerate": "Invalid",
"foundry.source.shoottime": "4294967295",
"foundry.source.shortfilename": "qt_no_tc_24fps.mov",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "0",
"foundry.source.timecode": "0",
"foundry.source.type": "QuickTime H.264",
"foundry.source.umid": "16634e88-6450-4727-6c6e-501f4b31b637",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1920",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "Gamma2.2",
"foundry.timeline.duration": "101",
"foundry.timeline.framerate": "24",
"foundry.timeline.outputformat": "",
"foundry.timeline.poster": "0",
"foundry.timeline.posterLayer": "colour",
"foundry.timeline.samplerate": "Invalid",
"media.input.bitsperchannel": "8-bit fixed",
"media.input.ctime": "2024-09-25 17:16:12",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov",
"media.input.filereader": "mov64",
"media.input.filesize": "14631252",
"media.input.frame": "1",
"media.input.frame_rate": "24",
"media.input.height": "1080",
"media.input.mtime": "2024-09-25 17:16:16",
"media.input.pixel_aspect": "1",
"media.input.timecode": "00:00:00:00",
"media.input.width": "1920",
"media.quicktime.codec_id": "avc1",
"media.quicktime.codec_name": "h264",
"media.quicktime.encoder": "H.264",
"media.quicktime.nclc_matrix": "BT709",
"media.quicktime.nclc_primaries": "ITU-R BT.709",
"media.quicktime.nclc_transfer_function": "ITU-R BT.709",
"media.quicktime.thefoundry.Application": "Nuke",
"media.quicktime.thefoundry.ApplicationVersion": "15.0v5",
"media.quicktime.thefoundry.Colorspace": "Gamma2.2",
"media.quicktime.thefoundry.Writer": "mov64",
"media.quicktime.thefoundry.YCbCrMatrix": "Rec 709",
"media.stream.pixel_format": "yuv420p",
"uk.co.thefoundry.Application": "Nuke",
"uk.co.thefoundry.ApplicationVersion": "15.0v5",
"uk.co.thefoundry.Colorspace": "Gamma2.2",
"uk.co.thefoundry.Writer": "mov64",
"uk.co.thefoundry.YCbCrMatrix": "Rec 709"
},
"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": 0.0
}
},
"available_image_bounds": null,
"target_url": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,160 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 29.970030784606934
}
},
"effects": [
{
"OTIO_SCHEMA": "LinearTimeWarp.1",
"metadata": {},
"name": "Speed",
"effect_name": "LinearTimeWarp",
"time_scalar": -2.0
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_qt_neg_2x/sh010\", \"task\": null, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\", \"hierarchy\": \"shots/hiero_qt_neg_2x\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg_2x\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_qt_neg_2x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg_2x\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"a59e3db6-0b60-41f5-827c-9d280547bf31\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_qt_neg_2x/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"f98ac652-ed03-4985-bad9-5b028ceeddba\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 50.0, \"sourceOut\": 30.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_qt_neg_2x/sh010\", \"task\": null, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\", \"hierarchy\": \"shots/hiero_qt_neg_2x\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg_2x\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_qt_neg_2x\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_qt_neg_2x\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"a59e3db6-0b60-41f5-827c-9d280547bf31\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"parent_instance_id\": \"f98ac652-ed03-4985-bad9-5b028ceeddba\", \"label\": \"/shots/hiero_qt_neg_2x/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"5c9c047c-43fa-42a1-a00f-e9c9d6e5a3c4\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_qt_neg_2x/sh010 shotMain\", \"review\": true, \"reviewableSource\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"D812B65C-F1C7-DA48-9060-F932A50B2BB4\"}",
"label": "AYONdata_fd6d196e",
"note": "AYON data container"
},
"name": "AYONdata_fd6d196e",
"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": "ExternalReference.1",
"metadata": {
"ayon.source.colorspace": "Gamma2.2",
"ayon.source.height": 1080,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1920,
"clip.properties.blendfunc": "0",
"clip.properties.colourspacename": "error",
"clip.properties.domainroot": "",
"clip.properties.enabled": "1",
"clip.properties.expanded": "1",
"clip.properties.opacity": "1",
"clip.properties.valuesource": "",
"clip.properties.ycbcrmatrix": "0",
"com.apple.quicktime.codec": "H.264",
"foundry.source.audio": "",
"foundry.source.bitmapsize": "0",
"foundry.source.bitsperchannel": "0",
"foundry.source.channelformat": "integer",
"foundry.source.colourtransform": "Gamma2.2",
"foundry.source.duration": "101",
"foundry.source.filename": "qt_no_tc_24fps.mov",
"foundry.source.filesize": "",
"foundry.source.fragments": "1",
"foundry.source.framerate": "24",
"foundry.source.fullpath": "",
"foundry.source.height": "1080",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov",
"foundry.source.pixelAspect": "1",
"foundry.source.pixelAspectRatio": "",
"foundry.source.pixelformat": "RGBA (Float32) Open Color IO space: 114",
"foundry.source.reelID": "",
"foundry.source.resolution": "",
"foundry.source.samplerate": "Invalid",
"foundry.source.shoottime": "4294967295",
"foundry.source.shortfilename": "qt_no_tc_24fps.mov",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "0",
"foundry.source.timecode": "0",
"foundry.source.type": "QuickTime H.264",
"foundry.source.umid": "16634e88-6450-4727-6c6e-501f4b31b637",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1920",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "Gamma2.2",
"foundry.timeline.duration": "101",
"foundry.timeline.framerate": "24",
"foundry.timeline.outputformat": "",
"foundry.timeline.poster": "0",
"foundry.timeline.posterLayer": "colour",
"foundry.timeline.samplerate": "Invalid",
"media.input.bitsperchannel": "8-bit fixed",
"media.input.ctime": "2024-09-25 17:16:12",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov",
"media.input.filereader": "mov64",
"media.input.filesize": "14631252",
"media.input.frame": "1",
"media.input.frame_rate": "24",
"media.input.height": "1080",
"media.input.mtime": "2024-09-25 17:16:16",
"media.input.pixel_aspect": "1",
"media.input.timecode": "00:00:00:00",
"media.input.width": "1920",
"media.quicktime.codec_id": "avc1",
"media.quicktime.codec_name": "h264",
"media.quicktime.encoder": "H.264",
"media.quicktime.nclc_matrix": "BT709",
"media.quicktime.nclc_primaries": "ITU-R BT.709",
"media.quicktime.nclc_transfer_function": "ITU-R BT.709",
"media.quicktime.thefoundry.Application": "Nuke",
"media.quicktime.thefoundry.ApplicationVersion": "15.0v5",
"media.quicktime.thefoundry.Colorspace": "Gamma2.2",
"media.quicktime.thefoundry.Writer": "mov64",
"media.quicktime.thefoundry.YCbCrMatrix": "Rec 709",
"media.stream.pixel_format": "yuv420p",
"uk.co.thefoundry.Application": "Nuke",
"uk.co.thefoundry.ApplicationVersion": "15.0v5",
"uk.co.thefoundry.Colorspace": "Gamma2.2",
"uk.co.thefoundry.Writer": "mov64",
"uk.co.thefoundry.YCbCrMatrix": "Rec 709"
},
"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": 0.0
}
},
"available_image_bounds": null,
"target_url": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/qt_no_tc_24fps.mov"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -0,0 +1,174 @@
{
"OTIO_SCHEMA": "Clip.2",
"metadata": {},
"name": "sh010",
"source_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 11.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 23.976024627685547,
"value": 909986.0387191772
}
},
"effects": [
{
"OTIO_SCHEMA": "TimeEffect.1",
"metadata": {
"length": 4.0,
"lookup": [
2.0,
1.8959999809265136,
1.767999971389771,
1.59199997138977,
1.3439999809265135,
1.0,
0.5440000181198119,
-0.007999974250793684,
-0.6319999756813051,
-1.3039999847412114,
-2.0
]
},
"name": "TimeWarp2",
"effect_name": "TimeWarp"
}
],
"markers": [
{
"OTIO_SCHEMA": "Marker.2",
"metadata": {
"applieswhole": "1",
"hiero_source_type": "TrackItem",
"json_metadata": "{\"hiero_sub_products\": {\"io.ayon.creators.hiero.shot\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"shot\", \"productName\": \"shotMain\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.shot\", \"variant\": \"main\", \"folderPath\": \"/shots/hiero_seq_tw/sh010\", \"task\": null, \"clip_index\": \"27126150-EDFA-9F45-908C-59F5CD1A94E2\", \"hierarchy\": \"shots/hiero_seq_tw\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_tw\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_seq_tw\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_tw\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"5c0e0d32-fa09-4331-afbb-5b194cfa258c\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"label\": \"/shots/hiero_seq_tw/sh010 shotMain\", \"newHierarchyIntegration\": true, \"instance_id\": \"b88fe40d-f92d-42b0-b7f6-7cb7a206e878\", \"creator_attributes\": {\"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"frameStart\": 1001, \"frameEnd\": 1012, \"clipIn\": 0, \"clipOut\": 10, \"clipDuration\": 11, \"sourceIn\": 176.0, \"sourceOut\": 186.0, \"fps\": \"from_selection\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}, \"io.ayon.creators.hiero.plate\": {\"id\": \"pyblish.avalon.instance\", \"productType\": \"plate\", \"productName\": \"plateVideo_1\", \"active\": true, \"creator_identifier\": \"io.ayon.creators.hiero.plate\", \"variant\": \"Video_1\", \"folderPath\": \"/shots/hiero_seq_tw/sh010\", \"task\": null, \"clip_index\": \"27126150-EDFA-9F45-908C-59F5CD1A94E2\", \"hierarchy\": \"shots/hiero_seq_tw\", \"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_tw\", \"track\": \"Video_1\", \"shot\": \"sh010\", \"reviewableSource\": \"Video 1\", \"sourceResolution\": false, \"workfileFrameStart\": 1001, \"handleStart\": 10, \"handleEnd\": 10, \"parents\": [{\"entity_type\": \"folder\", \"folder_type\": \"folder\", \"entity_name\": \"shots\"}, {\"entity_type\": \"sequence\", \"folder_type\": \"sequence\", \"entity_name\": \"hiero_seq_tw\"}], \"hierarchyData\": {\"folder\": \"shots\", \"episode\": \"ep01\", \"sequence\": \"hiero_seq_tw\", \"track\": \"Video_1\"}, \"heroTrack\": true, \"uuid\": \"5c0e0d32-fa09-4331-afbb-5b194cfa258c\", \"reviewTrack\": \"Video 1\", \"review\": true, \"folderName\": \"sh010\", \"parent_instance_id\": \"b88fe40d-f92d-42b0-b7f6-7cb7a206e878\", \"label\": \"/shots/hiero_seq_tw/sh010 plateVideo_1\", \"newHierarchyIntegration\": true, \"instance_id\": \"e3ea1467-dfaf-48db-bf3c-6cbbbd2cd972\", \"creator_attributes\": {\"parentInstance\": \"/shots/hiero_seq_tw/sh010 shotMain\", \"review\": true, \"reviewableSource\": \"Video 1\"}, \"publish_attributes\": {\"CollectSlackFamilies\": {\"additional_message\": \"\"}}}}, \"clip_index\": \"27126150-EDFA-9F45-908C-59F5CD1A94E2\"}",
"label": "AYONdata_ef8f52f1",
"note": "AYON data container"
},
"name": "AYONdata_ef8f52f1",
"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": {
"ayon.source.colorspace": "ACES - ACES2065-1",
"ayon.source.height": 720,
"ayon.source.pixelAspect": 1.0,
"ayon.source.width": 1280,
"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": "301",
"foundry.source.filename": "output.%07d.exr 948674-948974",
"foundry.source.filesize": "",
"foundry.source.fragments": "301",
"foundry.source.framerate": "25",
"foundry.source.fullpath": "",
"foundry.source.height": "720",
"foundry.source.layers": "colour",
"foundry.source.path": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.%07d.exr 948674-948974",
"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": "output.%07d.exr 948674-948974",
"foundry.source.shot": "",
"foundry.source.shotDate": "",
"foundry.source.startTC": "",
"foundry.source.starttime": "948674",
"foundry.source.timecode": "948674",
"foundry.source.umid": "28c4702f-5af7-4980-52c9-6eb875968890",
"foundry.source.umidOriginator": "foundry.source.umid",
"foundry.source.width": "1280",
"foundry.timeline.autodiskcachemode": "Manual",
"foundry.timeline.colorSpace": "ACES - ACES2065-1",
"foundry.timeline.duration": "301",
"foundry.timeline.framerate": "25",
"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,1278,718",
"media.exr.displayWindow": "0,0,1279,719",
"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": "2025-01-13 14:26:25",
"media.input.filename": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange/output.0948674.exr",
"media.input.filereader": "exr",
"media.input.filesize": "214941",
"media.input.frame": "1",
"media.input.height": "720",
"media.input.mtime": "2025-01-13 14:26:25",
"media.input.width": "1280",
"media.nuke.full_layer_names": "0",
"media.nuke.node_hash": "b13e3153b31d8f14",
"media.nuke.version": "15.0v5",
"padding": 7
},
"name": "",
"available_range": {
"OTIO_SCHEMA": "TimeRange.1",
"duration": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 301.0
},
"start_time": {
"OTIO_SCHEMA": "RationalTime.1",
"rate": 25.0,
"value": 948674.0
}
},
"available_image_bounds": null,
"target_url_base": "C:/Users/robin/OneDrive/Bureau/dev_ayon/data/img_sequence/exr_long_frameRange\\",
"name_prefix": "output.",
"name_suffix": ".exr",
"start_frame": 948674,
"frame_step": 1,
"rate": 25.0,
"frame_zero_padding": 7,
"missing_frame_policy": "error"
}
},
"active_media_reference_key": "DEFAULT_MEDIA"
}

View file

@ -252,48 +252,48 @@ def test_multiple_review_clips_no_gap():
'/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.%04d.jpg',
'-start_number 1198 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1299 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1395 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1496 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1597 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1698 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1799 C:/result/output.%04d.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.%04d.jpg',
'-start_number 1900 C:/result/output.%04d.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.%04d.jpg',
'-start_number 2001 C:/result/output.%04d.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.%04d.jpg',
'-start_number 2102 C:/result/output.%04d.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.%04d.jpg'
'-start_number 2203 C:/result/output.%04d.jpg'
]
assert calls == expected

View file

@ -64,6 +64,28 @@ def test_movie_embedded_tc_handle():
)
def test_movie_23fps_qt_embedded_tc():
"""
Movie clip (embedded timecode 1h)
available_range = 1937896-1937994 23.976fps
source_range = 1937905-1937987 23.97602462768554fps
"""
expected_data = {
'mediaIn': 1009,
'mediaOut': 1090,
'handleStart': 8,
'handleEnd': 8,
'speed': 1.0
}
_check_expected_retimed_values(
"qt_23.976_embedded_long_tc.json",
expected_data,
handle_start=8,
handle_end=8,
)
def test_movie_retime_effect():
"""
Movie clip (embedded timecode 1h)
@ -91,6 +113,151 @@ def test_movie_retime_effect():
)
def test_movie_reverse_speed_2x():
"""
Movie clip (no timecode)
available files = 0-100 24fps
source_range = 29.97-40.97 23.976fps
speed = -2.0
"""
expected_data = {
# not exactly 30 because of 23.976 rouding
# https://github.com/AcademySoftwareFoundation/
# OpenTimelineIO/issues/1822
'mediaIn': 30.000000000000004,
'mediaOut': 51.02199940144827,
'handleStart': 20,
'handleEnd': 20,
'speed': -2.0,
'versionData': {
'retime': True,
'speed': -2.0,
'timewarps': [],
'handleStart': 20,
'handleEnd': 20,
}
}
_check_expected_retimed_values(
"qt_reverse_speed_2x.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_movie_reverse_speed_0_7x():
"""
Movie clip (no timecode)
available files = 0-100 24fps
source_range = 29.97-40.97 23.976fps
speed = -0.7
"""
expected_data = {
'handleEnd': 7,
'handleStart': 7,
'mediaIn': 30.000000000000004,
'mediaOut': 36.70769965924555,
'speed': -0.699999988079071,
'versionData': {
'handleEnd': 7,
'handleStart': 7,
'retime': True,
'speed': -0.699999988079071,
'timewarps': []
}
}
_check_expected_retimed_values(
"qt_reverse_speed_0_7.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_movie_frozen_frame():
"""
Movie clip (no timecode)
available files = 0-100 24fps
source_range = 29.97-40.97 23.976fps
speed = 0.0
"""
expected_data = {
# not exactly 30 because of OTIO rounding
# https://github.com/AcademySoftwareFoundation/
# OpenTimelineIO/issues/1822
'mediaIn': 30.000000000000004,
'mediaOut': 30.000000000000004,
'handleStart': 0,
'handleEnd': 0,
'speed': 0.0,
'versionData': {
'retime': True,
'speed': 0.0,
'timewarps': [],
'handleStart': 0,
'handleEnd': 0,
}
}
_check_expected_retimed_values(
"qt_freeze_frame.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_movie_timewarp():
"""
Movie clip (no timecode)
available files = 0-100 24fps
source_range = 29.97-40.97 23.976fps
speed = timewarp
"""
expected_data = {
'handleEnd': 10,
'handleStart': 0,
'mediaIn': 948852,
'mediaOut': 948858,
'speed': 1.0,
'versionData': {'handleEnd': 10,
'handleStart': 0,
'retime': True,
'speed': 1.0,
'timewarps': [
{
'Class': 'TimeWarp',
'length': 4.0,
'lookup': [
0.0,
-0.10400001907348644,
-0.23200002861022906,
-0.4080000286102301,
-0.6560000190734865,
-1.0,
-1.455999981880188,
-2.0079999742507937,
-2.631999975681305,
-3.3039999847412114,
-4.0
],
'name': 'TimeWarp2'
}
]
}
}
_check_expected_retimed_values(
"qt_timewarp.json",
expected_data,
handle_start=0,
handle_end=10,
)
def test_img_sequence_no_handles():
"""
Img sequence clip (no embedded timecode)
@ -187,3 +354,391 @@ def test_img_sequence_conform_to_23_976fps():
handle_start=0,
handle_end=8,
)
def test_img_sequence_conform_from_24_to_23_976fps():
"""
Img sequence clip
available files = 883750-884504 24fps
source_range = 883159-883267 23.976fps
This test ensures such entries do not trigger
the legacy Hiero export compatibility.
"""
expected_data = {
'mediaIn': 884043,
'mediaOut': 884150,
'handleStart': 0,
'handleEnd': 0,
'speed': 1.0
}
_check_expected_retimed_values(
"img_seq_24_to_23.976_no_legacy.json",
expected_data,
handle_start=0,
handle_end=0,
)
def test_img_sequence_reverse_speed_no_tc():
"""
Img sequence clip
available files = 0-100 24fps
source_range = 20-41 24fps
"""
expected_data = {
'mediaIn': 1020,
'mediaOut': 1060,
'handleStart': 0,
'handleEnd': 0,
'speed': -1.0,
'versionData': {
'retime': True,
'speed': -1.0,
'timewarps': [],
'handleStart': 0,
'handleEnd': 0
}
}
_check_expected_retimed_values(
"img_seq_reverse_speed_no_tc.json",
expected_data,
handle_start=0,
handle_end=0,
)
def test_img_sequence_reverse_speed_from_24_to_23_976fps():
"""
Img sequence clip
available files = 941478-949084 24fps
source_range = 947726-947757 23.976fps
"""
expected_data = {
'mediaIn': 948674,
'mediaOut': 948705,
'handleStart': 10,
'handleEnd': 10,
'speed': -1.0,
'versionData': {
'retime': True,
'speed': -1.0,
'timewarps': [],
'handleStart': 10,
'handleEnd': 10
}
}
_check_expected_retimed_values(
"img_seq_reverse_speed_24_to_23.976fps.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_img_sequence_reverse_speed_0_7():
"""
Img sequence clip
available files = 1000-1100 24fps
source_range = 1040-1081 25fps
"""
expected_data = {
'mediaIn': 1040,
'mediaOut': 1068,
'handleStart': 4,
'handleEnd': 4,
'speed': -0.7,
'versionData': {
'retime': True,
'speed': -0.7,
'timewarps': [],
'handleStart': 4,
'handleEnd': 4
}
}
_check_expected_retimed_values(
"img_seq_reverse_speed_0_7.json",
expected_data,
handle_start=5,
handle_end=5,
)
def test_img_sequence_2x_speed():
"""
Img sequence clip
available files = 948674-948974 25fps
source_range = 948850-948870 23.976fps
speed = 2.0
"""
expected_data = {
'mediaIn': 948850,
'mediaOut': 948871,
'handleStart': 20,
'handleEnd': 20,
'speed': 2.0,
'versionData': {
'retime': True,
'speed': 2.0,
'timewarps': [],
'handleStart': 20,
'handleEnd': 20
}
}
_check_expected_retimed_values(
"img_seq_2x_speed.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_img_sequence_2x_speed_resolve():
"""
Img sequence clip
available files = 0-99 24fps
source_range = 38-49 24fps
speed = 2.0
"""
expected_data = {
'mediaIn': 1040,
'mediaOut': 1061,
'handleStart': 20,
'handleEnd': 20,
'speed': 2.0,
'versionData': {
'retime': True,
'speed': 2.0,
'timewarps': [],
'handleStart': 20,
'handleEnd': 20
}
}
_check_expected_retimed_values(
"img_seq_2x_speed_resolve.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_img_sequence_frozen_frame():
"""
Img sequence clip
available files = 948674-948974 25fps
source_range = 909990.8339241028
- 909995.8339241028 23.976fps
speed = 0.0
"""
expected_data = {
'mediaIn': 948855,
'mediaOut': 948855,
'handleStart': 0,
'handleEnd': 0,
'speed': 0.0,
'versionData': {
'retime': True,
'speed': 0.0,
'timewarps': [],
'handleStart': 0,
'handleEnd': 0,
}
}
_check_expected_retimed_values(
"img_seq_freeze_frame.json",
expected_data,
handle_start=10,
handle_end=10,
)
def test_img_sequence_timewarp_beyond_range():
"""
Img sequence clip
available files = 948674-948974 25fps
source_range = 909990.8339241028
- 909995.8339241028 23.976fps
timewarp to get from 948845 to 948870
"""
expected_data = {
'mediaIn': 948845,
'mediaOut': 948870,
'handleStart': 0,
'handleEnd': 10,
'speed': 1.0,
'versionData': {'handleEnd': 10,
'handleStart': 0,
'retime': True,
'speed': 1.0,
'timewarps': [
{
'Class': 'TimeWarp',
'length': 1.0,
'lookup': [
0.0,
1.0559999694824223,
2.147999965667725,
3.3119999771118156,
4.583999992370606,
6.0,
7.583999992370606,
9.311999977111817,
11.147999965667726,
13.055999969482421,
15.0
],
'name': 'TimeWarp3'
}
]
}
}
_check_expected_retimed_values(
"img_seq_tw_beyond_range.json",
expected_data,
handle_start=0,
handle_end=10,
)
def test_img_sequence_2X_speed_timewarp():
"""
Img sequence clip
available files = 948674-948974 25fps
source_range = 909990.8339241028
- 909995.8339241028 23.976fps
speed: 200%
timewarp to get from 948854 to 948874
"""
expected_data = {
'mediaIn': 948854,
'mediaOut': 948874,
'handleStart': 0,
'handleEnd': 20,
'speed': 2.0,
'versionData': {
'handleEnd': 20,
'handleStart': 0,
'retime': True,
'speed': 2.0,
'timewarps': [
{
'Class': 'TimeWarp',
'length': 4.0,
'lookup': [
0.0,
-0.2960000076293945,
-0.568000008583069,
-0.7920000057220469,
-0.944000001907348,
-1.0,
-0.9439999923706051,
-0.791999977111816,
-0.5679999656677239,
-0.29599996948242335,
0.0
],
'name': 'TimeWarp6'
}
]
}
}
_check_expected_retimed_values(
"img_seq_2x_time_warp.json",
expected_data,
handle_start=0,
handle_end=10,
)
def test_img_sequence_multiple_timewarps():
"""
Img sequence clip
available files = 948674-948974 25fps
source_range = 909990.8339241028
- 909995.8339241028 23.976fps
multiple timewarps to get from 948842 to 948864
"""
expected_data = {
'mediaIn': 948845,
'mediaOut': 948867,
'handleStart': 0,
'handleEnd': 10,
'speed': 1.0,
'versionData': {
'handleEnd': 10,
'handleStart': 0,
'retime': True,
'speed': 1.0,
'timewarps': [
{
'Class': 'TimeWarp',
'length': 1.0,
'lookup': [
0.0,
1.0559999694824223,
2.147999965667725,
3.3119999771118156,
4.583999992370606,
6.0,
7.583999992370606,
9.311999977111817,
11.147999965667726,
13.055999969482421,
15.0
],
'name': 'TimeWarp3'
},
{
'Class': 'TimeWarp',
'length': 1.0,
'lookup': [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
'name': 'TimeWarp4'
},
{
'Class': 'TimeWarp',
'length': 1.0,
'lookup': [
0.0,
-1.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-1.0
],
'name': 'TimeWarp5'
}
]
}
}
_check_expected_retimed_values(
"img_seq_multiple_tws.json",
expected_data,
handle_start=0,
handle_end=10,
)

View file

@ -15,7 +15,6 @@ from ayon_core.pipeline.traits import (
from ayon_core.pipeline.traits.trait import TraitValidationError
def test_sequence_validations() -> None:
"""Test Sequence trait validation."""
file_locations_list = [