news 2026/9/12 13:38:32

拆解 Radarr 海报管线:一张电影海报从 TMDb 到本地磁盘的落盘链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
拆解 Radarr 海报管线:一张电影海报从 TMDb 到本地磁盘的落盘链路

拆解 Radarr 海报管线:一张电影海报从 TMDb 到本地磁盘的落盘链路

【免费下载链接】RadarrMovie organizer/manager for usenet and torrent users.项目地址: https://gitcode.com/GitHub_Trending/ra/Radarr

Radarr 海报墙里点开一部片子,海报位却是空白,日志飘着一行Couldn't download media cover。Radarr 是面向 Usenet 与 BitTorrent 用户的电影管理器,海报墙只是它的一根毛细血管。读完你能独立跑通这张海报从 TMDb 到本地磁盘的落盘链路,并定位下载卡在哪一环。

核心机制:MediaCoverService / MediaCoverProxy

Radarr 的海报管线由MediaCoverService牵头,MediaCoverProxy负责未入库电影的远程补位。整条链路不靠定时任务,全靠事件总线串起来。

事件驱动:MovieUpdatedEvent 触发 EnsureCovers

元数据刷新后,事件总线投递MovieUpdatedEvent,真正的落盘点就在它的处理器里:

// src/NzbDrone.Core/MediaCover/MediaCoverService.cs (L227-L232) public void HandleAsync(MovieUpdatedEvent message) { var updated = EnsureCovers(message.Movie); _eventAggregator.PublishEvent(new MediaCoversUpdatedEvent(message.Movie, updated)); }

它先跑EnsureCovers把封面落盘,再广播MediaCoversUpdatedEvent。这样前端能即时刷新海报,不必轮询。上游RefreshMovieService拉新元数据、写入Images后发事件,下游就自动跟上。

去重判定:Content-Length 比对跳过下载

不是每张海报都要重下,CoverAlreadyExistsSpecification决定要不要动手:

// src/NzbDrone.Core/MediaCover/CoverAlreadyExistsSpecification.cs (L25-L35) public bool AlreadyExists(string url, string path) { if (!_diskProvider.FileExists(path)) return false; var headers = _httpClient.Head(new HttpRequest(url)).Headers; var fileSize = _diskProvider.GetFileSize(path); return fileSize == headers.ContentLength; }

它不比文件内容,只拿本地大小对远程HEADContent-Length。相等即命中,跳过下载,省流量。代价是:远程同尺寸但内容变了时会误判为已存在。

多尺寸落盘:固定高度表 + 信号量限流

命中或下载完成后,进入EnsureResizedCovers,每种封面类型固定两档高度:

// src/NzbDrone.Core/MediaCover/MediaCoverService.cs (L177-L193 节选) case MediaCoverTypes.Poster: case MediaCoverTypes.Headshot: heights = new[] { 500, 250 }; break; case MediaCoverTypes.Banner: heights = new[] { 70, 35 }; break; // … 省略 Fanart / Screenshot 分支

主文件再按高缩放成-500-250后缀文件。缩放交给 ImageSharp,JPEG 质量写死 92。Semaphore把并发压到 CPU 核数一半,避免 ARM 上打满。

最小可行配置:从 clone 到看到第一张海报落盘

从 clone 到第一张海报落盘,核心就两条命令。

git clone https://gitcode.com/GitHub_Trending/ra/Radarr # 拉取源码 cd Radarr && dotnet run --project src/NzbDrone.Console # 启动,默认监听 7878 # 浏览器访问 7878,添加任意电影,即触发海报落盘 # AppData/MediaCover/<movieId>/ 生成 poster.jpg / poster-500.jpg / poster-250.jpg

访问http://localhost:7878,添加一部电影,MovieUpdatedEvent就会驱动上面的管线。完整 Web 界面需另建前端,但落盘与下载逻辑不依赖它。

配置项速查:最常改的 4 个开关

海报墙最常动的是这几个开关,改之前先知道它们管什么。

配置入口作用推荐值踩坑提示
config.xml的端口 /UrlBase决定监听端口与封面 URL 前缀7878UrlBase后旧封面链接失效
MediaCover目录(数据目录下)海报落盘根目录默认直接删目录会导致全部重下
Kodi 的MovieImages是否把海报复制成poster.jpg到电影目录关掉后 Kodi/Emby 读不到海报
ImageResizer的 JPEG 质量缩略图编码质量92(写死)要调质量得改源码,非配置项

踩坑实录

海报管线踩坑集中在下载、缩放、清理三处。

海报 404

现象:请求poster-500.jpg却拿到原尺寸图。根因:缩略文件缺失,控制器回退全尺寸。修复:确认数据目录可写,重启后自动重缩放。

一直不下载

现象:海报位长期空白,无报错弹窗。根因:TMDb 远程地址失效抛WebException。修复:看日志Couldn't download media cover,重下或刷新元数据。

删除后残留

现象:删掉电影,海报文件还在磁盘。根因:MoviesDeletedEvent只清理已识别目录。修复:手动清空MediaCover/<id>目录。

海报管线的核心是事件驱动加本地落盘:MovieUpdatedEvent触发下载,Content-Length去重,固定高度表产出多档尺寸。想进一步动手,直接读src/NzbDrone.Core/MediaCover/MediaCoverService.cs(L107-L216),从EnsureCovers顺着缩放分支往下走。

【免费下载链接】RadarrMovie organizer/manager for usenet and torrent users.项目地址: https://gitcode.com/GitHub_Trending/ra/Radarr

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 13:33:16

Koodo Reader 跨平台电子书阅读器快速上手指南

Koodo Reader 跨平台电子书阅读器快速上手指南 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux, Android, iOS and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/koodo-reader …

作者头像 李华
网站建设 2026/9/12 13:29:50

Raspberry Pi Pico硬件开发实战:GPIO模式、PWM调光与USB Host固件详解

1. 这不是“又一本MicroPython教程”&#xff0c;而是一份Pico硬件开发的实操入场券 你手头刚拆开那个带着绿色PCB、两排20针脚、标着“Raspberry Pi Pico”的小板子&#xff0c;USB线插上去&#xff0c;电脑识别成一个U盘——但接下来呢&#xff1f;网上搜“Pico入门”&#x…

作者头像 李华
网站建设 2026/9/12 13:26:21

SpringBoot任务管理系统开发实战与毕业设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 13:18:26

Qt+C++雷达数据处理软件:界面、链路与跟踪算法

简介&#xff1a;基于Qt/C的雷达数据处理完整项目&#xff0c;面向毕业设计、课程设计与工程二次开发&#xff0c;覆盖界面显示、参数下发、数据接收、目标跟踪全链路。界面使用shapelib读取shapefile地图&#xff0c;绘制圆形刻度并配合定时器实现动态扫描&#xff1b;参数通过…

作者头像 李华