获取 14 种语言的电影数据

GET /3/movie/{movie_id}?language=ru-RU 以俄语返回片名、简介、宣传语和类型名。language 参数接受 ru-RU 或 pt-BR 这样的 TMDB 标签,适用于所有返回文本的接口。各语言的 ID 保持不变,因此数据库中的一行就能服务所有语言。

你用一个密钥得到 14 种语言、每部电影的 original_title、列出一部作品所有语言的译文接口,以及本地化的类型名。完整列表见语言页。

提供的 14 种语言

语言代码示例标签
英语enen-US
俄语ruru-RU
乌克兰语ukuk-UA
白俄罗斯语bebe-BY
中文zhzh-CN
葡萄牙语ptpt-BR
保加利亚语bgbg-BG
希伯来语hehe-IL
捷克语cscs-CZ
罗马尼亚语roro-RO
法语frfr-FR
波兰语plpl-PL
意大利语itit-IT
西班牙语eses-ES

任何其他标签都会回退到 en。日语和韩语不作为界面语言提供,但它们的原始片名仍会在电影的 original_title 和电视剧的 original_name 中返回。

可获取的数据

接口本地化内容
GET /3/movie/{movie_id}title、overview、tagline、类型名
GET /3/tv/{tv_id}name、overview、tagline、类型名
GET /3/tv/{tv_id}/season/{season_number}季和集的 name 与 overview
GET /3/person/{person_id}biography
GET /3/genre/movie/list用于筛选和菜单的类型名
GET /3/movie/{movie_id}/translations一个响应中包含一部作品的所有语言
GET /3/movie/{movie_id}/images按语言标记的海报,用 include_image_language 过滤
GET /3/movie/{movie_id}/videos按 iso_639_1 标记的视频,所有语言都在一个响应中

三步开始

  1. 在定价页选择套餐。语言数量不随套餐变化,变化的只有请求速率。
  2. 在账户后台创建密钥。
  3. 带上 language 标签调用任意接口,密钥以 api_key 或 Bearer 请求头发送。

请求示例

bash 示例用三种语言打印《搏击俱乐部》(ID 550)的片名,借助 jq 打印一个字段。PHP 示例请求白俄罗斯语,当简介为空时回退到英语。

bashphp
for lang in en-US ru-RU he-IL; do
  curl -s "https://api.amodb.dev/3/movie/550?language=$lang" \
    -H "Authorization: Bearer $AMODB_KEY" | jq -r '.title'
done
<?php
function amodb(string $path, array $query = []): array
{
    $url = 'https://api.amodb.dev/3' . $path . '?' . http_build_query($query);
    $ch = curl_init($url);
    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);
}

function localizedMovie(int $id, string $lang): array
{
    $movie = amodb("/movie/$id", ['language' => $lang]);
    $movie['text_language'] = $lang;
    if (trim($movie['overview'] ?? '') === '') {
        $fallback = amodb("/movie/$id", ['language' => 'en-US']);
        $movie['overview'] = $fallback['overview'] ?? '';
        $movie['text_language'] = 'en-US';
    }
    return $movie;
}

$movie = localizedMovie(550, 'be-BY');
echo $movie['title'], ' (', $movie['original_title'], ')', PHP_EOL;
echo '[', $movie['text_language'], '] ', $movie['overview'], PHP_EOL;

language=ru-RU 的响应,只保留了几个字段。PHP 示例中的键 text_language 是你的代码添加的,不是 API 返回的。

JSON
{
  "genres": [
    {
      "id": 18,
      "name": "драма"
    },
    {
      "id": 53,
      "name": "триллер"
    }
  ],
  "id": 550,
  "original_language": "en",
  "original_title": "Fight Club",
  "overview": "Сотрудник страховой компании страдает хронической бессонницей и отчаянно пытается вырваться из мучительно скучной жизни. Однажды в очередной командировке он...",
  "poster_path": "/66RvLrRJTm4J8l3uHXWF09AICol.jpg",
  "tagline": "«Интриги. Хаос. Мыло»",
  "title": "Бойцовский клуб"
}

字段为空时的回退

并非每部作品在每种语言下都有文本。没有译文时 overview 可能为空,title 或 tagline 也可能以英文返回。API 不会编造文本。请使用固定的顺序,让页面始终有内容可显示:

  1. 请求你要显示的语言。
  2. 如果某个字段为空,就用 en-US 再请求同一个 ID,或从译文列表中读取英文条目。
  3. 如果片名为空,显示 original_title。
  4. 记录每个字段来自哪种语言,以便以后重试。

边缘缓存为每个已缓存的路径保存每种语言各一份,所以热门作品的英文回退通常直接来自缓存。

列出一部作品的所有译文

GET /3/movie/{movie_id}/translations 返回一个 translations 数组,为每种有数据的语言提供一项。列表可能比提供的 14 种语言更长:《搏击俱乐部》有 50 项。可用它构建语言切换器,或把一部作品的所有文本存入一行。

字段含义
iso_639_1、iso_3166_1语言和国家代码
english_name语言的英文名称
data.title(电影)或 data.name(电视剧)、data.overview、data.tagline本地化文本,片名可能为空
data.homepage、data.runtime该译文的可选值

电视剧和单集有同样的接口。电视剧条目带有 data.name,没有 runtime,单集条目只带有 name 和 overview。季返回空列表,人物和系列合集没有译文接口。详情见译文。当你想一次获得所有语言时,一次译文调用可取代最多 14 次详情调用。

按语言获取海报和视频

图片和视频在 iso_639_1 中带有各自的语言标签。在图片接口上,传入逗号分隔的列表,并为没有语言的项目(例如不含文字的海报)加上 null。响应包含匹配的项目,所以请在代码中对它们排序。

参数用于示例
include_image_language图片接口ru,en,null

视频接口会在一个响应中返回所有语言,并忽略 include_video_language,所以请自己按 iso_639_1 过滤。尺寸和 CDN 见图片。

希伯来语与从右到左的文本

希伯来语是这 14 种语言中唯一从右到左的语言。请在页面中处理,而不是在数据中处理:

  • 在容纳文本的元素上设置 lang="he" 和 dir="rtl"。
  • 把希伯来语文本中的拉丁字母片名包在 <bdi> 元素里,避免标点跳到错误的一侧。
  • 使用 margin-inline-start 这类逻辑 CSS 属性,而不是 left 和 right。

对比

能力自己抓取页面仅英文数据集amodb
语言每个请求一个站点区域设置英语通过 language 支持 14 种语言
跨语言的同一 ID每个区域设置的 URL 不同不适用各处都是同一个数字 ID
一部作品的所有译文逐个抓取各区域设置的页面不适用一次 translations 调用
本地化海报各区域设置各自的图片 URL请查阅其文档include_image_language 过滤
原始片名从页面文本解析请查阅其文档original_title、original_name

定价

所有套餐的语言集合相同,所以你只需为速率和周期付费。可预付 1、3、6、12 或 24 个月,较长的周期分别享受 0、10、20、30 或 40% 的折扣,不会自动续费。每分钟 20、40 和 120 个请求的套餐都包含所有语言和所有接口。一个支持五种语言的网站,每部作品最多需要五次详情调用,重复请求会在边缘缓存中命中 6 小时。没有免费额度。见定价。