Изберете според обхвата и бюджета

TVmaze е само за сериали. Безплатен е като публично API с лимити по IP адрес, а данните му са под лиценз с посочване на авторството, затова вижте подробностите в документацията им. amodb е платен и покрива сериали, филми и личности. Ако приложението ви е тракер за сериали и безплатен източник ви стига, TVmaze е разумно начало. Ако показвате и филми, страници на актьори или постери на няколко езика, един ключ за amodb заменя няколко източника.

Какво означава всеки обхват за вашето приложение

Приложението показваTVmazeamodb
Страница на сериалДа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 няма ендпойнт, който изброява сериалите, променени след дадена дата.

Сравнение на функциите

ФункцияTVmazeamodb
Модел на ценитеПублично API, безплатно за ползванеПредплатен, от 1 до 24 месеца на покупка
Безплатен планДа, цялото публично APIНяма, и няма пробен период
УдостоверяванеВижте документацията имapi_key или заглавка Bearer
Формат на отговораJSON, вижте документацията имJSON във формата на TMDB v3
ЕзициВижте документацията им14 езика на интерфейса
ФилмиНеДа
СериалиДа, единственият му фокусДа
ЛичностиВижте документацията имДа
ИзображенияВижте документацията имimg.amodb.dev, десет токена за размери
РейтингиВижте документацията имПет източника, където са известни
Лимит на заявкитеПо IP адрес, числата вижте в документацията им20, 40 или 120 в минута на ключ
Търговска употребаДанни под лиценз с посочване на авторството, вижте документацията имПлатени планове, вижте цени
СъвместимостСобствено APIЧетене по TMDB v3 и OMDb

С какво се различава amodb

  • Лимитът следва ключа. Всички ваши сървъри споделят един брояч в плъзгащ се 60-секунден прозорец, а отговорите носят X-RateLimit-Remaining. Нищо не зависи от това от кой адрес излиза заявката.
  • Филми, сериали и личности на едно място. Един клиент, един формат на грешките и един набор от заглавки покриват цялото приложение.
  • Езици. Заглавията и описанията се връщат на който и да е от 14 езика, а original_name пази родното заглавие.
  • Утвърден протокол. Библиотеки, написани за четене по TMDB v3, работят с нов базов URL адрес. Ендпойнтите за сериали вижте на страницата 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 са изброени на страницата търсене по външен идентификатор.

Оразмеряване на нощна синхронизация

Да речем, че обновявате 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 процента, а всеки план включва всички данни. Сумите са на страницата с цените.