Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
from flask import Flask, render_template, jsonify | |
import requests | |
import json | |
import re | |
import os | |
from dotenv import load_dotenv | |
# Charger les variables d'environnement | |
load_dotenv() | |
app = Flask(__name__) | |
TOMTOM_API_KEY = os.getenv("TOMTOM_API_KEY") | |
API_KEY = os.getenv("IDFM_API_KEY") | |
BASE_URL_API = "https://prim.iledefrance-mobilites.fr/marketplace/v2/navitia/line_reports/physical_modes/physical_mode%3A" | |
CATEGORIES = { | |
"Métro": "Metro", | |
"RER": "RapidTransit", | |
"Bus": "Bus", | |
"Transilien": "LocalTrain", | |
"Tram": "Tramway" | |
} | |
# Fonction pour récupérer les perturbations | |
def fetch_disruptions(category, api_value): | |
url = f"{BASE_URL_API}{api_value}/line_reports?" | |
headers = {"accept": "application/json", "apiKey": API_KEY} | |
try: | |
response = requests.get(url, headers=headers, timeout=5) | |
response.raise_for_status() | |
data = response.json() | |
return data.get("disruptions", []) | |
except requests.exceptions.RequestException as e: | |
print(f"Erreur API pour {category}: {e}") | |
return [] | |
# Normaliser le nom des lignes | |
def normalize_line_name(line_name): | |
line_name = line_name.lower() | |
line_name = re.sub(r"\b(ratp|sncf)\b", "", line_name) | |
line_name = re.sub(r"\s+", " ", line_name).strip() | |
return line_name.capitalize() | |
# Générer le HTML des perturbations | |
def generate_traffic_html(): | |
all_disruptions = {} | |
for category, api_value in CATEGORIES.items(): | |
disruptions = fetch_disruptions(category, api_value) | |
active_disruptions = [ | |
{ | |
"id": disruption.get("id"), | |
"cause": disruption.get("cause", "Inconnue"), | |
"severity": disruption.get("severity", {}).get("name", "N/A"), | |
"message": disruption["messages"][0]["text"] if disruption.get("messages") else "No message", | |
"impacted_lines": [ | |
obj.get("pt_object", {}).get("name", "Unknown Line") | |
for obj in disruption.get("impacted_objects", []) | |
if obj.get("pt_object", {}).get("embedded_type") == "line" | |
] | |
} | |
for disruption in disruptions if disruption.get("status") == "active" | |
] | |
all_disruptions[category] = active_disruptions | |
# Récapitulatif des lignes impactées | |
summary_data = [] | |
seen_lines = set() | |
for category, disruptions in all_disruptions.items(): | |
for d in disruptions: | |
for line in d["impacted_lines"]: | |
norm_line = normalize_line_name(line) | |
if norm_line not in seen_lines: | |
summary_data.append({ | |
"category": category, | |
"line": norm_line, | |
"cause": d["cause"], | |
"severity": d["severity"], | |
"message": d["message"] | |
}) | |
seen_lines.add(norm_line) | |
return summary_data | |
def home(): | |
return render_template('index.html') | |
def get_incidents(): | |
""" | |
Récupère les incidents depuis l'API TomTom Traffic. | |
""" | |
try: | |
# Zone géographique pour Paris | |
bounding_box = "1.79804455,48.52917947,2.88843762,49.24075760" | |
url = f"https://api.tomtom.com/traffic/services/5/incidentDetails?bbox={bounding_box}&fields=%7Bincidents%7Btype%2Cgeometry%7Btype%2Ccoordinates%7D%2Cproperties%7BiconCategory%7D%7D%7D&language=en-GB&categoryFilter=0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C14&timeValidityFilter=present&key={TOMTOM_API_KEY}" | |
response = requests.get(url) | |
response.raise_for_status() | |
data = response.json() | |
incidents = data.get("incidents", []) | |
return jsonify({"status": "success", "data": incidents}), 200 | |
except requests.exceptions.RequestException as e: | |
return jsonify({"status": "error", "message": str(e)}), 500 | |
def ratp_disruptions(): | |
data = generate_traffic_html() | |
return jsonify({"status": "success", "data": data}) | |
def get_traffic_disruptions(): | |
""" | |
Récupère les perturbations de trafic pour tous les modes de transport. | |
""" | |
try: | |
summary_data = generate_traffic_html() | |
return jsonify({"status": "success", "data": summary_data}), 200 | |
except Exception as e: | |
return jsonify({"status": "error", "message": str(e)}), 500 | |
if __name__ == '__main__': | |
app.run(debug=True) |