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:/ (sau https:/ 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:/, fără cheie./ img.amodb.dev/ t/ p/ {size}/ {file}
Ce date primești
| Ai nevoie de | Apel | Observații |
|---|---|---|
| Găsești un film după titlu | GET / | Paginat, până la 20 de rezultate pe pagină, cache la margine 10 minute. Vezi căutare. |
| Fișa de bază | GET / | Titluri, descriere, durată, genuri, data lansării. Vezi filme. |
| Distribuție și echipă | append_ | Câmpurile sunt descrise la credite. |
| Trailere | append_ | Întoarce array-ul results cu key, site și type. |
| Scoruri | append_ | Cinci surse, fiecare { value, votes } sau null. Vezi evaluări. |
| Un răspuns în stil OMDb | GET /omdb/?t=Inception | Aceleași câmpuri de corp ca OMDb. Vezi endpoint-ul OMDb. |
Începe în 3 pași
- Alege un plan la prețuri. Planurile diferă doar prin ritm: 20, 40 sau 120 de cereri pe minut.
- Creează o cheie în panoul contului tău. O cheie are 32 de caractere hexazecimale minuscule.
- Apelează endpoint-ul cu cheia în parametrul
api_keysau într-un antetAuthorization: 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.
# 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.
{
"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 la | Apel | Rezultat |
|---|---|---|
| Un titlu tastat de un utilizator | GET / | array-ul results cu id, title, release_date, poster_path |
Un ID IMDb precum tt0133093 | GET / | array-ul movie_results |
Un ID numeric de film precum 603 | GET /3/movie/603 | Fișa completă |
| Un client OMDb existent | GET /omdb/?i=tt0133093 | Corp 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.
| Caz | Ce vezi | Ce faci |
|---|---|---|
| Nicio potrivire în căutare | 200 și "results": [] | Arată „nicio potrivire”, nu reîncerca |
| ID de film necunoscut | 404 cu status_code 34 | Scoate ID-ul din lista ta |
| Cheie lipsă sau greșită | 401 cu status_code 7 | Oprește-te și corectează cheia |
overview gol | Un șir gol | Cere din nou cu language=en-US |
| Scor necunoscut | null în ratings | Ascunde insigna respectivă |
| Fără dată de lansare | release_date gol | Sortează 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ă
| Capacitate | Extragi singur paginile | API de metadate cu nivel gratuit | amodb |
|---|---|---|---|
| Format de răspuns | HTML pe care trebuie să-l analizezi | JSON | JSON în structura TMDB v3 |
| Stabilitatea schemei | Se strică la schimbarea markup-ului paginii | Stabilită de furnizor | Căi și câmpuri fixe, pot apărea câmpuri noi |
| Condiții de acces | Se aplică termenii fiecărui site | Nivel gratuit cu condiții de utilizare, verifică-le | Cu plată, plătit în avans, fără nivel gratuit |
| Limită de cereri | Nimic pe care să te poți baza | Stabilită de furnizor | 20, 40 sau 120 de cereri pe minut pe cheie |
| Evaluări din mai multe surse | Un scraper pe site | Variază, verifică documentația | ratings în același apel, null când nu se știe |
| Limbi | Ce oferă fiecare pagină | Variază | 14, alese cu language |
| Reutilizarea clienților TMDB v3 și OMDb | Nu | Doar dacă folosește același protocol | Da, 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.