获取一部电影的官方预告片

GET /3/movie/{movie_id}/videos 返回关联到一部电影的所有视频。每一项都有 type、official 标记、语言代码、published_at 时间戳,以及标识视频的 site 和 key。保留 type 为 Trailer 且 official 为 true 的条目,就得到了预告片。

你得到的是一份可以自行排序的视频记录列表,而不是视频流。响应给出视频名称及其所在位置,你的页面再根据 site 和 key 构建播放器。电视剧返回同样的结构。季和单集路径返回空列表。

可获取的数据

接口返回内容
GET /3/movie/{movie_id}/videos一部电影的预告片、先导片、片段、花絮、幕后和 NG 镜头
GET /3/tv/{tv_id}/videos一部剧集的同类列表
GET /3/tv/{tv_id}/season/{season_number}/videos始终返回空的 results 列表
GET /3/tv/{tv_id}/season/{season_number}/episode/{episode_number}/videos始终返回空的 results 列表
GET /3/movie/{movie_id},配合 append_to_response=videos一次请求获取详情和视频

每个视频的字段:

字段类型用途
typestring视频种类:Trailer、Teaser、Clip、Featurette、Behind the Scenes 或 Bloopers,与视频页相同
officialboolean视频被标记为官方时为 true
iso_639_1、iso_3166_1string视频的语言和国家代码
key、sitestring视频的标识符和托管网站的名称,目前所见每个视频都是 YouTube
sizeinteger垂直分辨率,目前所见每个视频都是 1080
published_atstringISO 8601 时间戳,适合按最新优先排序
name、idstring视频标题及其 ID,该 ID 与 key 是同一个字符串

三步开始

  1. 在定价页选择套餐。每个套餐返回全部数据,所以按每分钟请求数来选。
  2. 在账户后台创建密钥。它是 32 位小写十六进制字符。
  3. 调用 GET /3/movie/{movie_id}/videos,密钥放在 api_key 或 Authorization: Bearer 请求头中。

请求示例

示例请求《盗梦空间》(ID 27205)的视频,在代码中排序,并打印最佳的一个。排序规则是:先看语言是否匹配,再 Trailer 优先于 Teaser,再官方优先于非官方,最后取最新的 published_at。

bashjs
curl -s "https://api.amodb.dev/3/movie/27205/videos" \
  -H "Authorization: Bearer $AMODB_KEY"
const BASE = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
const TYPE_RANK = { Trailer: 0, Teaser: 2 };

function rank(video, lang) {
  const language = video.iso_639_1 === lang ? 0 : 10;
  const type = TYPE_RANK[video.type] ?? 4;
  return language + type + (video.official ? 0 : 1);
}

async function pickTrailer(movieId, lang = 'en') {
  const res = await fetch(`${BASE}/movie/${movieId}/videos`, { headers });
  if (!res.ok) throw new Error(`amodb returned ${res.status}`);
  const { results } = await res.json();
  results.sort(
    (a, b) => rank(a, lang) - rank(b, lang) || (b.published_at || '').localeCompare(a.published_at || ''),
  );
  return results[0] ?? null;
}

const trailer = await pickTrailer(27205, 'en');
console.log(trailer ? `${trailer.name}: ${trailer.site} ${trailer.key}` : 'no video found');

精简响应:42 个视频中的前 2 个。列表包含所有语言。

JSON
{
  "id": 27205,
  "results": [
    {
      "iso_639_1": "en",
      "iso_3166_1": "US",
      "name": "The Dream Sequence",
      "key": "mpj9dL7swwk",
      "site": "YouTube",
      "size": 1080,
      "type": "Clip",
      "official": true,
      "published_at": "2022-03-09T01:00:20Z",
      "id": "mpj9dL7swwk"
    },
    {
      "iso_639_1": "en",
      "iso_3166_1": "US",
      "name": "35mm Theatrical Trailer #3",
      "key": "cdx31ak4KbQ",
      "site": "YouTube",
      "size": 1080,
      "type": "Trailer",
      "official": false,
      "published_at": "2022-03-07T06:00:19Z",
      "id": "cdx31ak4KbQ"
    }
  ]
}

选择要播放的视频

一部作品常常有多个官方预告片(首发和最终版),旁边还有先导片和片段。请用固定顺序对它们排序,避免预告片位置上出现 NG 镜头集锦。

优先级筛选典型用途
1Trailer,官方,语言匹配要播放的视频
2Trailer,非官方没有官方版本时的地区版或粉丝上传
3Teaser,官方上映前的短片
4Clip、Featurette兜底,避免该位置为空
跳过Behind the Scenes、Bloopers放在单独的附加内容列表中

并列时按 published_at 排序。最新优先得到最近的版本,最早优先得到首次发布的版本。

预告片语言

视频通过 iso_639_1 标记语言,一部作品可以有多种语言的预告片。《盗梦空间》有 9 种语言的 42 个视频。amodb 在一个响应中全部返回。language 和 include_video_language 参数对视频接口没有作用,所以请在代码中选择语言。

步骤怎么做
1保留 iso_639_1 与你的用户匹配的视频,例如 ru
2如果都不匹配,保留 en
3如果仍不匹配,保留其余的

每一步内部像示例中那样,按类型和 official 标记排序。视频语言取决于上传,而不是语言页列出的 14 种界面语言,所以预告片可能是 cs 或 he。

剧集预告片

剧集预告片位于 /3/tv/1396/videos(《绝命毒师》),其中有 9 个预告片。上面的排序函数无需修改即可使用,因为字段没有变化。像 /3/tv/1396/season/1/videos 这样的季和单集路径返回 200 和空的 results 列表,所以请读取剧集的列表。完整的路径列表见视频与预告片。

构建预告片栏

“正在上映”影片的预告片栏需要一次列表调用外加每部作品一次调用:GET /3/movie/now_playing(见热门趋势与列表)加十次视频调用,十部作品共 11 个请求。请把选中的 key 与电影 ID 一起保存。预告片很少变化,所以每隔几小时或作品重新上映时刷新一次已保存的选择。

对比

能力自己抓取页面免费层元数据 APIamodb
官方标记从页面标题猜测请查阅其文档每个视频上的 official 布尔值
视频类型筛选解析文本请查阅其文档六种 type 取值
语言选择每个页面一种区域设置请查阅其文档每个视频上的 iso_639_1 和 iso_3166_1,在你的代码中过滤
剧集与单集需要爬取的独立页面请查阅其文档剧集使用同一接口,季和单集列表为空
维护标记变化就会失效取决于提供方一种稳定的 JSON 结构
条款风险由你承担请查看其条款付费套餐,见定价

定价

套餐为预付方式。可购买 1、3、6、12 或 24 个月,较长的周期分别享受 0、10、20、30 或 40% 的折扣。不会自动续费。每分钟 20、40 和 120 个请求的套餐都提供本页的所有接口,所以繁忙的预告片栏只取决于速率。没有免费额度,也没有试用。请在定价页比较套餐。