Отримайте всі серії сезону

GET /3/tv/{tv_id}/season/{season_number} повертає сезон із повним масивом episodes. Кожна серія має episode_number, name, overview, air_date, runtime і still_path. Id це числові id, які використовує TMDB, наприклад 1396 для Breaking Bad.

Ви отримуєте сезони, серії з датами й тривалістю, кадри, наступну та останню серії серіалу в ефірі, а також список альтернативних порядків серій. Текстові поля залежать від параметра language, а опис лишається порожнім, якщо перекладу немає.

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

ЕндпоінтЩо повертає
GET /3/tv/{tv_id}Підсумок seasons, number_of_seasons, status, next_episode_to_air, last_episode_to_air
GET /3/tv/{tv_id}/season/{season_number}Один сезон з усіма його episodes
GET /3/tv/{tv_id}/season/{season_number}/episode/{episode_number}Одна серія з crew і guest_stars
GET /3/tv/{tv_id}/episode_groupsНазва, type і кількість серій кожного альтернативного порядку, визначеного для серіалу

Поля серії:

ПолеТипПримітки
id, show_idціле числоId серії та id серіалу. show_id є у списках сезону та в next_episode_to_air, але не на шляху однієї серії
episode_number, season_numberціле числоПозиція в сезоні
episode_typeрядокНаприклад, standard
name, overviewрядокЛокалізуються через language
air_dateрядок або nullYYYY-MM-DD, порожнє або null, якщо не анонсовано
runtimeціле число або nullХвилини
still_pathрядок або nullДодається до https://img.amodb.dev/t/p/{size}
vote_average, vote_countчисло, ціле числоНаразі 0 для серій
production_codeрядокКод студії, часто порожній
crew, guest_starsмасивЛюди, вказані в титрах серії, з тими самими полями, що й учасник акторського складу

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

  1. Оберіть тариф на сторінці ціни. Усі тарифи повертають однакові дані про серії, відрізняється лише кількість запитів.
  2. Створіть ключ у кабінеті акаунта й збережіть його в змінній середовища.
  3. Надішліть запит до /3/tv/{tv_id}/season/1 з ключем у заголовку Bearer або як api_key.

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

Приклад отримує сезон 1 серіалу Breaking Bad (id серіалу 1396) англійською. Програма на Go розбирає його в типізовані структури й виводить по одному рядку на серію з датою виходу, тривалістю та URL кадру.

bashgo
curl -s "https://api.amodb.dev/3/tv/1396/season/1?language=en-US" \
  -H "Authorization: Bearer $AMODB_KEY"
package main

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

type Episode struct {
	EpisodeNumber int     `json:"episode_number"`
	Name          string  `json:"name"`
	AirDate       string  `json:"air_date"`
	Runtime       int     `json:"runtime"`
	StillPath     *string `json:"still_path"`
}

type Season struct {
	Name         string    `json:"name"`
	SeasonNumber int       `json:"season_number"`
	Episodes     []Episode `json:"episodes"`
}

func main() {
	client := &http.Client{Timeout: 10 * time.Second}
	url := "https://api.amodb.dev/3/tv/1396/season/1?language=en-US"
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("amodb returned %s", res.Status))
	}
	var season Season
	if err := json.NewDecoder(res.Body).Decode(&season); err != nil {
		panic(err)
	}
	fmt.Println(season.Name)
	for _, e := range season.Episodes {
		still := "no still"
		if e.StillPath != nil {
			still = "https://img.amodb.dev/t/p/w300" + *e.StillPath
		}
		fmt.Printf("S%02dE%02d  %s  %3d min  %s  %s\n",
			season.SeasonNumber, e.EpisodeNumber, e.AirDate, e.Runtime, e.Name, still)
	}
}

