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://api.amodb.dev/3 (albo https://api.amodb.dev/omdb/ 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://img.amodb.dev/t/p/{size}/{file}, bez klucza.

Jakie dane dostajesz

Czego potrzebujeszWywołanieUwagi
Znaleźć film po tytuleGET /3/search/movie?query=Z paginacją, do 20 wyników na stronę, cache na edge 10 minut. Zobacz wyszukiwanie.
Podstawowy rekordGET /3/movie/{movie_id}Tytuły, opis, czas trwania, gatunki, data premiery. Zobacz filmy.
Obsada i ekipaappend_to_response=creditsPola opisuje strona obsada i ekipa.
Zwiastunyappend_to_response=videosZwraca tablicę results z key, site i type.
Ocenyappend_to_response=ratingsPięć źródeł, każde { value, votes } lub null. Zobacz oceny.
Odpowiedź w stylu OMDbGET /omdb/?t=InceptionTe same pola treści co w OMDb. Zobacz endpoint OMDb.

Start w 3 krokach

  1. Wybierz plan na stronie cennik. Plany różnią się tylko tempem: 20, 40 lub 120 żądań na minutę.
  2. Utwórz klucz w panelu konta. Klucz to 32 małe znaki szesnastkowe.
  3. Wywołaj endpoint z kluczem w parametrze api_key albo w nagłówku Authorization: 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.

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);

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.

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

Sposoby znajdowania filmu

Wybierz wywołanie, które pasuje do tego, co już masz.

Zaczynasz odWywołanieWynik
Tytułu wpisanego przez użytkownikaGET /3/search/movie?query=tablica results z id, title, release_date, poster_path
ID z IMDb, na przykład tt0133093GET /3/find/tt0133093?external_source=imdb_idtablica movie_results
Numerycznego ID filmu, na przykład 603GET /3/movie/603Pełny rekord
Istniejącego klienta OMDbGET /omdb/?i=tt0133093Treść 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.

PrzypadekCo widziszCo zrobić
Brak wyniku200 i "results": []Pokaż „brak dopasowania”, nie ponawiaj
Nieznane ID filmu404 z status_code 34Usuń ID ze swojej listy
Brakujący lub błędny klucz401 z status_code 7Zatrzymaj się i popraw klucz
Pusty overviewPusty ciągPoproś ponownie z language=en-US
Nieznana ocenanull w ratingsUkryj tę plakietkę
Brak daty premieryPuste release_datePosortuj 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 stronAPI metadanych z darmowym planemamodb
Format odpowiedziHTML, który musisz parsowaćJSONJSON w kształcie TMDB v3
Stabilność schematuPsuje się, gdy zmienia się znacznik stronyUstala dostawcaStałe ścieżki i pola, mogą pojawić się nowe pola
Warunki dostępuObowiązuje regulamin każdej stronyDarmowy plan z warunkami użycia, sprawdź jePłatny, przedpłacony, bez darmowego planu
Limit żądańNic, na czym można polegaćUstala dostawca20, 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ęzykiCo oferuje dana stronaRóżnie14, wybierane przez language
Ponowne użycie klientów TMDB v3 i OMDbNieTylko jeśli używa tego samego protokołuTak, 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.