API сериалов со статусом, сезонами и следующей серией
GET /3/tv/{series_id} возвращает сериал с полями status, networks, списком seasons, last_episode_to_air и next_episode_to_air. Эндпоинты сезонов и серий добавляют даты выхода, продолжительность и кадры. amodb является независимым API, работающим по протоколу TMDB v3, поэтому клиент, написанный для TMDB, заработает после смены базового URL на https:/.
Что вы получаете:
- Записи сериалов с числом сезонов и серий, а также датами первого и последнего выхода.
- Строка
statusи флагin_production. - Телесети с ID, логотипами и страной происхождения.
- Один запрос на сезон, который возвращает все серии этого сезона.
- Списки сериалов, которые выходят сегодня или в ближайшие 7 дней.
Какие данные вы получаете
| Что нужно | Запрос | Ключевые поля |
|---|---|---|
| Запись сериала | GET /3/tv/{series_id} | name, original_name, status, in_production, number_of_seasons, number_of_episodes |
| Следующая и последняя серия | тот же запрос | next_episode_to_air, last_episode_to_air |
| Один сезон | GET / | episodes, air_date, poster_path |
| Одна серия | GET / | name, overview, runtime, still_path, air_date |
| Телесеть | GET / | name, headquarters, origin_country |
Полные списки полей приведены на страницах сериалы и сезоны и серии.
Начало работы за 3 шага
- Откройте страницу цены и выберите тариф с нужной частотой запросов: 20, 40 или 120 в минуту.
- Создайте ключ API в личном кабинете.
- Отправьте
GET /3/tv/{series_id}с заголовкомAuthorization: Bearer YOUR_или добавьтеAPI_ KEY api_keyкак параметр запроса.
Пример запроса
Скрипт читает Breaking Bad (ID сериала 1396), печатает его статус и следующую серию, затем выводит список серий сезона 1. Сохраните его как check.mjs и запустите на Node 18 или новее.
curl -s "https://api.amodb.dev/3/tv/1396?language=en-US&append_to_response=ratings" \
-H "Authorization: Bearer $AMODB_KEY"
curl -s "https://api.amodb.dev/3/tv/1396/season/1?language=en-US" \
-H "Authorization: Bearer $AMODB_KEY"const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
async function get(path) {
const res = await fetch(`${base}${path}`, { headers });
if (!res.ok) throw new Error(`amodb returned ${res.status} for ${path}`);
return res.json();
}
const show = await get('/tv/1396?language=en-US');
const next = show.next_episode_to_air;
console.log(`${show.name}: ${show.status}, ${show.number_of_seasons} seasons`);
console.log(next
? `Next: S${next.season_number}E${next.episode_number} on ${next.air_date}`
: 'No upcoming episode is scheduled');
const season = await get('/tv/1396/season/1?language=en-US');
for (const ep of season.episodes) {
console.log(`E${ep.episode_number} ${ep.air_date} ${ep.name}`);
}Сокращенный ответ по сериалу для language=en-US. Оставлены только некоторые поля, а seasons показывает первые 2 из 6 записей. Некоторые названия в этих данных не следуют параметру language: название сезона 0 на китайском, а name внутри last_episode_to_air на иврите.
{
"first_air_date": "2008-01-20",
"id": 1396,
"in_production": false,
"last_air_date": "2013-09-29",
"last_episode_to_air": {
"air_date": "2013-09-29",
"episode_number": 16,
"episode_type": "standard",
"id": 62161,
"name": "פלינה",
"overview": "הסדרה זוכת הפרסים מגיעה לסיום דרמתי בפרק החותם אותה.",
"production_code": "",
"runtime": 56,
"season_number": 5,
"show_id": 1396,
"still_path": "/pA0YwyhvdDXP3BEGL2grrIhq8aM.jpg",
"vote_average": 0,
"vote_count": 0
},
"name": "Breaking Bad",
"next_episode_to_air": null,
"number_of_episodes": 62,
"number_of_seasons": 5,
"original_name": "Breaking Bad",
"seasons": [
{
"air_date": "2009-02-17",
"episode_count": 9,
"id": 3577,
"name": "特别篇",
"overview": "",
"poster_path": "/ikBSCmgG5Z4jequUUAjKpf1QG3T.jpg",
"season_number": 0,
"vote_average": 0
},
{
"air_date": "2008-01-20",
"episode_count": 7,
"id": 3572,
"name": "Season 1",
"overview": "High school chemistry teacher Walter White's life is suddenly transformed by a dire medical diagn...",
"poster_path": "/91EIXdWxmp2mHNRsSuDW3WyDJLj.jpg",
"season_number": 1,
"vote_average": 0
}
],
"status": "Ended"
}Как читать статус и следующую серию
Строка status подсказывает, какую пометку дать сериалу. next_episode_to_air является объектом только пока серия запланирована, поэтому между сезонами он равен null, как и после окончания показа. Проверяйте status, прежде чем показывать «завершен».
status | Значение | Что показывать |
|---|---|---|
| Returning Series | Ожидаются новые серии | Дату выхода следующей серии, если объект есть, иначе «продолжается» |
| In Production | Снимается, пока не в эфире | «В производстве» |
| Planned | Только анонсирован | «Запланирован» |
| Pilot | Существует только пилот | «Пилот» |
| Ended | Показ завершен | «Завершен» и last_air_date |
| Canceled | Остановлен до запланированного конца | «Отменен» |
Поля внутри next_episode_to_air и last_episode_to_air: air_date, season_number, episode_number, episode_type, id, show_id, name, overview, runtime и still_path. Строка status у нескольких тайтлов может быть пустой, поэтому держите наготове нейтральную пометку.
Детали хранятся в edge-кэше 6 часов, поэтому повторные запросы одного сериала чаще четырех раз в сутки возвращают то же тело ответа. Опрашивайте отслеживаемые сериалы один или два раза в сутки и обновляйте тот, который открыл пользователь.
Сезоны, серии и то, что идет в эфире
Сезон 0, если он есть у сериала, содержит спецвыпуски. Обычные сезоны начинаются с 1.
| Запрос | Что возвращает | Параметры |
|---|---|---|
GET / | Запись сезона с массивом episodes | language, append_to_response |
GET /3/tv/airing_today | Сериалы с серией в эфире сегодня | page, language |
GET /3/tv/on_the_air | Сериалы, выходящие в ближайшую неделю | page, language |
GET /3/discover/tv | Сериалы, отфильтрованные по телесети, статусу и другим признакам | with_networks, with_status, sort_by, page |
Списки и результаты discover хранятся в кэше 30 минут, поэтому одного запроса в полчаса хватает для значка «скоро в эфире». Сопоставьте возвращенные ID с сериалами, на которые подписаны ваши пользователи. Подробности о сезонах и сериях описаны на странице гид по сериям.
Список отслеживаемых сериалов с обратным отсчетом
Экрану «мои сериалы» нужен один сохраненный ID на сериал и небольшая ежедневная задача.
- Сохраните
idсериала, когда пользователь подписывается на него. - Раз в сутки вызывайте
/3/tv/{series_id}для каждого отслеживаемого ID и сохраняйтеstatus,next_episode_to_airиlast_air_date. - Когда
next_episode_to_airявляется объектом, показывайтеair_dateкак дату. В ней нет ни времени суток, ни часового пояса, поэтому не ведите обратный отсчет до минуты. - Когда он равен null, а
statusравен Returning Series, показывайте «новый сезон не запланирован». - Запрашивайте сезон только когда пользователь открывает сериал, потому что это самый большой ответ.
Ответ 404 со status_code 34 означает, что ID неизвестен, а ответ 429 означает превышение лимита запросов в минуту: подождите Retry-After секунд. При 200 отслеживаемых сериалах один ежедневный проход составляет 200 запросов, то есть около десяти минут при 20 запросах в минуту. См. лимиты запросов и ошибки.
Сравнение
| Возможность | Парсинг страниц самостоятельно | API метаданных с бесплатным тарифом | amodb |
|---|---|---|---|
| Структура сезонов и серий | Восстанавливается по верстке страниц | По-разному, смотрите документацию | Запрос сезона с массивом episodes |
| Дата следующей серии | Разбирается со страницы расписания | По-разному, смотрите документацию | next_episode_to_air, null, если ничего не запланировано |
| Статус сериала | Произвольный текст на странице | По-разному, смотрите документацию | Строка status и флаг in_production |
| Эфир на этой неделе | Парсить расписание | По-разному, смотрите документацию | /3/tv/on_the_air и /3/tv/airing_today |
| Языки | Какие есть на странице | По-разному | 14, выбираются через language |
| Условия доступа | Действуют условия сайта | Бесплатный тариф с условиями использования | Платно, по предоплате, без бесплатного тарифа |
Цены
Платите один раз за 1, 3, 6, 12 или 24 месяца. Более длинные периоды дают скидку 10, 20, 30 или 40 процентов, автоматического продления нет. Любой тариф получает все данные о сериалах, а отличаются тарифы только лимитом в 20, 40 или 120 запросов в минуту. См. цены, создайте ключ, и ваш первый вызов по сериалу обойдется в один запрос.