API
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.jsonhttps://api.watchittrackit.com/v1/tv/{id}/{lang}.jsonhttps://api.watchittrackit.com/v1/tv/slugs/{shard}.json
Une image est un objet avec les chemins full et thumb.
base.json
| Champ | Type | Description |
|---|---|---|
| type | string | Type d'enregistrement. |
| id | number | Identifiant TheTVDB. |
| slug | string | Slug d'URL, unique au sein du type. |
| popularity | number | Score 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. |
| deleted | boolean | True si l'enregistrement a été supprimé. Ses fichiers restent publiés. |
| firstAired | string | Date du premier épisode (YYYY-MM-DD). |
| lastAired | string | Date du dernier épisode. |
| status | string | Statut de diffusion selon TheTVDB, par exemple Continuing ou Ended. |
| network | string | Chaîne. |
| originalLanguage | string | Code de la langue originale. |
| originalCountry | string | Pays d'origine (code à trois lettres). |
| image | image | Image 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. |
| cast | credit[] | Acteurs, dans l'ordre du générique. |
| crew | credit[] | Toutes les autres personnes créditées, avec leur fonction. |
| topBilledIds | number[] | Identifiants des personnes à mettre en avant en premier. |
| seasons | season[] | Saisons dans l'ordre de diffusion, chacune avec ses épisodes. |
| genres | string[] | Slugs de genres, tels que définis par TheTVDB. |
| languages | string[] | 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
| Champ | Type | Description |
|---|---|---|
| id | number | Identifiant TheTVDB. |
| number | number | Numéro de saison ; 0 correspond aux épisodes spéciaux. |
| deleted | boolean | True si l'enregistrement a été supprimé. Ses fichiers restent publiés. |
| image | image | Image 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. |
| episodes | episode[] | Les épisodes de la saison. |
Épisodes
| Champ | Type | Description |
|---|---|---|
| id | number | Identifiant TheTVDB. |
| number | number | Numéro de l'épisode dans sa saison. |
| aired | string | Date de diffusion (YYYY-MM-DD). |
| runtime | number | Durée en minutes. |
| image | image | Image principale : une affiche pour les titres, une photo pour les personnes. |
| criticalToStory | boolean | Marqué comme essentiel à l'intrigue. |
| specialType | string | Type d'épisode spécial (épisodes de la saison 0). |
| deleted | boolean | True si l'enregistrement a été supprimé. Ses fichiers restent publiés. |
Générique
Chaque entrée de cast et crew :
| Champ | Type | Description |
|---|---|---|
| id | number | Identifiant de la personne. |
| activityId | number | Identifiant du crédit, unique pour chaque crédit. |
| role | string | Personnage interprété (distribution). |
| job | string | Fonction (équipe) : director, writer, producer, … |
| slug | string | Le slug de la personne. |
| image | image | La photo de la personne. |
| topBilled | boolean | Un crédit mis en avant. |
| deleted | boolean | True si la personne a été supprimée. |
Fichiers de langue
| Champ | Type | Description |
|---|---|---|
| type | string | Type d'enregistrement. |
| id | number | Identifiant TheTVDB. |
| lang | string | Langue de ce fichier. |
| name | string | Nom dans cette langue. |
| overview | string | Description 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())