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: truedans config.json → le script simule sans rien modifier (recommandé par défaut)- L'option
--syncest toujours nécessaire pour une exécution réelle - L'option
--new-onlyest indépendante : elle filtre les PDFs déjà présents dans Notion, quelle que soit la présence de--sync - ⚠️ Erreur fréquente :
--new-onlyseul (sans--sync) = simulation uniquement des nouveaux. Il faut toujours combiner--sync --new-onlypour 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, user579j3l_cebtg_jm) verssites/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 :
- Créer le dossier sur le Mac :
Tibétain/TibX/AAAA-AAAA/nom-du-sujet/ - Attendre la synchronisation kDrive
- Déposer les PDFs dans ce dossier
- 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) :
- Aller sur github.com/falco36/cebtg-scripts
- Onglet Actions → Sync CalDAV Notion
- Bouton Run workflow → Run 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 InfomaniakNOTION_TOKEN— token API NotionNOTION_DB_COURS_A_VENIR— ID base Cours à venirFTP_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.htmlsur 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 listePLAYLISTSdans 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→ champanthropic.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/Sectiond'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) avecClé Chapitre/Section(Sujets) - Remplit la relation
Sujetdans chaque fiche Ressource correspondante - Le rollup
Nombre de leçonsse 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/9g5lhui4lebgncwy9wjh4rm2k11ic66kMétadonnée Stripe requise sur chaque Payment Link : clé
segment, valeur = nom exact du segment BulletTest 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.phpConfiguration 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
- YouTube publie la vidéo
python3 sync_youtube_notion.py→ sync la nouvelle fiche (30 sec)python3 sync_youtube_summaries.py→ génère le résumé automatique (30 sec)- Publish dans Bullet → la fiche apparaît sur le site avec vidéo + résumé
Workflow après chaque PDF
- Déposer le PDF dans kDrive (
/Tibétain/TibX/AAAA-AAAA/sujet/) python3 sync_local_ftp_notion.py --sync --new-only→ upload FTP + création fiche Notion (ignore les PDFs déjà synchronisés)- Publish dans Bullet