群晖NAS搭建Jellyfin影音库:基于tinyMediaManager的本地NFO元数据自动化管理
1. 项目概述:从零到一构建你的私人影院海报墙
折腾过家庭影音库的朋友,十有八九都经历过“海报墙”的执念。看着网上别人家那琳琅满目、信息完整的影视海报墙,再瞅瞅自己NAS里那一堆以“S01E01.mkv”命名的文件,那种感觉就像住毛坯房和精装房的区别。今天要聊的,就是如何利用你手头的群晖NAS,结合Jellyfin这个强大的媒体服务器,再通过刮削工具(比如我们重点会用的tinyMediaManager)的精细打磨,把那一堆冰冷的视频文件,变成一个有温度、有颜值的私人数字影院。
简单来说,这个项目的核心目标就一个:自动化、精准化地为你NAS里的每一部电影、每一集剧集,匹配上正确的海报、背景图、剧情简介、演员表、评分等元数据,并在Jellyfin中完美呈现。这不仅仅是“好看”,更是为了“好用”。想象一下,你想找一部十年前看过的科幻片,不用再回忆那拗口的文件名,只需在海报墙上扫一眼封面,或者直接搜索主演的名字,影片瞬间就被定位出来。这背后,是一套从文件命名规范、刮削器配置到媒体库管理的完整工作流。
为什么是群晖+Jellyfin+tinyMediaManager这个组合?群晖提供了稳定、低功耗的硬件基础和便捷的Docker环境;Jellyfin作为开源媒体服务器的后起之秀,完全免费、无任何功能限制,且对海报墙的展示效果和客户端支持都非常出色;而tinyMediaManager(tMM)则是一个功能强大到有些“极客”的本地刮削与管理工具,它能提供远超Jellyfin内置刮削器的精准度和控制力,尤其是在处理非标准命名、冷门影片或需要批量修改时,优势巨大。这个组合,兼顾了自动化与手动精修,适合那些既想“一劳永逸”,又对细节有要求的影音爱好者。
2. 核心思路与工具选型解析
2.1 为什么需要独立的刮削工具?
很多新手会问:Jellyfin不是自带刮削器吗,为什么还要额外用tinyMediaManager?这是一个非常好的问题,也直接关系到整个项目的设计思路。
Jellyfin内置的刮削器(如TheMovieDB, TheTVDB)是“在线实时刮削”。它的工作模式是:当你扫描媒体库时,Jellyfin会读取文件名,然后实时向这些在线数据库发起查询请求,匹配成功后,将元数据和图片下载到它自己的缓存目录中。这种方式优点是全自动,集成度高。但缺点也很明显:
- 依赖网络与API稳定性:刮削速度和质量受制于你的网络环境和对端API的响应。有时会因网络波动或API限制导致刮削失败或缓慢。
- 灵活性不足:对于匹配错误的影片,你只能在Jellyfin的Web界面里进行有限的重新匹配或手动修改,批量操作不便。
- 元数据本地化程度低:虽然可以切换语言,但一旦在线源没有对应的中文信息,海报墙就可能出现英文简介,体验不统一。
- 无法处理复杂情况:对于文件名不规范、系列剧集特殊命名、或非常冷门的资源,内置刮削器常常“束手无策”。
而tinyMediaManager这类本地刮削工具,采用的是“先刮削,后使用”的离线模式。它的核心思想是:在视频文件所在的同一目录下,生成一套标准化的元数据文件(如NFO文件)和图片文件(poster.jpg, fanart.jpg等)。Jellyfin在扫描时,会优先读取这些本地文件,完全不再依赖在线查询。这就带来了几个决定性优势:
- 完全离线可用:一次刮削,终身受用。即使断网,你的海报墙也完整无缺。
- 精准控制:你可以在tMM的图形界面里,手动搜索、确认、甚至编辑每一条元数据,确保100%准确。
- 批量操作:可以一次性对成百上千部影片进行重命名、刮削、清理等操作,效率极高。
- 格式统一:可以强制所有元数据为中文,并统一海报、背景图的风格和分辨率。
所以,我们的核心思路就明确了:使用tinyMediaManager作为“元数据工匠”,在本地完成所有影片信息的精细打磨和封装;然后让Jellyfin扮演“展厅设计师”,直接读取这些打磨好的本地元数据,构建出美观且准确的海报墙。两者分工协作,扬长避短。
2.2 工具链详解:群晖、Docker、tMM与Jellyfin
在这个工作流中,每个工具扮演着不同的角色:
- 群晖NAS:是整个系统的基石。它提供7x24小时运行的硬件、存储空间(你的影片仓库)、以及通过Docker运行服务的能力。建议DSM7.0及以上系统,以便获得更好的Docker体验。
- Docker:是核心的部署方式。无论是Jellyfin还是我们将要使用的tinyMediaManager,都强烈建议通过Docker部署。Docker提供了隔离、便携且易于管理的环境,避免了直接在群晖系统上安装Java等依赖的繁琐和潜在冲突。
- tinyMediaManager (tMM):我们的“刮削主力”。我们将通过Docker运行其无头(headless)版本或桌面版本。对于自动化需求高的用户,无头版本可以通过命令行脚本调用;对于追求精细操作的用户,可以通过VNC远程连接桌面版进行操作。它需要配置访问你的影片目录和刮削数据输出目录。
- Jellyfin:最终的“展示终端”。同样通过Docker部署,配置时最关键的一步,就是将其媒体库的“元数据下载器”顺序设置为优先读取本地NFO文件,从而屏蔽在线刮削。
这个工具链的协同关系是:影片文件存储在群晖的某个共享文件夹(如/volume1/video/Movies)。tMM的Docker容器被授权访问这个文件夹,并对其进行扫描、重命名、刮削,生成NFO和图片文件。Jellyfin的Docker容器也被授权访问同一文件夹,在添加媒体库时,它会发现这些本地元数据并用以构建界面。
3. 前期准备:文件命名规范与目录结构
在动刀刮削之前,整理好你的“原材料”——视频文件,是成功的一半。混乱的命名会让再强大的刮削器也无从下手。
3.1 电影与剧集的命名公约
刮削器(无论是tMM还是在线数据库)都是通过文件名来识别内容的。遵循一个广泛认可的命名规则至关重要。
电影命名规范:推荐格式:电影名 (发行年份).扩展名
- 示例:
阿甘正传 (1994).mkv,Inception (2010).mp4 - 为什么这么写?括号内的年份是关键的识别符,能有效区分同名电影或系列电影的不同版本。
- 复杂情况处理:
- 多版本电影:
电影名 (年份) - 版本.扩展名, 如蝙蝠侠:黑暗骑士 (2008) - IMAX版.mkv - 合集电影:建议每个电影单独文件,放在以合集命名的文件夹下。或者使用
电影名 (年份) - CD1.mkv的格式,但后者识别成功率可能降低。
- 多版本电影:
剧集命名规范:推荐格式:剧集名 - SxxExx - 集标题.扩展名
- 示例:
Breaking Bad - S01E01 - Pilot.mkv,权力的游戏 - S08E06 - 铁王座.mkv - 解释:
S01表示第一季,E01表示第一集。这是TheTVDB等数据库的标准季集标识,识别率最高。 - 季与集的规范:
- 特殊剧集(如特别篇):可以使用
S00E01(第0季)来表示。 - 多集在一个文件:
S01E01-E02.mkv或S01E01E02.mkv,但部分刮削器可能不支持,最稳妥的方式是分开。
- 特殊剧集(如特别篇):可以使用
- 目录结构:
即:剧集根目录 -> 剧名文件夹 -> 季文件夹 -> 剧集文件。这是Jellyfin、Plex等所有媒体服务器最推荐的结构。/TV Shows/ ├── Breaking Bad/ │ ├── Season 01/ │ │ ├── Breaking Bad - S01E01 - Pilot.mkv │ │ └── ... │ └── Season 02/ │ └── ... └── Game of Thrones/ └── ...
3.2 使用工具进行批量重命名
手动给成百上千个文件改名是噩梦。我们需要借助工具。
- 群晖自带工具:对于简单的添加前缀、后缀或替换,可以使用File Station的重命名功能,但功能较弱。
- 专业重命名软件(在PC上操作):如
Advanced Renamer、Bulk Rename Utility。你可以将NAS的共享文件夹映射为网络驱动器(如Z盘),然后在PC上通过这些软件直接对网络驱动器中的文件进行重命名。它们支持强大的正则表达式,可以轻松实现从[电影名].mkv到电影名 (年份).mkv的转换。 - tinyMediaManager自带的重命名功能:tMM在刮削后,可以根据元数据自动重命名文件并移动到指定目录结构,这是最“一站式”的解决方案。但前提是tMM能正确识别出你的文件。对于完全无法识别的文件,可能需要先用方法2进行初步整理。
实操心得:在开始刮削前,我强烈建议先用
Advanced Renamer这类工具,结合豆瓣或TMDB的片单,花一两个小时把主要影片的命名规范化。尤其是年份信息,务必加上。这步基础工作做好,后续刮削成功率能从50%提升到95%以上,事半功倍。
4. 部署与配置核心工具
4.1 在群晖Docker中部署Jellyfin
我们首先部署最终展示端,以便在刮削过程中可以实时检查效果。
- 打开群晖套件中心,安装Docker。如果已安装,请确保更新到最新版本。
- 在File Station中创建相关目录。我通常的规划如下:
实际上,/volume1/docker/ ├── jellyfin/ │ ├── config/ # 用于存放Jellyfin的配置、缓存、元数据数据库 │ └── data/ # (可选)如果你不想用符号链接,可以单独挂载媒体目录 └── tmm/ # 留给tinyMediaManager用/volume1/docker/jellyfin/data我们不一定需要,因为媒体文件通常在其他共享文件夹(如/volume1/video)。我们通过Docker的“绑定挂载”功能,将宿主机的真实目录映射到容器内。 - 在Docker注册表中搜索
jellyfin/jellyfin, 选择最新版本(通常是latest标签)下载。 - 映像下载完成后,启动容器。点击“高级设置”进行关键配置:
- 卷(存储空间):这是核心设置。
- 添加文件夹:
/volume1/docker/jellyfin/config-> 容器路径:/config - 添加文件夹:
你的电影目录,如/volume1/video/Movies-> 容器路径:/data/movies - 添加文件夹:
你的剧集目录,如/volume1/video/TV Shows-> 容器路径:/data/tvshows - (可选)如果需要硬件转码,需要添加设备:
/dev/dri(仅适用于Intel核显的群晖,并需开启SSH修改权限,此部分略复杂,本文不展开)。
- 添加文件夹:
- 端口:本地端口可以自定义,如
8096,容器端口保持8096不变。 - 环境变量:可以添加
PUID=1026,PGID=100(这里的UID/GID需要替换为你群晖上管理员的ID,可通过SSH输入id 用户名查看)。这能保证容器内生成的文件拥有正确的权限。
- 卷(存储空间):这是核心设置。
- 完成创建并启动容器。在浏览器中访问
http://你的群晖IP:8096,即可进入Jellyfin初始化向导。
注意事项:首次进入Jellyfin,语言选择中文后,在设置媒体库的步骤可以先跳过。因为我们后续要优先配置本地NFO,如果此时让它扫描,它会开始在线刮削,造成干扰。最好等tMM刮削完成后再来添加媒体库。
4.2 在群晖Docker中部署tinyMediaManager
tMM的Docker部署稍显特殊,因为它是一个桌面应用。我们这里采用一种兼顾易用性和功能性的方法:部署带有VNC的桌面版,这样我们可以通过浏览器远程操作其图形界面。
- 在Docker注册表中搜索
romancin/tinymediamanager。这个镜像集成了tMM和VNC服务,比较方便。 - 下载并启动容器,进行高级设置:
- 卷(存储空间):
/volume1/docker/tmm/config->/config(存放tMM程序配置)/volume1/video->/media(将你的整个媒体根目录映射进去,tMM可以访问所有子目录)- (可选)
/volume1/docker/tmm/data->/data(可用于存放备份等)
- 端口:需要映射两个端口。
5800:用于Web界面的VNC客户端访问。5900:标准的VNC端口,可用VNC Viewer等客户端连接(响应更快)。
- 环境变量:非常重要!
VNC_PASSWORD:设置一个VNC连接密码。DISPLAY_WIDTH和DISPLAY_HEIGHT:设置远程桌面的分辨率,如1920和1080。PUID和PGID:同上,设置为你的群晖用户ID和组ID,确保文件权限正确。
- 卷(存储空间):
- 启动容器。访问
http://你的群晖IP:5800,输入密码,即可进入tMM的桌面环境。
首次运行tMM,会有一个设置向导。关键步骤是:
- 选择语言:界面和刮削语言都选择中文。
- 设置电影和剧集目录:点击“添加电影源”,路径选择
/media/Movies(即我们映射的/volume1/video/Movies)。剧集同理。 - 配置刮削器:在“设置”->“通用”中,确保“电影”和“剧集”的刮削器都包含了“TheMovieDB”和“TheTVDB”,并将中文源优先级调高。
- 配置重命名和文件处理:在“设置”->“电影”/“剧集”的“数据源”选项卡中,勾选“将电影存储在每个电影单独的文件夹中”和“将剧集存储在以季命名的文件夹中”,这会让tMM自动帮你整理出标准的目录结构。在“重命名”选项卡中,设置你喜欢的命名格式,例如
${movieName} (${year})。
5. 核心刮削流程与精细化管理
5.1 电影刮削全流程实操
假设你的电影文件已经按照电影名 (年份).mkv的格式,散落在/media/Movies目录下。
- 扫描新电影:在tMM主界面,进入“电影”模块,点击顶部工具栏的“更新数据源”。tMM会扫描
/media/Movies目录,将所有视频文件列出。 - 自动识别(批量):选中所有未识别的电影(状态为“?”),右键选择“搜索并刮削所选电影”。tMM会基于文件名,向TMDB等网站发起搜索。
- 匹配结果:对于大部分标准命名的电影,会自动匹配成功,并显示匹配度。通常高于90%的匹配都是正确的,可以直接点击“接受”。
- 多重选择:如果一部电影有多个搜索结果(如不同年份的版本),会弹出列表让你手动选择正确的那个。这里务必仔细核对年份、海报和简介。
- 手动搜索(纠错):对于自动识别失败或识别错误的电影,右键选择“搜索并刮削”,会弹出搜索框。你可以输入更准确的中文名、英文名甚至IMDb编号(如
tt1375666)进行精确搜索。 - 刮削内容配置:在刮削设置中,你可以勾选需要下载的内容:标题、原标题、剧情简介、评分、演职员表、海报、背景图、横幅、Logo等。对于海报和背景图,建议选择“原始”质量以获取最高分辨率。
- 重命名与整理:刮削完成后,先不要着急点“重命名与清理”。我建议先进行下一步。
- 元数据与图片预览:双击任意一部已刮削的电影,进入详情页。在这里你可以:
- 检查所有信息:确认简介、演员、评分是否正确,特别是中文信息是否齐全。
- 替换图片:如果对自动下载的海报不满意,可以点击海报区域,从TMDB提供的多张备选图中选择,甚至从本地上传自定义图片。
- 手动编辑:任何文本信息都可以直接双击修改,这对于修正错误的翻译或补充本地化信息非常有用。
- 执行重命名与清理:确认所有电影信息无误后,回到电影列表,选中所有电影,右键执行“重命名与清理”。这是最关键的一步,tMM会根据你的设置:
- 将电影文件移动到以“电影名 (年份)”命名的单独文件夹中。
- 将电影文件重命名为你设定的格式(如
电影名 (年份).mkv)。 - 在文件夹内生成
movie.nfo元数据文件,以及poster.jpg(海报)、fanart.jpg(背景图)等。 - (可选)清理掉不需要的无关文件(如样本文件、txt文档)。
至此,你的电影库已经完成了本地元数据封装。目录结构会变得非常整洁:
/Movies/ ├── 阿甘正传 (1994)/ │ ├── 阿甘正传 (1994).mkv │ ├── movie.nfo │ ├── poster.jpg │ └── fanart.jpg └── 盗梦空间 (2010)/ └── ...5.2 剧集刮削的特殊处理
剧集刮削逻辑与电影类似,但更复杂,因为涉及季和集的多层关系。
- 源目录结构:确保你的剧集文件已经放在类似
/media/TV Shows/剧集名/Season XX/的结构下,即使文件命名不规范也没关系。 - 扫描与识别:在tMM的“剧集”模块更新数据源。tMM会尝试根据文件夹名(剧集名)和文件名(SxxExx)进行匹配。
- 季的识别:有时tMM可能无法自动识别某季。此时需要右键该季文件夹,手动“搜索并刮削该季”,输入剧集名进行搜索匹配。
- 集的识别与锁定:这是剧集刮削最容易出错的地方。对于文件名不规范的剧集(如
EP01.mp4),tMM可能无法识别。你需要:- 进入该季的详情页,在“剧集”列表里,手动将右侧的文件拖拽到左侧对应的剧集条目上,进行“锁定”。这告诉tMM:“这个文件就是这一集”。
- 锁定后,再对该季执行刮削操作,tMM就会为锁定的文件生成正确的元数据。
- 批量操作:对于标准命名的剧集,可以像电影一样批量刮削和重命名。tMM会生成
tvshow.nfo(在剧集根目录)和每集对应的S01E01.nfo等文件。
实操心得:剧集刮削最考验耐心。对于老剧、文件名混乱的剧集,手动“锁定”是唯一可靠的方法。建议一次处理一个剧集,确认一季无误后再进行下一季。刮削完成后,务必去文件系统里检查一下生成的NFO和图片文件是否齐全,特别是
tvshow.nfo和poster.jpg是否在剧集根目录下,这是Jellyfin识别整个剧集的关键。
6. 配置Jellyfin使用本地NFO元数据
当tMM的工作完成后,你的媒体文件夹里已经充满了.nfo,.jpg,.png等文件。现在需要让Jellyfin“看见”并优先使用它们。
- 登录Jellyfin后台,进入“控制台”。
- 添加媒体库:
- 内容类型:选择“电影”。
- 显示名称:自定义,如“我的电影”。
- 文件夹:点击“+”号,添加我们映射给Jellyfin的电影目录路径(例如
/data/movies, 对应宿主机的/volume1/video/Movies)。
- 最关键的一步:配置元数据下载器。
- 在添加媒体库的页面,找到“元数据下载器”区域。
- 取消勾选所有在线的刮削器(如TheMovieDb, The Open Movie Database等)。只保留一个:“NFO”。
- 在“元数据保存器”中,确保“将元数据保存到媒体文件中”是启用的,但因为我们已有NFO,这个主要是为了兼容。
- 图片获取器:同样,只保留“NFO”和“本地图片文件”(如“Primary image from local files”)。这样Jellyfin就会从
poster.jpg等本地文件读取图片,而不是去网上下载。
- 保存并扫描。添加剧集库的流程完全一致,内容类型选“剧集”,文件夹指向剧集目录,同样在元数据下载器中只保留“NFO”和“本地图片文件”。
完成这些设置后,Jellyfin会开始扫描媒体库。由于禁用了在线刮削器,它的扫描速度会非常快,因为它只是在读取本地现成的NFO文件。扫描完成后,一个信息完整、图片精美的海报墙就立刻呈现在你面前了。
7. 高级技巧与疑难问题排查
7.1 使用tMM命令行实现自动化刮削
对于已经整理好命名规范的新增影片,我们可以通过tMM的命令行模式实现自动化,无需打开图形界面。这需要用到tMM的“无头模式”Docker镜像,如romancin/tinymediamanager:latest-v4。
核心思路是编写一个Shell脚本,通过群晖的计划任务定期执行。脚本内容大致如下:
#!/bin/bash # 进入tMM容器执行刮削命令 docker exec your_tmm_container_name /bin/bash -c " # 更新电影数据源并刮削新电影 /app/tinyMediaManager movie updateNew /app/tinyMediaManager movie scrape /app/tinyMediaManager movie rename # 更新剧集数据源并刮削新剧集 /app/tinyMediaManager tvshow updateNew /app/tinyMediaManager tvshow scrape /app/tinyMediaManager tvshow rename "你需要将your_tmm_container_name替换为你的tMM容器实际名称。然后在群晖控制面板的“计划任务”中,新增一个“用户定义的脚本”任务,将上述脚本内容粘贴进去,并设置每天凌晨执行。这样,每天新增到指定目录的影片,就会被自动刮削并整理好。
7.2 常见问题与解决方案速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Jellyfin中影片信息为英文 | Jellyfin优先使用了在线刮削器,或者本地NFO里就是英文信息。 | 1. 检查媒体库设置,确保元数据下载器只勾选了NFO。 2. 在tMM中刮削时,确认已设置首选语言为中文,并重新刮削生成NFO。 |
| 剧集海报墙显示为单集海报,没有季海报和剧集总海报 | 缺少tvshow.nfo文件或剧集根目录下的poster.jpg。 | 1. 在tMM中,确保对剧集(而不仅仅是某一季)执行了刮削操作。 2. 检查剧集根目录下是否有 tvshow.nfo和poster.jpg文件。 |
| 部分影片在tMM中无法识别 | 文件名不规范,或影片太冷门。 | 1. 使用PC端重命名工具先规范化文件名(务必包含年份)。 2. 在tMM中手动搜索,尝试使用影片的原始外文名或IMDb编号(tt开头)。 |
| 刮削后Jellyfin扫描不到新内容 | Jellyfin媒体库扫描未触发,或NFO文件格式有误。 | 1. 在Jellyfin该媒体库的“管理媒体库”中,点击“扫描媒体库文件”。 2. 检查NFO文件是否为空或格式错误,可用文本编辑器打开查看。 |
| tMM刮削速度非常慢 | 网络连接TMDB等网站不畅,或同时刮削的任务太多。 | 1. 在tMM设置中,尝试更换刮削源(如从TMDB换到OMDb)。 2. 分批刮削,不要一次性选中上千部影片。 |
| 通过Docker部署的tMM无法写入文件 | Docker容器内用户(PUID/PGID)权限不足,无法向映射的宿主机文件夹写文件。 | 1. 通过SSH登录群晖,使用id 你的用户名命令查看正确的UID和GID。2. 在创建tMM Docker容器时,环境变量 PUID和PGID设置为上述值。3. 检查宿主机文件夹(如 /volume1/video)是否对该用户有读写权限。 |
| Jellyfin海报墙图片模糊 | tMM下载的图片分辨率不够高,或者Jellyfin客户端进行了缩放。 | 1. 在tMM刮削设置中,将图片质量设置为“原始”或“高”。 2. 在Jellyfin的Web客户端设置中,检查“显示”选项,确保未开启“节省带宽”等降低画质的选项。 |
7.3 元数据备份与迁移
你的所有心血(精心调整的海报、编辑的简介)都保存在那些NFO和图片文件里。因此,这些文件本身就是最好的备份。只需定期备份你的媒体文件夹(如/volume1/video),元数据就得到了保全。
当你需要迁移或重装系统时:
- 确保新的媒体服务器(无论是Jellyfin还是Plex、Emby)支持NFO标准。
- 将整个媒体文件夹(包含视频文件和旁边的NFO、图片)拷贝到新位置。
- 在新的媒体服务器中添加媒体库,并同样设置为优先读取NFO元数据。
- 执行扫描,你的完整海报墙就会原封不动地重现,无需重新刮削。
这个过程让我深刻体会到本地NFO方案的巨大优势:数据主权完全掌握在自己手中,不依赖于任何在线服务的持续可用性。无论平台如何变迁,只要文件在,你的影音库的“灵魂”——那些精心整理的元数据就永远在。
