Skip to content

load_clip

Load a clip from a file.

LoadClip

Bases: MochaLoader

Load a clip from a file.

Source code in client/ayon_mocha/plugins/load/load_clip.py
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
class LoadClip(MochaLoader):
    """Load a clip from a file."""

    label = "Load Clip"
    order = -10
    icon = "code-fork"
    color = "orange"

    product_types: ClassVar[set[str]] = {"*"}
    representations: ClassVar[set[str]] = {"*"}
    extensions: ClassVar[set[str]] = {
        ext.lstrip(".") for ext in IMAGE_EXTENSIONS}

    def load(self,
             context: dict,
             name: Optional[str] = None,
             namespace: Optional[str] = None,
             options: Optional[dict] = None) -> None:
        """Load a clip from a file."""
        host: MochaProHost = registered_host()
        project = host.get_current_project()
        with project.undo_group():
            file_path = self.filepath_from_context(context)

            # Check if the clip with the same name already exists
            # Mocha will load clips with the same name, but it will
            # show in the UI just one of them, and it makes things
            # confusing for the user.
            clips = project.get_clips()
            if name in clips:
                self.log.warning("Clip %s already exists", name)
                idx = 1
                while f"{name}_{idx}" in clips:
                    idx += 1
                name = f"{name}_{idx}"

            clip = Clip(file_path, name)
            project.add_clip(clip, name)
            project.new_output_clip(clip, name)

            container = Container(
                name=name,
                namespace=namespace or "",
                loader=self.__class__.__name__,
                representation=str(context["representation"]["id"]),
                objectName=clip.name,
                timestamp=time.time_ns()
            )
            host.add_container(container)
            update_ui()
            self.log.debug("Loaded clip: %s", clip)

    def switch(self, container: dict, context: dict) -> None:
        """Switch the image sequence on the current camera."""
        self.update(container, context)

    def remove(self, container: dict) -> None:
        """Remove a container."""
        host: MochaProHost = registered_host()
        project = host.get_current_project()

        clips = project.get_clips()
        clip = clips.get(container["objectName"])
        if not clip:
            self.log.warning("Clip %s not found", container["objectName"])
            return
        del clip
        host.remove_container(Container(**container))

    def update(self, container: dict, context: dict) -> None:
        """Update a container.

        Args:
            container (dict): Container to update.
            context (dict): Context to update the container to.

        Raises:
            LoadError: If the image info cannot be retrieved.

        """
        host: MochaProHost = registered_host()

        version_entity = context["version"]
        repre_entity = context["representation"]

        file_path = get_representation_path(repre_entity)
        project = host.get_current_project()
        clips = project.get_clips()

        # get image info using OIIO
        try:
            image_info = get_image_info(Path(file_path))
        except ValueError as e:
            msg = f"Failed to get image info for {file_path}: {e}"
            raise LoadError(msg) from e

        try:
            clips[container["objectName"]].relink(file_path)
            clips[container["objectName"]].frame_size = (
                image_info.get("width", 1920),
                image_info.get("height", 1080),
            )
        except KeyError:
            self.log.warning("Clip %s not found", container["objectName"])
        update_ui()

        container["representation"] = repre_entity["id"]
        container["version"] = str(version_entity["version"])
        host.add_container(Container(**container))

load(context, name=None, namespace=None, options=None)

Load a clip from a file.

Source code in client/ayon_mocha/plugins/load/load_clip.py
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
def load(self,
         context: dict,
         name: Optional[str] = None,
         namespace: Optional[str] = None,
         options: Optional[dict] = None) -> None:
    """Load a clip from a file."""
    host: MochaProHost = registered_host()
    project = host.get_current_project()
    with project.undo_group():
        file_path = self.filepath_from_context(context)

        # Check if the clip with the same name already exists
        # Mocha will load clips with the same name, but it will
        # show in the UI just one of them, and it makes things
        # confusing for the user.
        clips = project.get_clips()
        if name in clips:
            self.log.warning("Clip %s already exists", name)
            idx = 1
            while f"{name}_{idx}" in clips:
                idx += 1
            name = f"{name}_{idx}"

        clip = Clip(file_path, name)
        project.add_clip(clip, name)
        project.new_output_clip(clip, name)

        container = Container(
            name=name,
            namespace=namespace or "",
            loader=self.__class__.__name__,
            representation=str(context["representation"]["id"]),
            objectName=clip.name,
            timestamp=time.time_ns()
        )
        host.add_container(container)
        update_ui()
        self.log.debug("Loaded clip: %s", clip)

remove(container)

Remove a container.

Source code in client/ayon_mocha/plugins/load/load_clip.py
76
77
78
79
80
81
82
83
84
85
86
87
def remove(self, container: dict) -> None:
    """Remove a container."""
    host: MochaProHost = registered_host()
    project = host.get_current_project()

    clips = project.get_clips()
    clip = clips.get(container["objectName"])
    if not clip:
        self.log.warning("Clip %s not found", container["objectName"])
        return
    del clip
    host.remove_container(Container(**container))

switch(container, context)

Switch the image sequence on the current camera.

Source code in client/ayon_mocha/plugins/load/load_clip.py
72
73
74
def switch(self, container: dict, context: dict) -> None:
    """Switch the image sequence on the current camera."""
    self.update(container, context)

update(container, context)

Update a container.

Parameters:

Name Type Description Default
container dict

Container to update.

required
context dict

Context to update the container to.

required

Raises:

Type Description
LoadError

If the image info cannot be retrieved.

Source code in client/ayon_mocha/plugins/load/load_clip.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
def update(self, container: dict, context: dict) -> None:
    """Update a container.

    Args:
        container (dict): Container to update.
        context (dict): Context to update the container to.

    Raises:
        LoadError: If the image info cannot be retrieved.

    """
    host: MochaProHost = registered_host()

    version_entity = context["version"]
    repre_entity = context["representation"]

    file_path = get_representation_path(repre_entity)
    project = host.get_current_project()
    clips = project.get_clips()

    # get image info using OIIO
    try:
        image_info = get_image_info(Path(file_path))
    except ValueError as e:
        msg = f"Failed to get image info for {file_path}: {e}"
        raise LoadError(msg) from e

    try:
        clips[container["objectName"]].relink(file_path)
        clips[container["objectName"]].frame_size = (
            image_info.get("width", 1920),
            image_info.get("height", 1080),
        )
    except KeyError:
        self.log.warning("Clip %s not found", container["objectName"])
    update_ui()

    container["representation"] = repre_entity["id"]
    container["version"] = str(version_entity["version"])
    host.add_container(Container(**container))