Elige según el alcance y el presupuesto

TVmaze es solo de TV. Es de uso gratuito como API pública con límites por dirección IP, y sus datos llegan bajo una licencia de atribución, así que consulta su documentación para los detalles. amodb es de pago y cubre TV, películas y personas. Si tu aplicación es un seguimiento de series y una fuente gratuita cubre tus necesidades, TVmaze es un buen comienzo. Si además muestras películas, páginas de reparto o pósteres en varios idiomas, una clave de amodb sustituye a varias fuentes.

Qué significa cada alcance para tu aplicación

Tu aplicación muestraTVmazeamodb
Una página de serie de TVSíGET /3/tv/{series_id}
Una lista de episodiosSíGET /3/tv/{series_id}/season/{season_number}
Una página de películaSin películasGET /3/movie/{movie_id}
Una página de actorConsulta su documentaciónGET /3/person/{person_id} y créditos combinados
Series que se emiten hoyConsulta su documentaciónGET /3/tv/airing_today
Una sinopsis traducidaConsulta su documentaciónParámetro language, 14 idiomas
Puntuaciones de varios sitiosConsulta su documentaciónExtensión /ratings

La fila de las películas decide la mayoría de los casos. Si no tienes páginas de películas, el alcance adicional no te aporta valor.

Carencias que debes revisar antes de pasar

Los endpoints de temporadas y episodios siguen la forma de TMDB, y algunas de sus partes llegan vacías. Prueba las pantallas que las usan.

  • Reparto de episodio. En un episodio, cast es un array vacío. guest_stars y crew están rellenos, y la llamada /credits de la serie trae el reparto principal.
  • Extras de temporada. Los images, videos y translations de temporada están vacíos, así que el póster de una temporada sale del registro de la temporada y no de una lista de imágenes.
  • IDs externos. Los external_ids de temporadas y episodios son todos null. Asigna los episodios a tus propios registros por season_number y episode_number.
  • Creadores. created_by de una serie está vacío en la mayoría de las series.
  • Sin feed de cambios. amodb no tiene ningún endpoint que liste las series que cambiaron desde una fecha.

Comparación de funciones

FunciónTVmazeamodb
Modelo de preciosAPI pública de uso gratuitoPrepago, de 1 a 24 meses por compra
Nivel gratuitoSí, toda la API públicaNinguno, y sin periodo de prueba
AutenticaciónConsulta su documentaciónapi_key o cabecera Bearer
Formato de respuestaJSON, consulta su documentaciónJSON con la forma de TMDB v3
IdiomasConsulta su documentación14 idiomas de interfaz
PelículasNoSí
TVSí, su único focoSí
PersonasConsulta su documentaciónSí
ImágenesConsulta su documentaciónimg.amodb.dev, diez tokens de tamaño
PuntuacionesConsulta su documentaciónCinco fuentes cuando se conocen
Límite de solicitudesPor dirección IP, consulta su documentación para ver las cifras20, 40 o 120 por minuto por clave
Uso comercialDatos bajo una licencia de atribución, consulta su documentaciónPlanes de pago, consulta los precios
CompatibilidadSu propia APILecturas de TMDB v3 y OMDb

En qué se diferencia amodb

  • El límite sigue a la clave. Todos tus servidores comparten un contador en una ventana deslizante de 60 segundos, y las respuestas llevan X-RateLimit-Remaining. Nada depende de la dirección desde la que sale una solicitud.
  • Películas, TV y personas en un solo lugar. Un cliente, un formato de error y un conjunto de cabeceras cubren toda la aplicación.
  • Idiomas. Los títulos y las sinopsis llegan en cualquiera de los 14 idiomas, y original_name conserva el título nativo.
  • Protocolo consolidado. Las bibliotecas escritas para lecturas de TMDB v3 funcionan con una nueva URL base. Consulta la página de la API de series de TV para ver los endpoints de series.

Dónde encaja mejor TVmaze

  • Sin presupuesto. Es de uso gratuito, así que un proyecto de estudiante o un seguimiento de fin de semana no necesita pago. amodb no tiene nivel gratuito ni periodo de prueba.
  • Solo TV, sin complicaciones. Si tu modelo de datos tiene series y episodios y nada más, una API centrada en la TV encaja.
  • Sus propias convenciones. Las aplicaciones ya construidas en torno al modelo de TVmaze ahorran trabajo si se quedan.

Si te quedas, cumple su licencia de atribución. Consulta su documentación para ver el texto exacto.

Migrar a amodb

Empieza con un trabajo de asignación. Lee los ids externos que listan tus registros guardados de TVmaze (consulta su documentación para ver los nombres de los campos) y resuélvelos con /3/find. El programa de abajo asigna un id de IMDb a una serie e imprime la fecha del próximo 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)
	}
}

El tipo puntero de NextEpisode gestiona el null que devuelven las series terminadas. Ejecuta la asignación una vez, guarda el id de amodb con cada uno de tus registros y llama a /3/tv/{id} a partir de entonces. Un 429 se responde con Retry-After, y la página de buscar por ID externo lista las demás fuentes de ids.

Dimensionar una sincronización nocturna

Supón que actualizas 300 series cada noche. Son 300 solicitudes, ya que una llamada de serie devuelve una serie. A 20 solicitudes por minuto el trabajo tarda 15 minutos, a 40 tarda 7.5 minutos y a 120 tarda 2.5 minutos. Añade append_to_response=credits,ratings a cada llamada para que el reparto y las puntuaciones lleguen en la misma solicitud, en lugar de costar dos más por serie. Lee X-RateLimit-Remaining y haz una pausa cuando llegue a cero; después continúa tras los segundos de X-RateLimit-Reset.

Precios

amodb es prepago y nunca se renueva solo. Elige 1, 3, 6, 12 o 24 meses y un plan de 20, 40 o 120 solicitudes por minuto. Los periodos más largos son un 10, 20, 30 o 40 por ciento más baratos, y cada plan incluye todos los datos. Los importes están en precios.