分工不同,工具不同
Trakt 侧重用户数据:观看历史、观看清单、评分、日历和 OAuth 登录。它也提供公开的元数据接口,其文档说明了适用的限制。amodb 只做一件事:提供电影、电视剧和人物的元数据,以 TMDB v3 格式的 JSON 返回。用户做过什么,选 Trakt;一部作品是什么,选 amodb。需要两者的应用大多各取所长,分别调用两个服务。
用户数据与作品数据
| 任务 | Trakt | amodb |
|---|---|---|
| 观看历史 | 核心功能 | 不提供,请自行存储 |
| 观看清单和列表 | 核心功能 | 不提供,写入请求返回 405 |
| 用户评分 | 核心功能 | 不提供,写入请求返回 405 |
| 日历 | 按用户提供,请查阅其文档 | 每部剧的 next_episode_to_air 和排期列表 |
| 登录 | OAuth | 仅需密钥,无用户登录 |
| 作品元数据 | 公开接口,限制请查阅其文档 | 支持 14 种语言的详情接口 |
| 演员和幕后人员 | 请查阅其文档 | 作品用 /credits,人物用 combined_credits |
| 图片 | 请查阅其文档 | img.amodb.dev,无需密钥 |
| 预告片 | 请查阅其文档 | /videos,带 type 和 official |
| 某日期以来的变更 | 请查阅其文档 | 不提供,没有变更动态 |
要获取排期,GET /3/tv/airing_today 和 GET /3/tv/on_the_air 会按播出日期列出剧集,每条剧集记录还带有自己的 next_episode_to_air。对已完结的剧集,该字段为 null。这两个列表在热门趋势与列表中有说明。单个用户的日历需要你根据自己的观看记录来组装。
功能对比
| 功能 | Trakt | amodb |
|---|---|---|
| 定价模式 | 请查阅其文档 | 预付 1 至 24 个月 |
| 免费额度 | 请查阅其文档 | 无,也没有试用 |
| 认证方式 | 用户数据使用 OAuth,公开调用请查阅其文档 | api_key 或 Bearer 请求头 |
| 响应格式 | JSON,请查阅其文档 | TMDB v3 格式的 JSON |
| 语言 | 请查阅其文档 | 14 种界面语言 |
| 电影 | 支持 | 支持 |
| 电视剧 | 支持 | 支持,含季和集 |
| 人物 | 请查阅其文档 | 支持 |
| 图片 | 请查阅其文档 | img.amodb.dev,尺寸标识与 TMDB 相同 |
| 评分 | 用户评分,请查阅其文档 | 已知时提供 IMDb、Kinopoisk、Metacritic、Rotten Tomatoes 和 TMDB 的评分 |
| 速率限制 | 限制请查阅其文档 | 每个密钥每分钟 20、40 或 120 次 |
| 商业使用 | 请查阅其文档 | 付费套餐,见定价 |
| 兼容性 | 自有 API | 兼容 TMDB v3 读取接口和 OMDb |
amodb 的不同之处
- 用户无需登录页面。 服务端密钥就够了。没有人需要关联账户,因此没有令牌要刷新,也没有授权页面要解释。
- 字段覆盖面广。 时长、类型、制作公司、分级、译文和关键词都来自详情接口,并使用你请求的语言。
- 公开的限制。 套餐限制是每分钟的次数,每次响应都会显示剩余次数。你可以据此估算后台同步的规模。
- 情绪指数和原声配乐。 情绪指数和原声配乐上的扩展提供了 TMDB v3 没有的数据。
Trakt 更适合的场景
- 一切与个人相关的功能。 记录观看进度(scrobbling)、历史同步、社交列表和按用户的日历都是 Trakt 的功能。amodb 没有账户,也没有写入方法。
- 跨设备状态。 如果用户希望手机和电视上的“已看”标记保持一致,状态就必须保存在用户服务中,而 amodb 不是这类服务。
- 已有的 OAuth 应用。 如果你的应用已经持有 Trakt 令牌,可以继续使用。只需为目前从别处获取的作品数据接入 amodb。
迁移到 amodb:关联你的记录
你不需要迁移用户数据,因为 amodb 不保存任何用户数据。你要替换的是元数据调用。Trakt 条目带有其他数据库的 ID(具体字段请查阅其文档),因此请在每条观看记录旁保存 TMDB ID 或 IMDb ID,并在这里使用。
<?php
declare(strict_types=1);
function amodb(string $path): array
{
$ch = curl_init('https://api.amodb.dev/3' . $path);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("amodb returned $status");
}
return json_decode($body, true);
}
$show = amodb('/tv/1396?language=en-US');
$next = $show['next_episode_to_air'] ?? null;
echo $show['name'], ' ', $show['status'], PHP_EOL;
echo $next ? 'Next: ' . $next['air_date'] : 'No episode scheduled', PHP_EOL;如果你只有 IMDb ID,请调用一次 /,并保存其中 tv_results 的 ID。429 响应包含 Retry-After,详见速率限制。
估算刷新任务的规模
一个包含 200 部剧的用户片库,完整刷新一次需要 200 次详情请求。每分钟 20 次请求时需要 10 分钟,40 次时需要 5 分钟,120 次时不到 2 分钟。密钥检查先于边缘缓存执行,因此重复调用也会计数。amodb 没有变更动态,所以无法告诉你自某个日期以来哪些 ID 发生了变化。请改为从详情响应中读取 status 和 next_episode_to_air:仍在播出的剧集刷新得勤一些,已完结的剧集则很少刷新。详情会缓存 6 小时,刷新间隔短于这个时间只会得到相同的数据。
定价
amodb 采用预付方式,不会自动续费。可选择 1、3、6、12 或 24 个月,分别享受 0、10、20、30 或 40% 的折扣,并在每分钟 20、40 或 120 个请求的三个套餐中选择一个。所有套餐返回的数据相同,没有免费额度。具体金额见定价。