136 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| """
 | |
| Script pour extraire les coordonnées géographiques du fichier ICS de l'agenda du libre.
 | |
| Le fichier ICS contient des coordonnées dans les propriétés X-ALT-DESC;FMTTYPE=text/html
 | |
| sous forme d'attributs data-latitude et data-longitude.
 | |
| """
 | |
| 
 | |
| import re
 | |
| import json
 | |
| from typing import List, Dict, Tuple
 | |
| 
 | |
| def extract_coordinates_from_ics(ics_file_path: str) -> List[Dict]:
 | |
|     """
 | |
|     Extrait les coordonnées géographiques du fichier ICS.
 | |
|     
 | |
|     Args:
 | |
|         ics_file_path: Chemin vers le fichier ICS
 | |
|         
 | |
|     Returns:
 | |
|         Liste de dictionnaires contenant les coordonnées et informations associées
 | |
|     """
 | |
|     coordinates = []
 | |
|     
 | |
|     with open(ics_file_path, 'r', encoding='utf-8') as file:
 | |
|         content = file.read()
 | |
|     
 | |
|     # Recherche des patterns data-latitude et data-longitude
 | |
|     # Pattern pour capturer les coordonnées dans le HTML
 | |
|     pattern = r'data-latitude="([^"]+)"[^>]*data-longitude="([^"]+)"'
 | |
|     
 | |
|     matches = re.findall(pattern, content)
 | |
|     
 | |
|     for i, (lat, lon) in enumerate(matches):
 | |
|         try:
 | |
|             lat_float = float(lat)
 | |
|             lon_float = float(lon)
 | |
|             
 | |
|             # Vérifier que les coordonnées sont valides
 | |
|             if -90 <= lat_float <= 90 and -180 <= lon_float <= 180:
 | |
|                 coordinates.append({
 | |
|                     'id': i + 1,
 | |
|                     'latitude': lat_float,
 | |
|                     'longitude': lon_float,
 | |
|                     'source': 'agendadulibre_ics'
 | |
|                 })
 | |
|         except ValueError:
 | |
|             # Ignorer les coordonnées invalides
 | |
|             continue
 | |
|     
 | |
|     return coordinates
 | |
| 
 | |
| def find_events_with_coordinates(ics_file_path: str) -> List[Dict]:
 | |
|     """
 | |
|     Trouve les événements qui ont des coordonnées dans le fichier ICS.
 | |
|     
 | |
|     Args:
 | |
|         ics_file_path: Chemin vers le fichier ICS
 | |
|         
 | |
|     Returns:
 | |
|         Liste des événements avec leurs coordonnées
 | |
|     """
 | |
|     events = []
 | |
|     
 | |
|     with open(ics_file_path, 'r', encoding='utf-8') as file:
 | |
|         content = file.read()
 | |
|     
 | |
|     # Diviser le contenu en événements individuels
 | |
|     event_blocks = content.split('BEGIN:VEVENT')
 | |
|     
 | |
|     for i, block in enumerate(event_blocks[1:], 1):  # Ignorer le premier bloc (en-tête)
 | |
|         # Rechercher les coordonnées dans ce bloc d'événement
 | |
|         lat_match = re.search(r'data-latitude="([^"]+)"', block)
 | |
|         lon_match = re.search(r'data-longitude="([^"]+)"', block)
 | |
|         
 | |
|         if lat_match and lon_match:
 | |
|             try:
 | |
|                 lat = float(lat_match.group(1))
 | |
|                 lon = float(lon_match.group(1))
 | |
|                 
 | |
|                 # Vérifier que les coordonnées sont valides
 | |
|                 if -90 <= lat <= 90 and -180 <= lon <= 180:
 | |
|                     # Extraire d'autres informations de l'événement
 | |
|                     summary_match = re.search(r'SUMMARY:(.+)', block)
 | |
|                     location_match = re.search(r'LOCATION:(.+)', block)
 | |
|                     description_match = re.search(r'DESCRIPTION:(.+)', block)
 | |
|                     
 | |
|                     event = {
 | |
|                         'event_id': i,
 | |
|                         'latitude': lat,
 | |
|                         'longitude': lon,
 | |
|                         'summary': summary_match.group(1).strip() if summary_match else '',
 | |
|                         'location': location_match.group(1).strip() if location_match else '',
 | |
|                         'description': description_match.group(1).strip() if description_match else '',
 | |
|                         'source': 'agendadulibre_ics'
 | |
|                     }
 | |
|                     
 | |
|                     events.append(event)
 | |
|             except ValueError:
 | |
|                 continue
 | |
|     
 | |
|     return events
 | |
| 
 | |
| def main():
 | |
|     """Fonction principale pour extraire et afficher les coordonnées."""
 | |
|     ics_file = 'agendadulibre_events.ics'
 | |
|     
 | |
|     print("🔍 Extraction des coordonnées du fichier ICS...")
 | |
|     
 | |
|     # Extraire toutes les coordonnées
 | |
|     all_coordinates = extract_coordinates_from_ics(ics_file)
 | |
|     print(f"📍 {len(all_coordinates)} coordonnées trouvées")
 | |
|     
 | |
|     # Extraire les événements avec coordonnées
 | |
|     events_with_coords = find_events_with_coordinates(ics_file)
 | |
|     print(f"🎯 {len(events_with_coords)} événements avec coordonnées trouvés")
 | |
|     
 | |
|     # Afficher quelques exemples
 | |
|     print("\n📋 Exemples d'événements avec coordonnées :")
 | |
|     for event in events_with_coords[:5]:
 | |
|         print(f"  • {event['summary']}")
 | |
|         print(f"    📍 {event['latitude']}, {event['longitude']}")
 | |
|         print(f"    📍 Lieu: {event['location']}")
 | |
|         print()
 | |
|     
 | |
|     # Sauvegarder les résultats
 | |
|     with open('extracted_coordinates.json', 'w', encoding='utf-8') as f:
 | |
|         json.dump(events_with_coords, f, indent=2, ensure_ascii=False)
 | |
|     
 | |
|     print(f"💾 Résultats sauvegardés dans 'extracted_coordinates.json'")
 | |
|     
 | |
|     # Statistiques
 | |
|     unique_coords = set((event['latitude'], event['longitude']) for event in events_with_coords)
 | |
|     print(f"📊 {len(unique_coords)} coordonnées uniques")
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 | 
