Una API de películas que habla TMDB v3 y OMDb

amodb es una API de películas independiente. Habla el mismo protocolo que TMDB v3 y OMDb, así que un cliente escrito para cualquiera de los dos funciona después de cambiar la URL base a https://api.amodb.dev/3 (o a https://api.amodb.dev/omdb/ para las llamadas estilo OMDb). Encuentras una película con /search/movie y luego la lees con /movie/{movie_id} y append_to_response.

Lo que obtienes:

  • JSON con la forma de TMDB v3, con las mismas rutas y los mismos parámetros de consulta.
  • Títulos y sinopsis en 14 idiomas, que eliges con language.
  • Reparto, equipo técnico, tráilers, palabras clave, imágenes y fechas de estreno mediante append_to_response.
  • Puntuaciones de IMDb, Kinopoisk, Metacritic, Rotten Tomatoes y TMDB cuando se conocen.
  • Pósteres desde https://img.amodb.dev/t/p/{size}/{file}, sin clave.

Qué datos obtienes

NecesitasLlamadaNotas
Encontrar una película por títuloGET /3/search/movie?query=Paginado, hasta 20 resultados por página, caché perimetral de 10 minutos. Consulta búsqueda.
El registro principalGET /3/movie/{movie_id}Títulos, sinopsis, duración, géneros, fecha de estreno. Consulta películas.
Reparto y equipo técnicoappend_to_response=creditsLos campos se describen en créditos.
Tráilersappend_to_response=videosDevuelve el array results con key, site y type.
Puntuacionesappend_to_response=ratingsCinco fuentes, cada una { value, votes } o null. Consulta puntuaciones.
Una respuesta estilo OMDbGET /omdb/?t=InceptionLos mismos campos de cuerpo que OMDb. Consulta endpoint OMDb.

Empieza en 3 pasos

  1. Elige un plan en precios. Los planes se diferencian solo en el límite: 20, 40 o 120 solicitudes por minuto.
  2. Crea una clave en el panel de tu cuenta. Una clave tiene 32 caracteres hexadecimales en minúscula.
  3. Llama al endpoint con la clave en el parámetro api_key o en un encabezado Authorization: Bearer. Consulta autenticación.

Ejemplo de solicitud

El ejemplo busca Inception por título, toma el primer resultado y lee la película con reparto, tráilers y puntuaciones en una llamada más. Son dos solicitudes en total.

bashjs
# 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);

La respuesta recortada. Solo se conservan algunos campos del registro de la película, credits se reduce a un miembro del reparto y al director, y se omite el bloque videos.

JSON
{
  "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 una película

Elige la llamada que se ajuste a lo que ya tienes.

Empiezas conLlamadaResultado
Un título escrito por un usuarioGET /3/search/movie?query=Array results con id, title, release_date, poster_path
Un ID de IMDb como tt0133093GET /3/find/tt0133093?external_source=imdb_idArray movie_results
Un id numérico de película como 603GET /3/movie/603El registro completo
Un cliente OMDb existenteGET /omdb/?i=tt0133093Cuerpo OMDb con Title, Year, Ratings

Guarda ambos ids. El id numérico es la clave para todas las demás llamadas, y imdb_id une tus datos con otros sistemas. Las reglas de consulta están en buscar por ID externo.

Campos vacíos y consultas fallidas

Los datos reales de películas tienen huecos, así que escribe el código de presentación pensando en ellos. Una búsqueda sin resultados no es un error: devuelve HTTP 200 con un array results vacío. Un id desconocido sí es un error.

CasoQué vesQué hacer
Búsqueda sin resultados200 y "results": []Muestra «sin coincidencias», no reintentes
ID de película desconocido404 con status_code 34Quita el id de tu lista
Clave ausente o incorrecta401 con status_code 7Detente y corrige la clave
overview vacíoUna cadena vacíaSolicita de nuevo con language=en-US
Puntuación desconocidanull dentro de ratingsOculta esa insignia
Sin fecha de estrenorelease_date vacíoOrdena el título al final

La lista completa de errores está en errores.

Cómo respetar el límite de solicitudes

Una búsqueda y una llamada de detalles cuestan una solicitud cada una. Con 20 solicitudes por minuto son diez consultas de títulos por minuto, y con 120 solicitudes por minuto son sesenta. Un acierto en la caché perimetral también cuenta, porque la comprobación de la clave y el límite se ejecutan antes que la caché. Mantén una caché propia para las consultas repetidas y lee X-RateLimit-Remaining para ver cuánto queda del minuto. Cuando recibas un 429, espera los segundos indicados en Retry-After. Los límites de cada plan están en límites de solicitudes.

Cómo se compara

CapacidadHacer scraping de las páginas tú mismoAPI de metadatos con nivel gratuitoamodb
Formato de respuestaHTML que debes analizarJSONJSON con la forma de TMDB v3
Estabilidad del esquemaSe rompe cuando cambia el marcado de la páginaLo define el proveedorRutas y campos fijos, pueden aparecer campos nuevos
Condiciones de accesoSe aplican los términos de cada sitioNivel gratuito con términos de uso, revísalosDe pago, prepago, sin nivel gratuito
Límite de solicitudesNada en lo que puedas confiarLo define el proveedor20, 40 o 120 solicitudes por minuto por clave
Puntuaciones de varias fuentesUn scraper por cada sitioVaría, revisa la documentaciónratings en la misma llamada, null cuando se desconoce
IdiomasLos que ofrezca cada páginaVaría14, elegidos con language
Reutilizar clientes de TMDB v3 y OMDbNoSolo si usa el mismo protocoloSí, cambia la URL base

Precios

El acceso es prepago por 1, 3, 6, 12 o 24 meses, con 0, 10, 20, 30 y 40 por ciento de descuento en los periodos más largos. No hay renovación automática ni nivel gratuito. Todos los planes dan acceso a todos los datos y se diferencian solo en el límite: 20, 40 o 120 solicitudes por minuto. Elige uno en precios y haz tu primera llamada en pocos minutos.