Endpoint compatível com OMDb
GET https://api.amodb.dev/omdb/ responde a requisições no estilo OMDb com os mesmos nomes de parâmetros e campos. Busque um título pelo id do IMDb com i ou pelo nome com t, ou pesquise com s. Os links de pôster apontam para img.amodb.dev. Só r=json, filmes e séries são atendidos. Troque a URL base e a chave, e seu cliente continua funcionando.
Buscar um título por id do IMDb ou por nome
GET https:/ retorna um título como JSON plano com os nomes de campo do OMDb. Envie i para um id do IMDb como tt0137523, ou t para um título. A autenticação é o parâmetro de consulta apikey. A resposta tem Response igual a True em caso de sucesso e False em caso de falha.
O exemplo carrega Fight Club pelo id do IMDb e para com o texto de erro do OMDb quando Response é False.
curl -sf "https://api.amodb.dev/omdb/?i=tt0137523&plot=short&apikey=$AMODB_KEY"const params = new URLSearchParams({ i: 'tt0137523', plot: 'short', apikey: process.env.AMODB_KEY });
const res = await fetch(`https://api.amodb.dev/omdb/?${params}`);
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const data = await res.json();
if (data.Response === 'False') throw new Error(data.Error);
console.log(data.Title, data.Year, data.imdbRating);import os
import requests
r = requests.get(
"https://api.amodb.dev/omdb/",
params={"i": "tt0137523", "plot": "short", "apikey": os.environ["AMODB_KEY"]},
timeout=10,
)
r.raise_for_status()
data = r.json()
if data["Response"] == "False":
raise SystemExit(data["Error"])
print(data["Title"], data["Year"], data["imdbRating"])<?php
$query = http_build_query(['i' => 'tt0137523', 'plot' => 'short', 'apikey' => getenv('AMODB_KEY')]);
$ch = curl_init('https://api.amodb.dev/omdb/?' . $query);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("amodb returned $status");
}
$data = json_decode($body, true);
if ($data['Response'] === 'False') {
throw new RuntimeException($data['Error']);
}
echo $data['Title'], ' ', $data['Year'], ' ', $data['imdbRating'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"
)
type Title struct {
Title string `json:"Title"`
Year string `json:"Year"`
ImdbRating string `json:"imdbRating"`
Response string `json:"Response"`
Error string `json:"Error"`
}
func main() {
q := url.Values{"i": {"tt0137523"}, "plot": {"short"}, "apikey": {os.Getenv("AMODB_KEY")}}
client := &http.Client{Timeout: 10 * time.Second}
res, err := client.Get("https://api.amodb.dev/omdb/?" + q.Encode())
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var t Title
if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
panic(err)
}
if t.Response == "False" {
panic(t.Error)
}
fmt.Println(t.Title, t.Year, t.ImdbRating)
}Parâmetros
apikeyconsultaobrigatórioSua chave do amodb.iconsultaum dei,t,sId do IMDb do título:ttmais 7 a 9 dígitos, por exemplott0137523.tconsultaum dei,t,sTítulo a buscar, retorna a melhor correspondência.sconsultaum dei,t,sTexto de busca com pelo menos 3 letras, retorna uma lista.typeconsultamovieouseries.episodenão encontra nada.yconsultaAno de lançamento.plotconsultashortoufull. Padrãoshort.pageconsultaPágina dos resultados da busca, de 1 a 100. Usado coms.rconsultaSomentejson. Qualquer outro valor retorna HTTP 400.
Os parâmetros Season, Episode, callback e v da API OMDb original não são suportados e são ignorados.
Campos da resposta
| Campo | Observações |
|---|---|
Title, Year, Rated, Released, Runtime | Texto. Released aparece como 15 Oct 1999. |
Genre, Director, Writer, Actors | Nomes separados por vírgulas. |
Plot, Language, Country, Awards | Texto. |
Poster | Endereço em https:/. |
Ratings | Array de objetos com Source e Value. |
Metascore, imdbRating, imdbVotes, imdbID | Texto, incluindo a contagem de votos com vírgulas. |
Type | movie ou series. |
DVD, BoxOffice, Production, Website | Só filmes. BoxOffice traz um valor quando conhecido. DVD, Production e Website sempre aparecem como N/A. |
totalSeasons | Só séries, como texto. As respostas de séries não têm DVD, BoxOffice, Production nem Website. |
Response | True ou False, sempre uma string. |
Os campos seguem o OMDb, então um parser OMDb existente não precisa de mudança além da URL base.
Exemplo de resposta
{
"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 and relieve his insomniac state.",
"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"
}Para uma série como The Wire (i=tt0306414), a resposta termina com "Type": "series", "totalSeasons": "5" e "Response": "True".
Pesquisar com s
Envie s para obter uma lista em vez de um título. Cada página tem 10 itens, e totalResults dá a contagem total como string. Peça page=2 para os itens 11 a 20 e continue até ter lido totalResults itens. Uma página além da última responde Movie not found!.
curl -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"| Campo | Observações |
|---|---|
Search | Array com até 10 itens com Title, Year, imdbID, Type, Poster. |
totalResults | Contagem de todas as correspondências, como string. |
Response | True ou False. |
{
"Search": [
{
"Title": "The Matrix",
"Year": "1999",
"imdbID": "tt0133093",
"Type": "movie",
"Poster": "https://img.amodb.dev/t/p/w300/kEDbym5htJgDQNenjUtSJxAHysB.jpg"
},
{
"Title": "The Matrix Reloaded",
"Year": "2003",
"imdbID": "tt0234215",
"Type": "movie",
"Poster": "https://img.amodb.dev/t/p/w300/d0xVNNxIYxId2qHkqpgE39soOvD.jpg"
}
],
"totalResults": "20",
"Response": "True"
}A lista foi cortada para 2 de 10 itens.
Ler o array Ratings
Ratings contém um objeto por fonte, cada um com Source e Value, e o Value é um texto como 8.8/10. As fontes são Internet Movie Database, Rotten Tomatoes e Metacritic, e só aparecem as conhecidas para o título. Os campos planos imdbRating, imdbVotes e Metascore repetem parte dos mesmos dados. Divida Value pela barra se precisar de um número. Para números tipados e para as notas do Kinopoisk e do TMDB, use o endpoint de avaliações.
Erros
Falhas de consulta retornam {"Response":"False",. A maioria vem com HTTP 200, então leia Error e decida pelo texto, não só pelo status HTTP.
Texto de Error | HTTP | Quando |
|---|---|---|
Movie not found! | 200 | Nenhum título corresponde a t, o valor de i é válido mas desconhecido, ou uma página de busca passou da última. |
Incorrect IMDb ID. | 200 | O valor de i não tem o formato de um id do IMDb. |
Too many results. | 200 | O texto de busca tem menos de 3 letras ou corresponde a títulos demais. Alongue o texto ou adicione type ou y. |
Something went wrong. | 200 | Nenhum entre i, t e s foi enviado. |
Only r= | 400 | r está definido com qualquer valor diferente de json. |
No API key provided. ou Invalid API key! | 401 | A apikey está ausente ou incorreta. |
Request limit reached! | 429 | Acima do seu limite de requisições por minuto. Espere os segundos indicados em Retry-After. |
Um plano encerrado responde HTTP 402. Veja erros e limites de requisições.
Migrar um cliente OMDb
A migração são duas edições: a URL base e a chave. Nada mais na requisição muda.
// Before: the base URL and key of your current OMDb setup.
// After:
const OMDB_BASE = 'https://api.amodb.dev/omdb/';
const OMDB_KEY = process.env.AMODB_KEY;Remova r=xml se você o envia. Um cliente que lê episódios, Season ou callback precisa de outra fonte para essas partes. O limite é por chave, então chamadas no estilo OMDb e chamadas no estilo TMDB compartilham um único orçamento de 20, 40 ou 120 requisições por minuto.
Notas práticas
- Trate todo valor como texto. Converta
Year,imdbRatingetotalResultspor conta própria e trateN/Acomo ausente. - Use
plot=fullsó quando exibir a sinopse longa.shortmantém as respostas menores. - Consultas por
ioutficam em cache por mais tempo que buscas coms, então uma consulta repetida retorna a resposta armazenada. - Para obter um id do TMDB a partir de um id do IMDb, chame buscar por ID externo.
- Os pôsteres estão em
w300. Para outros tamanhos, monte o endereço a partir doposter_pathno estilo TMDB e da lista de tamanhos em imagens. - Mantenha a chave em um servidor. Uma
apikeyna URL de uma página fica visível para todos os visitantes.