# Альтэрнатыва TVmaze API

> TVmaze працуе толькі з серыяламі, бясплатны, абмежаваны па IP-адрасе, а яго даныя ідуць пад ліцэнзіяй з указаннем аўтарства. Падрабязнасці глядзіце ў іх дакументацыі. amodb прапануе платнае API для серыялаў, фільмаў і персон з лімітамі на ключ і шляхамі TMDB v3. Выбірайце па аб’ёме даных і бюджэце.

## Выбірайце па аб’ёме даных і бюджэце

TVmaze працуе толькі з серыяламі. Ён бясплатны як публічны API з лімітамі па IP-адрасе, а яго даныя ідуць пад ліцэнзіяй з указаннем аўтарства, таму падрабязнасці глядзіце ў іх дакументацыі. amodb платны і ахоплівае серыялы, фільмы і персон. Калі ваша праграма трэкер серыялаў і бясплатнай крыніцы вам хапае, TVmaze стане разумным пачаткам. Калі вы паказваеце яшчэ і фільмы, старонкі акцёраў або постэры на некалькіх мовах, адзін ключ amodb замяняе некалькі крыніц.

## Што азначае кожны аб’ём для вашай праграмы

| Што паказвае праграма        | TVmaze                   | amodb                                            |
| ---------------------------- | ------------------------ | ------------------------------------------------ |
| Старонку серыяла             | Так                      | `GET /3/tv/{series_id}`                          |
| Спіс эпізодаў                | Так                      | `GET /3/tv/{series_id}/season/{season_number}`   |
| Старонку фільма              | Фільмаў няма             | `GET /3/movie/{movie_id}`                        |
| Старонку акцёра              | Глядзіце іх дакументацыю | `GET /3/person/{person_id}` і зводныя ўдзельнікі |
| Серыялы, што выходзяць сёння | Глядзіце іх дакументацыю | `GET /3/tv/airing_today`                         |
| Перакладзенае апісанне       | Глядзіце іх дакументацыю | параметр `language`, 14 моў                      |
| Ацэнкі з некалькіх сайтаў    | Глядзіце іх дакументацыю | пашырэнне `/ratings`                             |

Радок з фільмамі вырашае большасць выпадкаў. Калі ў вас няма старонак фільмаў, дадатковы аб’ём для вас нічога не значыць.

## Месцы, якія трэба праверыць перад пераходам

Эндпоінты сезонаў і эпізодаў маюць форму TMDB, і некаторыя іх часткі вяртаюцца пустымі. Праверце экраны, якія іх выкарыстоўваюць.

- **Акцёры эпізода.** У эпізода `cast` уяўляе сабой пусты масіў. `guest_stars` і `crew` запоўненыя, а асноўныя акцёры ёсць у выкліку `/credits` серыяла.
- **Дадаткі да сезона.** `images`, `videos` і `translations` сезона пустыя, таму постэр сезона бярэцца з запісу сезона, а не са спісу выяў.
- **Вонкавыя id.** `external_ids` сезона і эпізода ўсе роўныя null. Супастаўляйце эпізоды з вашымі запісамі па `season_number` і `episode_number`.
- **Стваральнікі.** `created_by` у серыяла пусты для большасці серыялаў.
- **Няма стужкі змен.** У amodb няма эндпоінта са спісам серыялаў, змененых пасля пэўнай даты.

## Параўнанне магчымасцей

