API sezoane și episoade TV
Citește un sezon cu fiecare episod la GET /3/tv/{series_id}/season/{season_number} sau un singur episod cu un nivel mai adânc. JSON-ul se potrivește cu TMDB v3 cu air_date, episode_number, runtime și still_path. Fiecare episod poartă crew și guest_stars, sezonul 0 conține episoadele speciale, iar append_to_response adaugă credite, imagini și videoclipuri.
Obține un sezon
GET / întoarce un sezon și array-ul lui complet episodes într-un singur răspuns. Numerele de sezon încep de la 1, iar 0 este rezervat pentru episoadele speciale. Ia ID-ul serialului și numerele de sezon din fișa seriale TV.
Exemplul citește sezonul 1 din Breaking Bad. Codul afișează câte o linie pe episod.
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)
}
}Parametri
series_idcaleobligatoriuID numeric de TV, de exemplu1396.season_numbercaleobligatoriuNumăr întreg de sezon.0întoarce episoadele speciale.api_keyinterogareuna dintre cele douăCheia ta. Folosește-o pe aceasta sau antetulAuthorization: Bearer.languageinterogareEtichetă TMDB precumen-USsaufr-FR. Sunt servite 14 limbi de bază. Impliciten-US.append_to_responseinterogareValori la nivel de sezon:credits,external_ids,images,videos. Alte nume sunt ignorate.
Câmpurile răspunsului
| Câmp | Tip | Observații |
|---|---|---|
id, season_number | număr întreg | ID-ul sezonului și numărul lui în serial. |
name, overview | șir | Text localizat, gol când nu există traducere. |
air_date | șir sau null | Data primului episod, YYYY-MM-DD. |
poster_path | șir sau null | Se adaugă la https:/. |
vote_average | număr | Scorul agregat al utilizatorilor pentru sezon. |
episodes | array | Fiecare episod, cu câmpurile listate în secțiunea următoare. |
Exemplu de răspuns
GET /. Sezonul are 7 episoade, deci episodes este tăiat la o intrare, iar array-urile crew și guest_stars ale acelei intrări sunt omise:
{
"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
}Fiecare episod din răspunsul de sezon poartă și array-urile crew și guest_stars, cu structura de intrare descrisă la credite. runtime poate fi null pentru un episod nedifuzat.
Obține un episod
GET / întoarce un episod. Răspunsul de sezon conține deja fiecare episod cu crew și guest_stars, deci folosește acest endpoint ca să reîmprospătezi o singură înregistrare fără să reîncarci sezonul. Acceptă language și append_to_response cu credits, external_ids, images, translations și videos. O cerere precum / costă o cerere.
| Câmp | Tip | Observații |
|---|---|---|
id | număr întreg | ID-ul episodului. |
show_id | număr întreg | ID-ul serialului. Prezent în răspunsul de sezon și în pointerii de serial, nu în răspunsul pentru un singur episod. |
season_number, episode_number | număr întreg | Poziția în serial. Folosește-le ca să construiești calea cererii. |
name, overview | șir | Text localizat. |
air_date | șir sau null | Doar data, fără oră sau fus orar. Null când nu e programat. |
episode_type | șir | standard pentru episoadele obișnuite. Ca să identifici un final, compară episode_number cu episode_count al acelui sezon din fișa serialului. |
runtime | număr întreg sau null | Minute. |
production_code | șir | Cod de studio, adesea gol. |
still_path | șir sau null | Cadrul episodului. Folosește w300 sau original de la https:/. |
vote_average, vote_count | număr, număr întreg | Scorul agregat al utilizatorilor. |
crew, guest_stars | array | Creditele acestui episod, vezi credite. |
Următorul și ultimul episod din fișa serialului
Endpoint-ul de serial întoarce next_episode_to_air și last_episode_to_air. Fiecare este un rezumat de episod cu câmpurile de mai sus, plus show_id și fără crew și guest_stars. Următorul este null pentru serialele încheiate și pentru cele care revin fără o dată confirmată. Exemplul citește South Park, un serial care revine.
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');Pentru o numărătoare inversă, compară air_date cu data locală a spectatorului. Valoarea nu poartă ora zilei, deci arată o dată și nu o oră de ceas.
Sub-resurse de sezon și de episod
Căile de sezon și de episod au propriile sub-resurse. Câteva dintre ele întorc azi date goale.
| Metodă și cale | Întoarce |
|---|---|
GET / | id, cast și crew pentru sezon |
GET / | id și un array posters gol |
GET / | id și un array results gol |
GET / | id plus tvdb_id, wikidata_id și alte ID-uri, toate null |
GET / | id și un array translations gol |
GET .../ | id, un cast gol, crew și guest_stars |
GET .../ | id și un array stills cu cadrul episodului |
GET .../ | id și un array results gol |
GET .../ | id plus imdb_id, tvdb_id și alte ID-uri, toate null |
GET .../ | id și un array translations cu nume și descriere pe limbă |
Creditele de sezon și de episod sunt tratate la credite, iar cadrele la imagini. amodb nu oferă căile TMDB changes sau un endpoint pentru episoadele unui grup de episoade.
Erori
| HTTP | status_code | Când |
|---|---|---|
| 401 | 7 | Cheia lipsește sau este greșită. |
| 402 | 36 | Perioada planului s-a încheiat. |
| 404 | 34 | Serialul, sezonul sau episodul nu există, de exemplu sezonul 0 la un serial fără episoade speciale, sau calea nu este oferită. |
| 405 | 37 | Ai apelat o metodă de scriere. |
| 429 | 25 | Ai depășit cererile pe minut. Așteaptă numărul de secunde din Retry-After. |
Vezi erori pentru formatul complet al corpului și limite de cereri pentru ferestre.
Note practice
- Sezoanele și episoadele sunt ținute în cache 6 ore. Recitește sezonul curent o dată sau de două ori pe zi cât timp se difuzează serialul.
- Un serial cu 10 sezoane cere 10 apeluri de sezon. Pe planul de 20 de cereri pe minut asta folosește jumătate din alocarea unui minut, iar o rulare repetată în 6 ore este servită din cache-ul la margine.
- Un episod nedifuzat poate avea
air_datenull,runtimenull șioverviewgol. Afișează un substituent în loc să eșuezi. - Cadrele sunt imagini late, nu postere. Cere
w300pentru liste șioriginaldoar când ai nevoie de o vizualizare la dimensiune completă.