import datetime from gallery.sketch.weather.model import Cloudness, Precipitation, WeatherValue from gallery.sketch.weather.util import build_weather_value from .openweather import ForecastItem class ForecastItemParser: CLOUDNESS_MAP: dict[str, Cloudness] = { "clear sky": Cloudness.CLEAR, "few clouds": Cloudness.PARTLY_CLOUDY, "scattered clouds": Cloudness.PARTLY_CLOUDY, "broken clouds": Cloudness.CLOUDY, "overcast clouds": Cloudness.MAINLY_CLOUDY, "light rain": Cloudness.CLOUDY, } PRECIPITATION_MAP: dict[str, Precipitation] = { "light rain": Precipitation.SMALL_RAIN, "rain": Precipitation.RAIN, "heavy rain": Precipitation.SHOWER, } def parse(self, item: ForecastItem) -> WeatherValue: item_date = datetime.datetime.fromtimestamp(item.dt, datetime.UTC) item_date = item_date.replace(tzinfo=datetime.timezone.utc).astimezone(tz=None).replace(tzinfo=None) value = build_weather_value(item_date) # TODO parse temperature interval flag value.temperature = [round(item.main.temp)] # value.temperature = [round(item.main.temp_max), round(item.main.temp_min)] value.pressure = [round(item.main.pressure / 133.3 * 100)] value.humidity = item.main.humidity value.wind_speed = round(item.wind.speed) value.wind_gust = round(item.wind.gust) value.wind_direction = item.wind.deg value.sky.cloudness = self.CLOUDNESS_MAP.get(item.weather[0].description, Cloudness.CLEAR) value.sky.precipitation = self.PRECIPITATION_MAP.get(item.weather[0].description, Precipitation.NO) if item.rain: value.precipitation = round(item.rain.interval_3h, 1) return value FORECAST_ITEM_PARSER = ForecastItemParser()