⚙️
Home/⚙️Spécifications — Scripts d'automatisation CEBTG

Spécifications — Scripts d'automatisation CEBTG

Document de référence pour les scripts d'automatisation du projet tibetain.cebtg.ch.
Dernière mise à jour : 11 mai 2026.

Infrastructure générale

  • Notion — CMS et bases de données
  • kDrive Infomaniak — stockage des fichiers PDF
  • kCalendar Infomaniak — calendrier des cours (CalDAV)
  • Bullet.so — publication web (tibetain.cebtg.ch)
  • Tally Pro — formulaires d'inscription
  • YouTube — replays des cours (chaîne @falcolito)
  • Anthropic API — génération des résumés automatiques (Claude)
  • Webshare — proxy résidentiel rotatif (contournement blocage YouTube)

Environnement d'exécution

Tous les scripts tournent sur le Mac local de Jean-Marc, lancés manuellement selon les besoins.
Activation de l'environnement virtuel (obligatoire avant tout script) :
source ~/venv-cebtg/bin/activate
Dossier des scripts :
~/Documents/MesScripts/kDrive - Notion/
Dépendances Python (installées une seule fois) :
pip install yt-dlp requests anthropic youtube-transcript-api
Fichier de configuration : config.json dans le même dossier.
Structure du config.json :
{ "notion": { "token": "secret_...", "db_replays_youtube": "740058cf0fa1470cb93e4de1c43d0efb", "db_ressources": "90340df9fcbb480f80d86b7b7c473dc3" }, "anthropic": { "api_key": "sk-ant-..." }, "options": { "dry_run": true, "log_file": "sync_local_ftp_notion.log", "log_file_youtube": "sync_youtube_notion.log", "log_file_summaries": "sync_youtube_summaries.log", "miniature_largeur_px": 400, "caldav_horizon_jours": 90 } }

Bases de données Notion

Base
ID
Usage
Contacts JM
afac5f30dd154106969fff73bc2feab5
Étudiants inscrits
Ressources Pédagogiques
90340df9fcbb480f80d86b7b7c473dc3
Supports PDF des cours
Cours à venir
84b33cbc7c7e49deb63967674c81eed4
Calendrier des séances
Replays YouTube
740058cf0fa1470cb93e4de1c43d0efb
Vidéos des cours

Script 1 — sync_local_ftp_notion.py

Rôle : Synchronise les PDFs depuis kDrive local vers le serveur FTP Infomaniak et crée les entrées dans Ressources Pédagogiques avec miniatures.
Quand le lancer : Après chaque dépôt de nouveau PDF dans kDrive.
Commandes :
cd ~/Documents/MesScripts/kDrive\ -\ Notion source ~/venv-cebtg/bin/activate # ✅ CAS HABITUEL — ajout de nouveaux PDFs (ignore les 250 déjà dans Notion) python3 sync_local_ftp_notion.py --sync --new-only # ✅ CAS HABITUEL — un seul PDF précis python3 sync_local_ftp_notion.py --sync --file Tib1/2025-2026/sujet/lecon-06.pdf # Simulation préalable (sans --sync) — voir ce qui serait traité python3 sync_local_ftp_notion.py --new-only # Sync complète (tous les PDFs — MET À JOUR les existants aussi — lent, ~20-30 min) python3 sync_local_ftp_notion.py --sync # Test de connexion FTP uniquement python3 sync_local_ftp_notion.py --ftp-test
⚠️ Fonctionnement du mode simulation et règle des deux options :
  • dry_run: true dans config.json → le script simule sans rien modifier (recommandé par défaut)
  • L'option --sync est toujours nécessaire pour une exécution réelle
  • L'option --new-only est indépendante : elle filtre les PDFs déjà présents dans Notion, quelle que soit la présence de --sync
  • ⚠️ Erreur fréquente : --new-only seul (sans --sync) = simulation uniquement des nouveaux. Il faut toujours combiner --sync --new-only pour le workflow quotidien.
