GridSenseAI-Hackathon / src /data /mosdac_rss.py
Beledevere's picture
Fresh deployment without parquet
eafee5b
Raw History Blame Contribute Delete
2.83 kB
"""
MOSDAC RSS Feed Monitor
Subscribes to ISRO satellite data feeds to get notified of new imagery availability.
Why RSS instead of API polling:
- Push-based: notified immediately when new data is available
- Standard protocol: works with any RSS reader
- No authentication needed for public feeds
- Government-friendly: ISRO official data source
Feeds available:
- INSAT3D-Imager: https://mosdac.gov.in/3dimager.xml
- INSAT3DR-Imager: https://mosdac.gov.in/3drimager.xml
- SCATSAT-1: https://mosdac.gov.in/isrocast.xml
Current status: Architecture ready. RSS parsing works for any feed.
In production: triggers residual layer update when new cloud imagery arrives.
"""
import feedparser
from datetime import datetime, timedelta
from typing import List, Dict
MOSDAC_FEEDS = {
"insat3d_imager": "https://mosdac.gov.in/3dimager.xml",
"insat3dr_imager": "https://mosdac.gov.in/3drimager.xml",
"scatsat1": "https://mosdac.gov.in/isrocast.xml",
}
def parse_mosdac_feed(feed_url: str, max_entries: int = 10) -> List[Dict]:
"""Parse MOSDAC RSS feed and return recent entries."""
try:
feed = feedparser.parse(feed_url)
entries = []
for entry in feed.entries[:max_entries]:
entries.append({
"title": entry.get("title", ""),
"link": entry.get("link", ""),
"published": entry.get("published", ""),
"summary": entry.get("summary", ""),
})
return entries
except Exception as e:
return [{"error": str(e)}]
def get_latest_satellite_data(feed_name: str = "insat3dr_imager") -> List[Dict]:
"""Get latest satellite imagery metadata from MOSDAC."""
url = MOSDAC_FEEDS.get(feed_name)
if not url:
return [{"error": f"Unknown feed: {feed_name}"}]
return parse_mosdac_feed(url)
def check_for_new_imagery(last_check_time: datetime) -> bool:
"""Check if new satellite imagery has been published since last check."""
entries = get_latest_satellite_data()
if not entries or "error" in entries[0]:
return False
for entry in entries:
try:
pub_time = datetime.strptime(entry["published"], "%a, %d %b %Y %H:%M:%S %Z")
if pub_time > last_check_time:
return True
except:
continue
return False
if __name__ == "__main__":
print("MOSDAC RSS Feed Monitor")
print("=" * 50)
for name, url in MOSDAC_FEEDS.items():
print(f"\nFeed: {name}")
print(f"URL: {url}")
entries = parse_mosdac_feed(url, max_entries=3)
if entries and "error" not in entries[0]:
print(f"Latest: {entries[0]['title']}")
print(f"Published: {entries[0]['published']}")
else:
print("Could not fetch (network required)")