配置文件系统
路径映射
从下载器到 lani,再到 Jellyfin,涉及到三个目录:
- 下载文件:存放完成下载后的文件,通常每个种子一个子目录,内部结构以种子内容为准
- 媒体池:按独立 UUID 保存原件和历史版本;相同内容的独立导入也分别登记,不按内容去重
- Jellyfin 媒体库:通常每个系列一个子目录,需要符合一定结构使 Jellyfin 正确识别
lani 先把下载文件登记到媒体池,再发布到 Jellyfin 目录。默认通过硬链接保留原件和下载源文件。
这里涉及三个服务(容器),它们使用的文件路径可能不完全一致,因此需要通过 路径映射 使其匹配。
一个典型的例子如图所示:

在导入下载完成的文件时,lani 会从下载器获取某个种子对应的文件,这里的路径是下载器内部的,比如:
/downloads/Some-Anime-S01E01.mkv
在 lani 中,无法用这个路径找到对应的文件,我们需要将路径中的 /downloads 替换为 /files/downloads,从而得到:
/files/downloads/Some-Anime-S01E01.mkv
注意,文件在宿主机上的目录是 /data,但这与 lani 无关。
如果你有多个目录需要映射,你可以在 pathMapping 中添加更多的配置项。执行时,以第一条匹配的配置项为准,均不匹配则保持不变。找到匹配的配置项后,会在保持相对路径不变的前提下替换路径。
注意在配置中,from 始终指的是外部服务(如 Jellyfin 和下载器)中的路径,to 始终指的是 lani 的路径。
媒体池
配置 lani 可见的媒体池根目录:
mediaPool:
root: /data/pool
painfullyAcceptCrossDeviceCopy: false
下载目录、媒体池和 Jellyfin 目录应在同一个文件系统、同一个容器挂载卷下,例如 /data/downloads、/data/pool、/data/library。lani 需要这些目录的读写权限;路径不能经过符号链接。
硬链接让多个路径共享内容,删除一个路径不会删除其他路径的文件,但直接修改任何一处内容都会影响其他链接。请勿原地编辑媒体原件。媒体池保存历史版本,替换成功后撤下旧媒体目标,保留旧原件;本期没有自动清理媒体池的功能。
启动预检会实际验证媒体池与 Jellyfin 库目录的权限及硬链接能力,条件不满足时明确报错退出。下载目录的硬链接问题在下载导入流程中报告,不在启动时检查 qBittorrent。确需跨卷时显式开启 painfullyAcceptCrossDeviceCopy,允许仅在跨卷时复制;复制较慢、占用额外空间且无法保证跨卷原子性,权限和空间不足等错误仍会失败。
升级时删除旧 lani.moveStrategy,跨卷复制统一使用上述开关。当前配置校验会拒绝 lani 下未声明的旧键;出现 lani.moveStrategy is not allowed 时删除它,publicHost 保持原配置。
新版启动后自动登记历史视频及字幕,查询和已有播放可继续使用;无关剧集可正常下载和导入。尚未登记的历史剧集暂缓替换,其所在季度暂缓改名和删除;对应登记完成后可重试。目录和挂载需要调整时,按从旧文件结构迁移到媒体池操作,无需手动执行回填命令。