Obtén todos los episodios de una temporada

GET /3/tv/{tv_id}/season/{season_number} devuelve una temporada con su array episodes completo. Cada episodio tiene episode_number, name, overview, air_date, runtime y still_path. Los ids son los ids numéricos que usa TMDB, por ejemplo 1396 para Breaking Bad.

Obtienes temporadas, episodios con fechas y duraciones, imágenes de episodio, el próximo y el último episodio emitido de una serie, y la lista de órdenes alternativos de episodios. Los campos de texto siguen el parámetro language, y una sinopsis queda vacía cuando no existe traducción.

Qué datos obtienes

EndpointDevuelve
GET /3/tv/{tv_id}Resumen de seasons, number_of_seasons, status, next_episode_to_air, last_episode_to_air
GET /3/tv/{tv_id}/season/{season_number}Una temporada con todos sus episodes
GET /3/tv/{tv_id}/season/{season_number}/episode/{episode_number}Un episodio con crew y guest_stars
GET /3/tv/{tv_id}/episode_groupsNombre, type y número de episodios de cada orden alternativo definido para la serie

Campos de un episodio:

CampoTipoNotas
id, show_identeroId del episodio e id de la serie. show_id aparece en las listas de temporada y en next_episode_to_air, no en la ruta de un solo episodio
episode_number, season_numberenteroPosición en la temporada
episode_typecadenaPor ejemplo standard
name, overviewcadenaLocalizados con language
air_datecadena o nullYYYY-MM-DD, vacía o null cuando no está anunciado
runtimeentero o nullMinutos
still_pathcadena o nullÚnelo a https://img.amodb.dev/t/p/{size}
vote_average, vote_countnúmero, enteroActualmente 0 en los episodios
production_codecadenaCódigo del estudio, a menudo vacío
crew, guest_starsarrayPersonas acreditadas en el episodio, con los mismos campos que un miembro del reparto

Empieza en 3 pasos

  1. Elige un plan en precios. Todos los planes devuelven los mismos datos de episodios, y solo cambia el límite de solicitudes.
  2. Crea una clave en el panel de tu cuenta y guárdala en una variable de entorno.
  3. Solicita /3/tv/{tv_id}/season/1 con la clave como encabezado Bearer o como api_key.

Ejemplo de solicitud

El ejemplo obtiene la temporada 1 de Breaking Bad (id de serie 1396) en inglés. El programa en Go la decodifica en structs tipados e imprime una línea por episodio con la fecha de emisión, la duración y la URL de la imagen.

bashgo
curl -s "https://api.amodb.dev/3/tv/1396/season/1?language=en-US" \
  -H "Authorization: Bearer $AMODB_KEY"
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

type Episode struct {
	EpisodeNumber int     `json:"episode_number"`
	Name          string  `json:"name"`
	AirDate       string  `json:"air_date"`
	Runtime       int     `json:"runtime"`
	StillPath     *string `json:"still_path"`
}

type Season struct {
	Name         string    `json:"name"`
	SeasonNumber int       `json:"season_number"`
	Episodes     []Episode `json:"episodes"`
}

func main() {
	client := &http.Client{Timeout: 10 * time.Second}
	url := "https://api.amodb.dev/3/tv/1396/season/1?language=en-US"
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(fmt.Sprintf("amodb returned %s", res.Status))
	}
	var season Season
	if err := json.NewDecoder(res.Body).Decode(&season); err != nil {
		panic(err)
	}
	fmt.Println(season.Name)
	for _, e := range season.Episodes {
		still := "no still"
		if e.StillPath != nil {
			still = "https://img.amodb.dev/t/p/w300" + *e.StillPath
		}
		fmt.Printf("S%02dE%02d  %s  %3d min  %s  %s\n",
			season.SeasonNumber, e.EpisodeNumber, e.AirDate, e.Runtime, e.Name, still)
	}
}

Respuesta recortada: 2 de los 7 episodios, con un miembro del equipo técnico y un invitado en cada uno.

JSON
{
  "air_date": "2008-01-20",
  "episodes": [
    {
      "air_date": "2008-01-20",
      "episode_number": 1,
      "episode_type": "standard",
      "id": 62085,
      "name": "Pilot",
      "overview": "When an unassuming high school chemistry teacher discovers he has a rare form...",
      "production_code": "",
      "runtime": 59,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/ydlY3iPfeOAvu8gVqrxPoMvzNCn.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "crew": [
        {
          "department": "Camera",
          "job": "Director of Photography",
          "credit_id": "52b7029219c29533d00dd2c1",
          "adult": false,
          "gender": 2,
          "id": 2483,
          "known_for_department": "Camera",
          "name": "约翰·托尔",
          "original_name": "约翰·托尔",
          "popularity": 1.1957,
          "profile_path": "/cfL9A6tC7L5Ps5fq1o3WpVKGMb1.jpg"
        }
      ],
      "guest_stars": [
        {
          "character": "Steven Gomez",
          "credit_id": "5271b489760ee35b3e0881a7",
          "order": 8,
          "adult": false,
          "gender": 2,
          "id": 61535,
          "known_for_department": "Acting",
          "name": "史蒂文·迈克尔·奎扎达",
          "original_name": "史蒂文·迈克尔·奎扎达",
          "popularity": 1.7511,
          "profile_path": "/pVYrDkwI6GWvCNL2kJhpDJfBFyd.jpg"
        }
      ]
    },
    {
      "air_date": "2008-01-27",
      "episode_number": 2,
      "episode_type": "standard",
      "id": 62086,
      "name": "Cat's in the Bag...",
      "overview": "Walt and Jesse attempt to tie up loose ends. The desperate situation gets mor...",
      "production_code": "",
      "runtime": 49,
      "season_number": 1,
      "show_id": 1396,
      "still_path": "/AbMoecO0ZZio0LcgeLxlzdyGs6X.jpg",
      "vote_average": 0,
      "vote_count": 0,
      "crew": [
        {
          "department": "Camera",
          "job": "Director of Photography",
          "credit_id": "52b7049c19c2953b63015013",
          "adult": false,
          "gender": 2,
          "id": 17948,
          "known_for_department": "Camera",
          "name": "Reynaldo Villalobos",
          "original_name": "Reynaldo Villalobos",
          "popularity": 0.904,
          "profile_path": "/4YlfhHDRZWhbRgeqT2Bwl1u5p9j.jpg"
        }
      ],
      "guest_stars": [
        {
          "character": "Krazy-8",
          "credit_id": "52725845760ee3046b09426e",
          "order": 504,
          "adult": false,
          "gender": 2,
          "id": 1046460,
          "known_for_department": "Acting",
          "name": "Max Arciniega",
          "original_name": "Max Arciniega",
          "popularity": 1.4399,
          "profile_path": "/eqKAJKPpt41KpsLIkkBnAY4HMAL.jpg"
        }
      ]
    }
  ],
  "name": "Season 1",
  "overview": "High school chemistry teacher Walter White's life is suddenly transformed by...",
  "id": 3572,
  "poster_path": "/91EIXdWxmp2mHNRsSuDW3WyDJLj.jpg",
  "season_number": 1,
  "vote_average": 0
}

