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
 18
 19
 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
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."""
        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()
        try:
            clips[container["objectName"]].relink(file_path)
        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
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
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
74
75
76
77
78
79
80
81
82
83
84
85
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
70
71
72
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.

Source code in client/ayon_mocha/plugins/load/load_clip.py
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
def update(self, container: dict, context: dict) -> None:
    """Update a container."""
    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()
    try:
        clips[container["objectName"]].relink(file_path)
    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))