disguise developers

Python API

Execute Python code in Designer sessions to control and query projects programmatically.

r34.2 Change Log

Previous version: r34.1

Date: 10/09/2026, 12:56

Enum support

Values that the Python API used to declare as plain integers are now declared as the reflected enum they hold. This covers properties, method parameters and return values, and the class constants that name each value. About 500 members changed this way, and 164 enum classes are newly declared. They are listed at the end of this section.

Constants now hold enum members instead of integers:

-    STRATEGY_MANUAL: Final[int] = 2
+    STRATEGY_MANUAL: Final[ClusterAssigner.SplitType] = ClusterAssigner.SplitType.Manual

Properties, parameters and return values name their enum:

-    def getTag(self, tagType: int) -> Tag:
+    def getTag(self, tagType: TagType) -> Tag:

-    def calStatus(self, idx: int) -> int:
+    def calStatus(self, idx: int) -> CalibrationStatus:

Each enum declares its values as members, for example CalibrationStatus.FineTuned. int(value) gives an enum’s integer value, fromInt builds one from an integer, and toString gives its name. The ordering comparisons (<, <=, >, >=) accept either an enum or an integer. Code that passes integers where an enum is now declared will be flagged by a type checker or editor; pass the enum member instead.

Enum classes added in r34.2

More accepted argument types

Parameters and property setters now declare the other types the binding converts for them, so calls that already worked no longer read as type errors:

-    def __add__(self, c: Colour) -> Colour:
+    def __add__(self, c: Colour | Col | HDRColour) -> Colour:

About 500 parameters and setters changed this way. Their type is otherwise unchanged, so they are not listed below.

Other typing improvements

These changes describe the existing behaviour more precisely and need no change to code:

Added

Classes

FieldKeyComponents

class FieldKeyComponents(_BlipValue):
    """
    Struct to represent a unique pair of layer and its field that is controlled by a Look

Look

class Look(SuperTrack):
    """
    A Look is a self-contained, single section Track, containing one or more sequenced Layers. It serves as a template to be referenced other Tracks using Look Layers.

LookModule

class LookModule(Module):
    """
    Look Module is responsible for Look playback. Multiple Look Modules can reference the same Look simultaneously,

LookModuleConfig

class LookModuleConfig(ModuleConfig):
    """
    Configuration for a Look module.

LookPlayHead

class LookPlayHead(TrackPlayHead):
    """
    Special playhead for playing a Look. Mainly used by the LookModule as internal playhead to playback selected Look.
    
    Category: Transports
    """

    _classInfo: 'ClassInfo'
    __username__ = 'LookPlayHead'

LookProjection

class LookProjection(Projection):
    """
    Custom projection for a Look module.
    
    Category: Mappings
    """

    _classInfo: 'ClassInfo'
    __username__ = 'LookProjection'

    def __init__(self) -> None:
        """
        Default constructor for LookProjection
        """
        ...

LookSequencing

class LookSequencing(_BlipValue):
    """
    Utility class that provides mapping-like functionality between Look’s layers fields and its personality.

MulticastConfig

class MulticastConfig(Resource):
    """
    The multicast destinations a network feed head streams to: an address and port for the primary and

Class.variables

HashTable.elemType

    elemType: Final[Type[Type1]]  #: The type of the values the table holds

HashTable.keyType

    keyType: Final[Type[str]]  #: The type of the table's keys, which is always str

ClusterAssigner.COMPRESSION_CODEC_AV1

    COMPRESSION_CODEC_AV1: Final[NetworkVideo_CompressionCodec] = NetworkVideo_CompressionCodec.AV1  #: Transport sending compressed video compressed with the AV1 codec

ClusterAssigner.COMPRESSION_CODEC_H265

    COMPRESSION_CODEC_H265: Final[NetworkVideo_CompressionCodec] = NetworkVideo_CompressionCodec.H265  #: Transport sending compressed video compressed with the H.265 codec

NetworkFeedConfig.COMPRESSION_CODEC_AV1

    COMPRESSION_CODEC_AV1: Final[NetworkVideo_CompressionCodec] = NetworkVideo_CompressionCodec.AV1  #: Transport type sending compressed video compressed with the AV1 codec

NetworkFeedConfig.COMPRESSION_CODEC_H265

    COMPRESSION_CODEC_H265: Final[NetworkVideo_CompressionCodec] = NetworkVideo_CompressionCodec.H265  #: Transport type sending compressed video compressed with the H.265 codec

