8.0 KiB
Objectif
Nous evaluons une nouvelle facon de fournir les donnees de programmation et de contenus aux sites web TFO, IDELLO, ONFR et lineaire.
L'objectif est de savoir si une publication sous forme de fichiers JSON versionnes peut bien repondre a vos besoins techniques et operationnels.
Ce document ne presente pas une decision finale. Il sert a recueillir vos commentaires avant de figer le format.
Idee generale
Aujourd'hui, les donnees sont disponibles via Directus ou via des mecanismes de synchronisation propres a chaque site.
La proposition est de publier des fichiers JSON prets a consommer, organises par plateforme, par version et par publication.
Exemple:
/tfo/v1/manifest.json
/tfo/v1/runs/20260730-0900/today.json
/tfo/v1/runs/20260730-0900/latest.json
/tfo/v1/runs/20260730-0900/schedule/2026-07-30.json
/tfo/v1/runs/20260730-0900/schedule/2026-08-08.json
/tfo/v1/runs/20260730-0900/products/GP123456.json
/tfo/v1/runs/20260730-0900/collections/0123456/full.json
/tfo/v1/runs/20260730-0900/search/index.json
Les sites ne devraient pas coder un chemin de run en dur. Ils liraient d'abord:
/tfo/v1/manifest.json
Puis utiliseraient le base_path retourne par le manifest pour charger les fichiers du run actif.
Exemple de manifest
{
"schema_version": "1.0",
"platform": "tfo",
"published_at": "2026-07-30T09:50:00-04:00",
"run_id": "20260730-0900",
"base_path": "/tfo/v1/runs/20260730-0900"
}
Le manifest.json permet de changer de publication de facon atomique. Si une nouvelle generation echoue, le manifest continue de pointer vers le dernier run valide.
Types de fichiers proposes
today.json
Contient les contenus ou programmations pertinents pour la journee courante.
{
"schema_version": "1.0",
"platform": "tfo",
"run_id": "20260730-0900",
"date": "2026-07-30",
"programs": []
}
latest.json
Contient les contenus ajoutes, modifies ou retires depuis la derniere publication.
{
"schema_version": "1.0",
"platform": "tfo",
"run_id": "20260730-0900",
"added": [],
"updated": [],
"removed": []
}
schedule/YYYY-MM-DD.json
Contient la programmation pour une date precise.
{
"schema_version": "1.0",
"platform": "tfo",
"run_id": "20260730-0900",
"date": "2026-08-08",
"programs": [
{
"program_key": "123",
"product_key": "GP123456",
"begin": "2026-08-08T06:00:00-04:00",
"end": "2026-08-08T06:24:00-04:00",
"title": "Titre de l'episode"
}
]
}
La premiere version viserait une fenetre future jusqu'a J+10.
products/{product_key}.json
Contient le detail d'un produit ou episode.
{
"schema_version": "1.0",
"platform": "tfo",
"run_id": "20260730-0900",
"product": {
"product_key": "GP123456",
"biznumber": "0123456",
"title": "Titre de l'episode",
"description": "..."
},
"programmations": {
"current": [],
"upcoming": [],
"next": {
"date": "2026-08-08",
"begin": "2026-08-08T06:00:00-04:00"
}
},
"media": {},
"images": []
}
collections/{biznumber}/full.json
Contient une vue complete d'une collection, dans le sens attendu par les sites:
collection -> saisons -> episodes
Exemple:
{
"schema_version": "1.0",
"platform": "tfo",
"run_id": "20260730-0900",
"collection": {
"biznumber": "0123456",
"title": "Titre de la collection",
"description": "...",
"programmation": {
"start": "2026-08-08T06:00:00-04:00",
"end": "2026-08-08T06:24:00-04:00"
},
"next_programmation": {
"date": "2026-08-08",
"begin": "2026-08-08T06:00:00-04:00"
}
},
"seasons": [
{
"serie": {
"serie_key": "S123",
"title": "Saison 1"
},
"episodes": [
{
"product": {
"product_key": "GP123456",
"title": "Episode 1"
},
"programmations": [],
"media": {},
"images": []
}
]
}
]
}
search/index.json
Fichier optionnel pouvant servir a alimenter un moteur de recherche comme Algolia, Meilisearch, Typesense ou un index interne.
[
{
"objectID": "GP123456",
"type": "product",
"title": "Titre de l'episode",
"slug": "titre-de-lepisode",
"image": "https://...",
"collection_biznumber": "0123456"
}
]
Cache propose
Le manifest aurait un cache court:
/tfo/v1/manifest.json
Cache-Control: public, max-age=60, stale-while-revalidate=120
Les fichiers d'un run seraient immuables et pourraient etre caches longtemps:
/tfo/v1/runs/20260730-0900/*
Cache-Control: public, max-age=31536000, immutable
Logique:
- le site consulte regulierement
manifest.json; - si
run_idchange, le site charge les fichiers du nouveau run; - les fichiers des runs ne changent jamais;
- un rollback peut etre fait en repointant le manifest vers un run precedent.
Points importants pour les sites
- Les JSON seraient versionnes dans le chemin:
/v1/, puis eventuellement/v2/. - Les changements cassants seraient publies dans une nouvelle version.
- Les dates seraient fournies avec timezone explicite.
- Les fichiers seraient separes pour eviter de telecharger un enorme JSON unique.
- Les sites pourraient consommer seulement les fichiers utiles a leurs pages.
- Les fournisseurs pourraient avoir acces uniquement a leur plateforme ou prefixe.
Questions pour vous
Merci de nous dire si cette approche fonctionnerait pour votre site, et de commenter les points suivants.
Consommation
- Est-ce que votre site peut consommer des fichiers JSON statiques via HTTP/CDN?
- Est-ce que votre site peut lire un
manifest.jsonavant de charger les donnees? - Avez-vous besoin d'une API dynamique, ou des fichiers JSON suffisent?
- Avez-vous des contraintes sur le nombre de fichiers charges?
Structure des donnees
- Le modele
collection -> seasons -> episodesconvient-il a vos pages? - Le fichier
products/{product_key}.jsoncontient-il le bon niveau de detail? - Le fichier
collections/{biznumber}/full.jsonest-il trop gros, trop petit ou correct? - Avez-vous besoin d'autres regroupements?
- Quels champs sont obligatoires pour vos pages?
Programmation
- La fenetre future J+10 est-elle suffisante?
- Avez-vous besoin de programmation passee?
- Avez-vous besoin d'un fichier par date, par semaine ou par mois?
- Comment affichez-vous "prochain episode" aujourd'hui?
Media et images
- Quels champs media sont requis pour votre lecteur video?
- Avez-vous besoin de plusieurs formats d'image?
- Avez-vous besoin de sous-titres, transcriptions, audio ou autres assets dans le JSON?
Recherche
- Utilisez-vous Algolia, Meilisearch, Typesense ou un autre moteur?
- Un fichier
search/index.jsonvous serait-il utile? - Quels champs devraient etre inclus dans l'index?
Cache et mise a jour
- Un cache court sur
manifest.jsonvous convient-il? - Quelle frequence de verification du manifest serait acceptable?
- Avez-vous besoin d'un webhook ou signal pour savoir qu'un nouveau run est disponible?
- Comment votre site ferait-il un rollback si necessaire?
Migration
- Pouvez-vous tester cette approche en parallele de votre integration actuelle?
- Quel serait le meilleur pilote pour vous: une page, une plateforme, une collection, une section?
- Quels risques voyez-vous dans une migration vers ce modele?
Commentaires attendus
Pour nous aider a valider l'approche, merci de repondre avec:
- les fichiers que vous utiliseriez;
- les champs manquants;
- les champs inutiles;
- les contraintes de performance ou cache;
- les impacts sur votre architecture;
- les risques de migration;
- une estimation du travail cote site.
Decision recherchee
Nous voulons confirmer si cette approche JSON peut devenir un contrat stable entre notre systeme de publication et les sites.
La decision attendue n'est pas encore "on migre tout". La decision attendue est plutot:
Est-ce que ce modele JSON est techniquement viable pour les sites?
Si oui, quels ajustements sont necessaires avant un pilote?