API sezón a epizod seriálů

Jednu sezónu se všemi epizodami načtete přes GET /3/tv/{series_id}/season/{season_number} a jednu epizodu o úroveň hlouběji. JSON odpovídá TMDB v3 s air_date, episode_number, runtime a still_path. Každá epizoda nese crew a guest_stars, sezóna 0 obsahuje speciály a append_to_response přidává credits, images a videos.

Aktualizováno Zobrazit jako Markdown

Získání sezóny

GET /3/tv/{series_id}/season/{season_number} vrací jednu sezónu a její celé pole episodes v jedné odpovědi. Čísla sezón začínají od 1 a 0 je vyhrazena pro speciály. ID seriálu a čísla sezón vezměte ze záznamu seriály.

Příklad načte sezónu 1 seriálu Breaking Bad. Kód vypíše jeden řádek na epizodu.

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)
	}
}

Parametry

  • series_idpathpovinný
    Číselné ID seriálu, například 1396.
  • season_numberpathpovinný
    Celé číslo sezóny. 0 vrací speciály.
  • api_keyqueryjeden ze dvou
    Váš klíč. Použijte jej, nebo hlavičku Authorization: Bearer.
  • languagequery
    Tag TMDB, například en-US nebo fr-FR. Podporuje se 14 základních jazyků. Výchozí en-US.
  • append_to_responsequery
    Hodnoty na úrovni sezóny: credits, external_ids, images, videos. Jiné názvy se ignorují.

Pole odpovědi

PoleTypPoznámky
id, season_numberintegerID sezóny a její číslo v seriálu.
name, overviewstringLokalizovaný text, prázdný, když překlad neexistuje.
air_datestring nebo nullDatum první epizody, YYYY-MM-DD.
poster_pathstring nebo nullPřipojte k https://img.amodb.dev/t/p/{size}.
vote_averagenumberSouhrnné skóre uživatelů pro sezónu.
episodesarrayKaždá epizoda, s poli uvedenými v další části.

Příklad odpovědi

GET /3/tv/1396/season/1?language=en-US. Sezóna má 7 epizod, takže episodes je zkráceno na jednu položku a pole crew a guest_stars této položky jsou vynechána:

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
}

Každá epizoda v odpovědi sezóny nese také pole crew a guest_stars s tvarem položky popsaným na stránce obsazení a štáb. runtime může být u neodvysílané epizody null.

Získání epizody

GET /3/tv/{series_id}/season/{season_number}/episode/{episode_number} vrací jednu epizodu. Odpověď sezóny už obsahuje všechny epizody s crew a guest_stars, proto tento endpoint použijte k obnovení jednoho záznamu bez opětovného načtení sezóny. Přijímá language a append_to_response s credits, external_ids, images, translations a videos. Požadavek jako /3/tv/1396/season/1/episode/1?append_to_response=credits stojí jeden požadavek.

PoleTypPoznámky
idintegerID epizody.
show_idintegerID seriálu. Je v odpovědi sezóny a v odkazech seriálu, ne v odpovědi jedné epizody.
season_number, episode_numberintegerPozice v seriálu. Použijte je k sestavení cesty požadavku.
name, overviewstringLokalizovaný text.
air_datestring nebo nullJen datum, bez času a časového pásma. Null, když není naplánováno.
episode_typestringstandard u běžných epizod. Finále poznáte porovnáním episode_number s episode_count dané sezóny v záznamu seriálu.
runtimeinteger nebo nullMinuty.
production_codestringKód studia, často prázdný.
still_pathstring nebo nullZáběr epizody. Použijte w300 nebo original z https://img.amodb.dev/t/p/{size}.
vote_average, vote_countnumber, integerSouhrnné skóre uživatelů.
crew, guest_starsarrayZáznamy účasti u této epizody, viz obsazení a štáb.

Další a poslední epizoda v záznamu seriálu

Endpoint seriálu vrací next_episode_to_air a last_episode_to_air. Každý je souhrn epizody s výše uvedenými poli, plus show_id a bez crew a guest_stars. Další je null u skončených seriálů a u pokračujících seriálů bez potvrzeného data. Ukázka čte South Park, pokračující seriál.

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');

Pro odpočet porovnejte air_date s místním datem diváka. Hodnota nenese denní dobu, zobrazte proto datum, ne čas na hodinách.

Dílčí zdroje sezón a epizod

Cesty sezón a epizod mají vlastní dílčí zdroje. Několik z nich dnes vrací prázdná data.

Metoda a cestaVrací
GET /tv/{series_id}/season/{season_number}/creditsid, cast a crew sezóny
GET /tv/{series_id}/season/{season_number}/imagesid a prázdné pole posters
GET /tv/{series_id}/season/{season_number}/videosid a prázdné pole results
GET /tv/{series_id}/season/{season_number}/external_idsid plus tvdb_id, wikidata_id a další ID, všechna null
GET /tv/{series_id}/season/{season_number}/translationsid a prázdné pole translations
GET .../episode/{episode_number}/creditsid, prázdné cast, crew a guest_stars
GET .../episode/{episode_number}/imagesid a pole stills se záběrem epizody
GET .../episode/{episode_number}/videosid a prázdné pole results
GET .../episode/{episode_number}/external_idsid plus imdb_id, tvdb_id a další ID, všechna null
GET .../episode/{episode_number}/translationsid a pole translations s názvem a popisem pro každý jazyk

Obsazení sezón a epizod pokrývá stránka obsazení a štáb a záběry stránka obrázky. amodb nenabízí cesty changes z TMDB ani endpoint pro epizody jedné skupiny epizod.

Chyby

HTTPstatus_codeKdy
4017Klíč chybí nebo je nesprávný.
40236Platnost tarifu skončila.
40434Seriál, sezóna nebo epizoda neexistuje, například sezóna 0 u seriálu bez speciálů, nebo cesta, která se nenabízí.
40537Zavolali jste metodu pro zápis.
42925Překročen počet požadavků za minutu. Počkejte tolik sekund, kolik říká Retry-After.

Úplný formát těla viz chyby a okna viz limity požadavků.

Praktické poznámky

  • Sezóny a epizody se cachují 6 hodin. Aktuální sezónu načtěte znovu jednou nebo dvakrát denně, dokud se seriál vysílá.
  • Seriál o 10 sezónách potřebuje 10 volání sezón. V tarifu s 20 požadavky za minutu to spotřebuje polovinu minutového limitu a opakovaný běh do 6 hodin se obslouží z cache na edge.
  • Neodvysílaná epizoda může mít air_date null, runtime null a prázdný overview. Vykreslete zástupný text místo selhání.
  • Záběry jsou široké snímky, ne plakáty. Pro seznamy žádejte w300 a original jen pro zobrazení v plné velikosti.