Source code for cgl.plugins.otio.tools.resolve.resolve_exr_media_linker
import os
import glob
import opentimelineio as otio
[docs]
def register_exr_media_linker():
active_manifest = otio.plugins.manifest.ActiveManifest()
for linker in active_manifest.media_linkers:
if linker.name == "resolve_exr_media_linker":
return
print("registering media linker", __file__)
linker = otio.media_linker.MediaLinker("resolve_exr_media_linker", __file__)
active_manifest.media_linkers.insert(0, linker)
[docs]
def get_exr_last_frame(dirname, name_prefix, name_suffix, frame_format):
if not os.path.exists(dirname):
return None
glob_str = f"{dirname}/{name_prefix}*{name_suffix}"
files = glob.glob(glob_str)
if not files:
return None
frames = {}
for f in files:
frame_number = os.path.basename(f).replace(name_prefix, "").replace(name_suffix, "")
if not frame_number.isdigit():
return None
frames[int(frame_number)] = f
if not frames:
return None
last_frame = max(frames.keys())
return frame_format % last_frame
[docs]
def link_media_reference(in_clip, media_linker_argument_map):
if not isinstance(in_clip, otio.schema.Clip):
return
media_ref = in_clip.media_reference
if isinstance(media_ref, otio.schema.ImageSequenceReference):
# target_url = "file:///C:/show_storage/seq/seq010/seq010_v000_01_[00000-000048].exr"
dirname = media_ref.target_url_base.replace("file:", "").lstrip("/")
base_url = f"file:///{dirname}"
name_suffix = media_ref.name_suffix
name_prefix = media_ref.name_prefix
start_frame = media_ref.start_frame,
frame_zero_padding = media_ref.frame_zero_padding
frame_format = "%d"
if frame_zero_padding:
frame_format = f"%0{frame_zero_padding}d"
first_frame = frame_format % start_frame
frame_formatting = first_frame
## doing this doesn't improve import speed
# last_frame = get_exr_last_frame(dirname, name_prefix, name_suffix, frame_format)
# if last_frame:
# frame_formatting = f"[{first_frame}-{last_frame}]"
target_url = f"{base_url}/{name_prefix}{frame_formatting}{name_suffix}"
print(target_url)
ref = otio.schema.ExternalReference(target_url=target_url, available_range = media_ref.available_range)
in_clip.media_reference = ref