API сезонів і серій серіалів

Читайте один сезон з усіма серіями за GET /3/tv/{series_id}/season/{season_number} або одну серію на рівень глибше. JSON відповідає TMDB v3 з air_date, episode_number, runtime і still_path. Кожна серія містить crew і guest_stars, сезон 0 зберігає спеціальні випуски, а append_to_response додає credits, images та videos.

Оновлено Відкрити в Markdown

Отримання сезону

GET /3/tv/{series_id}/season/{season_number} повертає один сезон і повний масив episodes в одній відповіді. Номери сезонів починаються з 1, а 0 зарезервовано для спеціальних випусків. Беріть id серіалу та номери сезонів у розділі серіали.

Приклад читає сезон 1 серіалу Breaking Bad. Код виводить по одному рядку на серію.

bashjspyphpgo
curl -sSf "https://api.amodb.dev/3/tv/1396/season/1?language=en-US" \
  -H "Authorization: Bearer $AMODB_KEY"
const url = 'https://api.amodb.dev/3/tv/1396/season/1?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 season = await res.json();
for (const ep of season.episodes) {
  console.log(String(ep.episode_number).padStart(2, '0'), ep.name, ep.air_date, `${ep.runtime ?? '?'} min`);
}
import os
import requests

r = requests.get(
    "https://api.amodb.dev/3/tv/1396/season/1",
    params={"language": "en-US"},
    headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
    timeout=10,
)
r.raise_for_status()
season = r.json()
for ep in season["episodes"]:
    print(f"{ep['episode_number']:02d}", ep["name"], ep["air_date"], ep["runtime"] or "?")
<?php
$url = 'https://api.amodb.dev/3/tv/1396/season/1?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");
}
$season = json_decode($body, true);
foreach ($season['episodes'] as $ep) {
    printf("%02d %s %s\n", $ep['episode_number'], $ep['name'], $ep['air_date']);
}
package main

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

type Season struct {
	Name     string `json:"name"`
	Episodes []struct {
		EpisodeNumber int    `json:"episode_number"`
		Name          string `json:"name"`
		AirDate       string `json:"air_date"`
		Runtime       int    `json:"runtime"`
	} `json:"episodes"`
}

func main() {
	req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/tv/1396/season/1?language=en-US", 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 s Season
	if err := json.NewDecoder(res.Body).Decode(&s); err != nil {
		panic(err)
	}
	for _, e := range s.Episodes {
		fmt.Printf("%02d %s %s %d min\n", e.EpisodeNumber, e.Name, e.AirDate, e.Runtime)
	}
}

Параметри

  • series_idшляхобов'язковий
    Числовий id серіалу, наприклад 1396.
  • season_numberшляхобов'язковий
    Номер сезону, ціле число. 0 повертає спеціальні випуски.
  • api_keyqueryодин із двох
    Ваш ключ. Використовуйте його або заголовок Authorization: Bearer.
  • languagequery
    Тег TMDB, наприклад en-US або fr-FR. Обслуговується 14 базових мов. За замовчуванням en-US.
  • append_to_responsequery
    Значення рівня сезону: credits, external_ids, images, videos. Інші назви ігноруються.

Поля відповіді

ПолеТипПримітки
id, season_numberціле числоID сезону та його номер у серіалі.
name, overviewрядокЛокалізований текст, порожній, якщо перекладу немає.
air_dateрядок або nullДата першої серії, YYYY-MM-DD.
poster_pathрядок або nullДодайте до https://img.amodb.dev/t/p/{size}.
vote_averageчислоАгрегована оцінка користувачів для сезону.
episodesмасивКожна серія з полями, перелічених у наступному розділі.

Приклад відповіді

GET /3/tv/1396/season/1?language=en-US. У сезоні 7 серій, тому episodes скорочено до одного запису, а масиви crew і guest_stars цього запису пропущено:

JSON
{
  "air_date": "2008-01-20",
  "episodes": [
    {
      "air_date": "2008-01-20",
      "episode_number": 1,
      "episode_type": "standard",
      "id": 62085,
      "name": "Pilot",
      "overview": "When an unassuming high school chemistry teacher discovers he has a rare form of lung cancer, he decides to...",
      "production_code": "",
      "runtime": 59,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/ydlY3iPfeOAvu8gVqrxPoMvzNCn.jpg",
      "vote_average": 0,
      "vote_count": 0
    }
  ],
  "name": "Season 1",
  "overview": "High school chemistry teacher Walter White's life is suddenly transformed by a dire medical diagnosis. Stre...",
  "id": 3572,
  "poster_path": "/91EIXdWxmp2mHNRsSuDW3WyDJLj.jpg",
  "season_number": 1,
  "vote_average": 0
}

