简要对比

amodb 是一个独立的 API,使用与 TMDB v3 相同的协议。只要不调用下面“不提供”表格里的路径,为 TMDB 编写的客户端在更换基础 URL 和密钥后就能从 amodb 读取数据。因此选择取决于条款、附加功能和少数缺口。TMDB 对符合条件的使用按其自身条款提供免费 API。amodb 是只读的付费 API,提供 14 种语言、五个额外数据块,限制按密钥计算。

接口兼容度

下表每一行给出一个 TMDB v3 读取路径,以及它在 https://api.amodb.dev/3 上的表现。

领域TMDB v3 路径在 amodb 上
电影详情/movie/{movie_id}相同,另有五个 append_to_response 取值
电视剧详情/tv/{series_id}相同,但没有 type 字段,且大多数剧集的 created_by 为空
季和集/tv/{series_id}/season/{season_number}结构相同。季的图片、视频和译文为空,季和集的 external_ids 为 null
人物/person/{person_id}相同,另有 combined_credits、movie_credits、tv_credits、external_ids 和 images(仅人物照片)
演职员/movie/{movie_id}/credits相同。单集的 cast 为空
搜索/search/multi相同,缓存 10 分钟
发现/discover/movie相同,缓存 30 分钟
热门趋势/trending/{media_type}/{time_window}相同,缓存 30 分钟
列表/movie/popular相同,page 取值 1 到 500
图片/movie/{movie_id}/images结构相同,文件从 img.amodb.dev 加载
视频/movie/{movie_id}/videos相同
译文/movie/{movie_id}/translations相同,提供 14 种语言
关键词/movie/{movie_id}/keywords相同
评论/movie/{movie_id}/reviews返回 200,但只有少数作品有评论,因此空列表属于正常情况
系列合集/collection/{collection_id}相同,parts 按上映日期排序
公司和电视网/company/{company_id}键相同。公司的 description 为空,parent_company 为 null
类型/genre/movie/list相同
配置/configuration键相同,图片主机为 img.amodb.dev
按外部 ID 查找/find/{external_id}同一接口,另支持 kinopoisk_id。tv_episode_results 和 tv_season_results 始终为空
剧集分组/tv/{series_id}/episode_groups列出一部剧的分组,不含分组内容

amodb 未提供的功能

这些 TMDB v3 调用没有对应项。未知路径返回 404,status_code 为 34;写入方法返回 405,status_code 为 37。

TMDB v3 调用amodb 的响应
/movie/changes、/tv/changes、/person/changes 以及单个 ID 下的 changes404,status_code 34
剧集或某一季下的 aggregate_credits404,status_code 34
/credit/{credit_id} 和 /review/{review_id}404,status_code 34
/tv/episode_group/{id}404,status_code 34
/person/{person_id}/translations、tagged_images 和 /person/latest404,status_code 34
系列合集、公司和电视网的 images、translations 和 alternative_names404,status_code 34
/configuration/timezones404,status_code 34
account、authentication、guest_session 和 list 下的全部内容,以及任何 /rating 或 /account_states 路径405,status_code 37

如果你把 aggregate_credits 或 changes 加到 append_to_response,amodb 会忽略这个名称且不报错,因此响应体中就是缺少对应的键。

功能对比

功能TMDBamodb
定价模式符合条件的使用免费,遵循 TMDB 条款预付,每次购买 1 至 24 个月
免费额度有,限符合条件的使用无,也没有试用
认证方式api_key 中的 v3 密钥,或作为 Bearer 的 v4 令牌api_key 或 Bearer,密钥为 32 位十六进制
响应格式JSONJSON,所提供路径上的字段相同
语言请查阅其文档提供 14 种,其他标签回退到 en
电影支持支持
电视剧支持支持
人物支持支持
图片支持img.amodb.dev,尺寸从 w92 到 original
评分TMDB 用户评分,其他来源请查阅其文档已知时在一个对象中提供五个来源
写入方法账户、列表和评分方法无,返回 405
速率限制请查阅其文档每个密钥每分钟 20、40 或 120 次
商业使用商业使用和署名要求请查看其条款付费套餐,见定价
兼容性定义了 TMDB v3大多数 TMDB v3 读取路径和一个 OMDb 路由

