Эндпоинт, совместимый с OMDb

GET https://api.amodb.dev/omdb/ отвечает на запросы в стиле OMDb с теми же именами параметров и полей. Ищите тайтл по IMDb ID через i или по названию через t, а список получайте через s. Ссылки на постеры ведут на img.amodb.dev. Работают только r=json, фильмы и сериалы. Смените базовый URL и ключ, и типичный клиент продолжит работать.

Обновлено Открыть в Markdown

Поиск тайтла по IMDb ID или названию

GET https://api.amodb.dev/omdb/ возвращает один тайтл в виде плоского JSON с именами полей OMDb. Передайте i с IMDb ID, например tt0137523, или t с названием. Аутентификация идет через параметр запроса apikey. В ответе Response равно True при успехе и False при ошибке.

Пример загружает Fight Club по IMDb ID и останавливается с текстом ошибки OMDb, когда Response равно False.

bashjspyphpgo
curl -sf "https://api.amodb.dev/omdb/?i=tt0137523&plot=short&apikey=$AMODB_KEY"
const params = new URLSearchParams({ i: 'tt0137523', plot: 'short', apikey: process.env.AMODB_KEY });
const res = await fetch(`https://api.amodb.dev/omdb/?${params}`);
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const data = await res.json();
if (data.Response === 'False') throw new Error(data.Error);
console.log(data.Title, data.Year, data.imdbRating);
import os
import requests

r = requests.get(
    "https://api.amodb.dev/omdb/",
    params={"i": "tt0137523", "plot": "short", "apikey": os.environ["AMODB_KEY"]},
    timeout=10,
)
r.raise_for_status()
data = r.json()
if data["Response"] == "False":
    raise SystemExit(data["Error"])
print(data["Title"], data["Year"], data["imdbRating"])
<?php
$query = http_build_query(['i' => 'tt0137523', 'plot' => 'short', 'apikey' => getenv('AMODB_KEY')]);
$ch = curl_init('https://api.amodb.dev/omdb/?' . $query);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("amodb returned $status");
}
$data = json_decode($body, true);
if ($data['Response'] === 'False') {
    throw new RuntimeException($data['Error']);
}
echo $data['Title'], ' ', $data['Year'], ' ', $data['imdbRating'], PHP_EOL;
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"time"
)

type Title struct {
	Title      string `json:"Title"`
	Year       string `json:"Year"`
	ImdbRating string `json:"imdbRating"`
	Response   string `json:"Response"`
	Error      string `json:"Error"`
}

func main() {
	q := url.Values{"i": {"tt0137523"}, "plot": {"short"}, "apikey": {os.Getenv("AMODB_KEY")}}
	client := &http.Client{Timeout: 10 * time.Second}
	res, err := client.Get("https://api.amodb.dev/omdb/?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}
	var t Title
	if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
		panic(err)
	}
	if t.Response == "False" {
		panic(t.Error)
	}
	fmt.Println(t.Title, t.Year, t.ImdbRating)
}

Параметры

  • apikeyqueryобязателен
    Ваш ключ amodb.
  • iqueryодин из i, t, s
    IMDb ID тайтла: tt и от 7 до 9 цифр, например tt0137523.
  • tqueryодин из i, t, s
    Название для поиска, возвращает лучшее совпадение.
  • squeryодин из i, t, s
    Текст поиска не короче 3 букв, возвращает список.
  • typequery
    movie или series. episode ничего не находит.
  • yquery
    Год выхода.
  • plotquery
    short или full. По умолчанию short.
  • pagequery
    Страница результатов поиска, от 1 до 100. Используется вместе с s.
  • rquery
    Только json. Любое другое значение возвращает HTTP 400.

Параметры Season, Episode, callback и v из оригинального OMDb API не поддерживаются и игнорируются.

Поля ответа

ПолеПримечания
Title, Year, Rated, Released, RuntimeТекст. Released выглядит как 15 Oct 1999.
Genre, Director, Writer, ActorsИмена через запятую.
Plot, Language, Country, AwardsТекст.
PosterАдрес на https://img.amodb.dev/t/p/w300/.
RatingsМассив объектов с Source и Value.
Metascore, imdbRating, imdbVotes, imdbIDТекст, включая число голосов с запятыми.
Typemovie или series.
DVD, BoxOffice, Production, WebsiteТолько для фильмов. BoxOffice содержит значение, если оно известно. DVD, Production и Website всегда равны N/A.
totalSeasonsТолько для сериалов, текстом. В ответах для сериалов нет DVD, BoxOffice, Production и Website.
ResponseTrue или False, всегда строка.

Поля повторяют OMDb, поэтому существующему парсеру OMDb не нужны изменения, кроме базового URL.

Пример ответа