Кожна серія у відповіді сезону також містить масиви crew і guest_stars зі структурою запису, описаною в розділі акторський склад і знімальна група. runtime може бути null для серії, що ще не вийшла.

Отримання серії

GET /3/tv/{series_id}/season/{season_number}/episode/{episode_number} повертає одну серію. Відповідь сезону вже містить кожну серію з crew і guest_stars, тож використовуйте цей ендпоінт, щоб оновити один запис без перезавантаження сезону. Він приймає language та append_to_response зі значеннями credits, external_ids, images, translations і videos. Запит /3/tv/1396/season/1/episode/1?append_to_response=credits коштує один запит.

ПолеТипПримітки
idціле числоID серії.
show_idціле числоID серіалу. Присутнє у відповіді сезону та в покажчиках серіалу, але не у відповіді однієї серії.
season_number, episode_numberціле числоПозиція в серіалі. Використовуйте їх для побудови шляху запиту.
name, overviewрядокЛокалізований текст.
air_dateрядок або nullЛише дата, без часу й часового поясу. Null, якщо не заплановано.
episode_typeрядокstandard для звичайних серій. Щоб виявити фінал, порівняйте episode_number з episode_count цього сезону в записі серіалу.
runtimeціле число або nullХвилини.
production_codeрядокКод студії, часто порожній.
still_pathрядок або nullКадр серії. Використовуйте w300 або original з https://img.amodb.dev/t/p/{size}.
vote_average, vote_countчисло, ціле числоАгрегована оцінка користувачів.
crew, guest_starsмасивСклад цієї серії, див. акторський склад і знімальна група.

Наступна й остання серія в записі серіалу

Ендпоінт серіалу повертає next_episode_to_air і last_episode_to_air. Кожне з них це короткий опис серії з наведеними вище полями, плюс show_id і без crew та guest_stars. Наступна серія дорівнює null для завершених серіалів і для тих, що тривають, але без підтвердженої дати. Приклад читає South Park, серіал, що триває.

JavaScript
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };
const res = await fetch('https://api.amodb.dev/3/tv/2190', { headers });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const next = (await res.json()).next_episode_to_air;
console.log(next ? `Next: S${next.season_number}E${next.episode_number} on ${next.air_date}` : 'No upcoming episode');

Для зворотного відліку порівняйте air_date з місцевою датою глядача. Значення не містить часу доби, тому показуйте дату, а не години й хвилини.

Підресурси сезону та серії

Шляхи сезону й серії мають власні підресурси. Кілька з них сьогодні повертають порожні дані.

Метод і шляхПовертає
GET /tv/{series_id}/season/{season_number}/creditsid, cast і crew для сезону
GET /tv/{series_id}/season/{season_number}/imagesid і порожній масив posters
GET /tv/{series_id}/season/{season_number}/videosid і порожній масив results
GET /tv/{series_id}/season/{season_number}/external_idsid плюс tvdb_id, wikidata_id та інші id, усі null
GET /tv/{series_id}/season/{season_number}/translationsid і порожній масив translations
GET .../episode/{episode_number}/creditsid, порожній cast, crew і guest_stars
GET .../episode/{episode_number}/imagesid і масив stills з кадром серії
GET .../episode/{episode_number}/videosid і порожній масив results
GET .../episode/{episode_number}/external_idsid плюс imdb_id, tvdb_id та інші id, усі null
GET .../episode/{episode_number}/translationsid і масив translations з назвою та описом для кожної мови

Склад сезону й серії описано в розділі акторський склад і знімальна група, а кадри в розділі API зображень. amodb не пропонує шляхів TMDB changes та ендпоінта для серій однієї групи серій.

Помилки

HTTPstatus_codeКоли
4017Ключ відсутній або хибний.
40236Термін дії тарифу закінчився.
40434Серіалу, сезону чи серії не існує, наприклад сезон 0 у серіалі без спеціальних випусків, або шлях не пропонується.
40537Ви викликали метод запису.
42925Перевищено ліміт запитів на хвилину. Зачекайте стільки секунд, скільки вказано в Retry-After.

Повний формат тіла дивіться в розділі помилки, а вікна ліміту в розділі ліміти запитів.

Практичні нотатки

  • Сезони й серії кешуються на 6 годин. Перечитуйте поточний сезон раз-два на день, поки серіал виходить.
  • Серіал із 10 сезонів потребує 10 викликів сезону. На тарифі з 20 запитами на хвилину це половина дозволу однієї хвилини, а повторний запуск протягом 6 годин обслуговується з кешу edge.
  • Серія, що ще не вийшла, може мати null у air_date, null у runtime і порожній overview. Показуйте заглушку замість збою.
  • Кадри це широкі зображення, а не постери. Просіть w300 для списків і original лише тоді, коли потрібен повний розмір.