Uma API de filmes que fala TMDB v3 e OMDb
O amodb é uma API de filmes independente. Ela fala o mesmo protocolo do TMDB v3 e do OMDb, então um cliente escrito para qualquer um dos dois funciona depois que você troca a URL base para https:/ (ou https:/ para chamadas no estilo OMDb). Você encontra um filme com /search/movie e depois o lê com /movie/{movie_id} e append_to_response.
O que você recebe:
- JSON no formato do TMDB v3, com os mesmos caminhos e parâmetros de consulta.
- Títulos e sinopses em 14 idiomas, selecionados com
language. - Elenco, equipe técnica, trailers, palavras-chave, imagens e datas de lançamento por meio de
append_to_response. - Avaliações do IMDb, Kinopoisk, Metacritic, Rotten Tomatoes e TMDB, quando conhecidas.
- Pôsteres de
https:/, sem chave./ img.amodb.dev/ t/ p/ {size}/ {file}
Quais dados você recebe
| Você precisa de | Chamada | Observações |
|---|---|---|
| Encontrar um filme pelo título | GET / | Paginado, até 20 resultados por página, cache de borda de 10 minutos. Veja busca. |
| O registro principal | GET / | Títulos, sinopse, duração, gêneros, data de lançamento. Veja filmes. |
| Elenco e equipe técnica | append_ | Os campos estão descritos em créditos. |
| Trailers | append_ | Retorna o array results com key, site e type. |
| Notas | append_ | Cinco fontes, cada uma { value, votes } ou null. Veja avaliações. |
| Uma resposta no estilo OMDb | GET /omdb/?t=Inception | Mesmos campos de corpo do OMDb. Veja endpoint OMDb. |
Comece em 3 passos
- Escolha um plano em preços. Os planos diferem apenas no limite: 20, 40 ou 120 requisições por minuto.
- Crie uma chave no painel da sua conta. Uma chave tem 32 caracteres hexadecimais minúsculos.
- Chame o endpoint com a chave no parâmetro
api_keyou em um cabeçalhoAuthorization: Bearer. Veja autenticação.
Exemplo de requisição
O exemplo encontra Inception pelo título, pega o primeiro resultado e lê o filme com elenco, trailers e avaliações em mais uma chamada. São duas requisições no total.
# 1. find the id
curl -s "https://api.amodb.dev/3/search/movie?query=inception&language=en-US" \
-H "Authorization: Bearer $AMODB_KEY"
# 2. read the movie with extras
curl -s "https://api.amodb.dev/3/movie/27205?language=en-US&append_to_response=credits,videos,ratings" \
-H "Authorization: Bearer $AMODB_KEY"const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
async function get(path, params) {
const res = await fetch(`${base}${path}?${new URLSearchParams(params)}`, { headers });
if (res.status === 429) {
throw new Error(`Over the limit, retry in ${res.headers.get('Retry-After')} s`);
}
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
return res.json();
}
const found = await get('/search/movie', { query: 'inception', language: 'en-US' });
if (!found.results.length) throw new Error('No match');
const movie = await get(`/movie/${found.results[0].id}`, {
language: 'en-US',
append_to_response: 'credits,videos,ratings',
});
const director = movie.credits.crew.find((c) => c.job === 'Director');
console.log(movie.title, movie.release_date, movie.runtime, director?.name);
console.log('IMDb', movie.ratings.imdb?.value);A resposta reduzida. Só alguns campos do registro do filme foram mantidos, credits foi cortado para um membro do elenco e o diretor, e o bloco videos foi omitido.
{
"genres": [
{
"id": 12,
"name": "Adventure"
},
{
"id": 28,
"name": "Action"
},
{
"id": 80,
"name": "Crime"
}
],
"id": 27205,
"imdb_id": "tt1375666",
"poster_path": "/xlaY2zyzMfkhk0HSC5VUwzoZPU1.jpg",
"release_date": "2010-07-15",
"runtime": 148,
"title": "Inception",
"credits": {
"cast": [
{
"adult": false,
"gender": 2,
"id": 6193,
"known_for_department": "Acting",
"name": "Leonardo DiCaprio",
"original_name": "Leonardo DiCaprio",
"popularity": 9.3213,
"profile_path": "/wo2hJpn04vbtmh0B9utCFdsQhxM.jpg",
"character": "Dom Cobb",
"credit_id": "52fe4534c3a368484e04de03",
"order": 0
}
],
"crew": [
{
"adult": false,
"gender": 2,
"id": 525,
"known_for_department": "Directing",
"name": "Christopher Nolan",
"original_name": "Christopher Nolan",
"popularity": 8.578,
"profile_path": "/xuAIuYSmsUzKlUMBFGVZaWsY3DZ.jpg",
"credit_id": "5e83ac2ee33f830018359a00",
"department": "Directing",
"job": "Director"
}
]
},
"ratings": {
"imdb": {
"value": 8.8,
"votes": 2877173
},
"kinopoisk": {
"value": 8.7,
"votes": null
},
"metacritic": {
"value": 74,
"votes": null
},
"rotten_tomatoes": {
"value": 86,
"votes": null
},
"tmdb": {
"value": 8.373,
"votes": 40457
}
}
}Formas de encontrar um filme
Escolha a chamada que corresponde ao que você já tem.
| Você começa com | Chamada | Resultado |
|---|---|---|
| Um título digitado por um usuário | GET / | Array results com id, title, release_date, poster_path |
Um ID do IMDb como tt0133093 | GET / | Array movie_results |
Um ID numérico de filme como 603 | GET /3/movie/603 | O registro completo |
| Um cliente OMDb existente | GET /omdb/?i=tt0133093 | Corpo OMDb com Title, Year, Ratings |
Guarde os dois IDs. O id numérico é a chave de todas as outras chamadas, e imdb_id liga seus dados a outros sistemas. As regras de consulta estão em busca por ID externo.
Campos vazios e consultas que falham
Dados reais de filmes têm lacunas, então escreva o código de exibição pensando nelas. Uma busca sem resultado não é um erro: ela retorna HTTP 200 com um array results vazio. Um ID desconhecido é um erro.
| Caso | O que você vê | O que fazer |
|---|---|---|
| Busca sem resultado | 200 e "results": [] | Mostre «sem correspondência», não tente de novo |
| ID de filme desconhecido | 404 com status_code 34 | Remova o ID da sua lista |
| Chave ausente ou errada | 401 com status_code 7 | Pare e corrija a chave |
overview vazio | Uma string vazia | Peça de novo com language=en-US |
| Nota desconhecida | null dentro de ratings | Oculte esse selo |
| Sem data de lançamento | release_date vazio | Coloque o título por último |
A lista completa de erros está em erros.
Como ficar dentro do limite de requisições
Uma busca e uma chamada de detalhes custam uma requisição cada. Com 20 requisições por minuto são dez consultas de título por minuto, com 120 requisições por minuto são sessenta. Um acerto no cache de borda também conta, porque a verificação da chave e o limite de requisições rodam antes do cache. Mantenha um cache próprio para consultas repetidas e leia X-RateLimit-Remaining para ver quanto do minuto resta. Ao receber um 429, aguarde os segundos indicados em Retry-After. Os limites de cada plano estão em limites de requisições.
Como se compara
| Recurso | Scraping das páginas você mesmo | API de metadados com plano gratuito | amodb |
|---|---|---|---|
| Formato da resposta | HTML que você precisa analisar | JSON | JSON no formato do TMDB v3 |
| Estabilidade do esquema | Quebra quando o markup da página muda | Definida pelo provedor | Caminhos e campos fixos, novos campos podem aparecer |
| Termos de acesso | Valem os termos de cada site | Plano gratuito com termos de uso, confira-os | Pago, pré-pago, sem plano gratuito |
| Limite de requisições | Nada em que se possa confiar | Definido pelo provedor | 20, 40 ou 120 requisições por minuto por chave |
| Avaliações de várias fontes | Um scraper por site | Varia, consulte a documentação | ratings na mesma chamada, null quando desconhecida |
| Idiomas | O que cada página oferecer | Varia | 14, escolhidos com language |
| Reuso de clientes TMDB v3 e OMDb | Não | Só se usar o mesmo protocolo | Sim, troque a URL base |
Preços
O acesso é pré-pago por 1, 3, 6, 12 ou 24 meses, com 0, 10, 20, 30 e 40 por cento de desconto nos períodos mais longos. Não há renovação automática nem plano gratuito. Todos os planos recebem todos os dados, e os planos diferem apenas no limite: 20, 40 ou 120 requisições por minuto. Escolha um em preços e faça sua primeira chamada em poucos minutos.