JSON
{
  "Title": "Fight Club",
  "Year": "1999",
  "Rated": "R",
  "Released": "15 Oct 1999",
  "Runtime": "139 min",
  "Genre": "Crime, Drama, Thriller",
  "Director": "David Fincher",
  "Writer": "Chuck Palahniuk, Jim Uhls",
  "Actors": "Brad Pitt, Edward Norton, Meat Loaf",
  "Plot": "A nameless first-person narrator attends support groups in an attempt to subdue his emotional state and relieve his insomniac state.",
  "Language": "English",
  "Country": "United States, Germany",
  "Awards": "Nominated for 1 Oscar. 12 wins & 38 nominations total",
  "Poster": "https://img.amodb.dev/t/p/w300/qkrH7rjYKU4KOwwIl6wF6H3ISvm.jpg",
  "Ratings": [
    { "Source": "Internet Movie Database", "Value": "8.8/10" },
    { "Source": "Rotten Tomatoes", "Value": "81%" },
    { "Source": "Metacritic", "Value": "67/100" }
  ],
  "Metascore": "67",
  "imdbRating": "8.8",
  "imdbVotes": "2,669,989",
  "imdbID": "tt0137523",
  "Type": "movie",
  "DVD": "N/A",
  "BoxOffice": "$38,003,039",
  "Production": "N/A",
  "Website": "N/A",
  "Response": "True"
}

Для сериала вроде The Wire (i=tt0306414) ответ заканчивается полями "Type": "series", "totalSeasons": "5" и "Response": "True".

Поиск через s

Передайте s, чтобы получить список вместо одного тайтла. На странице 10 элементов, а totalResults дает полное количество строкой. Запросите page=2 для элементов с 11 по 20 и продолжайте, пока не прочитаете totalResults элементов. Страница за последней отвечает Movie not found!.

curl
curl -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"
ПолеПримечания
SearchМассив до 10 элементов с Title, Year, imdbID, Type, Poster.
totalResultsКоличество всех совпадений, строкой.
ResponseTrue или False.
JSON
{
  "Search": [
    {
      "Title": "The Matrix",
      "Year": "1999",
      "imdbID": "tt0133093",
      "Type": "movie",
      "Poster": "https://img.amodb.dev/t/p/w300/kEDbym5htJgDQNenjUtSJxAHysB.jpg"
    },
    {
      "Title": "The Matrix Reloaded",
      "Year": "2003",
      "imdbID": "tt0234215",
      "Type": "movie",
      "Poster": "https://img.amodb.dev/t/p/w300/d0xVNNxIYxId2qHkqpgE39soOvD.jpg"
    }
  ],
  "totalResults": "20",
  "Response": "True"
}

Список сокращен до 2 из 10 элементов.

Чтение массива Ratings

Ratings содержит по одному объекту на источник, у каждого есть Source и Value, причем Value представляет собой текст вида 8.8/10. Источники: Internet Movie Database, Rotten Tomatoes и Metacritic, и в списке только те, что известны для тайтла. Плоские поля imdbRating, imdbVotes и Metascore повторяют часть тех же данных. Если нужно число, разделите Value по символу косой черты. Для значений в числовом типе, а также оценок Kinopoisk и TMDB используйте эндпоинт рейтинги.

Ошибки

Ошибки поиска возвращают {"Response":"False","Error":"..."}. Большинство из них приходят с HTTP 200, поэтому читайте Error и ориентируйтесь на текст, а не только на HTTP-статус.

Текст ErrorHTTPКогда
Movie not found!200Ни один тайтл не соответствует t, значение i корректно, но неизвестно, или страница поиска за последней.
Incorrect IMDb ID.200Значение i не похоже на IMDb ID.
Too many results.200Текст поиска короче 3 букв или подходит слишком многим тайтлам. Удлините текст или добавьте type или y.
Something went wrong.200Не передан ни один из i, t и s.
Only r=json is supported.400r равен чему угодно, кроме json.
No API key provided. или Invalid API key!401Параметр apikey отсутствует или неверен.
Request limit reached!429Превышен лимит запросов в минуту. Подождите Retry-After секунд.

Закончившийся тариф отвечает HTTP 402. См. ошибки и лимиты запросов.

Миграция клиента OMDb

Миграция сводится к двум правкам: базовому URL и ключу. Больше в запросе ничего не меняется.

JavaScript
// Before: the base URL and key of your current OMDb setup.
// After:
const OMDB_BASE = 'https://api.amodb.dev/omdb/';
const OMDB_KEY = process.env.AMODB_KEY;

Уберите r=xml, если вы его отправляете. Клиенту, который читает серии, Season или callback, для этих частей нужен другой источник. Лимит запросов действует на ключ, поэтому вызовы в стиле OMDb и вызовы в стиле TMDB делят один бюджет в 20, 40 или 120 запросов в минуту.

Практические советы

  • Считайте каждое значение текстом. Преобразуйте Year, imdbRating и totalResults самостоятельно, а N/A воспринимайте как отсутствие значения.
  • Используйте plot=full только тогда, когда показываете длинное описание сюжета. С short ответы меньше.
  • Запросы по i или t кэшируются дольше, чем поиск через s, поэтому повторный запрос возвращает сохраненный ответ.
  • Чтобы получить TMDB ID по IMDb ID, вызовите поиск по внешнему ID.
  • Постеры отдаются в размере w300. Для других размеров собирайте адрес из poster_path в стиле TMDB и списка размеров на странице API изображений.
  • Храните ключ на сервере. apikey в URL страницы виден каждому посетителю.