Commande
Effet
(aucun argument)
Simulation complète (tous les PDFs)
--new-only
Simulation, nouveaux uniquement
--sync
Exécution réelle, tous les PDFs (met à jour les existants)
--sync --new-only
Exécution réelle, nouveaux uniquement — commande du quotidien
--sync --file Tib1/…/lecon.pdf
Exécution réelle, un seul fichier précis
Ce que fait le script :
  • Lit les PDFs dans /Users/jm/kDrive/Cours de tibétain/Tibétain/
  • Les uploade sur le FTP Infomaniak (579j3l.ftp.infomaniak.com, user 579j3l_cebtg_jm) vers sites/cebtg.ch/cours/
  • Génère une miniature PNG de la première page via PyMuPDF
  • Crée ou met à jour la fiche dans Ressources Pédagogiques (pivot : kDrive Path)
  • URL publique des PDFs : https://cebtg.ch/cours/TibX/AAAA-AAAA/sujet/lecon-NN.pdf
Arborescence de référence (kDrive local) :
Tibétain/ Tib1/ 2021-2022/ tchenrezi-1/ 2025-2026/ dakayeshe/ bodhicaryavatara/ Tib2/ 2022-2023/ sutra-du-coeur/ 2023-2024/ sutra-pousse-de-riz-1/ 2024-2025/ sutra-pousse-de-riz-2/ 2025-2026/ sutra-pousse-de-riz-3/ Tib3/ 2023-2024/ sangtcheu-meunlam-1/
⚠️ Convention de nommage des dossiers : minuscules, tirets à la place des espaces (ex. nouveau-sujet). Le script convertit automatiquement en texte lisible (Nouveau sujet) pour le champ Chapitre/Section dans Notion.
Ajouter un nouveau sujet de cours :
Aucune modification du script n'est nécessaire. Il suffit de :
  1. Créer le dossier sur le Mac : Tibétain/TibX/AAAA-AAAA/nom-du-sujet/
  2. Attendre la synchronisation kDrive
  3. Déposer les PDFs dans ce dossier
  4. Lancer python3 sync_local_ftp_notion.py --sync --new-only
Le script créera automatiquement les fiches Notion, uploadera les PDFs sur le FTP et générera les miniatures, sans retraiter les leçons déjà synchronisées. Le champ Chapitre/Section sera déduit du nom du dossier.

Script 2 — sync_caldav_notion.py

Rôle : Synchronise le calendrier kCalendar Infomaniak vers la base "Cours à venir" dans Notion.
⚡ Automatisé via GitHub Actions depuis le 11 mai 2026.
Dépôt GitHub : falco36/cebtg-scripts (privé)
Déclenchement automatique : chaque lundi à 6h00 heure de Zurich — aucune action requise.
Déclenchement manuel (depuis iPhone ou navigateur) :
  1. Aller sur github.com/falco36/cebtg-scripts
  2. Onglet ActionsSync CalDAV Notion
  3. Bouton Run workflowRun workflow (vert)
Commandes manuelles Mac (backup) :
cd ~/Documents/MesScripts/kDrive\ -\ Notion source ~/venv-cebtg/bin/activate python3 sync_caldav_notion.py --dry-run # simulation python3 sync_caldav_notion.py # sync réelle
Secrets GitHub configurés (Settings → Secrets → Actions) :
  • ICS_URL — URL export ICS kCalendar Infomaniak
  • NOTION_TOKEN — token API Notion
  • NOTION_DB_COURS_A_VENIR — ID base Cours à venir
  • FTP_HOST / FTP_USER / FTP_PASS / FTP_REMOTE_BASE — accès FTP Infomaniak
Ce que fait le script :
  • Télécharge le calendrier ICS depuis Infomaniak
  • Détecte les cours dans les 90 prochains jours
  • Crée ou met à jour les fiches dans "Cours à venir" (pivot : CalDAV UID)
  • Archive les fiches des cours disparus du calendrier
  • Génère et uploade agenda.html sur le FTP Infomaniak

Script 3 — sync_youtube_notion.py

Rôle : Synchronise les playlists YouTube vers la base "Replays YouTube" et insère la vidéo embarquée dans chaque fiche.
Quand le lancer : Après chaque nouveau replay publié sur YouTube.
Commandes :
cd ~/Documents/MesScripts/kDrive\ -\ Notion source ~/venv-cebtg/bin/activate # ✅ CAS HABITUEL — une seule nouvelle vidéo (quelques secondes) python3 sync_youtube_notion.py --video VIDEO_ID # Nouvelles vidéos uniquement — ignore les 323 existantes (rapide) python3 sync_youtube_notion.py --new-only # Simulation sans écriture python3 sync_youtube_notion.py --dry-run # Sync complète de toutes les playlists (rare — ~15-20 min) python3 sync_youtube_notion.py
Durée approximative : ~15-20 minutes pour une sync complète. Pour le workflow habituel, utiliser --video VIDEO_ID.
Intelligence intégrée :
  • Si une fiche a déjà un bloc vidéo embarquée → le corps n'est pas réécrit
  • Utilise Video ID comme pivot (pas de doublons)
  • Parse la date depuis le titre YouTube ("le 08.04.26")
  • Déduit l'année scolaire depuis la date
