Wybierz według zakresu i budżetu

TVmaze obejmuje tylko seriale. Jest darmowe jako publiczne API z limitami na adres IP, a jego dane podlegają licencji z atrybucją, więc szczegóły sprawdź w ich dokumentacji. amodb jest płatne i obejmuje seriale, filmy i osoby. Jeśli twoja aplikacja to tracker seriali, a darmowe źródło spełnia twoje potrzeby, TVmaze to rozsądny start. Jeśli pokazujesz też filmy, strony aktorów lub plakaty w kilku językach, jeden klucz amodb zastępuje kilka źródeł.

Co poszczególne zakresy znaczą dla twojej aplikacji

Twoja aplikacja pokazujeTVmazeamodb
Stronę serialuTakGET /3/tv/{series_id}
Listę odcinkówTakGET /3/tv/{series_id}/season/{season_number}
Stronę filmuBrak filmówGET /3/movie/{movie_id}
Stronę aktoraSprawdź ich dokumentacjęGET /3/person/{person_id} i połączone role
Seriale emitowane dziśSprawdź ich dokumentacjęGET /3/tv/airing_today
Przetłumaczony opisSprawdź ich dokumentacjęParametr language, 14 języków
Wyniki z kilku serwisówSprawdź ich dokumentacjęRozszerzenie /ratings

Wiersz o filmach rozstrzyga większość przypadków. Jeśli nie masz stron filmów, dodatkowy zakres nic ci nie daje.

Luki do sprawdzenia przed przejściem

Endpointy sezonów i odcinków podążają za kształtem TMDB, a kilka ich części wraca pustych. Przetestuj ekrany, które ich używają.

  • Obsada odcinka. W odcinku cast to pusta tablica. guest_stars i crew są wypełnione, a główną obsadę ma wywołanie /credits serialu.
  • Dodatki sezonów. images, videos i translations sezonów są puste, więc plakat sezonu pochodzi z rekordu sezonu, a nie z listy obrazów.
  • Zewnętrzne ID. external_ids sezonów i odcinków mają wszystkie wartość null. Odcinki przypisuj do własnych rekordów według season_number i episode_number.
  • Twórcy. created_by w serialu jest puste dla większości seriali.
  • Brak kanału zmian. amodb nie ma endpointu wypisującego seriale zmienione od daty.

Porównanie funkcji

FunkcjaTVmazeamodb
Model cenowyDarmowe w użyciu publiczne APIPrzedpłata, od 1 do 24 miesięcy na zakup
Darmowy planTak, całe publiczne APIBrak, ani wersji próbnej
UwierzytelnianieSprawdź ich dokumentacjęapi_key lub nagłówek Bearer
Format odpowiedziJSON, sprawdź ich dokumentacjęJSON w kształcie TMDB v3
JęzykiSprawdź ich dokumentację14 języków interfejsu
FilmyNieTak
SerialeTak, jedyny profilTak
OsobySprawdź ich dokumentacjęTak
ObrazySprawdź ich dokumentacjęimg.amodb.dev, dziesięć tokenów rozmiaru
OcenySprawdź ich dokumentacjęPięć źródeł, gdy znane
Limit żądańNa adres IP, liczby sprawdź w ich dokumentacji20, 40 lub 120 na minutę na klucz
Użycie komercyjneDane na licencji z atrybucją, sprawdź ich dokumentacjęPłatne plany, zobacz cennik
ZgodnośćWłasne APIOdczyty TMDB v3 i OMDb

Czym amodb się różni

  • Limit podąża za kluczem. Wszystkie twoje serwery dzielą jeden licznik w przesuwanym oknie 60 sekund, a odpowiedzi niosą X-RateLimit-Remaining. Nic nie zależy od tego, z jakiego adresu wychodzi żądanie.
  • Filmy, seriale i osoby w jednym miejscu. Jeden klient, jeden format błędów i jeden zestaw nagłówków obejmują całą aplikację.
  • Języki. Tytuły i opisy wracają w dowolnym z 14 języków, a original_name zachowuje tytuł oryginalny.
  • Ugruntowany protokół. Biblioteki napisane pod odczyty TMDB v3 działają z nowym bazowym URL. Endpointy seriali zobacz na stronie API seriali.

Kiedy TVmaze pasuje lepiej

  • Brak budżetu. Jest darmowe, więc projekt studencki lub weekendowy tracker nie wymaga płatności. amodb nie ma darmowego planu ani wersji próbnej.
  • Tylko seriale, prosto. Jeśli twój model danych ma seriale i odcinki i nic więcej, API skupione na serialach mu odpowiada.
  • Własne konwencje. Aplikacje zbudowane już wokół modelu TVmaze oszczędzają pracę, zostając przy nim.

Jeśli zostajesz, przestrzegaj jego licencji z atrybucją. Brzmienie sprawdź w ich dokumentacji.

Przejście na amodb

Zacznij od zadania mapowania. Odczytaj zewnętrzne ID wymienione w zapisanych rekordach TVmaze (nazwy pól sprawdź w ich dokumentacji) i rozwiąż je przez /3/find. Poniższy program mapuje jedno ID z IMDb na serial i wypisuje datę następnego odcinka.

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

Typ wskaźnikowy NextEpisode obsługuje null, które zwracają zakończone seriale. Wykonaj mapowanie raz, zapisz ID amodb przy każdym swoim rekordzie i od tej pory wywołuj /3/tv/{id}. Na 429 odpowiada się Retry-After, a strona wyszukiwanie po zewnętrznym ID wymienia inne źródła ID.

Wymiarowanie nocnej synchronizacji

Załóżmy, że co noc odświeżasz 300 seriali. To 300 żądań, bo jedno wywołanie serialu zwraca jeden serial. Przy 20 żądaniach na minutę zadanie trwa 15 minut, przy 40 trwa 7.5 minuty, a przy 120 trwa 2.5 minuty. Dodaj do każdego wywołania append_to_response=credits,ratings, aby obsada i wyniki przyszły w tym samym żądaniu zamiast kosztować po dwa kolejne na serial. Czytaj X-RateLimit-Remaining i wstrzymaj się, gdy dojdzie do zera, a potem kontynuuj po X-RateLimit-Reset sekundach.

Cennik

amodb jest przedpłacone i nigdy nie odnawia się samo. Wybierz 1, 3, 6, 12 lub 24 miesiące i plan z 20, 40 lub 120 żądaniami na minutę. Dłuższe okresy są tańsze o 10, 20, 30 lub 40 procent, a każdy plan obejmuje wszystkie dane. Kwoty są na stronie cennik.