Architecture
Vue d'ensemble
pronote-sync est un pipeline qui synchronise les données de Pronote vers CalDAV (agendas) et XMPP (notifications). Le flux principal est : Pronote (iCal/pronotepy) → normalisation → comparaison avec l'agenda théorique → synchronisation CalDAV → synthèse IA (optionnelle) → notification XMPP. Les sources sont iCal (primaire) et pronotepy (repli), avec trois modes de source : auto, ical et pronotepy.
Pipeline
- Récupération Pronote — agenda et devoirs via iCal ou
pronotepy; messages et informations viapronotepyuniquement - Normalisation et parsing — parsing iCal → modèles Pydantic, déduplication, normalisation des UID
- Récupération du blog (RSS) —
feedparser, déduplication par GUID, cache HTTP - Comparaison avec l'agenda théorique — matching déterministe, détection des changements
- Synchronisation CalDAV — sync différentielle et idempotente, UID stables, conservation des annulés
- Synthèse IA (optionnelle) — synthèse des changements, mode dégradé si échec
- Envoi XMPP — message structuré (synthèse + devoirs bruts)
Modules
pronote_sync/
├── config/ Configuration (Pydantic Settings)
├── models/ Modèles de données (Pydantic v2)
├── sources/ Connecteurs (Pronote iCal/pronotepy, blog RSS, agenda théorique)
├── sync/ Synchronisation CalDAV et comparaison
├── synthesis/ Synthèse IA (OpenAI, litellm, openai-compatible)
├── channels/ Canaux de sortie (XMPP)
├── pipeline/ Orchestration (composition root, PipelineRunner)
├── utils/ Utilitaires (redaction, logging, UID)
└── cli/ Interface en ligne de commande
Injection de dépendances
Le projet utilise typing.Protocol et une composition root dans pipeline/run.py. Aucun singleton global n'est autorisé. Le PipelineRunner reçoit toutes ses dépendances via injection par constructeur : PronoteFetcher, CalDAVClient, AgendaComparator, SynthesisProvider, Channel.
Sources de données
Les modes de source sont les suivants :
auto: essaie d'abord iCal, puis bascule verspronotepyuniquement si iCal lève une exception.ical: utilise uniquement iCal, sans bascule silencieuse.pronotepy: utilise uniquementpronotepy, sans bascule silencieuse.- En mode
auto, si iCal etpronotepyéchouent → erreur critique explicite. - Une liste vide est un succès valide, pas une panne.
PRONOTE_URL(connexion API) etPRONOTE_ICAL_URL(flux iCal) sont deux paramètres distincts.- Les messages ne sont disponibles que via
pronotepy(absents du flux iCal).
Flux de données
Le flux de données suit ce chemin : données brutes (iCal/pronotepy) → modèles Pydantic (Lesson, Homework, Message, etc.) → PronoteData (agrégé) → AgendaDiff (comparaison) → CalDavSyncResult → SynthesisInput/SynthesisResult → XmppMessage → envoi via le canal XMPP.