Le défi
Un établissement d’enseignement supérieur nord-américain disposait de Panopto pour la capture de cours et de Canvas LMS pour la diffusion des cours, mais rien ne les reliait à grande échelle. Chaque session, une équipe de conception pédagogique passait environ 600 heures sur la même boucle manuelle : confirmer qu’un enregistrement est terminé, trouver le bon dossier Panopto, nommer correctement l’enregistrement, définir sous-titres et accès, publier un lien dans le bon module Canvas, puis relancer les cours qui n’avaient pas été enregistrés du tout.
Les modes de défaillance étaient frustrants et prévisibles. Enregistrements publiés dans la mauvaise section. Sous-titres retardés de plusieurs jours. Salles de fin de session aux dispositifs de capture défaillants que personne ne remarquait avant les plaintes des étudiants. Et aucune piste d’audit — quand un étudiant demandait « pourquoi le cours de jeudi dernier manquait-il ? », personne ne pouvait répondre avec certitude. L’établissement voulait récupérer les 600 heures de l’équipe, détecter les défaillances dès qu’elles se produisent et disposer d’un système capable de doubler le nombre de salles actuel sans augmenter les effectifs.
Notre solution
Nous avons construit une couche d’orchestration de bout en bout en Python et FastAPI qui écoute les événements de cours Canvas et les événements d’enregistrement Panopto, les relie via un modèle de catalogue local qui connaît les cours, sections, salles et enseignants, et pilote automatiquement tout le workflow de publication.
Le catalogue local est l’idée clé. Au lieu de poser sans cesse les mêmes questions à Canvas et à Panopto, nous maintenons un petit catalogue PostgreSQL faisant autorité : cours, sections, correspondances salle-section, responsabilité enseignant-section et règles de publication choisies par chaque département. Les Canvas Live Events et les webhooks Panopto mettent le catalogue à jour quasiment en temps réel ; un service d’orchestration FastAPI pilote ensuite chaque action en aval : classer l’enregistrement dans le bon dossier Panopto, demander les sous-titres, définir l’accès selon la liste de la section, publier le cours dans le bon module Canvas et écrire un événement d’audit structuré pour chaque étape.
Un filtrage intelligent détecte les défaillances qui étaient auparavant invisibles. Si un cours planifié n’a aucun enregistrement 15 minutes après la fin du cours, le système alerte l’équipe de soutien pédagogique et ouvre un incident suivi. Si les sous-titres manquent encore après le délai du SLA, il escalade. Chaque action de publication — réussie ou non — est consignée avec qui, quoi, quand, pourquoi et les événements amont qui l’ont déclenchée, de sorte que la question « pourquoi le cours de jeudi dernier manquait-il ? » a maintenant une réponse en 30 secondes.
- Catalogue local des cours, sections, salles, enseignants et règles de publication par département
- Ingestion des Canvas Live Events + webhooks Panopto via un récepteur selon le modèle inbox
- Machine à états idempotente par enregistrement : détecté → classé → sous-titré → publié → audité
- Détection intelligente des enregistrements manquants avec SLA de 15 minutes et création d’incident suivi
- Surveillance du SLA des sous-titres avec escalade automatique en cas de dépassement
- Contrôle d’accès par section selon la liste des inscrits, appliqué aux dossiers Panopto et aux publications Canvas
- Outil de rejeu pour relancer de bout en bout le workflow de publication de tout enregistrement historique
- Journal d’audit structuré répondant à « pourquoi ce cours manque-t-il ? » en 30 secondes
- Interface d’administration permettant à l’équipe de conception pédagogique de modifier les règles de publication sans ingénieur