具体差异

  • 条款。 TMDB 要求你阅读其关于商业使用和署名的条款。amodb 按预付周期销售,不会自动续费,没有免费额度,也没有试用。
  • 语言。 amodb 提供 en、ru、uk、be、zh、pt、bg、he、cs、ro、fr、pl、it 和 es。它接受 ru-RU、pt-BR 这类 TMDB 标签。德语、日语和韩语会回退到 en,而 original_title 保留原始标题。TMDB 的语言覆盖范围请查阅其文档。见语言。
  • 扩展。 append_to_response 还接受 moods、soundtracks、ratings、wikidata 和 showtimes,它们在电影和剧集下各有自己的路径。
  • 外部 ID。 /3/find 可解析 imdb_id、tvdb_id、wikidata_id、kinopoisk_id、facebook_id、twitter_id 和 instagram_id。freebase_mid、freebase_id、tvrage_id、tiktok_id 和 youtube_id 这几个来源会被接受,但返回空数组。缺少或未知的 external_source 返回 400,status_code 为 22。
  • 按设计为空。 季的图片、视频和译文,以及公司的 description 始终为空。评论和剧集的 created_by 只对少数作品有内容。季和集的 external_ids 全部为 null。
  • 成人内容。 include_adult 会被忽略。成人影视作品和人物从不提供,请求时返回 404。
  • 图片。 CDN 路径为 https://img.amodb.dev/t/p/{size}/{file}。无需密钥,文件缓存 30 天。
  • 限制。 窗口是按密钥计算的 60 秒滑动窗口。响应头会显示剩余次数,缓存命中同样计数,因为限制检查先于缓存执行。
  • 独立性。 目录数据来自公开和开放的来源以及我们自己的补充整理。结构相同并不保证每部作品的每个字段取值都一致。

TMDB 更适合的场景

  • 符合条件的免费使用。 无需付费,这一点 amodb 无法比拟。
  • 写入。 给作品评分、创建列表和账户会话在 TMDB 上可用,在 amodb 上返回 405。
  • 变更动态。 TMDB 会列出发生变化的 ID,amodb 没有这类动态,你需要按自己的计划刷新。
  • 聚合演职员和单条演职员查询。 这两者在 amodb 上都返回 404。请在作品上使用 /credits。
  • 更广的语言需求。 如果你的界面需要这 14 种之外的语言,请先查看 TMDB。
  • 已有的审批。 已经通过法务审查接受 TMDB 的团队,应当权衡再做一次审查的成本。

迁移到 amodb

每个请求只需改一行。

Shell
# before: TMDB_BASE is your current TMDB v3 base URL
curl -s "$TMDB_BASE/movie/550?api_key=$TMDB_KEY"

# after
curl -s "https://api.amodb.dev/3/movie/550?api_key=$AMODB_KEY"

切换前,请并排对比几个响应的结构。下面的脚本会打印一侧返回而另一侧没有的顶层键。

JavaScript
async function topLevelKeys(base, key, path) {
  const res = await fetch(`${base}${path}?api_key=${key}`);
  if (!res.ok) throw new Error(`${path} returned ${res.status}`);
  return Object.keys(await res.json()).sort();
}

for (const path of ['/movie/550', '/tv/1396', '/person/31']) {
  const current = await topLevelKeys(process.env.TMDB_BASE, process.env.TMDB_KEY, path);
  const next = await topLevelKeys('https://api.amodb.dev/3', process.env.AMODB_KEY, path);
  const missing = current.filter((k) => !next.includes(k));
  console.log(path, missing.length ? `missing: ${missing.join(', ')}` : 'same keys');
}

对于某部作品,可选字段可能不同,因此请把缺失的键当作需要检查的线索,而不是结论。然后按下面的清单逐项处理:

  1. 在定价页选择套餐,然后在账户后台创建密钥。
  2. 把基础 URL 和密钥移入配置。
  3. 从 /3/configuration 读取 images.secure_base_url。
  4. 在代码中搜索写入调用,以及“不提供”表格中的路径。写入继续使用 TMDB,其余部分替换掉。
  5. 添加 429 处理,等待 Retry-After 秒。见速率限制和错误。

定价

amodb 采用预付方式。可选择 1、3、6、12 或 24 个月,分别享受 0、10、20、30 或 40% 的折扣,并在每分钟 20、40 或 120 个请求的三个套餐中选择一个。所有套餐返回的数据相同,也都不会自动续费。具体金额见定价。