Watch It? Track It.

Le base.json d'une série contient toutes ses saisons et tous ses épisodes : une seule requête suffit pour obtenir la série entière. Les noms et descriptions de la série, de ses saisons et de ses épisodes se trouvent dans les fichiers de langue.

Fichiers

  • 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

Une image est un objet avec les chemins full et thumb.

base.json

ChampTypeDescription
typestringType d'enregistrement.
idnumberIdentifiant TheTVDB.
slugstringSlug d'URL, unique au sein du type.
popularitynumberScore de popularité TheTVDB ; plus il est élevé, plus le titre est populaire. Les scores ne sont comparables qu'au sein d'un même type.
deletedbooleanTrue si l'enregistrement a été supprimé. Ses fichiers restent publiés.
firstAiredstringDate du premier épisode (YYYY-MM-DD).
lastAiredstringDate du dernier épisode.
statusstringStatut de diffusion selon TheTVDB, par exemple Continuing ou Ended.
networkstringChaîne.
originalLanguagestringCode de la langue originale.
originalCountrystringPays d'origine (code à trois lettres).
imageimageImage principale : une affiche pour les titres, une photo pour les personnes.
images{ [kind]: image }La meilleure image de chaque sorte : poster, background, banner, icon, clearart, clearlogo.
imagesByLang{ [kind]: image[] }Pour chaque sorte, la meilleure image dans chaque langue, avec son code de langue, sa taille et son score.
castcredit[]Acteurs, dans l'ordre du générique.
crewcredit[]Toutes les autres personnes créditées, avec leur fonction.
topBilledIdsnumber[]Identifiants des personnes à mettre en avant en premier.
seasonsseason[]Saisons dans l'ordre de diffusion, chacune avec ses épisodes.
genresstring[]Slugs de genres, tels que définis par TheTVDB.
languagesstring[]Langues pour lesquelles cet enregistrement possède des fichiers.
remoteIds{ [site]: string }Identifiants sur d'autres sites (imdb, tmdb, wikidata, …), indexés par site.

Exemple

{
  "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" }
}

Saisons

ChampTypeDescription
idnumberIdentifiant TheTVDB.
numbernumberNuméro de saison ; 0 correspond aux épisodes spéciaux.
deletedbooleanTrue si l'enregistrement a été supprimé. Ses fichiers restent publiés.
imageimageImage principale : une affiche pour les titres, une photo pour les personnes.
images{ [kind]: image }La meilleure image de chaque sorte : poster, background, banner, icon, clearart, clearlogo.
imagesByLang{ [kind]: image[] }Pour chaque sorte, la meilleure image dans chaque langue, avec son code de langue, sa taille et son score.
episodesepisode[]Les épisodes de la saison.

Épisodes

ChampTypeDescription
idnumberIdentifiant TheTVDB.
numbernumberNuméro de l'épisode dans sa saison.
airedstringDate de diffusion (YYYY-MM-DD).
runtimenumberDurée en minutes.
imageimageImage principale : une affiche pour les titres, une photo pour les personnes.
criticalToStorybooleanMarqué comme essentiel à l'intrigue.
specialTypestringType d'épisode spécial (épisodes de la saison 0).
deletedbooleanTrue si l'enregistrement a été supprimé. Ses fichiers restent publiés.

Générique

Chaque entrée de cast et crew :

ChampTypeDescription
idnumberIdentifiant de la personne.
activityIdnumberIdentifiant du crédit, unique pour chaque crédit.
rolestringPersonnage interprété (distribution).
jobstringFonction (équipe) : director, writer, producer, …
slugstringLe slug de la personne.
imageimageLa photo de la personne.
topBilledbooleanUn crédit mis en avant.
deletedbooleanTrue si la personne a été supprimée.

Fichiers de langue

ChampTypeDescription
typestringType d'enregistrement.
idnumberIdentifiant TheTVDB.
langstringLangue de ce fichier.
namestringNom dans cette langue.
overviewstringDescription dans cette langue.
credits{ [personId]: { name, role } }Par identifiant de personne : son nom dans cette langue et son rôle.
seasons{ [seasonId]: { name, overview } }Par identifiant de saison : son nom et sa description.
episodes{ [episodeId]: { name, overview } }Par identifiant d'épisode : son nom et sa description.

Exemple

{
  "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…" } }
}

Trouver un titre par son slug

Les URL des séries et des films utilisent des slugs (breaking-bad). L'index des slugs associe chaque slug à son identifiant et est réparti en 256 petits fichiers : le fichier d'un slug porte le nom des deux premiers caractères hexadécimaux du SHA-1 du 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())