MoviePilot批量重命名:5步解决NAS媒体库命名混乱问题
【免费下载链接】MoviePilotNAS媒体库自动化管理工具项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot
你是否曾为NAS中杂乱无章的媒体文件名而烦恼?"Avengers.Endgame.2019.1080p.BluRay.x264-XXX.mkv"这样的文件名不仅难以阅读,更会导致Plex、Emby等媒体服务器无法正确刮削元数据。MoviePilot作为一款专业的NAS媒体库自动化管理工具,其批量重命名功能通过智能识别技术,可将混乱的文件名自动转换为规范格式,让你的媒体库焕然一新。本文将深入解析MoviePilot的批量重命名核心原理,并提供完整的配置指南和实战技巧。
为什么需要批量重命名?🤔
媒体文件命名混乱是NAS用户普遍面临的痛点。不规范的命名会导致:
- 媒体服务器识别失败- Plex、Emby、Jellyfin等无法正确匹配元数据
- 搜索困难- 难以快速找到特定影片或剧集
- 管理混乱- 手动整理耗时耗力,容易出错
- 自动化失效- 订阅、刮削等自动化功能无法正常工作
MoviePilot的批量重命名工具正是为解决这些问题而生,它基于先进的元数据识别引擎,能够智能解析各种格式的文件名,并按照你设定的规则进行标准化重命名。
核心技术解析:智能元数据识别引擎
MoviePilot的重命名功能核心位于app/core/metainfo.py中的MetaInfo类。这个引擎通过多层解析机制提取媒体文件的关键信息:
文件名解析流程
# 元数据识别核心代码片段 def MetaInfo(title: str, subtitle: Optional[str] = None, custom_words: List[str] = None) -> MetaBase: """根据标题和副标题识别元数据""" # 1. 保存原标题 org_title = title # 2. 预处理标题,移除干扰信息 title, apply_words = WordsMatcher().prepare(title, custom_words=custom_words) # 3. 提取媒体信息 title, metainfo = find_metainfo(title) # 4. 判断是否为视频文件 if title and Path(title).suffix.lower() in settings.RMT_MEDIAEXT: isfile = True title = Path(title).stem # 移除文件扩展名 else: isfile = False # 5. 根据内容类型选择解析器 if is_anime(title): meta = MetaAnime(title, subtitle, isfile) else: meta = MetaVideo(title, subtitle, isfile) # 6. 记录原始信息 meta.title = org_title meta.apply_words = apply_words or [] return meta媒体类型智能判断
MoviePilot能够自动识别电影、电视剧和动漫等不同类型的媒体:
def is_anime(name: str) -> bool: """判断是否为动漫内容""" if not name: return False # 动漫特有的命名模式 patterns = [ r'【[+0-9XVPI-]+】\s*【', # 中文括号格式 r'\s+-\s+[\dv]{1,4}\s+', # 集数分隔格式 r'\[[+0-9XVPI-]+]\s*\[', # 英文括号格式 ] for pattern in patterns: if re.search(pattern, name, re.IGNORECASE): return True return False批量重命名配置实战指南
步骤1:安装与基础配置
首先克隆MoviePilot项目并完成基础安装:
# 一键安装脚本 curl -fsSL https://raw.githubusercontent.com/jxxghp/MoviePilot/v2/scripts/bootstrap-local.sh | bash # 或者手动安装 git clone https://gitcode.com/gh_mirrors/mo/MoviePilot cd MoviePilot python -m pip install -r requirements.txt步骤2:目录结构配置
在app/helper/directory.py中配置媒体库目录:
# 目录配置示例 media_directories = { "movies": "/path/to/movies", "tv_shows": "/path/to/tv_shows", "anime": "/path/to/anime" } # 自动识别并分类 def classify_media(file_path: str) -> str: """根据文件路径自动分类媒体类型""" if "movie" in file_path.lower(): return "movies" elif "tv" in file_path.lower() or "series" in file_path.lower(): return "tv_shows" elif "anime" in file_path.lower(): return "anime" else: return "unsorted"步骤3:命名规则设置
MoviePilot支持灵活的命名规则变量:
| 变量 | 描述 | 示例输出 |
|---|---|---|
{{title}} | 媒体标题 | 流浪地球 |
{{year}} | 发行年份 | 2023 |
{{season}} | 季数 | S01 |
{{episode}} | 集数 | E01-E03 |
{{resolution}} | 分辨率 | 1080p |
{{video_codec}} | 视频编码 | H.265 |
{{audio_codec}} | 音频编码 | DTS-HD |
{{release_group}} | 发布组 | HDB |
{{source}} | 来源 | BluRay |
配置示例:
# 电影命名规则 {{title}} ({{year}}) [{{resolution}}]/{{title}} ({{year}}).{{ext}} # 电视剧命名规则 {{title}}/Season {{season}}/{{title}} - S{{season}}E{{episode}}.{{ext}}步骤4:执行批量重命名
使用MoviePilot CLI执行重命名操作:
# 扫描并重命名指定目录 moviepilot rename --path /path/to/media --dry-run # 实际执行重命名 moviepilot rename --path /path/to/media --execute # 指定命名规则 moviepilot rename --path /path/to/media --template "{{title}} ({{year}})" --execute步骤5:验证与监控
检查重命名结果并查看日志:
# 查看重命名日志 tail -f logs/rename.log # 验证重命名结果 find /path/to/media -type f -name "*.mkv" | head -10高级功能与技巧 🚀
1. 多目录元数据合并
当媒体文件存储在多层目录中时,MoviePilot会自动合并元数据:
def MetaInfoPath(path: Path) -> MetaBase: """根据完整路径识别元数据""" # 文件级别元数据 file_meta = MetaInfo(title=path.name) # 目录级别元数据(支持多层) current_path = path.parent while current_path != Path('/'): dir_meta = MetaInfo(title=current_path.name) file_meta.merge(dir_meta) current_path = current_path.parent return file_meta2. 自定义识别词优化
针对特殊影片,可以添加自定义识别词:
# 在配置文件中添加 custom_words: - "Director's Cut" - "Extended Edition" - "IMAX Enhanced" - "Remastered" - "Special Features" - "Bonus Content"3. 批量处理工作流
创建自动化重命名工作流:
# 批量重命名脚本示例 import os from pathlib import Path from moviepilot.core.metainfo import MetaInfo def batch_rename_media(directory: str, template: str): """批量重命名目录下的所有媒体文件""" media_extensions = {'.mkv', '.mp4', '.avi', '.mov', '.wmv'} for root, dirs, files in os.walk(directory): for file in files: if Path(file).suffix.lower() in media_extensions: file_path = Path(root) / file # 解析元数据 meta = MetaInfo(title=file_path.name) # 生成新文件名 new_name = generate_filename(meta, template) # 执行重命名 new_path = Path(root) / new_name file_path.rename(new_path) print(f"重命名: {file} -> {new_name}")常见问题与解决方案 🔧
Q1: 重命名失败,提示"文件名包含非法字符"
解决方案:使用内置的清理函数:
from moviepilot.utils.string import sanitize_filename # 清理文件名中的非法字符 safe_filename = sanitize_filename("Movie: Name? (2023).mkv") # 输出: Movie_ Name_ (2023).mkvQ2: 同名文件冲突如何处理?
解决方案:MoviePilot内置智能去重机制:
def ensure_unique_filename(filename: str, directory: Path) -> str: """确保文件名唯一""" base_name = Path(filename).stem extension = Path(filename).suffix counter = 1 while (directory / filename).exists(): filename = f"{base_name} ({counter}){extension}" counter += 1 return filenameQ3: 如何手动指定媒体类型?
解决方案:在文件名中添加类型标记:
# 强制指定为电影 {type=movie} Avengers.Endgame.2019.1080p.mkv # 强制指定为电视剧 {type=tv} Game.of.Thrones.S01E01.mkv # 指定TMDB ID [tmdbid=12345] Movie.Name.2023.mkvQ4: 重命名后媒体服务器不识别?
解决方案:检查命名规则是否符合媒体服务器要求:
- Plex要求:
Show Name/Season XX/Show Name - SXXEYY - Episode Name.ext - Emby要求:
Show Name/Season XX/Show Name - SXXEYY.ext - Jellyfin要求:与Emby类似,支持更灵活的命名
性能优化建议 ⚡
1. 批量处理优化
# 使用多线程加速批量处理 from concurrent.futures import ThreadPoolExecutor import threading def parallel_rename(files: List[Path], max_workers: int = 4): """并行重命名文件""" with ThreadPoolExecutor(max_workers=max_workers) as executor: futures = [] for file in files: future = executor.submit(rename_single_file, file) futures.append(future) # 等待所有任务完成 for future in futures: future.result()2. 缓存优化
# 缓存元数据查询结果 from functools import lru_cache @lru_cache(maxsize=1000) def get_media_metadata(title: str) -> Dict: """获取媒体元数据(带缓存)""" # 实现元数据查询逻辑 return metadata3. 增量处理
# 只处理新增或修改的文件 def incremental_rename(directory: Path, last_run_time: datetime): """增量重命名""" for file in directory.rglob("*"): if file.stat().st_mtime > last_run_time.timestamp(): # 只处理新文件 rename_file(file)最佳实践总结 📋
- 先测试后执行:始终使用
--dry-run参数预览重命名结果 - 备份原始文件:在执行批量操作前创建备份
- 分阶段处理:先处理小批量文件验证效果
- 监控日志:密切关注重命名日志,及时发现并解决问题
- 定期维护:设置定时任务定期整理新添加的媒体文件
扩展阅读与资源
- 官方文档:docs/ - 包含完整的API文档和配置指南
- 核心源码:app/core/ - 深入了解元数据识别引擎实现
- 社区支持:加入MoviePilot社区获取最新更新和技术支持
通过合理利用MoviePilot的批量重命名功能,你可以轻松实现媒体库的自动化管理,让每一部影片都能被正确识别和高效访问。无论是个人用户的小型收藏,还是专业媒体服务器的大规模库维护,MoviePilot都能提供强大的支持。
开始你的媒体库整理之旅吧!🎬
【免费下载链接】MoviePilotNAS媒体库自动化管理工具项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考