API фільмів, що розуміє TMDB v3 і OMDb

amodb це незалежний API фільмів. Він працює за тим самим протоколом, що й TMDB v3 та OMDb, тож клієнт, написаний для будь-якого з них, працює після зміни базового URL на https://api.amodb.dev/3 (або https://api.amodb.dev/omdb/ для викликів у стилі OMDb). Ви знаходите фільм через /search/movie, а потім читаєте його через /movie/{movie_id} і append_to_response.

Що ви отримуєте:

  • JSON у форматі TMDB v3 з тими самими шляхами й параметрами запиту.
  • Назви й описи 14 мовами, які вибираються через language.
  • Акторський склад, знімальна група, трейлери, ключові слова, зображення й дати виходу через append_to_response.
  • Рейтинги з IMDb, Kinopoisk, Metacritic, Rotten Tomatoes і TMDB, якщо вони відомі.
  • Постери з https://img.amodb.dev/t/p/{size}/{file} без ключа.

Які дані ви отримуєте

Що потрібноЗапитПримітки
Знайти фільм за назвоюGET /3/search/movie?query=Сторінками, до 20 результатів на сторінці, edge-кеш 10 хвилин. Дивіться пошук.
Основний записGET /3/movie/{movie_id}Назви, опис, тривалість, жанри, дата виходу. Дивіться фільми.
Акторський склад і знімальна групаappend_to_response=creditsПоля описано на сторінці акторський склад і знімальна група.
Трейлериappend_to_response=videosПовертає масив results з key, site і type.
Оцінкиappend_to_response=ratingsП'ять джерел, кожне { value, votes } або null. Дивіться рейтинги.
Відповідь у стилі OMDbGET /omdb/?t=InceptionТі самі поля тіла, що й в OMDb. Дивіться ендпоінт OMDb.

Почніть за 3 кроки

  1. Оберіть тариф на сторінці ціни. Тарифи відрізняються лише лімітом: 20, 40 або 120 запитів на хвилину.
  2. Створіть ключ у кабінеті акаунта. Ключ складається з 32 шістнадцяткових символів у нижньому регістрі.
  3. Викличте ендпоінт із ключем у параметрі api_key або в заголовку Authorization: Bearer. Дивіться автентифікація.

Приклад запиту

Приклад знаходить Inception за назвою, бере перший збіг і читає фільм з акторами, трейлерами та рейтингами ще одним запитом. Разом це два запити.

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

Скорочена відповідь. Збережено лише частину полів запису фільму, credits обрізано до одного актора й режисера, а блок videos пропущено.

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

Способи знайти фільм

Оберіть запит, який відповідає тому, що у вас уже є.

З чого ви починаєтеЗапитРезультат
Назва, введена користувачемGET /3/search/movie?query=Масив results з id, title, release_date, poster_path
IMDb id, наприклад tt0133093GET /3/find/tt0133093?external_source=imdb_idМасив movie_results
Числовий id фільму, наприклад 603GET /3/movie/603Повний запис
Наявний клієнт OMDbGET /omdb/?i=tt0133093Тіло OMDb з Title, Year, Ratings

Зберігайте обидва id. Числовий id є ключем для всіх інших запитів, а imdb_id поєднує ваші дані з іншими системами. Правила пошуку описано на сторінці пошук за зовнішнім ID.

Порожні поля та невдалі запити

У реальних даних про фільми є прогалини, тож напишіть код показу з їх урахуванням. Пошук без збігів не є помилкою: він повертає HTTP 200 з порожнім масивом results. Невідомий id це помилка.

ВипадокЩо ви бачитеЩо робити
Немає збігів у пошуку200 і "results": []Покажіть «збігів немає», не повторюйте запит
Невідомий id фільму404 із status_code 34Видаліть id зі свого списку
Відсутній або хибний ключ401 із status_code 7Зупиніться й виправте ключ
Порожній overviewПорожній рядокПовторіть запит із language=en-US
Невідома оцінкаnull всередині ratingsСховайте цей значок
Немає дати виходуПорожній release_dateПоставте фільм у кінець сортування

Повний список помилок на сторінці помилки.

Як вкластися в ліміт запитів

Пошук і запит деталей коштують по одному запиту. При 20 запитах на хвилину це десять пошуків назви на хвилину, при 120 запитах на хвилину шістдесят. Влучання в edge-кеш також враховується, бо перевірка ключа й ліміт запитів виконуються перед кешем. Ведіть власний кеш для повторних запитів і читайте X-RateLimit-Remaining, щоб бачити, скільки лишилося від хвилини. Отримавши 429, зачекайте стільки секунд, скільки вказано в Retry-After. Ліміти за тарифами на сторінці ліміти запитів.

Порівняння

МожливістьСкрапінг сторінок власноручБезкоштовний API метаданихamodb
Формат відповідіHTML, який треба розбиратиJSONJSON у форматі TMDB v3
Стабільність схемиЛамається при зміні розмітки сторінкиВизначає провайдерФіксовані шляхи й поля, можуть з'являтися нові поля
Умови доступуДіють умови кожного сайтуБезкоштовний тариф з умовами використання, перевірте їхПлатно, передплата, без безкоштовного тарифу
Ліміт запитівНічого, на що можна спертисяВизначає провайдер20, 40 або 120 запитів на хвилину на ключ
Рейтинги з кількох джерелОдин скрапер на сайтПо-різному, дивіться документаціюratings у тому самому запиті, null, коли невідомо
МовиТе, що пропонує кожна сторінкаПо-різному14, вибираються через language
Повторне використання клієнтів TMDB v3 і OMDbНіЛише якщо той самий протоколТак, змініть базовий URL

Ціни

Доступ передплачується на 1, 3, 6, 12 або 24 місяці зі знижками 0, 10, 20, 30 і 40 відсотків за довші періоди. Автоматичного поновлення та безкоштовного тарифу немає. Кожен тариф отримує всі дані, а тарифи відрізняються лише лімітом: 20, 40 або 120 запитів на хвилину. Оберіть один на сторінці ціни і зробіть перший запит за кілька хвилин.