Files
2026-05-07 14:21:13 +00:00

1172 lines
136 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<link rel="prefetch" href="../../_static/searxng-wordmark.svg" as="image">
<!-- Generated with Sphinx 9.1.0 and Furo 2025.12.19 -->
<title>searx.weather - SearXNG Documentation (2026.5.7+ef6290c8c)</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=7bdb33bb" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<link rel="stylesheet" type="text/css" href="../../_static/searxng.css?v=4b1b1f10" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">SearXNG Documentation (2026.5.7+ef6290c8c)</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><div class="sidebar-scroll"><a class="sidebar-brand" href="../../index.html">
<div class="sidebar-logo-container">
<img class="sidebar-logo" src="../../_static/searxng-wordmark.svg" alt="Logo"/>
</div>
<span class="sidebar-brand-text">SearXNG Documentation (2026.5.7+ef6290c8c)</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-tree">
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../user/index.html">User information</a><input aria-label="Toggle navigation of User information" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../user/search-syntax.html">Search syntax</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../user/configured_engines.html">Configured Engines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../user/about.html">About SearXNG</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../own-instance.html">Why use a private instance?</a></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../admin/index.html">Administrator documentation</a><input aria-label="Toggle navigation of Administrator documentation" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2 has-children"><a class="reference internal" href="../../admin/settings/index.html">Settings</a><input aria-label="Toggle navigation of Settings" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings.html"><code class="docutils literal notranslate"><span class="pre">settings.yml</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_engines.html"><code class="docutils literal notranslate"><span class="pre">engines:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_brand.html"><code class="docutils literal notranslate"><span class="pre">brand:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_general.html"><code class="docutils literal notranslate"><span class="pre">general:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_search.html"><code class="docutils literal notranslate"><span class="pre">search:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_server.html"><code class="docutils literal notranslate"><span class="pre">server:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_ui.html"><code class="docutils literal notranslate"><span class="pre">ui:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_redis.html"><code class="docutils literal notranslate"><span class="pre">redis:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_valkey.html"><code class="docutils literal notranslate"><span class="pre">valkey:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_outgoing.html"><code class="docutils literal notranslate"><span class="pre">outgoing:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_categories_as_tabs.html"><code class="docutils literal notranslate"><span class="pre">categories_as_tabs:</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="../../admin/settings/settings_plugins.html"><code class="docutils literal notranslate"><span class="pre">plugins:</span></code></a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation.html">Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-docker.html">Installation container</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-scripts.html">Installation Script</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-searxng.html">Step by step installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-granian.html">Granian</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-uwsgi.html">uWSGI</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-nginx.html">NGINX</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/installation-apache.html">Apache</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/update-searxng.html">SearXNG maintenance</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/answer-captcha.html">Answer CAPTCHA from servers IP</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/searx.favicons.html">Favicons</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/searx.limiter.html">Limiter</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/api.html">Administration API</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/architecture.html">Architecture</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/plugins.html">List of plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../admin/buildhosts.html">Buildhosts</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../dev/index.html">Developer documentation</a><input aria-label="Toggle navigation of Developer documentation" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../dev/quickstart.html">Development Quickstart</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/commits.html">Git Commits &amp; Change Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/contribution_guide.html">How to contribute</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/extended_types.html">Extended Types</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../../dev/engines/index.html">Engine Implementations</a><input aria-label="Toggle navigation of Engine Implementations" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/enginelib.html">Engine Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/engines.html">SearXNGs engines loader</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/engine_overview.html">Engine Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/demo/demo_online.html">Demo Online Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/xpath.html">XPath Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/mediawiki.html">MediaWiki Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/json_engine.html">JSON Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/adobe_stock.html">Adobe Stock</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/alpinelinux.html">Alpine Linux Packages</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/annas_archive.html">Annas Archive</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/aol.html">AOL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/archlinux.html">Arch Linux</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/arxiv.html">arXiv</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/astrophysics_data_system.html">Astrophysics Data System (ADS)</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/azure.html">Azure Resources</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/bing.html">Bing Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/bpb.html">Bpb</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/brave.html">Brave Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/bt4g.html">BT4G</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/chinaso.html">ChinaSo</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/core.html">CORE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/crossref.html">Crossref</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/dailymotion.html">Dailymotion</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/discourse.html">Discourse Forums</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/duckduckgo.html">DuckDuckGo Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/geizhals.html">Geizhals</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/gitea.html">Gitea</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/github_code.html">Github Code</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/gitlab.html">GitLab</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/google.html">Google Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/huggingface.html">Hugging Face</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/karmasearch.html">Karmasearch</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/lemmy.html">Lemmy</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/loc.html">Library of Congress</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/marginalia.html">Marginalia Search</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/mastodon.html">Mastodon</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/moviepilot.html">Moviepilot</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/mrs.html">Matrix Rooms Search (MRS)</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/mwmbl.html">Mwmbl Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/odysee.html">Odysee</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/openalex.html">OpenAlex</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/openlibrary.html">Open Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/peertube.html">Peertube Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/piped.html">Piped</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/presearch.html">Presearch Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/pubmed.html">PubMed</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/qwant.html">Qwant</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/radio_browser.html">RadioBrowser</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/recoll.html">Recoll Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/repology.html">Repology</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/reuters.html">Reuters</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/semantic_scholar.html">Semantic Scholar</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/soundcloud.html">Soundcloud</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/sourcehut.html">Sourcehut</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/springer.html">Springer Nature</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/startpage.html">Startpage Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/tagesschau.html">Tagesschau API</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/torznab.html">Torznab WebAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/tubearchivist.html">Tube Archivist</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/void.html">Void Linux binary packages</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/wallhaven.html">Wallhaven</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/wikipedia.html">Wikimedia</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/yacy.html">Yacy</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/yahoo.html">Yahoo Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online/zlibrary.html">Z-Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/offline_concept.html">Offline Concept</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/demo/demo_offline.html">Demo Offline Engine</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/offline/command-line-engines.html">Command Line Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/offline/nosql-engines.html">NoSQL databases</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/offline/search-indexer-engines.html">Local Search APIs</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/offline/sql-engines.html">SQL Engines</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/engines/online_url_search/tineye.html">Tineye</a></li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../../dev/result_types/index.html">Result Types</a><input aria-label="Toggle navigation of Result Types" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../../dev/result_types/base_result.html">Result</a></li>
<li class="toctree-l3 has-children"><a class="reference internal" href="../../dev/result_types/main_result.html">Main Search Results</a><input aria-label="Toggle navigation of Main Search Results" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l4"><a class="reference internal" href="../../dev/result_types/main/mainresult.html"><code class="docutils literal notranslate"><span class="pre">MainResult</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/result_types/main/keyvalue.html">Key-Value Results</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/result_types/main/code.html">Code Results</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/result_types/main/paper.html">Paper Results</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/result_types/main/file.html">File Results</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/result_types/answer.html">Answer Results</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/result_types/correction.html">Correction Results</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/result_types/suggestion.html">Suggestion Results</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../dev/result_types/infobox.html">Infobox Results</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/templates.html">Simple Theme Templates</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/search_api.html">Search API</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../../dev/plugins/index.html">Plugins</a><input aria-label="Toggle navigation of Plugins" class="toctree-checkbox" id="toctree-checkbox-8" name="toctree-checkbox-8" role="switch" type="checkbox"/><label for="toctree-checkbox-8"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../../dev/plugins/development.html">Plugin Development</a></li>
<li class="toctree-l3 has-children"><a class="reference internal" href="../../dev/plugins/builtins.html">Built-in Plugins</a><input aria-label="Toggle navigation of Built-in Plugins" class="toctree-checkbox" id="toctree-checkbox-9" name="toctree-checkbox-9" role="switch" type="checkbox"/><label for="toctree-checkbox-9"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/calculator.html">Calculator</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/hash_plugin.html">Hash Values</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/hostnames.html">Hostnames</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/infinite_scroll.html">Infinite scroll</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/self_info.html">Self-Info</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/tor_check.html">Tor check</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/unit_converter.html">Unit Converter</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/plugins/time_zone.html">Time Zone</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../../dev/answerers/index.html">Answerers</a><input aria-label="Toggle navigation of Answerers" class="toctree-checkbox" id="toctree-checkbox-10" name="toctree-checkbox-10" role="switch" type="checkbox"/><label for="toctree-checkbox-10"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../../dev/answerers/development.html">Answerer Development</a></li>
<li class="toctree-l3 has-children"><a class="reference internal" href="../../dev/answerers/builtins.html">Built-in Answerers</a><input aria-label="Toggle navigation of Built-in Answerers" class="toctree-checkbox" id="toctree-checkbox-11" name="toctree-checkbox-11" role="switch" type="checkbox"/><label for="toctree-checkbox-11"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l4"><a class="reference internal" href="../../dev/answerers/random.html">Random</a></li>
<li class="toctree-l4"><a class="reference internal" href="../../dev/answerers/statistics.html">Statistics</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/translation.html">Translation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/makefile.html">Makefile &amp; <code class="docutils literal notranslate"><span class="pre">./manage</span></code></a></li>
<li class="toctree-l2"><a class="reference internal" href="../../dev/reST.html">reST primer</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="../../dev/searxng_extra/index.html">Tooling box <code class="docutils literal notranslate"><span class="pre">searxng_extra</span></code></a><input aria-label="Toggle navigation of Tooling box searxng_extra" class="toctree-checkbox" id="toctree-checkbox-12" name="toctree-checkbox-12" role="switch" type="checkbox"/><label for="toctree-checkbox-12"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l3"><a class="reference internal" href="../../dev/searxng_extra/update.html"><code class="docutils literal notranslate"><span class="pre">searxng_extra/update/</span></code></a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../utils/index.html">DevOps tooling box</a><input aria-label="Toggle navigation of DevOps tooling box" class="toctree-checkbox" id="toctree-checkbox-13" name="toctree-checkbox-13" role="switch" type="checkbox"/><label for="toctree-checkbox-13"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../utils/searxng.sh.html"><code class="docutils literal notranslate"><span class="pre">utils/searxng.sh</span></code></a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../src/index.html">Source-Code</a><input aria-label="Toggle navigation of Source-Code" class="toctree-checkbox" id="toctree-checkbox-14" name="toctree-checkbox-14" role="switch" type="checkbox"/><label for="toctree-checkbox-14"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.babel_extract.html">Custom message extractor (i18n)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.botdetection.html">Bot Detection</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.cache.html">Caches</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.exceptions.html">SearXNG Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.favicons.html">Favicons (source)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.infopage.html">Online <code class="docutils literal notranslate"><span class="pre">/info</span></code></a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.locales.html">Locales</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.search.html">Search</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.search.processors.html">Search processors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.settings.html">Settings Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.sqlitedb.html">SQLite DB</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.utils.html">Utility functions for the engines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.valkeydb.html">Valkey DB</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.valkeylib.html">Valkey Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../src/searx.weather.html">Weather</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for searx.weather</h1><div class="highlight"><pre>
<span></span><span class="c1"># SPDX-License-Identifier: AGPL-3.0-or-later</span>
<span class="sd">&quot;&quot;&quot;Implementations used for weather conditions and forecast.&quot;&quot;&quot;</span>
<span class="c1"># pylint: disable=too-few-public-methods</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;symbol_url&quot;</span><span class="p">,</span>
<span class="s2">&quot;Temperature&quot;</span><span class="p">,</span>
<span class="s2">&quot;Pressure&quot;</span><span class="p">,</span>
<span class="s2">&quot;WindSpeed&quot;</span><span class="p">,</span>
<span class="s2">&quot;RelativeHumidity&quot;</span><span class="p">,</span>
<span class="s2">&quot;Compass&quot;</span><span class="p">,</span>
<span class="s2">&quot;WeatherConditionType&quot;</span><span class="p">,</span>
<span class="s2">&quot;DateTime&quot;</span><span class="p">,</span>
<span class="s2">&quot;GeoLocation&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="c1"># msgspec: note that if using PEP 563 “postponed evaluation of annotations”</span>
<span class="c1"># (e.g. from __future__ import annotations) only the following spellings will</span>
<span class="c1"># work: https://jcristharif.com/msgspec/structs.html#class-variables</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">ClassVar</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">t</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">base64</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">datetime</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">zoneinfo</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">urllib.parse</span><span class="w"> </span><span class="kn">import</span> <span class="n">quote_plus</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">babel</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">babel.numbers</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">babel.dates</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">babel.languages</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">flask_babel</span> <span class="c1"># pyright: ignore[reportMissingTypeStubs]</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">msgspec</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">searx</span><span class="w"> </span><span class="kn">import</span> <span class="n">network</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">searx.cache</span><span class="w"> </span><span class="kn">import</span> <span class="n">ExpireCache</span><span class="p">,</span> <span class="n">ExpireCacheCfg</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">searx.extended_types</span><span class="w"> </span><span class="kn">import</span> <span class="n">sxng_request</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">searx.wikidata_units</span><span class="w"> </span><span class="kn">import</span> <span class="n">convert_to_si</span><span class="p">,</span> <span class="n">convert_from_si</span>
<span class="n">WEATHER_DATA_CACHE</span><span class="p">:</span> <span class="n">ExpireCache</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
<span class="sd">&quot;&quot;&quot;A simple cache for weather data (geo-locations, icons, ..)&quot;&quot;&quot;</span>
<span class="n">YR_WEATHER_SYMBOL_URL</span> <span class="o">=</span> <span class="s2">&quot;https://raw.githubusercontent.com/nrkno/yr-weather-symbols/refs/heads/master/symbols/outline&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_WEATHER_DATA_CACHE</span><span class="p">():</span>
<span class="k">global</span> <span class="n">WEATHER_DATA_CACHE</span> <span class="c1"># pylint: disable=global-statement</span>
<span class="k">if</span> <span class="n">WEATHER_DATA_CACHE</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">WEATHER_DATA_CACHE</span> <span class="o">=</span> <span class="n">ExpireCache</span><span class="o">.</span><span class="n">build_cache</span><span class="p">(</span>
<span class="n">ExpireCacheCfg</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="s2">&quot;WEATHER_DATA_CACHE&quot;</span><span class="p">,</span>
<span class="n">MAX_VALUE_LEN</span><span class="o">=</span><span class="mi">1024</span> <span class="o">*</span> <span class="mi">200</span><span class="p">,</span> <span class="c1"># max. 200kB per icon (icons have most often 10-20kB)</span>
<span class="n">MAXHOLD_TIME</span><span class="o">=</span><span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">7</span> <span class="o">*</span> <span class="mi">4</span><span class="p">,</span> <span class="c1"># 4 weeks</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">WEATHER_DATA_CACHE</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_sxng_locale_tag</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="c1"># The function should return a locale (the sxng-tag: de-DE.en-US, ..) that</span>
<span class="c1"># can later be used to format and convert measured values for the output of</span>
<span class="c1"># weather data to the user.</span>
<span class="c1">#</span>
<span class="c1"># In principle, SearXNG only has two possible parameters for determining</span>
<span class="c1"># the locale: the UI language or the search- language/region. Since the</span>
<span class="c1"># conversion of weather data and time information is usually</span>
<span class="c1"># region-specific, the UI language is not suitable.</span>
<span class="c1">#</span>
<span class="c1"># It would probably be ideal to use the user&#39;s geolocation, but this will</span>
<span class="c1"># probably never be available in SearXNG (privacy critical).</span>
<span class="c1">#</span>
<span class="c1"># Therefore, as long as no &quot;better&quot; parameters are available, this function</span>
<span class="c1"># returns a locale based on the search region.</span>
<span class="c1"># pylint: disable=import-outside-toplevel,disable=cyclic-import</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">searx</span><span class="w"> </span><span class="kn">import</span> <span class="n">query</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">searx.preferences</span><span class="w"> </span><span class="kn">import</span> <span class="n">ClientPref</span>
<span class="n">query</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="n">RawTextQuery</span><span class="p">(</span><span class="n">sxng_request</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;q&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="p">[])</span>
<span class="k">if</span> <span class="n">query</span><span class="o">.</span><span class="n">languages</span> <span class="ow">and</span> <span class="n">query</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;all&quot;</span><span class="p">,</span> <span class="s2">&quot;auto&quot;</span><span class="p">]:</span>
<span class="k">return</span> <span class="n">query</span><span class="o">.</span><span class="n">languages</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">search_lang</span> <span class="o">=</span> <span class="n">sxng_request</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;language&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">search_lang</span> <span class="ow">and</span> <span class="n">search_lang</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;all&quot;</span><span class="p">,</span> <span class="s2">&quot;auto&quot;</span><span class="p">]:</span>
<span class="k">return</span> <span class="n">search_lang</span>
<span class="n">client_pref</span> <span class="o">=</span> <span class="n">ClientPref</span><span class="o">.</span><span class="n">from_http_request</span><span class="p">(</span><span class="n">sxng_request</span><span class="p">)</span>
<span class="n">search_lang</span> <span class="o">=</span> <span class="n">client_pref</span><span class="o">.</span><span class="n">locale_tag</span>
<span class="k">if</span> <span class="n">search_lang</span> <span class="ow">and</span> <span class="n">search_lang</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;all&quot;</span><span class="p">,</span> <span class="s2">&quot;auto&quot;</span><span class="p">]:</span>
<span class="k">return</span> <span class="n">search_lang</span>
<span class="k">return</span> <span class="s2">&quot;en&quot;</span>
<div class="viewcode-block" id="symbol_url">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.symbol_url">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">symbol_url</span><span class="p">(</span><span class="n">condition</span><span class="p">:</span> <span class="s2">&quot;WeatherConditionType&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns ``data:`` URL for the weather condition symbol or ``None`` if</span>
<span class="sd"> the condition is not of type :py:obj:`WeatherConditionType`.</span>
<span class="sd"> If symbol (SVG) is not already in the :py:obj:`WEATHER_DATA_CACHE` its</span>
<span class="sd"> fetched from https://github.com/nrkno/yr-weather-symbols</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Symbols for darkmode/lightmode? .. and day/night symbols? .. for the</span>
<span class="c1"># latter we need a geopoint (critical in sense of privacy)</span>
<span class="n">fname</span> <span class="o">=</span> <span class="n">YR_WEATHER_SYMBOL_MAP</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">condition</span><span class="p">)</span>
<span class="k">if</span> <span class="n">fname</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="s2">&quot;weather_symbol_url&quot;</span>
<span class="n">cache</span> <span class="o">=</span> <span class="n">get_WEATHER_DATA_CACHE</span><span class="p">()</span>
<span class="n">origin_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">YR_WEATHER_SYMBOL_URL</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">fname</span><span class="si">}</span><span class="s2">.svg&quot;</span>
<span class="n">data_url</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">origin_url</span><span class="p">,</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
<span class="k">if</span> <span class="n">data_url</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">data_url</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">network</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">origin_url</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
<span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
<span class="n">mimetype</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Content-Type&#39;</span><span class="p">]</span>
<span class="n">data_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;data:</span><span class="si">{</span><span class="n">mimetype</span><span class="si">}</span><span class="s2">;base64,</span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">),</span><span class="w"> </span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">origin_url</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">data_url</span><span class="p">,</span> <span class="n">expire</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
<span class="k">return</span> <span class="n">data_url</span></div>
<div class="viewcode-block" id="GeoLocation">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.GeoLocation">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">GeoLocation</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">,</span> <span class="n">kw_only</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Minimal implementation of Geocoding.&quot;&quot;&quot;</span>
<span class="c1"># The type definition was based on the properties from the geocoding API of</span>
<span class="c1"># open-meteo.</span>
<span class="c1">#</span>
<span class="c1"># - https://open-meteo.com/en/docs/geocoding-api</span>
<span class="c1"># - https://en.wikipedia.org/wiki/List_of_tz_database_time_zones</span>
<span class="c1"># - https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2</span>
<span class="n">name</span><span class="p">:</span> <span class="nb">str</span>
<span class="n">latitude</span><span class="p">:</span> <span class="nb">float</span> <span class="c1"># Geographical WGS84 coordinates of this location</span>
<span class="n">longitude</span><span class="p">:</span> <span class="nb">float</span>
<span class="n">elevation</span><span class="p">:</span> <span class="nb">float</span> <span class="c1"># Elevation above mean sea level of this location</span>
<span class="n">country_code</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># 2-Character ISO-3166-1 alpha2 country code. E.g. DE for Germany</span>
<span class="n">timezone</span><span class="p">:</span> <span class="nb">str</span> <span class="c1"># Time zone using time zone database definitions</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">zoneinfo</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">zoneinfo</span><span class="o">.</span><span class="n">ZoneInfo</span><span class="p">:</span>
<span class="k">return</span> <span class="n">zoneinfo</span><span class="o">.</span><span class="n">ZoneInfo</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timezone</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
<span class="k">def</span><span class="w"> </span><span class="nf">locale</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="p">:</span>
<span class="c1"># by region of the search language</span>
<span class="n">sxng_tag</span> <span class="o">=</span> <span class="n">_get_sxng_locale_tag</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;-&quot;</span> <span class="ow">in</span> <span class="n">sxng_tag</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">locale</span>
<span class="c1"># by most popular language in the region (country code)</span>
<span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">babel</span><span class="o">.</span><span class="n">languages</span><span class="o">.</span><span class="n">get_official_languages</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">country_code</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">lang</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">country_code</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">locale</span>
<span class="k">except</span> <span class="n">babel</span><span class="o">.</span><span class="n">UnknownLocaleError</span><span class="p">:</span>
<span class="k">continue</span>
<span class="c1"># No locale could be determined. This does not actually occur, but if</span>
<span class="c1"># it does, the English language is used by default. But not region US.</span>
<span class="c1"># US has some units that are only used in US but not in the rest of the</span>
<span class="c1"># world (e.g. °F instead of °C)</span>
<span class="k">return</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="p">(</span><span class="s2">&quot;en&quot;</span><span class="p">,</span> <span class="n">territory</span><span class="o">=</span><span class="s2">&quot;DE&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="GeoLocation.by_query">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.GeoLocation.by_query">[docs]</a>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">by_query</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">search_term</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;GeoLocation&quot;</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Factory method to get a GeoLocation object by a search term. If no</span>
<span class="sd"> location can be determined for the search term, a :py:obj:`ValueError`</span>
<span class="sd"> is thrown.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="s2">&quot;weather_geolocation_by_query&quot;</span>
<span class="n">cache</span> <span class="o">=</span> <span class="n">get_WEATHER_DATA_CACHE</span><span class="p">()</span>
<span class="c1"># {&#39;name&#39;: &#39;Berlin&#39;, &#39;latitude&#39;: 52.52437, &#39;longitude&#39;: 13.41053,</span>
<span class="c1"># &#39;elevation&#39;: 74.0, &#39;country_code&#39;: &#39;DE&#39;, &#39;timezone&#39;: &#39;Europe/Berlin&#39;}</span>
<span class="n">geo_props</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">search_term</span><span class="p">,</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">geo_props</span><span class="p">:</span>
<span class="n">geo_props</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_query_open_meteo</span><span class="p">(</span><span class="n">search_term</span><span class="o">=</span><span class="n">search_term</span><span class="p">)</span>
<span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="n">search_term</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">geo_props</span><span class="p">,</span> <span class="n">expire</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ctx</span><span class="o">=</span><span class="n">ctx</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="o">**</span><span class="n">geo_props</span><span class="p">)</span> <span class="c1"># type: ignore</span></div>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_query_open_meteo</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">search_term</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
<span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;https://geocoding-api.open-meteo.com/v1/search?name=</span><span class="si">{</span><span class="n">quote_plus</span><span class="p">(</span><span class="n">search_term</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">resp</span> <span class="o">=</span> <span class="n">network</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
<span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">status_code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;unknown geo location: &#39;</span><span class="si">{</span><span class="n">search_term</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">json</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;results&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">results</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;unknown geo location: &#39;</span><span class="si">{</span><span class="n">search_term</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">)</span>
<span class="n">location</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">return</span> <span class="p">{</span><span class="n">field_name</span><span class="p">:</span> <span class="n">location</span><span class="p">[</span><span class="n">field_name</span><span class="p">]</span> <span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">__struct_fields__</span><span class="p">}</span></div>
<span class="n">DateTimeFormats</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;full&quot;</span><span class="p">,</span> <span class="s2">&quot;long&quot;</span><span class="p">,</span> <span class="s2">&quot;medium&quot;</span><span class="p">,</span> <span class="s2">&quot;short&quot;</span><span class="p">]</span>
<span class="n">DateTimeLocaleTypes</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;UI&quot;</span><span class="p">]</span>
<div class="viewcode-block" id="DateTime">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.DateTime">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">DateTime</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class to represent date &amp; time. Essentially, it is a wrapper that</span>
<span class="sd"> conveniently combines :py:obj:`datetime.datetime` and</span>
<span class="sd"> :py:obj:`babel.dates.format_datetime`. A conversion of time zones is not</span>
<span class="sd"> provided (in the current version).</span>
<span class="sd"> The localized string representation can be obtained via the</span>
<span class="sd"> :py:obj:`DateTime.l10n` and :py:obj:`DateTime.l10n_date` methods, where the</span>
<span class="sd"> ``locale`` parameter defaults to the search language. Alternatively, a</span>
<span class="sd"> :py:obj:`GeoLocation` or a :py:obj:`babel.Locale` instance can be passed</span>
<span class="sd"> directly. If the UI language is to be used, the string ``UI`` can be passed</span>
<span class="sd"> as the value for the ``locale``.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">datetime</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">l10n</span><span class="p">()</span>
<div class="viewcode-block" id="DateTime.l10n">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.DateTime.l10n">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">fmt</span><span class="p">:</span> <span class="n">DateTimeFormats</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;medium&quot;</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">DateTimeLocaleTypes</span> <span class="o">|</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Localized representation of date &amp; time.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">locale</span> <span class="o">==</span> <span class="s2">&quot;UI&quot;</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">flask_babel</span><span class="o">.</span><span class="n">get_locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">babel</span><span class="o">.</span><span class="n">dates</span><span class="o">.</span><span class="n">format_datetime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">datetime</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">fmt</span><span class="p">,</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">)</span></div>
<div class="viewcode-block" id="DateTime.l10n_date">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.DateTime.l10n_date">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n_date</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">fmt</span><span class="p">:</span> <span class="n">DateTimeFormats</span> <span class="o">|</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;medium&quot;</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">DateTimeLocaleTypes</span> <span class="o">|</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Localized representation of date.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">locale</span> <span class="o">==</span> <span class="s2">&quot;UI&quot;</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">flask_babel</span><span class="o">.</span><span class="n">get_locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">babel</span><span class="o">.</span><span class="n">dates</span><span class="o">.</span><span class="n">format_date</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">datetime</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">fmt</span><span class="p">,</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">)</span></div>
</div>
<span class="n">TemperatureUnit</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeAlias</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;°C&quot;</span><span class="p">,</span> <span class="s2">&quot;°F&quot;</span><span class="p">,</span> <span class="s2">&quot;K&quot;</span><span class="p">]</span>
<span class="n">TEMPERATURE_UNITS</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Final</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">TemperatureUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">TemperatureUnit</span><span class="p">)</span>
<div class="viewcode-block" id="Temperature">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.Temperature">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Temperature</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">,</span> <span class="n">kw_only</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class for converting temperature units and for string representation of</span>
<span class="sd"> measured values.&quot;&quot;&quot;</span>
<span class="n">val</span><span class="p">:</span> <span class="nb">float</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">TemperatureUnit</span>
<span class="n">si_name</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Q11579&quot;</span>
<span class="n">UNITS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">TemperatureUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">TEMPERATURE_UNITS</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__post_init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">UNITS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;invalid unit: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">l10n</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unit</span><span class="p">:</span> <span class="n">TemperatureUnit</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
<span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span>
<span class="n">si_val</span> <span class="o">=</span> <span class="n">convert_to_si</span><span class="p">(</span><span class="n">si_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">si_name</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<span class="k">return</span> <span class="n">convert_from_si</span><span class="p">(</span><span class="n">si_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">si_name</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">unit</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">si_val</span><span class="p">)</span>
<div class="viewcode-block" id="Temperature.l10n">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.Temperature.l10n">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">TemperatureUnit</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">template</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{value}</span><span class="s2"> </span><span class="si">{unit}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="n">num_pattern</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;#,##0&quot;</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Localized representation of a measured value.</span>
<span class="sd"> If the ``unit`` is not set, an attempt is made to determine a ``unit``</span>
<span class="sd"> matching the territory of the ``locale``. If the locale is not set, an</span>
<span class="sd"> attempt is made to determine it from the HTTP request.</span>
<span class="sd"> The value is converted into the respective unit before formatting.</span>
<span class="sd"> The argument ``num_pattern`` is used to determine the string formatting</span>
<span class="sd"> of the numerical value:</span>
<span class="sd"> - https://babel.pocoo.org/en/latest/numbers.html#pattern-syntax</span>
<span class="sd"> - https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns</span>
<span class="sd"> The argument ``template`` specifies how the **string formatted** value</span>
<span class="sd"> and unit are to be arranged.</span>
<span class="sd"> - `Format Specification Mini-Language</span>
<span class="sd"> &lt;https://docs.python.org/3/library/string.html#format-specification-mini-language&gt;`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># unit by territory</span>
<span class="n">unit</span> <span class="o">=</span> <span class="s2">&quot;°C&quot;</span>
<span class="k">if</span> <span class="n">locale</span><span class="o">.</span><span class="n">territory</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;US&quot;</span><span class="p">]:</span>
<span class="n">unit</span> <span class="o">=</span> <span class="s2">&quot;°F&quot;</span>
<span class="n">val_str</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">numbers</span><span class="o">.</span><span class="n">format_decimal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="n">unit</span><span class="p">),</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">num_pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">val_str</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">)</span></div>
</div>
<span class="n">PressureUnit</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeAlias</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;Pa&quot;</span><span class="p">,</span> <span class="s2">&quot;hPa&quot;</span><span class="p">,</span> <span class="s2">&quot;cm Hg&quot;</span><span class="p">,</span> <span class="s2">&quot;bar&quot;</span><span class="p">]</span>
<span class="n">PRESSURE_UNITS</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Final</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">PressureUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">PressureUnit</span><span class="p">)</span>
<div class="viewcode-block" id="Pressure">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.Pressure">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Pressure</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">,</span> <span class="n">kw_only</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class for converting pressure units and for string representation of</span>
<span class="sd"> measured values.&quot;&quot;&quot;</span>
<span class="n">val</span><span class="p">:</span> <span class="nb">float</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">PressureUnit</span>
<span class="n">si_name</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Q44395&quot;</span>
<span class="n">UNITS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">PressureUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">PRESSURE_UNITS</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__post_init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">UNITS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;invalid unit: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">l10n</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unit</span><span class="p">:</span> <span class="n">PressureUnit</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
<span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span>
<span class="n">si_val</span> <span class="o">=</span> <span class="n">convert_to_si</span><span class="p">(</span><span class="n">si_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">si_name</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<span class="k">return</span> <span class="n">convert_from_si</span><span class="p">(</span><span class="n">si_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">si_name</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">unit</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">si_val</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">PressureUnit</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">template</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{value}</span><span class="s2"> </span><span class="si">{unit}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="n">num_pattern</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;#,##0&quot;</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># unit by territory?</span>
<span class="n">unit</span> <span class="o">=</span> <span class="s2">&quot;hPa&quot;</span>
<span class="n">val_str</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">numbers</span><span class="o">.</span><span class="n">format_decimal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="n">unit</span><span class="p">),</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">num_pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">val_str</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">)</span></div>
<span class="n">WindSpeedUnit</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeAlias</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;m/s&quot;</span><span class="p">,</span> <span class="s2">&quot;km/h&quot;</span><span class="p">,</span> <span class="s2">&quot;kn&quot;</span><span class="p">,</span> <span class="s2">&quot;mph&quot;</span><span class="p">,</span> <span class="s2">&quot;mi/h&quot;</span><span class="p">,</span> <span class="s2">&quot;Bft&quot;</span><span class="p">]</span>
<span class="n">WIND_SPEED_UNITS</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Final</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">WindSpeedUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">WindSpeedUnit</span><span class="p">)</span>
<div class="viewcode-block" id="WindSpeed">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.WindSpeed">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">WindSpeed</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">,</span> <span class="n">kw_only</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class for converting speed or velocity units and for string</span>
<span class="sd"> representation of measured values.</span>
<span class="sd"> .. hint::</span>
<span class="sd"> Working with unit ``Bft`` (:py:obj:`searx.wikidata_units.Beaufort`) will</span>
<span class="sd"> throw a :py:obj:`ValueError` for egative values or values greater 16 Bft</span>
<span class="sd"> (55.6 m/s)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">val</span><span class="p">:</span> <span class="nb">float</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">WindSpeedUnit</span>
<span class="n">si_name</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Q182429&quot;</span>
<span class="n">UNITS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">WindSpeedUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">WIND_SPEED_UNITS</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__post_init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">UNITS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;invalid unit: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">l10n</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unit</span><span class="p">:</span> <span class="n">WindSpeedUnit</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
<span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span>
<span class="n">si_val</span> <span class="o">=</span> <span class="n">convert_to_si</span><span class="p">(</span><span class="n">si_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">si_name</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<span class="k">return</span> <span class="n">convert_from_si</span><span class="p">(</span><span class="n">si_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">si_name</span><span class="p">,</span> <span class="n">symbol</span><span class="o">=</span><span class="n">unit</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">si_val</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">WindSpeedUnit</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">template</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{value}</span><span class="s2"> </span><span class="si">{unit}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="n">num_pattern</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;#,##0&quot;</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unit</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># unit by territory?</span>
<span class="n">unit</span> <span class="o">=</span> <span class="s2">&quot;m/s&quot;</span>
<span class="n">val_str</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">numbers</span><span class="o">.</span><span class="n">format_decimal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="n">unit</span><span class="p">),</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">num_pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">val_str</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">)</span></div>
<span class="n">RelativeHumidityUnit</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeAlias</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;%&quot;</span><span class="p">]</span>
<span class="n">RELATIVE_HUMIDITY_UNITS</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Final</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">RelativeHumidityUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">RelativeHumidityUnit</span><span class="p">)</span>
<div class="viewcode-block" id="RelativeHumidity">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.RelativeHumidity">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">RelativeHumidity</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Amount of relative humidity in the air. The unit is ``%``&quot;&quot;&quot;</span>
<span class="n">val</span><span class="p">:</span> <span class="nb">float</span>
<span class="c1"># there exists only one unit (%) --&gt; set &quot;%&quot; as the final value (constant)</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="n">RelativeHumidityUnit</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;%&quot;</span>
<span class="n">UNITS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">RelativeHumidityUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">RELATIVE_HUMIDITY_UNITS</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__post_init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">unit</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">UNITS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;invalid unit: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">unit</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">l10n</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">template</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{value}{unit}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="n">num_pattern</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;#,##0&quot;</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="n">unit</span> <span class="o">=</span> <span class="s2">&quot;%&quot;</span>
<span class="n">val_str</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">numbers</span><span class="o">.</span><span class="n">format_decimal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">(),</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">num_pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">val_str</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">)</span></div>
<span class="n">CompassPoint</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeAlias</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span>
<span class="s2">&quot;N&quot;</span><span class="p">,</span> <span class="s2">&quot;NNE&quot;</span><span class="p">,</span> <span class="s2">&quot;NE&quot;</span><span class="p">,</span> <span class="s2">&quot;ENE&quot;</span><span class="p">,</span> <span class="s2">&quot;E&quot;</span><span class="p">,</span> <span class="s2">&quot;ESE&quot;</span><span class="p">,</span> <span class="s2">&quot;SE&quot;</span><span class="p">,</span> <span class="s2">&quot;SSE&quot;</span><span class="p">,</span> <span class="s2">&quot;S&quot;</span><span class="p">,</span> <span class="s2">&quot;SSW&quot;</span><span class="p">,</span> <span class="s2">&quot;SW&quot;</span><span class="p">,</span> <span class="s2">&quot;WSW&quot;</span><span class="p">,</span> <span class="s2">&quot;W&quot;</span><span class="p">,</span> <span class="s2">&quot;WNW&quot;</span><span class="p">,</span> <span class="s2">&quot;NW&quot;</span><span class="p">,</span> <span class="s2">&quot;NNW&quot;</span>
<span class="p">]</span>
<span class="sd">&quot;&quot;&quot;Compass point type definition&quot;&quot;&quot;</span>
<span class="n">COMPASS_POINTS</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Final</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">CompassPoint</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">CompassPoint</span><span class="p">)</span>
<span class="n">CompassUnit</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">TypeAlias</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span><span class="s2">&quot;°&quot;</span><span class="p">,</span> <span class="s2">&quot;Point&quot;</span><span class="p">]</span>
<span class="n">COMPASS_UNITS</span><span class="p">:</span> <span class="n">t</span><span class="o">.</span><span class="n">Final</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">CompassUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">CompassUnit</span><span class="p">)</span>
<div class="viewcode-block" id="Compass">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.Compass">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Compass</span><span class="p">(</span><span class="n">msgspec</span><span class="o">.</span><span class="n">Struct</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Class for converting compass points and azimuth values (360°)&quot;&quot;&quot;</span>
<span class="n">val</span><span class="p">:</span> <span class="s2">&quot;float | int | CompassPoint&quot;</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">CompassUnit</span> <span class="o">=</span> <span class="s2">&quot;°&quot;</span>
<span class="n">UNITS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">CompassUnit</span><span class="p">]]</span> <span class="o">=</span> <span class="n">COMPASS_UNITS</span>
<span class="n">TURN</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> <span class="o">=</span> <span class="mf">360.0</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Full turn (360°)&quot;&quot;&quot;</span>
<span class="n">POINTS</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">tuple</span><span class="p">[</span><span class="n">CompassPoint</span><span class="p">]]</span> <span class="o">=</span> <span class="n">COMPASS_POINTS</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Compass points.&quot;&quot;&quot;</span>
<span class="n">RANGE</span><span class="p">:</span> <span class="n">ClassVar</span><span class="p">[</span><span class="nb">float</span><span class="p">]</span> <span class="o">=</span> <span class="n">TURN</span> <span class="o">/</span> <span class="nb">len</span><span class="p">(</span><span class="n">POINTS</span><span class="p">)</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Angle sector of a compass point&quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">__post_init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">POINTS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid compass point: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">POINTS</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">RANGE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">TURN</span>
<span class="bp">self</span><span class="o">.</span><span class="n">unit</span> <span class="o">=</span> <span class="s2">&quot;°&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">l10n</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unit</span><span class="p">:</span> <span class="n">CompassUnit</span><span class="p">):</span>
<span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;Point&quot;</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">point</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;°&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">val</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;unknown unit: </span><span class="si">{</span><span class="n">unit</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="Compass.point">
<a class="viewcode-back" href="../../src/searx.weather.html#searx.weather.Compass.point">[docs]</a>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">point</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">azimuth</span><span class="p">:</span> <span class="nb">float</span> <span class="o">|</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">CompassPoint</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns the compass point to an azimuth value.&quot;&quot;&quot;</span>
<span class="n">azimuth</span> <span class="o">=</span> <span class="n">azimuth</span> <span class="o">%</span> <span class="bp">cls</span><span class="o">.</span><span class="n">TURN</span>
<span class="c1"># The angle sector of a compass point starts 1/2 sector range before</span>
<span class="c1"># and after compass point (example: &quot;N&quot; goes from -11.25° to +11.25°)</span>
<span class="n">azimuth</span> <span class="o">=</span> <span class="n">azimuth</span> <span class="o">-</span> <span class="bp">cls</span><span class="o">.</span><span class="n">RANGE</span> <span class="o">/</span> <span class="mi">2</span>
<span class="n">idx</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">azimuth</span> <span class="o">//</span> <span class="bp">cls</span><span class="o">.</span><span class="n">RANGE</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">POINTS</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">l10n</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">unit</span><span class="p">:</span> <span class="n">CompassUnit</span> <span class="o">=</span> <span class="s2">&quot;Point&quot;</span><span class="p">,</span>
<span class="n">locale</span><span class="p">:</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span> <span class="o">|</span> <span class="n">GeoLocation</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">template</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{value}{unit}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="n">num_pattern</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;#,##0&quot;</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">locale</span><span class="p">,</span> <span class="n">GeoLocation</span><span class="p">):</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">locale</span><span class="o">.</span><span class="n">locale</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">locale</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">locale</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">Locale</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">_get_sxng_locale_tag</span><span class="p">(),</span> <span class="n">sep</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">unit</span> <span class="o">==</span> <span class="s2">&quot;Point&quot;</span><span class="p">:</span>
<span class="n">val_str</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="n">unit</span><span class="p">)</span>
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">val_str</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">val_str</span> <span class="o">=</span> <span class="n">babel</span><span class="o">.</span><span class="n">numbers</span><span class="o">.</span><span class="n">format_decimal</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">(</span><span class="n">unit</span><span class="p">),</span> <span class="n">locale</span><span class="o">=</span><span class="n">locale</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">num_pattern</span><span class="p">)</span>
<span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">val_str</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="n">unit</span><span class="p">)</span></div>
<span class="n">WeatherConditionType</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">Literal</span><span class="p">[</span>
<span class="c1"># The capitalized string goes into to i18n/l10n (en: &quot;Clear sky&quot; -&gt; de: &quot;wolkenloser Himmel&quot;)</span>
<span class="s2">&quot;clear sky&quot;</span><span class="p">,</span>
<span class="s2">&quot;partly cloudy&quot;</span><span class="p">,</span>
<span class="s2">&quot;cloudy&quot;</span><span class="p">,</span>
<span class="s2">&quot;fair&quot;</span><span class="p">,</span>
<span class="s2">&quot;fog&quot;</span><span class="p">,</span>
<span class="c1"># rain</span>
<span class="s2">&quot;light rain and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;light rain showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;light rain showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;light rain&quot;</span><span class="p">,</span>
<span class="s2">&quot;rain and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;rain showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;rain showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;rain&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy rain and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy rain showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy rain showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy rain&quot;</span><span class="p">,</span>
<span class="c1"># sleet</span>
<span class="s2">&quot;light sleet and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;light sleet showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;light sleet showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;light sleet&quot;</span><span class="p">,</span>
<span class="s2">&quot;sleet and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;sleet showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;sleet showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;sleet&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy sleet and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy sleet showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy sleet showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy sleet&quot;</span><span class="p">,</span>
<span class="c1"># snow</span>
<span class="s2">&quot;light snow and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;light snow showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;light snow showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;light snow&quot;</span><span class="p">,</span>
<span class="s2">&quot;snow and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;snow showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;snow showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;snow&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy snow and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy snow showers and thunder&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy snow showers&quot;</span><span class="p">,</span>
<span class="s2">&quot;heavy snow&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="sd">&quot;&quot;&quot;Standardized designations for weather conditions. The designators were</span>
<span class="sd">taken from a collaboration between NRK and Norwegian Meteorological Institute</span>
<span class="sd">(yr.no_). `Weather symbols`_ can be assigned to the identifiers</span>
<span class="sd">(weathericons_) and they are included in the translation (i18n/l10n</span>
<span class="sd">:origin:`searx/searxng.msg`).</span>
<span class="sd">.. _yr.no: https://www.yr.no/en</span>
<span class="sd">.. _Weather symbols: https://github.com/nrkno/yr-weather-symbols</span>
<span class="sd">.. _weathericons: https://github.com/metno/weathericons</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">YR_WEATHER_SYMBOL_MAP</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;clear sky&quot;</span><span class="p">:</span> <span class="s2">&quot;01d&quot;</span><span class="p">,</span> <span class="c1"># 01d clearsky_day</span>
<span class="s2">&quot;partly cloudy&quot;</span><span class="p">:</span> <span class="s2">&quot;03d&quot;</span><span class="p">,</span> <span class="c1"># 03d partlycloudy_day</span>
<span class="s2">&quot;cloudy&quot;</span><span class="p">:</span> <span class="s2">&quot;04&quot;</span><span class="p">,</span> <span class="c1"># 04 cloudy</span>
<span class="s2">&quot;fair&quot;</span><span class="p">:</span> <span class="s2">&quot;02d&quot;</span><span class="p">,</span> <span class="c1"># 02d fair_day</span>
<span class="s2">&quot;fog&quot;</span><span class="p">:</span> <span class="s2">&quot;15&quot;</span><span class="p">,</span> <span class="c1"># 15 fog</span>
<span class="c1"># rain</span>
<span class="s2">&quot;light rain and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;30&quot;</span><span class="p">,</span> <span class="c1"># 30 lightrainandthunder</span>
<span class="s2">&quot;light rain showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;24d&quot;</span><span class="p">,</span> <span class="c1"># 24d lightrainshowersandthunder_day</span>
<span class="s2">&quot;light rain showers&quot;</span><span class="p">:</span> <span class="s2">&quot;40d&quot;</span><span class="p">,</span> <span class="c1"># 40d lightrainshowers_day</span>
<span class="s2">&quot;light rain&quot;</span><span class="p">:</span> <span class="s2">&quot;46&quot;</span><span class="p">,</span> <span class="c1"># 46 lightrain</span>
<span class="s2">&quot;rain and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;22&quot;</span><span class="p">,</span> <span class="c1"># 22 rainandthunder</span>
<span class="s2">&quot;rain showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;06d&quot;</span><span class="p">,</span> <span class="c1"># 06d rainshowersandthunder_day</span>
<span class="s2">&quot;rain showers&quot;</span><span class="p">:</span> <span class="s2">&quot;05d&quot;</span><span class="p">,</span> <span class="c1"># 05d rainshowers_day</span>
<span class="s2">&quot;rain&quot;</span><span class="p">:</span> <span class="s2">&quot;09&quot;</span><span class="p">,</span> <span class="c1"># 09 rain</span>
<span class="s2">&quot;heavy rain and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;11&quot;</span><span class="p">,</span> <span class="c1"># 11 heavyrainandthunder</span>
<span class="s2">&quot;heavy rain showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;25d&quot;</span><span class="p">,</span> <span class="c1"># 25d heavyrainshowersandthunder_day</span>
<span class="s2">&quot;heavy rain showers&quot;</span><span class="p">:</span> <span class="s2">&quot;41d&quot;</span><span class="p">,</span> <span class="c1"># 41d heavyrainshowers_day</span>
<span class="s2">&quot;heavy rain&quot;</span><span class="p">:</span> <span class="s2">&quot;10&quot;</span><span class="p">,</span> <span class="c1"># 10 heavyrain</span>
<span class="c1"># sleet</span>
<span class="s2">&quot;light sleet and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;31&quot;</span><span class="p">,</span> <span class="c1"># 31 lightsleetandthunder</span>
<span class="s2">&quot;light sleet showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;26d&quot;</span><span class="p">,</span> <span class="c1"># 26d lightssleetshowersandthunder_day</span>
<span class="s2">&quot;light sleet showers&quot;</span><span class="p">:</span> <span class="s2">&quot;42d&quot;</span><span class="p">,</span> <span class="c1"># 42d lightsleetshowers_day</span>
<span class="s2">&quot;light sleet&quot;</span><span class="p">:</span> <span class="s2">&quot;47&quot;</span><span class="p">,</span> <span class="c1"># 47 lightsleet</span>
<span class="s2">&quot;sleet and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;23&quot;</span><span class="p">,</span> <span class="c1"># 23 sleetandthunder</span>
<span class="s2">&quot;sleet showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;20d&quot;</span><span class="p">,</span> <span class="c1"># 20d sleetshowersandthunder_day</span>
<span class="s2">&quot;sleet showers&quot;</span><span class="p">:</span> <span class="s2">&quot;07d&quot;</span><span class="p">,</span> <span class="c1"># 07d sleetshowers_day</span>
<span class="s2">&quot;sleet&quot;</span><span class="p">:</span> <span class="s2">&quot;12&quot;</span><span class="p">,</span> <span class="c1"># 12 sleet</span>
<span class="s2">&quot;heavy sleet and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;32&quot;</span><span class="p">,</span> <span class="c1"># 32 heavysleetandthunder</span>
<span class="s2">&quot;heavy sleet showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;27d&quot;</span><span class="p">,</span> <span class="c1"># 27d heavysleetshowersandthunder_day</span>
<span class="s2">&quot;heavy sleet showers&quot;</span><span class="p">:</span> <span class="s2">&quot;43d&quot;</span><span class="p">,</span> <span class="c1"># 43d heavysleetshowers_day</span>
<span class="s2">&quot;heavy sleet&quot;</span><span class="p">:</span> <span class="s2">&quot;48&quot;</span><span class="p">,</span> <span class="c1"># 48 heavysleet</span>
<span class="c1"># snow</span>
<span class="s2">&quot;light snow and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;33&quot;</span><span class="p">,</span> <span class="c1"># 33 lightsnowandthunder</span>
<span class="s2">&quot;light snow showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;28d&quot;</span><span class="p">,</span> <span class="c1"># 28d lightssnowshowersandthunder_day</span>
<span class="s2">&quot;light snow showers&quot;</span><span class="p">:</span> <span class="s2">&quot;44d&quot;</span><span class="p">,</span> <span class="c1"># 44d lightsnowshowers_day</span>
<span class="s2">&quot;light snow&quot;</span><span class="p">:</span> <span class="s2">&quot;49&quot;</span><span class="p">,</span> <span class="c1"># 49 lightsnow</span>
<span class="s2">&quot;snow and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;14&quot;</span><span class="p">,</span> <span class="c1"># 14 snowandthunder</span>
<span class="s2">&quot;snow showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;21d&quot;</span><span class="p">,</span> <span class="c1"># 21d snowshowersandthunder_day</span>
<span class="s2">&quot;snow showers&quot;</span><span class="p">:</span> <span class="s2">&quot;08d&quot;</span><span class="p">,</span> <span class="c1"># 08d snowshowers_day</span>
<span class="s2">&quot;snow&quot;</span><span class="p">:</span> <span class="s2">&quot;13&quot;</span><span class="p">,</span> <span class="c1"># 13 snow</span>
<span class="s2">&quot;heavy snow and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;34&quot;</span><span class="p">,</span> <span class="c1"># 34 heavysnowandthunder</span>
<span class="s2">&quot;heavy snow showers and thunder&quot;</span><span class="p">:</span> <span class="s2">&quot;29d&quot;</span><span class="p">,</span> <span class="c1"># 29d heavysnowshowersandthunder_day</span>
<span class="s2">&quot;heavy snow showers&quot;</span><span class="p">:</span> <span class="s2">&quot;45d&quot;</span><span class="p">,</span> <span class="c1"># 45d heavysnowshowers_day</span>
<span class="s2">&quot;heavy snow&quot;</span><span class="p">:</span> <span class="s2">&quot;50&quot;</span><span class="p">,</span> <span class="c1"># 50 heavysnow</span>
<span class="p">}</span>
<span class="sd">&quot;&quot;&quot;Map a :py:obj:`WeatherConditionType` to a `YR weather symbol`_</span>
<span class="sd">.. code::</span>
<span class="sd"> base_url = &quot;https://raw.githubusercontent.com/nrkno/yr-weather-symbols/refs/heads/master/symbols&quot;</span>
<span class="sd"> icon_url = f&quot;{base_url}/outline/{YR_WEATHER_SYMBOL_MAP[&#39;sleet showers&#39;]}.svg&quot;</span>
<span class="sd">.. _YR weather symbol: https://github.com/nrkno/yr-weather-symbols/blob/master/locales/en.json</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="c1"># test: fetch all symbols of the type catalog ..</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">t</span><span class="o">.</span><span class="n">get_args</span><span class="p">(</span><span class="n">WeatherConditionType</span><span class="p">):</span>
<span class="n">symbol_url</span><span class="p">(</span><span class="n">condition</span><span class="o">=</span><span class="n">c</span><span class="p">)</span>
<span class="n">_cache</span> <span class="o">=</span> <span class="n">get_WEATHER_DATA_CACHE</span><span class="p">()</span>
<span class="n">title</span> <span class="o">=</span> <span class="s2">&quot;cached weather condition symbols&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;=&quot;</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">title</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="n">_cache</span><span class="o">.</span><span class="n">state</span><span class="p">()</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="nb">print</span><span class="p">()</span>
<span class="n">title</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;properties of </span><span class="si">{</span><span class="n">_cache</span><span class="o">.</span><span class="n">cfg</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;=&quot;</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">title</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">_cache</span><span class="o">.</span><span class="n">properties</span><span class="p">))</span> <span class="c1"># type: ignore</span>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; SearXNG team
</div>
Made with
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
<div class="icons">
<a class="muted-link " href="https://github.com/searxng/searxng/" aria-label="GitHub">&#x1F4BE;</a>
<a class="muted-link " href="https://searx.space/" aria-label="searx.space">&#x1F310;</a>
</div>
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=d004a72a"></script>
<script src="../../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>