NetworkFeedConfig.TRANSPORT_BIT_DEPTH_10

    TRANSPORT_BIT_DEPTH_10: Final[NetworkVideo_TransportBitDepth] = NetworkVideo_TransportBitDepth._10Bit  #: Transport bit depth of 10 bits per colour component

NetworkFeedConfig.TRANSPORT_BIT_DEPTH_8

    TRANSPORT_BIT_DEPTH_8: Final[NetworkVideo_TransportBitDepth] = NetworkVideo_TransportBitDepth._8Bit  #: Transport bit depth of 8 bits per colour component

NetworkFeedConfig.TRANSPORT_FORMAT_RGB444

    TRANSPORT_FORMAT_RGB444: Final[NetworkVideo_TransportFormat] = NetworkVideo_TransportFormat.RGB444  #: Transport format carrying full RGB 4:4:4 colour sampling

NetworkFeedConfig.TRANSPORT_FORMAT_YUV420

    TRANSPORT_FORMAT_YUV420: Final[NetworkVideo_TransportFormat] = NetworkVideo_TransportFormat.YUV420  #: Transport format carrying YCbCr colour sampling with horizontally and vertically subsampled chroma

NetworkFeedConfig.TRANSPORT_FORMAT_YUV444

    TRANSPORT_FORMAT_YUV444: Final[NetworkVideo_TransportFormat] = NetworkVideo_TransportFormat.YUV444  #: Transport format carrying YCbCr colour sampling with full resolution chroma

NetworkFeedConfig.TRANSPORT_TYPE_COMPRESSED

    TRANSPORT_TYPE_COMPRESSED: Final[NetworkVideo_TransportType] = NetworkVideo_TransportType.Compressed  #: Transport type sending compressed video over ST.2110-22

NetworkFeedConfig.TRANSPORT_TYPE_COMPRESSED_NDI

    TRANSPORT_TYPE_COMPRESSED_NDI: Final[NetworkVideo_TransportType] = NetworkVideo_TransportType.CompressedNDI  #: Transport type sending compressed video as an NDI stream

Class.properties

ClusterAssigner.codec

    codec: int

ClusterAssigner.compressedBitrate

    compressedBitrate: int

D3NetManager.multicastConfigs

    multicastConfigs: List[MulticastConfig]

D3NetManager.outputMachines

    outputMachines: List[Machine]  # read-only

D3State.projectClockType

    projectClockType: SMPTEClockType  # read-only

FieldSequence.isConnected

    isConnected: bool  # read-only

FisheyeProjection.diagonalFov

    diagonalFov: float

FisheyeProjection.fovRadiusRatio

    fovRadiusRatio: float  # read-only

FisheyeProjection.maxFov

    maxFov: float  # read-only

NetworkFeedConfig.codec

    codec: NetworkVideo_CompressionCodec

NetworkFeedConfig.compressedBitrate

    compressedBitrate: int

NetworkFeedConfig.multicastConfig

    multicastConfig: MulticastConfig

PongModule.resetScore

    resetScore: int

PrivateState.defaultLookLengthSec

    defaultLookLengthSec: float

PrivateState.defaultTrackLengthSec

    defaultTrackLengthSec: float

PrivateState.shiftFocusToTimelineOnJump

    shiftFocusToTimelineOnJump: bool

ProxySettings.codec

    codec: int

ProxySettings.compressedBitrate

    compressedBitrate: int

ST2110Details.enableRedundancy

    enableRedundancy: bool

ST2110Details.localAdapter

    localAdapter: IPAddress

ST2110Details.redundantLocalAdapter

    redundantLocalAdapter: IPAddress

ST2110Details.redundantMulticastDst

    redundantMulticastDst: IPAddress

ST2110Details.redundantMulticastSrc

    redundantMulticastSrc: IPAddress

ST2110Details.redundantPort

    redundantPort: int

SockpuppetProperty.defaultResourceUid

    defaultResourceUid: int

Class.methods

ContentSource.isArrowSource

    @staticmethod
    def isArrowSource(sequence: FieldSequence) -> bool:

ContentSource.isContentSource

    @staticmethod
    def isContentSource(sequence: FieldSequence) -> bool:

ContentSource.isTextureSource

    @staticmethod
    def isTextureSource(sequence: FieldSequence) -> bool:

D3NetManager.adoptMulticastConfigsFromHeads

    def adoptMulticastConfigsFromHeads(self) -> None:

D3NetManager.licenseCapabilitiesForMachine

    def licenseCapabilitiesForMachine(self, machine: Machine) -> optional[LicenseCapabilities]:

