内容
# Cantinarr
**您的媒体服务器学会了自我管理。**
**[cantinarr.com](https://cantinarr.com)** · **[在线演示](https://demo.cantinarr.com)**
发现和请求电影、电视节目和书籍。获取推送通知。管理Radarr、Sonarr、Chaptarr和您的下载客户端。当下载卡住时,Cantinarr会诊断原因并建议下一步。您设置代理的操作边界。您的家庭获得简单的体验;您保持对访问、审批和质量的控制。
```
┌──────────────────────────────────────────────────────────────┐
│ Cantinarr 服务器 (Go, 单容器, 端口 8585) │
│ │
│ ┌──────────┐ ┌───────────┐ ┌─────────┐ ┌────────────────┐ │
│ │ 认证/JWT │ │ 请求 │ │ 问题 +│ │ AI 聊天 │ │
│ │ 密码密钥 │ │+ 审批│ │ AI 代理│ │ + 34 AI 工具 │ │
│ └──────────┘ └─────┬─────┘ └─────────┘ └────────────────┘ │
│ │ │
│ ┌──────────────────┴───────────────────┐ ┌──────────────┐ │
│ │ ID 桥:TMDB → Trakt → TVDB │ │ TMDB/Trakt │ │
│ │ (缓存 30 天) │ │ 发现 │ │
│ └───┬──────────┬──────────┬────────────┘ └──────────────┘ │
│ │ │ │ │
│ ┌───┴───┐ ┌────┴───┐ ┌────┴─────┐ ┌───────────────────────┐ │
│ │Radarr │ │ Sonarr │ │ Chaptarr │ │ Flutter 网页(嵌入式)│ │
│ └───┬───┘ └────┬───┘ └────┬─────┘ └───────────────────────┘ │
└──────┼──────────┼──────────┼─────────────────────────────────┘
│ │ │ ▲ 网络钩子推送外部
┌────▼───┐ ┌────▼───┐ ┌────▼─────┐ 更改立即反馈
│ Radarr │ │ Sonarr │ │ Chaptarr │ (+ SABnzbd, qBittorrent,
└────────┘ └────────┘ └──────────┘ NZBGet, Transmission,
Tautulli, 推送网关)
┌───────────────────────────────┐
│ Cantinarr 应用(Flutter) │ ┌─────────────────────┐
│ 发现、请求、书籍、 │─────>│ Cantinarr 后端 │
│ Arr 控制、AI、问题、 │ REST │ (应用唯一 API) │
│ 推送通知 │ + WS │ 应用通信 │
└───────────────────────────────┘ └─────────────────────┘
```
## 为什么选择 Cantinarr?
- **零配置请求** -- 您的用户永远不会看到 API 密钥、TVDB ID 或质量配置文件。他们浏览、点击即可生效。
- **TMDB + Trakt 发现** -- 最好的元数据、图片和趋势数据,通过服务器代理,以便密钥不会出现在设备上。Sonarr 的 TVDB 依赖是无形的。
- **您可以定义“流行”的含义** -- 电影和电视选项卡的标题行默认为 TMDB 每周趋势,或 Trakt 趋势(按实际观看人数排名),或 TMDB 的历史流行度排名。有一个可选的仅英语开关,以保持发现和推荐行仅限英语原版;搜索始终找到所有内容。
- **自动 ID 桥接** -- TMDB 到 TVDB 的翻译,并以 Trakt 作为备用。Sonarr 添加失败的主要原因已解决。
- **书籍也是如此** -- 具有每种格式智能的 Chaptarr(Readarr-API)模块:点击一本书的电子书或有声书行来请求该格式;监控的格式在下载前会标记为 **已请求**;拥有感知能力的搜索和简单的格式控制会固定在所选的、授权的 Chaptarr 实例上。访问权限按用户授予,书籍选项卡在最近添加的行上打开,以便用户无需搜索即可看到刚到来的书籍。
- **随身携带可用文件** -- 可选的、可恢复的下载允许已登录的用户从其授权的库中保存确切的电子书、有声书、电影和剧集文件。Cantinarr 在颁发短期、文件范围的链接之前会重新检查实时 arr 文件记录,而不会将 arr 凭证放入 URL 中。
- **请求审批** -- 可选的审批队列,全球或按用户。管理员还可以控制按用户的季节选择、质量选择和默认质量配置文件。审批/拒绝作为推送通知发送给请求者。
- **AI 助手** -- “今晚我应该看什么?”每个用户都可以带来个人 Anthropic、OpenAI 或 Gemini API 密钥,或使用一次性 ChatGPT 浏览器代码链接 OpenAI(甚至无需包含访问权限),并且他们的选择永远不必与服务器的提供商匹配。管理员可以将相同的提供商配置为包含的服务器配置文件,并按用户授予共享访问权限。个人提供商是一种明确的覆盖;Cantinarr 永远不会在需要关注时静默使用共享帐户。助手搜索您的库,检查可用性,为您请求,并为管理员提供会话队列和发布控制。
- **AI 修复代理** -- 用户点击“报告问题”(或 Cantinarr 在队列中检测到问题);每个报告都绑定到确切的 Radarr/Sonarr 实例,并首先进行安静的观察窗口。Cantinarr 给 Sonarr/Radarr 时间来重试或替换下载,然后再提醒任何人或启动代理;持续的安静问题然后进入监督工作流。恢复在分发前取消陈旧的提案。自动解决需要一个确切的更改文件和一个匹配的事件后导入记录—而不是队列消失或已经存在的档案。修复由服务器拥有:它始终使用管理员的共享 API 密钥或共享 OpenAI OAuth 连接,而不使用报告者的个人提供商或按用户授予的包含访问权限。管理员可以为修复提供自己的测试模型名称,同时保留该全局提供商和凭证。
- **MCP 服务器** -- 31 个内置 AI 工具中的 31 个作为 [模型上下文协议](https://modelcontextprotocol.io/) 端点在 `/mcp` 处公开,具有 OAuth 发现、浏览器/密码密钥登录、动态客户端注册和持久的旋转刷新令牌。两个质量配置文件变异工具由于其一次性安全移交依赖于身份验证的内置聊天回合证明,仍仅限应用使用。此入站 OAuth 允许外部客户端访问 Cantinarr;它与 Codex 聊天使用的出站个人/共享 OpenAI OAuth 不同。每个工具都可以从设置 > AI 工具开启或关闭。
- **深入的 *arr 控制** -- SABnzbd、qBittorrent、NZBGet 和 Transmission 模块,具有实时队列管理,以及深入的 Radarr/Sonarr 控制:系列 → 季节 → 集,带有每项进度、质量和历史记录;集多选与批量搜索;长按操作菜单;编辑系列;交互式发布搜索无处不在。管理员 AI/MCP 工具可以检查质量配置文件并导入或更新 Radarr、Sonarr 和 Chaptarr 的本机/TRaSH 自定义格式。在明确的管理员请求后,应用 AI 预览并自主应用狭窄的配置文件分数、截止或升级策略更改,在相同的身份验证聊天回合中。AI/MCP 配置文件和自定义格式写入在设置 > 配置历史记录中记录,以便后续审查和实时比较。每个应用的质量配置文件更新可以恢复一次,仅当 Cantinarr 的实例、配置文件和依赖项保护仍然匹配时;链接恢复是最终的,自定义格式条目仅可审查。
- **导入医生** -- 当下载卡住时,Cantinarr 用纯英语解释 **原因** (示例文件、未解压的存档、未确认的 TheXEM 映射、“不是升级”、无法解析/无效文件、远程路径映射或下载客户端问题、卡住的种子、权限...),并提供 **一键修复**,具有完全透明度:手动/强制导入,显示候选文件,删除 + 阻止列表 + 重新搜索,移交给诸如 Unpackerr 之类的工具,或重新扫描。相同的诊断支持应用程序、AI 助手、修复代理和 MCP。
- **灵活的请求** -- 一键请求整个标题,或选择您想要的确切 **季节** (或书籍 **格式** );部分可用的节目显示每季的可用性,以及一键请求其余部分的路径。
- **始终同步** -- 可用性从 arr (而非过时的快照)实时计算,并且一键、服务器管理的 Radarr/Sonarr/Chaptarr 网络钩子将手动导入、删除和添加实时推送到应用程序中,无需在设备上公开回调凭证。书籍收益最大:电子书可以在两次轮询之间完成下载,因此即时更新使其“准备阅读”的警报可靠。
- **推送通知** -- 通过自托管的推送网关进行 APNs,具有零配置自动注册:电影、集和书籍的新内容提醒,为管理员提供审批/问题提醒,按用户偏好开关,深入链接到正确屏幕。
- **Plex 入门** -- 新用户直接在应用指南中请求访问权限,附带其 Plex 邮箱。链接您的 Plex 账户一次,服务器邀请从用户屏幕一键可达 -- 或全自动,用户收到“检查您的收件箱”的推送,邀请函立即发送。
- **Tautulli** -- 查看 Plex 当前正在播放的内容:具有质量/转码徽章的活动流,观看历史记录,以及热门电影/节目/用户统计数据。
- **静息加密** -- arr API 密钥、下载客户端密码、网络钩子令牌、共享和个人 AI 凭证以及 OpenAI OAuth 授权在数据库中以 AES-256-GCM 加密。
- **适合家庭使用** -- 连接链接,默认无密码,具有基于角色的访问控制,按用户默认实例。管理员管理服务;用户只需浏览和请求。
- **引导设置** -- 一个实时的检查清单向导,源自实际配置的服务:每个步骤都打开真正的设置屏幕,进度不会过时,新功能会自动出现在列表中。
- **单容器** -- 静态的 Go API/网络服务器,加上一个固定的 Codex 应用程序服务器助手,具有一个暴露的端口。在 Raspberry Pi 或 NAS 上运行良好。
## 快速开始
```bash
git clone https://github.com/windoze95/cantinarr.git
cd cantinarr
docker compose up -d
```
或者跳过克隆,直接使用发布的镜像:`ghcr.io/windoze95/cantinarr:latest`。
打开 `http://your-server:8585` -- 设置向导将引导您创建管理员账户。然后,从 **设置 > 提供商和凭证** 和 **设置 > 添加实例** 在管理员界面中配置您的服务(TMDB、Radarr、Sonarr 等)。在那里配置一个包含的 AI 提供商并按用户授予,或者让每个用户在 **设置 > AI 访问** 下提供自己的提供商。
### 从源码
```bash
# 服务器(需要 Go 1.25+)
cd server
go run ./cmd/server
# 应用(需要 Flutter 稳定版,Dart SDK 3.4+)
cd app
flutter pub get
flutter run
```
`make` 构建整个栈(Flutter 网页 → 嵌入到 Go 二进制文件中)。
## 仓库结构
```
cantinarr/
├── server/ # Go 后端 -- 参见 server/README.md
│ ├── cmd/server/ # 入口点
│ └── internal/ # ai, api, arr, auth, cache, chaptarr, codexapp,
│ # config, credentials, db, discover, downloads, instance,
│ # mcp, mcpserver, mediafiles, mediapath, nzbget, proxy, push, qbittorrent,
│ # radarr, remediation, request, sabnzbd, secrets,
│ # sonarr, tautulli, tmdb, trakt, transmission,
│ # web, webhooks, websocket
│
├── app/ # Flutter 客户端(iOS,网页)-- 参见 app/README.md
│ ├── lib/
│ │ ├── core/ # 模型,网络,实时,主题,部件
│ │ ├── features/ # auth, discover, request, dashboard, sonarr,
│ │ │ # radarr, chaptarr, downloads, media_download, tautulli, issues,
│ │ │ # ai_assistant, notifications, settings, ...
│ │ └── navigation/ # 带有身份验证保护的 GoRouter
│ └── test/
│
├── Dockerfile # 多阶段构建(Flutter 网页 + Go)
├── docker-compose.yml # 全栈部署(预设环境变量)
├── AGENTS.md # 贡献者/代理操作手册(CLAUDE.md 导入它)
└── README.md # 本文件
```
## 配置
共享服务凭证通过管理界面进行管理 -- 不需要为 API 密钥设置环境变量。 AI 与其他集成不同:管理员可以使用 API 密钥或共享的 OpenAI(OAuth)链接配置服务器配置文件,而每个用户都可以独立配置相同的选择作为个人覆盖。 API 密钥和 OAuth 授权保持加密并存储在服务器端。 每个提供商、模型、补救模型覆盖或密钥保存 -- 以及每个完成的 OAuth 选择 -- 必须完成一个小的、实际的、无需工具、推理低的消息响应回合,然后 Cantinarr 才会激活它。 验证报告了一个安全的可行类别,用于无效凭证、不支持的模型/访问、耗尽配额或临时提供商中断,而不暴露上游机密。 OpenAI OAuth 提供推荐的 Codex 模型以及 GPT-5.6 Sol、Terra 和 Luna。
服务器还会在默认情况下每 24 小时运行一个小的共享模型健康检查。 失败时会打开一个仅限管理员的重复问题; 稍后成功的回合会解决它。 管理员可以通过 **设置 > 提供商和凭证** 禁用此检查,而不会削弱强制性保存时间测试。 修复代理与此监视器保持独立,并始终直接从管理员的共享配置文件中解决凭证。
包含的 AI 是新帐户的显式每用户权利;初始管理员启用。 升级保留现有用户的全局提供商行为,以便访问不会消失,之后管理员可以从 **设置 > 用户** 中撤销或授予它。 启用 OpenAI OAuth 支持的授予会显示共享帐户津贴和成本警告,然后再应用。
| 设置 | 位置 | 描述 |
|---|---|---|
| TMDB 访问令牌 | 管理界面 | 媒体发现和搜索所需([在这里获取](https://www.themoviedb.org/settings/api))|
| Radarr/Sonarr 实例 | 管理界面 | 通过设置 > 添加实例添加 |
| Chaptarr 实例 | 管理界面 | 书籍模块;通过实例编辑器或用户设置授予每个用户的访问权限 -- [`docs/books-setup.md`](docs/books-setup.md)中有完整的逐步指南 |
| SABnzbd/qBittorrent/NZBGet/Transmission | 管理界面 | 下载客户端模块(队列、历史记录、速度)|
| Tautulli 实例 | 管理界面 | Plex 活动、观看历史、统计数据 |
| Anthropic/OpenAI/Gemini API 密钥 | 管理界面 | 启用共享 API 密钥支持的 AI 聊天和自动修复 |
| OpenAI(OAuth) | 个人链接(设置 > AI 访问下)或管理员管理的共享链接 | 使用 ChatGPT 帐户的 Codex 津贴,适用于选定的个人或包含的模型;管理员共享的链接还支持服务器拥有的修复。每个用户共享聊天访问是可选的,并带有配额/成本警告 |
| Trakt 客户端 ID | 管理界面 | 增强发现 + 回归 ID 桥接;需要在设置 > 发现下选择 Trakt 趋势源 |
| 发现行源 | 管理界面 | 设置 > 发现:哪个源提供标题行,以及可选的仅限英语过滤 |
**实例 URL 仅由 Cantinarr 服务器拨号** -- 手机和浏览器永远不会直接联系它们,因此集群内部名称(Docker 服务名称,如 `http://radarr:7878`,Kubernetes 集群 DNS,Tailscale MagicDNS)是推荐的形式,并且 arrs 从不需要在其网络外部公开。 一个拓扑例外:一个容器共享另一个容器的网络堆栈(`network_mode: container:<gateway>`,或 Unraid 的 `Container` 网络类型 -- 在通过 VPN 网关路由服务时常用)没有自己的地址或 DNS 名称,因此 `http://chaptarr:8789` 永远不会解析。 将实例 URL 指向发布端口的网关。 应用程序中的 **测试连接** 按钮从服务器运行,因此它会告知这些 URL 的真实性。 普通 `http` 在受信任的网络中完全受支持;`https` 需要服务器容器信任的证书(否则自签名证书将因 x509 错误而连接测试失败)。 两个服务特定的说明:SABnzbd 的主机名验证拒绝它不知道的服务名称,因此请将其添加到 `host_whitelist`(配置 > 特殊)或将容器的主机名设置为匹配;对于 Transmission,仅输入 `scheme://host:port` -- Cantinarr 会追加 `/transmission/rpc`。 Poster 和 fanart 图像直接从 TMDB/TVDB CDN 加载到设备上,因此客户端设备仍然需要到这些主机的互联网出口。
已完成媒体的下载有意选择加入,因为 Radarr、Sonarr 和 Chaptarr 报告路径但不通过其 API 提供文件字节。 配置有两个层次:部署使每个所需库对 Cantinarr 都是只读的,并在 `CANTINARR_MEDIA_ROOTS` 中列出 Cantinarr 可见的边界,然后管理员将每个媒体实例报告的路径映射到该边界内的文件夹。 这两个路径不必匹配,并且 arr 源可以使用 POSIX、Windows 驱动器或 UNC 语法,而不论 Cantinarr 主机操作系统的类型。 对于 Docker,例如,挂载 `- /mnt/nas/media:/media:ro`,设置 `CANTINARR_MEDIA_ROOTS=/media`,并将 Radarr 的 `/data/media/movies` 映射到 `/media/movies`;本地服务器改为使用其进程可读的绝对本地目录。 Chaptarr 实例可能有单独的 `/ebooks`、`/audiobooks`、`/yana-ebooks` 和 `/yana-audiobooks` 的映射;文件夹名称永远不会确定书籍格式。
下载控制按实例启用:实例仅在管理员为其保存显式路径映射后才提供下载,并且每个实例都从媒体下载关闭状态开始。 Cantinarr 只接受来自用户有效 Radarr/Sonarr 实例或授权 Chaptarr 实例的实时文件 ID,拒绝该实例的映射和全局根目录之外的文件,并为应用程序提供一个短期的文件作用域链接,以便在 Flutter 中无需缓冲在服务器上即可流式传输大文件。
可选的部署调整环境变量:
| 变量 | 默认值 | 描述 |
|---|---|---|
| `CANTINARR_PORT` | `8585` | HTTP 监听端口。 Kubernetes 服务链接值(`tcp://…`)由名为 `cantinarr` 的服务注入,但优先使用数字值覆盖 |
| `CANTINARR_SERVER_NAME` | `Cantinarr` | 客户端中显示的名称 |
| `CANTINARR_PUBLIC_URL` | 直接请求来源 | Radarr/Sonarr/Chaptarr 容器 POST 回调的来源,因此它必须能够从 arr 自身解析和访问 **来自 arrs 的地址** -- 在同一网络/集群部署中,通常集群内部源的地址是正确的地址。 在反向代理后面显式设置它(将转发标头视为无关紧要) |
| `CANTINARR_OAUTH_ISSUER` | 请求派生来源 | 用于进入 MCP OAuth 元数据、令牌受众和浏览器来源检查的规范外部 HTTPS 来源;设置它还启用稳定的 RFC 9207 授权响应 `iss` 并允许该来源调用 `/mcp`。 在反向代理后面设置它并保持稳定(更改它会使现有的受众绑定 MCP 令牌重新连接);不要替换 arr 可达的 `CANTINARR_PUBLIC_URL` |
| `CANTINARR_MCP_ALLOWED_ORIGINS` | 未设置 | 以逗号分隔的附加浏览器来源列表,允许调用 `/mcp`。 如果既没有配置此选项,也没有配置 `CANTINARR_OAUTH_ISSUER`,则拒绝提供 `Origin` 的请求;本地和服务器端 MCP 客户端不需要任何条目 |
| `CANTINARR_JWT_SECRET` | 自动生成的 | 用于签署短期访问令牌的 HMAC 密钥。 设备会话不依赖于它:更改它永远不会使任何人退出 |
| `CANTINARR_ENCRYPTION_KEY` | 自动生成的密钥文件 | 存储秘密的 Base64 32 字节密钥(默认:`/config/encryption.key`) |
| `CANTINARR_AI_PROVIDER` | `anthropic` | 包含的服务器 AI 配置文件中未保存任何 AI 配置文件时的备用提供商(`anthropic`、`openai`、`gemini` 或 `codex`) |
| `CANTINARR_AI_MODEL` | 提供商默认值 | 包含的服务器 AI 配置文件中未保存任何 AI 配置文件时的备用模型 |
| `CANTINARR_CODEX_BIN` | 自动发现 | `codex-app-server` 或完整 `codex` CLI 的可选路径;容器镜像在 `/usr/local/bin/codex-app-server` 中捆绑测试的 0.144.3 应用服务器 |
| `CANTINARR_CODEX_RUNTIME_DIR` | `/dev/shm/cantinarr-codex` | 用于服务器拥有的、短暂的每个会话 Codex 状态的绝对 Linux tmpfs/ramfs 目录;如果它已经存在,则它必须由服务器用户以 `0700` 模式拥有 |
| `CANTINARR_MEDIA_ROOTS` | 未设置 | 以逗号分隔的绝对路径列表,形成已完成的媒体下载的外层文件系统允许列表。 空值禁用文件下载。 在这些 Cantinarr 可见的根目录内以只读方式挂载库,然后将每个 arr 报告的前缀映射到它们下面的路径。 `/` 被拒绝 |
| `CANTINARR_PUSH_GATEWAY_URL` | 未设置 | 推送网关来源 -- 设置它会启用推送通知(自动注册) |
| `CANTINARR_PUSH_API_KEY` | 未设置 | 可选的固定网关密钥(空白 = 自动注册) |
| `CANTINARR_PUSH_ENROLL_TOKEN` | 未设置 | 仅适用于具有受限注册的网关 |
| `CANTINARR_APPLE_APP_IDS` | 未设置 | 本机 Apple 密钥的 `TeamID.BundleID` 值 (`/.well-known/apple-app-site-association`) |
| `CANTINARR_ANDROID_PACKAGE_NAME` | `codes.julian.cantinarr` | Android 密钥的包名 |
| `CANTINARR_ANDROID_CERT_SHA256_FINGERPRINTS` | 未设置 | `/.well-known/assetlinks.json` 的 Android 签名证书指纹 |
| `CANTINARR_WEBAUTHN_EXTRA_ORIGINS` | 未设置 | 其他 WebAuthn 来源信任 |
| `CANTINARR_DISABLE_UPDATE_CHECK` | 未设置 | 设置为 `1` 以禁用周期性的 GitHub 版本检查(在管理员“更新可用”横幅后面) |
源镜像构建还接受 Docker 构建参数
`CANTINARR_E2E_WEB_SEMANTICS`(默认为 `false`)。 它仅用于一次性私人实验室:设置为 `true` 会在 Flutter Web 包中编译确定性的 Maestro 标签。 官方生产镜像保留默认值并保留正常的浏览器可访问性语义。
OpenAI(OAuth)源部署使用 Codex 应用服务器,并仅在 Linux 上受支持;非 Linux 主机即使安装了 Codex 二进制文件,也会报告此提供商不可用。 运行时目录的父目录必须存在,并且目录必须位于 tmpfs 或 ramfs 上 -- 而不是持久存储。 为每个并发运行的 Cantinarr 进程提供自己的运行时目录;启动时会在专用根目录中删除陈旧的 `session-*` 条目。 官方容器使用其私有的 Docker `/dev/shm` tmpfs。 使用测试版 Codex 0.144.3 或兼容协议的构建。
原生应用密钥需要与应用关联的公用 HTTPS 服务器域名(AASA for Apple,Digital Asset Links for Android)。 当原生关联无法实现时,浏览器密钥设置仍然可用。 有关详细信息,请参阅 [`server/README.md`](server/README.md#configuration)。
默认情况下,用户无密码且无密钥:链接直接启动永久设备会话,因此家庭成员永远不需要处理凭证。 会话不会过期 -- 不会因空闲时间、服务器重启、升级或密钥轮换而过期 -- 仅当管理员撤销设备(**设置 > 设备**)或删除用户时会话才会结束。 管理员可以通过 **设置 > 用户** 为每个用户授予密码和/或密钥。 密码是使用纯 HTTP 服务部署的 MCP 客户端授权的凭据,而在 WebAuthn 无法使用的情况下,密钥不可用。 禁用某种方法是一种真正的撤销 -- 它会清除存储的密码或删除用户的密钥。 要恢复访问权限,管理员会发出新的连接链接。
## 工作原理
### 适用于用户
1. 管理员向您发送连接链接
2. 在您的设备上打开链接 -- 它会创建您的帐户并自动连接
3. 浏览由 TMDB、Trakt 和 Chaptarr 支持的电影、电视节目和书籍
4. 点击您想要的任何内容上的“请求” -- 为显示的节目选择季节,或点击书籍的 eBook 或 Audiobook 行请求该格式
5. 实时查看下载进度并接收推送通知
6. 文件出现问题? 点击“报告问题”; Cantinarr 会悄悄地监视正在进行的 Radarr/Sonarr 恢复,只有在问题持续存在时才会进行调查
7. 向 AI 助手提问推荐或为您请求。 使用包含的服务器提供商(如果获得授权),或在 **设置 > AI 访问** 下选择您自己的提供商
### 适用于管理员
1. 部署容器并完成设置向导
2. 从设置中添加共享的 API 凭证和服务实例;对于包含的 AI,请添加 Anthropic/OpenAI/Gemini 密钥或链接共享的 OpenAI(OAuth)帐户
3. 生成连接链接,为您的家庭成员授权包含的 AI 访问(如果需要),并为每个用户固定默认实例(如果您运行多个实例)
4. 可选地,需要请求审批;待处理的请求会作为推送通知到达
5. 点击 **配置即时更新** 以便在每个 Radarr/Sonarr/Chaptarr 实例上安装经过身份验证的 Webhook(书籍最需要它 -- 电子书可以在两次轮询之间完成下载)
6. 从应用程序管理所有内容 -- 队列、卡住的导入、问题、代理修复。 无需配置文件。
7. 当发布新版本时,应用内横幅会指向它; 可选地设置 **更新门户** 链接(**设置 > 管理员**)直接跳转到您的容器管理器。 请参阅 [`docs/updating.md`](docs/updating.md)。
### ID 桥接(TMDB 到 TVDB)
核心技术挑战:TMDB 有更好的元数据和 API,但 Sonarr 只接受 TVDB ID。 Cantinarr 透明地解决了这个问题:
```
请求:“添加 The Last of Us”(TMDB ID 100088)
1. 缓存检查 -> 未命中
2. TMDB 外部 ID API -> tvdb_id: 392256(命中!)
3. 缓存结果(30 天)
4. Sonarr 查找 tvdb:392256 -> 完全匹配
5. 使用用户的有效质量配置文件 + 根文件夹将其添加到 Sonarr
```
如果 TMDB 没有 TVDB 映射(很少见),则桥接会回退到 Trakt 的交叉引用数据库,然后作为最后的手段进行标题 + 年份搜索。
电影不需要桥接 -- Radarr 原生支持 TMDB ID。 书籍直接由 Chaptarr/Readarr `foreignBookId` 索引。
## 技术栈
| 组件 | 技术 |
|---|---|
| 服务器 | Go 1.25、Chi 路由器、SQLite(纯 Go)|
| 客户端 | Flutter(Dart)、Riverpod、GoRouter |
| 认证 | JWT(HS256)、bcrypt、连接令牌、WebAuthn 密钥 |
| AI | 个人或管理员共享的 Anthropic、OpenAI 和 Gemini API 凭证,以及通过捆绑的 Codex 应用服务器进行个人或共享的 OpenAI OAuth;SSE 应用流式传输 |
| MCP | [mcp-go](https://github.com/mark3labs/mcp-go)、Streamable HTTP + 进入 Cantinarr OAuth |
| 实时 | gorilla/websocket + arr webhooks |
| 推送 | 自托管推送网关(APNs) |
| 发现 | TMDB API v3、Trakt API v2(服务器代理) |
| 打包 | 多阶段 Docker,具有校验和验证的 Codex 应用服务器固定版本、go:embed、GHCR(`ghcr.io/windoze95/cantinarr`) |
## API 参考
完整的 API 文档位于 [`server/README.md`](server/README.md#api-reference)。
## 相关项目
- [**mam-chaptarr-protonvpn-skill**](https://github.com/windoze95/mam-chaptarr-protonvpn-skill) -- 一个用于构建 **低于** Cantinarr 书籍模块的代理技能:一个 VPN 隔离的 Gluetun/ProtonVPN 堆栈在同一网络命名空间中运行 Chaptarr 和 qBittorrent,具有转发端口同步、分离的索引器和跟踪器主机会话以及端到端验证。 如果您从头开始建立书籍自动化并希望容器拓扑结构正确,则此项目非常有用。 独立项目; [`docs/books-setup.md`](docs/books-setup.md) 显示它在哪里。
## 贡献
欢迎贡献! 请在提交 PR 之前先打开问题讨论你的想法。 `AGENTS.md` 是贡献者和 AI 代理的操作手册 -- 分支协议、验证命令和文档标准都位于此处。
## 许可证
AGPL-3.0 -- 参见 [LICENSE](LICENSE) 以获取详细信息。
版权 (c) 2026 Julian Dice
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器