Skip to content

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)```