from flask import Flask, render_template_string, jsonify, request from datetime import datetime, date import requests import pytz from timezonefinder import TimezoneFinder from math import floor app = Flask(__name__) MAX_SNOW_INCHES = 24 OPEN_METEO_URL = "https://api.open-meteo.com/v1/forecast" tf = TimezoneFinder() HTML = """ Are We Buried?

Are We Buried?

-- in
--
Last updated: --
""" def get_today_snowfall(lat, lon): try: # Determine timezone for location tz_name = tf.timezone_at(lat=lat, lng=lon) or "UTC" params = { "latitude": lat, "longitude": lon, "hourly": "snowfall", "timezone": tz_name } r = requests.get(OPEN_METEO_URL, params=params, timeout=5) r.raise_for_status() data = r.json() hourly = data.get("hourly", {}) times = hourly.get("time", []) snow_values = hourly.get("snowfall", []) today_str = datetime.now(pytz.timezone(tz_name)).date().isoformat() snowfall_cm = 0.0 snowing_now = False for t, s in zip(times, snow_values): if t.startswith(today_str): snowfall_cm += s if s > 0: snowing_now = True inches = round(snowfall_cm / 2.54, 1) return inches, snowing_now, tz_name except Exception as e: print("Error fetching snowfall:", e) return 0.0, False, "UTC" def get_city_name(lat, lon): """Use OpenStreetMap Nominatim to get the city name for coordinates.""" try: r = requests.get( "https://nominatim.openstreetmap.org/reverse", params={ "lat": lat, "lon": lon, "format": "json", "zoom": 10, # city-level "addressdetails": 1 }, headers={"User-Agent": "AreWeBuriedApp/1.0"} ) r.raise_for_status() data = r.json() address = data.get("address", {}) city = address.get("city") or address.get("town") or address.get("village") or address.get("county") or f"{lat:.2f},{lon:.2f}" return city except Exception as e: print("Reverse geocoding error:", e) return f"{lat:.2f},{lon:.2f}" @app.route("/") def index(): return render_template_string(HTML) @app.route("/api/snowfall") def snowfall_api(): lat = request.args.get("lat", type=float) lon = request.args.get("lon", type=float) if lat is None or lon is None: return jsonify({"error": "Missing lat/lon"}), 400 inches, snowing, tz_name = get_today_snowfall(lat, lon) today = datetime.now(pytz.timezone(tz_name)).strftime("%B %d, %Y") city_name = get_city_name(lat, lon) return jsonify({ "location": city_name, "lat": lat, "lon": lon, "inches": inches, "max_inches": MAX_SNOW_INCHES, "snowing": snowing, "today": today, "updated": datetime.now().isoformat() }) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)