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