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)的频道消息,实现"下载即通知"的团队协作闭环。
整个集成分为三层:
- Zulip 侧:创建一个 Bot 类型为Incoming webhook的机器人,生成专属的 Webhook URL;
- Radarr 侧:在 Radarr 的Settings → Connect中新增 Webhook 连接,填入该 URL 并选择要推送的事件场景;
- 服务端处理:Zulip 的 Webhook 视图(zerver/webhooks/radarr/view.py)解析事件负载,按事件类型生成话题与消息正文并发送到目标频道。
第一步:在 Zulip 中创建入站 Webhook 机器人
- 在 Zulip 中添加一个 Bot,用于接收 Radarr 通知。
- 创建时务必选择Bot 类型(Bot type)为 Incoming webhook,这是机器人能够接收外部 HTTP 推送的前置条件。
- 确定 Radarr 通知要发送到的目标频道,并生成集成 URL。
生成的 Webhook URL 形如:
https://your-zulip-host.zulipchat.com/api/v1/external_channels/...说明:URL 中已包含机器人身份凭据,请像对待密码一样妥善保管;任何拿到该 URL 的人都可以向对应频道推送消息。
第二步:在 Radarr 中配置 Webhook 连接
- 打开 Radarr 管理后台,进入Settings(设置)→ Connect(连接)。
- 点击加号(+)图标新建连接。
- 选择Webhook类型,并为其命名(例如
Zulip)。 - 勾选你希望接收通知的事件场景(Scenarios);如果需要,还可以填写标签(Tags),实现"仅通知带有特定标签的电影"的细粒度过滤。
- 配置连接参数:
- 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 - Test | Radarr webhook has been successfully configured. |
ApplicationUpdate | Radarr 应用版本更新 | Radarr - Application update | Radarr was updated from {previous_version} to {new_version}. |
Health | 健康检查出现 warning / error | Health {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):
Test与ApplicationUpdate使用固定话题Radarr - Test、Radarr - Application update;Health事件话题为Health {level},其中{level}取自负载顶层的level字段(如warning、error);- 其余事件一律以电影标题作为话题,即
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):missingFromDisk→because it is missing from diskmanual→manuallyupgrade→because an upgraded version existsnoLinkedEpisodes→because it has no linked episodesmanualOverride→via manual override
- 删除文件标记:
MovieDelete事件根据deletedFiles布尔值,在正文中输出its files were also deleted或its 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 种:ApplicationUpdate、Test、Rename、Download、Health、Grab、MovieDelete、MovieFileDelete、MovieAdded。
例如在 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-Type为application/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),仅供参考