diff --git a/gallery/painting/gismeteo/parser.py b/gallery/painting/gismeteo/parser.py index d3677b9..0657e4b 100644 --- a/gallery/painting/gismeteo/parser.py +++ b/gallery/painting/gismeteo/parser.py @@ -1,4 +1,5 @@ import datetime +import logging import re from typing import Iterable @@ -15,6 +16,8 @@ from gallery.sketch.weather.model import ( from .core import BaseWidgetParser, RowParser +logger = logging.getLogger("gismeteo") + ONE_DAY_PARSER = BaseWidgetParser(".widget.widget-oneday .widget-items") DAYS_PARSER = BaseWidgetParser(".widget.widget-days .widget-items") @@ -57,6 +60,7 @@ class SkyParser(RowParser[Sky]): CLOUDNESS_MAP: dict[str, Cloudness] = { "ясно": Cloudness.CLEAR, + "безоблачно": Cloudness.CLEAR, "малооблачно": Cloudness.PARTLY_CLOUDY, "облачно": Cloudness.CLOUDY, "пасмурно": Cloudness.MAINLY_CLOUDY, @@ -64,8 +68,10 @@ class SkyParser(RowParser[Sky]): PRECIPITATION_MAP: dict[str, Precipitation] = { "без осадков": Precipitation.NO, - "небольшой дождь": Precipitation.SMALL_RAIN, + "небольшой дождь": Precipitation.SMALL_RAIN, # TODO: remove it? + "небольшой дождь": Precipitation.SMALL_RAIN, "сильный дождь": Precipitation.HEAVY_RAIN, + "ливневый дождь": Precipitation.SHOWER, "дождь": Precipitation.RAIN, "ливень": Precipitation.SHOWER, "снег": Precipitation.SNOW, @@ -78,22 +84,35 @@ class SkyParser(RowParser[Sky]): "небольшой мокрый снег": Precipitation.SNOW, } + THUNDER = "гроза" + FOG = "дымка" + def parse_row(self, tag: Tag) -> Iterable[Sky]: for item in tag.select(".widget-row[data-row=icon-tooltip] > .row-item"): sky_str = item.attrs["data-tooltip"] values = {item.strip().lower() for item in sky_str.split(",")} cloudness = Cloudness.CLEAR precipitation = Precipitation.NO - thunder = "гроза" in values - fog = "дымка" in values + thunder = False + fog = False + if self.THUNDER in values: + thunder = True + values.remove(self.THUNDER) + if self.FOG in values: + fog = True + values.remove(self.FOG) for k, v in self.CLOUDNESS_MAP.items(): if k in values: cloudness = v + values.remove(k) break for k, v in self.PRECIPITATION_MAP.items(): if k in values: precipitation = v + values.remove(k) break + if values: + logger.warning("unknown sky values: %s:", values) yield Sky( cloudness=cloudness, precipitation=precipitation,