Skip to content

publish_plugins

CollectUSDLayerContributionsProfileModel

Bases: BaseSettingsModel

Profiles to define instance attribute defaults for USD contribution.

Source code in server/settings/publish_plugins.py
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
class CollectUSDLayerContributionsProfileModel(BaseSettingsModel):
    """Profiles to define instance attribute defaults for USD contribution."""
    _layout = "expanded"
    product_types: list[str] = SettingsField(
        default_factory=list,
        title="Product types",
        description=(
            "The product types to match this profile to. When matched, the"
            " settings below would apply to the instance as default"
            " attributes."
        ),
        section="Filter"
    )
    task_types: list[str] = SettingsField(
        default_factory=list,
        title="Task Types",
        enum_resolver=task_types_enum,
        description=(
            "The current create context task type to filter against. This"
            " allows to filter the profile to only be valid if currently "
            " creating from within that task type."
        ),
    )
    contribution_enabled: bool = SettingsField(
        True,
        title="Contribution Enabled (default)",
        description=(
            "The default state for USD Contribution being marked enabled or"
            " disabled for this profile."
        ),
        section="Instance attribute defaults",
    )
    contribution_layer: str = SettingsField(
        "",
        title="Contribution Department Layer",
        description=(
            "The default contribution layer to apply the contribution to when"
            " matching this profile. The layer name should be in the"
            " 'Department Layer Orders' list to get a sensible order."
        ),
    )
    contribution_apply_as_variant: bool = SettingsField(
        True,
        title="Apply as variant",
        description=(
            "The default 'Apply as variant' state for instances matching this"
            " profile. Usually enabled for asset contributions and disabled"
            " for shot contributions."
        ),
    )
    contribution_target_product: str = SettingsField(
        "usdAsset",
        title="Target Product",
        description=(
            "The default destination product name to apply the contribution to"
            " when matching this profile."
            " Usually e.g. 'usdAsset' or 'usdShot'."
        ),
    )

ExtractBurninDef

Bases: BaseSettingsModel

Source code in server/settings/publish_plugins.py
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
class ExtractBurninDef(BaseSettingsModel):
    _isGroup = True
    _layout = "expanded"
    name: str = SettingsField("")
    TOP_LEFT: str = SettingsField("", title="Top Left")
    TOP_CENTERED: str = SettingsField("", title="Top Centered")
    TOP_RIGHT: str = SettingsField("", title="Top Right")
    BOTTOM_LEFT: str = SettingsField("", title="Bottom Left")
    BOTTOM_CENTERED: str = SettingsField("", title="Bottom Centered")
    BOTTOM_RIGHT: str = SettingsField("", title="Bottom Right")
    filter: ExtractBurninDefFilter = SettingsField(
        default_factory=ExtractBurninDefFilter,
        title="Additional filtering"
    )

    @validator("name")
    def validate_name(cls, value):
        """Ensure name does not contain weird characters"""
        return normalize_name(value)

validate_name(value)

Ensure name does not contain weird characters

Source code in server/settings/publish_plugins.py
996
997
998
999
@validator("name")
def validate_name(cls, value):
    """Ensure name does not contain weird characters"""
    return normalize_name(value)

ExtractOIIOPostProcessModel

Bases: BaseSettingsModel

Process representation images with oiiotool on publish.

This could be used to convert images to different formats, convert to scanline images or flatten deep images.

Source code in server/settings/publish_plugins.py
737
738
739
740
741
742
743
744
745
746
class ExtractOIIOPostProcessModel(BaseSettingsModel):
    """Process representation images with `oiiotool` on publish.

    This could be used to convert images to different formats, convert to
    scanline images or flatten deep images.
    """
    enabled: bool = SettingsField(True)
    profiles: list[ExtractOIIOPostProcessProfileModel] = SettingsField(
        default_factory=list, title="Profiles"
    )

ExtractOIIOTranscodeModel

Bases: BaseSettingsModel

