From slack chat - a nice check of the otio file is damaged.
import sys
def validate_file(path):
timeline = otio.adapters.read_from_file(path)
for clip in timeline.each_clip():
validate_clip(clip)
def validate_clip(clip):
source_range = clip.source_range
has_media_ref = clip.media_reference != None
available_range = None
if has_media_ref:
available_range = clip.media_reference.available_range
print(clip.name)
if not source_range:
print(" no source range")
if not has_media_ref:
print(" no media reference")
elif not available_range:
print(" no available range")
if source_range and available_range:
if source_range.start_time.rate != available_range.start_time.rate:
print(" source and available range start time rates don't match", source_range.start_time.rate, available_range.start_time.rate)
if source_range.duration.rate != available_range.duration.rate:
print(" source and available range duration rates don't match", source_range.duration.rate, available_range.duration.rate)
if source_range.start_time < available_range.start_time:
print(" source range starts before available range", source_range.start_time, available_range.start_time)
if source_range.end_time_inclusive() > available_range.end_time_inclusive():
print(" source range ends after available range", source_range.end_time_inclusive(), available_range.end_time_inclusive())
for path in sys.argv[1:]:
validate_file(path)```