按调用形态来选
如果你只想要每部作品一条小记录,而且免费密钥够用,就选 OMDb。如果用量超出范围,或者希望在同一个密钥下把 OMDb 风格的请求与演职员、图片和译文放在一起,就选 amodb。OMDb 返回 JSON 或 XML,使用 apikey 参数,免费密钥每日请求上限为 1,000 次(请以其网站为准),另有付费支持者层级。amodb 只有付费方案,既响应 OMDb 的主要参数,也提供 TMDB v3。
保持不变的部分
OMDb 接口位于 https:/,末尾的斜杠可省略。下面这些元素,你现有的解析代码应该不需要修改。
| OMDb 元素 | 在 amodb 上 |
|---|---|
apikey | 同一个参数,填入你的 amodb 密钥 |
i 和 t | 按 IMDb ID 或按片名查找 |
s 和 page | 搜索,每页 10 条结果并带 totalResults 计数,page 最大 100 |
type 和 y | 按 movie 或 series 以及年份筛选 |
plot | short 或 full |
r | 只接受 json |
| 响应体字段 | 与 OMDb 命名一致,从 Title 到 Response |
Ratings | 由 Source 和 Value 组成的数组,包含 Internet Movie Database、Rotten Tomatoes 和 Metacritic(存在时) |
| 错误 | {"Response":"False",,措辞与 OMDb 相同,HTTP 状态为 200 |
不会沿用的部分
- XML。 带有
r=xml的请求返回 400 和{"Response":"False",。"Error":"Only r= json is supported."} - 季和集。
Season和Episode会被忽略,type=episode查不到任何内容。带有i=tt0903747&Season=1的请求返回剧集记录,而不是某一季。剧集请使用/3/tv/{id}/season/{n}。 - 其他参数。
callback会被忽略。 - 没有数据的字段。
DVD、Production和Website始终为"N/A"。剧集记录带有totalSeasons,不包含DVD、BoxOffice、Production和Website。 - 海报。
Poster字段指向https:/,而不是别的主机。把/ img.amodb.dev/ t/ p/ w300/ ... w300换成w780即可从同一路径获得更大的图片,图片无需密钥。
完整的参数和错误列表见 OMDb 接口页面。
示例响应
带有 t=Fight Club 的请求返回一个扁平对象。下面的响应是真实的,只缩短了 Plot 文本。
{
"Title": "Fight Club",
"Year": "1999",
"Rated": "R",
"Released": "15 Oct 1999",
"Runtime": "139 min",
"Genre": "Crime, Drama, Thriller",
"Director": "David Fincher",
"Writer": "Chuck Palahniuk, Jim Uhls",
"Actors": "Brad Pitt, Edward Norton, Meat Loaf",
"Plot": "A nameless first-person narrator attends support groups in an attempt to subdue his emotional state an...",
"Language": "English",
"Country": "United States, Germany",
"Awards": "Nominated for 1 Oscar. 12 wins & 38 nominations total",
"Poster": "https://img.amodb.dev/t/p/w300/qkrH7rjYKU4KOwwIl6wF6H3ISvm.jpg",
"Ratings": [
{
"Source": "Internet Movie Database",
"Value": "8.8/10"
},
{
"Source": "Rotten Tomatoes",
"Value": "81%"
},
{
"Source": "Metacritic",
"Value": "67/100"
}
],
"Metascore": "67",
"imdbRating": "8.8",
"imdbVotes": "2,669,989",
"imdbID": "tt0137523",
"Type": "movie",
"DVD": "N/A",
"BoxOffice": "$38,003,039",
"Production": "N/A",
"Website": "N/A",
"Response": "True"
}和 OMDb 一样,值都是字符串,因此 imdbRating、imdbVotes 和 Runtime 需要你自己解析。无论读取多少字段,每次调用都只计为一次请求,计入你的每分钟限制。
功能对比
| 功能 | OMDb | amodb |
|---|---|---|
| 定价模式 | 免费密钥加付费支持者层级,请查看其网站 | 预付,1 至 24 个月 |
| 免费额度 | 免费密钥每日上限 1,000 次,请查看其网站 | 无,也没有试用 |
| 认证方式 | apikey 参数 | /omdb/ 用 apikey,/3 用 api_key 或 Bearer |
| 响应格式 | JSON 或 XML | JSON |
| 语言 | 请查阅其文档 | /3 路径支持 14 种界面语言 |
| 电影 | 支持 | 支持 |
| 电视剧 | 剧集和单集,字段请查阅其文档 | /omdb/ 提供剧集记录,/3 路径提供季和集 |
| 人物 | 每条记录中的姓名文本 | /3 路径提供资料、作品列表和图片 |
| 图片 | 每条记录中的海报链接 | 海报链接加图片列表,img.amodb.dev |
| 评分 | Ratings、Metascore 和 imdbRating 字段 | 相同字段,/3 路径另有 ratings 对象 |
| 速率限制 | 免费密钥有每日上限,请查看其网站 | 每个密钥每分钟 20、40 或 120 次 |
| 商业使用 | 请查看其网站 | 作为付费 API 出售,见定价 |
| 兼容性 | 定义了 OMDb 协议 | 上述 OMDb 参数,以及 TMDB v3 读取接口 |
amodb 的不同之处
- 按分钟限速。 套餐允许在 60 秒滑动窗口内每分钟 20、40 或 120 个请求。带密钥的每次响应都有
X-RateLimit-Remaining,批处理任务可以在遇到 429 之前自行放慢。 - 从单条记录向上扩展。 OMDb 的记录里,演员表是一段文本。使用
/3路径,你可以一次调用同时获取同一作品的演职员、视频和译文,并且imdbID可通过/3/find找到该记录。 - 更大的图片。 OMDb 风格的记录只给一个海报链接。图片主机提供十种尺寸标识,从
w92到original。 - 更多评分来源。
/3/movie/{id}/ratings扩展在已知时增加 Kinopoisk、Metacritic、Rotten Tomatoes 和 TMDB 的数值。
OMDb 更适合的场景
- 小型或免费项目。 每日上限 1,000 次的免费密钥足以支撑原型或爱好者网站,而 amodb 没有免费额度。
- 需要 XML 的使用方。 如果旧系统解析 XML,OMDb 支持而 amodb 不支持。
- 季和集的查询。 amodb 的
/omdb/路由没有季或集模式,基于它构建的客户端需要改用/3路径。 - 简单。 一个接口加少量参数,很容易上手。如果你只需要这些,迁移的收益不大。
迁移到 amodb
只需更换基础 URL 和密钥。请先在代码中搜索 r=xml、Season、Episode 和 type=episode,其余请求保持原样。
const OMDB_BASE = process.env.OMDB_BASE_URL; // before: your current OMDb base URL
const AMODB_BASE = 'https://api.amodb.dev/omdb/'; // after
async function lookup(title) {
const url = new URL(AMODB_BASE);
url.searchParams.set('apikey', process.env.AMODB_KEY);
url.searchParams.set('t', title);
url.searchParams.set('plot', 'short');
const res = await fetch(url);
const data = await res.json();
if (data.Response === 'False') throw new Error(data.Error);
return data;
}
const movie = await lookup('Fight Club');
console.log(movie.Title, movie.Year, movie.imdbRating, movie.Poster);和使用 OMDb 时一样,继续检查 Response 字段。当值为字符串 "False" 时,Error 字段包含错误信息。对于剧集,用 /3/find 把 imdbID 映射一次,再从 /3 一侧读取各季:
curl -s "https://api.amodb.dev/3/find/tt0903747?external_source=imdb_id&api_key=$AMODB_KEY"
curl -s "https://api.amodb.dev/3/tv/1396/season/1?api_key=$AMODB_KEY"定价
amodb 是付费的,只有在你再购买一个周期时才会续期。三个套餐只在速率上不同,分别为每分钟 20、40 或 120 个请求,且都返回全部数据。周期为 1、3、6、12 或 24 个月,较长的周期可享受 10% 至 40% 的折扣。当前金额请查看定价。