import os from typing import List, Optional from app.services.folder_service import FolderService from app.utils import windows_sort_unicode from app.constants import IGNORE_DIRS, SEPARATORS, SPECIAL_PREFIXES, SPECIAL_DIRS class FileService: def __init__(self, paths: List[str]): self.paths = paths self.result_list: list[str] = [] def perform_rename(self, entry: os.DirEntry[str], new_name: str) -> Optional[str]: if new_name == entry.name: return None new_path = os.path.join(os.path.dirname(entry.path), new_name) try: os.rename(entry.path, new_path) except Exception as e: print(e) self.result_list.insert(0, new_path) # return new_path def process_folder_name(self, entry: os.DirEntry[str]) -> Optional[str]: if not any(sep in entry.name for sep in SEPARATORS): return None # 替换所有分隔符为+ new_name = entry.name for sep in SEPARATORS: new_name = new_name.replace(sep, "+") # 分割并排序各部分 parts = new_name.split("+") sorted_parts = windows_sort_unicode(parts) new_name = "+".join(sorted_parts) if new_name == entry.name: return None return self.perform_rename(entry, new_name) def process_file_name(self, entry: os.DirEntry[str]) -> Optional[str]: parent_dir = os.path.basename(os.path.dirname(entry.path)) name, ext = os.path.splitext(entry.name) ext = ext.lower() name = name.upper() # 排除特殊文件夹,仅处理大小写问题 if parent_dir in SPECIAL_DIRS: return self.perform_rename(entry, f"{name}{ext}") name = name.replace("-", "") name = name.replace(" ", "") # 处理特殊前缀 for prefix in SPECIAL_PREFIXES: if name.startswith(prefix): return self.perform_rename(entry, f"{prefix}-{name[len(prefix):]}{ext}") # 在字母和数字之间添加连字符 new_name = [] for i, char in enumerate(name): if i > 0 and not name[i - 1].isnumeric() and char.isnumeric(): new_name.append(f"-{char}") else: new_name.append(char) if ''.join(new_name[-2:]) == "4K": new_name.insert(-2, "-") return self.perform_rename(entry, f"{''.join(new_name)}{ext}") def rename(self) -> List[str]: FolderService(paths=self.paths, ignore_dirs=IGNORE_DIRS, folder_callback=self.process_folder_name, file_callback=self.process_file_name).process_folder() return self.result_list