From d70f0a3321b32816c0f277b4be9a43e4f1074b39 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 24 Apr 2025 17:28:16 +0200 Subject: [feat] result types: add weather result answerer and template --- searx/result_types/__init__.py | 5 ++-- searx/result_types/answer.py | 54 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 3 deletions(-) (limited to 'searx/result_types') diff --git a/searx/result_types/__init__.py b/searx/result_types/__init__.py index e9a115ec3..8a82cf8d4 100644 --- a/searx/result_types/__init__.py +++ b/searx/result_types/__init__.py @@ -13,14 +13,14 @@ from __future__ import annotations -__all__ = ["Result", "MainResult", "KeyValue", "EngineResults", "AnswerSet", "Answer", "Translations"] +__all__ = ["Result", "MainResult", "KeyValue", "EngineResults", "AnswerSet", "Answer", "Translations", "Weather"] import abc from searx import enginelib from ._base import Result, MainResult, LegacyResult -from .answer import AnswerSet, Answer, Translations +from .answer import AnswerSet, Answer, Translations, Weather from .keyvalue import KeyValue @@ -35,6 +35,7 @@ class ResultList(list, abc.ABC): MainResult = MainResult Result = Result Translations = Translations + Weather = Weather # for backward compatibility LegacyResult = LegacyResult diff --git a/searx/result_types/answer.py b/searx/result_types/answer.py index a9f580e0e..d5793fac3 100644 --- a/searx/result_types/answer.py +++ b/searx/result_types/answer.py @@ -18,6 +18,10 @@ template. :members: :show-inheritance: +.. autoclass:: Weather + :members: + :show-inheritance: + .. autoclass:: AnswerSet :members: :show-inheritance: @@ -26,7 +30,7 @@ template. from __future__ import annotations -__all__ = ["AnswerSet", "Answer", "Translations"] +__all__ = ["AnswerSet", "Answer", "Translations", "Weather"] import msgspec @@ -143,3 +147,51 @@ class Translations(BaseAnswer, kw_only=True): synonyms: list[str] = [] """List of synonyms for the requested translation.""" + + +class Weather(BaseAnswer, kw_only=True): + """Answer type for weather data.""" + + template: str = "answer/weather.html" + """The template is located at :origin:`answer/weather.html + `""" + + location: str + """The geo-location the weather data is from (e.g. `Berlin, Germany`).""" + + current: Weather.DataItem + """Current weather at ``location``.""" + + forecasts: list[Weather.DataItem] = [] + """Weather forecasts for ``location``.""" + + def __post_init__(self): + if not self.location: + raise ValueError("Weather answer is missing a location") + + class DataItem(msgspec.Struct, kw_only=True): + """A container for weather data such as temperature, humidity, ...""" + + time: str | None = None + """Time of the forecast - not needed for the current weather.""" + + condition: str + """Weather condition, e.g. `cloudy`, `rainy`, `sunny` ...""" + + temperature: str + """Temperature string, e.g. `17°C`""" + + feelsLike: str | None = None + """Felt temperature string, should be formatted like ``temperature``""" + + humidity: str | None = None + """Humidity percentage string, e.g. `60%`""" + + pressure: str | None = None + """Pressure string, e.g. `1030hPa`""" + + wind: str | None = None + """Information about the wind, e.g. `W, 231°, 10 m/s`""" + + attributes: dict[str] = [] + """Key-Value dict of additional weather attributes that are not available above""" -- cgit v1.2.3