Zulip Radarr 集成指南:将电影下载管理器的通知接入团队聊天
2026/9/13 5:06:07 网站建设 项目流程

Zulip Radarr 集成指南:将电影下载管理器的通知接入团队聊天

【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip

本指南讲解如何在 Zulip 中接入 Radarr(电影自动化下载与媒体管理工具)的通知推送,涵盖 Webhook 机器人创建、Radarr 端连接配置、事件类型与消息格式,以及底层消息模板与源码实现。读者完成后即可让电影入库、升级、抓取、删除、健康检查与版本更新等事件实时同步到指定的 Zulip 频道(话题)。

集成概览

Radarr 是面向电影管理的自动化工具,负责从索引器抓取资源、通过下载客户端下载并在媒体库中导入。Zulip 通过**入站 Webhook(Incoming webhook)**接收 Radarr 推送的 JSON 事件负载,将其转换为带话题(topic)的频道消息,实现"下载即通知"的团队协作闭环。

整个集成分为三层:

  1. Zulip 侧:创建一个 Bot 类型为Incoming webhook的机器人,生成专属的 Webhook URL;
  2. Radarr 侧:在 Radarr 的Settings → Connect中新增 Webhook 连接,填入该 URL 并选择要推送的事件场景;
  3. 服务端处理:Zulip 的 Webhook 视图(zerver/webhooks/radarr/view.py)解析事件负载,按事件类型生成话题与消息正文并发送到目标频道。

第一步:在 Zulip 中创建入站 Webhook 机器人

  1. 在 Zulip 中添加一个 Bot,用于接收 Radarr 通知。
  2. 创建时务必选择Bot 类型(Bot type)为 Incoming webhook,这是机器人能够接收外部 HTTP 推送的前置条件。
  3. 确定 Radarr 通知要发送到的目标频道,并生成集成 URL。

生成的 Webhook URL 形如:

https://your-zulip-host.zulipchat.com/api/v1/external_channels/...

说明:URL 中已包含机器人身份凭据,请像对待密码一样妥善保管;任何拿到该 URL 的人都可以向对应频道推送消息。

第二步:在 Radarr 中配置 Webhook 连接

  1. 打开 Radarr 管理后台,进入Settings(设置)→ Connect(连接)
  2. 点击加号(+)图标新建连接。
  3. 选择Webhook类型,并为其命名(例如Zulip)。
  4. 勾选你希望接收通知的事件场景(Scenarios);如果需要,还可以填写标签(Tags),实现"仅通知带有特定标签的电影"的细粒度过滤。
  5. 配置连接参数:
    • URL:填入上一步在 Zulip 生成的 Webhook URL;
    • Method(请求方法):设置为POST
    • Username / Password(用户名/密码):留空,Zulip 的入站 Webhook 不需要 HTTP 基本认证;
    • 点击Save(保存),Radarr 会立即发送一条测试消息到 Zulip,验证连通性。

保存成功后,Zulip 频道中会收到类似下图所示的测试通知,表示链路已打通:

支持的事件类型与消息格式

Radarr 集成支持的全部事件类型定义在 view.py 的ALL_EVENT_TYPES中,这些类型同时用于 Zulip 的 Webhook 事件过滤功能:

事件类型触发场景生成的话题(topic)生成的消息正文
Test连接保存时的连通性测试Radarr - TestRadarr webhook has been successfully configured.
ApplicationUpdateRadarr 应用版本更新Radarr - Application updateRadarr was updated from {previous_version} to {new_version}.
Health健康检查出现 warning / errorHealth {level}(如Health error{message}.(原样拼接健康检查消息)
Rename电影文件重命名{movie_title}The movie {movie_title} has been renamed.
Download(非升级)电影下载并导入媒体库{movie_title}The movie {movie_title} has been imported.
Download(升级)已有电影被更高质量版本替换{movie_title}The movie {movie_title} has been upgraded from {old_quality} to {new_quality}.
Grab资源被下载客户端抓取{movie_title}The movie {movie_title} has been grabbed.
MovieDelete电影从媒体库删除{movie_title}The movie {movie_title} was deleted; its files were {also/not} deleted.
MovieFileDelete单个电影文件被删除{movie_title}A file with quality {quality} for the movie {movie_title} was deleted, {reason}.
MovieAdded电影被添加到媒体库{movie_title}The movie {movie_title} was added.

话题(topic)的生成规则

从源码结构看,话题生成逻辑集中在get_topic_for_http_request(view.py):

  • TestApplicationUpdate使用固定话题Radarr - TestRadarr - Application update
  • Health事件话题为Health {level},其中{level}取自负载顶层的level字段(如warningerror);
  • 其余事件一律以电影标题作为话题,即RADARR_TOPIC_TEMPLATE = "{movie_title}",从负载的movie.title字段取值。这保证了同一部电影的所有事件(抓取、导入、升级、删除)自动归入同一个话题,便于在 Zulip 中按电影跟踪完整生命周期。

消息正文的生成规则

消息正文由get_body_for_http_request(view.py)按事件类型分派到各自的模板函数生成,关键实现细节如下:

  • 升级与普通导入的区分Download事件通过负载中的isUpgrade布尔字段判断——为true时进入升级模板,读取movieFile.quality作为新质量、deletedFiles[0].quality作为旧质量;否则按普通导入处理;
  • 删除原因的映射MovieFileDelete事件将 Radarr 的deleteReason枚举值映射为可读文本(view.py):
    • missingFromDiskbecause it is missing from disk
    • manualmanually
    • upgradebecause an upgraded version exists
    • noLinkedEpisodesbecause it has no linked episodes
    • manualOverridevia manual override
  • 删除文件标记MovieDelete事件根据deletedFiles布尔值,在正文中输出its files were also deletedits files were not deleted
  • 未知事件处理:当负载的eventType不在支持列表内时,抛出UnsupportedWebhookEventTypeError,Zulip 会将该事件标记为不支持并记录日志,而不是静默丢弃。

典型事件负载示例

以下依据 zerver/webhooks/radarr/fixtures 中的真实测试负载,展示几类代表性事件的结构。

抓取事件(Grab)——radarr_movie_grabbed.json:

{ "movie": { "id": 771, "title": "Greenland", "releaseDate": "2021-02-09", "folderPath": "/home36/adbtech/media/Movies/Greenland (2020)", "tmdbId": 524047, "imdbId": "tt7737786" }, "release": { "quality": "WEBRip-1080p", "releaseGroup": "EVO", "releaseTitle": "Greenland 2020 1080p AMZN WEBRip DD5 1 X 264-EVO", "indexer": "IP Torrents - Jackett", "size": 2319282432 }, "downloadClient": "Deluge", "downloadId": "8DAECE475EE53205C6FEDDA67F87CDBAF15BD25A", "eventType": "Grab" }

对应消息:The movie Greenland has been grabbed.

升级导入事件(Download + isUpgrade)——radarr_movie_imported_upgrade.json:

{ "movie": { "title": "Greenland", "tmdbId": 524047, "imdbId": "tt7737786" }, "movieFile": { "quality": "WEBRip-1080p", "size": 2320560747 }, "isUpgrade": true, "deletedFiles": [ { "quality": "WEBRip-720p", "size": 1104429335 } ], "eventType": "Download" }

对应消息:The movie Greenland has been upgraded from WEBRip-720p to WEBRip-1080p.(旧质量取自deletedFiles[0].quality,新质量取自movieFile.quality

健康检查事件(Health)——radarr_health_check_error.json:

{ "level": "error", "message": "Movie Gotham City Sirens (tmdbid 416649) was removed from TMDb", "type": "RemovedMovieCheck", "eventType": "Health" }

对应话题Health error、消息Movie Gotham City Sirens (tmdbid 416649) was removed from TMDb.(正文末尾自动补句号)。

应用更新事件(ApplicationUpdate)——radarr_application_update.json:

{ "previousVersion": "4.2.0.6370", "newVersion": "4.2.0.6372", "eventType": "ApplicationUpdate" }

对应消息:Radarr was updated from 4.2.0.6370 to 4.2.0.6372.

事件过滤(Filtering incoming events)

与大多数 Zulip Webhook 集成一致,Radarr 集成支持在 Webhook URL 上通过only_events/exclude_events查询参数做事件过滤。可过滤的事件类型即上文ALL_EVENT_TYPES列出的全部 9 种:ApplicationUpdateTestRenameDownloadHealthGrabMovieDeleteMovieFileDeleteMovieAdded

例如在 Webhook URL 末尾追加:

?only_events=Grab,Download

即可让频道只接收抓取与导入相关通知,屏蔽健康检查、版本更新等噪声事件;使用exclude_events则相反。该机制的完整 URL 规范参见 Webhook URL 规范说明(incoming-webhooks-overview 文档 中的 URL specification 一节)。

如何验证与调试

仓库内置了针对全部事件的自动化测试,位于 zerver/webhooks/radarr/tests.py,每个测试用例将一个 fixture JSON 作为负载送入check_webhook,同时断言话题与消息正文。例如:

  • test_radarr_health_check_error断言话题为Health error、消息为Movie Gotham City Sirens (tmdbid 416649) was removed from TMDb.
  • test_radarr_movie_imported_upgrade断言话题为Greenland、消息为The movie Greenland has been upgraded from WEBRip-720p to WEBRip-1080p.
  • test_radarr_movie_file_deleted断言deleteReason = missingFromDisk被映射为because it is missing from disk

如果希望在自己的 Zulip 实例中快速验证,可以复用这些 fixture:向你的 Webhook URL 直接 POST 任一 JSON 文件内容(注意Content-Typeapplication/json),观察频道中收到的话题与消息是否符合上表。

相关文档

  • Webhook URL 完整规范:Webhook URLs specification(URL 结构、认证方式与参数约定)
  • 创建机器人:添加 Bot 或集成
  • 生成集成 URL:generate integration URL
  • 入站 Webhook 开发指南:incoming-webhooks-walkthrough.md

【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询