3步搞定NAS媒体库混乱:MoviePilot智能批量重命名实战指南
【免费下载链接】MoviePilotNAS媒体库自动化管理工具项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot
你是否曾经面对NAS中杂乱无章的媒体文件命名而头疼不已?"The.Matrix.1999.REMASTERED.2160p.BluRay.x265.10bit.HDR.DTS-HD.MA.TrueHD.7.1.Atmos-SWTYBLZ.mkv"这样的文件名不仅难以阅读,更会导致Plex、Emby、Jellyfin等媒体服务器无法正确刮削元数据。MoviePilot作为一款专业的NAS媒体库自动化管理工具,其智能批量重命名功能通过先进的元数据识别技术,能够自动将混乱的文件名转换为规范格式,让你的媒体库焕然一新。
🔍 智能识别引擎:从混乱到有序的技术魔法
MoviePilot的批量重命名功能核心在于其强大的MetaInfo引擎,这个引擎通过多层解析机制提取媒体文件的关键信息。与传统的简单字符串匹配不同,MoviePilot采用智能分析算法,能够理解复杂的命名约定并提取结构化数据。
文件名解析流程
核心技术实现
元数据识别的核心代码位于app/core/metainfo.py,以下是关键实现逻辑:
def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str] = None) -> MetaBase: """智能元数据识别函数""" # 保留原始标题用于后续处理 org_title = title # 使用自定义识别词预处理标题 title, apply_words = WordsMatcher().prepare(title, custom_words=custom_words) # 提取标题中的媒体信息标签 title, metainfo = find_metainfo(title) # 判断是否为媒体文件 media_exts = settings.RMT_MEDIAEXT + settings.RMT_SUBEXT + settings.RMT_AUDIOEXT title_path = Path(title) if title else None if title_path and title_path.suffix.lower() in media_exts: isfile = True # 移除文件扩展名 title = title_path.stem else: isfile = False # 根据内容类型选择解析器 if is_anime(title): meta = MetaAnime(title, subtitle, isfile) else: meta = MetaVideo(title, subtitle, isfile) # 记录原始标题和应用的自定义词 meta.title = org_title meta.apply_words = apply_words or [] # 应用提取的元数据 if metainfo.get('tmdbid'): meta.tmdbid = int(metainfo['tmdbid']) return meta媒体类型智能判断
MoviePilot能够智能区分电影、电视剧和动漫内容:
def is_anime(name: str) -> bool: """动漫内容识别算法""" if not name: return False # 动漫特有的命名模式识别 if re.search(r'【[+0-9XVPI-]+】\s*【', name, re.IGNORECASE): return True if re.search(r'\s+-\s+[\dv]{1,4}\s+', name, re.IGNORECASE): return True if re.search(r'\[[+0-9XVPI-]+]\s*\[', name, re.IGNORECASE): return True return False🛠️ 批量重命名实战:从配置到执行
1. 命名规则配置
MoviePilot支持灵活的命名模板系统,通过变量占位符实现个性化命名:
| 变量占位符 | 描述 | 示例输出 |
|---|---|---|
{{title}} | 媒体标题 | 流浪地球2 |
{{year}} | 发行年份 | 2023 |
{{season}} | 季数(电视剧) | S01 |
{{episode}} | 集数(电视剧) | E03 |
{{season_episode}} | 季集组合 | S01E03 |
{{resolution}} | 视频分辨率 | 2160p |
{{video_codec}} | 视频编码 | H.265 |
{{audio_codec}} | 音频编码 | DTS-HD.MA |
{{release_group}} | 发布组 | SWTYBLZ |
2. 目录结构配置
通过app/helper/directory.py中的目录管理模块,MoviePilot能够智能匹配媒体文件到正确的媒体库目录:
def get_dir(self, media: MediaInfo, include_unsorted: Optional[bool] = False, storage: Optional[str] = None, src_path: Path = None, target_storage: Optional[str] = None, dest_path: Path = None ) -> Optional[schemas.TransferDirectoryConf]: """智能目录匹配算法""" media_type = media.type.value dirs = self.get_dirs() matched_dirs: List[schemas.TransferDirectoryConf] = [] for d in dirs: # 通用目录匹配 if not d.media_type: matched_dirs.append(d) continue # 精确类型匹配 if d.media_type == media_type and not d.media_category: matched_dirs.append(d) continue # 分类匹配逻辑 if d.media_type == media_type and d.media_category: if media.category and d.media_category in media.category: matched_dirs.append(d) return matched_dirs[0] if matched_dirs else None3. 批量处理流程
🎯 高级应用场景与技巧
多层级元数据合并
当媒体文件存储在多级目录中时,MoviePilot能够智能合并各级目录的元数据:
def MetaInfoPath(path: Path) -> MetaBase: """路径级联元数据识别""" # 文件级别的元数据 file_meta = MetaInfo(title=path.name) # 父目录元数据 parent_meta = MetaInfo(title=path.parent.name) file_meta.merge(parent_meta) # 祖目录元数据(如有) if path.parent.parent: grandparent_meta = MetaInfo(title=path.parent.parent.name) file_meta.merge(grandparent_meta) return file_meta自定义识别词配置
通过自定义识别词系统,你可以优化特殊文件名的解析效果:
# 自定义识别词配置示例 custom_identifiers = [ # 格式:原始词 => 替换词 "Directors.Cut => 导演剪辑版", "Extended.Edition => 加长版", "IMAX => IMAX版本", "4K.Remastered => 4K修复版", # 格式:前定位词 <> 后定位词 >> 偏移量 "Season <> Episode >> -1", # 季偏移 "Part <> Chapter >> +2" # 章节偏移 ] # 在系统中应用自定义识别词 meta = MetaInfo( title="The.Matrix.Directors.Cut.1999.mkv", custom_words=custom_identifiers )媒体服务器路径同步
重命名完成后,MoviePilot可以自动更新媒体服务器的库路径:
def update_media_server_library(media_info: MediaInfo, new_path: Path) -> bool: """更新媒体服务器库路径""" try: # 获取媒体服务器客户端 client = get_media_server_client() # 查找现有媒体项 existing_item = client.find_item( title=media_info.title, year=media_info.year, media_type=media_info.type ) if existing_item: # 更新路径 client.update_item_path( item_id=existing_item.id, new_path=str(new_path) ) return True except Exception as e: logger.error(f"更新媒体服务器失败: {e}") return False🚀 故障排除与最佳实践
常见问题解决方案
问题1:特殊字符导致重命名失败
def sanitize_filename(filename: str, replace_char: str = "_") -> str: """文件名安全处理函数""" # Windows/Linux/Unix非法字符 illegal_chars = ['\\', '/', ':', '*', '?', '"', '<', '>', '|', '\0'] # 替换非法字符 for char in illegal_chars: filename = filename.replace(char, replace_char) # 移除首尾空格和点 filename = filename.strip('. ') # 限制文件名长度(避免路径过长) max_length = 255 if len(filename) > max_length: name, ext = os.path.splitext(filename) filename = name[:max_length-len(ext)] + ext return filename问题2:同名文件冲突处理
def handle_filename_conflict(base_path: Path, filename: str) -> str: """智能文件名冲突解决""" base_name = Path(filename).stem extension = Path(filename).suffix counter = 1 new_filename = filename while (base_path / new_filename).exists(): # 添加序号后缀 new_filename = f"{base_name} ({counter}){extension}" counter += 1 # 防止无限循环 if counter > 100: # 添加时间戳作为最后手段 timestamp = datetime.now().strftime("%Y%m%d%H%M%S") new_filename = f"{base_name}_{timestamp}{extension}" break return new_filename问题3:元数据识别不准确
解决方案矩阵:
| 问题类型 | 解决方案 | 配置示例 |
|---|---|---|
| 电影被识别为电视剧 | 强制类型标记 | {type=movie} |
| 识别错误的TMDB ID | 直接指定ID | [tmdbid=12345] |
| 季集信息错误 | 手动指定季集 | {s=1}{e=1-10} |
| 特殊版本识别失败 | 自定义识别词 | Extended.Edition => 加长版 |
性能优化建议
- 批量处理策略:对于大型媒体库,建议分批次处理,避免单次处理过多文件
- 缓存利用:MoviePilot内置元数据缓存机制,重复识别相同内容时速度更快
- 并行处理:系统支持多线程处理,可在设置中调整并发数量
- 增量处理:仅处理新添加的文件,避免重复处理已整理内容
📊 实际效果对比
处理前 vs 处理后
混乱的原始文件名:
The.Matrix.1999.REMASTERED.2160p.BluRay.x265.10bit.HDR.DTS-HD.MA.TrueHD.7.1.Atmos-SWTYBLZ.mkv Inception.2010.1080p.BluRay.x264.DTS-HD.MA.5.1-RARBG.mp4 Stranger.Things.S01E01.Chapter.One.The.Vanishing.of.Will.Byers.2016.1080p.NF.WEB-DL.DDP5.1.x264-NTb.mkvMoviePilot智能重命名后:
电影/科幻/黑客帝国 (1999)/黑客帝国 (1999) [2160p HDR].mkv 电影/科幻/盗梦空间 (2010)/盗梦空间 (2010) [1080p].mp4 电视剧/科幻惊悚/怪奇物语/Season 01/怪奇物语 S01E01 第一章:威尔拜尔斯的失踪.mkv🔮 未来发展方向
技术演进路线
- AI增强识别:集成机器学习算法,提高复杂文件名的识别准确率
- 多语言支持:优化非英语媒体文件的识别能力
- 智能推荐:基于用户习惯推荐个性化命名规则
- 实时同步:与媒体服务器深度集成,实现实时路径更新
社区贡献指南
MoviePilot作为开源项目,欢迎社区贡献:
- 代码贡献:核心模块位于
app/core/meta/目录 - 规则优化:提交自定义识别词规则到社区仓库
- 插件开发:基于插件系统扩展重命名功能
- 文档完善:帮助改进使用文档和故障排除指南
最佳实践总结
通过合理配置MoviePilot的批量重命名功能,你可以:
- 统一命名规范:确保整个媒体库使用一致的命名规则
- 提升刮削准确率:标准化命名有助于媒体服务器正确识别内容
- 节省管理时间:自动化处理大量媒体文件,解放双手
- 改善浏览体验:清晰的文件名提升媒体库的可浏览性
MoviePilot的批量重命名工具不仅是简单的文件重命名器,而是一个完整的媒体库管理解决方案。通过智能的元数据识别、灵活的命名规则和强大的批量处理能力,它能够将杂乱的媒体文件组织成结构清晰、易于管理的媒体库,让你的NAS媒体管理体验达到新的高度。
【免费下载链接】MoviePilotNAS媒体库自动化管理工具项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考