vault backup: 2026-07-31 11:53:41
This commit is contained in:
+305
@@ -0,0 +1,305 @@
|
||||
|
||||
## 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:
|
||||
|
||||
```text
|
||||
/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:
|
||||
|
||||
```text
|
||||
/tfo/v1/manifest.json
|
||||
```
|
||||
|
||||
Puis utiliseraient le `base_path` retourne par le manifest pour charger les fichiers du run actif.
|
||||
|
||||
## Exemple de manifest
|
||||
|
||||
```json
|
||||
{
|
||||
"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.
|
||||
|
||||
```json
|
||||
{
|
||||
"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.
|
||||
|
||||
```json
|
||||
{
|
||||
"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.
|
||||
|
||||
```json
|
||||
{
|
||||
"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.
|
||||
|
||||
```json
|
||||
{
|
||||
"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:
|
||||
|
||||
```text
|
||||
collection -> saisons -> episodes
|
||||
```
|
||||
|
||||
Exemple:
|
||||
|
||||
```json
|
||||
{
|
||||
"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.
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"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:
|
||||
|
||||
```text
|
||||
/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:
|
||||
|
||||
```text
|
||||
/tfo/v1/runs/20260730-0900/*
|
||||
Cache-Control: public, max-age=31536000, immutable
|
||||
```
|
||||
|
||||
Logique:
|
||||
|
||||
- le site consulte regulierement `manifest.json`;
|
||||
- si `run_id` change, 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.json` avant 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 -> episodes` convient-il a vos pages?
|
||||
- Le fichier `products/{product_key}.json` contient-il le bon niveau de detail?
|
||||
- Le fichier `collections/{biznumber}/full.json` est-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.json` vous serait-il utile?
|
||||
- Quels champs devraient etre inclus dans l'index?
|
||||
|
||||
### Cache et mise a jour
|
||||
|
||||
- Un cache court sur `manifest.json` vous 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:
|
||||
|
||||
```text
|
||||
Est-ce que ce modele JSON est techniquement viable pour les sites?
|
||||
Si oui, quels ajustements sont necessaires avant un pilote?
|
||||
```
|
||||
Reference in New Issue
Block a user