ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Leaving Soon背后:Janitorr符号链接与PathStructure路径结构实现原理

Leaving Soon背后:Janitorr符号链接与PathStructure路径结构实现原理 Leaving Soon背后Janitorr符号链接与PathStructure路径结构实现原理【免费下载链接】janitorrCleans your Radarr, Sonarr, Jellyseerr and Jellyfin before you run out of space项目地址: https://gitcode.com/gh_mirrors/ja/janitorrJanitorr是一款自动清理 Radarr、Sonarr、Jellyseerr 与 Jellyfin 媒体库的开源工具它最著名的功能Leaving Soon即将删除会在文件被真正删除前把待清理的媒体集中展示在媒体服务器首页给用户一个反悔的机会。本文带你从符号链接和 PathStructure 路径结构这两个核心机制出发读懂这套删除前预告功能是如何实现的。一、Leaving Soon删除前的最后一眼普通清理工具的做法是文件一到期就直接删掉。Janitorr 则多走了一步——距离删除还有 N 天默认 14 天时Janitorr 会把这些媒体加入一个名为Leaving Soon的媒体库这个媒体库会出现在 Jellyfin/Emby 的首页像一个下架预告橱窗到期且磁盘空间确实不足时文件才被真正删除。橱窗里的内容并不是把几百 GB 的影片复制一份而是符号链接symlink——指向原始文件的快捷方式。这就是本文要拆解的第一个原理。相关行为开关LeavingSoonType.kt 中的枚举决定了 Leaving Soon 橱窗对电影、剧集还是两者同时生效。二、符号链接零成本上架媒体符号链接是操作系统中的快捷方式一个几十字节的链接文件指向磁盘上真实存在的媒体文件。Jellyfin 扫描到链接后会像展示真实文件一样展示它海报、详情照常可用但不占用额外磁盘空间。Janitorr 的链接创建逻辑在 AbstractMediaServerService.kt 的createLinks方法中处理分两条路电影为单个电影文件创建一条符号链接并复制字幕等附加文件剧集以季为单位扫描原始季文件夹中的全部视频文件逐一在目标目录建立链接——这样即使整季文件后续有变动橱窗内容也能保持完整。创建前先检查目标是否已存在Files.exists已存在则跳过因此同一轮任务重复执行不会产生重复链接。这里有一个隐藏的前提Janitorr 容器必须能看到和 Radarr/Sonarr 完全一致的目录结构。例如 Radarr 在/data/media/movies找到电影Janitorr 也必须能在/data/media/movies访问到它——否则链接会指向一个不存在的位置。唯一例外是 Leaving Soon 目录本身它允许 Janitorr 和 Jellyfin 用不同路径认识它后面配置部分会讲。三、PathStructure四个路径撑起一套映射从哪链接到哪是整个功能的核心。Janitorr 用了一个只有 4 个字段的轻量数据类来表达完整的映射关系——PathStructure.kt字段含义示例sourceFolder源文件所在目录*arr 库内真实位置/data/media/tv/Seinfeld/Season 05sourceFile源文件或季文件夹本身.../Season 05/Seinfeld.S05E01.mkvtargetFolderLeaving Soon 内的目标目录/data/media/leaving-soon/tv/tag-based/Seinfeld/Season 05targetFileLeaving Soon 内的目标链接.../Season 05/Seinfeld.S05E01.mkv这四个字段由 pathStructure 方法 从每个媒体条目LibraryItem计算而来。路径是从哪来的输入来自 LibraryItem.kt 中的三个关键路径均由 Radarr/Sonarr API 提供rootFolderPath媒体库根目录如/data/media/tvparentPath节目/电影本身的位置如/data/media/tv/SeinfeldfilePath文件真实所在的完整路径可能包含任意多层子文件夹。一个巧妙的细节重复文件夹去重计算路径时Janitorr 会检测文件夹名与文件名重复的情况例如.../Movie 2013/Movie 2013.mkv。若源结构是ShowName/ShowName-E01.mkv这种文件夹名与文件名前缀撞车的嵌套它会通过removePath辅助方法剔除多余层级避免在 Leaving Soon 里生成一层无意义的重复目录。这个子序列剔除算法实现在 StringExtensions.kt 的removeSubsequence中。四、从计算到上架一次 updateLeavingSoon 的完整旅程真正把这些拼起来的是 BaseMediaServerService.kt 中的updateLeavingSoon方法流程可以概括为 5 步门禁检查未开启文件系统访问或 Leaving Soon 类型与当前媒体类型不匹配时直接返回构建双路径为 Janitorr 与媒体服务器各算一份目标路径——/leaving-soon/{tv|movies}/{cleanup-type}并处理 Windows 路径的特殊写法准备媒体库在 Jellyfin/Emby 中查找对应的 Leaving Soon 媒体库不存在就创建路径未挂载就补挂载重建或增量更新根据from-scratch配置决定是清空目录重建顺便清除孤儿数据还是增量补充链接建链接 留痕调用createLinks建立符号链接并放置一个empty-file.media空文件——因为 Jellyfin 在媒体库被清空后不会主动重新扫描这个空文件就是保证它还有东西可看的保险。五、部署时的路径配置一处最容易踩的坑前面提到Leaving Soon 目录是唯一允许两边路径不一致的目录。对应配置在 FileSystemProperties.kt 中定义示例见 application-template.ymlleaving-soon-dirJanitorr 认识的目录符号链接建在这里media-server-leaving-soon-dir告诉 Jellyfin/Emby 去哪找这个目录若与上者相同可省略。举例如果你的 Docker 映射是 Janitorr 侧/share_media/media/leaving-soon → /data/media/leaving-soon而 Jellyfin 侧映射为→ /library/leaving-soon那么两个配置项就要分别写/data/media/leaving-soon和/library/leaving-soon。而媒体库本身的映射必须两边完全一致这是符号链接机制成立的前提。六、小结Leaving Soon 功能的设计非常克制却把几件小事做到了位用符号链接代替文件复制让预告橱窗几乎零磁盘开销用一个4 字段 PathStructure把源位置 → 目标位置的映射讲得清清楚楚电影与剧集各走一套建链策略通过双路径配置优雅化解了容器映射不一致这个最常见的部署坑用empty-file.media这类小细节保证了媒体服务器的扫描机制持续工作。对自组媒体库的用户来说理解这套机制后你就能明白Leaving Soon 展示的每一张海报背后都只是几十字节的链接——而链接指向的才是你硬盘上真正的电影与剧集。【免费下载链接】janitorrCleans your Radarr, Sonarr, Jellyseerr and Jellyfin before you run out of space项目地址: https://gitcode.com/gh_mirrors/ja/janitorr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表