Color conversion transcoding using OIIO for images mostly aimed at transcoding for reviewables (it'll process and output only RGBA channels).

Source code in server/settings/publish_plugins.py
629
630
631
632
633
634
635
636
class ExtractOIIOTranscodeModel(BaseSettingsModel):
    """Color conversion transcoding using OIIO for images mostly aimed at
    transcoding for reviewables (it'll process and output only RGBA channels).
    """
    enabled: bool = SettingsField(True)
    profiles: list[ExtractOIIOTranscodeProfileModel] = SettingsField(
        default_factory=list, title="Profiles"
    )

ExtractReviewOutputDefModel

Bases: BaseSettingsModel

Source code in server/settings/publish_plugins.py
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
class ExtractReviewOutputDefModel(BaseSettingsModel):
    _layout = "expanded"
    name: str = SettingsField("", title="Name")
    ext: str = SettingsField("", title="Output extension")
    # TODO use some different source of tags
    tags: list[str] = SettingsField(default_factory=list, title="Tags")
    burnins: list[str] = SettingsField(
        default_factory=list, title="Link to a burnin by name"
    )
    ffmpeg_args: ExtractReviewFFmpegModel = SettingsField(
        default_factory=ExtractReviewFFmpegModel,
        title="FFmpeg arguments"
    )
    filter: ExtractReviewFilterModel = SettingsField(
        default_factory=ExtractReviewFilterModel,
        title="Additional output filtering"
    )
    overscan_crop: str = SettingsField(
        "",
        title="Overscan crop",
        description=(
            "Crop input overscan. See the documentation for more information."
        )
    )
    overscan_color: ColorRGBA_uint8 = SettingsField(
        (0, 0, 0, 0.0),
        title="Overscan color",
        description=(
            "Overscan color is used when input aspect ratio is not"
            " same as output aspect ratio."
        )
    )
    # overscan_color: ColorRGB_uint8 = SettingsField(
    #     (0, 0, 0),
    #     title="Overscan color",
    #     description=(
    #         "Overscan color is used when input aspect ratio is not"
    #         " same as output aspect ratio."
    #     )
    # )
    width: int = SettingsField(
        0,
        ge=0,
        le=100000,
        title="Output width",
        description=(
            "Width and Height must be both set to higher"
            " value than 0 else source resolution is used."
        )
    )
    height: int = SettingsField(
        0,
        title="Output height",
        ge=0,
        le=100000,
    )
    scale_pixel_aspect: bool = SettingsField(
        True,
        title="Scale pixel aspect",
        description=(
            "Rescale input when it's pixel aspect ratio is not 1."
            " Useful for anamorphic reviews."
        )
    )
    bg_color: ColorRGBA_uint8 = SettingsField(
        (0, 0, 0, 0.0),
        description=(
            "Background color is used only when input have transparency"
            " and Alpha is higher than 0."
        ),
        title="Background color",
    )
    letter_box: ExtractReviewLetterBox = SettingsField(
        default_factory=ExtractReviewLetterBox,
        title="Letter Box"
    )
    fill_missing_frames: str = SettingsField(
        title="Handle missing frames",
        default="closest_existing",
        description="How to handle gaps in sequence frame ranges.",
        enum_resolver=_handle_missing_frames_enum
    )

    @validator("name")
    def validate_name(cls, value):
        """Ensure name does not contain weird characters"""
        return normalize_name(value)

validate_name(value)

Ensure name does not contain weird characters

Source code in server/settings/publish_plugins.py
910
911
912
913
@validator("name")
def validate_name(cls, value):
    """Ensure name does not contain weird characters"""
    return normalize_name(value)

ExtractThumbnailFromSourceModel

Bases: BaseSettingsModel

Thumbnail extraction from source files using ffmpeg and oiiotool.

Source code in server/settings/publish_plugins.py
509
510
511
512
513
514
515
516
517
518
class ExtractThumbnailFromSourceModel(BaseSettingsModel):
    """Thumbnail extraction from source files using ffmpeg and oiiotool."""
    enabled: bool = SettingsField(True)

    target_size: ResizeModel = SettingsField(
        default_factory=ResizeModel, title="Target size"
    )
    background_color: ColorRGBA_uint8 = SettingsField(
        (0, 0, 0, 0.0), title="Background color"
    )

IntegrateProductGroupModel

Bases: BaseSettingsModel

Group published products by filtering logic.

Set all published instances as a part of specific group named according to 'Template'.

Implemented all variants of placeholders '{task}', '{product[type]}', '{host}', '{product[name]}', '{renderlayer}'.

Source code in server/settings/publish_plugins.py
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
class IntegrateProductGroupModel(BaseSettingsModel):
    """Group published products by filtering logic.

    Set all published instances as a part of specific group named according
     to 'Template'.

    Implemented all variants of placeholders '{task}', '{product[type]}',
    '{host}', '{product[name]}', '{renderlayer}'.
    """

    _isGroup = True
    product_grouping_profiles: list[IntegrateProductGroupProfile] = (
        SettingsField(
            default_factory=list,
            title="Product group profiles"
        )
    )

PreIntegrateThumbnailsModel

Bases: BaseSettingsModel

Explicitly set if Thumbnail representation should be integrated.

If no matching profile set, existing state from Host implementation is kept.

Source code in server/settings/publish_plugins.py
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
class PreIntegrateThumbnailsModel(BaseSettingsModel):
    """Explicitly set if Thumbnail representation should be integrated.

    If no matching profile set, existing state from Host implementation
    is kept.
    """

    _isGroup = True
    enabled: bool = SettingsField(True)
    integrate_profiles: list[PreIntegrateThumbnailsProfile] = SettingsField(
        default_factory=list,
        title="Integrate profiles"
    )

ValidateIntentModel

Bases: BaseSettingsModel

Validate if Publishing intent was selected.

It is possible to disable validation for specific publishing context with profiles.

Source code in server/settings/publish_plugins.py
324
325
326
327
328
329
330
331
332
333
class ValidateIntentModel(BaseSettingsModel):
    """Validate if Publishing intent was selected.

    It is possible to disable validation for specific publishing context
    with profiles.
    """

    _isGroup = True
    enabled: bool = SettingsField(False)
    profiles: list[ValidateIntentProfile] = SettingsField(default_factory=list)

ensure_unique_resolution_option(objects, field_name=None)

Ensure a list of objects have unique option attributes.

This function checks if the list of objects has unique 'width', 'height' and 'pixel_aspect' properties.

Source code in server/settings/publish_plugins.py
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
def ensure_unique_resolution_option(
        objects: list[Any], field_name: str | None = None) -> None:  # noqa: C901
    """Ensure a list of objects have unique option attributes.

    This function checks if the list of objects has unique 'width',
    'height' and 'pixel_aspect' properties.
    """
    options = set()
    for obj in objects:
        item_test_text = f"{obj.width}x{obj.height}x{obj.pixel_aspect}"
        if item_test_text in options:
            raise BadRequestException(
                f"Duplicate option '{item_test_text}'")

        options.add(item_test_text)