Implement support for automatic F/C designation based on location of weather call

This commit is contained in:
Taylor Wilsdon 2025-04-06 15:08:43 -04:00
parent 3a4036caed
commit 381a4b5e22
2 changed files with 24 additions and 5 deletions

View File

@ -1,8 +1,9 @@
import requests # Added for making HTTP requests import requests
from fastapi import FastAPI, HTTPException, Query # Added Query for GET params import reverse_geocoder as rg # Added reverse_geocoder
from fastapi import FastAPI, HTTPException, Query
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Optional, List # Added Optional and List from typing import Optional, List # Removed Literal, no longer needed for query param
app = FastAPI( app = FastAPI(
title="Weather API", title="Weather API",
@ -58,6 +59,8 @@ class WeatherForecastOutput(BaseModel):
# ------------------------------- # -------------------------------
OPEN_METEO_URL = "https://api.open-meteo.com/v1/forecast" OPEN_METEO_URL = "https://api.open-meteo.com/v1/forecast"
# Countries officially using Fahrenheit
FAHRENHEIT_COUNTRIES = {"US", "LR", "MM"} # USA, Liberia, Myanmar
@app.get("/forecast", response_model=WeatherForecastOutput, summary="Get current weather and forecast") @app.get("/forecast", response_model=WeatherForecastOutput, summary="Get current weather and forecast")
def get_weather_forecast( def get_weather_forecast(
@ -67,13 +70,28 @@ def get_weather_forecast(
""" """
Retrieves current weather conditions and hourly forecast data Retrieves current weather conditions and hourly forecast data
for the specified latitude and longitude using the Open-Meteo API. for the specified latitude and longitude using the Open-Meteo API.
Temperature unit (Celsius/Fahrenheit) is determined automatically based on location.
""" """
# Determine temperature unit based on location
try:
geo_results = rg.search((latitude, longitude), mode=1) # mode=1 for single result
if geo_results:
country_code = geo_results[0]['cc']
temperature_unit = "fahrenheit" if country_code in FAHRENHEIT_COUNTRIES else "celsius"
else:
# Default to Celsius if country cannot be determined
temperature_unit = "celsius"
except Exception:
# Handle potential errors during geocoding, default to Celsius
temperature_unit = "celsius"
params = { params = {
"latitude": latitude, "latitude": latitude,
"longitude": longitude, "longitude": longitude,
"current": "temperature_2m,wind_speed_10m", "current": "temperature_2m,wind_speed_10m",
"hourly": "temperature_2m,relative_humidity_2m,wind_speed_10m", "hourly": "temperature_2m,relative_humidity_2m,wind_speed_10m",
"timezone": "auto" # Automatically detect timezone "timezone": "auto",
"temperature_unit": temperature_unit # Use determined unit
} }
try: try:
response = requests.get(OPEN_METEO_URL, params=params) response = requests.get(OPEN_METEO_URL, params=params)

View File

@ -4,4 +4,5 @@ pydantic
python-multipart python-multipart
pytz pytz
python-dateutil python-dateutil
requests requests
reverse_geocoder