MoviePilot媒体文件组织艺术:命名规范与目录结构设计

MoviePilot媒体文件组织艺术:命名规范与目录结构设计

【免费下载链接】MoviePilot NAS媒体库自动化管理工具 【免费下载链接】MoviePilot 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot

引言:媒体库混乱的痛点与解决方案

你是否曾经面对NAS中杂乱无章的媒体文件感到束手无策?影视收藏随着时间推移不断膨胀,命名不统一、结构混乱、难以检索的问题日益凸显。MoviePilot作为一款强大的NAS媒体库自动化管理工具,提供了一套科学的媒体文件组织方案,帮助用户轻松构建整洁、高效的媒体库。本文将深入探讨MoviePilot的媒体文件命名规范与目录结构设计,让你的媒体管理变得井然有序。

读完本文,你将能够:

  • 理解MoviePilot的媒体文件命名规则
  • 掌握电影、电视剧和动漫的标准命名格式
  • 设计高效的媒体库目录结构
  • 了解MoviePilot如何自动识别和组织媒体文件
  • 解决常见的媒体文件组织问题

MoviePilot媒体文件命名规范

命名规范的重要性

媒体文件的命名规范是媒体库管理的基础。一个好的命名规范能够:

  • 提高媒体文件的识别率
  • 确保媒体信息的准确性
  • 优化媒体库的浏览体验
  • 方便媒体文件的检索和筛选
  • 支持媒体服务器(如Plex、Emby、Jellyfin)的元数据匹配

通用命名规则

MoviePilot采用了一套灵活而强大的命名规则,能够自动识别媒体文件中的关键信息。以下是通用的命名规则:

  1. 媒体类型识别:通过文件名中的关键词区分电影、电视剧和动漫
  2. 标题提取:从文件名中提取媒体的中文和英文标题
  3. 年份标识:识别媒体的发行年份
  4. 季集信息:提取电视剧和动漫的季数和集数
  5. 分辨率和编码:识别视频的分辨率、编码格式等信息
  6. 特殊标识:处理特殊版本、多集合并等情况

电影命名规范

基本格式
<电影名称> (<年份>) [<分辨率>][<资源类型>][<编码信息>][<制作组>].<扩展名>
示例
肖申克的救赎 (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的目录结构设计遵循以下原则:

  1. 清晰分类:根据媒体类型进行明确区分
  2. 灵活扩展:支持多种存储类型和目录配置
  3. 兼容性强:兼容主流媒体服务器的目录结构要求
  4. 自动化管理:支持自动分类和移动媒体文件

基本目录结构

/媒体库根目录/
├── 电影/
│   ├── 电影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的媒体文件识别流程如下:

mermaid

元数据提取实现

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组织媒体文件的流程如下:

  1. 扫描下载目录:监控指定的下载目录,发现新文件
  2. 解析文件信息:使用MetaInfo类解析文件名,提取元数据
  3. 确定目标位置:根据媒体类型和元数据确定目标目录
  4. 移动/复制文件:将文件移动或复制到目标位置
  5. 更新媒体库:通知媒体服务器更新库信息
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支持通过工作流配置实现媒体管理的自动化:

mermaid

多存储管理

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:文件命名不规范导致识别失败

解决方案

  1. 使用MoviePilot的批量重命名功能
  2. 手动添加元数据标识,例如:{tmdbid=12345}
  3. 自定义识别词,提高特殊文件的识别率
# 添加自定义识别词
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:媒体库目录结构迁移

解决方案

  1. 使用MoviePilot的媒体库迁移工具
  2. 配置多存储位置,实现平滑过渡
  3. 更新媒体服务器的库路径配置

问题3:多版本媒体文件管理

解决方案

  1. 使用版本标识区分不同版本,例如:[导演剪辑版][加长版]
  2. 利用MoviePilot的版本管理功能自动分类
  3. 在目录结构中添加版本子目录

总结与展望

MoviePilot提供了一套全面的媒体文件组织方案,通过科学的命名规范和合理的目录结构设计,帮助用户构建高效、整洁的媒体库。本文详细介绍了MoviePilot的命名规则、目录结构、识别流程以及高级应用技巧。

未来,MoviePilot将在以下方面继续优化媒体文件组织功能:

  1. 增强AI驱动的元数据识别能力
  2. 提供更灵活的自定义命名规则
  3. 支持更多媒体类型和特殊场景
  4. 优化跨设备同步和远程访问体验

通过合理利用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媒体库自动化管理工具 【免费下载链接】MoviePilot 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值