D3NetManager.removeMulticastConfig

    def removeMulticastConfig(self, config: MulticastConfig) -> None:

D3NetManager.allMachinesConnected

    @staticmethod
    def allMachinesConnected(machines: List[Machine]) -> bool:

D3NetManager.anyMachineNeedsDisplaySettingsApplied

    @staticmethod
    def anyMachineNeedsDisplaySettingsApplied(machines: List[Machine]) -> bool:

D3NetManager.notifyIfAnyMachineNeedsDisplaySettingsApplied

    @staticmethod
    def notifyIfAnyMachineNeedsDisplaySettingsApplied(machines: List[Machine]) -> bool:

FieldSequence.evalString

    def evalString(self, t: float, ttl: int) -> str:

FieldSequence.expressionControlled

    def expressionControlled(self) -> bool:

FieldSequence.getControlState

    def getControlState(self) -> FieldSequence.ControlState:

FieldSequence.isExposedOnLook

    def isExposedOnLook(self) -> bool:

Layer.isExternallyControlled

    def isExternallyControlled(self) -> bool:

Machine.notifyIfNeedsDisplaySettingsApplied

    def notifyIfNeedsDisplaySettingsApplied(self) -> bool:

Machine.splitMatrixInputs

    @staticmethod
    def splitMatrixInputs(input: str) -> List[str]:

Machine.splitMatrixOutputs

    @staticmethod
    def splitMatrixOutputs(output: str) -> List[str]:

Module.removeDisconnectedSequences

    def removeDisconnectedSequences(self) -> None:

NetworkFeedConfig.isValidTransportCombination

    @staticmethod
    def isValidTransportCombination(type: NetworkVideo_TransportType, format: NetworkVideo_TransportFormat, bitDepth: NetworkVideo_TransportBitDepth, codec: NetworkVideo_CompressionCodec) -> bool:

SetList.addTrack

    def addTrack(self, track: Track) -> None:

SetList.isTrackValid

    def isTrackValid(self, track: Track) -> bool:

SockpuppetProperty.getDefaultResource

    def getDefaultResource(self) -> Resource:

SockpuppetProperty.setDefaultResource

    def setDefaultResource(self, resource: Resource) -> Self:

SuperTrack.clear

    def clear(self) -> None:

SuperTrack.getUnsupportedLayers

    def getUnsupportedLayers(self, sl: SuperLayer) -> List[str]:

SuperTrack.moduleIsSupported

    def moduleIsSupported(self, moduleType: type) -> bool:

Track.timeOfNoteContainingBeat

    def timeOfNoteContainingBeat(self, iBeat: float) -> float:

Removed

Class.variables

ClusterAssigner.SPLIT_TYPE_MANUAL

    SPLIT_TYPE_MANUAL: Final[int] = 2

ClusterAssigner.SPLIT_TYPE_TILES

    SPLIT_TYPE_TILES: Final[int] = 0

ClusterAssigner.TRANSPORT_BIT_DEPTH_10

    TRANSPORT_BIT_DEPTH_10: Final[int] = 1

ClusterAssigner.TRANSPORT_BIT_DEPTH_12

    TRANSPORT_BIT_DEPTH_12: Final[int] = 2

ClusterAssigner.TRANSPORT_BIT_DEPTH_16

    TRANSPORT_BIT_DEPTH_16: Final[int] = 3

ClusterAssigner.TRANSPORT_BIT_DEPTH_8

    TRANSPORT_BIT_DEPTH_8: Final[int] = 0

ClusterAssigner.TRANSPORT_FORMAT_RGB444

    TRANSPORT_FORMAT_RGB444: Final[int] = 0

ClusterAssigner.TRANSPORT_FORMAT_YUV420

    TRANSPORT_FORMAT_YUV420: Final[int] = 2

ClusterAssigner.TRANSPORT_FORMAT_YUV422

    TRANSPORT_FORMAT_YUV422: Final[int] = 1

ClusterAssigner.TRANSPORT_TYPE_COMPRESSED

    TRANSPORT_TYPE_COMPRESSED: Final[int] = 2

ClusterAssigner.TRANSPORT_TYPE_LOCAL

    TRANSPORT_TYPE_LOCAL: Final[int] = 3

ClusterAssigner.TRANSPORT_TYPE_NDI

    TRANSPORT_TYPE_NDI: Final[int] = 0

ClusterAssigner.TRANSPORT_TYPE_UNCOMPRESSED

    TRANSPORT_TYPE_UNCOMPRESSED: Final[int] = 1

