ayon-core/pype/plugins/harmony/load/load_imagesequence.py

140 lines
3.9 KiB
Python

# -*- coding: utf-8 -*-
"""Loader for image sequences."""
import os
import uuid
from pathlib import Path
import clique
from avalon import api, harmony
import pype.lib
class ImageSequenceLoader(api.Loader):
"""Load image sequences.
Stores the imported asset in a container named after the asset.
"""
families = ["shot", "render", "image", "plate", "reference"]
representations = ["jpeg", "png", "jpg"]
def load(self, context, name=None, namespace=None, data=None):
"""Plugin entry point.
Args:
context (:class:`pyblish.api.Context`): Context.
name (str, optional): Container name.
namespace (str, optional): Container namespace.
data (dict, optional): Additional data passed into loader.
"""
fname = Path(self.fname)
self_name = self.__class__.__name__
collections, remainder = clique.assemble(
os.listdir(fname.parent.as_posix())
)
files = []
if collections:
for f in list(collections[0]):
files.append(fname.parent.joinpath(f).as_posix())
else:
files.append(fname.parent.joinpath(remainder[0]).as_posix())
asset = context["asset"]["name"]
subset = context["subset"]["name"]
group_id = str(uuid.uuid4())
read_node = harmony.send(
{
"function": f"PypeHarmony.Loaders.{self_name}.importFiles", # noqa: E501
"args": [
files,
asset,
subset,
1,
group_id
]
}
)["result"]
return harmony.containerise(
f"{asset}_{subset}",
namespace,
read_node,
context,
self_name,
nodes=[read_node]
)
def update(self, container, representation):
"""Update loaded containers.
Args:
container (dict): Container data.
representation (dict): Representation data.
"""
self_name = self.__class__.__name__
node = harmony.find_node_by_name(container["name"], "READ")
path = api.get_representation_path(representation)
collections, remainder = clique.assemble(
os.listdir(os.path.dirname(path))
)
files = []
if collections:
for f in list(collections[0]):
files.append(
os.path.join(
os.path.dirname(path), f
).replace("\\", "/")
)
else:
files.append(
os.path.join(
os.path.dirname(path), remainder[0]
).replace("\\", "/")
)
harmony.send(
{
"function": f"PypeHarmony.Loaders.{self_name}.replaceFiles",
"args": [files, node, 1]
}
)
# Colour node.
if pype.lib.is_latest(representation):
harmony.send(
{
"function": "PypeHarmony.setColor",
"args": [node, [0, 255, 0, 255]]
})
else:
harmony.send(
{
"function": "PypeHarmony.setColor",
"args": [node, [255, 0, 0, 255]]
})
harmony.imprint(
node, {"representation": str(representation["_id"])}
)
def remove(self, container):
"""Remove loaded container.
Args:
container (dict): Container data.
"""
node = harmony.find_node_by_name(container["name"], "READ")
harmony.send(
{"function": "PypeHarmony.deleteNode", "args": [node]}
)
harmony.imprint(node, {}, remove=True)
def switch(self, container, representation):
"""Switch loaded representations."""
self.update(container, representation)