API filmów, które mówi językiem TMDB v3 i OMDb
amodb to niezależne API filmów. Mówi tym samym protokołem co TMDB v3 i OMDb, więc klient napisany dla któregokolwiek z nich działa po zmianie bazowego URL na https:/ (albo https:/ dla wywołań w stylu OMDb). Film znajdziesz przez /search/movie, a potem odczytasz go przez /movie/{movie_id} i append_to_response.
Co dostajesz:
- JSON w kształcie TMDB v3, z tymi samymi ścieżkami i parametrami zapytania.
- Tytuły i opisy w 14 językach, wybierane przez
language. - Obsadę, ekipę, zwiastuny, słowa kluczowe, obrazy i daty premier przez
append_to_response. - Oceny ze źródeł IMDb, Kinopoisk, Metacritic, Rotten Tomatoes i TMDB, gdy są znane.
- Plakaty z
https:/, bez klucza./ img.amodb.dev/ t/ p/ {size}/ {file}
Jakie dane dostajesz
| Czego potrzebujesz | Wywołanie | Uwagi |
|---|---|---|
| Znaleźć film po tytule | GET / | Z paginacją, do 20 wyników na stronę, cache na edge 10 minut. Zobacz wyszukiwanie. |
| Podstawowy rekord | GET / | Tytuły, opis, czas trwania, gatunki, data premiery. Zobacz filmy. |
| Obsada i ekipa | append_ | Pola opisuje strona obsada i ekipa. |
| Zwiastuny | append_ | Zwraca tablicę results z key, site i type. |
| Oceny | append_ | Pięć źródeł, każde { value, votes } lub null. Zobacz oceny. |
| Odpowiedź w stylu OMDb | GET /omdb/?t=Inception | Te same pola treści co w OMDb. Zobacz endpoint OMDb. |
Start w 3 krokach
- Wybierz plan na stronie cennik. Plany różnią się tylko tempem: 20, 40 lub 120 żądań na minutę.
- Utwórz klucz w panelu konta. Klucz to 32 małe znaki szesnastkowe.
- Wywołaj endpoint z kluczem w parametrze
api_keyalbo w nagłówkuAuthorization: Bearer. Zobacz uwierzytelnianie.
Przykładowe żądanie
Przykład znajduje Inception po tytule, bierze pierwszy wynik i w kolejnym wywołaniu pobiera film z obsadą, zwiastunami i ocenami. W sumie to dwa żądania.
# 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);Przycięta odpowiedź. Z rekordu filmu zostały tylko niektóre pola, credits jest przycięte do jednego aktora i reżysera, a blok videos pominięto.
{
"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
}
}
}Sposoby znajdowania filmu
Wybierz wywołanie, które pasuje do tego, co już masz.
| Zaczynasz od | Wywołanie | Wynik |
|---|---|---|
| Tytułu wpisanego przez użytkownika | GET / | tablica results z id, title, release_date, poster_path |
ID z IMDb, na przykład tt0133093 | GET / | tablica movie_results |
Numerycznego ID filmu, na przykład 603 | GET /3/movie/603 | Pełny rekord |
| Istniejącego klienta OMDb | GET /omdb/?i=tt0133093 | Treść OMDb z Title, Year, Ratings |
Zapisuj oba ID. Numeryczne id jest kluczem do wszystkich innych wywołań, a imdb_id łączy twoje dane z innymi systemami. Zasady wyszukiwania opisuje strona wyszukiwanie po zewnętrznym ID.
Puste pola i nieudane wyszukiwania
Prawdziwe dane o filmach mają luki, więc napisz dla nich kod wyświetlania. Wyszukiwanie bez wyniku to nie błąd: zwraca HTTP 200 z pustą tablicą results. Nieznane ID to błąd.
| Przypadek | Co widzisz | Co zrobić |
|---|---|---|
| Brak wyniku | 200 i "results": [] | Pokaż „brak dopasowania”, nie ponawiaj |
| Nieznane ID filmu | 404 z status_code 34 | Usuń ID ze swojej listy |
| Brakujący lub błędny klucz | 401 z status_code 7 | Zatrzymaj się i popraw klucz |
Pusty overview | Pusty ciąg | Poproś ponownie z language=en-US |
| Nieznana ocena | null w ratings | Ukryj tę plakietkę |
| Brak daty premiery | Puste release_date | Posortuj tytuł na końcu |
Pełna lista błędów jest na stronie błędy.
Jak zmieścić się w limicie żądań
Wyszukiwanie i wywołanie szczegółów kosztują po jednym żądaniu. Przy 20 żądaniach na minutę to dziesięć wyszukań tytułów na minutę, przy 120 żądaniach na minutę sześćdziesiąt. Trafienie w cache na edge nadal się liczy, bo sprawdzenie klucza i limitu odbywa się przed cache. Trzymaj własny cache dla powtarzanych wyszukań, a z X-RateLimit-Remaining odczytasz, ile minuty zostało. Przy 429 poczekaj tyle sekund, ile podaje Retry-After. Limity według planów są na stronie limity żądań.
Jak wypada w porównaniu
| Możliwość | Własny scraping stron | API metadanych z darmowym planem | amodb |
|---|---|---|---|
| Format odpowiedzi | HTML, który musisz parsować | JSON | JSON w kształcie TMDB v3 |
| Stabilność schematu | Psuje się, gdy zmienia się znacznik strony | Ustala dostawca | Stałe ścieżki i pola, mogą pojawić się nowe pola |
| Warunki dostępu | Obowiązuje regulamin każdej strony | Darmowy plan z warunkami użycia, sprawdź je | Płatny, przedpłacony, bez darmowego planu |
| Limit żądań | Nic, na czym można polegać | Ustala dostawca | 20, 40 lub 120 żądań na minutę na klucz |
| Oceny z wielu źródeł | Jeden scraper na stronę | Różnie, sprawdź dokumentację | ratings w tym samym wywołaniu, null, gdy nieznane |
| Języki | Co oferuje dana strona | Różnie | 14, wybierane przez language |
| Ponowne użycie klientów TMDB v3 i OMDb | Nie | Tylko jeśli używa tego samego protokołu | Tak, zmień bazowy URL |
Cennik
Dostęp jest przedpłacony na 1, 3, 6, 12 lub 24 miesiące, ze zniżką 0, 10, 20, 30 i 40 procent za dłuższe okresy. Nie ma automatycznego odnawiania ani darmowego planu. Każdy plan dostaje wszystkie dane, a plany różnią się tylko tempem: 20, 40 lub 120 żądań na minutę. Wybierz plan na stronie cennik i wykonaj pierwsze wywołanie w kilka minut.