Endpoint compatible con OMDb

GET https://api.amodb.dev/omdb/ responde solicitudes al estilo de OMDb con los mismos nombres de parámetros y campos. Busca un título por id de IMDb con i o por título con t, o explora con s. Los pósteres apuntan a img.amodb.dev. Solo se sirven r=json, películas y series. Cambia la URL base y la clave, y un cliente típico sigue funcionando.

Actualizado el Ver en Markdown

Buscar un título por id de IMDb o por título

GET https://api.amodb.dev/omdb/ devuelve un título como JSON plano con los nombres de campo de OMDb. Pasa i para un id de IMDb como tt0137523, o t para un título. La autenticación es el parámetro de consulta apikey. La respuesta trae Response en True si salió bien y en False si falló.

El ejemplo carga Fight Club por id de IMDb y se detiene con el texto de error de OMDb cuando Response es 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

  • apikeyconsultaobligatorio
    Tu clave de amodb.
  • iconsultauno de i, t, s
    Id de IMDb del título: tt más 7 a 9 dígitos, por ejemplo tt0137523.
  • tconsultauno de i, t, s
    Título que buscar, devuelve la mejor coincidencia.
  • sconsultauno de i, t, s
    Texto de búsqueda de al menos 3 letras, devuelve una lista.
  • typeconsulta
    movie o series. episode no encuentra nada.
  • yconsulta
    Año de estreno.
  • plotconsulta
    short o full. Valor por defecto short.
  • pageconsulta
    Página de resultados de búsqueda, de 1 a 100. Se usa con s.
  • rconsulta
    Solo json. Cualquier otro valor devuelve HTTP 400.

Los parámetros Season, Episode, callback y v de la API original de OMDb no se admiten y se ignoran.

Campos de la respuesta

CampoNotas
Title, Year, Rated, Released, RuntimeTexto. Released se lee como 15 Oct 1999.
Genre, Director, Writer, ActorsNombres separados por comas.
Plot, Language, Country, AwardsTexto.
PosterDirección en https://img.amodb.dev/t/p/w300/.
RatingsArray de objetos con Source y Value.
Metascore, imdbRating, imdbVotes, imdbIDTexto, incluido el número de votos con comas.
Typemovie o series.
DVD, BoxOffice, Production, WebsiteSolo películas. BoxOffice lleva un valor cuando se conoce. DVD, Production y Website siempre dicen N/A.
totalSeasonsSolo series, como texto. Las respuestas de series no tienen DVD, BoxOffice, Production ni Website.
ResponseTrue o False, siempre una cadena de texto.

Los campos siguen a OMDb, así que un analizador de OMDb existente no necesita más cambio que la URL base.

Ejemplo de respuesta

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 una serie como The Wire (i=tt0306414), la respuesta termina con "Type": "series", "totalSeasons": "5" y "Response": "True".

Buscar con s

Envía s para obtener una lista en lugar de un solo título. Cada página contiene 10 elementos, y totalResults da el total como cadena de texto. Pide page=2 para los elementos 11 a 20, y sigue hasta haber leído totalResults elementos. Una página posterior a la última responde Movie not found!.

curl
curl -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"
CampoNotas
SearchArray de hasta 10 elementos con Title, Year, imdbID, Type, Poster.
totalResultsNúmero de todas las coincidencias, como cadena de texto.
ResponseTrue o 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"
}

La lista se recorta a 2 de 10 elementos.

Leer el array Ratings

Ratings contiene un objeto por fuente, cada uno con Source y Value, y Value es texto como 8.8/10. Las fuentes son Internet Movie Database, Rotten Tomatoes y Metacritic, y solo aparecen las que se conocen para el título. Los campos planos imdbRating, imdbVotes y Metascore repiten parte de los mismos datos. Divide Value por la barra si necesitas un número. Para números tipados y una puntuación de Kinopoisk y de TMDB, usa en su lugar el endpoint de puntuaciones.

Errores

Los fallos de consulta devuelven {"Response":"False","Error":"..."}. La mayoría llegan con HTTP 200, así que lee Error y decide según el texto, no solo según el estado HTTP.

Texto de ErrorHTTPCuándo
Movie not found!200Ningún título coincide con t, el valor de i es válido pero desconocido, o una página de búsqueda es posterior a la última.
Incorrect IMDb ID.200El valor de i no tiene la forma de un id de IMDb.
Too many results.200El texto de búsqueda tiene menos de 3 letras o coincide con demasiados títulos. Alarga el texto o añade type o y.
Something went wrong.200No se envió ninguno de i, t y s.
Only r=json is supported.400r tiene un valor distinto de json.
No API key provided. o Invalid API key!401La apikey falta o es incorrecta.
Request limit reached!429Superaste tus solicitudes por minuto. Espera los segundos de Retry-After.

Un plan terminado responde HTTP 402. Consulta los errores y los límites de solicitudes.

Migrar un cliente de OMDb

La migración son dos cambios: la URL base y la clave. Nada más cambia en la solicitud.

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;

Quita r=xml si lo envías. Un cliente que lee episodios, Season o callback necesita otra fuente para esas partes. El límite de solicitudes es por clave, así que las llamadas al estilo de OMDb y las llamadas al estilo de TMDB comparten un solo presupuesto de 20, 40 o 120 solicitudes por minuto.

Notas prácticas

  • Trata todos los valores como texto. Convierte Year, imdbRating y totalResults por tu cuenta, y trata N/A como dato ausente.
  • Usa plot=full solo cuando muestres la sinopsis larga. short mantiene las respuestas más pequeñas.
  • Las consultas por i o t se guardan en caché más tiempo que las búsquedas con s, así que una consulta repetida devuelve la respuesta almacenada.
  • Para obtener un id de TMDB a partir de un id de IMDb, usa la búsqueda por id externo.
  • Los pósteres están en w300. Para otros tamaños, construye la dirección con el poster_path al estilo de TMDB y la lista de tamaños de imágenes.
  • Mantén la clave en un servidor. Una apikey en la URL de una página es visible para todos los visitantes.