MoviePilot媒体文件组织艺术:命名规范与目录结构设计
【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot
引言:媒体库混乱的痛点与解决方案
你是否曾经面对NAS中杂乱无章的媒体文件感到束手无策?影视收藏随着时间推移不断膨胀,命名不统一、结构混乱、难以检索的问题日益凸显。MoviePilot作为一款强大的NAS媒体库自动化管理工具,提供了一套科学的媒体文件组织方案,帮助用户轻松构建整洁、高效的媒体库。本文将深入探讨MoviePilot的媒体文件命名规范与目录结构设计,让你的媒体管理变得井然有序。
读完本文,你将能够:
- 理解MoviePilot的媒体文件命名规则
- 掌握电影、电视剧和动漫的标准命名格式
- 设计高效的媒体库目录结构
- 了解MoviePilot如何自动识别和组织媒体文件
- 解决常见的媒体文件组织问题
MoviePilot媒体文件命名规范
命名规范的重要性
媒体文件的命名规范是媒体库管理的基础。一个好的命名规范能够:
- 提高媒体文件的识别率
- 确保媒体信息的准确性
- 优化媒体库的浏览体验
- 方便媒体文件的检索和筛选
- 支持媒体服务器(如Plex、Emby、Jellyfin)的元数据匹配
通用命名规则
MoviePilot采用了一套灵活而强大的命名规则,能够自动识别媒体文件中的关键信息。以下是通用的命名规则:
- 媒体类型识别:通过文件名中的关键词区分电影、电视剧和动漫
- 标题提取:从文件名中提取媒体的中文和英文标题
- 年份标识:识别媒体的发行年份
- 季集信息:提取电视剧和动漫的季数和集数
- 分辨率和编码:识别视频的分辨率、编码格式等信息
- 特殊标识:处理特殊版本、多集合并等情况
电影命名规范
基本格式
<电影名称> (<年份>) [<分辨率>][<资源类型>][<编码信息>][<制作组>].<扩展名>
示例
肖申克的救赎 (1994) [1080p][BluRay][x264][CHD].mp4
The Shawshank Redemption (1994) [2160p][UHD BluRay][x265][HDR].mkv
关键信息提取
MoviePilot通过以下正则表达式模式提取电影信息:
# 年份识别
if token.isdigit() and len(token) == 4 and 1900 < int(token) < 2050:
self.year = token
self._last_token_type = "year"
self._continue_flag = False
self._stop_name_flag = True
电视剧命名规范
基本格式
<电视剧名称> (<年份>) [S<季数>][E<集数>][<分辨率>][<资源类型>][<编码信息>][<制作组>].<扩展名>
示例
权力的游戏 (2011) [S01E01][1080p][WEB-DL][AAC][NTb].mkv
Game of Thrones (2011) [S08E06][2160p][HDR][x265][AMZN].mp4
季集信息提取
MoviePilot使用以下正则表达式识别季集信息:
# 季识别
_season_re = r"S(\d{3})|^S(\d{1,3})$|S(\d{1,3})E"
# 集识别
_episode_re = r"EP?(\d{2,4})$|^EP?(\d{1,4})$|^S\d{1,2}EP?(\d{1,4})$|S\d{2}EP?(\d{2,4})"
多集合并文件命名
对于包含多集内容的单个文件,命名格式如下:
<电视剧名称> (<年份>) [S<季数>E<起始集数>-E<结束集数>][<分辨率>][<资源类型>].<扩展名>
示例:
老友记 (1994) [S01E01-E03][720p][WEB-DL].mp4
动漫命名规范
基本格式
<动漫名称> [<年份>][第<季数>季][第<集数>话][<分辨率>][<资源类型>][<字幕组>].<扩展名>
示例
进击的巨人 第4季 Part.2 [2022][第16话][1080p][WEB-DL][简体字幕][LoliHouse].mp4
进击の巨人 Season 4 Part 2 (2022) [E16][2160p][UHD][x265][HDR][ANK-Raws].mkv
动漫特殊处理
MoviePilot对动漫文件采用专门的解析逻辑:
# 动漫识别逻辑
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
MoviePilot媒体库目录结构设计
目录结构设计原则
MoviePilot的目录结构设计遵循以下原则:
- 清晰分类:根据媒体类型进行明确区分
- 灵活扩展:支持多种存储类型和目录配置
- 兼容性强:兼容主流媒体服务器的目录结构要求
- 自动化管理:支持自动分类和移动媒体文件
基本目录结构
/媒体库根目录/
├── 电影/
│ ├── 电影A (年份)/
│ │ ├── 电影A (年份) [分辨率][资源类型].扩展名
│ │ └── 电影A (年份) 海报.jpg
│ ├── 电影B (年份)/
│ └── ...
├── 电视剧/
│ ├── 电视剧A (年份)/
│ │ ├── 第1季/
│ │ │ ├── 电视剧A (年份) S01E01.扩展名
│ │ │ └── ...
│ │ ├── 第2季/
│ │ └── 电视剧A (年份) 海报.jpg
│ ├── 电视剧B (年份)/
│ └── ...
├── 动漫/
│ ├── 动漫A/
│ │ ├── 第1季/
│ │ │ ├── 动漫A S01E01.扩展名
│ │ │ └── ...
│ │ ├── OVA/
│ │ └── 动漫A 海报.jpg
│ ├── 动漫B/
│ └── ...
└── 纪录片/
├── 纪录片A (年份)/
└── ...
目录结构实现
MoviePilot通过DirectoryHelper类实现目录结构的管理:
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]:
# 根据媒体类型、存储类型等条件匹配目录配置
# ...
# 按照配置顺序查找
for d in dirs_to_consider:
# 目录类型为全部的,符合条件
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 == media.category:
matched_dirs.append(d)
continue
# ...
多存储支持
MoviePilot支持多种存储类型,可以灵活配置媒体库的存储位置:
def get_local_library_dirs(self) -> List[schemas.TransferDirectoryConf]:
"""获取所有本地的媒体库目录"""
return [d for d in self.get_library_dirs() if d.library_storage == "local"]
def get_remote_library_dirs(self) -> List[schemas.TransferDirectoryConf]:
"""获取所有远程的媒体库目录"""
return [d for d in self.get_library_dirs() if d.library_storage != "local"]
自定义目录结构
用户可以通过配置文件自定义目录结构,例如:
# category.yaml
movie:
name: 电影
format: "{title} ({year})"
subfolder: true
tv:
name: 电视剧
format: "{title} ({year})/第{season}季"
subfolder: true
anime:
name: 动漫
format: "{title}/{season}"
subfolder: true
MoviePilot媒体文件识别与组织流程
媒体文件识别流程
MoviePilot的媒体文件识别流程如下:
元数据提取实现
MoviePilot的元数据提取主要通过MetaInfo类实现:
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)
# 判断是否处理文件
if title and Path(title).suffix.lower() in settings.RMT_MEDIAEXT:
isfile = True
# 去掉后缀
title = Path(title).stem
else:
isfile = False
# 识别媒体类型(电影/电视剧/动漫)
meta = MetaAnime(title, subtitle, isfile) if is_anime(title) else MetaVideo(title, subtitle, isfile)
# ...
return meta
媒体文件组织流程
MoviePilot组织媒体文件的流程如下:
- 扫描下载目录:监控指定的下载目录,发现新文件
- 解析文件信息:使用MetaInfo类解析文件名,提取元数据
- 确定目标位置:根据媒体类型和元数据确定目标目录
- 移动/复制文件:将文件移动或复制到目标位置
- 更新媒体库:通知媒体服务器更新库信息
def transfer_file(src_path: Path, dest_path: Path, media: MediaInfo):
"""
传输文件到媒体库
:param src_path: 源文件路径
:param dest_path: 目标目录
:param media: 媒体信息
"""
# 确保目标目录存在
dest_path.parent.mkdir(parents=True, exist_ok=True)
# 根据存储类型选择复制或移动文件
if src_path.stat().st_dev == dest_path.parent.stat().st_dev:
# 同一设备,移动文件
shutil.move(src_path, dest_path)
else:
# 不同设备,复制后删除源文件
shutil.copy2(src_path, dest_path)
os.remove(src_path)
logger.info(f"文件已传输: {src_path} -> {dest_path}")
高级应用:自定义规则与自动化
自定义识别规则
MoviePilot允许用户通过配置文件自定义媒体识别规则:
# custom_words.yaml
custom_words:
- name: "自定义电影识别词"
type: movie
words: ["电影", "影片", "Film", "Movie"]
- name: "自定义电视剧识别词"
type: tv
words: ["剧集", "电视剧", "TV", "Series"]
自动化工作流
MoviePilot支持通过工作流配置实现媒体管理的自动化:
多存储管理
MoviePilot支持多种存储类型的管理,包括本地存储、网络存储等:
def get_storagies() -> List[schemas.StorageConf]:
"""获取所有存储设置"""
storage_confs: List[dict] = SystemConfigOper().get(SystemConfigKey.Storages)
if not storage_confs:
return []
return [schemas.StorageConf(**s) for s in storage_confs]
常见问题与解决方案
问题1:文件命名不规范导致识别失败
解决方案:
- 使用MoviePilot的批量重命名功能
- 手动添加元数据标识,例如:
{tmdbid=12345} - 自定义识别词,提高特殊文件的识别率
# 添加自定义识别词
def add_custom_word(word: str, media_type: str):
"""添加自定义识别词"""
custom_words = SystemConfigOper().get(SystemConfigKey.CustomWords) or []
custom_words.append({
"word": word,
"type": media_type
})
SystemConfigOper().set(SystemConfigKey.CustomWords, custom_words)
问题2:媒体库目录结构迁移
解决方案:
- 使用MoviePilot的媒体库迁移工具
- 配置多存储位置,实现平滑过渡
- 更新媒体服务器的库路径配置
问题3:多版本媒体文件管理
解决方案:
- 使用版本标识区分不同版本,例如:
[导演剪辑版]、[加长版] - 利用MoviePilot的版本管理功能自动分类
- 在目录结构中添加版本子目录
总结与展望
MoviePilot提供了一套全面的媒体文件组织方案,通过科学的命名规范和合理的目录结构设计,帮助用户构建高效、整洁的媒体库。本文详细介绍了MoviePilot的命名规则、目录结构、识别流程以及高级应用技巧。
未来,MoviePilot将在以下方面继续优化媒体文件组织功能:
- 增强AI驱动的元数据识别能力
- 提供更灵活的自定义命名规则
- 支持更多媒体类型和特殊场景
- 优化跨设备同步和远程访问体验
通过合理利用MoviePilot的媒体文件组织功能,你可以轻松打造一个专业级的个人媒体库,享受更优质的媒体体验。
附录:常用正则表达式参考
| 用途 | 正则表达式 |
|---|---|
| 年份识别 | \b(19|20)\d{2}\b |
| 分辨率识别 | \b(720|1080|2160)p\b |
| 季识别 | S\d{1,2} |
| 集识别 | E\d{1,3} |
| 资源类型识别 | (BluRay|WebDL|HDTV|DVD|UHD) |
| 视频编码识别 | (H\.?264|H\.?265|x264|x265|MPEG4) |
| 音频编码识别 | (DTS|AC3|AAC|FLAC|TrueHD) |
希望本文能帮助你更好地理解和使用MoviePilot的媒体文件组织功能。如有任何问题或建议,欢迎在项目的GitHub仓库提交issue或PR。
GitHub仓库地址:https://gitcode.com/gh_mirrors/mo/MoviePilot
【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



