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.
Buscar un título por id de IMDb o por título
GET https:/ 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.
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
apikeyconsultaobligatorioTu clave de amodb.iconsultauno dei,t,sId de IMDb del título:ttmás 7 a 9 dígitos, por ejemplott0137523.tconsultauno dei,t,sTítulo que buscar, devuelve la mejor coincidencia.sconsultauno dei,t,sTexto de búsqueda de al menos 3 letras, devuelve una lista.typeconsultamovieoseries.episodeno encuentra nada.yconsultaAño de estreno.plotconsultashortofull. Valor por defectoshort.pageconsultaPágina de resultados de búsqueda, de 1 a 100. Se usa cons.rconsultaSolojson. 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
| Campo | Notas |
|---|---|
Title, Year, Rated, Released, Runtime | Texto. Released se lee como 15 Oct 1999. |
Genre, Director, Writer, Actors | Nombres separados por comas. |
Plot, Language, Country, Awards | Texto. |
Poster | Dirección en https:/. |
Ratings | Array de objetos con Source y Value. |
Metascore, imdbRating, imdbVotes, imdbID | Texto, incluido el número de votos con comas. |
Type | movie o series. |
DVD, BoxOffice, Production, Website | Solo películas. BoxOffice lleva un valor cuando se conoce. DVD, Production y Website siempre dicen N/A. |
totalSeasons | Solo series, como texto. Las respuestas de series no tienen DVD, BoxOffice, Production ni Website. |
Response | True 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
{
"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 -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"| Campo | Notas |
|---|---|
Search | Array de hasta 10 elementos con Title, Year, imdbID, Type, Poster. |
totalResults | Número de todas las coincidencias, como cadena de texto. |
Response | True o 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"
}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",. 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 Error | HTTP | Cuándo |
|---|---|---|
Movie not found! | 200 | Ningú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. | 200 | El valor de i no tiene la forma de un id de IMDb. |
Too many results. | 200 | El 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. | 200 | No se envió ninguno de i, t y s. |
Only r= | 400 | r tiene un valor distinto de json. |
No API key provided. o Invalid API key! | 401 | La apikey falta o es incorrecta. |
Request limit reached! | 429 | Superaste 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.
// 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,imdbRatingytotalResultspor tu cuenta, y trataN/Acomo dato ausente. - Usa
plot=fullsolo cuando muestres la sinopsis larga.shortmantiene las respuestas más pequeñas. - Las consultas por
iotse guardan en caché más tiempo que las búsquedas cons, 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 elposter_pathal estilo de TMDB y la lista de tamaños de imágenes. - Mantén la clave en un servidor. Una
apikeyen la URL de una página es visible para todos los visitantes.