Скорочена відповідь: 2 із 7 серій, у кожної по одному члену знімальної групи та одній запрошеній зірці.

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...",
      "production_code": "",
      "runtime": 59,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/ydlY3iPfeOAvu8gVqrxPoMvzNCn.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "crew": [
        {
          "department": "Camera",
          "job": "Director of Photography",
          "credit_id": "52b7029219c29533d00dd2c1",
          "adult": false,
          "gender": 2,
          "id": 2483,
          "known_for_department": "Camera",
          "name": "约翰·托尔",
          "original_name": "约翰·托尔",
          "popularity": 1.1957,
          "profile_path": "/cfL9A6tC7L5Ps5fq1o3WpVKGMb1.jpg"
        }
      ],
      "guest_stars": [
        {
          "character": "Steven Gomez",
          "credit_id": "5271b489760ee35b3e0881a7",
          "order": 8,
          "adult": false,
          "gender": 2,
          "id": 61535,
          "known_for_department": "Acting",
          "name": "史蒂文·迈克尔·奎扎达",
          "original_name": "史蒂文·迈克尔·奎扎达",
          "popularity": 1.7511,
          "profile_path": "/pVYrDkwI6GWvCNL2kJhpDJfBFyd.jpg"
        }
      ]
    },
    {
      "air_date": "2008-01-27",
      "episode_number": 2,
      "episode_type": "standard",
      "id": 62086,
      "name": "Cat's in the Bag...",
      "overview": "Walt and Jesse attempt to tie up loose ends. The desperate situation gets mor...",
      "production_code": "",
      "runtime": 49,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/AbMoecO0ZZio0LcgeLxlzdyGs6X.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "crew": [
        {
          "department": "Camera",
          "job": "Director of Photography",
          "credit_id": "52b7049c19c2953b63015013",
          "adult": false,
          "gender": 2,
          "id": 17948,
          "known_for_department": "Camera",
          "name": "Reynaldo Villalobos",
          "original_name": "Reynaldo Villalobos",
          "popularity": 0.904,
          "profile_path": "/4YlfhHDRZWhbRgeqT2Bwl1u5p9j.jpg"
        }
      ],
      "guest_stars": [
        {
          "character": "Krazy-8",
          "credit_id": "52725845760ee3046b09426e",
          "order": 504,
          "adult": false,
          "gender": 2,
          "id": 1046460,
          "known_for_department": "Acting",
          "name": "Max Arciniega",
          "original_name": "Max Arciniega",
          "popularity": 1.4399,
          "profile_path": "/eqKAJKPpt41KpsLIkkBnAY4HMAL.jpg"
        }
      ]
    }
  ],
  "name": "Season 1",
  "overview": "High school chemistry teacher Walter White's life is suddenly transformed by...",
  "id": 3572,
  "poster_path": "/91EIXdWxmp2mHNRsSuDW3WyDJLj.jpg",
  "season_number": 1,
  "vote_average": 0
}

Отримайте весь серіал

amodb не приймає значення на кшталт season/1 в append_to_response, тож запити сезонів лишаються окремими. Спершу прочитайте number_of_seasons і список seasons з деталей серіалу, а потім запитайте кожен сезон у циклі.

JavaScript
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');
for (const { season_number } of show.seasons) {
  const season = await get(`/tv/1396/season/${season_number}`);
  console.log(season.name, season.episodes.length);
}

seasons містить сезон 0, коли в серіалу є спеціальні випуски, тож Breaking Bad коштує 1 запит деталей плюс 6 запитів сезонів. Серіал із 10 сезонами коштує 11 запитів. Деталі кешуються на периферії на 6 годин, тож зберігайте результат і оновлюйте його за розкладом.

Дати виходу та що далі

GET /3/tv/{tv_id} містить next_episode_to_air і last_episode_to_air, повні об'єкти серій з name, air_date, season_number, episode_number, runtime і still_path. next_episode_to_air дорівнює null, коли нічого не анонсовано. Поєднайте його зі status (наприклад, Returning Series, Ended або Canceled), щоб вирішити, чи показувати зворотний відлік.

air_date це календарна дата без часу доби. Порівнюйте її з сьогоднішньою датою, щоб позначати нові серії. Для розкладу того, що йде в ефірі, списки airing_today і on_the_air на сторінці списки трендів кешуються на 30 хвилин.

Кадри й тривалість

Використовуйте w185 або w300 для рядків списку й original для повного розміру. Розміри кадрів: w92, w185, w300 і original. У серії може не бути кадру, тож показуйте заглушку, коли still_path дорівнює null. Хост зображень не потребує ключа, дивіться API зображень.

runtime вимірюється в хвилинах і може бути null. Щоб показати час марафону для сезону, додайте runtime по всіх episodes і рахуйте null як 0. Додайте append_to_response=credits,images до шляху однієї серії, щоб отримати об'єкт credits і список stills. Масив cast серії порожній, а люди містяться в crew і guest_stars. Деталі на сторінках сезони та серії і акторський склад і знімальна група.

Альтернативні порядки з групами серій

Деякі серіали дивляться в іншому порядку, ніж вони виходили в ефір. GET /3/tv/{tv_id}/episode_groups перелічує порядки, визначені для серіалу. Кожен запис має id, name, description, type, episode_count, group_count і network. Масив results порожній, якщо жодного не визначено.

typeПорядок
1Оригінальна дата виходу
2Наскрізний
3DVD
4Цифровий
5Сюжетна арка
6Виробничий
7ТБ

amodb повертає лише цей список. Він не надає GET /3/tv/episode_group/{id}, тож серії всередині групи недоступні. Для даних про серії використовуйте ендпоінти сезонів.

Порівняння

МожливістьСкрапінг сторінок серійБезкоштовний API метаданихamodb
Повний сезонОдне завантаження сторінки на сезонДивіться їхню документаціюОдин запит, масив episodes уже включено
Весь серіалОбхід кожного сезонуДивіться їхню документаціюОдин запит на сезон, перелічені в seasons
Дати виходуРозбір текстуДивіться їхню документаціюair_date та next_episode_to_air
КадриЗавантажувати й змінювати розмірДивіться їхню документаціюФіксовані розміри на img.amodb.dev, без ключа
Інші порядки серійНедоступноДивіться їхню документаціюСписок episode_groups, вміст груп не віддається
МовиОдна локаль на сайтДивіться їхню документацію14 мов через language

Ціни

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