Une API de films qui parle TMDB v3 et OMDb

amodb est une API de films indépendante. Elle parle le même protocole que TMDB v3 et OMDb, donc un client écrit pour l'un ou l'autre fonctionne après le changement de l'URL de base en https://api.amodb.dev/3 (ou https://api.amodb.dev/omdb/ pour les appels de style OMDb). Vous trouvez un film avec /search/movie, puis vous le lisez avec /movie/{movie_id} et append_to_response.

Ce que vous obtenez :

  • Du JSON au format TMDB v3, avec les mêmes chemins et les mêmes paramètres de requête.
  • Des titres et des résumés en 14 langues, choisies avec language.
  • La distribution, l'équipe, les bandes-annonces, les mots-clés, les images et les dates de sortie via append_to_response.
  • Les notes d'IMDb, Kinopoisk, Metacritic, Rotten Tomatoes et TMDB quand elles sont connues.
  • Des affiches depuis https://img.amodb.dev/t/p/{size}/{file}, sans clé.

Les données obtenues

BesoinAppelRemarques
Trouver un film par titreGET /3/search/movie?query=Paginé, jusqu'à 20 résultats par page, cache de périphérie 10 minutes. Voir recherche.
La fiche de baseGET /3/movie/{movie_id}Titres, résumé, durée, genres, date de sortie. Voir films.
Distribution et équipeappend_to_response=creditsLes champs sont décrits sur crédits.
Bandes-annoncesappend_to_response=videosRenvoie le tableau results avec key, site et type.
Notesappend_to_response=ratingsCinq sources, chacune { value, votes } ou null. Voir notes.
Une réponse de style OMDbGET /omdb/?t=InceptionMêmes champs de corps qu'OMDb. Voir point de terminaison OMDb.

Démarrer en 3 étapes

  1. Choisissez une offre sur les tarifs. Les offres ne diffèrent que par le débit : 20, 40 ou 120 requêtes par minute.
  2. Créez une clé dans le tableau de bord de votre compte. Une clé fait 32 caractères hexadécimaux en minuscules.
  3. Appelez le point de terminaison avec la clé dans le paramètre api_key ou dans un en-tête Authorization: Bearer. Voir authentification.

Exemple de requête

L'exemple trouve Inception par son titre, prend le premier résultat, puis lit le film avec sa distribution, ses bandes-annonces et ses notes en un appel de plus. Cela fait deux requêtes en tout.

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 réponse abrégée. Seuls quelques champs de la fiche du film sont conservés, credits est réduit à un membre de la distribution et au réalisateur, et le bloc videos est omis.

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
    }
  }
}

Façons de trouver un film

Choisissez l'appel qui correspond à ce que vous avez déjà.

Vous partez deAppelRésultat
Un titre saisi par un utilisateurGET /3/search/movie?query=Tableau results avec id, title, release_date, poster_path
Un identifiant IMDb comme tt0133093GET /3/find/tt0133093?external_source=imdb_idTableau movie_results
Un identifiant numérique de film comme 603GET /3/movie/603La fiche complète
Un client OMDb existantGET /omdb/?i=tt0133093Corps OMDb avec Title, Year, Ratings

Stockez les deux identifiants. L'id numérique est la clé de tous les autres appels, et imdb_id relie vos données à d'autres systèmes. Les règles de recherche sont sur recherche par identifiant externe.

Champs vides et recherches en échec

Les vraies données de films ont des trous : écrivez le code d'affichage en en tenant compte. Une recherche sans résultat n'est pas une erreur : elle renvoie HTTP 200 avec un tableau results vide. Un identifiant inconnu est une erreur.

CasCe que vous voyezQue faire
Aucun résultat de recherche200 et "results": []Afficher « aucun résultat », ne pas réessayer
Identifiant de film inconnu404 avec status_code 34Retirer l'identifiant de votre liste
Clé absente ou incorrecte401 avec status_code 7S'arrêter et corriger la clé
overview videUne chaîne videRedemander avec language=en-US
Note inconnuenull dans ratingsMasquer ce badge
Pas de date de sortierelease_date videClasser le titre en dernier

La liste complète des erreurs est sur erreurs.

Rester dans la limite de débit

Une recherche et un appel de détails coûtent chacun une requête. À 20 requêtes par minute, cela fait dix recherches de titres par minute, et à 120 requêtes par minute soixante. Une réponse servie depuis le cache de périphérie compte quand même, car la vérification de la clé et la limite de débit passent avant le cache. Gardez un cache à vous pour les recherches répétées, et lisez X-RateLimit-Remaining pour voir ce qu'il reste de la minute. Quand vous recevez un 429, attendez les secondes de Retry-After. Les limites par offre sont sur limites de débit.

Comparaison

CapacitéExtraire les pages soi-mêmeAPI de métadonnées avec offre gratuiteamodb
Format de réponseHTML à analyserJSONJSON au format TMDB v3
Stabilité du schémaCasse quand le balisage des pages changeFixée par le fournisseurChemins et champs fixes, de nouveaux champs peuvent apparaître
Conditions d'accèsLes conditions de chaque site s'appliquentOffre gratuite avec conditions d'usage, à vérifierPayant, prépayé, sans offre gratuite
Limite de débitRien sur quoi s'appuyerFixée par le fournisseur20, 40 ou 120 requêtes par minute et par clé
Notes de plusieurs sourcesUn extracteur par siteVariable, voir la documentationratings dans le même appel, null quand inconnu
LanguesCe que propose chaque pageVariable14, choisies avec language
Réutilisation des clients TMDB v3 et OMDbNonSeulement s'il utilise le même protocoleOui, changez l'URL de base

Tarifs

L'accès est prépayé pour 1, 3, 6, 12 ou 24 mois, avec 0, 10, 20, 30 et 40 pour cent de réduction sur les périodes plus longues. Il n'y a ni renouvellement automatique ni offre gratuite. Chaque offre donne accès à toutes les données, et les offres ne diffèrent que par le débit : 20, 40 ou 120 requêtes par minute. Choisissez-en une sur les tarifs et faites votre premier appel en quelques minutes.