D3NetManager.MachineStatus.State.Busy

    Busy: Final[int] = 3

D3NetManager.MachineStatus.State.Connection

    Connection: Final[int] = 0

D3NetManager.MachineStatus.State.Devices

    Devices: Final[int] = 3

D3NetManager.MachineStatus.State.Error

    Error: Final[int] = 2

D3NetManager.MachineStatus.State.Genlock

    Genlock: Final[int] = 2

D3NetManager.MachineStatus.State.Offline

    Offline: Final[int] = 4

D3NetManager.MachineStatus.State.Output

    Output: Final[int] = 1

D3NetManager.MachineStatus.State.Ready

    Ready: Final[int] = 0

D3NetManager.MachineStatus.State.Warning

    Warning: Final[int] = 1

Class.methods

Machine.createNextMulticastInfo

    def createNextMulticastInfo(self) -> None:

Machine.removeMulticastInfo

    def removeMulticastInfo(self, index: int) -> None:

NetworkFeedConfig.isValidSt2110TransportCombination

    @staticmethod
    def isValidSt2110TransportCombination(type: TransportType, format: TransportFormat, bitDepth: TransportBitDepth) -> bool:

SuperTrack.timeOfNoteContainingBeat

    def timeOfNoteContainingBeat(self, iBeat: float) -> float:

Moved

Classes

MachineStatus → D3NetManager.MachineStatus

    class MachineStatus(_BlipValue):
        """
        Category: D3Net

State → D3NetManager.MachineStatus.State

        class State(_BlipValue):
            """
            Category: D3Net

Modified

Class.methods

ClusterAssigner.isValidWorkloadTransportCombination

-    @staticmethod
-    def isValidWorkloadTransportCombination(type: TransportType, format: TransportFormat, bitDepth: TransportBitDepth, alphaEnabled: bool) -> bool:
+    @staticmethod
+    def isValidWorkloadTransportCombination(type: NetworkVideo_TransportType, format: NetworkVideo_TransportFormat, bitDepth: NetworkVideo_TransportBitDepth, alphaEnabled: bool, codec: NetworkVideo_CompressionCodec) -> bool:

DmxPatch.nChannels

-    @staticmethod
-    def nChannels(property: SockpuppetPropertyType) -> int:
+    @staticmethod
+    def nChannels(property: SockpuppetProperty) -> int:

FeedScene.exportRectsAsTable

-    @staticmethod
-    def exportRectsAsTable(rects: List[FeedRect], path: str) -> Table:
+    @staticmethod
+    def exportRectsAsTable(rects: List[Any], path: str) -> Table:

IPVideoInSystem.createOrUpdateVideoInFromSDP

-    def createOrUpdateVideoInFromSDP(self, file: str, path: optional[str], overwrite: bool, updateNMOSConnectionAPI: bool, sender_id: optional[str], pers: PersistentIPVideoIn) -> str:
+    def createOrUpdateVideoInFromSDP(self, file: str, path: optional[str] | std_nullopt | str, overwrite: bool, arg3: bool, sender_id: optional[str] | std_nullopt | str, pers: PersistentIPVideoIn) -> str:

LayerStack.makeArrow

-    def makeArrow(self, src: Layer, dest: Layer) -> None:
+    def makeArrow(self, src: Module, dest: Module) -> None:

LayerViewHelper.precompExtents

-    @staticmethod
-    def precompExtents(track: Track) -> List[PrecompExtent]:
+    @staticmethod
+    def precompExtents(track: SuperTrack) -> List[PrecompExtent]:

NetSys.getNetworkAdaptors

-    @staticmethod
-    def getNetworkAdaptors(excludeLoopback: bool, excludeLinkLocal: bool) -> List[netsys::NetworkAdaptor]:
+    @staticmethod
+    def getNetworkAdaptors(excludeLoopback: bool, excludeLinkLocal: bool) -> List[netsys_NetworkAdaptor]:

SuperTrack.makeArrow

-    def makeArrow(self, src: Layer, dest: Layer) -> None:
+    def makeArrow(self, src: Module, dest: Module) -> None:

Class.properties

AxisAngle.angle

-    angle: float
+    angle: Type2

AxisAngle.axis

-    axis: Vec
+    axis: Type1

Class.variables

SockpuppetPersonality.__username__

-    __username__ = 'SockpuppetPersonality'
+    __username__ = 'Personality'

SuperTrack.__username__

-    __username__ = 'SuperTrack'
+    __username__ = 'Track / Look'