Obtén una serie completa

amodb no acepta valores del tipo season/1 en append_to_response, así que las llamadas de temporada van por separado. Lee primero number_of_seasons y la lista seasons de los detalles de TV, y luego solicita cada temporada en un bucle.

JavaScript
const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };

async function get(path) {
  const res = await fetch(base + path, { headers });
  if (!res.ok) throw new Error(`amodb returned ${res.status} for ${path}`);
  return res.json();
}

const show = await get('/tv/1396');
for (const { season_number } of show.seasons) {
  const season = await get(`/tv/1396/season/${season_number}`);
  console.log(season.name, season.episodes.length);
}

seasons incluye la temporada 0 cuando la serie tiene especiales, así que Breaking Bad cuesta 1 llamada de detalles más 6 llamadas de temporada. Una serie con 10 temporadas cuesta 11 solicitudes. Los detalles se guardan en la caché perimetral 6 horas, así que almacena el resultado y actualízalo según un calendario.

Fechas de emisión y qué viene después

GET /3/tv/{tv_id} contiene next_episode_to_air y last_episode_to_air, objetos de episodio completos con name, air_date, season_number, episode_number, runtime y still_path. next_episode_to_air es null cuando no hay nada anunciado. Combínalo con status (por ejemplo Returning Series, Ended o Canceled) para decidir si muestras una cuenta atrás.

air_date es una fecha de calendario sin hora del día. Compárala con la fecha de hoy para marcar los episodios nuevos. Para un calendario de lo que se emite, las listas airing_today y on_the_air de tendencias y listas se guardan en caché 30 minutos.

Imágenes de episodio y duraciones

Usa w185 o w300 para las filas de una lista y original para el tamaño completo. Los tamaños de imagen de episodio son w92, w185, w300 y original. Un episodio puede no tener imagen, así que muestra un marcador de posición cuando still_path sea null. El host de imágenes no necesita clave, consulta imágenes.

runtime está en minutos y puede ser null. Para mostrar el tiempo de maratón de una temporada, suma runtime de todos los episodes y cuenta null como 0. Añade append_to_response=credits,images a la ruta de un solo episodio para obtener un objeto credits y una lista stills. El array cast del episodio está vacío, y las personas aparecen en crew y guest_stars. Los detalles están en temporadas y episodios y en créditos.

Órdenes alternativos con grupos de episodios

Algunas series se ven en un orden distinto al de su emisión. GET /3/tv/{tv_id}/episode_groups lista los órdenes definidos para una serie. Cada entrada tiene id, name, description, type, episode_count, group_count y network. El array results está vacío cuando no hay ninguno definido.

typeOrden
1Fecha de emisión original
2Absoluto
3DVD
4Digital
5Arco argumental
6Producción
7TV

amodb solo devuelve esta lista. No ofrece GET /3/tv/episode_group/{id}, así que los episodios dentro de un grupo no están disponibles. Usa los endpoints de temporada para los datos de episodios.

Cómo se compara

CapacidadHacer scraping de páginas de episodiosAPI de metadatos con nivel gratuitoamodb
Temporada completaUna página por cada temporadaConsulta su documentaciónUna llamada, con el array episodes incluido
Serie completaRastrear cada temporadaConsulta su documentaciónUna llamada por temporada, listadas en seasons
Fechas de emisiónAnalizar textoConsulta su documentaciónair_date más next_episode_to_air
Imágenes de episodioDescargar y redimensionarConsulta su documentaciónTamaños fijos en img.amodb.dev, sin clave
Otros órdenes de episodiosNo disponibleConsulta su documentaciónLista episode_groups, sin el contenido de los grupos
IdiomasUn idioma por sitioConsulta su documentación14 idiomas con language

Precios

Los planes son prepago por 1, 3, 6, 12 o 24 meses, con 0, 10, 20, 30 o 40 por ciento de descuento en los periodos más largos, y nunca se renuevan solos. Los planes de 20, 40 y 120 solicitudes por minuto devuelven todos los endpoints de esta página. Actualizar una serie cuesta una solicitud para los detalles y una por temporada. No hay nivel gratuito. Elige un plan en precios.