def parse_frame_range()

in utils/frame_range.py [0:0]


def parse_frame_range(frame_range_str: str) -> NamedOptionalSet:
    """
    Create a frame range from a string, e.g.: 1-10,15,21-40,51-62.
    """
    if len(frame_range_str) == 0:
        return NamedOptionalSet(name=frame_range_str, set=OptionalSet())

    range_strs = frame_range_str.split(',')

    def parse_sub_range(sub_range_str: str):
        splits = [int(s) for s in sub_range_str.split('-', maxsplit=1)]
        if len(splits) == 1:
            return splits

        start, end = splits
        assert start <= end
        return range(start, end + 1)

    frame_range = set()
    for range_str in range_strs:
        frame_range.update(parse_sub_range(range_str))

    # Convert the range to a friendly string representation, e.g.,
    # 6,6,5,8,0,2-4,5-6,10,9 -> "0,2-6,8-10"
    it = iter(sorted(frame_range))

    ranges = []
    start = next(it)
    last_index = start

    def add_range(ranges):
        if last_index == start:
            ranges.append(f"{start}")
        else:
            ranges.append(f"{start}-{last_index}")

    for i in it:
        if i < 0:
            raise ValueError("Frame indices must be positive.")
        assert(i > last_index)
        if i - last_index > 1:
            add_range(ranges)
            start = i
        last_index = i
    add_range(ranges)

    name = ",".join(ranges)

    return NamedOptionalSet(name=name, set=OptionalSet(frame_range))