Watch It? Track It.

El base.json de una serie contiene todas sus temporadas y episodios, así que una sola petición obtiene la serie completa. Los nombres y descripciones de la serie, sus temporadas y sus episodios están en los archivos de idioma.

Archivos

  • https://api.watchittrackit.com/v1/tv/{id}/base.json
  • https://api.watchittrackit.com/v1/tv/{id}/{lang}.json
  • https://api.watchittrackit.com/v1/tv/slugs/{shard}.json

Una imagen es un objeto con las rutas full y thumb.

base.json

CampoTipoDescripción
typestringTipo de registro.
idnumberId de TheTVDB.
slugstringSlug de la URL, único dentro del tipo.
popularitynumberPuntuación de popularidad de TheTVDB; cuanto más alta, más popular. Las puntuaciones solo son comparables dentro de un mismo tipo.
deletedbooleanTrue si el registro se eliminó. Sus archivos siguen publicados.
firstAiredstringFecha del primer episodio (YYYY-MM-DD).
lastAiredstringFecha del episodio más reciente.
statusstringEstado de emisión según TheTVDB, como Continuing o Ended.
networkstringCadena.
originalLanguagestringCódigo del idioma original.
originalCountrystringPaís de origen (código de tres letras).
imageimageImagen principal: un póster para los títulos, una foto para las personas.
images{ [kind]: image }La mejor imagen de cada clase: poster, background, banner, icon, clearart, clearlogo.
imagesByLang{ [kind]: image[] }Por clase, la mejor imagen en cada idioma, con su código de idioma, tamaño y puntuación.
castcredit[]Actores, en orden de aparición en los créditos.
crewcredit[]Todas las demás personas acreditadas, con su función.
topBilledIdsnumber[]Ids de las personas que se destacan primero.
seasonsseason[]Temporadas en orden de emisión, cada una con sus episodios.
genresstring[]Slugs de género, tal como los define TheTVDB.
languagesstring[]Idiomas para los que este registro tiene archivos.
remoteIds{ [site]: string }Ids en otros sitios (imdb, tmdb, wikidata, …), indexados por sitio.

Ejemplo

{
  "type": "tv",
  "id": 81189,
  "slug": "breaking-bad",
  "popularity": 3287090,
  "deleted": false,
  "firstAired": "2008-01-20",
  "lastAired": "2013-09-29",
  "status": "Ended",
  "images": {
    "poster": { "full": "/images/tv/81189/1340353429.jpg", "thumb": "/images/tv/81189/1340353429.t.jpg" }
  },
  "cast": [
    { "id": 255211, "activityId": 180, "role": "Walter White", "slug": "bryan-cranston", "topBilled": false, "deleted": false }
  ],
  "seasons": [
    {
      "id": 30272, "number": 1, "deleted": false,
      "episodes": [{ "id": 349232, "number": 1, "aired": "2008-01-20", "runtime": 58, "deleted": false }]
    }
  ],
  "genres": ["drama", "crime"],
  "languages": ["de", "en", "fr"],
  "remoteIds": { "imdb": "tt0903747" }
}

Temporadas

CampoTipoDescripción
idnumberId de TheTVDB.
numbernumberNúmero de temporada; 0 corresponde a los especiales.
deletedbooleanTrue si el registro se eliminó. Sus archivos siguen publicados.
imageimageImagen principal: un póster para los títulos, una foto para las personas.
images{ [kind]: image }La mejor imagen de cada clase: poster, background, banner, icon, clearart, clearlogo.
imagesByLang{ [kind]: image[] }Por clase, la mejor imagen en cada idioma, con su código de idioma, tamaño y puntuación.
episodesepisode[]Los episodios de la temporada.

Episodios

CampoTipoDescripción
idnumberId de TheTVDB.
numbernumberNúmero del episodio dentro de su temporada.
airedstringFecha de emisión (YYYY-MM-DD).
runtimenumberDuración en minutos.
imageimageImagen principal: un póster para los títulos, una foto para las personas.
criticalToStorybooleanMarcado como esencial para la historia.
specialTypestringQué tipo de especial es (episodios de la temporada 0).
deletedbooleanTrue si el registro se eliminó. Sus archivos siguen publicados.

Créditos

Cada entrada de cast y crew:

CampoTipoDescripción
idnumberId de la persona.
activityIdnumberId del crédito, único por crédito.
rolestringPersonaje interpretado (reparto).
jobstringFunción (equipo): director, writer, producer, …
slugstringEl slug de la persona.
imageimageLa foto de la persona.
topBilledbooleanUn crédito destacado.
deletedbooleanTrue si la persona se eliminó.

Archivos de idioma

CampoTipoDescripción
typestringTipo de registro.
idnumberId de TheTVDB.
langstringIdioma de este archivo.
namestringNombre en este idioma.
overviewstringDescripción en este idioma.
credits{ [personId]: { name, role } }Por id de persona: su nombre en este idioma y su papel.
seasons{ [seasonId]: { name, overview } }Por id de temporada: su nombre y descripción.
episodes{ [episodeId]: { name, overview } }Por id de episodio: su nombre y descripción.

Ejemplo

{
  "type": "tv",
  "id": 81189,
  "lang": "en",
  "name": "Breaking Bad",
  "overview": "When Walter White, a chemistry teacher, …",
  "credits": { "255211": { "name": "Bryan Cranston", "role": "Walter White" } },
  "seasons": { "30272": { "overview": "High school chemistry teacher Walter White…" } },
  "episodes": { "349232": { "name": "Pilot", "overview": "When an unassuming high school chemistry teacher…" } }
}

Encontrar un título por su slug

Las URL de series y películas usan slugs (breaking-bad). El índice de slugs asigna cada slug a su id y está dividido en 256 archivos pequeños: el archivo de un slug se nombra con los dos primeros caracteres hexadecimales del SHA-1 del slug.

// Node.js
import { createHash } from "node:crypto"

const slug = "breaking-bad"
const shard = createHash("sha1").update(slug, "utf8").digest("hex").slice(0, 2)
const index = await fetch(`https://api.watchittrackit.com/v1/tv/slugs/${shard}.json`).then((r) => r.json())
const id = index[slug]
const record = await fetch(`https://api.watchittrackit.com/v1/tv/${id}/base.json`).then((r) => r.json())