예제 #1
0
def generate_multiple_part_per_file_renames(infos):
    """ Uses a renamer suitable for handling files with Multiple Episodes contained within (S01E01 -> S01E01-E02). """
    renames = []
    for info in infos:
        episode_num = int(info.episode.split('E')[1])
        end_num = episode_num * eps_per_file
        episode_seg = 'E' + parse.format_num(end_num - 1) + '-E' + parse.format_num(end_num)
        new_name = show_name + ' - ' + info.season + episode_seg + ' - ' + info.title + '.' + info.extension
        renames.append(EpisodeRename(info.original_filename, new_name))

    return renames
예제 #2
0
def generate_derived_season_renames(infos):
    """ Uses a renamer suitable for handling files with derived seasons. (Season 1 Episode 1 -> S01E01). """
    renames = []

    for info in infos:
        if len(info.title) == 0:
            sep_and_title = ''
        else:
            sep_and_title = ' - ' + info.title

        episode = (' ' if manga_mode else '') + info.episode
        if offset != 0:
            num = (int(
                info.episode.replace('E', '')) + offset) or 1  # Default to 1 if we go <= 0, as episodes min should be 1
            episode = 'E' + parse.format_num(num)

        if anime_mode:
            if info.scene_group is not None:
                scene_group = '[' + str(info.scene_group) + '] '
            else:
                scene_group = ''
            media_and_hash = (' ' + generate_media_info_format(info.media_info) + ' ' + info.hash_code).strip()
            new_name = scene_group + show_name + ' - ' + info.season + episode + sep_and_title + media_and_hash + '.' + info.extension
        else:
            new_name = show_name + ' - ' + info.season + episode + sep_and_title + '.' + info.extension
        renames.append(EpisodeRename(info.original_filename, new_name.strip()))
    return renames
예제 #3
0
def generate_episode_infos(root_dir):
    file_infos = []
    for _, _, files in os.walk(root_dir, topdown=False):
        files.sort()
        for file in files:
            if parse.is_media_file(file) or (parse.is_manga(file) and manga_mode):
                parts = os.path.splitext(file)
                filename = parts[0]
                info = EpisodeInfo(root_dir, filename)
                info.original_filename = file
                if anime_mode:
                    info.episode = parse.parse_anime_episode(filename)
                    info.subtitle = find_subtitle(root_dir, filename)  # TODO: See if this works fine for anime
                    info.extension = parts[1].replace('.', '')
                    info.media_info = parse.parse_media_info(filename)
                    info.title = parse.parse_anime_episode_title(filename)
                    info.hash_code = parse.parse_anime_hash(filename)
                    info.scene_group = parse.parse_anime_group(filename)
                    if season_num is None:
                        info.season = 'S01'  # TODO: Figure out how to handle this. Assume Season 01 always?
                    else:
                        info.season = 'S' + parse.format_num(int(season_num))
                elif manga_mode:
                    info.episode = parse.parse_chapter(filename)
                    info.extension = parts[1].replace('.', '')
                    info.title = parse.parse_manga_title(filename)
                    if season_num is None:
                        info.season = parse.parse_volume(filename)
                    else:
                        info.season = 'Volume ' + parse.format_num(int(season_num))
                else:
                    info.episode = parse.parse_episode(filename)
                    info.part_num = parse.parse_episode_part(filename)
                    info.subtitle = find_subtitle(root_dir, filename)
                    info.extension = parts[1].replace('.', '')
                    info.title = parse.parse_episode_title(filename)
                    # info.media_info = parse.parse_media_info(filename) # TODO: Implement test cases to handle for non-anime
                    if season_num is None:
                        info.season = parse.parse_season(filename)
                    else:
                        info.season = 'S' + parse.format_num(int(season_num))
                file_infos.append(info)
    return file_infos
