Commit Graph

8 Commits

Author SHA1 Message Date
sylvain 56372af486 Fix téléchargement ICS : encodage RFC 5987 pour noms de fichiers non-ASCII
Le header Content-Disposition avec filename="Là_où_bat_le_cœur.ics"
causait une erreur 500 car les caractères non-ASCII ne sont pas valides
en HTTP. Correction avec filename*=UTF-8''<url-encoded> (RFC 5987).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 17:55:28 +01:00
sylvain 325eff5ede Matching séries→site par dates ciblées (CSS section-spectacle-dates-date)
- _get_performance_text_blocks : cible les éléments CSS spécifiques au site
  (section-spectacle-dates-date) plutôt que le texte brut de la page,
  évitant la contamination par le calendrier de navigation du site
- match_series_to_catalog : remplace le matching LLM (trop imprécis avec
  les titres poétiques) par un recoupement de dates entre PDF et site
- cluster_notes_into_series : passe les événements complets (avec dates)
  au lieu des notes seules → le LLM identifie correctement les répétitions
  partielles (ex: STRAUSS/PREVIN = même série que BEETHOVEN/STRAUSS/PREVIN)

Résultat : Beethoven/Strauss/Previn→"Là où bat le cœur",
Chostakovitch/Salonen/Prokofiev→"Virtuosité et destin", etc.
Scraping réduit de 143 à 9 requêtes HTTP pour mars+avril.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 17:43:49 +01:00
sylvain 71bdc9f6ea Scraping ciblé : uniquement les événements site dont les dates correspondent aux concerts PDF
Au lieu de scraper toutes les pages du site, on :
1. Extrait les dates de concerts/représentations depuis le PDF
2. Scrape le listing du site (1 requête)
3. Pour chaque page événement, extrait ses dates et vérifie si au moins
   une date correspond à celles du PDF
4. Ignore silencieusement les événements sans correspondance de date

Avantages :
- Beaucoup moins de requêtes HTTP (seuls les événements pertinents)
- Correspondances plus fiables (validées par les dates)
- _parse_french_dates_from_page : convertit les dates texte en objets date
  pour la comparaison avec les dates PDF

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 16:35:30 +01:00
sylvain da14137bd9 Refonte identification des séries : PDF-first en deux étapes
Avant : le LLM devait simultanément grouper les notes ET les matcher
aux titres du site → résultats incohérents, séries perdues si pas de
correspondance sur le site.

Après (pipeline en 4 étapes) :
1. cluster_notes_into_series : LLM groupe les notes du PDF en séries
   canoniques, SANS le catalogue du site
2. scrape_catalog : enrichissement optionnel (+ extraction des dates
   de représentation depuis chaque page événement)
3. match_series_to_catalog : correspondance canonique→site pour
   enrichir le titre et la description (null si pas de match)
4. Génération ICS pour TOUTES les séries PDF, même sans correspondance
   site (répétitions seules incluses)

Autres changements :
- _build_description : inclut les dates du site et l'URL quand dispo
- clear_cache : inclut series_clusters.json et series_site_match.json
- _parse_json_response : helper robuste pour parser les réponses LLM

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 16:27:20 +01:00
sylvain 9ed22fb14a Docker : support env vars, compose standard + swarm séparés
- Dockerfile : copie config.json dans l'image (évite le problème de répertoire)
- app.py : load_config() lit les variables d'environnement en priorité sur config.json
- docker-compose.yml : converti en compose standard (sans section deploy Swarm)
- docker-compose.swarm.yml : nouveau fichier dédié au déploiement Docker Swarm

Variables supportées : OLLAMA_URL, OLLAMA_CLUSTER_MODEL, OLLAMA_LOCAL_MODEL,
SITE_CALENDAR_URL, SITE_BASE_URL, AUTH_SESSION_SECRET, AUTH_USERS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 15:52:36 +01:00
sylvain 59cddee470 Fix: déduplication des événements pour éviter les doublons
Ajout d'une clé (date, start_time, titre, note) pour éviter qu'un même
événement soit ajouté plusieurs fois (PDFs qui se chevauchent ou lignes
dupliquées par pdfplumber sur tables multi-pages).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 15:27:02 +01:00
sylvain c937861b89 Correction docker-compose : image depuis le registre Gitea
Remplace `planning2ics:latest` par `git.piaf.im/sylvain/planning2ics:latest`
pour que le déploiement Swarm puisse puller l'image depuis le registre.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 15:21:07 +01:00
sylvain d4067e9105 Ajout de la webapp Docker (FastAPI + HTML/JS vanilla)
- Backend FastAPI avec auth par cookie (users dans config.json)
- Upload PDF drag & drop, progression en temps réel (SSE)
- Identification des séries via Ollama (config URL dans config.json)
- Téléchargement ICS par série + historique des traitements
- Bouton vider le cache (site web + mapping LLM)
- Docker Swarm ready (docker-compose.yml + Dockerfile)
- Compatible iOS/Android/PC (responsive mobile-first)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 13:08:18 +01:00