# API przewodnika po odcinkach

> API przewodnika po odcinkach wypisuje wszystkie odcinki serialu przez GET /3/tv/{tv_id}/season/{season_number}. Każdy odcinek ma nazwę, opis, datę emisji, czas trwania i kadr. Lista episode_groups nazywa alternatywne układy, na przykład DVD lub absolutny. Ścieżki i JSON odpowiadają TMDB v3, więc istniejący klienci potrzebują tylko nowego bazowego URL.

## Pobieranie wszystkich odcinków sezonu

`GET /3/tv/{tv_id}/season/{season_number}` 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 /3/tv/{tv_id}/season/{season_number}`                          | Jeden sezon ze wszystkimi `episodes`                                                                |
| `GET /3/tv/{tv_id}/season/{season_number}/episode/{episode_number}` | Jeden odcinek z `crew` i `guest_stars`                                                              |
| `GET /3/tv/{tv_id}/episode_groups`                                  | 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://img.amodb.dev/t/p/{size}`                                                                              |
| `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

1. Wybierz plan na stronie [cennik](https://amodb.dev/pl/pricing/). Wszystkie plany zwracają te same dane odcinków, a różni się tylko tempo żądań.
2. Utwórz klucz w panelu konta i zapisz go w zmiennej środowiskowej.
3. Wywołaj `/3/tv/{tv_id}/season/1` z kluczem w nagłówku Bearer albo w `api_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.

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

```go
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.

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

## 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.

```js
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](https://amodb.dev/pl/trending-lists/) 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](https://amodb.dev/pl/images-api/).

`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_to_response=credits,images` 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](https://amodb.dev/pl/tv-seasons-episodes/) oraz [obsada i ekipa](https://amodb.dev/pl/credits/).

## Alternatywne układy z grupami odcinków

Niektóre seriale ogląda się w innej kolejności, niż były emitowane. `GET /3/tv/{tv_id}/episode_groups` 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 /3/tv/episode_group/{id}`, 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](https://amodb.dev/pl/pricing/).

## Pytania i odpowiedzi

### Jak wypisać wszystkie odcinki serialu?

Odczytaj number_of_seasons z GET /3/tv/{tv_id}, a potem wywołaj GET /3/tv/{tv_id}/season/{season_number} dla każdego sezonu. Każda odpowiedź sezonu zawiera pełną tablicę episodes, więc nie potrzebujesz osobnego wywołania na odcinek. Kilka sezonów wraca z pustą tablicą episodes, gdy brak danych o odcinkach.

### Czy mogę pobrać kilka sezonów jednym żądaniem?

Nie. amodb ignoruje wartości w stylu season/1 w append_to_response, więc każdy sezon to osobne żądanie. Serial z 10 sezonami kosztuje 11 żądań, jedno na szczegóły i jedno na każdy sezon.

### Czym jest grupa odcinków?

Grupa odcinków to alternatywna kolejność tych samych odcinków, na przykład według DVD, absolutna albo według wątków fabularnych. GET /3/tv/{tv_id}/episode_groups wypisuje je z nazwą, typem i liczbą odcinków. amodb nie udostępnia odcinków wewnątrz grupy.

### Jak sprawdzić, kiedy wyjdzie następny odcinek?

GET /3/tv/{tv_id} zwraca next_episode_to_air z air_date, season_number i episode_number. Wartość to null, gdy nic nie ogłoszono. last_episode_to_air podaje najnowszy odcinek.

### Skąd pochodzą obrazy odcinków?

Każdy odcinek ma still_path. Dołącz go do https://img.amodb.dev/t/p/{size}, na przykład w300 dla wierszy listy. Obrazy nie wymagają klucza. still_path może być null, więc miej gotowy obraz zastępczy.

## Powiązane strony

- [API sezonów i odcinków seriali](https://amodb.dev/pl/tv-seasons-episodes/): API sezonów i odcinków seriali z tymi samymi ścieżkami i JSON co TMDB v3. Odczytaj sezon ze wszystkimi odcinkami albo jeden odcinek z datą emisji i kadrem.
- [API szczegółów serialu](https://amodb.dev/pl/tv-series/): API szczegółów serialu z tymi samymi ścieżkami i JSON co TMDB v3. Serial po ID z sezonami, sieciami, klasyfikacją wiekową i dostawcami streamingu.
- [API obrazów i host obrazów](https://amodb.dev/pl/images-api/): API obrazów filmów ze ścieżkami TMDB v3: wypisz plakaty, tła, loga i kadry każdego tytułu, a potem ładuj je z img.amodb.dev w 10 rozmiarach bez klucza.
- [API obsady i ekipy](https://amodb.dev/pl/credits/): API obsady i ekipy z tymi samymi ścieżkami i JSON co TMDB v3. Pobierz obsadę i ekipę filmów, seriali, sezonów i odcinków z polami order, department i job.
- [API seriali: seriale, sezony i odcinki](https://amodb.dev/pl/tv-show-api/): API seriali ze statusem, sieciami telewizyjnymi, sezonami, odcinkami i next_episode_to_air. JSON zgodny z TMDB v3 w 14 językach, od 20 żądań na minutę.
- [Szybki start](https://amodb.dev/pl/quickstart/): Pierwsze wywołanie amodb: zdobądź klucz, pobierz szczegóły filmu w curl, JavaScript, Python, PHP lub Go, potem załaduj plakat z img.amodb.dev. Poniżej 2 minut.

Zaktualizowano: 2026-10-18. Source: https://amodb.dev/pl/episode-guide-api/
