"""Récupération et parsing du flux iCal Pronote. Ce module fournit le téléchargement du flux iCal Pronote (via HTTP ou ``file://`` pour les tests) ainsi que son parsing en modèles : cours (:class:`~pronote_sync.models.agenda.Lesson`), événements scolaires (:class:`~pronote_sync.models.agenda.SchoolEvent`) et devoirs (:class:`~pronote_sync.models.homework.Homework`). La collecte finale des devoirs est réalisée à part, une fois la date cible connue, via :func:`collect_homeworks`. """ from __future__ import annotations import hashlib import re import unicodedata import urllib.parse from datetime import date, datetime from html import unescape from pathlib import Path from typing import NamedTuple, TypedDict import requests from bs4 import BeautifulSoup from icalendar import Calendar from ...models.agenda import ( HomeworkBlock, Lesson, LessonStatus, SchoolEvent, SchoolEventKind, ) from ...models.homework import Homework from ...utils.redaction import redact_exception, redact_url from ...utils.uid import generate_deterministic_uid, normalize_pronote_uid _HEADER_LABEL_PATTERN = re.compile( r"(?P