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 muestra | TVmaze | amodb |
|---|---|---|
| Una página de serie de TV | Sí | GET /3/tv/{series_id} |
| Una lista de episodios | Sí | GET / |
| Una página de película | Sin películas | GET / |
| Una página de actor | Consulta su documentación | GET / y créditos combinados |
| Series que se emiten hoy | Consulta su documentación | GET /3/tv/airing_today |
| Una sinopsis traducida | Consulta su documentación | Parámetro language, 14 idiomas |
| Puntuaciones de varios sitios | Consulta su documentación | Extensió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,
castes un array vacío.guest_starsycrewestán rellenos, y la llamada/creditsde la serie trae el reparto principal. - Extras de temporada. Los
images,videosytranslationsde 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_idsde temporadas y episodios son todos null. Asigna los episodios a tus propios registros porseason_numberyepisode_number. - Creadores.
created_byde 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ón | TVmaze | amodb |
|---|---|---|
| Modelo de precios | API pública de uso gratuito | Prepago, de 1 a 24 meses por compra |
| Nivel gratuito | Sí, toda la API pública | Ninguno, y sin periodo de prueba |
| Autenticación | Consulta su documentación | api_key o cabecera Bearer |
| Formato de respuesta | JSON, consulta su documentación | JSON con la forma de TMDB v3 |
| Idiomas | Consulta su documentación | 14 idiomas de interfaz |
| Películas | No | Sí |
| TV | Sí, su único foco | Sí |
| Personas | Consulta su documentación | Sí |
| Imágenes | Consulta su documentación | img.amodb.dev, diez tokens de tamaño |
| Puntuaciones | Consulta su documentación | Cinco fuentes cuando se conocen |
| Límite de solicitudes | Por dirección IP, consulta su documentación para ver las cifras | 20, 40 o 120 por minuto por clave |
| Uso comercial | Datos bajo una licencia de atribución, consulta su documentación | Planes de pago, consulta los precios |
| Compatibilidad | Su propia API | Lecturas 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_nameconserva 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.
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_ 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.