Playlists synchronisées (8) :
Playlist ID
Niveau
Sujet
PLuXH8SCX5XpSC1fxvAmr5h8QE6X27LLmK
Tib 1
Bodhicaryāvatāra ch.3
PLuXH8SCX5XpQNZduN8rJymkyo2bku0CEy
Tib 1
Dakayéshé
PLuXH8SCX5XpR4V36sWdPjnvH1dkb6oWib
Tib 3
Prière de la conduite excellente
PLuXH8SCX5XpR6OAwEqUXQZvQOv-DGvB65
Tib 1
Dorjé Tchang Thungma
PLuXH8SCX5XpRhFVtVvmWpO2lbqDSCNYo-
Tib 2
Śālistamba Sūtra
PLuXH8SCX5XpSWMsUVsoIh2WRi1cbvqyEs
Tib 3
37 pratiques
PLuXH8SCX5XpTvL0gFePNqDUBE5wew0Use
Tib 1
Groupe lecture
PLuXH8SCX5XpTaynaLPw13B7MOAQjB4MqC
Tib 2
Groupe Tchenrezi
Pour ajouter une nouvelle playlist en début d'année : modifier la liste PLAYLISTS dans le script (ligne ~37) en ajoutant ("ID_PLAYLIST", "Tib X", "Sujet", "AAAA-AAAA").

Script 4 — sync_youtube_summaries.py

Rôle : Extrait les sous-titres YouTube, génère un résumé pédagogique via Claude AI (Anthropic) et l'insère dans le corps de chaque fiche replay.
Quand le lancer : Après le Script 3, pour les nouvelles fiches. Ne pas relancer plus d'une fois par jour.
Commandes :
cd ~/Documents/MesScripts/kDrive\ -\ Notion source ~/venv-cebtg/bin/activate python3 sync_youtube_summaries.py # toutes les vidéos récentes (6 mois) python3 sync_youtube_summaries.py --dry-run # simulation sans écriture python3 sync_youtube_summaries.py --force # réécrire les résumés existants python3 sync_youtube_summaries.py --video VIDEO_ID # une seule vidéo
Ce que fait le script :
  • Filtre les fiches Notion des 6 derniers mois sans résumé
  • Extrait les sous-titres automatiques YouTube via youtube-transcript-api
  • Utilise le proxy Webshare résidentiel rotatif pour contourner les blocages YouTube
  • Envoie le transcript (~7000 mots) à l'API Claude Anthropic avec un prompt pédagogique
  • Insère le résumé dans la fiche Notion sous forme de callout (brun)
Format du résumé généré :
Bonjour,
Écrit l'embed vidéo YouTube dans le corps de chaque page Notion
Dans cette leçon… (10-15 lignes pédagogiques)
Pour ajouter une nouvelle playlist : modifier la liste PLAYLISTS dans le script (ligne ~37).
Bon replay et bonne étude !
Si vous souhaitez recevoir les supports PDF de cette leçon, merci de vous inscrire. [lien vers /inscription/]
Proxy Webshare (anti-blocage YouTube) :
  • Host : p.webshare.io, Port : 80
  • Rotation automatique parmi 10 proxies résidentiels
  • Compte : lxgnpjsa / voir config.json
  • En cas de blocage persistant : attendre quelques heures et relancer
Prérequis :
  • Clé API Anthropic dans config.json → champ anthropic.api_key
  • Crédit API Anthropic approvisionné (console.anthropic.com)

Script 5 — populate_sujet_relation.py

Rôle : Peuple la propriété relation Sujet dans la base Ressources Pédagogiques en faisant correspondre le champ Chapitre/Section (Ressources) avec le champ Clé Chapitre/Section (Sujets). Une fois la relation remplie, le rollup Nombre de leçons dans la base Sujets se calcule automatiquement.
Quand le lancer :
  • Après la création d'un nouveau sujet dans la base Sujets (renseigner sa Clé Chapitre/Section d'abord)
  • Après l'ajout de nouvelles leçons via Script 1 pour un sujet existant
  • Après correction d'un champ Chapitre/Section (utiliser --force)
