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:/ (ou https:/ 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:/, sans clé./ img.amodb.dev/ t/ p/ {size}/ {file}
Les données obtenues
| Besoin | Appel | Remarques |
|---|---|---|
| Trouver un film par titre | GET / | Paginé, jusqu'à 20 résultats par page, cache de périphérie 10 minutes. Voir recherche. |
| La fiche de base | GET / | Titres, résumé, durée, genres, date de sortie. Voir films. |
| Distribution et équipe | append_ | Les champs sont décrits sur crédits. |
| Bandes-annonces | append_ | Renvoie le tableau results avec key, site et type. |
| Notes | append_ | Cinq sources, chacune { value, votes } ou null. Voir notes. |
| Une réponse de style OMDb | GET /omdb/?t=Inception | Mêmes champs de corps qu'OMDb. Voir point de terminaison OMDb. |
Démarrer en 3 étapes
- Choisissez une offre sur les tarifs. Les offres ne diffèrent que par le débit : 20, 40 ou 120 requêtes par minute.
- Créez une clé dans le tableau de bord de votre compte. Une clé fait 32 caractères hexadécimaux en minuscules.
- Appelez le point de terminaison avec la clé dans le paramètre
api_keyou dans un en-têteAuthorization: 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.
# 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.
{
"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 de | Appel | Résultat |
|---|---|---|
| Un titre saisi par un utilisateur | GET / | Tableau results avec id, title, release_date, poster_path |
Un identifiant IMDb comme tt0133093 | GET / | Tableau movie_results |
Un identifiant numérique de film comme 603 | GET /3/movie/603 | La fiche complète |
| Un client OMDb existant | GET /omdb/?i=tt0133093 | Corps 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.
| Cas | Ce que vous voyez | Que faire |
|---|---|---|
| Aucun résultat de recherche | 200 et "results": [] | Afficher « aucun résultat », ne pas réessayer |
| Identifiant de film inconnu | 404 avec status_code 34 | Retirer l'identifiant de votre liste |
| Clé absente ou incorrecte | 401 avec status_code 7 | S'arrêter et corriger la clé |
overview vide | Une chaîne vide | Redemander avec language=en-US |
| Note inconnue | null dans ratings | Masquer ce badge |
| Pas de date de sortie | release_date vide | Classer 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ême | API de métadonnées avec offre gratuite | amodb |
|---|---|---|---|
| Format de réponse | HTML à analyser | JSON | JSON au format TMDB v3 |
| Stabilité du schéma | Casse quand le balisage des pages change | Fixée par le fournisseur | Chemins et champs fixes, de nouveaux champs peuvent apparaître |
| Conditions d'accès | Les conditions de chaque site s'appliquent | Offre gratuite avec conditions d'usage, à vérifier | Payant, prépayé, sans offre gratuite |
| Limite de débit | Rien sur quoi s'appuyer | Fixée par le fournisseur | 20, 40 ou 120 requêtes par minute et par clé |
| Notes de plusieurs sources | Un extracteur par site | Variable, voir la documentation | ratings dans le même appel, null quand inconnu |
| Langues | Ce que propose chaque page | Variable | 14, choisies avec language |
| Réutilisation des clients TMDB v3 et OMDb | Non | Seulement s'il utilise le même protocole | Oui, 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.