def split_fn_by_number(fn):
    """split file name by numbers

    '[KTXP][Vivy-Fluorite_Eye's_Song-][03][GB_CN][1080p][HEVC_opus]'
    ->
    [
        '[KTXP][Vivy-Fluorite_Eye's_Song-][',
        '03',
        '][GB_CN][',
        '1080',
        'p][HEVC_opus]'
    ]
    """
    builder = []  # temporate string builder
    ret = []  # hold the built strings

    def _build_string():  # build string from builder and fill into ret
        if builder:  # at the beginning, builder is empty, or at endding, may be empty
            ret.append(''.join(builder))
            builder.clear()

    reading_digit = False  # is last char a digit
    for char in fn:
        is_digit = char.isdigit()

        if is_digit != reading_digit:  # switch state, build string from builder
            _build_string()

        builder.append(char)

        reading_digit = is_digit
    
    _build_string()
    
    return ret