Un API de filme care vorbește TMDB v3 și OMDb

amodb este un API de filme independent. Vorbește același protocol ca TMDB v3 și OMDb, așa că un client scris pentru oricare dintre ele funcționează după ce schimbi URL-ul de bază în https://api.amodb.dev/3 (sau https://api.amodb.dev/omdb/ pentru apelurile în stil OMDb). Găsești un film cu /search/movie, apoi îl citești cu /movie/{movie_id} și append_to_response.

Ce primești:

  • JSON în structura TMDB v3, cu aceleași căi și aceiași parametri de interogare.
  • Titluri și descrieri în 14 limbi, alese cu language.
  • Distribuție, echipă, trailere, cuvinte-cheie, imagini și date de lansare prin append_to_response.
  • Evaluări de la IMDb, Kinopoisk, Metacritic, Rotten Tomatoes și TMDB, acolo unde se știu.
  • Postere de la https://img.amodb.dev/t/p/{size}/{file}, fără cheie.

Ce date primești

Ai nevoie deApelObservații
Găsești un film după titluGET /3/search/movie?query=Paginat, până la 20 de rezultate pe pagină, cache la margine 10 minute. Vezi căutare.
Fișa de bazăGET /3/movie/{movie_id}Titluri, descriere, durată, genuri, data lansării. Vezi filme.
Distribuție și echipăappend_to_response=creditsCâmpurile sunt descrise la credite.
Trailereappend_to_response=videosÎntoarce array-ul results cu key, site și type.
Scoruriappend_to_response=ratingsCinci surse, fiecare { value, votes } sau null. Vezi evaluări.
Un răspuns în stil OMDbGET /omdb/?t=InceptionAceleași câmpuri de corp ca OMDb. Vezi endpoint-ul OMDb.

Începe în 3 pași

  1. Alege un plan la prețuri. Planurile diferă doar prin ritm: 20, 40 sau 120 de cereri pe minut.
  2. Creează o cheie în panoul contului tău. O cheie are 32 de caractere hexazecimale minuscule.
  3. Apelează endpoint-ul cu cheia în parametrul api_key sau într-un antet Authorization: Bearer. Vezi autentificare.

Exemplu de cerere

Exemplul găsește Inception după titlu, ia prima potrivire și citește filmul cu distribuție, trailere și evaluări într-un singur apel în plus. Asta înseamnă două cereri în 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);

Răspunsul scurtat. Sunt păstrate doar unele câmpuri ale fișei filmului, credits este tăiat la un membru al distribuției și regizor, iar blocul videos este 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
    }
  }
}

Moduri de a găsi un film

Alege apelul care se potrivește cu ceea ce ai deja.

Pornești de laApelRezultat
Un titlu tastat de un utilizatorGET /3/search/movie?query=array-ul results cu id, title, release_date, poster_path
Un ID IMDb precum tt0133093GET /3/find/tt0133093?external_source=imdb_idarray-ul movie_results
Un ID numeric de film precum 603GET /3/movie/603Fișa completă
Un client OMDb existentGET /omdb/?i=tt0133093Corp OMDb cu Title, Year, Ratings

Păstrează ambele ID-uri. Valoarea numerică id este cheia pentru fiecare alt apel, iar imdb_id leagă datele tale de alte sisteme. Regulile de căutare sunt la căutare după ID extern.

Câmpuri goale și căutări eșuate

Datele reale despre filme au goluri, așa că scrie codul de afișare ținând cont de ele. O căutare fără rezultat nu este o eroare: întoarce HTTP 200 cu un array results gol. Un ID necunoscut este o eroare.

CazCe veziCe faci
Nicio potrivire în căutare200 și "results": []Arată „nicio potrivire”, nu reîncerca
ID de film necunoscut404 cu status_code 34Scoate ID-ul din lista ta
Cheie lipsă sau greșită401 cu status_code 7Oprește-te și corectează cheia
overview golUn șir golCere din nou cu language=en-US
Scor necunoscutnull în ratingsAscunde insigna respectivă
Fără dată de lansarerelease_date golSortează titlul la sfârșit

Lista completă de erori este la erori.

Cum rămâi în limita de cereri

O căutare și un apel de detalii costă câte o cerere. La 20 de cereri pe minut înseamnă zece căutări de titluri pe minut, iar la 120 de cereri pe minut înseamnă șaizeci. O lovitură de cache la margine tot se numără, pentru că verificarea cheii și limita de cereri rulează înaintea cache-ului. Ține un cache propriu pentru căutările repetate și citește X-RateLimit-Remaining ca să vezi cât a mai rămas din minut. Când primești un 429, așteaptă numărul de secunde din Retry-After. Limitele pe plan sunt la limite de cereri.

Cum se compară

CapacitateExtragi singur paginileAPI de metadate cu nivel gratuitamodb
Format de răspunsHTML pe care trebuie să-l analizeziJSONJSON în structura TMDB v3
Stabilitatea schemeiSe strică la schimbarea markup-ului paginiiStabilită de furnizorCăi și câmpuri fixe, pot apărea câmpuri noi
Condiții de accesSe aplică termenii fiecărui siteNivel gratuit cu condiții de utilizare, verifică-leCu plată, plătit în avans, fără nivel gratuit
Limită de cereriNimic pe care să te poți bazaStabilită de furnizor20, 40 sau 120 de cereri pe minut pe cheie
Evaluări din mai multe surseUn scraper pe siteVariază, verifică documentațiaratings în același apel, null când nu se știe
LimbiCe oferă fiecare paginăVariază14, alese cu language
Reutilizarea clienților TMDB v3 și OMDbNuDoar dacă folosește același protocolDa, schimbi URL-ul de bază

Prețuri

Accesul este plătit în avans pentru 1, 3, 6, 12 sau 24 de luni, cu reduceri de 0, 10, 20, 30 și 40 la sută la perioadele mai lungi. Nu există reînnoire automată și nici nivel gratuit. Fiecare plan primește toate datele, iar planurile diferă doar prin ritm: 20, 40 sau 120 de cereri pe minut. Alege unul la prețuri și fă primul apel în câteva minute.