OSINT Monitor Layer + Erdbeben in Katastrophen zusammengefuehrt
MONITOR LAYER (neu): - Neuer Top-Layer "OSINT Monitor" im Panel - Zeigt geoparsete Standorte aus Monitor-Lagen auf dem Globus - Farbkodiert: rot=Hauptgeschehen, orange=Reaktionen, blau=Beteiligte - Labels mit Ortsname + Artikelanzahl bei Zoom - 2min Refresh, GeoJSON vom Monitor Public API KATASTROPHEN (erweitert): - Erdbeben-Layer in Katastrophen integriert (kein separater Toggle mehr) - Laedt NASA EONET + USGS parallel - Erdbeben als farbige Punkte (rot=frisch, gelb=alt) mit M-Label - Katastrophen-Toggle zeigt jetzt alles: Waldbraende, Vulkane, Stuerme, Fluten UND Erdbeben
Dieser Commit ist enthalten in:
46
src/data_monitor.py
Normale Datei
46
src/data_monitor.py
Normale Datei
@@ -0,0 +1,46 @@
|
||||
"""Monitor-Feed: OSINT-Daten aus dem AegisSight Monitor."""
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
|
||||
import httpx
|
||||
from fastapi import APIRouter, Query
|
||||
|
||||
logger = logging.getLogger("globe.monitor")
|
||||
router = APIRouter()
|
||||
|
||||
_MONITOR_URL = os.getenv("MONITOR_API_URL", "https://monitor.aegis-sight.de/api/public")
|
||||
_MONITOR_KEY = os.getenv("MONITOR_API_KEY", "")
|
||||
|
||||
_cache: dict[str, tuple] = {}
|
||||
|
||||
|
||||
@router.get("/monitor-feed")
|
||||
async def get_monitor_feed(incident_id: int = Query(None)):
|
||||
"""Holt OSINT-Daten vom AegisSight Monitor."""
|
||||
cache_key = f"monitor:{incident_id or 'all'}"
|
||||
if cache_key in _cache and time.time() - _cache[cache_key][0] < 120:
|
||||
return _cache[cache_key][1]
|
||||
|
||||
params = {}
|
||||
if incident_id:
|
||||
params["incident_id"] = incident_id
|
||||
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=15) as client:
|
||||
r = await client.get(
|
||||
f"{_MONITOR_URL}/globe-feed",
|
||||
params=params,
|
||||
headers={"X-API-Key": _MONITOR_KEY},
|
||||
)
|
||||
r.raise_for_status()
|
||||
data = r.json()
|
||||
_cache[cache_key] = (time.time(), data)
|
||||
logger.info(f"Monitor-Feed: {len(data.get('features', []))} Locations, "
|
||||
f"{len(data.get('incidents', []))} Lagen")
|
||||
return data
|
||||
except Exception as e:
|
||||
logger.warning(f"Monitor-Feed Fehler: {e}")
|
||||
if cache_key in _cache:
|
||||
return _cache[cache_key][1]
|
||||
return {"type": "FeatureCollection", "features": [], "incidents": []}
|
||||
@@ -33,6 +33,7 @@ from data_quakes import router as quakes_router
|
||||
from data_gdelt import router as gdelt_router
|
||||
from data_satellites import router as satellites_router
|
||||
from data_disasters import router as disasters_router
|
||||
from data_monitor import router as monitor_router
|
||||
|
||||
# Alle Daten-APIs hinter Auth
|
||||
app.include_router(flights_router, prefix="/api", dependencies=[Depends(get_current_user)])
|
||||
@@ -41,6 +42,7 @@ app.include_router(quakes_router, prefix="/api", dependencies=[Depends(get_curre
|
||||
app.include_router(gdelt_router, prefix="/api", dependencies=[Depends(get_current_user)])
|
||||
app.include_router(satellites_router, prefix="/api", dependencies=[Depends(get_current_user)])
|
||||
app.include_router(disasters_router, prefix="/api", dependencies=[Depends(get_current_user)])
|
||||
app.include_router(monitor_router, prefix="/api", dependencies=[Depends(get_current_user)])
|
||||
|
||||
# --- Static files ---
|
||||
static_dir = Path(__file__).parent.parent / "static"
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren