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)