Pobieranie wszystkich odcinków sezonu
GET / zwraca sezon z pełną tablicą episodes. Każdy odcinek ma episode_number, name, overview, air_date, runtime i still_path. ID to numeryczne ID używane przez TMDB, na przykład 1396 dla Breaking Bad.
Dostajesz sezony, odcinki z datami i czasem trwania, kadry, następny i ostatni wyemitowany odcinek serialu oraz listę alternatywnych układów odcinków. Pola tekstowe zależą od parametru language, a opis pozostaje pusty, gdy tłumaczenie nie istnieje.
Jakie dane dostajesz
| Endpoint | Zwraca |
|---|---|
GET /3/tv/{tv_id} | Podsumowanie seasons, number_of_seasons, status, next_episode_to_air, last_episode_to_air |
GET / | Jeden sezon ze wszystkimi episodes |
GET / | Jeden odcinek z crew i guest_stars |
GET / | Nazwa, type i liczba odcinków każdego alternatywnego układu zdefiniowanego dla serialu |
Pola odcinka:
| Pole | Typ | Uwagi |
|---|---|---|
id, show_id | integer | ID odcinka i ID serialu. show_id jest na listach sezonów i w next_episode_to_air, nie na ścieżce pojedynczego odcinka |
episode_number, season_number | integer | Pozycja w sezonie |
episode_type | string | Na przykład standard |
name, overview | string | Lokalizowane przez language |
air_date | string lub null | YYYY-MM-DD, puste lub null, gdy nie ogłoszono |
runtime | integer lub null | Minuty |
still_path | string lub null | Dołącz do https:/ |
vote_average, vote_count | number, integer | Obecnie 0 w odcinkach |
production_code | string | Kod studia, często pusty |
crew, guest_stars | array | Osoby wymienione przy odcinku, z tymi samymi polami co członek obsady |
Start w 3 krokach
- Wybierz plan na stronie cennik. Wszystkie plany zwracają te same dane odcinków, a różni się tylko tempo żądań.
- Utwórz klucz w panelu konta i zapisz go w zmiennej środowiskowej.
- Wywołaj
/3/tv/{tv_id}/season/1z kluczem w nagłówku Bearer albo wapi_key.
Przykładowe żądanie
Przykład pobiera sezon 1 serialu Breaking Bad (ID serialu 1396) po angielsku. Program w Go dekoduje go do typowanych struktur i wypisuje jeden wiersz na odcinek z datą emisji, czasem trwania i URL kadru.
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)
}
}Przycięta odpowiedź: 2 z 7 odcinków, w każdym jeden członek ekipy i jeden gościnny aktor.
{
"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
}Pobieranie całego serialu
amodb nie przyjmuje wartości w stylu season/1 w append_to_response, więc wywołania sezonów pozostają osobne. Najpierw odczytaj number_of_seasons i listę seasons ze szczegółów serialu, potem pobieraj każdy sezon w pętli.
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 zawiera sezon 0, gdy serial ma odcinki specjalne, więc Breaking Bad kosztuje 1 wywołanie szczegółów plus 6 wywołań sezonów. Serial z 10 sezonami kosztuje 11 żądań. Szczegóły są w cache na edge przez 6 godzin, więc zapisz wynik i odświeżaj go według harmonogramu.
Daty emisji i co dalej
GET /3/tv/{tv_id} zawiera next_episode_to_air i last_episode_to_air, pełne obiekty odcinków z name, air_date, season_number, episode_number, runtime i still_path. next_episode_to_air to null, gdy nic nie ogłoszono. Połącz go ze status (na przykład Returning Series, Ended lub Canceled), by zdecydować, czy pokazać odliczanie.
air_date to data kalendarzowa bez pory dnia. Porównaj ją z dzisiejszą datą, aby oznaczyć nowe odcinki. Do ramówki tego, co jest emitowane, listy airing_today i on_the_air na stronie trendy i listy są w cache przez 30 minut.
Kadry i czas trwania
Użyj w185 lub w300 dla wierszy listy i original dla pełnego rozmiaru. Rozmiary kadrów to w92, w185, w300 i original. Odcinek może nie mieć kadru, więc gdy still_path to null, wyświetl obraz zastępczy. Host obrazów nie wymaga klucza, zobacz obrazy.
runtime jest w minutach i może być null. Aby pokazać czas maratonu sezonu, zsumuj runtime po episodes i licz null jako 0. Dodaj append_ do ścieżki pojedynczego odcinka, aby dostać obiekt credits i listę stills. Tablica cast odcinka jest pusta, a osoby są w crew i guest_stars. Szczegóły są na stronach sezony i odcinki oraz obsada i ekipa.
Alternatywne układy z grupami odcinków
Niektóre seriale ogląda się w innej kolejności, niż były emitowane. GET / wypisuje układy zdefiniowane dla serialu. Każda pozycja ma id, name, description, type, episode_count, group_count i network. Tablica results jest pusta, gdy żadnych nie zdefiniowano.
type | Układ |
|---|---|
| 1 | Oryginalna data emisji |
| 2 | Absolutny |
| 3 | DVD |
| 4 | Cyfrowy |
| 5 | Wątek fabularny |
| 6 | Produkcyjny |
| 7 | TV |
amodb zwraca tylko tę listę. Nie udostępnia GET /, więc odcinki wewnątrz grupy nie są dostępne. Dane odcinków czytaj z endpointów sezonów.
Jak wypada w porównaniu
| Możliwość | Scraping stron odcinków | API metadanych z darmowym planem | amodb |
|---|---|---|---|
| Cały sezon | Pobranie jednej strony na sezon | Sprawdź ich dokumentację | Jedno wywołanie, tablica episodes w środku |
| Cały serial | Przejść każdy sezon | Sprawdź ich dokumentację | Jedno wywołanie na sezon, wymienione w seasons |
| Daty emisji | Parsować tekst | Sprawdź ich dokumentację | air_date plus next_episode_to_air |
| Kadry | Pobierać i zmniejszać | Sprawdź ich dokumentację | Stałe rozmiary na img.amodb.dev, bez klucza |
| Inne układy odcinków | Niedostępne | Sprawdź ich dokumentację | Lista episode_groups, zawartość grup nie jest udostępniana |
| Języki | Jedna lokalizacja na stronę | Sprawdź ich dokumentację | 14 języków przez language |
Cennik
Plany są przedpłacone na 1, 3, 6, 12 lub 24 miesiące, z rabatem 0, 10, 20, 30 lub 40 procent za dłuższe okresy, i nigdy nie odnawiają się same. Plany z 20, 40 i 120 żądaniami na minutę zwracają każdy endpoint z tej strony. Odświeżenie serialu kosztuje jedno żądanie na szczegóły i jedno na każdy sezon. Nie ma darmowego planu. Wybierz plan na stronie cennik.