Scegli in base all'ambito e al budget

TVmaze copre solo le serie TV. È un'API pubblica gratuita con limiti per indirizzo IP, e i suoi dati sono sotto licenza con attribuzione, quindi controlla la loro documentazione per i dettagli. amodb è a pagamento e copre serie TV, film e persone. Se la tua app è un tracker di serie TV e una fonte gratuita soddisfa le tue esigenze, TVmaze è un inizio sensato. Se mostri anche film, pagine del cast o locandine in più lingue, una sola chiave amodb sostituisce più fonti.

Cosa significa ogni ambito per la tua app

La tua app mostraTVmazeamodb
Una pagina di serie TVSìGET /3/tv/{series_id}
Un elenco di episodiSìGET /3/tv/{series_id}/season/{season_number}
Una pagina di filmNessun filmGET /3/movie/{movie_id}
Una pagina di attoreVedi la loro documentazioneGET /3/person/{person_id} e crediti combinati
Serie in onda oggiVedi la loro documentazioneGET /3/tv/airing_today
Una trama tradottaVedi la loro documentazioneParametro language, 14 lingue
Punteggi da più sitiVedi la loro documentazioneEstensione /ratings

La riga dei film decide la maggior parte dei casi. Se non hai pagine di film, l'ambito in più non ha valore per te.

Lacune da controllare prima di migrare

Gli endpoint di stagioni ed episodi seguono la struttura TMDB, e alcune loro parti tornano vuote. Prova le schermate che li usano.

  • Cast di un episodio. Su un episodio, cast è un array vuoto. guest_stars e crew sono compilati, e la chiamata /credits della serie contiene il cast principale.
  • Extra delle stagioni. images, videos e translations di una stagione sono vuoti, quindi la locandina di una stagione viene dalla scheda della stagione e non da un elenco di immagini.
  • ID esterni. Gli external_ids di stagioni ed episodi sono tutti nulli. Associa gli episodi ai tuoi record con season_number ed episode_number.
  • Autori. created_by di una serie è vuoto per la maggior parte delle serie.
  • Nessun feed delle modifiche. amodb non ha un endpoint che elenchi le serie modificate da una certa data.

Confronto delle funzionalità

FunzionalitàTVmazeamodb
Modello di prezzoAPI pubblica di uso gratuitoPrepagato, da 1 a 24 mesi per acquisto
Piano gratuitoSì, tutta l'API pubblicaNessuno, e nessuna prova
AutenticazioneVedi la loro documentazioneapi_key o header Bearer
Formato della rispostaJSON, vedi la loro documentazioneJSON nel formato TMDB v3
LingueVedi la loro documentazione14 lingue dell'interfaccia
FilmNoSì
Serie TVSì, il suo unico focusSì
PersoneVedi la loro documentazioneSì
ImmaginiVedi la loro documentazioneimg.amodb.dev, dieci token di dimensione
ValutazioniVedi la loro documentazioneCinque fonti, quando sono note
Limite di richiestePer indirizzo IP, per i numeri vedi la loro documentazione20, 40 o 120 al minuto per chiave
Uso commercialeDati sotto licenza con attribuzione, vedi la loro documentazionePiani a pagamento, vedi i prezzi
CompatibilitàLa sua APILetture TMDB v3 e OMDb

Dove amodb è diverso

  • Il limite segue la chiave. Tutti i tuoi server condividono un solo contatore in una finestra scorrevole di 60 secondi, e le risposte portano X-RateLimit-Remaining. Nulla dipende dall'indirizzo da cui parte una richiesta.
  • Film, serie TV e persone in un solo posto. Un solo client, un solo formato di errore e un solo insieme di header coprono tutta l'app.
  • Lingue. Titoli e trame tornano in una qualsiasi delle 14 lingue, e original_name conserva il titolo nativo.
  • Un protocollo consolidato. Le librerie scritte per le letture TMDB v3 funzionano con un nuovo URL di base. Vedi la pagina API per serie TV per gli endpoint delle serie.

Dove TVmaze è più adatto

  • Nessun budget. L'uso è gratuito, quindi un progetto da studente o un tracker del fine settimana non richiede pagamenti. amodb non ha un piano gratuito né una prova.
  • Solo serie TV, in modo semplice. Se il tuo modello di dati ha serie ed episodi e nient'altro, un'API incentrata sulle serie TV gli corrisponde.
  • Le sue convenzioni. Le app già costruite attorno al modello di TVmaze risparmiano lavoro restando.

Se resti, rispetta la sua licenza con attribuzione. Per il testo controlla la loro documentazione.

Migrare ad amodb

Inizia con un job di associazione. Leggi gli ID esterni elencati dai tuoi record TVmaze salvati (per i nomi dei campi controlla la loro documentazione) e risolvili tramite /3/find. Il programma qui sotto associa un ID IMDb a una serie e stampa la data del prossimo episodio.

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

Il tipo puntatore di NextEpisode gestisce il null che restituiscono le serie concluse. Esegui l'associazione una volta, salva l'ID amodb con ciascuno dei tuoi record e da quel momento chiama /3/tv/{id}. Un 429 riceve risposta con Retry-After, e la pagina ricerca per ID esterno elenca le altre fonti di ID.

Dimensionare una sincronizzazione notturna

Supponi di aggiornare 300 serie ogni notte. Sono 300 richieste, perché una chiamata di serie restituisce una serie. A 20 richieste al minuto il job dura 15 minuti, a 40 dura 7,5 minuti e a 120 dura 2,5 minuti. Aggiungi append_to_response=credits,ratings a ogni chiamata così cast e punteggi arrivano nella stessa richiesta, invece di costare due richieste in più per ogni serie. Leggi X-RateLimit-Remaining e fai una pausa quando arriva a zero, poi riprendi dopo i secondi di X-RateLimit-Reset.

Prezzi

amodb è prepagato e non si rinnova mai da solo. Scegli 1, 3, 6, 12 o 24 mesi e un piano da 20, 40 o 120 richieste al minuto. I periodi più lunghi costano il 10, 20, 30 o 40 per cento in meno, e ogni piano include tutti i dati. Gli importi sono nella pagina dei prezzi.