API коллекций
Коллекция объединяет фильмы одной франшизы, например трилогию или многолетнюю киносерию. GET /3/collection/{collection_id} возвращает название, описание, изображения и массив parts с фильмами в порядке выхода. Фильмы ссылаются на свою коллекцию через belongs_to_collection, поэтому переходить можно в обе стороны: от фильма к франшизе и обратно.
Получение коллекции
GET / возвращает одну франшизу: название, описание, постер, фон (backdrop) и массив parts. Каждая часть содержит краткие сведения о фильме с полями, нужными для карточки, поэтому одного запроса хватает, чтобы отрисовать всю полку франшизы.
В примере загружается коллекция 10 с фильмами Star Wars, а ее фильмы выводятся в порядке выхода.
curl -s "https://api.amodb.dev/3/collection/10?language=en-US" \
-H "Authorization: Bearer $AMODB_KEY"const url = 'https://api.amodb.dev/3/collection/10?language=en-US';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const collection = await res.json();
console.log(collection.name);
for (const p of collection.parts) console.log(p.release_date || 'not dated', p.title);import os
import requests
r = requests.get(
"https://api.amodb.dev/3/collection/10",
params={"language": "en-US"},
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
collection = r.json()
print(collection["name"])
for p in collection["parts"]:
print(p.get("release_date") or "not dated", p["title"])<?php
$url = 'https://api.amodb.dev/3/collection/10?language=en-US';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("amodb returned $status");
}
$collection = json_decode($body, true);
echo $collection['name'], PHP_EOL;
foreach ($collection['parts'] as $p) {
echo $p['release_date'] ?: 'not dated', ' ', $p['title'], PHP_EOL;
}package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
"time"
)
type Collection struct {
Name string `json:"name"`
Parts []struct {
Title string `json:"title"`
ReleaseDate string `json:"release_date"`
} `json:"parts"`
}
func main() {
url := "https://api.amodb.dev/3/collection/10?language=en-US"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
client := &http.Client{Timeout: 10 * time.Second}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var c Collection
if err := json.NewDecoder(res.Body).Decode(&c); err != nil {
panic(err)
}
fmt.Println(c.Name)
for _, p := range c.Parts {
date := p.ReleaseDate
if date == "" {
date = "not dated"
}
fmt.Println(date, p.Title)
}
}Параметры
collection_idпутьобязателенЧисловой ID коллекции, например10.api_keyстрока запросаодин из двухВаш ключ. Используйте его или заголовокAuthorization: Bearer.languageстрока запросаОдин из 14 поддерживаемых языков, напримерen-USилиfr-FR. Задает язык названия и описания каждой части. По умолчаниюen-US.
Собственные поля name и overview коллекции возвращаются как хранятся и не зависят от language. У некоторых коллекций они не на английском.
Поля ответа
| Поле | Тип | Примечания |
|---|---|---|
id | целое число | ID коллекции. |
name | строка | Название франшизы. |
overview | строка | Краткое описание. У некоторых коллекций пустое. |
poster_path, backdrop_path | строка или null | Добавьте к https:/. См. API изображений. |
parts | массив | Краткие сведения о фильмах, сначала с самым ранним release_date. |
parts[].id | целое число | ID фильма. Передайте его в сведения о фильме. |
parts[].title, parts[].original_title | строка | Локализованное и оригинальное название. |
parts[].overview | строка | Локализованное описание сюжета. |
parts[].release_date | строка | YYYY-MM-DD или пустая строка для фильма без даты. Такие части идут последними. |
parts[].media_type | строка | В коллекции всегда movie. |
parts[].genre_ids | массив | Числовые ID. Названия берите на странице жанры. |
parts[].adult, parts[].video | логическое | adult всегда равно false, потому что фильмы для взрослых не отдаются. |
parts[].original_ | строка | Двухбуквенный код языка. |
parts[].popularity | число | Показатель популярности. |
parts[].poster_path, parts[].backdrop_path | строка или null | Изображения фильма. |
parts[].vote_average, parts[].vote_count | число, целое число | Сводная оценка пользователей. |
Пример ответа
Показаны две части из девяти.
{
"id": 10,
"name": "Star Wars Collection",
"overview": "An epic space-opera theatrical film series, which depicts the adventures of various cha...",
"poster_path": "/pWVLFh4OuejTpUaDQbB1C4zoS2p.jpg",
"backdrop_path": "/iY2ujEY2m68OTTlPFTiHub9joHS.jpg",
"parts": [
{
"adult": false,
"backdrop_path": "/zqkmTXzjkAgXmEWLRsY4UpTWCeo.jpg",
"genre_ids": [12, 28, 878],
"id": 11,
"original_language": "en",
"original_title": "Star Wars",
"overview": "Princess Leia is captured and held hostage by the evil Imperial forces in their effort...",
"popularity": 70.481,
"poster_path": "/fai0rspsNeJCS69wHNjOdWxcI7P.jpg",
"release_date": "1977-05-25",
"title": "Star Wars",
"video": false,
"vote_average": 8.207,
"vote_count": 23025,
"media_type": "movie"
},
{
"adult": false,
"backdrop_path": "/k9pshruhCpJAdH9RaGJO6jaWQ4X.jpg",
"genre_ids": [12, 28, 878],
"id": 1891,
"original_language": "en",
"original_title": "The Empire Strikes Back",
"overview": "The epic saga continues as Luke Skywalker, in hopes of defeating the evil Galactic Empi...",
"popularity": 29.9034,
"poster_path": "/nNAeTmF4CtdSgMDplXTDPOpYzsX.jpg",
"release_date": "1980-05-20",
"title": "The Empire Strikes Back",
"video": false,
"vote_average": 8.393,
"vote_count": 18990,
"media_type": "movie"
}
]
}Длинные строки на этой странице обрезаны до .... Реальный ответ содержит полный текст.
Как найти коллекцию фильма
С ID коллекции вы начинаете редко. Обычно вы исходите из фильма, а запись сведения о фильме подсказывает, к какой франшизе он относится. Поле belongs_to_collection содержит объект с полями id, name, poster_path и backdrop_path. Для фильма, который не входит во франшизу, например фильма 550, оно равно null.
{
"id": 11,
"title": "Star Wars",
"belongs_to_collection": {
"id": 10,
"name": "Star Wars Collection",
"poster_path": "/pWVLFh4OuejTpUaDQbB1C4zoS2p.jpg",
"backdrop_path": "/iY2ujEY2m68OTTlPFTiHub9joHS.jpg"
}
}Пример ниже проходит по этой ссылке от фильма к его франшизе за два запроса.
const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
async function getJson(path) {
const res = await fetch(`${base}${path}`, { headers });
if (!res.ok) throw new Error(`${path} returned ${res.status}`);
return res.json();
}
const movie = await getJson('/movie/11');
if (movie.belongs_to_collection) {
const collection = await getJson(`/collection/${movie.belongs_to_collection.id}`);
console.log(movie.title, 'is one of', collection.parts.length, 'films in', collection.name);
}Изображения и поиск
Постер и фон франшизы находятся в полях poster_path и backdrop_path записи коллекции. Соберите из них адрес файла так, как описано на странице API изображений. amodb не предоставляет пути / и /, поэтому у коллекции нет списка альтернативных постеров и строк по языкам. Названия частей зависят от параметра language, а пути, которые возвращают строки по языкам, описаны на странице переводы.
Чтобы найти коллекцию по названию, используйте GET /, он описан на странице поиск. Каждый результат содержит поля id, name, overview, poster_path, backdrop_path, original_language, original_name и adult.
Ошибки
| HTTP | status_code | Когда |
|---|---|---|
| 401 | 7 | Ключ отсутствует или неверен. |
| 402 | 36 | Срок действия тарифа закончился. |
| 404 | 34 | Коллекции с таким ID нет, или ID не является числом. |
| 405 | 37 | Вы использовали метод записи на пути коллекции. |
| 429 | 25 | Вы превысили лимит запросов в минуту. Подождите столько секунд, сколько указано в Retry-After. |
Полный список смотрите на странице ошибки, а лимиты тарифов на странице лимиты запросов.
Практические замечания
- Коллекции объединяют только фильмы. У фильма не больше одного объекта
belongs_to_collection, поэтому один фильм соответствует одной франшизе. - Части приходят в порядке выхода. Фильмы с пустой датой идут последними, поэтому подпишите их как «дата пока не указана».
- Запись коллекции кэшируется на edge-серверах на 6 часов, как и другие сведения, поэтому страница франшизы может использовать один ответ все это время.
- Часть содержит только краткие поля. Длительность, актерский состав и рейтинги по каждому фильму запрашивайте через сведения о фильме, когда пользователь его откроет.
- В качестве ключа фильма используйте
parts[].id, а не его позицию во франшизе. Порядок и даты со временем исправляются. - Перед показом проверьте, что
nameна вашем языке интерфейса. У некоторых коллекций название на другом языке, иlanguageего не меняет.