mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
import os
|
|
import pyblish.api
|
|
import subprocess
|
|
from pype.vendor import clique
|
|
|
|
|
|
class ExtractQuicktimeEXR(pyblish.api.InstancePlugin):
|
|
"""Resolve any dependency issies
|
|
|
|
This plug-in resolves any paths which, if not updated might break
|
|
the published file.
|
|
|
|
The order of families is important, when working with lookdev you want to
|
|
first publish the texture, update the texture paths in the nodes and then
|
|
publish the shading network. Same goes for file dependent assets.
|
|
"""
|
|
|
|
label = "Extract Quicktime"
|
|
order = pyblish.api.ExtractorOrder
|
|
families = ["imagesequence", "render", "write", "source"]
|
|
hosts = ["shell"]
|
|
|
|
def process(self, instance):
|
|
fps = instance.data.get("fps")
|
|
start = instance.data.get("startFrame")
|
|
stagingdir = os.path.normpath(instance.data.get("stagingDir"))
|
|
|
|
collected_frames = os.listdir(stagingdir)
|
|
collections, remainder = clique.assemble(collected_frames)
|
|
|
|
full_input_path = os.path.join(
|
|
stagingdir, collections[0].format('{head}{padding}{tail}')
|
|
)
|
|
self.log.info("input {}".format(full_input_path))
|
|
|
|
filename = collections[0].format('{head}')
|
|
if not filename.endswith('.'):
|
|
filename += "."
|
|
movFile = filename + "mov"
|
|
full_output_path = os.path.join(stagingdir, movFile)
|
|
|
|
self.log.info("output {}".format(full_output_path))
|
|
|
|
config_data = instance.context.data['output_repre_config']
|
|
|
|
proj_name = os.environ.get('AVALON_PROJECT', '__default__')
|
|
profile = config_data.get(proj_name, config_data['__default__'])
|
|
|
|
input_args = []
|
|
# overrides output file
|
|
input_args.append("-y")
|
|
# preset's input data
|
|
input_args.extend(profile.get('input', []))
|
|
# necessary input data
|
|
input_args.append("-i {}".format(full_input_path))
|
|
input_args.append("-framerate {}".format(fps))
|
|
input_args.append("-start_number {}".format(start))
|
|
|
|
output_args = []
|
|
# preset's output data
|
|
output_args.extend(profile.get('output', []))
|
|
# output filename
|
|
output_args.append(full_output_path)
|
|
mov_args = [
|
|
"ffmpeg",
|
|
" ".join(input_args),
|
|
" ".join(output_args)
|
|
]
|
|
subprocess_mov = " ".join(mov_args)
|
|
sub_proc = subprocess.Popen(subprocess_mov)
|
|
sub_proc.wait()
|
|
|
|
if "representations" not in instance.data:
|
|
instance.data["representations"] = []
|
|
|
|
representation = {
|
|
'name': 'mov',
|
|
'ext': '.mov',
|
|
'files': movFile,
|
|
"stagingDir": stagingdir,
|
|
}
|
|
instance.data["representations"].append(representation)
|