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

发布时间:2026/9/12 13:38:43
拆解 Radarr 海报管线:一张电影海报从 TMDb 到本地磁盘的落盘链路
拆解 Radarr 海报管线一张电影海报从 TMDb 到本地磁盘的落盘链路【免费下载链接】RadarrMovie organizer/manager for usenet and torrent users.项目地址: https://gitcode.com/GitHub_Trending/ra/RadarrRadarr 海报墙里点开一部片子海报位却是空白日志飘着一行Couldnt download media cover。Radarr 是面向 Usenet 与 BitTorrent 用户的电影管理器海报墙只是它的一根毛细血管。读完你能独立跑通这张海报从 TMDb 到本地磁盘的落盘链路并定位下载卡在哪一环。核心机制MediaCoverService / MediaCoverProxyRadarr 的海报管线由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; }它不比文件内容只拿本地大小对远程HEAD的Content-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后缀文件。缩放交给 ImageSharpJPEG 质量写死 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 前缀7878改UrlBase后旧封面链接失效MediaCover目录数据目录下海报落盘根目录默认直接删目录会导致全部重下Kodi 的MovieImages是否把海报复制成poster.jpg到电影目录开关掉后 Kodi/Emby 读不到海报ImageResizer的 JPEG 质量缩略图编码质量92写死要调质量得改源码非配置项踩坑实录海报管线踩坑集中在下载、缩放、清理三处。海报 404现象请求poster-500.jpg却拿到原尺寸图。根因缩略文件缺失控制器回退全尺寸。修复确认数据目录可写重启后自动重缩放。一直不下载现象海报位长期空白无报错弹窗。根因TMDb 远程地址失效抛WebException。修复看日志Couldnt 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),仅供参考