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.

Atualizado em Ver em Markdown

Buscar um título por id do IMDb ou por nome

GET https://api.amodb.dev/omdb/ 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.

bashjspyphpgo
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ório
    Sua chave do amodb.
  • iconsultaum de i, t, s
    Id do IMDb do título: tt mais 7 a 9 dígitos, por exemplo tt0137523.
  • tconsultaum de i, t, s
    Título a buscar, retorna a melhor correspondência.
  • sconsultaum de i, t, s
    Texto de busca com pelo menos 3 letras, retorna uma lista.
  • typeconsulta
    movie ou series. episode não encontra nada.
  • yconsulta
    Ano de lançamento.
  • plotconsulta
    short ou full. Padrão short.
  • pageconsulta
    Página dos resultados da busca, de 1 a 100. Usado com s.
  • rconsulta
    Somente json. 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

CampoObservações
Title, Year, Rated, Released, RuntimeTexto. Released aparece como 15 Oct 1999.
Genre, Director, Writer, ActorsNomes separados por vírgulas.
Plot, Language, Country, AwardsTexto.
PosterEndereço em https://img.amodb.dev/t/p/w300/.
RatingsArray de objetos com Source e Value.
Metascore, imdbRating, imdbVotes, imdbIDTexto, incluindo a contagem de votos com vírgulas.
Typemovie ou series.
DVD, BoxOffice, Production, WebsiteSó filmes. BoxOffice traz um valor quando conhecido. DVD, Production e Website sempre aparecem como N/A.
totalSeasonsSó séries, como texto. As respostas de séries não têm DVD, BoxOffice, Production nem Website.
ResponseTrue 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

JSON
{
  "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
curl -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"
CampoObservações
SearchArray com até 10 itens com Title, Year, imdbID, Type, Poster.
totalResultsContagem de todas as correspondências, como string.
ResponseTrue ou False.
JSON
{
  "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","Error":"..."}. A maioria vem com HTTP 200, então leia Error e decida pelo texto, não só pelo status HTTP.

Texto de ErrorHTTPQuando
Movie not found!200Nenhum 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.200O valor de i não tem o formato de um id do IMDb.
Too many results.200O 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.200Nenhum entre i, t e s foi enviado.
Only r=json is supported.400r está definido com qualquer valor diferente de json.
No API key provided. ou Invalid API key!401A apikey está ausente ou incorreta.
Request limit reached!429Acima 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.

JavaScript
// 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, imdbRating e totalResults por conta própria e trate N/A como ausente.
  • Use plot=full só quando exibir a sinopse longa. short mantém as respostas menores.
  • Consultas por i ou t ficam em cache por mais tempo que buscas com s, 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 do poster_path no estilo TMDB e da lista de tamanhos em imagens.
  • Mantenha a chave em um servidor. Uma apikey na URL de uma página fica visível para todos os visitantes.