Commandes :
cd ~/Documents/MesScripts/kDrive\ -\ Notion source ~/venv-cebtg/bin/activate python populate_sujet_relation.py --dry-run # simulation — affiche ce qui sera fait python populate_sujet_relation.py # exécution réelle python populate_sujet_relation.py --force # écrase les relations déjà renseignées
Ce que fait le script :
  • Compare Chapitre/Section (Ressources) avec Clé Chapitre/Section (Sujets)
  • Remplit la relation Sujet dans chaque fiche Ressource correspondante
  • Le rollup Nombre de leçons se met à jour automatiquement dans Notion
  • Ne touche pas aux fiches déjà reliées sauf si --force

Make.com — Automatisation segments Bullet

Rôle : Attribue automatiquement les accès Bullet dès qu'un paiement Stripe est confirmé. Aucune action manuelle.
Flux : Stripe checkout.session.completed → webhook Make → filtre metadata.segment → API Bullet (création membre + ajout segment)
Statut : Actif en production depuis avril 2026 — 12 branches (un segment par sujet payant)
Documentation complète : voir la page ⚙️ Make.com — Automatisation segments Bullet dans Simplicity
Webhook Make : https://hook.eu2.make.com/9g5lhui4lebgncwy9wjh4rm2k11ic66k
Métadonnée Stripe requise sur chaque Payment Link : clé segment, valeur = nom exact du segment Bullet
Test sans paiement réel (Terminal, pas besoin du venv) :
curl -X POST https://hook.eu2.make.com/9g5lhui4lebgncwy9wjh4rm2k11ic66k \ -H "Content-Type: application/json" \ -d '{"type":"checkout.session.completed","data":{"object":{"metadata":{"segment":"NOM_DU_SEGMENT"},"customer_details":{"email":"EMAIL_DE_TEST"}}}}'

Webhook — bullet-webhook.php

Rôle : Reçoit les événements "User Created" de Bullet Membership et crée/met à jour la fiche dans Contacts JM.
URL déployée : https://cebtg.ch/webhooks/bullet-webhook.php
Configuration dans Bullet : Site Settings → Membership → Webhooks → Add endpoint → cocher "User Created".
Ce que fait le script :
  • Détecte les payloads de vérification Bullet (name = "testURL") → répond 200 OK sans toucher Notion
  • Pour un vrai événement : cherche le contact par email dans Contacts JM
  • Si trouvé : met à jour Tib niveau, Cours/Stages, Soutien, Dernière interaction
  • Si nouveau contact : crée la fiche complète
Correspondance segments Bullet → Notion :
Segment Bullet
Tib niveau Notion
Tib1
Tib 1
Tib2
Tib 2
Tib3
Tib 3


GitHub Actions — Pistes pour la suite

Dépôt : falco36/cebtg-scripts (privé) — base déjà en place.
Script 2 (CalDAV → Notion) ✅ automatisé — chaque lundi à 6h.
Candidats pour une automatisation future :
  • Script 3 sync_youtube_notion.py — que des appels API YouTube + Notion → parfait pour GitHub Actions. Déclenchement hebdomadaire ou manuel après chaque replay publié.
  • Script 4 sync_youtube_summaries.py — idem, API Anthropic + Notion → adaptable. Penser à surveiller la consommation API Anthropic.
  • Script 1 sync_local_ftp_notion.py — lit les fichiers locaux kDrive → restera sur Mac (GitHub Actions n'a pas accès au disque local).
Pour ajouter un script : copier le fichier dans le dépôt, créer un fichier .yml dans .github/workflows/, ajouter les secrets nécessaires dans Settings → Secrets → Actions.

Workflow après chaque séance

  1. YouTube publie la vidéo
  2. python3 sync_youtube_notion.py → sync la nouvelle fiche (30 sec)
  3. python3 sync_youtube_summaries.py → génère le résumé automatique (30 sec)
  4. Publish dans Bullet → la fiche apparaît sur le site avec vidéo + résumé

Workflow après chaque PDF

  1. Déposer le PDF dans kDrive (/Tibétain/TibX/AAAA-AAAA/sujet/)
  2. python3 sync_local_ftp_notion.py --sync --new-only → upload FTP + création fiche Notion (ignore les PDFs déjà synchronisés)
  3. Publish dans Bullet