예제 #4
0
def generate_season_map_file_renames(infos):
    """ Uses a renamer suitable for handling abs numbered files and splitting them into seasoned based on their number. """
    renames = []
    for info in infos:
        episode_num = 0
        if manga_mode:
            episode_num = int(info.episode.split('Chapter ')[1])
        else:
            episode_num = int(info.episode.split('E')[1])

        bucket_index = 0
        sum = 0
        # Find what bucket episode_num fits in. We use +1 because 
        for idx, val in enumerate(season_maps):
            sum += val
            # print('Is {0} <= {1}'.format(episode_num, sum))
            if episode_num <= sum:
                print('Episode {0} maps to bucket {1} ({2} episodes)'.format(episode_num, idx, val))
                bucket_index = idx
                sum_until_bucket = sum_until(season_maps, idx)
                delta = abs(episode_num - sum_until_bucket)
                # print('Sum Until: {0}'.format(sum_until_bucket))
                # print('Delta: {0}'.format(delta))
                # episode_num = episode_num - delta

                episode_seg = ('E' if not manga_mode else 'Chapter ') + parse.format_num(delta)
                season_seg = ('S' if not manga_mode else 'Volume ') + parse.format_num(bucket_index + 1)
                if len(info.title) == 0:
                    sep_and_title = ''
                else:
                    sep_and_title = ' - ' + info.title

                if anime_mode:
                    media_and_hash = (' ' + generate_media_info_format(info.media_info) + ' ' + info.hash_code).strip()
                    # new_name = '[{scene_group}] {show_name} - {season_seg}{episode_seg} - {title}{media_and_hash}.{extension}'
                    new_name = '[' + info.scene_group + '] ' + show_name + ' - ' + season_seg + episode_seg + sep_and_title + media_and_hash + '.' + info.extension
                else:
                    new_name = show_name + ' - ' + season_seg + episode_seg + sep_and_title + '.' + info.extension
                renames.append(EpisodeRename(info.original_filename, new_name))
                break

    return renames
예제 #5
0
def generate_part_renames(infos):
    """ Uses a renamer suitable for handling files with parts (S01E01A -> S01E01, S01E01B -> S01E02). """
    renames = []
    highest_part = max(infos, key=lambda info: info.part_num).part_num
    print('highest part: {0}'.format(highest_part))
    for info in infos:
        episode_num = int(info.episode.split('E')[1])
        # (Ep_num - 1) * highest_part + part
        new_num = (episode_num - 1) * highest_part + info.part_num
        new_name = show_name + ' - ' + info.season + 'E' + parse.format_num(
            new_num) + ' - ' + info.title + '.' + info.extension
        renames.append(EpisodeRename(info.original_filename, new_name))
    return renames
예제 #6
0
def generate_season_map_file_renames_for_manga(infos):
    """ Uses a renamer suitable for handling abs numbered files and splitting them into seasoned based on their number.
    This will continue chapter numbers after a volume boundary hit """
    renames = []
    for info in infos:
        episode_num = 0
        if manga_mode:
            episode_num = int(info.episode.split('Chapter ')[1])
        else:
            episode_num = int(info.episode.split('E')[1])

        bucket_index = 0
        sum = 0
        # Find what bucket episode_num fits in. We use +1 because
        for idx, val in enumerate(season_maps):
            sum += val
            # print('Is {0} <= {1}'.format(episode_num, sum))
            if episode_num <= sum:
                print('Episode {0} maps to bucket {1} ({2} episodes)'.format(episode_num, idx, val))
                bucket_index = idx
                sum_until_bucket = sum_until(season_maps, idx)
                delta = abs(episode_num - sum_until_bucket)
                # print('Sum Until: {0}'.format(sum_until_bucket))
                # print('Delta: {0}'.format(delta))
                # episode_num = episode_num - delta

                episode_seg = ('E' if not manga_mode else 'Chapter ') + parse.format_num(episode_num)
                season_seg = ('S' if not manga_mode else 'Volume ') + parse.format_num(bucket_index + 1)
                if len(info.title) == 0:
                    sep_and_title = ''
                else:
                    sep_and_title = ' - ' + info.title

                new_name = show_name + ' - ' + season_seg + ' ' + episode_seg + sep_and_title + '.' + info.extension

                renames.append(EpisodeRename(info.original_filename, new_name))
                break

    return renames
예제 #7
0
 def test_format_num(self):
     self.assertEqual(parse.format_num(1), '01')
     self.assertEqual(parse.format_num(11), '11')
     self.assertEqual(parse.format_num(None), None)