| Магчымасць               | TVmaze                                                              | amodb                                                    |
| ------------------------ | ------------------------------------------------------------------- | -------------------------------------------------------- |
| Мадэль цэнаўтварэння     | Бясплатны публічны API                                              | З аплатай наперад, ад 1 да 24 месяцаў за адну пакупку    |
| Бясплатны тарыф          | Так, увесь публічны API                                             | Няма, пробнага перыяду таксама няма                      |
| Аўтэнтыфікацыя           | Глядзіце іх дакументацыю                                            | `api_key` або загаловак Bearer                           |
| Фармат адказу            | JSON, глядзіце іх дакументацыю                                      | JSON у форме TMDB v3                                     |
| Мовы                     | Глядзіце іх дакументацыю                                            | 14 моў інтэрфейсу                                        |
| Фільмы                   | Не                                                                  | Так                                                      |
| Серыялы                  | Так, гэта яго адзіны фокус                                          | Так                                                      |
| Персоны                  | Глядзіце іх дакументацыю                                            | Так                                                      |
| Выявы                    | Глядзіце іх дакументацыю                                            | `img.amodb.dev`, дзесяць токенаў памераў                 |
| Рэйтынгі                 | Глядзіце іх дакументацыю                                            | Пяць крыніц, калі вядомыя                                |
| Ліміт запытаў            | Па IP-адрасе, лічбы глядзіце ў іх дакументацыі                      | 20, 40 або 120 у хвіліну на ключ                         |
| Камерцыйнае выкарыстанне | Даныя пад ліцэнзіяй з указаннем аўтарства, глядзіце іх дакументацыю | Платныя планы, гл. [цэны](https://amodb.dev/be/pricing/) |
| Сумяшчальнасць           | Уласны API                                                          | Чытанне TMDB v3 і OMDb                                   |

## Чым адрозніваецца amodb

- **Ліміт прывязаны да ключа.** Усе вашы серверы падзяляюць адзін лічыльнік у слізгальным 60-секундным акне, а адказы нясуць `X-RateLimit-Remaining`. Нічога не залежыць ад таго, з якога адраса выходзіць запыт.
- **Фільмы, серыялы і персоны ў адным месцы.** Адзін кліент, адзін фармат памылак і адзін набор загалоўкаў абслугоўваюць усю праграму.
- **Мовы.** Назвы і апісанні вяртаюцца на любой з 14 моў, а `original_name` захоўвае родную назву.
- **Устоены пратакол.** Бібліятэкі, напісаныя для чытання TMDB v3, працуюць з новым базавым URL. Эндпоінты серыялаў глядзіце на старонцы [API серыялаў](https://amodb.dev/be/tv-show-api/).

## Дзе TVmaze падыходзіць лепш

- **Няма бюджэту.** Ён бясплатны, таму студэнцкі праект або трэкер выхадных не патрабуе аплаты. У amodb няма бясплатнага тарыфа і пробнага перыяду.
- **Толькі серыялы, без лішняга.** Калі ваша мадэль даных складаецца з серыялаў і эпізодаў і нічога болей, API, арыентаваны на серыялы, ёй адпавядае.
- **Свае канвенцыі.** Праграмы, ужо пабудаваныя вакол мадэлі TVmaze, эканомяць працу, застаючыся на ім.

Калі вы застаяцеся, выконвайце яго ліцэнзію з указаннем аўтарства. Фармулёўку глядзіце ў іх дакументацыі.

## Міграцыя на amodb

Пачніце з задачы супастаўлення. Прачытайце вонкавыя id, якія пералічаны ў вашых захаваных запісах TVmaze (назвы палёў глядзіце ў іх дакументацыі), і вырашыце іх праз `/3/find`. Праграма ніжэй супастаўляе адзін IMDb id з серыялам і друкуе дату наступнага эпізода.

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type findResult struct {
	TVResults []struct {
		ID   int    `json:"id"`
		Name string `json:"name"`
	} `json:"tv_results"`
}

type episode struct {
	AirDate       string `json:"air_date"`
	SeasonNumber  int    `json:"season_number"`
	EpisodeNumber int    `json:"episode_number"`
}

type series struct {
	Name        string   `json:"name"`
	Status      string   `json:"status"`
	NextEpisode *episode `json:"next_episode_to_air"`
}

var client = &http.Client{Timeout: 10 * time.Second}

func get(path string, out any) error {
	req, err := http.NewRequest(http.MethodGet, "https://api.amodb.dev/3"+path, nil)
	if err != nil {
		return err
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		return err
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		return fmt.Errorf("amodb returned %s", res.Status)
	}
	return json.NewDecoder(res.Body).Decode(out)
}

func main() {
	var found findResult
	if err := get("/find/tt0903747?external_source=imdb_id", &found); err != nil {
		fmt.Println(err)
		return
	}
	if len(found.TVResults) == 0 {
		fmt.Println("no match")
		return
	}
	var s series
	if err := get(fmt.Sprintf("/tv/%d", found.TVResults[0].ID), &s); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(s.Name, s.Status)
	if s.NextEpisode != nil {
		fmt.Println("next episode:", s.NextEpisode.AirDate)
	}
}
```

Указальнік у тыпе `NextEpisode` апрацоўвае `null`, які вяртаюць завершаныя серыялы. Выканайце супастаўленне адзін раз, захавайце id amodb у кожным сваім запісе і далей выклікайце `/3/tv/{id}`. На 429 адказваюць загалоўкам `Retry-After`, а іншыя крыніцы id пералічаны на старонцы [пошук па вонкавым ідэнтыфікатары](https://amodb.dev/be/find-by-external-id/).

## Ацэнка начной сінхранізацыі

Дапусцім, вы абнаўляеце 300 серыялаў за ноч. Гэта 300 запытаў, бо адзін выклік серыяла вяртае адзін серыял. Пры 20 запытах у хвіліну задача займае 15 хвілін, пры 40 займае 7.5 хвіліны, а пры 120 займае 2.5 хвіліны. Дадайце `append_to_response=credits,ratings` да кожнага выкліку, каб акцёры і ацэнкі прыходзілі ў тым жа запыце, а не каштавалі яшчэ два запыты на серыял. Чытайце `X-RateLimit-Remaining` і рабіце паўзу, калі яно дасягае нуля, а потым працягвайце праз `X-RateLimit-Reset` секунд.

## Цэны

amodb працуе з аплатай наперад і ніколі не прадаўжаецца сам. Абярыце 1, 3, 6, 12 або 24 месяцы і план на 20, 40 або 120 запытаў у хвіліну. Доўгія перыяды танней на 10, 20, 30 або 40 працэнтаў, і кожны план уключае ўсе даныя. Сумы ёсць на старонцы [цэны](https://amodb.dev/be/pricing/).

## Пытанні і адказы

### Ці бясплатны TVmaze API?

TVmaze прапануе бясплатны публічны API з лімітамі па IP-адрасе, а яго даныя ідуць пад ліцэнзіяй з указаннем аўтарства. Бягучыя ліміты і тэкст ліцэнзіі глядзіце ў іх дакументацыі. amodb платны і бясплатнага тарыфа не мае.

### Ці ахоплівае amodb і фільмы, і серыялы?

Так. Фільмы, серыялы, сезоны, эпізоды і персоны даступныя з аднаго ключа і аднаго базавага URL. TVmaze працуе толькі з серыяламі, таму для старонкі фільма ў вашай праграме там патрэбна другая крыніца.

### Як супаставіць серыялы TVmaze з id у amodb?

Запісы серыялаў TVmaze пералічваюць id з іншых баз, напрыклад IMDb (дакладныя палі глядзіце ў іх дакументацыі). Выклічце эндпоінт find з IMDb id і external_source=imdb_id, потым захавайце id з tv_results.

### Чаму важны ліміт па IP?

Ліміт, прывязаны да IP-адраса, дзеліцца паміж усім, што за ім стаіць, напрыклад пулам сервераў або офіснай сеткай. amodb лічыць запыты на ключ у слізгальным 60-секундным акне, незалежна ад таго, адкуль ідуць выклікі.

### Ці можна паказаць дату наступнага эпізода серыяла?

Так. Дэталі серыяла вяртаюць next_episode_to_air з air_date, season_number і episode_number або null, калі нічога не запланавана. Edge кэшуе дэталі на 6 гадзін, таму абнаўляйце іх некалькі разоў на дзень.

## Звязаныя старонкі

- [API серыялаў, сезонаў і эпізодаў](https://amodb.dev/be/tv-show-api/): API серыялаў са статусам, тэлеканаламі, сезонамі, эпізодамі і next_episode_to_air. JSON, сумяшчальны з TMDB v3, на 14 мовах, ад 20 запытаў у хвіліну.
- [API даведніка па эпізодах](https://amodb.dev/be/episode-guide-api/): API даведніка па эпізодах з эндпоінтамі сезонаў і эпізодаў TMDB v3: назвы, даты эфіру, працягласць, кадры і спісы груп эпізодаў для любога серыяла, на 14 мовах.
- [API сезонаў і эпізодаў серыялаў](https://amodb.dev/be/tv-seasons-episodes/): API сезонаў і эпізодаў з тымі ж шляхамі і JSON, што ў TMDB v3. Чытайце сезон з усімі эпізодамі або адзін эпізод з датай эфіру, працягласцю і кадрам.
- [Пошук па вонкавым ідэнтыфікатары](https://amodb.dev/be/find-by-external-id/): Шукайце фільм, серыял або персону па IMDb, TVDB, Wikidata ці Kinopoisk id праз эндпоінт find TMDB і чытайце вонкавыя id і факты Wikidata для назвы.
- [Ліміты запытаў](https://amodb.dev/be/rate-limits/): amodb абмяжоўвае ключ па запытах у хвіліну ў слізгальным акне 60 секунд: 20, 40 або 120 па плане. Чытайце загалоўкі лімітаў і апрацоўвайце 429 праз Retry-After.
- [Цэны](https://amodb.dev/be/pricing/): Планы amodb адрозніваюцца толькі лікам запытаў у хвіліну: 20, 40 або 120. Усе даныя TMDB v3 і OMDb у кожным плане. Аплата наперад, без аўтапрадаўжэння.

Абноўлена: 2026-10-18. Source: https://amodb.dev/be/tvmaze-api-alternative/
