Alege după acoperire și buget

TVmaze este doar pentru TV. Este gratuit ca API public, cu limite pe adresă IP, iar datele sale vin sub o licență cu atribuire, deci vezi documentația lor pentru detalii. amodb este cu plată și acoperă TV, filme și persoane. Dacă aplicația ta este un tracker de seriale și o sursă gratuită îți ajunge, TVmaze este un început rezonabil. Dacă arăți și filme, pagini de distribuție sau postere în mai multe limbi, o singură cheie amodb înlocuiește mai multe surse.

Ce înseamnă fiecare acoperire pentru aplicația ta

Aplicația ta aratăTVmazeamodb
O pagină de serial TVDaGET /3/tv/{series_id}
O listă de episoadeDaGET /3/tv/{series_id}/season/{season_number}
O pagină de filmFără filmeGET /3/movie/{movie_id}
O pagină de actorVezi documentația lorGET /3/person/{person_id} și credite combinate
Seriale difuzate aziVezi documentația lorGET /3/tv/airing_today
O descriere tradusăVezi documentația lorparametrul language, 14 limbi
Scoruri de pe mai multe site-uriVezi documentația lorextensia /ratings

Rândul cu filmele decide majoritatea cazurilor. Dacă nu ai pagini de filme, acoperirea suplimentară nu are valoare pentru tine.

Lacune de verificat înainte să te muți

Endpoint-urile de sezon și de episod urmează structura TMDB, iar câteva părți ale lor vin goale. Testează ecranele care le folosesc.

  • Distribuția episodului. La un episod, cast este un array gol. guest_stars și crew sunt completate, iar apelul /credits al serialului conține distribuția principală.
  • Extra de sezon. images, videos și translations de sezon sunt goale, deci un poster de sezon vine din fișa sezonului și nu dintr-o listă de imagini.
  • ID-uri externe. external_ids de sezon și de episod sunt toate null. Mapează episoadele la propriile înregistrări după season_number și episode_number.
  • Creatori. created_by la un serial este gol pentru majoritatea serialelor.
  • Fără flux de modificări. amodb nu are un endpoint care să listeze serialele modificate de la o dată.

Comparația funcțiilor

FuncțieTVmazeamodb
Model de prețAPI public gratuitPlătit în avans, 1 până la 24 de luni pe achiziție
Nivel gratuitDa, tot API-ul publicNiciunul, și fără perioadă de probă
AutentificareVezi documentația lorapi_key sau antet Bearer
Format de răspunsJSON, vezi documentația lorJSON în structura TMDB v3
LimbiVezi documentația lor14 limbi de interfață
FilmeNuDa
TVDa, singurul său accentDa
PersoaneVezi documentația lorDa
ImaginiVezi documentația lorimg.amodb.dev, zece jetoane de dimensiune
EvaluăriVezi documentația lorCinci surse, unde se știu
Limită de cereriPe adresă IP, vezi documentația lor pentru cifre20, 40 sau 120 pe minut pe cheie
Utilizare comercialăDate sub o licență cu atribuire, vezi documentația lorPlanuri cu plată, vezi prețuri
CompatibilitatePropriul APICitiri TMDB v3 și OMDb

Prin ce diferă amodb

  • Limita urmează cheia. Toate serverele tale împart un singur contor într-o fereastră glisantă de 60 de secunde, iar răspunsurile poartă X-RateLimit-Remaining. Nimic nu depinde de adresa din care pleacă o cerere.
  • Filme, TV și persoane într-un singur loc. Un client, un format de eroare și un set de antete acoperă toată aplicația.
  • Limbi. Titlurile și descrierile revin în oricare dintre cele 14 limbi, iar original_name păstrează titlul nativ.
  • Protocol consacrat. Bibliotecile scrise pentru citirile TMDB v3 funcționează cu un URL de bază nou. Vezi pagina API seriale TV pentru endpoint-urile de seriale.

Când TVmaze se potrivește mai bine

  • Fără buget. Este gratuit, deci un proiect de student sau un tracker de weekend nu cere nicio plată. amodb nu are nivel gratuit și nici perioadă de probă.
  • Doar TV, păstrat simplu. Dacă modelul tău de date are seriale și episoade și nimic altceva, un API axat pe TV i se potrivește.
  • Convențiile lui. Aplicațiile deja construite în jurul modelului TVmaze economisesc muncă rămânând.

Dacă rămâi, respectă licența lui cu atribuire. Vezi documentația lor pentru formulare.

Migrarea la amodb

Începe cu un job de mapare. Citește ID-urile externe pe care le listează înregistrările tale TVmaze stocate (vezi documentația lor pentru numele câmpurilor) și rezolvă-le prin /3/find. Programul de mai jos mapează un ID IMDb la un serial și afișează data următorului episod.

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

Tipul pointer pentru NextEpisode tratează null-ul pe care îl întorc serialele încheiate. Rulează maparea o singură dată, salvează ID-ul amodb la fiecare dintre înregistrările tale și apelează /3/tv/{id} de acolo încolo. Un 429 primește răspuns cu Retry-After, iar pagina căutare după ID extern listează celelalte surse de ID-uri.

Dimensionarea unei sincronizări de noapte

Presupune că reîmprospătezi 300 de seriale în fiecare noapte. Asta înseamnă 300 de cereri, fiindcă un apel de serial întoarce un singur serial. La 20 de cereri pe minut jobul durează 15 minute, la 40 durează 7.5 minute, iar la 120 durează 2.5 minute. Adaugă append_to_response=credits,ratings la fiecare apel, ca distribuția și scorurile să sosească în aceeași cerere în loc să coste încă două pe serial. Citește X-RateLimit-Remaining și fă o pauză când ajunge la zero, apoi continuă după cele X-RateLimit-Reset secunde.

Prețuri

amodb este plătit în avans și nu se reînnoiește niciodată singur. Alege 1, 3, 6, 12 sau 24 de luni și un plan de 20, 40 sau 120 de cereri pe minut. Perioadele mai lungi sunt cu 10, 20, 30 sau 40 la sută mai ieftine, iar fiecare plan include toate datele. Sumele sunt la prețuri.