分工不同,工具不同

Trakt 侧重用户数据:观看历史、观看清单、评分、日历和 OAuth 登录。它也提供公开的元数据接口,其文档说明了适用的限制。amodb 只做一件事:提供电影、电视剧和人物的元数据,以 TMDB v3 格式的 JSON 返回。用户做过什么,选 Trakt;一部作品是什么,选 amodb。需要两者的应用大多各取所长,分别调用两个服务。

用户数据与作品数据

任务Traktamodb
观看历史核心功能不提供,请自行存储
观看清单和列表核心功能不提供,写入请求返回 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。这两个列表在热门趋势与列表中有说明。单个用户的日历需要你根据自己的观看记录来组装。

功能对比

功能Traktamodb
定价模式请查阅其文档预付 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
<?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,请调用一次 /3/find/tt0903747?external_source=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 个请求的三个套餐中选择一个。所有套餐返回的数据相同,没有免费额度。具体金额见定价。